A fantastic idea, and also the philosophy behind Oberon is something I think we shall need more of - as the operating system for a computer is now conceptually the operating system for a network, a cluster of computers, for an organisation, a government, having one company’s “operating system” not only be defined in software, but enable that software to fit in one head, that seems important in ways that otherwise make us throw up our hands and say “it’s all rigged” or “they are all the same” or “who knows, let’s just keep going”
Can anyone recommend this book as a first resource for a young teenager to teach themselves about computer science and coding (with some guidance and assistance from myself)? He has a strong interest in making games, but has stalled out with his attempts at programming so far (a handful of books and YouTube videos). I think learning from first principles would be most effective, but our earlier attempt with Nand2tetris might have been a little too low level to hold his interest.
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...).
I'm a first principles thinker and prefer to learn from books, but it must be said that games are really exciting and YouTube videos very engaging. Books... not so much. Indeed, as a teenager in the 90's I first learnt to code from videos ("Learn Visual Basic Now" from Microsoft). First principles aren't much fun when the path to applying them in the manner you want is measured in years - this is where having an engaging and relatable teacher makes all the difference (out of scope here).
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!
Perhaps a book like Realm of Racket or How to Design Programs might interest him. Both teach Lisp-style programming with the Dr Racket IDE, although the former might be more appealing to teenagers due to the games developed and the narrative in each chapter.
I've read a lot of introductory texts to programming, as I have taught programming in a classroom setting to high-school students, and am always on the lookout for better ways to teach it.
(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.
There have been many posts and much discussion on this book since Wirth’s passing. Looking around, I found some discussion that describes this book more as a description of a complete system than an introduction that describes how it gets there. I don’t think this necessarily disqualifies it as a beginner’s book. Having a reference description of a complete system that one can fit in one’s head might be a great resource for a beginning programmer.
If anyone has read/used this book before, I would love to hear their opinion about where it best fits in their journey.
Thank you for elaborating on my question. I haven’t read the book, so I have no idea where it fits into a general curriculum. Having grown up in the 8-bit home computing era where a user could wrap their head around the entire computer and OS, the idea of building a broad base of fundamentals sounds attractive. Would you put this at the same level of difficulty as SICP, which another commenter suggested?
I haven't read SICP in its entirety, but that sounds wrong. SICP is explicitly for an intro to programming course, and it's written in a way that's approachable for first-time programmers from what I remember.
Some people rave about Oberon, and I think there are brilliant technical ideas in the system, and this is entirely subjective, but reading the language gives me a headache. At least Pascal allowed lower-case keywords.
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.
There's someone working on a more modern-style Oberon dialect called (iirc) Oberon+ or Oberon Plus. Can't remember much more, and the term seems hard to search for when there's some AMD chip with that name.
> Does anyone know why Wirth never modernized his style?
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.
> It's easier to read the source code with uppercase 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.
A noble effort, no doubt. But it would be nice to see a web adaptation, since most of our reading happens on a multitude of screens these days. Might have a higher impact on readership than better typesetting.
> Project Oberon is an amazing piece of computer science and amazing tool for teaching. The book and the code demonstrate, without any tiny amount of doubt, that it is possible to build a usable computing system small enough to fit in the head of a normal programmer. That, in my not-so-humble opinion, is a truly great achievement and I am in awe of Niklaus Wirth and Jürg Gutknecht for it.
As I wrote in an earlier post, the enthusiasm of the author is contagious.
Being "pretty" seems to be an editorial comment from the person who posted this link. At least, I don't see that claim being prominent anywhere in the Github repo. The goals of the project are rather to extricate the text from pdf format, to make it more available and adaptable.
The title of the project on Github is Make Project Oberon Pretty Again, it's not something added to the HN post.
"The last edition -- from 2013 -- could use some tender loving care. It should look beautiful." - the paragraph that introduces the goals of the project.
I can't find the bibliographic details for the 2013 edition, but the 1992 one was published by Addison-Wesley, so it's quite possible that anyone participating in this project to "liberate" the text will get a cease-and-desist from Pearson Plc's legal department/anti-piracy people.
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".
wirth has published his project under an open-source license, guaranteeing everyone everywhere the freedom to study, copy, modify, and redistribute it forever
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 is still a bit irritating to see the phrasing "make X Y again" in any context ever. Would really rather not have... any of... the associations that it gives.
That was slightly irritating; what is more irritating (notwithstanding the obvious best intentions of the project!) is the seemingly widespread notion that typography has much to do with Wirth's work.
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...
experienced buddhist meditators famously sometimes meditate despite chilblains, or incense burning on their scalps, or being aflame with gasoline, or starving themselves to death over a period of months
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...)?
this sounds wonderful! i don't know what adjoint representations are yet, though, and i haven't looked at the gemini format; i hear vague echoes of how my handaxeweb would happily extract indented lines from markdown files, html files, postscript files, you name it... though i haven't tried pdf. what's the connection between linear transformations of lie algebras and pdf files?
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 ...
Giving people the power to change your way of speech or way of thinking is how you let them have power and control over you. It gives them strength when they should be seen as weak. It empowers them.
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.
Disagreeing. It's like nobody paid any attention to the gay community in the late 90s/early 00's. Words are only given power over you when you cower from them and by doing so you help show that those words can have power over others too. You only harm yourself and others by doing so.
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.
I feel like you have it backwards? I'm not offended by the words. It's the people who are reusing the words and ignoring where they got them from that have given them power. I'm saying we should choose the social norm of not giving Trump and his way of thinking and acting power, by, among other things, not emulating it.
It doesn't feel analogous to what you're saying about slurs, to me.
Do you know the original use of the "Don't mess with Texas" slogan? Do you think if people didn't repurpose the phrase it would have kept its original meaning? By leaving it alone you're ceding that the phrase belongs to Trump - who stole it from Ronald Reagan's "Let's Make America Great Again" 1980's campaign slogan.
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.
Eh, you're making a fair point but I guess I just disagree. It's not like anyone used that phrase anymore by the time Trump pulled it out. It was always anachronistic. Meanwhile every modern usage is an explicit reference to Trump's usage. Maybe there will be a time in the future where they aren't, but it's not here yet.
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.
If you try and prevent any usage of the phrase/snowclone it will only ever be an explicit reference to Trump's usage though. This is why I made the comparison to slurs against the LGBT communities earlier. If you only ever allow "gay" to be used as an insult instead of a self-identifying label that means it will only ever be used as an insult. This is why the reclamation of it as a self-identifying label was so huge in the 1990s/2000s and calling everything "gay" as an insult largely fell out of common vernacular. By refusing to allow it to be an insult it eventually ceased being one even if it took the better half of two decades. I'd rather see "make X Y again" used everywhere until it has nothing to do with Trump anymore and is just a cliché snowclone. Even if that means seeing it in my tech news ("Make Linux Fast Again" is/was another one). Even if it takes the better part of 10-20 years to make it cliché/generic enough to no longer remind people of Trump.
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