The year is 2012, and you want to teach a group of students some aspect of web development. You’ve got them in a session for 1 day, and you have no control over which laptops they’ll be using. How do you ensure that each student begins the class with a preconfigured environment, ready with your course material?
We created Training Wheels at Four Kitchens, to solve this problem for our own training sessions, and we open sourced it in the hope that others might find it useful, too.
I was the lead backend engineer on the project.
To use Training Wheels, the only requirement for a student laptop is that it has an up-to-date web browser. The environment is otherwise in the cloud - their own personalized LAMP stack, IDE (code editor), FTP access to their files and assets - and each environment can easily be controlled from a central dashboard.
Typically a single, large cloud VM in EC2 or Rackspace is used to power an entire class. The single server is configured and driven using a GUI that invokes Ansible under the hood. I’ve written about Ansible before on the blog - we love it for its simplicity and power.
Each learner has access to their own Cloud9 IDE, a browser-based open source IDE that was later (2016) acquired by Amazon.
We built Training Wheels to be pluggable, so an administrator can create courses that use any backend technology, not just LAMP or nodejs. Theoretically, anything that can run on a Linux server can be turned into a training backend.
Note from 2020: this was a world before container orchestration. Docker was released in 2013.
I created this screencast (no audio) to show off the functionality and the GUI that we built on Ember.
My colleagues at Four Kitchens loved teaching: everything from node.js to responsive web design. We were frequently rated among the best of the sessions on offer at conferences. These trainings cost extra on top of the ticket price, and were always sold out.
Training Wheels was used in these sessions at DrupalCons around the world (plus many more sessions that I don’t have access to anymore!):