Tex-Oberon: Make Project Oberon Pretty Again
github.com
github.com
https://wiki.squeak.org/squeak/692
I'd guess starting with something like Godot game engine and then going back to the theory later would be more successful (but everyone is different...).
See also the recent launch hn:
Launch HN: Rosebud (YC S19) – Turn game descriptions into browser games https://news.ycombinator.com/item?id=38868185
I've found that it's much easier to jump into coding in an established environment where there's a large ecosystem that's well-groomed by a large corporate entity, so think Unity/C# or Swift Playgrounds. There's less jargon, fewer ways to do the same thing, and much, much better and varied learning resources.
My younger brother got into coding as a teenager, via an interest in gaming, nudged along by me. There were several false starts as the kind of games he was interested in, namely 3D MMORPGs built by thousands of engineers and artists, had no beginner-level on-ramp to learning. Eventually he picked up enough coding skills that he developed an interest in coding in general and went on to study it in college. 20 years later I still don't think he's written a game though :) but he does write code that schedules the UKs trains!
These would have smaller scopes and likely feel "rewarding" much more quickly
(Also, I know quite a few programming languages, both low-level and high-level. I'm a "right tool for the job" sort of person, using different languages on different projects. So I'm not recommending this text out of bias for a certain language.)
My own favorite introductory text for programming, at a high-school level, is https://pine.fm/LearnToProgram, which teaches the Ruby language.
(There's a book version of it linked in the site's sidebar, which might be nice to give as a gift to a prospective student; but the original free online version linked below it — https://pine.fm/LearnToProgram/chap_00.html and onward — is already very good, and is what I usually end up pointing people toward.)
LtP is a very results-oriented tutorial: it just shows you "what" you can do, and gets you going on doing things and experimenting, rather than trying to teach you a lot about "why" things work the way they do. It shows you what works and what doesn't, and uses that to teach-by-example that there are some underlying fundamental principles (e.g. + is addition for Integers and concatenation for Strings, but you can't + a String and an Integer together, because there's no clear meaning when the two things you're +ing don't have the same "type.") It briefly discusses the principle — just enough to know it exists — and then moves on.
I think a results-oriented approach is important at a high-school level, as a learner is at this point still deciding whether they really want to "get into" programming, or if it's "not for them." And I've found that the thing that dissuades teenagers from thinking programming is "for them", usually isn't the struggle of debugging or solving puzzles; rather, it's interminable lessons on theory, that they have no practical foundation yet to motivate a need for understanding of. They need to see results to understand the joys of programming — and to experiment to understand the struggles — but they don't need to be forced through the mind-numbing incomprehension of a CS / Discrete Maths lecture. That can wait until they know enough to ask questions like "why does this program [that has a three-deep hot loop searching a big array by value] run for hours without finishing?" Sell the problem before the solution!
This results-oriented approach is helped by the language choice of Ruby:
• Ruby is a language that has very little boilerplate syntax you must type to make a program work. In a language like Java with much boilerplate, even if a tutorial says "ignore it for now", students itch to know why it's needed. Ruby code just doesn't have anything to cause that itch. Ruby "gets out of the way."
• Ruby has uniform syntax. Most other low-boilerplate languages, a.k.a. scripting languages — I'm specifically thinking of Perl and Python here — have legacy syntax warts that break the learning trance. Ruby's syntax is very predictable, with no real "irregular verbs" to remember. Other languages make students remember — at first with no rule the learner could yet understand — that it's sometimes `len(x)`, but other times it's `x.Len()`. In Ruby, it's always `x.foo`. Even on an integer literal. Even on `nil`!)
These two features of Ruby — no boilerplate, and predictable syntax — also translate to a lot less time being spent helping students debug their syntax instead of their program. (New programmers have a lot of trouble with syntax!)
For a college student who likes math, I might recommend a different text, or even a different language. (I think SICP is pretty great, actually.) But for a young teenager, I think LtP and Ruby are a great place to start.
If anyone has read/used this book before, I would love to hear their opinion about where it best fits in their journey.
That's before getting into all the errata for the places where what was written in the book diverges from the actual system implementation.
Does anyone know why Wirth never modernized his style? I wonder if there's a place for something that's equally minimalist, but more in line with current aesthetic sensibilities.
Readability. It's easier to read the source code with uppercase keywords. (I think Wirth once said that code is written once but read many times). See this source code - https://raw.githubusercontent.com/rochus-keller/OberonSystem... - to get an idea of this (the uppercase keywords allow you to easily scan the blocks of code). Ofcourse, one can claim that the same can be achieved better today with colour-coded keywords.
If it really bothers you, I think the Oberon+ IDE - https://github.com/rochus-keller/Oberon - gives you an option to disable this and use lowercase keywords.
This is aesthetics, I won't claim that what I'm saying is more than a (perhaps popular) subjective opinion. But I will point out that at least the way I read programs, the KEYWORDS are the OPPOSITE of what I want to EMPHASIZE when reading code.
I actually want the keywords to disappear so that my eyes can focus on the variable names and see the data flow. That, by the way, is also why punctuation to mark blocks { ... } is so much easier for me to visually parse than BEGIN ... END.
https://github.com/guidoism/tex-oberon/releases/download/v0....
As I wrote in an earlier post, the enthusiasm of the author is contagious.
It's typeset in Arial. In freaking Microsoft Word.
"The last edition -- from 2013 -- could use some tender loving care. It should look beautiful." - the paragraph that introduces the goals of the project.
<http://www.projectoberon.net/wirth/ProjectOberon/license.txt>
Caveat: the 2013 edition doesn't seem to be available via Amazon so may well be formally out of print. In which case, Wirth's heirs can issue a rights reversion letter to Addison-Wesley and claw the rights back, then relicense the text libre. Or they may already have other plans for re-issuing the book.
Either way, it'd be polite to ask first before "liberating".
(It's still polite to ask/let the heirs know what you're doing.)
you're suggesting offering his heirs the opportunity to revoke that license
how can you possibly think this is a good idea? if it became a widespread practice, it would result in a million lawsuits like the sco lawsuit, utterly destroying free software. is that what you want?
It would be as if the people in Plato's cave, instead of contrasting the outside and inside, were to obsess over which section of cave wall had the most pleasing texture over which the shadows might play...
but if you try to begin your practice of buddhist meditation with incense burning on your scalp, you probably will not get very far; you will probably quit. instead, beginning meditation focuses on finding the pleasure in relaxing in a comfortable position, even though that is clearly not what motivates more experienced meditators
(and of course you're aware old don and old ed (rip) spent a lot of effort on typography, though they sometimes understood wirth's work better than he did himself)
I don't think I ever showed you, but when I was playing around with adjoint representations, I came up with an adjoint between plaintext files and PDF, such that (non-ultimate) lines in the PDF would display fully justified, but a simple filter (that did not model the PDF format itself) sufficed to recover the original plaintext file.
That didn't seem very useful, but as you point out, maybe making things prettier is worthwhile (and enabling reversibility so one could always retrieve the lighter representation given only the prettier one would satisfy my technological anabaptism); if it were useful to do so maybe I should try with .gmi (although the vertical layout issues here would keep pagination from being as straightforward...)?
an interesting thing i have noticed is that people living in prettier houses tend to treat one another better, to the point that you can sometimes improve family dynamics by interior decoration. i suspect the humans' direct preattentive aesthetic experience interacts with their psychology in ways that would appall old rené and which they are often unconscious of
The nicest situation we can have between two representations (x,y) is that they can encode each other, so transformations (f,g) "round-trip":
f x == y
x == g y
x == g (f x)
f (g y) == y
That isn't always possible, though. (and some mathematicians find it so boring that they work "up to isomorphism", meaning they don't even bother keeping track of the exact round-trippable transformations, and just assume we use any suitable coercion, writing down only the non-round-trippable transformations, just as we don't bother keeping track of exactly which and how many zeroes there are in 1+2 [or is that 1+0+2? or 1+0+0+2?] or which and how many null strings there are in the middle of "hi")Much more commonly (this always happens, if we allow degenerate encodings) is a situation where each representation can encode only a subset of the other, so we only have:
f x == f (g (f x))
g (f (g y)) == g y
because attempting to round trip is lossy, but the loss is idempotent: unlike analogue copying, further generations (which are already in the mutually-expressible subset) aren't any more lossy.[aside: does the 3-in-1 trinitarian nature of these equalities suggest that one transformative application may exist in three coequal, coeternal, consubstantial hypostatic applications? end of aside]
Finally, the situation I'd contrived between plaintext and pdf is where a more expressive representation can encode a less expressive, but not the other way around, so we have an intermediate situation, where Procrustes only affects the more expressive side:
x == g (f x)
g (f (g y)) == g y
If you squint, you should be able to see the relation between this abstract algebraic notion of adjunction and the linear algebraic notion of "best possible approximation to an inverse". Galois connections are also closely related.I don't think I can do it justice in an HN post, but old János also did a lot with these concepts, both theoretically exploring when the idempotents mentioned above are "regular" (related to regular expressions and the Kleene star) and practically suggesting that we should make Y-combinator-style autoreplicating mining-factory-complexes on the moon (in the asteroid belt?); see also https://news.ycombinator.com/item?id=38893829 ...
If you detest what a certain phrase might stand for - work towards changing what it stands for. Don't give it away freely and without a fight. You do a disservice to yourself and everyone else.
It triggers me whenever I see people ceding words like this - and this particularly annoyed me because it wasn't only ceding the phrase "makes America great again" but any phrase of the same grammatical construct!
Growing up trans I was called every name and slur in the book because people learned from others that those slurs might have power over me. The bullies had learned from other trans people that those words had power. That they could make me cry or feel weak or powerless if they held those words over my head. I never gave them that satisfaction though. My response was aways "Yeah, and?" which I had learned from the gay community. And I hate, rather strongly at that, anyone who helps those words retain power so that they can continue to be used to bully other trans children.
Never give words power over you. By doing so you give them power over others. If a word or phrase bothers you so strongly - reclaim it. Turn it into something you control - don't let it be wielded like a stick to hit you with. Why willingly turn it into a weapon that people can use against you?
That goes as much for slurs as it does for "make X Y again". It pisses me off is all.
It doesn't feel analogous to what you're saying about slurs, to me.
I'm saying don't let him own it at all. It isn't his to own - it's a cliché English snowclone that he gave popularity to. It doesn't deserve to be a powerful slogan that makes people think of Trump. It deserves to be a generic, overused snowclone devoid of any significant meaning where the average person no longer remembers the original phrase or meaning.
By ceding it to Trump and wishing to discontinue usage of it you're choosing to give it power and continue a legacy that it doesn't deserve.
You've probably pattern-matched me to a different kind of Trump-hater than I actually am. In fact my complaining about this was more of the form: I and many others would rather not think about Trump while reading unrelated tech news and using that phrase in your title is a tiresome association that is less pleasant than leaving it out.
You are correct that I misidentified you - and I understand your point in the latter paragraph about it being more of an annoyance of politics overstepping into your unrelated Tech news rather than "Ugh, Trump". I'm glad I was able to get my point across clearly and as long as you understand where I am coming from we can absolutely disagree over my opinion on the matter. After all - it is just an opinion.
Thanks for keeping the discussion civil and take care o7