It’s been almost two weeks since the Sydney edition of Nothin’ but .NET finished. I’ve blogged my thoughts from each day of the course, but the time since the course has given me a chance to reflect on the whole event and has provided me with some much needed perspective. Please excuse me while I rant, but I need to get this off my chest.
A brave new world
By far the most important, exciting, daunting, confronting and demoralising thing that I found out from the course is that I know nothing about what Object Oriented design is really about. I know a couple of design patterns, SOLID, a bit of GRASP, and OO techniques like polymorphism and inheritance, but I’ve never put it all together in the way JP demonstrated in class.
The average size of each class was around 20 lines of code, including noise like whitespace, braces on new lines, namespace declarations etc. Each class had only one responsibility which was concisely implemented and easy to understand. This made testing really pleasant – there was no time spent fighting the design, it all just fell into place. And this wasn’t just for stuff that JP had done before, this kind of design emerged no matter what we threw at him.
My first reaction was, somewhat embarrassingly, a feeling of complete and utter incompetence. I’ve been doing OO programming professionally for a decade or so, and all that time I’ve been doing it wrong! This was quickly followed up by a feeling of demoralisation: now that I’d seen what OO design is meant to look like, I still couldn’t pick up the skill to do it myself.
But somewhere behind my fairly pathetic self deprecation I was excited. This was amazing! This was what I’d been desperately trying to work out for myself for years, and it was using all the tools I already knew about!
The best way I can describe it is with a classic DaveSquared contrived analogy (TM). Say you’ve spent the entirety of your life in one house. Never been outside. You get by ok, but you’ve always felt that you were missing something. So you’ve kept tweaking the rooms, repainting the walls, rearranging the furniture. Then one day someone comes along, opens the front door and shows you this entire other world you never knew existed. While the basic laws of physics work the same between your house and this new world, it’s full of all these complicated things that fit together in ways you can’t even begin to comprehend: people, cars, trains, people, planes, shops, people, towns, countries, commerce, politics, laws, education, planets, galaxies, quantum mechanics, twitter etc. It’s confronting, it’s daunting, and you feel like a complete idiot for never noticing it before. But it is also brimming with exciting opportunities.
Being shown that this other world of OO design existed was invaluable, but I still had no idea how to actually work with it. I knew the basic values and concepts, and could understand JP’s explanations, but I just couldn’t apply it all when it came time to code.
Initially this was a huge source of disappointment for me. My expectation from the course was that I would walk out of it a better developer. But come the end of the final day I found I couldn’t do a single thing any better than when I had walked in. It seemed all I was left with was a few bits of knowledge I couldn’t use, and the feeling that I was a much worse developer than I initially thought (and, as people who know me can probably confirm, this is coming off a fairly low opinion of myself already! Quite an achievement!). This is quite a realisation to face up to when you’ve spent around 80 hours with a top notch developer and your company has shelled out a huge amount of money for the privilege.
Part of the reason for this was that JP, as he pointed out several times during the week, is a developer, not a teacher. He simply demonstrates this awesome stuff, and answers any questions you can throw at him. It’s kind of up to the attendees to extract as much from the week as they can. But demonstrations alone (IMO) don’t really help build you into a better developer. That’s sort of left up to you. Another major contributing factor was that I was probably well out of my depth in terms of my existing knowledge.
But I think the most important factor was a matter of misaligned expectations. I don’t think I was really meant to come out of the course a better developer. I was meant to be pointed in a direction, given some tips as preparation for my journey, then sent off on my way to become a better developer.
Since the course ended I’ve had a number of surprises. First up was just how much stuff I managed to learn during the course, which I only realised as I worked through posting summaries of each day (which incidentally is the reason I blog – it helps me learn stuff and collect my thoughts :)). Sure, I couldn’t figure out how to apply much of it, but the sheer amount of really important revelations I got was amazing.
The second surprise took me completely off guard. One week after the course, after the sleep deprivation and system shock were beginning to wear off, I started on a new bit of code at work. And I started writing tests, top-down. And I could divide the responsibilities fairly nicely. The abstractions weren’t perfect, but the design was neat. The classes were small. It all just started to flow. All the stuff I failed at during the course had started to fall into place. I could apply some of this stuff! A colleague of mine who had also been on the course started pairing with me, and he started churning out some awesome code. We started talking about the design in terms of the stuff we had learnt, and it was making sense to us.
Now this was just a small win, but a win nonetheless. I know I’m going to keep struggling with this, but less than two weeks after the course I felt I had started to make some progress – a single, small step – on my journey to become a better developer.
And it wasn’t until that point that I truly understood what JP was saying on Day 1 about competing with and comparing yourself to other developers. He was stressing that you shouldn’t look at a developer and think "I want to be able to do that!". By the time you can eventually do "that", the developer you admired has moved on to a better way of doing it. And even if you do overtake him or her, there will always be someone else to try and catch up to. If you look at it like this, then you’ll always be behind. What you do will never seem good enough. And that’s a fantastic way to sap all the joy out of coding. And let’s face it, the reason most of us are developers is because we love to code, so once you lose that you’re in trouble.
Instead, JP recommended trying to improve yourself just a little bit each day, and focus on enjoying coding. No comparisons, no competitions. The sum of all these little improvements over the years can be great, but more importantly the enjoyment and the satisfaction you get from continually improving can be life changing.
Now I’m probably one of the least competitive people you’re ever likely to meet, but the one thing I do compete mercilessly against is my own expectations for myself. When I felt like I was failing to perform in the course as I expected, that was rough. But now I can see that what JP was really getting at was that I shouldn’t expect to be able to do all the stuff he was showing us. I just needed to start the journey.
So my initial disappointment from the course has been turned around now. I was shown this amazing new world of OO design. It’s possible I could have stumbled across it myself I guess, but the course pointed out, in fairly dramatic fashion, a direction in which to head. I learnt some really important coding tips that can help me along the way. And, now the course is done, I’ve finally started my journey – and it feels awesome. :)