In May, I had the pleasure of attending JP Boodhoo's Develop With Passion boot camp class. JP's class was favorably mentioned in the acknowledgements section of Scott Millett's Professional ASP.NET Design Patterns book. Checking JP's web site, I saw that a class was coming up here in Denver. Surely it was meant to be. The title of the course, "Develop With Passion", really spoke to me. In fact, when asked on the first day of class why I was attending, I said I wanted to rediscover my passion for writing code.
Drop and Give Me 20 Unit Tests
Ok, maybe the class wasn't quite that intense, but it did live up to its boot camp moniker. The days were scheduled from 9 AM to 9 PM with a couple of days going just a bit longer. For the first two days, we were tasked as individuals with writing the code to get a set of unit tests for a movie library working. This ultimately led to us developing a domain specific language for querying and sorting. Some of you may be asking "Isn't that what LINQ is for?" You may be right, but one of JP's points was that you need to have the fundamental skills to be able to implement these sorts of things yourself. Use frameworks and tools where they make sense, but don't let them dictate your design or impose artificial constraints.
Despite JP's assertion that we were working on the fundamentals, I found the exercise to be humbling, as I think many others in the class did. Clearly there is a difference between "understanding" concepts such as generics and delegates and truly understanding them at a gut level. Using the framework's built-in generic types or implementing a few basic generics of your own does not lead to true fundamental understanding.
Let's Turn It Up to 11
If the first two days were a little bit humbling, the rest of the week was even more so. Starting on day 3, we pair programmed a web store application including implementing a routing and URL building framework along with an IOC container. No ASP.NET MVC or WebForms here. We were also required to pair up with someone different each day, which I think was a great way to facilitate more interaction between classmates.
The basic rhythm of the exercises was that we would be tasked with either writing the tests or the implementation, with JP doing the other half. Each task was time boxed and then usually JP would pull the code of the first team to finish which we walked through and refactored as a group exercise. Then we would all pull down the refactored code and continue on to the next exercise. This process was made really elegant by using the Git DVCS.
Doing test driven development (and perhaps more accurately, test driven design) was definitely a mental shift for me. JP's ability to really decompose a large problem into smaller problems using OO design principles and patterns was impressive. Whenever I thought he was done decomposing a problem he always seemed to demonstrate how a problem could be broken down further. The project really drove home the point that I have a lot to learn when it comes to OO design. I'd be willing to wager that most, if not all, of my classmates felt the same way. I agree with classmate Mike Murray's take that this shows a big weakness in our education system and industry. As an industry and as individuals, we can do a lot better.
The Real Takeaway
While a lot of time was spent writing code, I think the real value in the course came from JP's tips and tricks for being a better developer and person. I don't think anyone could walk away from the class being a master of OO design. Instead, I believe we are now equipped with practices for continuing our individual journeys of learning and improvement.
Some of the biggest tips I learned from JP include:
Set measurable and specific personal and professional goals. I think a lot of us know this, but how many of us actually do it?
Master your tools and automate as much as possible. Using tools like Resharper and AutoHotkey JP is truly a master of automation. I could probably count on my fingers how many times he used the mouse during the week. I am now much more cognizant of things that are slowing me down and am focusing more effort on removing the friction.
Dedicate time to continuous skills development. JP's suggestion is to do a 20 minute Code Kata first thing every day, focusing on a skill or tool that you want to learn.
Stop worrying about how your skills compare with others. You only need to be better than yourself. Work each day to be a better developer than you were the day before.
Learn a shell and an editor. I've added learning VIM and PowerShell to my learning plan.
Stop fretting about work-life balance and instead focus on what you're doing right now. Work when you're at work. If you can be better focused at work, you'll be better able to leave work behind and be present for your family. JP suggested TimeSnapper for monitoring your productivity. I'm evaluating RescueTime to achieve similar results.
The Final Analysis
Would I recommend attending the Develop With Passion course? Absolutely, but as JP said, be prepared to leave your ego at the door.
As I stated on the first day of the course, my goal was to rediscover my passion for software development. Did I walk away from the course having met my goal? Not exactly, but I think that's okay. The passion has to come from within, and I think the course laid a foundation for achieving that through continuous learning and self-improvement. Over time I think that is how you kindle the passion from within. And, ultimately, that's more valuable.