So... Child #2 (18 yo) is interested in learning programming. Good "with computers" and proficient in level-appropriate math but didn't grow up as a hacker like his old man (I'll refrain from making him learn turtle graphics and BASIC). Where should I point the kid to learn the basics?
I'm afraid that if I show him how to download (or, better yet, build) emacs, how to build SBCL, install SLIME, etc... and hand the kid copies of SICL and PCL someone will call child protective services on me. I imagine there was a time when the answer would have been java/awt, but those days seem long gone. Maybe there was a let's do it all in javascript phase, but that doesn't seem to be the answer today.
So... modern starter pack? VS Code and Python? Tell him to learn Pandas/SciPy/NumPy?
Are there any highly recommended online courses for learning this stuff?
- to write some games,
- or alternative to write some tools to be used for themselves to automate or simplify some of their tasks.
Writing games can be so much fun, and is incredibly deep such that you can pretty much touch upon all topics of programming, networking, computer science, algorithms and data structures, artificial intelligence, 3D graphics, GPU programming, low level programming, multi threading, etc. But also, you can start very shallowly and simply.
Writing tools gives you the feeling how useful and productive this can be.
What languages to use depends a bit on taste, background knowledge, and how steep the learning curve can be. I think Python is a good general purpose starting language.
Also, in any case, you should start actively coding right away. I know people who wanted to learn programming but just kept reading books and watching tutorial videos all the time while not really trying it out, and in the end they obviously did never really learn it. You need to have projects, or just random playgrounds. Also, don't start with a big project right away. Do many small projects. Play around.
As I wasn't allowed to just go on the internet (yet), some time later I also got a CS book. By studying that, I finally was able to "program" what you would call it.
I agree all the way: Don't read about programming. IMHO, taking a (veeery easy, in my case it was Super Simon in ~200L Python) program, game if you wish, and starting to just change stuff around. This gets you comfortable with the concept of coding. "Formal" education (ie. books etc.) are only required once you already are fascinated.
This is the advantage of the young: They are not afraid to try out and break things. I'd suggest using this phase of life as it is intended.
It’s hard for me to fathom someone at age 12 in 2015 with a somewhat cosmopolitan background (playing games, using an RPi), not being allowed on the internet, period.
> or alternative to write some tools to be used for themselves to automate or simplify some of their tasks.
This is exactly how I learned programming as a kid.
The one difference I would recommend is to not focus on 3D, low-level programming, AI, data structures, etc. at least for younger children. When I was a kid these things confused me (I specifically remember getting random memory management issues and confusing EXC_BAD_ACCESS, and generally resorted to just liberally retaining everything). I just wanted to make things and got bored easily, so I accomplished most making simple projects on Scratch (very basic game-engine) and high-level IDEs.
Of course ultimately it's up to the kid what they want though. If they're more interested in the low-level mechanics and how things actually work than just getting them to work, good for them.
Delphi is no more but there is some successor, seems to be well received on HN.
This is the most basic of javascript game engines but also challenges you to be creative.
It has an integrated Python environment in the browser, so the learner can hop right in! That's not even the best part though; I love how well simple concepts are explained. I've been programming for a long time, so there are a lot of things that I forgot aren't a given. futurecoder explains those things really well.
I really cannot recommend it enough! It is a bit pricey though.. JK it's FREE! They don't push it a lot, but they do have an opencollective if you should feel so inclined to donate [0]. I'm not affiliated; just a relative of someone who benefited.
[0] https://opencollective.com/futurecoder
I'm talking about the concept of instructions, registers, addressable memory, etc. - with block diagrams, not with full circuits unless he's into that kind of stuff.
Then when he moves onto one of the high level languages that the other commenters are talking about the concepts will naturally stick. E.g. a variable is stored in memory, when we add two variables in the HLL we are copying those values to registers and using an ADD instruction, then we are writing the result back to memory. When there is an IF statement the computer will jump to either block of code depending on the conditional operation. Pointers become intuitive. And so on.
I've explained this to laymen and people who are interested in computers and have gotten a pretty positive reaction from them - so it's worth a shot. For a programmer who generally focuses on HLL it also allows them to get some idea of how their code is executed in the real world under all that abstraction.
There's no way in hell I would learn about registers or assembly languages if I was learning about programming in 2022 outside of a CS program.
It starts at the hardware level and works up - it definitely massively improved my understanding of everything that goes on in a machine.
I guess it really depends on the school - I have a EE/CE background so I know these things, but the CS people I know mostly don't.
https://computer.howstuffworks.com/microprocessor.htm
Javascript and webdev is also a decent option since you can build such interesting and shareable web apps quickly, but the frameworks and scaffolding can be intimidating and painful.
I would work backwards from a project/interest and pick a high-level language where it's easy to get a good enough solution and create something that feels like an accomplishment. I would want to teach both programming as well as the joy of programming.
JavaScript can be a great choice for some people as long as you don't try to build a production-level web app from the get go. Start them with a bare HTML file loaded up in the browser and only scale up from there when they start actually having the problems that the scaffolding is designed to solve.
Deleted Comment
[0] https://youtube.com/c/TheCodingTrain
But what really did it for me was buying an Arduino Starter Kit and working through the example projects in that book. I was a freshman in college and $100 was a lot of money for me but I told myself it was an investment in myself, and boy was I right. It was also immensely fun because you get to also interact with a physical object (circuits, buttons, etc) whereas most software is on a screen.
I would highly recommend Arduino or Raspberry Pi :) Best of luck!
For example, when I started studying engineering, it was great to see solutions of differential equations and ways to solve them on computers. Others have suggested games which could be great if they enjoy gaming and want to know more behind the scenes. Basically my approach would be to find a problem or two and use programming to show that computers can do wonderful things once we learn how to interact with them in various ways.
Whats the child's actual goal though? Is it to be able to gain a useful workplace skill that will actually provide financial support for their lives (something that their peers who don't end up in tech will struggle with heavily)? If so web dev is honestly a really good path, and quite useful, and will touch on things they already know.
If they're a gamer see if they can make some mods - minecraft is good for it, but the best one is something they're already into.
If they care deeply about some world issue like say climate change, try to have him make some visualizations and do some data science on climate data to understand whats going on.
What you do with coding is imo a bit more important than how you code. Does the kid want to take apart toasters and put them back together again? What actually motivates them?