6 ms·
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
by tcbawo 3y ago
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.
- 48864w6ui 3y agoNo (see the earlier discussion for this book's prereqs)
- tcbawo 3y agoThere 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.
- cxr 3y agoThis is a hardcore CS book. It's not for beginners. It's not even really a good fit for an American-style CS undergrad course on operating systems. That's before getting into all the errata for the places where what was written in the book diverges from the actual system implementation.
- tcbawo 3y agoThank 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?
- cxr 3y agoI 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.
- airstrike 3y agoI would pick something more high-level like a Python project, or maybe since he likes games, a Godot project using GDScript These would have smaller scopes and likely feel "rewarding" much more quickly
- giovannibonetti 3y agoPerhaps 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.
- derefr 3y agoI'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 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 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.
- heggy 3y ago[dead]
- jahewson 3y agoI'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!
- e12e 3y agoThere's always smalltalk for a different approach I suppose? https://wiki.squeak.org/squeak/692 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 https://news.ycombinator.com/item?id=38868185