Honestly, probably the most important thing is to move away from any tools that hide what is going on. "Magic" is bad for learning, though it can be useful once you already know what is going on.
If I were to teach a class like this, it would be something along the lines of:
- start in a terminal, perhaps using the Ubuntu server distro
- begin with basic commands like
help
,ls
, andcd
. - show how to write shell scripts
- show how to install new programs using a package manager like
apt
After they are comfortable with the terminal, I would walk through installing the Ubuntu desktop distro so they now have a GUI. Then, I would teach them a "real" programming language, probably Python:
- at first, I would require them to write their program in a plain text editor and compile/run it from the command line
- after they are comfortable with that, I would let them use a code editor
- as part of the programming unit, I would introduce the network stack and have them create a server
- at some time during this unit I would also teach them
git
After that, I'm not sure where I would go--there's a lot of different directions! Some ideas:
- how computers work on a more low level (transistors to assembly)
- how to build a desktop computer (or even just take one apart and put it back together)
- how operating systems work (syscalls, time sharing, memory management, basics of C)
- bootstrap their own programming language (assembly -> Forth -> Lisp -> ???)
- web development (requests, databases, basics of HTML+CSS+JS)
I also think a capture the flag event would be fun (like /u/half_[email protected] suggested), but maybe wait till closer to the end of the year/semester for that
Is it really that hard? For me it was just downloading an app and creating an account--easier than setting up Facebook Messenger. I think it doesn't yet have the network that Messenger/Signal/Whatsapp have, which makes it harder to use with others, but setting up has been easy in my experience.