RbMU, a better way to learn Ruby
"The students on this list have all shown they can ship clean code under tight deadlines while maintaining a balance between learning new things and getting things done."
When I read this at the Ruby Mendicant University alumni list, I knew that the core skills course that the RbMU was offering was something to try. Something different and focused on the reality of learning to code and working for the industry.
"Shipping clean code, under tight deadlines, learning new things and getting things done". That's the way!
Despite having a good amount of experience on Ruby coding, I knew a course like this would be worthwhile to strengthen my Ruby roots. Also, being a Ruby/Rails/Agile teacher myself, I was interested in knowing other ways of teaching development skills.
The Core Skills Course
The main course that is being offered right now at the RbMU is called the "core skills course", an intense three week course that takes you through several important topic areas every Ruby developer should be comfortable on. During these 3 weeks, you get to work on 4 assignments and a personal project, that are finally released as open source at the end of the course. You also work with your fellow students to review their code, so on an average course you may end up working on your 5 projects and reading code for some other 20 or 30 projects.
The entrance exam
The core skills course is aimed at intermediate Ruby coders, and the seats are limited, so to be accepted you have to pass an entrance exam. When I joined the RbMU, the entrance exam consisted on developing a Ruby script to parse a CSV with the availabilities of students in order to find the optimal starting time for weekly meetings:
Now, new students apply for RbMU admission through http://puzzlenode.com, an in-house app that lets you choose between a set of problems and submit your solution.
No lessons, straight to practice
After passing the entrance exam, I signed up for a session and waited a pair of months or so to start. I chose the last session available at the time, in order to have some time to finish my client projects and reserve a big part of my agenda exclusively for the course.
When it finally came the time and we started, I was suprised to see there were no formal lessons at all. I had expected the typical course layout where you attend some classes and then you have some homework to do, but instead of that, we were given coding assignments. No lessons at all, just start coding, and then we'll have something real to talk about!
This makes such a big difference. It's OK to read a Ruby book to get the basics, but to really learn things, you have to need to solve a problem. So, we were given our assignments, we had some real programming problems to solve, and we had to do our best at solving them, with the cleanest code possible and learning just the things we really needed to learn.
Time pressure is your friend
The next thing that surprised me was that we were given strict checkpoints. In total, we had 3 weeks to finish the course, but you had to pass through partial deliveries in the form of 4 checkpoints. If you didn't get the work that needed to be done at every checkpoint, it meant that you were expulsed from the course. That pressure component really worked for me. It makes you focus on what's really important to be done and ignore the rest.
It looks, though, that for some of the other students it didn't work so well. Out of 8 students that started the March session, only 2 of us could make it to the final checkpoint. I guess they underestimated the effort it would take to finish the course. It was really a lot of work: in my case I dedicated 24 hours per week, although this may vary for each student. It looks like on average, it takes around 20 hours per week.
What did the assignments look like?
Every core skills course session is different and each one has different assignments. In general, each session features an exercise on each of the following topics:
- Modeling complex business logic
- Integration with third party software libraries and/or web services
- Practical application of high level software design principles
- Contribution to community projects
What's nice is that you're given an assignment in the form of a general problem, but it's up to each student to propose what exactly they want to work on. It's not the teacher who puts homework on you, it's you who propose what you would like to build. This is a real motivation booster and makes you really engaged.
In my case, these 4 assignments were:
- Background job processing. We were asked to build a demo app that made use of background jobs. As I already had experience with DelayedJob, I chose to work with Resque, and I built a simple Rails app that integrates with Last.fm and Flickr, so you enter the name of a music band and it fetches its albums, similar bands, and photos from Flickr, using a Resque background queue. https://github.com/jaimeiniesta/s6-e1
- Experimenting with Ripper. Ruby has a standard library called Ripper, which aims at converting Ruby syntax into s-expressions. This library is quite obscure and has not yet been very explored, so we were asked to conduct some experiment with it. What I did was a Ruby file comparator, an script that, given two Ruby files, would convert them to their simplified structure and tell if they are the same. https://github.com/jaimeiniesta/s6-e3
- Community Service Project. Although the web and apps of the RbMU is mainly built by Jordan Byron and Gregory Brown, it also receives a lot of contributions by its students (and anyone who wants to help, as it's open source). My humble contribution was the the alumni list filtering by year, course, and recent alumni. http://university.rubymendicant.com/alumni/recent.html
- Challenge Project: Tower Defense Game. Greg gave us a prototype of a tower defense game, a basic but working demo where you have a board with different kinds of tiles, and pieces for towers, monsters, etc. Our goal was to study the codes and make something more solid, make it grow and add new features. New kinds of towers, monsters, maybe a nice interface. Again, we were the ones proposing what to do. The trick here, was that the code was not documented and we had to study all this code before thinking about what could be improved. We all left this one for the end as it looked so complicated, but on the last days I had a nice meeting over IRC with Ginny Hendry and we did a dissection of the code, following it and understanding how it all was working. It was a good experience. https://github.com/rmu/s6-e2
My personal project
Apart from these 4 assignments we had to work on, and the code reviews we were expected to do, we also worked on an individual project. Mine was w3clove, a site-wide markup validation tool. Give it a website and it will validate the markup of its pages on the W3C markup validator, and return you a report with the most common errors and warnings. https://rubygems.org/gems/w3clove
Alumnus, at last!
Finally, after these 3 intense weeks and after a lot of fun hours learning good Ruby practices, you're given the alumnus status and you enter the alumni network. The core skills course has ended but that's only the beginning...
What's next?
Being part of the alumni network is great, but that's not the goal, it's just the beginning. You're welcome into a great community of Ruby developers that is very active building new things and learning. As I write these lines I'm attending a Software Ethics seminar, and preparing myself to be a mentor. There are also courses on other topics, book readings...
Reflections
The current education system is at a crisis and we need to re-think the way we're learning. I recommend watching the talk by Sir Ken Robinson about how school kills creativity and how we need to change our education paradigms. While these talks are oriented at the way kids are being taught, I think the same applies for standard courses and certification programs, at the university and the enterprise.
There's a better way to learn, and it's neither linear nor based on pre-packaged instructional materials for isolated individuals. As Sir Ken Robinson points out, "great learning happens in groups, and collaboration is the stuff of growth".
I'm glad that Gregory Brown started this Ruby Mendicant University, and excited to see where we as a community can take it.
There's a lot of things we can learn and build together.