The year 2010 draws to a close and the time for reflection has come. And by reflection I don’t mean the kind using Reflector.NET, that’s what we do during the other 51 weeks of the year :)
In case you for some weird reason are interested, here’s what I’ve been up to during the year.
While I didn’t have any new years resolution for 2010, during the summer I set a goal for my self to learn two new languages, Scala and Ruby, before the end of the year. Although I can only say that I got (at most) half way there as I studied quite a lot of Scala but almost no Ruby I’m still pretty happy with the outcome.
Studying Scala opened up a lot of new perspectives for me that I think that I can benefit from in my regular work with C# as well as when learning other languages, especially functional ones.
Especially learning more about functional programming in a language such as Scala that has a familiar syntax is something that I think can benefit me, and others, when trying to understand the relatively new functional features of C#.
It also gave me material for nine blog posts about the basics of Scala that I hope others can benefit from.
As for Ruby I never really got around to reading the book I bought about it, The Ruby Programming Language. But I still feel that I’ve gotten somewhat of a feel for the language as I’ve attended a few talks about Ruby and Rails development, heard a lot of podcasts talk about it and read The RSpec book. Hopefully I’ll find some time to dive deeper into Ruby during the next year.
I changed employer in February and so far I’ve been very happy with the switch to Valtech. There I’ve met many interesting co-workers that I feel I can learn a lot from and I also enjoy the fact that Valtech has a lot of initiatives for spreading knowledge, both within the company, from the company to the outside and from the outside into the company. One such example was Valtech .NET days where I enjoyed a half day workshop with Jimmy Nilsson about Domain Driven Design.
Projects – High traffic sites and expert consulting
I’ve been lucky to work on some really interesting projects during the year, including launching new versions of two of the most highly trafficked sites in Sweden and a public website and intranet for one of Sweden’s largest pharmacies. I’ve also broken some new ground for myself by doing some expert consulting in the form of a workshop about testing EPiServer sites for a Norwegian government agency and by giving architectural advice and reviews to a search engine provider.
Open source projects
While I launched a new open source project, EPiMVP, together with Mattias Johansson during the spring and minor new versions of Page Type Builder and EPiAbstractions I really feel that I haven’t given my existing open source commitments the attention that they deserve.
Part of the reason for this has been that I’ve been busy with work. Another reason has been that as Page Type Builder has gained widespread adoption in the EPiServer development community I’ve been keen to keep it stable and therefore been reluctant to make major changes to it. During a moment of boredom during Christmas eve I did a little survey and concluded that the top five sites that use Page Type Builder that I know of have 45 million page views per week together. That if anything is motivation to maintain a high level of quality in the project :-)
With that said I’ve begun planning for a new major version of Page Type Builder it with some pretty interesting features. More on that, and other open source plans that will probably mean a higher level of open source work for my part during 2011, in coming blog posts.
When I attended NDC 2009 last year it had a major impact on me and my career. It opened up a whole new world to me and awoke a hunger for knowledge in me that only seems to grow stronger for every day. So when I traveled to Oslo to attend this years NDC, NDC 2010 my expectations were sky high.
Not surprising I was a little disappointed. Not because NDC 2010 was bad in any way (except of course for the weird Norwegian food) but because my expectations was so high. Still, I’m very happy that I went (thanks Valtech for sending me) and I learnt quite a lot. What I appreciated the most though was the social aspects of this years NDC. Talking to, and sometime having dinner with, some of the most interesting people in the .NET development sphere was very inspiring, not to mention fun.
I was also fortunate to attend another major software development conference during the year, Øredev. As I was still chasing the high from NDC 2009 I was again a bit disappointed. But I guess it’s in the nature of life-changing events that you can only experience the same event once.
Anyhow, Øredev both brought some interesting new knowledge, new acquaintances and new inspiration. I especially enjoyed seeing people that I knew from the software web and software development scene in Stockholm there and I really hope to be able to attend again next year.
In parallel to attending a lot of talks at conferences and at Valtech I also gave a few presentations of my own during the year. The first was in March where I gave a talk about automated testing of EPiServer sites for a customer in Oslo. Later the same day I also gave an abbreviated version of the talk to the Norwegian EPiServer developers user group.
Later during that same month I also gave a talk about the SOLID principles, titled “How Uncle Bob changed my life” in Swedish, to the EPiServer developers user group in Stockholm.
Books and podcasts
I’ve been really bad at reading books during the year. I did manage to force myself to read Martin Fowler’s Refactoring from start to end though, which I consider to somewhat of an achievement as it isn’t exactly entertaining. However, I’m very glad that I did as it’s a very good book that I strongly recommend to anyone who cares about software craftsmanship.
I also managed to read Programming Scala in it’s entirety.
However, the book that had the biggest impact on me during 2010 was neither of those though but the newly released The RSpec Book which I stumbled upon looking for books about Behavior Driven Development. While the book is seemingly about RSpec and Cucumber, two frameworks for testing/executable specifications in Ruby it offers an excellent introduction to BDD in general as well as to agile software development on a scale that is close to the code.
I must admit that I haven’t finished the book yet as the chapters that deal with the intricate features of RSpec isn’t as exciting to me as the earlier ones dealing with BDD and software craftsmanship in general, but I still feel that I can wholeheartedly recommend the book. And if my recommendation doesn’t convince you to buy it you should check out the foreword by Uncle Bob available at the books homepage.
The year I “discovered” podcasts
While I read significantly less books during the past year than previous years I found myself listening to a lot more podcasts. In particular I listened to pretty much every single episode of Herding Code. I really enjoy its format, four passionate developers and often some guests discussing a topic related to software development, usually but not always with .NET. The show offers great alternatives to books or blog posts when it comes to “reading up” on a subject.
In particular, if you haven’t listened to them already, I’d like to recommend episode 42, Scott Bellware on BDD and Lean Development, episode 56, Markus Völter on Model-Driven Development, DSLs and Product Line Engineering and episode 51, Greg Young on Our Grand Failure - Thoughts on DDDD that I particularly enjoyed.
Lessons learned about testing
If I had to single out one area where I feel that I’ve progressed as a developer during the year I would say that it’s probably testing.
The value of unit tests
One thing that has become more and more clear to me during the year is that unit tests suck for quality assurance and that code coverage has nothing to do with software quality. With that said I still see great value in writing unit tests but only if it’s done to drive good design of the code. That is, unit tests to me is a tool whose main purpose is to ensure that our code follows good design principles such as the SOLID principles. And in order to do so the rules of TDD and testing a single unit at a time cannot be broken.
All to often though I see tests written in such a way that they force the production code to be more complex than it otherwise would have had to be. In my opinion, if you for instance find yourself using a Service Locator or even property injection in your production code in order to be able to write tests you should probably stop and preferably rethink your design or otherwise just scrap your tests and re-implement your code so that it’s less complex.
As for quality assurance I think a much better approach is to focus on integration/end-to-end tests. I will get back to this topic in future posts where I’ll talk about how I used to test the Page Type Builder project using unit level tests and how I’ve now shifted to using context/specification with MSpec to create end-to-end tests.
Frameworks should offer abstractions, not “testability”
Another lesson that I’ve learned during the year is that the word “testability” or describing a framework as hard to test is a pretty bad idea when trying to influence framework developers to make it easy to write unit tests for code that rely on their framework.
Often when I talk to framework developers and complain that their framework makes it hard for me to test my code they come back with a solution that involves setting some sort of flag telling the framework that it’s in test-mode. Alternatively they offer me the possibility to change what components are used internally in the framework. That’s not usually what I’m after though. Instead what I'm interested in is that there should be abstractions (interfaces or abstract base classes) for the various classes in a framework that my code would want to consume, or at least that methods are non-static and virtual. Thereby making it possible for me to replace which implementation is used through Inversion of Control/DI.
So from here on out I’ll try to remember to use words like abstractions and isolation instead of testability when that’s what I really mean.