A little background...
I should have written about the last large scale project that I worked on. I should have written about the things I had to tinker with in IIS to get that one thing running. I should have had an entry about working with AWS and .NET for migrating large amounts of content to S3, or at least posted some code samples to save others some time in their next task. An entry about changing build server environments? An article about approaches for converting large sites from WebForms to MVC? Maybe even just a tidbit from Code Camp?
But none of those things happened. And do you want to know why? (probably not, but I am going to tell you anyways)
It was entirely just because I was too caught up with the notion that I couldn't have a blog unless I wrote the framework myself. Many years ago, I had the strong belief that if I wanted to apply for a programming job, an online resume should be mandatory. My thinking was that resume should be built entirely by myself as well.
I need to build my own light saber...
Any available position I was interested in back then, would require the basic commonalities all web developers know and love: connecting to a data source and doing CRUD stuff, building pages and spitting out angle brackets, designing layouts, and organizing your code into a reusable, sane structure, etc. So, I rolled my own in classic ASP and SQL Server 2000 and finally stopped doing anything with it a long time ago after I started to work in .NET 1.1 in 2004. It was terrible and I hate looking at it now, but I can look at that code and see how much I've grown and at least said...I built my blog from scratch.
But, then I realized I would have to build a new engine from scratch in .NET and well, like John Lennon said, "Life is what happens to you while you're busy making other plans". I kept starting and never returning to building my new blog engine. The 2.0 version of .NET came out and then 3.0 and the 3.5 and eventually MVC and the internal struggle kept waging inside of me, "I need a site launched...but I can't find the time to write my own quality engine". I was too busy coding for other people.
Rob Conery would put later summarize my feelings in a single Tweet: "Luke had to build his own lightsaber – geeks should have to build their own blogs. And that should be their resume." Damn. Alright, let's figure out how to do just that.
Yeah, well, Luke didn't really build a "new release" of his saber each year did he?
I remembered back when I built that first old site, and HOW MUCH TIME I spent on simple, common data related tasks and a commenting systems, and everything else that goes with a small publishing framework. I realized that many sites I had been following for years were frequently using the same tools. They might have built their own sabers, but they picked-up parts from the same light saber hardware store. So, instead of designing a saber from scratch, I decided to figure out what parts I wanted in mine. Here was the list of parts that I arrived at:
I wanted my site to have a regular DB back-end (preferably SQL Server). I love many NoSQL projects and have used Redis and Membase for many caching scenarios, but I still love me a solid, reliable RDBMS for most stuff.
NHibernate. Period. I like and have used a lot of different ORMs out there, but the maturity and size of NHibernate's community really makes it an easy choice in my book. Plus, Ayende is a total badass.
NUnit for unit testing. Again, there are a ton of unit testing suites out there, I just happen to like NUnit just fine. It appears in so many applications and it makes sharing code pretty easy, since most devs I know or work with use it already.
MVC 3. There really is no reason at this point to torture myself (after years of enduring torture) and do something from scratch in WebForms. Furthermore, I want to use the Razor ViewEngine. The day Razor was released and I saw the syntax, I instantly loved it.
jQuery, regular CSS, and normal HTML for mark-up. This is kind of out of the box with the MVC 3 approach, of course, but I thought it was worth mentioning. No special WebForm like "Theming" other than what you can roll with MVC.
Ninject. It's a simple light weight IoC container and I had experience with Windsor once. I think I might have been tipsy or Windsor was. One of us made a bad pass though.
Disqus. The sites that I have seen which use this for their commenting handle a lot of issues with content comments in a uniform way and I really like their API.
Ok, now that I have my list together, I decide to search around on the Web and see who else is writing their own system which meets my criteria.
Oh. Wow. There's a ton of great shit. Maybe...I am reinventing the wheel here and need to re-consider this "Luke built his own lightsaber thing".
Maybe it's more like the kitchen sink (oh noes, here comes some mixing of metaphors)...
Phil Haack knows a thing or two about frameworks. Outside of being a senior program manager at Microsoft and the MVC team in particular, he was a lead on SubText and his blog engine is used by people all over the world (I *think* even MySpace China at one point). Anyways, he once blogged about writing your own engine from scratch and he mentions, "Why reinvent the sink, when the sink is there for the taking?" Basically, you can build a new sink if you really want to, but you should probably look to previously designed sinks first. I was aware of DasBlog, BlogEngine.Net, and SubText, but I knew I didn't want anything WebForms based. The search was on!
Sink 1: Orchard
That is what I decided to do and began to search the web for projects that were using the parts I decided I wanted. I first examined Orchard, which is pretty damn amazing. The Orchard team and contributing members read like a dream team of developers. I'm pretty sure that if "Armageddon" was re-done and instead of having to drill into an asteroid they had to build a content management system, Bertrand Le Roy would have replaced Bruce Willis. But as I started to run through it, I started to feel like it was an overkill for what I was trying to do. As I was running through all of the code it felt more like an example of how to use every design pattern in the book and while it appeared it would have worked great if I wanted to work inside of the confines of Orchard; make large changes would lead to undesired instability in my case.
Sink 2: Umbraco
I will have more to write about Umbraco later, it's a pretty effing sweet CMS platform, but right away I felt similar to Orchard. This was more than just a sink: it was a new kitchen. So, I decided to dial down the size of what I was looking for and refine my search.
Sink 3: FunnelWeb
After reading a response to a question at StackOverflow, I found myself at the FunnelWeb project site. The landing page pretty much said exactly what I wanted to hear: "This is a simple set of tools and we don't want our Framework to get in the way of what you are trying to do." After downloading the bits and running through the project, it became evident I had found my sink.
However, it also became clear that I didn't even need to build a new sink and model it after this one. The code was so light weight and extensible, that I could just start working from this mold and build whatever I wanted to with it.
Lightsaber, sink, whatever. I'm happy with the choice...
In the end, FunnelWeb uses every part that I had wanted in my own lightsaber. Well, almost. They used AutoFac instead of Ninject and a Markdown module instead of Disqus, but realistically I can switch all of that out if I feel like it and it should never have been a deal breaker for me. What is even cooler is that FunnelWeb comes out of the box using Fluent NHibernate, which I was interested in but I had not worked with yet. So, uh, yeah, bonus I guess?
If you are looking for a Blog Engine that is simple to use and lets you start extending the code base right away, I really can't suggest FunnelWeb more highly.
For lightsabers or sinks.