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.
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.
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.
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.
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?
My 7 year old has gotten into programming through her iPad.
In particular, she uses:
- Tynker
- code.org
- Swift Playgrounds
All three have well-considered tutorial material. Tynker is the one she's most excited about, and the one she's currently spending the most time in. Some of the stuff she's cooked up without any help from her dad... really brings a smile to my face.I'm old enough to have learned programming on a C64 -- BASIC first, then 6510. Back then, the game was to understand the machine and figure out how you could coax it to do new things. Today, so much programming feels like stringing together black (or at least dark gray) boxes, and hoping that the resulting value is greater than the mental overhead of managing said boxes.
Tynker/code.org/Swift Playgrounds hearken back to the immediacy and narrowness that I loved from the old C64 days. My daughter seems to genuinely be learning from them. That moment when she really "got" variables and loops... big moment!
It's "cool" and relevant.
The coding part is C# so a nice language and environment.
You don't really need to understand all the low level stuff, you can write some scripts and just press play!
There are heaps of official and community tutorials. API Quite well documented too.
Its not just code. There is a big editor to learn and become good at. Your kids may decided they like other aspects. Modeling, Lighting, Effects, Audio, UI, VR even?
I think there is plenty of Unity employment around, not just in games but all kinds of "multi media" businesses.
Jay
Python is great for beginners, it's usually the first language taught in schools.
Web development is also really easy and rewarding, which makes it a particularly good route to get someone started in programming. Just remember to guide him through JavaScript libraries after learning html, CSS and JavaScript. When I first started learning web dev, I didn't know about frameworks like react and angular which caused me to waste a lot of time rewriting things which could have been made as react components. It was a lot more difficult to maintain the website I already made at that point.
Like you said replying to someone else's comment, game development is good for getting into programming. Although, make sure he is aware of the other routes, as game development isn't always the best career path even though it might sound fun at first.
Finally, let him make choices. You shouldn't have to decide everything for him, it's a good skill as a programmer to be able to look things up yourself. Maybe ask your son to find out what he would prefer to do, although if you already have some experience, of course let him know if there's anything that could help him get started in programming quicker.
Enjoy the rest of your day!
It is a practical introduction to programming using the type of projects that got many of us into this field and manages to capture the spirit of what makes writing your first program so special.
https://developer.roblox.com/en-us/onboarding
If you want something more traditional, Rails for Zombies is good
https://www.pluralsight.com/courses/code-school-rails-for-zo...
Oreilly's Head First series would be great too, if they updated it. Hopefully I'm wrong, but I think it's dead.
I cannot recommend it highly enough.
And, if you don't care for the certificate at the end of the course, it's free
At your son's age, there are plenty of how to program python courses using udemy and the like that show to build progressively harder apps for a complete beginner. From there, he could probably try to do one of those google certificate courses on android development or the like.
I remember having to check out BASIC programming books from the library as a kid to learn. These days, people have made fortunes on creating videos on how to program.
[0]: http://htdp.org/
I'm guilty of this, but it's far to easy to spend too much time jumping between different technologies and programming languages and only learning the basics. So it's nice to have a concrete project in mind, so you can choose an established tool for that kind of project and not get lost with anything else until the project is done.
Probably has lots of different things that he wants to learn so help him explore each.
Python for command line stuff and backend stuff, vanilla JS, html, css for blogs or web pages.
There's also either online classes like Udemy or in person camps or summer programs that would be great, he can meet ppl his own age trying to code too.
I know a few years back iOS coding classes were the rage, now it'll probably be something with blockchain...
In terms of code editor maybe just sublime or atom, no need to go super complicated, he'll figure out what he needs as he builds expertise.
https://github.com/bayandin/awesome-awesomeness
https://github.com/sindresorhus/awesome
Also, there is always nocode/lowcode solutions he can put together.
Starting with (modern) JS will turn off pretty much anybody, but probably one of the first things they'll want to learn is how to make a website. Fun JS like game engines might be a good fit.
Python is too magic to start with. It can get pretty complex to follow and debugging a pain.
I would also consider Godot. It's fun and intuitive, syntax is not hard, game logic can be complex but it's closer to the maths they've been studying in school and creating something you can interact and play with is how you get students excited and eager to learn more.
The course can also be completed for free: https://www.edx.org/bio/gregor-kiczales
How to code - simple data, and how to code - complex data together make up the material in CPSC 110 (though there are probably some differences). They’re completely accessible with no background requirements.
The courses are based on this curriculum, which uses HTDP: https://programbydesign.org/
The programming language used is based on scheme.
On your main question about how to make the (now painful) dev environment setup easier I have some suggestions:
1. Just use javascript
2. Just use python/pygames (yes it has to be installed)
3. Just use a hosted environment (like replit.com)
4. Just use swift if you are a mac user
Start with an interpreted language that doesn't require convoluted compilation or build-steps. Or at the very least something with a "play button" that allows one-click runs. Anything else just distracts and confuses from the actual "programming" part.
I'll echo others and say building games is a good on-ramp for kids. I also recall enjoying playing around in Visual Basic as I could make a "real application" and it was satisfying to see my work as a "real" program I could see and use, and try to work out how to imitate other features I was seeing in apps I used every day.
As yours is 18 something like scratch is probably too "baby-ish" so perhaps python will feel like more of a grown up option for them with the option to do some fun stuff with game/graphic programming. Visual Basic .net (or even C#) will allow for building GUI apps nicely.
If they enjoy those they'll be able to broaden their horizons and learn more. Don't sweat the theory aspects - they don't need to know about runtime complexity and monads etc just to get started - if they get the bug for coding, they'll come across this stuff on their own eventually (e.g. when they end up creating a naive O(n^n) implementation, they'll end up spending some time trying to optimise it even if they don't realise they are doing that - be there to help guide and offer pointers to help open their eyes to it all)
Good luck
The first three projects introduce the skills. The second two give you some agency in decisions. The last lets you make whatever you want to make
Code interactive 3D apps / VR / AR starting with HTML and dive into the entity / component API as you progress. Super rewarding to get something visual than can be shared with an URL to show off or ask for help.
With glitch one can start coding right away with zero tooling to install no account required. Glitch doesn’t hide details and knowledge transfers directly if one wants to start developing locally.
I recommend also the A-Frame docs as learning material:
https://aframe.io/docs/1.3.0/introduction/
I help maintain A-Frame and seen plenty of success with people learning how to code while having fun. Also advanced capabilities available as you learn. Very accessible but not just a toy.
Very welcoming community.
edit: typos
Is he interested in making websites, games, AI, embedded control of robots (drones, vacuum cleaners, etc).
Without a goal in mind learning about programming, for most people, is a sterile exercise.
My nephew is interested in making games for Roblox for example.
I think we are beyond the generation of interest in the baremetal, I learned programming in mid 2000s, I spent just a short time with desktop programs, but was enchanted by the idea of making dynamic websites right after, it was enchanting that I can make something interactive that all the world can interact with. The fact that it was easy to show it to others (a URL) made it nice too, handing people an .exe in 2000s doesn't look nice.
Also being passionate in front of him and talking about what you like in programming would help, because that's how my brother got into it. Me broxplaining stuff to him.
In general just open the doors for him, he might love a language more than other.
Of current environments, Python may come the closest. (Other environments have a REPL, which is a great environment, but "REPL + harsher learning curve" is not what you're looking for.)
Fwiw, I'm only a couple years older than #2, and I would kill to have someone in meatspace who would help me with all of the above.
As far as other options, I would say Pico-8, tic80, UXN, Minetest/Minecraft, Godot, or Unity may all be decent options to start with, depending on how in depth you want to go.
Oh, also I really really really really like the book The Secret life of Programs. In my opinion, it really is worth learning how the layer below where you're working works.
Try to give them a tour of what can be done in each domain, and see what they'd like to try.
*This really depends on his goals. AI/general scripting -> python. Sysadmin -> C/Perl. Games -> C#/Java if Minecraft. Etc.
>Tell him to learn
>online courses
You're their mum/dad, no? You know their interests, you know their abilities. This is an amazing opportunity to form a lifelong bond. Sit down with them and work it out together!
SICP is great for those who want to learn more about programming after they have some experience programming. If someone gave me that book as my first one I think I'd have picked a different career field, even though I am now - 8 years later - working through it :)
Apart from npm and yarn, they need not install any other tool or builder. Also they can see the results in near real time.
I think the ability to see the result of what they code right-away will keep their interest for the 'fragile and prone-to-stress phase'. Proven my architect older brother and 2 of my friends continue to make website and learn other webtools or language till now.
The main thing is that he finds something that is interesting and approachable. Build up small achievements. Let him start with simple examples and then figure out how to change colors or the number of iterations in a loop. Don't rush too many things at once. Some things that seem simple like recursion may actually take a bit of time to grasp solidly. Encourage him to be patient and persistent and expect challenges like that.
Don't try to pile on too many things at once.
Dictating which language etc. is not going to help him learn programming.
He needs to be motivated by something and generating his own questions and Google searches.
If he is waiting for you to tell him what to do then your job is to train him to be a proactive learner. Help him find interesting mini projects. Start very simple. But keep trying to build gradually towards something he is really interested in (such as game programming etc.).
No reason it has to be one thing. If you want to hand hold it could be literally 100 different things to play with, show him a different thing every week based on his actual progression and interests.
So to that end, I'd probably start with a project-oriented book, or give them tasks that require programming to solve (e.g. tell me the distribution of words in this Shakespeare play. What are the most common ones?).
Editor wise, VSCode is great, but may be too many bells and whistles. Sublime Text may be a better place to start, since it'll do highlighting, formatting, etc without being overwhelming.
Language wise, Python, JS, and Ruby all have ample beginner resources. Depending on what else they're into, JS is probably the most widely useful (since it's on most web pages and the sandbox is built right into the browser).
Good luck! Let us know how it goes!
These days there's plenty of sites like leetcode where you don't have to set up anything at all and they can give you little bite-size problems that will make you learn the basics with a feeling of accomplishment.
Incidentally, if they decide they like these kinds of problems and want to become a professional programmer, spending some time on Leetcode or codeforces (later as it requires a little setup) alone can get them a good job these days. People around here dislike this fact but it is so useful if it turns out your child enjoys these kinds of problems.
Things like Scratch, Python+Pygames etc make the initial hello-world style apps too easy and then there is a gigantic learning curve for anything better. It is very hard to keep the motivation going.
We tried codehs.com . Kids spend an excruciating amount of time trying to make the print statement's literal output match with whatever the code-checker is expecting. It is frustrating even for me to try to debug their code. I feel any kid who is learning coding without an IDE such as VsCode will get discouraged from this field.
I am just about to start a session for 8th grade graduates to introduce them to 'advent of code'. At least here, the right answer is just a number. No more worrying about the quote character being in unicode or text.
The one that got real interest from my students was a world-puzzle solver - to cheat the phone game "LetterPress" (free on iPhone and Android). They finally understood how a bot (official bot that you play against) could be so smart.
I am still on the lookout for such good examples that they can actually use in real life.
I would first start him on some guided C++ projects that illustrate basic syntax, data structures, explain libraries, pointer, how memory works, etc. I wouldn't spend a lot of time here. Some simple but neat console games that also showcase some math coolness (like guess a number between 1-100, then say you can guess it in 7 or fewer guesses).
This is how I learned, and was very helpful in understanding some of the why and how of programming. This gave me a deeper understanding of what was going on when I was introduced to easier languages. It also gave me enough understanding to ask how things worked in the easier languages.
After that brief learning period, then I would put him Python. There are lots of powerful libraries and it's easier to build more advance projects. There is also great support for physical stuff like Pi hats if he wants to so robotics, sensors, etc.
I wonder if there's a typo in your message. If the boy is 18yo, then an interest in programming will have already surfaced. Don't try forcing him to do something that's not of interest to him. You only have him at home for short while now. I'd encourage you to explore what he likes to do. Maybe you'll find a new interest, and the two of you will have a great time before he leaves home.
JavaScript in the browser allows for quick feedback loops that I think can be rewarding for beginners.
Help them come up with projects that they're interested in and will challenge them a bit, but are also tractable. Beginners won't have the context to be able to scope a project out, or to decide what is realistic and feasible, either. I find that can be a roadblock for people who are just starting out, where they learn the basics but can't figure out what to do with them.
Show them how to make backups, and test them. They need to have confidence that they can recover, and can't damage things beyond repair.
Show them how to use apt-get to install and remove things. This is essentially giving them all of the open source software in the world.
Show them how to use keywords with google, especially -searchterm. This will aid them when they want to find things. Teach them about the "magic words" and how to find them... i.e. annotation instead of markup, that kind of thing.
Set them up a git repository and Notepad++. Teach them how to use it, along with GitHub or some equivalent. Just use plain text until they understand how it all works. Walk them through their first pull request and fork. This gives them the tools required to be able to experiment without losing things, and sets some expectations about working with others.
Set them up with Excel or the Open Equivalent. Show them how purely declarative programming works. Then show them how macros work. Everyone should know how declarative programming works.
Show them how double entry book keeping works. How errors in entry are detected and corrected.
Show them your favorite programming language. Explain how you came to value it, it's strengths and weaknesses. Show them, if possible, some of your code.
Show them lisp, forth, basic and prolog, and explain the strengths and weaknesses of each.
Show them how test driven development works. Make sure they know how to write good tests.
Show them how gnu readline works, have them read the manual for it, and bash (this one is a new thing to me, as an old windows user. You would not believe how powerful that thing is)
For the love of all that is good in the world, teach them how to name variables correctly, how to write useful comments, and how to smell code.
Teach them pair programming, the experience of a few hours can help them skip months of grief. It can be quite a bit of fun to show your kids something new. Don't be surprised when they return the favor.
After some initial experiments it should be more clear where the journey goes. Some learn better bottom up, meaning few abstractions are suitable. Some like bells and whistles, UI or games. Some like domain specific stuff like math or robotics.
There’s plenty to explore. The big realization has to be „I can do pretty much anything!“ and off they go. Just be there when needed and it’s going to be fine.
I think what I found amazing what that it was relatively easy to rebuild something that I used every day and that was immensely cool/useful.
So maybe help him rebuild a basic instagram / TikTok clone app on a mobile device?
I can only remember one in Romanian, but I'm sure google is your friend.
Agree though- do not under any circumstances introduce/subject them to the toolchain bullshit we have to deal with.
Includes advice on getting started but also comes from the perspective of getting a development job, not just getting into coding.
https://bubble.io/how-to-build
or scratch
then build some things. then search on the internet and see if there's any tutorials on how to do it with code.
I think the first step is to think about what he would like to build.
I wish I had this resource when I started. A great introduction to CS fundamentals
Unity is a decent start, and from there I got more into the fun stuff, OpenGL, assembly Lots of tutorials online.
From there you’ll have the background to quite easily transfer to whatever area is of interest.
OCaml for the functional language close to writing math expression and be able to do a lot of other things C or C++ for memory management and close to baremetal.
Basically see different paradigm, their tradeoffs.
I also think Flutter might be interesting, though not sure how suitable for begginers.
Why Scratch? It has assets available immediately, it's simple to draw and import images, and has a built-in audio editor.
Wont't say it's the best but I've been trying to fix a lot of things I don't like about existing content/platforms.
Why C#: it is the most versatile platform. You can create apps, web stuff, servers, desktop apps, machine learning, console apps, etc. It is statically typed (which is important for the youth to understand what he is doing), has excellent intellisense and beginner friendliness was a focus in the last year (a one liner is nowadays a valid c# program). .NET as base platform allows also F# for a switch to the purity (do not make me comment on that), can run on Linux/macos (if this is important to you) and most important: is not Python which everyone else is doing. Python is the new boring Java.
Arduinos are also fun.
- alexa skills (start with one and modify it)
- game mods eg skyrim (ditto)
its a ton easier to make tiny tweaks to a codebase like this and get instant feedback, even if you are essentially cargo culting at this point.
- mobile app kits. MIT had a kit once, i forget the name. make an app that makes a fart noise or texts a buddy etc. we're not talking material design and deep frameworks here. quick feedback and tinkering.
- scratch games. i know ppl. think its toy but its quick to experiment with and the results are quick.
do not, under any circumstances, let the kid get sucked into the tarpit of webapps. if they are into the web, have them spin up a wordpress site and start tinkering with plugins.
tl;dr - newbies need quick feedback and early successes. tinkering helps.
It has very low cognitive overhead so you can get going quickly and focus on the concepts.
Take any program, change something, see what it affects, rinse and repeat.
The program needs to do something they are interested in.
Starting from there you can learn almost anything for free.
A game engine like Unity, or maybe Unreal Engine. People use game engines for almost everything these days: creating synthetic data for training Computer Vision models, AR/VR applications, even high end Disney shows such as “The Mandalorian.” Motivating use cases can spark greater long term engagement.
Another is to just let them build a website, so learn some javascript to make games and put them up there.
Pull up the debugger in chrome on random websites and start them on javascript.
https://www.edx.org/course/how-to-code-simple-data
https://www.edx.org/course/how-to-code-complex-data
* The From Nand to Teris project, The Elements of Computing Systems: Building a Modern Computer from First Principles book, and/or Coursera course. Builds a hardware stack for a CPU and then a software stack (assembler, VM, high-level language).
https://www.coursera.org/learn/build-a-computer
https://www.coursera.org/learn/nand2tetris2
https://www.amazon.com/Elements-Computing-Systems-second-Pri...
* The How to Design Programs book. What the edX course above is based upon.
https://www.amazon.com/How-Design-Programs-Introduction-Prog...
* Structure and Interpretation of Computer Programs (SICP). Uses Scheme. One can use Racket with the `#lang sicp` language.
https://mitpress.mit.edu/sites/default/files/sicp/index.html
https://www.amazon.com/Structure-Interpretation-Computer-Pro...
YouTube playlist of the course by the authors: https://youtube.com/playlist?list=PLE18841CABEA24090
* Thinking as Computation: A First Course. Uses Prolog to solve problems of thinking.
https://www.amazon.com/Thinking-Computation-First-Course-Pre...
https://www.cs.toronto.edu/~hector/PublicTCSlides.pdf
* Turtle Geometry: The Computer as a Medium for Exploring Mathematics (shares an author with SICP). Uses Logo to explore turtle geometry/graphics. Can use any modern Logo implementation.
https://www.amazon.com/Turtle-Geometry-Mathematics-Artificia...
https://direct.mit.edu/books/book/4663/Turtle-GeometryThe-Co...
* Starting Forth. Uses Forth.
https://www.forth.com/starting-forth/
https://www.amazon.com/Starting-Forth-Leo-Brodie-ebook/dp/B0...
* Learning Processing: A Beginner's Guide to Programming Images, Animation, and Interaction and also The Nature of Code: Simulating Natural Systems with Processing. Uses Processing and p5.js (the JavaScript version of Processing).
http://learningprocessing.com/
https://www.amazon.com/Learning-Processing-Beginners-Program...
https://www.amazon.com/Nature-Code-Simulating-Natural-Proces...
The author's YouTube channel: https://youtube.com/c/TheCodingTrain
Move on to functions, arrays, ifs/fors, and maps.
Teach them the point of JSON and data objects, and then the world is theirs.