Friday, 8 January 2010

Time for yet another cathartic post (troll like rant) that few will read and lets me vent my frustrations at this whole, crazy mixed up open source world of .NET. Maybe this can spark some debate or maybe it cannot. Quite probably it just lets me throw some mud at the wall and see what sticks.

Let me get to the meat of the problem straight away and declare the following confrontational statement:

We need another MVC framework like we need a hole in the head.

After my work with horn, I have a fairly good idea about the number of IOC (castle Windsor, StructureMap, Autofac, Ninject) frameworks, mocking frameworks (Moq, Rhino Mocks, Moles) and build engines (Nant, PSake, Phantom) that .NET has. I know because I have wrestled with most, not to mention the countless ways there are to get your source control from the remote SCM and build it. Each .NET OSS project lives in a vacuum with total disregard or care about the other OSS projects it carries as dependencies in its shared lib folder.

It now seems that we need several different MVC frameworks, Monorail, ASP.NET MVC, VICI MVC, Openrasta et al. Of course each one is better than the rest. Each one expresses separation of concerns more than the others. Each one adheres to the now infamous SOLID principals more so than the rest. Please, give me an ounce of credit; this is just another lazy way for you to fan your programming feathers by copying an existing paradigm and putting your own slant on it. Any developer will testify that if we write something once, discard it and start again on the same problem, you will get a better solution. This is especially true if you have the source code from your original attempt or somebody else’s attempt to later chastise. Then after we have put our own slant on it we smugly declare how our new code has:

Better Separation of Concerns

Is more true to SOLID

1000 times More testable than the rest

100000x more mockable because we put an interface round x

We use compositon over inheritance more. Big Yawn to this one

Looser coupling by a magnitude of 400000xyz (xyz is the unit for measuring loose coupling don’t you know)

If I had the inclination, I would love to draw up a comparison table on each category (IoC, mocking etc.) to see just how different each one is.

What exactly does all this choice give us? Or for FUBUMVC I ask the question:

Why the hell should I care? How is the front controller pattern going to make me more productive? If so how?

It seems we have a 100 different can openers each with their own ornate carving on the handle.

What about if we had a common project folder like we have in rails? Then convention over configuration is much easier because we can start guaranteeing where things are. This will never happen while we have the arrogance and snobbery that abounds in .NET OSS.

It will never happen in .NET while these OSS snobs rip up old ideas and replace them with more of the same but hey, it is 10 times more SOLID than the other guy and soooooooooo much more testable.

My wish for .NET is that we have rails in .NET. One only has to look at the number of generators and rake commands that are available in a rails directory to know that if everyone pushes in the same direction then we can actually build something of use. Again this will never happen. This could be possible with Ironruby but it will never get buy in from these OSS craftsmen snobs.

It will never happen because .NET OSS is steeped in arrogance and exhibits a holier than thou attitude I find tedious.

I will further ask this question:

Where is the innovation?

What gives me the right to ask this or for that matter write this post? I would say that with horn we at least tried to do something game changing and provide a common way for people to get their open source binaries and thus smooth adoption. We faced multiple hurdles with the multiple ways that .NET OSS chooses to bury it’s head in the sand and ignore the rest of the OSS landscape. We had to battle with git, svn, nant, msbuild, psake et al.

When we started developing horn, I read blog posts from people who stated that we were wrong and they were going to create a gem like experience for .NET. There was ngems, rocks and other failed attempts. Where are they now? How far did you get? Not very is the answer. I persevered with horn because it was an extremely difficult problem to solve. At the time I and others were looking for an outlet to do some coding that was and is more challenging than our day jobs. We chose something extremely difficult and did not go down the same old tired route of an IOC container, a mocking framework or God help me, another web MVC framework that is not too dissimilar than the rest.

.NET is a dead platform. The vast majority of .NET shops have a laughable approach to development. This leaves us with ALT.NET which has turned into a bunch of arrogant prima donnas bleating about their craftsmanship and how their approach is better than the rest.

This constant division and lack of new ideas is boring in the extreme.

You can stay in your boring little vacuum and have your sycophantic twitter followers stroke your enlarged ego all you want. I for one do not buy into it.

One only has to watch the pandering and kowtowing attitude to anybody in the same virtual vicinity of Ayende, to feel nauseous. You know who you are and please get a life. Don’t be a sheep.

35 comments:

"Arrogant prima donnas bleating about... how their approach is better than the rest." Ironic in the context of your post.

You created your framework because you were "looking for an outlet... more challenging than our day jobs". They created theirs "For us, by us," to solve a real problem on a real project. I much prefer libraries created for the second reason than the first.

Whether or not the .NET community needs another MVC framework, they did. It was very kind of them to then offer up FubuMVC for the benefit of the community. It's not like anyone is forcing us to use it, and they have as much right to find their outlets as you do.

About the innovation. It's the small things that matter. You won't appreciate how much difference they can make until you try using many frameworks solving the same problem (IoC containers or MVC frameworks) and see for yourself how drastic impact theirs small design decisions have at your workflow.

About innovation, having multipe frameworks exploring different approaches is innovation. If one proves better than the others, others will adapt it, and move on. There's no revolution - it's evolution, and I'm happy FUBU came to be.

Welcome to OSS development. This is not symptomatic of the .Net community, but every OSS community (or almost). Take Ruby, while Rails is the de-facto web framework there are still plenty of alternatives out there, and more coming every day*.

You'll never get away from developers and communities wanting to innovate, even if they're only micro innovations, because people have different pain thresholds. What's important to you isn't important to me, and vice-versa.

The problem isn't the new projects that crop up. Three things happen with new projects, as far as I'm concerned:

1. They succeed and we all live happily ever after2. They fail and disappear (which hurts some devs, but adoption probably wasn't huge anyway)3. The fail but do something right which other projects take and improve themselves

The issue, and this is symptomatic of .Net, is that the market for these tools is almost exclusively these "alt" developers. The mainstream .Net community has no interest in anything beyond Webforms (the resistance to MVC is a nice illustration of that). The effect of this is that the feedback-cycle takes a lot longer than in other more collective communities (ruby, again). Projects quickly live or die in Ruby, because the community is generally like-minded. .Net on the other hand, we spend so much time bickering over whether we should be unit testing to actually spend time on the cycle of picking a framework and letting the others fade away; by the time those people manage to get into testing, if ever, they transfer their "I don't want to test" dogmatism over to their favourite framework and defend it to the death.

The problem isn't the multitude of tools, it's the developers fervently defending their current favourite.

* Cramp, for example, was announced on the 7th. http://m.onkey.org/2010/1/7/introducing-crampLemon on the 5th. http://proutils.github.com/lemon/Nanotest on the 9/12 http://github.com/mynyml/nanotest

Firstly, a wish to have Rails in .NET. I'm still tons more productive in Rails than ASP.NET XYZ.

I also agree that the .NET community is hugely fragmented in skill levels and has a smaller common base of agreement. And that the .NET OSS community is immature compared to other communities.

Many career developers won't have taken the time to find and learn from the .NET community champions. In Ruby, projects and docs are fragmented (no MSDN to rule-them-all). You need to start Googling from the get-go, which means you find great people/practices/tools early on.

I disagree that appearance of FubuMVC is a bad thing. The opportunity excites me - what if they get it right? What if they innovate?

Like James hints at, OS projects exist in a survival-of-the-fittest ecosystem. They also give people choice.

Ruby has at least 7 libraries for creating your own Test Fixture Data, if you look at the chart at the bottom of this page, it's clear that there are two clear "winners".

http://www.ruby-toolbox.com/categories/rails_fixture_replacement.html

The community created choices for itself, and now we see the community picked what they liked. Choice is good I think.

I still totally back your plea for innovation. The Ruby community is swamped with it. .NET has a LOT too, but for some reason it doesn't seem to *invite* it.

It is possible horn my have sullied my opinion of all this choice :-). Having to deal with all this "choice" was highly frustrating.

What do we gain from all this choice at the micro level is a question I would like answered?

Developers will always be drawn to the new and shinny and is encouraging developers to pick up a framework that is not too disimilar from the existing just muddies the water in my opinion and distracts from progress.

I would love to see things like a common project structure and proper convention over configuration. I would love to have the generators and the full list of rake commands available in rails. Even in Java they have Maven. I also want the CLR libraries at my disposal.

Ironruby offers this interesting mixture of both worlds that I am less convinced will ever happen.

@James You are absoulutely correct, the amount of .NET devs using OSS is a minimum and in the grand scheme of .NET we are probably pissing in the wind anyway.

@Tobin - I pray for that rails day also. My point about MVC is even if they get it right, it would take eons to get to the productivity gains offered by rails.

We wrote FubuMVC to save us many hours of wasted time trying to overcome significant design deficiencies in ASP.NET MVC. We have saved hundreds of hours and thousands of lines of code that would've been wasted trying to work satisfy all the coupling and dependency requirements of controllers and views in ASP.NET MVC.

It was a simple no brainer. FubuMVC, for us, saves LOTS of time on a day-to-day basis and also strategically because it's significantly easier to add large swaths of functionality, test it, and not have the framework get in our way - ever.

So, there is lots of innovation in FubuMVC, just not use strides forward.

If there is any criticism that should be made, it should be made of the ASP.NET MVC team and how they squandered a perfect opportunity to build a really great MVC framework, and instead were too focused on inheritance-based design and defensive coding that all but prevents you from doing any serious extensibility, not to mention prevents ease of testing.

In the end, Fubu translated to thousands of dollars in savings for us. If that's not a good enough reason, I'm not sure what is.

I've spent a lot of time in Linux and one very common compliant is "why are there so many text editors? Why not pick one?" But people work in different ways and have different problems to solve. The problem isn't choice, it's filtering. How do I know what is the right solution for my project? Does this framework work with NHibernate? Does it support Silverlight?

Choice is good. If a platform has one web framework, it's a dead platform because no one is using it to solve problems.

Horn is difficult. It's there to solve a very difficult problem. Standardizing on one vcs or one web framework doesn't make it easier.

If we didn't need a new framework, no one would write one. For people who want a homogeneous "good enough" solution, there's msdn, for people that want best of breed, who want a reward of an easier life for a bit of research and a bit of tweaking, there's the rest.

Get your panties out of a bunch. Diversity is good. I've been working on the original IoC tool in .Net for 6+ years and watched about a half dozen other tools come up since then -- but you know what? All of the newer tools, even Unity here and there, had new ideas for features, design, and usability that advanced the state of the art of those things. You can't really say with a straight face that we have loads of choices in .Net for anything besides IoC containers.

If you'd stop being such a cantankerous asshole for a minute you could go read my original Fubu Reboot post where I made a big deal out of describing Fubu as the "Long Tail" choice, as in a tool that's optimized for the particular way we work that a few other people will really like and most people won't at all?

Last thing just to piss you off, I'm glad that we at least have Horn, but I think we'd be better off with a gems-like solution as well. What are you really doing besides recreating Maven here Paul? You know, the Maven that spawns a lot of angry rants in the Java world?

@chad the thousand of dollars estimate is hard to believe. What do you say to people who write their own ORMs? Do they save money also?

@Zac All my new development is in rails. Unfortunately most of my day work is still in .NET. I still like the sound of the possibilites of ironruby. Probably will never happen.

@craig choice is good but it is getting silly now. We have too much choice and it is causing confusion.

@Jeremy I hope you do provide us with a gems-like solution but I am fairly sure noone will. It is pretty damn difficult when you are dealing with binaries though. As for Maven, Horn is based on Portage. I wish horn had the traction or interest to make anyone angry like you say happens in Java. Horn has been met with indifference or no interest. The ironic thing is, I just received a pull request for someone adding horn descriptors for StructureMap :-). They will be on the hornget website by Monday.

Paul, you sound frustrated. You've created a project, hopefully to solve a problem you have, and can't get people to help you work on it. Is it still solving your problem? If so, what's the fuss?

If, however, you created an open source project to fill a perceived hole in the .NET OSS community, why did you do it? If you did it for fun and to learn, great! I hope you learned some new things, lost a lot of sleep, and pushed yourself into new areas that you could never have gotten into working a 9-5 gig on a corporate development team. If you did it to become known as "the guy that created horn," well there are a lot of "guys that created XXX" where you won't find that XXX has been updated/used in years and is gathering dust on some hard drive in the cloud.

With Horn, you:

Created a solution for a very small minority (.NET developers that use OSS) Created it using a technology that even fewer people use (Boo) Created it using tools that even fewer .NET developers use (Git)

That's a pretty narrow segment to find a solid group of contributors. You say you get pull requests for people adding other OSS projects and that makes sense -- others are trying to share in the experience you are trying to bring about with their favorite projects. But far more people are going to try out a free project to see if it fits than are going to submit patches to help further the development.

Also, if you participate in a community, you are going to have people that agree with you and people who don't. If you create a project and make it open source, don't think people are just going to show up and start helping you build it. Others with like minds, similar goals and aligned objectives may come across that project and find it solves their problem. If they don't, well, as long as it is still solving your problem why the big rant on other people doing the same thing?

FubuMVC targets a very small niche of the community, but Dovetail has been a huge contributor (and user) of open source projects for quite some time -- with measured commercial success. Almost everything they build that isn't IP is in some open source project somewhere. Show me other companies that encourage that level of participation in the community that are private, for-profit organizations. Creating an open source project doesn't mean you expect people to use it, it just means you like doing things out in the open, available for review and comments by peers, and with the ultimate goal of building the best software possible.

@Chris That is a very well measured response you have made. The goal of horn became a personal challenge in the end and I never had any personal goals apart from getting the damn thing working. Your points about it being appealing to few, using boo, git etc. are indeed very accurate. But even before horn and after using tools like rake which is intregal in the whole dev process and not just used for building in rails it became evident that there was a much better way to develop. I think my frustrations are that my income still comes off the back of .NET :-). I am developing MicroISV in rails and I hope to leave .NET behind ASAP if the products ever start selling :-). Until then I'll probably still get frustrated at the .NET platform and the lack of cohesion or need for cohesion in .NET OSS.

@Jeremy Thank your coworkerfor me and I hope this blog post puts nobody off using horn.

The only valid point you made is that .NET OSS people can be somewhat obnoxious, but I don't see how that relates to complaining that some of these people are working on a open source project. Who is "we" and why do you get to decide what "we need" and what kinds of projects we should work on, and how we should seek innovation for the sake of innovation because good software design principles are not "innovative"?

"This constant division and lack of new ideas is boring in the extreme."

I will attempt to use my mind powers to coerce the universe into producing a more interesting situation.

I'm not sure you're looking for a dialog on this, but to put things in context regarding OpenRasta...

It was developed before MVC existed, and it solves problems that others (including RoR) don't solve. And it's not even an MVC framework, it's a resource-oriented http framework.

And the reason people use OR is not in any of the points you have highlighted. They use it because it's easy and doesn't get in your way. Go ask users see what they think.

Having diversity is a good thing.

What I can understand is the frustration caused by multiple projects "calling for volunteers", but truth to be told, there's nothing you can do about it, and there won't be massive amounts of people suddenly contributing to a project.

Worse than that, it's the OSS model to see many projects trying to solve the same thing, with only few surviving. The ones that will survive are few and far, and will only be established after the other ones have died.

All in all, I'm not sure why OR is being added to the list, having pre-existed all those frameworks you talk about. Point in case, I will only stop working on OR when I've achieved the next couple of steps needed to have a great dev experience, and if that makes me an arrogant prima donna, so be it.

@Sebastien I wish I had not included OR in the post as it is significantly different than the rest and does offer a different approach as a web development framework.

This is not a dig at MVC frameworks per se but more a dig at the spawning of too many similar projects that are vaguely different and I question what we actually gain from all this "choice" at the Micro level. As I stated in the post, we are awash with clone paradigms.

I have been developing more and more in RoR and things like a dedicated project structure, generators, rake commands and ruby gems have really knocked me sideways with what can be done. If we keep on exponentially splitting off at every new paradigm juncture then all we do end up with is a multitude of choice that everyone seems to think is what we are after.

Fubumvc will attract developers because it is new and shiny and because of some of the names attached. To me the difference comes from the usual statements of using a slightly different controller pattern (front controller), more testble and uses composition over inheritance. Hardly game changing but it will get attention because of the names attached.

I have been using ASP.NET MVC for a couple of years now and I do not find it perfect, I am able to write tests against the framework. I am happy enough.

As for the calling for volunteers, every OSS project is maintained by a few dedicated contributors. Most projects have between 1 and 3 dedicated. Nhiberate and Castle and projects of this size and are exceptions to the rule. Even with these projects the number of users per contributor is large.

It wouldn't hurt to do a little more research on the subject before accusing some projects of borrowing from earlier projects. Strictly speaking, ASP.NET MVC "stole" everything from MonoRail and RoR. And the MVC pattern wasn't invented by the MonoRail or RoR guys either.

Personally, I think there's still too little competition in the area of alternative .NET web frameworks. ASP.NET Web Forms sucks big time, everyone who has ever worked on a decent size web project knows that. It's only logical that there are alternatives popping up (besides the "official" ASP.NET MVC framework, which was actually the last one to appear. The other projects have been along much longer).

And finally, don't compare the Ruby world to the .NET world. It's a different universe.

@Phillipe Do you not think that people are wasting too much time in doing similar "alternative projects"? Look how many IoC, mocking and testing frameworks we have. Look how many different build tools we have (Nant, psake, phantom etc.). Seems like a bit of a waste to me.

Sad reality is that most people would rather start their own project than contribute to an existing one.

Most do that either for kudos, seeing themselves in hall of fame in few months' time.Other's are just to lazy to step over the threshold of quality established projects require.Others yet are plain to lazy to enter existing codebase and prefer doing things 'their way' from the scratch.

Yes, a standardized project structure is good. I think as more "full-stack" OSS projects (ala SharpArchitecture) we'll coalesce over a few.

Yes, the vastness of IoC choice is odd. But I think we can excuse the IoC crowd since these can be pretty fun to write and each does seem to come to the table with some new idea that gets assimilated by the others.

Nant vs. phantom vs. psake vs. irake - These are pretty darn different in a very basic way.

MVC Frameworks - those that I know of (Fubu, ASP MVC, Monorail) have solid historical reasons for why they are the way they are.

As for touting "more SOLID" or "more testable" I think you're ranting. It can be annoying, but is a tool author not allowed to tout the perceived merits of his own tool? What exactly are you saying?

What I am saying is that each new version of a similar tool tends to say things like "it is more testable" etc. than it's predecessor. My point is that this is not really an excuse to rewrite a framework and backing an existing one would be a better option.

Your rant about OSS in .Net seems totally counter to the goal of your Horn project. Which is all about making it easier to use .Net OSS projects.

You pound your Horn customers over the head saying we all suck and then wonder why no one is contributing descriptors to your horn effort?

Are you in this horn effort thing for the long haul? You clearly seem uncomfortable with the state of the community and feel the need to throw mud rather than set down honey as bait.

Mud: Writing a long blog post bitching about a new OSS startup written by the same people that were asking probing questions on Twitter about "Why Horn."

Honey: Why don't you work to setup up a Horn Descriptor Party. Get a bunch of nerds together to create Horn descriptors for all our favorite projects.

Your effort with horn is commendable and surely difficult. Keep it up. But let's have less posts taking shots at potential contributors and more community help focused on helping us help you make Horn awesome.

@kevM I think you need to distinguish the difference between my opinion and horn the OSS prjoect. Both completely different animals. This is very much MY opinion and nothing to do with the merits of horn. I only mentioned horn (and I did think twice before doing so) in order to prove that I had some knowledge of .NET OSS.

So don't confuse my blogging persona with the OSS project you backed with a contribution. Horn's cause is just and will remain so. This blog post is a passing rambling of a disgruntled nobody.

I will say one thing though for voicing my opinion in this way though, "if we disagree with something should we not say so?".

Or are blogs only for congratulations and agrrement?

Don't forget that some of the authors of FUBUMVC were the most viciferous voices behind the EF vote of no confidence.

Take a look at my open-source routing framework for .NET: JuniorRoute.

http://projects.nathanalden.com/JuniorRoute

I believe JuniorRoute is superior to all other .NET MVC frameworks in several key areas. I encourage those of you interested in alternatives to ASP.NET MVC's heavyweight design to take a look at JuniorRoute. I actively maintain it and it has great documentation and even Visual Studio project templates.