Ok, I will admit it: I am a software architecture junkie. I love thinking about it, and try to use it in every app I can. I am an avid fan of CQRS (more info here), and I try to use it as much as possible.
Next to this, I am also a very big fan of BDD; to me it feels like there is nothing that even comes close to the process of describing a problem domain using the example stories.
I spend a huge amount of time on reading as many relevant articles as possible, joining discussions in newsgroups, on blogs. This has provided me quite a broad knowledge about software approaches one should use. (Think SOLID, BDD. ...)
Ok, Stop Bragging Please, What is your Point Here?
A while ago, I got together with someone on a new idea (yes Geert, I am talking about you). We talked it through and started prototyping. So I set up a basic project, and built a CQRS architecture in order to get started, so we would have better scalable/testable/more maintainable code. In the mean time, the other person had already started prototyping, so I spent a few days converting his ADO code into a more appropriate model for CQRS, and converted everything.
I heard about the latest version of entity framework, which had a code-first approach, and since I had been using fluent-nhibernate in the past for view storage, I decided to go for the new player on the block. Unfortunately, the EF apparently did not support
Enum storage, so we had to adjust about 80% of the viewmodels.
After migrating everything, it seemed like the other person was implementing code in the wrong places. He has always been a DAL/ORM kind of person, so the whole CQRS thing was really confusing to him (which is completely normal; cqrs requires a different mindset than CRUD, and I did not take into account the rather steep learning process I had made in the past).
I can go on and on about this, but to cut a long story short, the project was temporarily postponed to an undefined later date...
I also quit another project like this because I lost interest in the project while building up the whole required architecture setup and a few basic screens.
So a lot of effort resulted in ... absolutely nothing.
Fast-Forward to a Few Months Later
As time progressed, I read even more about architecture, learned some new frameworks on the way, and tried out a few things from which most did not even get to a usable phase. My software hobby projects were all seeded quickly, but abandoned even more quickly.
Until I read an article on the blog of Matt Mullenweg. The one phrase that kept lingering around in my mind was this one:
if you’re not embarrassed when you ship your first version you waited too long.
Wow! That is a strong statement !! So I decided that my next project would respect this statement; I was just waiting for the perfect opportunity to come along.
And There It Was...
I discovered NancyFx, a .NET web framework loosely inspired by the ruby/sinatra approach, as well as Simple.Data, which one can compare to the ruby ActiveRecord approach. If there is one web platform that is known for its productivity, it has to be RubyOnRails. So I decided to give it a go, and merge the two in a new project.
As I was looking for an idea on an app to implement, @grumpydev told me he had been thinking about trying to implement something like NerdDinner.com, but maybe a bit more limited, and that I was free to try it.
So I Came Up with NerdBeers
After taking a few hurdles (cloning the NancyFx git repo, installing ruby, building, installing sqlce, building, installing F#, building, cloning the simple.data repo, building it, finding an SQLCE editor, finding a Migrator.Net that supported SQLCE 4.0 and building it), I started a basic web project, where I had an index screen showing all upcoming nerdbeers and the possibility to add a new one, and a details screen where one could edit a nerdbeer.
I ditched Migrator.Net, since it was making things too complicated at this phase of the project.
I published it at github, tweeted about it, and got some very enthusiastic responses from the creators as well as from the community, even including some people whom I consider to be impossible to reach...
As I published my sourcecode to github, I was thinking about my idle appharbor test account that I requested a few weeks before... Continuous deployment is required if one wants to approach lean development.... So I started hacking/reading/making stupid mistakes. Luckily the people from appharbor were there to help me, and pointed out what was wrong.
So after a few attempts and sleepless nights, I had a pretty useless app online, but it looked kind of cool due to the terseness of the code.
NerdBeers... The Story Continues
Since I got so many positive responses to an app which was basically an empty shell, but showed a lot of potential, I was motivated enough to start hacking together something usable. After trying out a few things, checking out the Nancy sourcecode and bothering @GrumpyDev, @TheCodeJunkie and @MarkRendle with all my noob questions, I finally got around to publishing something usable - albeit in a very limited way - .
It still looks ugly as hell, but I am a developer, not a designer. Strings are being pulled currently to help me out (=replace) the design.
For me, this approach was WAY OUT of my comfort zone, but apparently it does work... If I take out the time to build the libs and workaround the bugs, check the source, bothering people about it, I have published a usable app in about a day...
It still looks really ugly (both the design and the code), but it works in a very basic way. I also cut out every possible feature not needed (i.e. currently one does not even have a login), so I would be able to ship it fast. And I have to say it worked: the short cycles kept me productive/motivated, and the small featureset helped me to focus on what was really important. So I did ship something !!
As the libs for NancyFx and Simple.Data progress, we will get a very mature platform which will enable truly lean development.
You can see the demo application at http://NerdBeers.apphb.com.
For me this has been a valuable lesson, and from now on, I will try to respect these principles more and more... I hope you found this an interesting read, and if you have had a similar experience, do not hesitate to let me know...