Is the code better?
As long as there is night, there will be day. As long as there is twitter, there will be DHH posting “robust” opinions on there. Recently he was making comments like this:

So, I followed the github link (https://gist.github.com/2838490) and I just LOLd. The OP’s comment is exactly how I started to write controllers in asp.net MVC when I started learning about SOLID — moving all the logic into some “service” just to get it out of the controller. As it happens, I think DHH posts the best code example for the given context of simple synchronous code.
I had a senior dev at the time telling me how pointless my services were. But I was adamant it was SOLID code, and thus unquestionably correct, and he was wrong. (Morcs his name is. Top developer and you should follow him on twitter @morcs).
DHH later tweets about a podcast in which he discusses all of these issues. I had a listen and it was super-engrossing, I recommend you do too http://rubyrogues.com/056-rr-david-heinemeier-hansson/
In the rest of this post I’m taking an exploratory approach. My aim is to clarify my own thoughts and put them out there to be shown lacking and hopefully improved given further insight — I’m being civil and open-minded for a change.
You should really listen to the podcast if you want the full context.What Would DHH Say?
“Show me the code. Is the code better? Does it look better after than it did before?”. He argues that OO principles, patterns and laws sound unquestionable when discussed in the abstract, but often fall down when liberally applied to real code. He reels off a number of examples based on the Rails code, too.
He thinks that because they are called “principles” or “laws” that we feel we have to use them. I believe he is correct. I can think back to a number of discussions I’ve had where someone has told me the code is better because it follows principle X, yet it doesn’t really look any better (In fact I’ve said the same many times myself).
In fact, for some of those use cases the principle makes it more difficult. For instance, there is often a trade-off between DRY and SRP — do you want logic to be isolated or centralised? It depends on the context, not your favourite principle. And I think we have all broken the “law” of demeter when it was a hindrance.Follow the Leader
What happens when we tell developers to follow the golden “rules” of SOLID, OO and all that jazz? We promise them that when they reach enlightenment they can break these “rules” with their god-like expertise?
Well if they don’t know why they are doing it, and they aren’t applying it based on the context, there is a chance they may create an over-engineered mess that is harmful. But that’s abstract….
…at 7digital, one of the projects has a code base created with the best of intentions. The developers thought they were doing the company good by having so many abstractions. Yet on a daily basis we are fighting against all of them to find out the real logic of the system. I’m not criticising the devs, they learned about SOLID, thought it was awesome and really tried their best. Much like I have done to many a poor code base.
But who is really telling us that we should liberally apply SOLID to every crevice of OO code? Let’s start at the top — is Uncle Bob telling us to liberally apply SOLID without thought of context? No he’s not — I’ll quote him directly: “abstractions are indirection”. In fact, Uncle Bob tells you not to use the Open Closed principle until you know how the application is being used and how it is changing http://www.cleancoders.com/codecast/clean-code-episode-10/show. Exactly the case DHH is making.
Who to Follow Then?
What if we take the DHH approach? Imagine a world where we have to justify the use of a pattern or principle. No longer are we sheep following the herd, but responsible developers justifying our design decisions.
When I think about it, it seems like there should be no other way. Yes, absolutely, learn about SOLID, DRY and all of the good things you can because they are super-important. Just be aware of the puppy-love infatuation you subsequently go through and over-apply them. This is the phase where you learn by detouring from the applicable-contexts.
…but I think regardless of ability we should always keep context in mind and do the DHH — “is the code better? Does it look better? Why is it better? What pain is it causing? What pattern or principle will genuinely help here?”.
Be objective and follow yourself.