How to Teach Programming in Six Months
Posted September 3, 2013 by Jeff Casimir
Back when we were planning Hungry Academy, a friend experienced with technical training asked “how on Earth do you put together a six month class?” We estimate that our students put in about 1600 hours over the course, but those hours are wasted unless they’re constantly challenged. The schedule is key.
Yesterday, Katrina and I collaborated on scheduling our six-month developer class that’s starting next week. Here’s how it goes.
TL;DR: The resulting calendar is available here.
Start with the End
Step one is to find your target. Where will you be when your students are finished learning?
For our program, the answer is a mastery project that they complete on their own or in pairs. At a minimum they need two weeks, though I’d like it to be three. Our class ends on 2/28, so demos for that project will happen 2/27 with a first-draft start of 2/17.
Backing Up to Services
But the Mastery Project is pretty vague. You could call any final project a “mastery” project. Where will then end from a technique/knowledge perspective?
The most difficult challenge our students complete is our “services project”. It’s a bit vague in the actual product requirements, but the architecture is challenging: build 4-7 independent services that coordinate with each other over HTTP and JSON to deliver a seamless experience to the user.
That project needs to be demoed on 2/13, needs three weeks of work time, so must start on 1/27.
Establishing the Beginning
Now I go back to the beginning - 9/9.
Breaking Down Barriers
Our first job is to get people working together. That’s where our friend Jesse from The Improv Effect comes in. She has kicked off every one of our long-form classes and I love how comfortable she gets people with just a day of activities.
First Days of Programming
The first days of programming are about establishing confidence. To that end, we push students through several guided tutorials which lay out every step of development.
The purpose here is to begin creating patterns of understanding. It’s not hard because you’re solving difficult problems. It’s hard because you’re trying to remember the matching
end for your
do and figuring out what the hell a hash rocket is.
It takes us four days to work through:
- Ruby in 100 Minutes, a quick run through of essential Ruby syntax
- EventManager, a tutorial using ETL techniques on a 5000-line CSV file
- Microblogger, a command-line Twitter client
The end and the beginning are established, now it’s a matter of building the bridge in between.
Week 2: EventReporter
While those guided tutorials are great for exposure, they’re not challenging. In week 2 we reapply some of those same concepts into a more difficult independent project: EventReporter.
But this is where we’ve made some changes from the last class. When someone’s new to programming, I don’t think you can/should teach TDD right away. But in our last class, we let the cowboy coding go too far. They began developing bad habits.
And if you have ever programmed with Katrina, you know any testing is going through Minitest. We decided to begin using Minitest on 9/16, the first day of the second week, just as they begin EventReporter. And their solution will be evaluated in part for its effective use of tests.
In addition, they’ll get started with Git, review the three books they read before the class started, study Ruby’s amazing Enumerable API, learn about debugging, and begin learning about giving great lightning talks.
This is about the point where the exhuberance starts to turn into “what did I get myself in to?”
Producing and Consuming APIs with FeedEngine
Having made some progress at the beginning, I start working back from the end. Right before they’re ready for the services project they need to practice consuming and providing APIs.
The FeedEngine project pushes them to aggregate data from several external sources into one cohesive user experience. It needs to end on 1/23 and needs about three weeks of work time, which backs us up to the beginning of January.
Now we run into a new challenge: holidays. Hungry Academy ran March-July. Our first program in Denver ran January-July. This is the first time we have to deal with the holiday season.
We’ll take 1/1 off and have 12/30 and 12/31 as remote-work days. If we start the project at the beginning of the week then people won’t enjoy their New Year’s or, worse, the people who choose to work will judge/hate on the people that take it off. Let’s avoid that tension and start FeedEngine on ½.
We’re off the previous week, 12/23 through 12/27. So the previous project has to end on 12/19.
Mastering Collections with SalesEngine
Now I hop back to the early stage. We left off on 9/20 having just completed their first independent project: EventReporter.
That project was essentially a mashup of EventManager and Microblogger while adding on a layer of TDD. Now we kick it up a notch with SalesEngine.
This is a challenging project. You have to parse a bunch of CSV files and figure out how the data hooks together. You need to build a query interface for finding any arbitrary record. You then have to build on business intelligence to run calculations and find trends.
Without TDD and decent object encapsulation it’ll burn down. We work on Git practices (like branching, tracking remote branches, etc), class and module design, and how to refactor in the class sessions.
The project takes two weeks and completes on 10/3.
I said that the early days (and even weeks) are about building confidence. By 10/3 we’ve been in class a month. Students who are struggling are starting to wonder “can I really do this?”.
Last class we created the idea of a “focus week” where students can separate into by ability level: struggling, intermediate, and advanced.
The struggling group will focus on nailing down the basics through short, repetitive challenges. Think of code katas or exercises from a code retreat. They’ll take an exercise an implement it four or five times under different constraints.
The goal is to solidify the basics so they can move on to more difficult topics successfully.
The intermediate group will push into some new material while practicing the old. For instance, this group might re-implement the SalesEngine project using a database instead of storing everything in memory.
The premise is that they’re reinforcing techniques that are familiar while practicing how to conquer new challenges.
The top group have already mastered the fundamentals. They’ll spend the week working on things that are totally new and challenging with a minimum of support.
The goal for them is to practice pushing themselves beyond expectations and relying on themselves/each other more than the instructors or tutorials. Last class this group build JetFuel.
Starting to Build for the Web
Finally, after five weeks of preparation, the class begins building web applications with Sinatra on 10/14.
That’ll get them familiar with Sinatra, but that’s not enough challenge. After completing the guided portions, students are challenged to accept data into the app via email and SMS. It’s their first opportunity to do real work with external services and learn how to test an app like that.
They need one week for the guided part and one week for the independent extensions, so IdeaBox will be due 10/24.
Finally on 10/28 they get to type
rails new, beginning Rails with our Blogger tutorial. They’ll spend three days following the step-by-step tutorial that’s been with us since Jumpstart Lab started in 2009.
Having established the basic concepts of Rails applications, they’ll begin the StoreEngine project. Working in teams of four, they’ll spend two weeks building an e-commerece platform.
Along the way they’ll learn about outside-in testing using Capybara, authentication and authorization, and practice techniques for effective pair programming. The project will start on 10/31 and finish 11/14.
We’re getting close to the Thanksgiving holiday week and don’t have enough time to complete the next project, so it’s a good opportunity for a Focus Week.
Again the students will be divided into three groups: struggling, intermediate, and advanced. The struggling group will focus on the nuts and bolts of Rails applications. The intermediate group will practice what they already know but stretch a bit further into new territory. And the advanced group will be tasked with a challenge they don’t know how to complete and be expected to figure it out.
That week runs 11/18 through 11/22.
Son of StoreEngine
When we return from Thanksgiving, it’s time for Son of StoreEngine. This is the project where it all burns down. During Hungry Academy’s “SoSE”, we had a class meeting where people were yelling at each other. In the last class, we sent students home early without demoing the half-assed projects they turned in.
The problem is that the SoSE project demands many different features in a small timeframe. If you aren’t following good development practices, working on “feature B” breaks “feature A”. If you try to break things up into separate threads and bring it all together the day before it’s due, you’ll find out about the special ring of hell known as “merge conflicts.” And it won’t work.
To make it a bit more approachable, we’ve extended SoSE from the two weeks in previous classes to three weeks running 12/2 through 12/19.
We worked backward from the end back to the winter holiday break. Then we pushed forward from the first days to the holidays. The schedule is complete!
I’m really quite happy with how the schedule came together. We made time for a second focus week to reinforce confidence before entering the hardest projects. We stretched SoSE to three weeks so, hopefully, the projects are more successful. We navigated the tricky winter holidays.
But there is one down side: we lost the the two-week individual project that the last class completed midway through the course. With the weeks lost to Thanksgiving and the end of December, there’s just no time. We’ll invite students to work on an individual project over the winter holiday if they so choose, but will also make sure they know it’s OK to just rest and spend time with friends/family.
The next steps are filling in all the small sessions that support those projects. We’ve got up through October scheduled, will probably finish November this week, then leave the rest until we know more about the students and their rate of progress.comments powered by Disqus