Northwind Starter Kit ReviewConclusion
This is a review of the Northwind Starter Kit project, this review revision 94815 from Dec 18 2011.
A while ago I said:
Seriously?! 22(!) projects to do a sample application using Northwind?
And people took me up to task about it. The criticism was mostly focused on two parts:
- I didn’t get that the project wasn’t about Northwind, but about being a sample app for architectural design patterns.
- I couldn’t actually decide that a project was bad simply by looking at the project structure and some minor code browsing.
I am sad to say that after taking a detailed look at the code, I am even more firmly back at my original conclusion. I started to do a review of the UI code, but there really is no real need to do so.
The entire project, as I said in the beginning, is supposed to be a sample application for Northwind. Northwind is a CRUD application. Well, not exactly, it is supposed to be an example of an Online Store, which is something much bigger than just Northwind. But it isn’t.
Say what you will, the Northwind Starter Kit is a CRUD application. It does exactly that, and nothing else. It does so in an incredibly complicated fashion, mind, but that is what it does.
Well, it doesn’t do updates, or deletes, or creates. So it is just an R application (I certainly consider the codebase to be R rated, not for impressionable developers).
If you want to have a sample application to show off architectural ideas, make sure that the application can actually, you know, show them. The only thing that NSK does is loading stuff from the database, try as I might, I found no real piece of business logic, no any reason why it is so complicated.
So, to the guys who commented on that, it isn’t a good project. If you like it, I am happy for you, there are also people who loves this guy:
Personally, I would call pest control.
More posts in "Northwind Starter Kit Review" series:
- (26 Jan 2012) Conclusion
- (24 Jan 2012) That CQRS thing
- (23 Jan 2012) It is all about the services
- (20 Jan 2012) From start to finishing–tracing a request
- (18 Jan 2012) If you won’t respect the database, there will be pain
- (16 Jan 2012) Refactoring to an actual read model
- (13 Jan 2012) Data Access review thoughts
- (12 Jan 2012) The parents have eaten sour grapes, and the children’s teeth are set on edge
- (11 Jan 2012) Data Access and the essence of needless work, Part II
- (10 Jan 2012) Data Access and the essence of needless work, Part I
Comments
Man, sometimes I imagine you like this guy: http://rafaoliveiralopes.files.wordpress.com/2011/01/trollface.jpg?w=300&h=273
Am I the only onw who would like to se Ayende's version of NSK?
I agree with some of your criticism, but now iIt must be time to put up :)
How does this poor dog relate to Northwind Starter Kit?
Really enjoy your critiques but would love to see you produce something to show how it should be done.
Good riddance, glad this series is over.
@Jacob, @Simon, Sorry guys, but what do you mean with "it must be time to put up" or "would love to see you produce..." ?!?
It's perfectly ok not to agree with him and criticise his opinion, style or whatever, BUT you shouldn't ask for "how would you do it", because he has probably written more blog posts over the last years than any other .NET blogger. Also there is so much OSS available that has been written by him, so if you want to know how he would code things up, go and look at his code. I'm sure you find the link to his github on you're on, so don't be lazy.
@Daniel Sorry, but if the conclusion to this series is a picture of a dog, and absoloutely nothing on how it could be done better, then what is the takeaway?
That NSK is bad? Ok, then. Thanks. I know how I would do it, and I know how Ayende wouldn't do it. It would be nice to know how he /would/ do it.
Obviously this is Ayende's blog, I'm just a reader with a suggestion that's all.
Oh, and by the way, what is the relevance of how many blog posts he has written? Does that mean he is so awesome that critique is not welome?
It was purely a suggestion.
John, https://github.com/ayende/ravendb/blob/master/Raven.Client.Lightweight/Listeners/IDocumentQueryListener.cs
This has been an incredibly useful series to me. There are lots of examples and books out there that seem to unnecessarily complicate what we need to do to accomplish simple things. It's great that an expert such as Ayende comes out and says so. Also, Ayende has included plenty of pointers during the series as to how he would do things differently. Do you really need to be spoonfed?
Very funny ending to a series of posts that I really appreciated. I have a lot of painful experience dealing with code of other developers that was severely over architected and utilized every single design pattern that they could collect from the internet, so I believe that Ayende has taken the high road in battling the irresponsible dissemination of code without theory. He may come across as a bad guy in the eyes of many. But for those who have dealt with the madness of coders that utilize patterns and architectural concepts they don't understand, you are a hero.
Just to elaborate on my point: at my company, and I'm sure at many companies, there have been so many instances in time when a developer has justified some very poor decision to managers and others by saying but look, this exact type of code appeared on some famous persons blog. That's why the effect of you as one of the most important .NET bloggers renouncing such mindless imitation is really helpful.
I totally agree with Ayende. I had downloaded that project 1 year ago cause I was trying to learn something more about architecture. At the end I gave up cause I thought that was overly complicated and engineered. I think that approach is not even good for a complex application. Those guys just wanted to show off how cool they are putting together a bunch of concepts which are on everyone's mouth theses days.
Keep on writing about good software architecture Ayende. Simplicity is always the best way.
@Jacob, The takeaway is that you should not do really simple tasks in a really complicated way. That you should not abstract things for the sake of abstraction.
As for how would Ayende do things, try looking around. Examples of how he works are all over this blog. Try his Github account or any one of the tags on this blog (especially Macto and OR/M tags).
Anyone who has read his blog for any length of time is well aware of how Ayende would implement a similar system.
Learned a lot from this review. I agree with Daniel above. However are there 'sample' apps you would point to that you would consider good examples to learn from? Your work is greatly appreciated!!
I've surely seen my share of NSK-like apps in my experience and I'm happy that Aynede did those series. Maybe now more people will start thinking "is it necessary" before using a design pattern, and not use it just for the sake of it.
Laughing at the "put up or shut up" comments. Check out his github or prior blog posts.
Further, these posts serve a purpose. Code like what is being reviewed ends up being taken as prescriptive, much to the detriment of many code-bases.
@Jacob, I'm glad glad you pointed out that that picture was of a dog. It was beginning to haunt me. Just like trying to to follow an over-complicated example exclaiming "Best Practices" would have haunted me had I followed it. It's good to see experienced programmers denouncing complication and giving reasons why. Simple is definitively better. Much easier to maintain. Why re-abstract the abstract.
As developers we suffer from the need to play with cool toys. We need to start paying more attention to our requirements and less attention to our personal desire to work with the latest and greatest. Thanks for an illuminating series!
I'm the dog in the picture. I'm really angry to be compared with NSK uglyness. Futhermore, since I'm a living been, I'm a complex organism, per contary NSK is a "complicated" one. You Ayende explained, thanks to me, the difference between the two concepts of complexity and complication.
Good job, Ayende Rahien. Having to deal with over-engineered apps on a daily basis, I totally see where you're coming from. I'm puzzled, why people seem to have attachments to complicated designs, when a simple one would do suffice. I guess, our brains work differently (can't think of a better explanation).
Regarding the "put up" comments I felt the post on the 6th did some of that rather well:
http://ayende.com/blog/153153/northwind-starter-kit-review-refactoring-to-an-actual-read-model
I second Deke's sentiments.
This is kind of refreshing. Having just worked on such code I was ready to shoot myself. It is such a depressing code base.
It is not like the NW sample was chaos. It is not. It is like sorting every single item in your home in alphabetical order. It is too much order and it is just not helpful.
The more of your blog I read, the more.I realize you're just a giant dick.
Instead of looking down on everyone else, try teaching how things could be done better.
But I'm guessing you suck at that. Most high ego developers are awful teachers.
All which brings back the age-old question: why are good application examples so rare (or should I say almost non-existent), especially among Microsoft stack? Too much greenfield with no real delivery date pounding against one's head unleashes the architecture astronaut?
I like this guy: http://farm4.static.flickr.com/3291/3044802775_864fcae4e7.jpg
@Bunter A large part of the problem is that in order to create a good application example, you need a complex enough domain to warrant the architecture. Most examples don't do this because the developer must then learn the domain as well as the architecture. Unfortunately, this will always be the case as the architecture of an application is entirely dependent on the requirements of the domain.
Instead most sample application take basic CRUD requirements and slap a heavy overly complicated (not complex) architecture on top of it. This is when you get things like NSK that don't actually teach what they are intended to.
If anything the take away I got was don't make things too complicated. I believe Ayende has made a good argument here, and proof of how he'd go about accomplishing it isn't necessary. A CRUD application is simple. In my mind I'd go with something like ASP.NET Web Pages to accomplish the task with SQL and WebMatrix Data namespace. For more complex applications, with more business logic, then consider jumping to something like S#arp Architecture which serves as a good foundation for MVC and the NHibernate ORM...a more complex application needs more abstraction and using bigger frameworks to help makes a lot of sense. Smaller simple applications will be easier to understand without so much abstraction of repository details.
F the dog, what's up with that chair?
Thanks again for another refreshing series.
Stephen
Though the review was "harsh", there are plenty of good lessons to learn from. I have changed my mind about repository -- more accurately, what to abstract away in which circumstances.
This was a good series, as it revealed what emotion goes into architecture and development. We dev's are a passionate lot, clearly. That's a good thing.
I've harped on this theme in other comments: The create\or of the NSK wrote a book about architecture, yet has produced an amazingly complex example of enterprise architecture. What does this tell us? What choices should be made? If it's 3 am and I'm knee deep in architecture that is confusing, have I done the right thing for my clients?
For those of us who are impressionable developers, could you recommend a project which would be useful as a pedagogical example (i.e. one that is not monstrous in complexity, but has all the good practice juju to learn from)
@Harry - you're kind of rephrasing my question - sure, picking a wrong problem as a basis for the solutions ends up both problem and solution being wrong but my question was more targeted why on earth everybody tries to produce the sample targeting usually DDD-ish kind of architecture which probably pays off only in the most tiniest fraction percent of the cases.
Comment preview