Engineering the Internet was a 40 hour course I taught in Summer 2013 for MIT ESP's Junction program, an academic program for high school students organized by MIT students. It introduced computer science by having students write and deploy a static website and understand the underlying infrastructure.
The class website more-or-less as it was during the class. I have retroactively made a few minor changes (for example adding additional instructions for homework assignments) in order to make my handouts more potentially usable by others, but the core content is the same.
As a beginning computer science student, I was ahead of my peers just programming, but frequently behind them when it came to using computers in practice. While I spent hours in high school writing java code, I couldn't so much as deploy something I wrote outside of my IDE. The practical skills that I lacked are certainly necessary to succeed as a software engineer, but they had a much stronger affect on my confidence. The fact that when my computer broke, I went running to my friends made me think I lacked what it took to be a software engineer.
Some people pick up these skills informally, often before learning a high level programming language, but I found them much harder to learn than programming. I wanted Engineering the Internet to give students a start in developing the skills of manipulating a computer system that they could build on on their own.
Concretely, I wanted students to leave the course:
The foremost example is how to use a command line. No one ever taught me to do it, I just learned as I needed its tools.
Don't leave parts of what studens will work on unapproachable. If you know how to write website code, but not how to do network debugging, you will often find yourself blindly typing into a command line. Which sucks, because if it doesn't work, you're stuck.
Students should not only write code, but deploy it and manage its deployments. This should teach them skills key to making future projects rewarding, as well as build confidence. No group projects.
I succeeded at making a class that didn't overly reward experience. The less experienced students who did the homework were successful and the more experienced students didn't have automatic success. This was mostly a property of what I was teaching, which was new even to students who had programmed before.
I think the biggest shortcoming of the class was a lack of motivation for the beginning parts. It wasn't obvious to the students why bash was useful while we were learning bash. If I taught the class again, I would probably start with HTML. HTML is the most familiar and approachable topic of the semester, so it would give students some early success, but more importantly, having something they wanted to put on the internet would give them a reason to learn other skills, like bash.
I would also probably add and remove some material. The students didn't seem very interested in the networking unit; I would shorten it and rework it to focus more on information they might use writing and managing websites instead of focusing on how the network works as a system.
I would use the time saved not talking about networking to spend more time on dynamic websites. Students can understand HTML forms and post and put requests, or how to install a wiki or wordpress site, or talk conceptually about cgi-bin without programming experience.