Welcome to our continuing series of Code Project interviews in which we talk to developers about their backgrounds, projects, interests and pet peeves. In this installment we talk to Andreas Håkansson, creator of two popular open-source web development projects: Nancy and MefContrib.
Who are you?
My name is Andreas Håkansson and I live and work out of Sweden as a Senior Software Engineer. I work in the travel industry, developing e-commerce solutions for a wide range of brands that are controlled by my employer.
I have a huge passion for technology and developing software and I am also a big advocate of open-source software and that's what I spend most of my personal coding time on. I am a bit of a framework nerd and designing a framework is something I quite enjoy doing.
What projects have you worked on?
Professionally I work on a wide range of websites, both business-to-customer and business-to-business, for a wide range of brands in the travel industry. This work involves everything from back-end to front-end developments, all in a Windows environment using the .NET Framework and Visual Studio. Personally I spent much of my time working on my open-source projects (Nancy and MefContrib) using both the .NET Framework and Mono.
MefContrib is a collection of community developed extensions for the Managed Extensibility Framework. I started exploring MEF back when it was still in Preview 2 (I think) and pretty much spent too much time digging through the code and figuring out how to make it do stuff it wasn't built to do (like configuring your composition using things like XML, a fluent interface and whatever you wanted). I was fortune enough to become very good friends with Glenn Block, who at the time was a PM with the MEF team, and that enabled me to provide the team with a lot of feedback and annoying questions for all sorts of use cases.
Later on I was joined by Piotr Włodek as a core member of the team and right now MefContrib contains some very unique additions to MEF, such as (not all features listed):
-
Convention-based configuration
-
IoC container bridges that let MEF and your IoC container work together when composing your application
-
Custom catalogs such as a filterable catalog and, a very interesting one called InterceptingCatalog that enables you to do AOP-like things with MEF and also hijack the creation of parts using both Castle DynamicProxy and LinFu DynamicProxy
Nancy is my latest open-source endeavor I embarked on nearly a year ago. Nancy is a lightweight, low-ceremony framework for building HTTP-based services on .NET and Mono. The goal of the framework is to stay out of the way as much as possible and provide a super-duper-happy-path to all interactions.
The last year has been quite insane (in a good way) for the project. As soon as I had pushed out the first skeleton of the project to GitHub and written a blog post about it, it took of like a rocket. A lot of people immediately picked it up and played with it and the community was literally born the very next day.
The framework has been designed to run anywhere and out-of-the-box we support running on top of ASP.NET, WCF, self-hosting and OWIN, making it possible to run Nancy on both .NET and Mono (which in turn enables you to run it on other operating systems such as Linux and OS X). It's built to have a small core and then have a set of extensions that you bring in when you need to add capabilities. Good examples of such extensions are view engines and different forms of authentication (forms, basic and so on).
Since then Nancy has grown quite a lot with the help of the community and I was later joined by Steven Robbins (a.k.a @Grumpydev) as a core developer. Today Nancy is a very mature framework with support for all the major view engines, IoC containers, model binding, security, cookies, CoffeeScript, Sass, protobuf and the list goes on.
What is your development environment?
Nothing fancy at all. At the office I run a quad-CPU PC with 8GB of RAM and at home it's a dual-core machine (due for an upgrade soon) with 4GB of RAM and an SSD. Both machines runs on Windows 7 x64 with Visual Studio 2010 and .NET Framework 4.0.
I have the good fortune to work at a place that doesn't get stuck on using old framework version or Visual Studio releases. We upgrade to the latest bits as soon as possible once they've been released. I guess I am spoiled in such a way that I get to use the latest goodies in production code and don't have to use .NET Framework 2.0, with Visual Studio 2005 running on a Windows XP machine.
Professionally I do both C# and VB.NET (legacy) programming on a daily basis, but when I am off the clock I prefer to use C# all the way. We also make good use of open-source frameworks at work, such as NHibernate, FakeItEasy (developed by my friend and colleague Patrik Hägne), Autofac and a bunch of others.
All of them? I like to try new things out which is both a curse and a blessing. I am a big fan of TDD and I'm currently exploring NCrunch and Mighty Moose to reduce the ceremony and at the same time increase my efficiency with TDD.
I would definitely like to spend more time with Ruby and dig even deeper with JavaScript (there are some truly amazing things happening in the JavaScript community these days!). I would also like to find enough time to seriously invest time in learning both MonoDroid and MonoTouch. Come to think of it I would like to spend more time learning Objective-C as well. I know the basics but it's mostly based on reading and not practical experience.
What is your coding pet peeve?
Steven Robbins calls me the human StyleCop, for my obsession on code structure and consistency, so I guess that would have to be my number one coding pet peeve!
How did you get started programming?
It was my dad that taught me how to write code back in the day. When I was seven or eight he bought an Amiga 500 and a couple of years later I started getting interesting in the programming he was doing. Back then it was mostly done in a basic language called AMOS and later on I used other languages such as Blitz Basic (I loved that quazi-basic language!), Amiga E, C/C++ and a bunch of script like languages such as ARexx.
I was a latecomer to the PC scene. I stuck with the Amiga community for quite a long time, but when I made the transition over I started using VB, Pascal and Delphi (the latter two I only played around with and never did anything serious with). I eventually moved over to .NET and C# at the first public release of the .NET Framework.
I'd say the online community has, by far, had the greatest impact and influence on my coding. Twitter has enabled me to connect with an army of developers, all across the globe, many of them either experts in their field or the authors of the things that I am using.
Many of the people that I have connected with on Twitter have later on been extended with both e-mail, instant messaging and Skype connections. The biggest problem is never who to talk to when you have a question, but to figure out if they are awake or sleeping because of the mixed time zones. A novel problem to have!
GitHub is the second online resource that has had a huge impact for me. They really do bring social coding to a new level and it continues to be an awesome resource for the open-source work I am involved with.
I am pretty sure you're doing yourself a disservice, as a programmer, if you do not use social networking to make connections in the dev community.
What advice would you offer to an up-and-coming programmer?
That's easy! Strive to become a polyglot programmer. It's really healthy to get exposed to other paradigms and methodologies. No matter what language you decide to start with, once you feel comfortable with it you should start looking at other languages.
There is no need to master them all, but reading about them and playing around with them for a bit. They will have an influence on how you write code on a daily basis and will ultimately make you a better developer and write better code in your language of choice.