I <3 Steve McConnell*
Coding Horror
programming and human factors
by Jeff Atwood

Feb 13, 2009

Real Ultimate Programming Power

A common response to The Ferengi Programmer:

From what I can see, the problem of "overly-rule-bound developers" is nowhere near the magnitude of the problem of "developers who don't really have a clue."

The majority of developers do not suffer from too much design patterns, or too much SOLID, or agile, or waterfall for that matter. They suffer from whipping out cowboy code in a pure chaos environment, using simplistic drag & drop, data driven, vb-like techniques.

Absolutely.

But here's the paradox: the types of programmers who would most benefit from these guidelines, rules, principles, and checklists are the least likely to read and follow them. Throwing a book of rules at a terrible programmer just creates a terrible programmer with a bruise on their head where the book bounced off. This is something I discussed previously in Mort, Elvis, Einstein, and You:

Thus, if you read the article, you are most assuredly in the twenty percent category. The other eighty percent are not actively thinking about the craft of software development. They would never find that piece, much less read it. They simply don't read programming blogs-- other than as the result of web searches to find quick-fix answers to a specific problem they're having. Nor have they read any of the books in my recommended reading list. The defining characteristic of the vast majority of these so-called "vocational" programmers is that they are unreachable. It doesn't matter what you, I or anyone else writes here -- they'll never see it.

In the absence of mentoring and apprenticeship, the dissemination of better programming practices is often conveniently packaged into processes and methodologies. How many of these do you know? How many have you practiced?

1969Structured programming
1975Jackson Structured Programming
1980Structured Systems Analysis and Design Methodology
1980Structured Analysis and Design Technique
1981Information Engineering
1990Object-oriented programming
1991Rapid Application Development
1990Virtual finite state machine
1995Dynamic Systems Development Method
1998Scrum
1999Extreme Programming
2002Enterprise Unified Process
2003Rational Unified Process
2004Constructionist Design Methodology
2005Agile Unified Process

And how do we expect the average developer to find out about these? In a word, marketing. (I could have substituted religion here without much change in meaning.) It's no coincidence that a lot of the proponents of these methodologies make their living consulting and teaching about them. And they have their work cut out for them, too, because most programmers are unreachable:

I was sitting in my office chatting with my coworker Jeremy Sheeley. Jeremy leads the dev team for Vault and Fortress. In the course of our discussion, I suddenly realized that none of our marketing efforts would reach Jeremy. He doesn't go to trade shows or conferences. He doesn't read magazines. He doesn't read blogs. He doesn't go to user group meetings.

Jeremy is a decision-maker for the version control tool used by his team, and nothing we are doing would make him aware of our product. How many more Jeremies are out there?

Millions! As Seth Godin notes, the unreachable are now truly unreachable -- at least not through marketing.

So, if we know the programmers who would benefit most from these rules and principles and guidelines are:

  1. highly unlikely to ever read them of their own volition
  2. almost impossible to reach through traditional religionmarketing

Remind me again -- who, exactly, are we writing these principles, rules, guidelines, and methodologies for? If we're only reaching the programmers who are thoughtful enough to care about their work in the first place, what have we truly accomplished? I agree with Jeff R., who left this comment:

There's nothing wrong with the SOLID principles; they make sense to me. But I've been programming since the days of card readers and teletypes. They won't make sense to those with little experience. They don't know when or how to apply them appropriately. They get bogged down in the attempt.

So trying to follow them changes the focus from result to process. And that's deadly.

It's the job of the lead programmer or manager to see that good principles are followed, perhaps by guiding others invisibly, without explicitly mandating or even mentioning those principles.

In my effort to suck less every year, I've read hundreds of programming books. I've researched every modern programming methodology. I'm even a Certified Scrum Mastertm. All of it, to me, seems like endlessly restated versions of four core fundamentals. But "four core fundamentals?" that's awful marketing. Nobody will listen in rapt, adoring attention to me as I pontificate, nor will they pay the exorbitant consulting fees I demand to support the lifestyle I have become accustomed to. It simply won't do. Not at all. So, I dub this:

The Atwood System of Real Ultimate Programming Power

  1. DRY
  2. KISS
  3. YAGNI
  4. NAMBLA

All those incredibly detailed rules, guidelines, methodologies, and principles? YAGNI. If it can't be explained on a single double-spaced sheet of paper, it's a waste of your time. Go read and write some code! And if you can't grok these fundamentals in the first three or four years of your programming career, well -- this slightly modified R. Lee Ermey quote comes to mind.

My name is Jeff, and I can't stop thinking about programming. And neither should you.

Posted by Jeff Atwood    View blog reactions
« The Ferengi Programmer
Are You An Expert? »
Comments

NAMBLA! HA! Nice followup Jeff :). It's a bit more complicated and mentoring sure does help people (such as the fine articles on this here blog).

Rob Conery on February 13, 2009 6:40 AM

Until now, I actually thought NAMBLA was something like KISS... :P

Perhaps I should've researched it a little sooner ;)

Jani Hartikainen on February 13, 2009 6:44 AM

Dummies have their place. They make me look better and raise my salary. Leave 'em alone.

And I can call them dummies, because they don't know that I'm calling them dummies.

Steve-O on February 13, 2009 6:54 AM

well said.

kyle on February 13, 2009 6:58 AM

Maybe you should call them the four noble truths.

harpo on February 13, 2009 7:07 AM

Wow, you should look at how this post is formatted on your feed, especially at the end. Looks wacky.

Lee Dumond on February 13, 2009 7:30 AM

Yay for ignorance.

Jim on February 13, 2009 7:49 AM

North American Man Boy Love Association? (this phone doesn't get youtube)

Spong on February 13, 2009 8:06 AM

I believe that's National Association of Marlon Brando Look-alikes.

Stan Rogers on February 13, 2009 8:20 AM

Yep, we've confirmed what's wrong with the other developers out there. Now, what do we do about it? What do we do when they're on our team?

SuperJason on February 13, 2009 8:35 AM

Good post, Jeff. Not sure if marketing was the point of your post or not, but I think it's an important fact. Developers tend not to be good at marketing what they're doing, or they promoting good ideas is is being pushy. For evidence, you need look no further than web development frameworks. Then compare them to RoR (whose creators are excellent marketers). Look at the rate at which the product and community have grown.

It's important if you're the guy that knows, to share it with your co-workers. Like you do on this blog. If you're working somewhere where that doesn't fly, seriously, what are you doing there? You're just a drone at that point.

Doctors don't last long without continuous education, and programmers shouldn't either.

Erik LaBianca on February 13, 2009 8:40 AM

No Politics, Please!

Mark on February 13, 2009 8:44 AM

If I was to convert this into a fitness and exercise analogy ..

* There are tons of people trying to learn how to be more fit
* There are tons of exercise regimens to help them go down that path
* These messages will not reach most of the people wanting to be fit
* Many people won't actually get it even after the first 3-4 months
* Many of them do not even want to consult a physician (high consulting fees)

So to each of these folks make sure you DRY n KISS n think about fitness but YAGNI to all the other fitness regimens.

I can hear the message, understand the message, perhaps even grok it but cant quite buy it, cos I don't feel like giving up on ways I believe improve fitness.

Dhananjay Nene on February 13, 2009 8:45 AM

In my experience the best way to get these developers moving forward is through pair programming. Often times, they don't know what's possible and seeing a very proficient peer in action is the best way to spark their interest. Also, switching pairs will spread this knowledge throughout a team. Most of the time this environment will encourage growth but if they remain a deadbeat the team will eventually weed them out.

John on February 13, 2009 8:56 AM

Sure pair programming works. one guy does 90% of the thinking and one does 90% of the typing. The guy that does the typing complains about doing all the work while the guy that does the thinking gets an ulcer.

Mark on February 13, 2009 9:02 AM

If it can't be explained on a single double-spaced sheet of paper, it's a waste of your time.

I think this quote shows the problem with peoples attitudes about programming. Many problems are not easy to understand and not easy to solve. If you don't regularly come across things that take many sheets of paper to explain you're not trying hard enough.

queisser on February 13, 2009 9:12 AM

Is this supposed to be a provocation or something? If not, please explain how the Open Closed Principle follows from NAMBLA.

Lev on February 13, 2009 10:35 AM

Your religion might be comprised of marketing. But others aren't always like yours.

Please remove the word religion if you didn't want to talk about it or at least rephrase it so it's less insulting.

chakrit on February 13, 2009 11:11 AM

If you don't regularly come across things that take many sheets of paper to explain you're not trying hard enough.

I'm not particularly sympathetic to Jeff on his points, but this is dangerous advice as well. Could encourage people to make unnecessary work for themselves just to make sure things are interesting.

Back in college I had some bright professor guy spend an entire semester teaching us how to mathematically prove the validity of our algorithms using First Order Predicate Calculus

Or further education, I presume? Probably not a mathematician, computer scientist, researcher, etc. then, eh? Just because it's not job training doesn't mean it's not useful brain and though pattern preparation. Nor does it mean it's not useful in someone else's computer programming related job.

cammerman on February 13, 2009 11:13 AM

You're kidding right? I LOVE programming, I love learning about design patterns and structure methodologies. But, my cranial RAM is full! I'm still trying to cache something...anything to my mental hard drive that I've learned over the last year!

WPF, Silverlight, SQL 200X, RAD, SCRUM, Agile, NUnit, TortiseSVN, TFS, VS 200X, AJAX, Javascript, HTML X.X, CSS X.X, PHP, C# X.X, .Net X.X ...duh...the list goes on and on.

All this progress is cute but I can't keep up...oh...wait a sec...thank you God, I think I'm having a heart attack.

Goodbye cruel world!

Joe on February 13, 2009 11:21 AM

This is probably not the entirely appropriate forum for this rant, but I wrote it already....

Good point, I suppose. But for example, I find it interesting that after the brouhaha of stackoverflow # 38 (or whichever one it was), when you guys invited the fellow you criticized on the show....you would think that he would have come equipped with some decent examples, case studies, or......something. I thought Joel was extremely restrained during the interview, because at least for me, I totally didn't see his point. His appearance only solidified my belief that joel is more correct on this particular subject.

Look at the history of software, methodolgies, etc... AT LEAST 50% of it is either useless, self serving, or of no productive consequence, but when you dare criticize a methodology, the proponents act as if you are trying to stifle innovation. Where is the intellectual humility on behalf of the proponents of the new methodologies? And, when you are given massive exposure on a popular blog/podcast, and you can't find a remotely real world applicable example of why I should take your methodolgy seriously, you call me uninformed?

If I have a task to implement at work, I can write it with my present skills, it will work for years, and when a junior programmer comes along, they can figure it out. Following some of these new and better programs, it takes me hours to sort through how to disconnect from all the other objects, and no one will ever be able to figure it out.

I think Joel is EXACTLY right, I think these advocates are full of it. He can't really say it now, but I will restate what he said...I don't think these people write code day in day out. They live in a little fantasy land. They come up with their schemes in an environment where all the developers are hardcore and totally up on the latest design. Well, in the real world, everyone isn't. And who knows what developers will know 10 years from now. In the real world, designs and patterns come and go. But common sense doesn't. How about simple? I could show you code from the Thoughtworks drones that should be f*cking illegal. I've personally ripped out their crap and reimplemented smaller, simpler, faster, and more functional, with 70% less code.

I just don't buy the snake oil you guys are selling. (This is directed to the guy Joel hacked on.)

Trevor on February 13, 2009 11:57 AM

So I guess we should stick to the 1969 structured programming then (or even something before that), since everything that came after is just too complicated to fit your sheet of paper definition. Objects, inheritance, encapsulation, overloading, interfaces, delegates, lambda expressions etc. - I could argue (using your 4 rules) these are all unnecessary since you can achieve DRY, KISS, YAGNI with simple plain old C

Igor Brejc on February 14, 2009 1:23 AM

I dunno what Jeff's trying to get at. But it seems to me that his three principles don't mean that you ignore all the other stuff out there -- just that those three are the core.

To my eye, SOLID consists of one iron-clad principle of OOP (LSP) and four great patterns for OOP development. But I have a huge problem with treating those other four as if they are the core of OOP, because they are only great patterns when applied sensibly, and the way I'm seeing SOLID presented suggests they should always be used.

For instance, I'm looking at the world's simplest Hello World class / program, and thinking that if you took SOLID seriously you'd be required to rewrite it as four classes/interfaces. (Because the two pieces of functionality -- marking the main entrance to the program and printing a message -- should be separated into two classes under SRP, and then each of those classes should have an abstract interface and a concrete implementation under DIP. Actually, I can even see an argument it should be six classes...)

That is to say, the SO/ID parts of SOLID are at war with KISS/YAGNI. And personally, I think KISS/YAGNI is the clear winner: you shouldn't be pulling in all that abstraction unless you actually need it. When you need it, abstraction is the greatest thing ever, but when you don't, it just makes your code needlessly complex.

Sol on February 14, 2009 2:03 AM

NAMBLA interpretation: NAMBLA references are jokes, Jeffs Ultimate Whatever is a joke name, some people do not get the joke. Even though its a joke, it doesn't mean the whole post is a joke.

Ian on February 14, 2009 2:05 AM

I believe Jeff totally misunderstood the motivation for many of the fancy methodologies like RUP: it's not to make great programmers greater, but to reach the people who are not interested in improving their programming skills, not through marketing, but through simple coercion.

The idea is that a methodology like RUP, if allows a large organization with a mix of competent and incompetent programmers to have the incompetent ones be productive by establishing clear rules about who has to do what, and how to cope with problems that arise.

It's certainly arguable whether this works as well as the proponents imagine, but it's at least a constructive idea of how to deal with the situation of many large organizations DO have lots of marginally competent programmers and DON'T really have the option of firing them all and hiring only competent ones.

brazzy on February 14, 2009 2:06 AM

The software engineer should have as a minimum:

1. Membership of a society-wide accepted professional institution that is the governing body of professional software engineering standards, status and awards.

2. A computer science degree with a minimum of 25% mathematical (pure and applied) content acceptable to the above institution.

Sam on February 14, 2009 2:10 AM

He *IS* the Messiah!

Andy Brice on February 14, 2009 2:25 AM

In my software engineering class I learn about all those methodologies and metrics. Then we go and do not ever use them again (heck we didn't even used in the first place, we only learned how it worked) in our entire academic life.

90% of my colleagues HATE software engineering class, there is simply too much information that we don't apply anywhere, Most only get all the slides the professor use one day before the test and study like hell.

Maybe if software engineering wasn't so boring we could have more interested people

Hoffmann on February 14, 2009 3:02 AM

The difference between rules you provide and people really thinking about software design is that they aren't substantive.

It's not that it isn't bad general advice. But what is worse is that you appear to think it is a substitute for attempting to codify good practice in a reusable way.

Who cares necessarily what the bad programmers are going to do, they're going to copy other peoples code anyhow - and aren't going to be helped by you.

But regarding the harm of rules... codification of good practice happens all the time. It's obviously part of programming language development, we're not just doing loads and stores to registers and memory and doing maths operations on them.

The irony is that you sound similar to a hardcore assembler programmer 25 years ago. Don't use C you'll stop thinking about the code!

tl on February 14, 2009 3:18 AM

I laugh! And it is funny because it is true!

It is a bit sad too, as there has to be a few more cold hard truths out there, but you certainly have to wade through some deep sewers to find them these days.

But that is not important right now - I want to start the first ARSUPP (Atwood Real System of Ultimate Programming Power) training center in my region. I expect I first need to pass the 8 week ARSE (Atwood Real System Engineer) training, so where do I sign up?

;-)

Console on February 14, 2009 3:34 AM

Sorry, what's the NAMBLA supposed to represent? Just a joke? Or something along the lines of:

Just like NAMBLA can, and has the right to, attempt to legalise sex between adult and minor males. Similarly zealots and marketeers have the right to advertise their version of The Methodology. But in both cases you still have to use your own judgement and make your own decision about going along or not?

Giel on February 14, 2009 3:50 AM

Brilliant reposte, Jeff. Couldn't agree with you more :-)

Iain on February 14, 2009 3:56 AM

But here's the paradox: the types of programmers who would most benefit from these guidelines, rules, principles, and checklists are the least likely to read and follow them.

Well let's take building for example: the types of [worker] who would most benefit from these guidelines, rules, principles, and checklists [for building houses] are the least likely to read and follow them.

So what you are saying ? That those that are not knowledgeable enought in X would have most benefit in learning X ? That just seems common sense to me.
So little value you are providing there.

It's no coincidence that a lot of the proponents of these methodologies make their living consulting and teaching about them.
And exactly how is this different from you proposing us your visions about sw development on your blog and making money from that ?

Remind me again -- who, exactly, are we writing these principles, rules, guidelines, and methodologies for? If we're only reaching the programmers who are thoughtful enough to care about their work in the first place, what have we truly accomplished?

Let's try mathematics this time. Are you saying that mathematical discoveries shouldn't be written in books because they would make sense only to Ph.D of mathematical science ?

Sorry, but seems like another non quality post on otherwise very good blog.


Petar Repac on February 14, 2009 4:01 AM

Above, you quote Jef R who was replying my question, which remains unanswered.

I am astonished that you seemed have missed, possibly deliberately, that SOLID is about design! I also have noticed, some other posters here dont seem to have, that you have subtly changed your line of argument from :

podcast : agile is a waste of time, you don't need it
ferengi : solid is bureaucratic
this one : no point trying to improve programming technique as most people listening

This aside, can some please reply to my original question:

Could someone who actually agrees with this post, please give a non-trivial example of how not adhering to any of the SOLID principles leads to a better design?

Just Wow on February 14, 2009 4:17 AM

I think that ignorance is only a small part of the cause of the problem, and making the case that software developers simply needs to be educated is a convenient and simplified view.

Software developers might make an active choice not to use any principles/methods/methodologies, but instead go for the cowboy quick-n-dirty style.

Why?

In many cases the goal of software development is as simple as:

1. Make it work
2. Do it as quickly as possible

A lot of companies today don't compete on quality or durability. Quite the opposite actually, the biggest and most successful companies seems not to care so much about quality, and rather compete on other means. Such as low prices, aggressive marketing etc.

Why and how would the software industry to be an exception from these market forces?

Joel on February 14, 2009 4:40 AM

R. Lee Ermey...

This is my keyboard. There are many like it but this one is mine.

Matt on February 14, 2009 4:43 AM

The Rational Unified Process was invented long before 2003 - I can remember using it in the late 90's.

Dave G on February 14, 2009 5:00 AM

Sorry, Jeff. You just don't seem to get it. And neither do a lot of your readers.

SOLID is not a set of commandments about how to write software. SOLID is about gaining an understanding about what makes an object-oriented design a good one. I agree with DRY, YAGNI, and KISS, but these ideas don't give you any guidance about how to design your class structures.

So what happens when you sit down and try to write code? Re-listen to the Hanselminutes podcast where Bob is talking about the LSP, and he gives the classic example of the Rectangle vs. Square class design. Nothing in DRY, YAGNI, or KISS will guide you in any way about how to create your classes here. The LSP (The L in SOLID) gives us a really good way of thinking about how we might design these classes, and also gives us a reason other than well, it *felt* like the right design at the time. This, then, is the true value of a set of principles like SOLID.

These principles become more important as the importance and visibility of the software you write rises. So if you're publishing an API for other programmers, either in a large team or publicly, non-SOLID based object structures are visible to few people. Sure, you may find yourself having to spend a bit more extra time changing your code, but that doesn't matter as long as you or your one or two team members are the only ones making the sausage. I suspect this is where your (and Joel's) lack of understanding of the principles stem from.

Let's face it, SOLID is getting criticism from a guy who made his own language to wrap classic ASP, and whose company is now stuck with it. That's hardly a sign of someone who cares about the ability of other people to work with his code.

Now it's time to hold up the mirror, folks. Which ones of you who are criticizing Bob Martin and SOLID have written public object-oriented APIs, used by many people? Code bases to be used by many people in your team? Code that can be extended *without having to be changed*? Then you're probably getting away with ignoring these principles.

Just understand that getting away with coding something and having it work is not the same as writing good code. Thinking about coding is not the same as writing good code, either.

Dave Markle on February 14, 2009 5:07 AM

I don't like the NAMBLA joke. It's like if you ask about NAMBLA then you belongs to that group, the unenlightened mass. Questions are the most important thing in our society.

Or is it joke about abbreviations? If it is, then you do not understand abstractions. And that is a crime.

Please, do not make me research unimportant things on the internet. And do not try to make me laugh!

Flinko on February 14, 2009 5:15 AM

Thus, if you read the article, you are most assuredly in the twenty percent category. The other eighty percent are not actively thinking about the craft of software development.

True.

Thing is, at least 95% of useful and functional software is produced by that 20% of people. The other 80% are not really in the business of producing software, they are in the business of 'sitting in an office'.

Say if you are interested in marketing products and services. These can be genuinely useful or snake-oil; from a marketing perspective it makes only a subtle difference.

If your products/services are, or claim to be, useful for software development, you aim at the 20%. If they are aimed at 'sitting in an office guy', then he is just a small niche within the larger set of people who sit in offices not doing much. The key products they require are chairs, coffee, and time-wasting web apps.

soru on February 14, 2009 5:18 AM

It's the job of the lead programmer or manager to see that good principles are followed, perhaps by guiding others invisibly, without explicitly mandating or even mentioning those principles.

This is still wrong.

The statement above says,
1) Good principles will be enforced see that good principles are followed
2) Do not explain the good principles being enforced without ... even mentioning those principles

The lead or manager should NOT avoid mentioning and discussing the underlying principles he's expecting his team to leverage.

I suspect that success is much easier to achieve if it has been clearly defined.

Calvin on February 14, 2009 5:18 AM

Sorry, I don't get the Nambla joke. Would anyone care to explain, please? I am feeling quite stupid now. I guess this means that I definitely belong to those 80% inferior beings. No irony intended.

Jan on February 14, 2009 6:30 AM

I think you'd want separation of concerns in there too and that plus DRY should give you the basics of OOP too.

As a programmer who never went to uni I started off with DRY and it gave me plenty of distance in telling me how to structure code.
SoC came later when I realised that mixing GUI and database code wasn't really working. KISS unfortunately only came to me later when working in large teams and asking myself if others would understand the code and YAGNI is for project management, timelines and your role as a developer.
The get shit done philosophy applies to any job really so doesn't live here.

It's interesting to pull this stuff apart, look at MVC for example, that's basically just SoC, State pattern is a bit of DRY and so on.

I agree that you can trust in DRY, KISS, YAGNI and SoC. Everything else requires a bit more cynicism to see if it is relevant and useful.

Jax on February 14, 2009 6:56 AM

I don't want to mischaracterize what you're saying, but I interpret it, in a nutshell, like this:

* There are millions of programmers who are nine-to-fivers who don't care about there craft;

* These are the people who would most benefit from learning guidelines and method of some sort, but are also those who are least likely to learn them, or indeed even read about them;

I agree completely, but that does not devalue guidelines and methods that exist. And:

* Those of us who care about our craft and make an effort to learn need to carefully consider methods and guidelines, rather than adopting them blindly.

I also agree. I don't follow any single methodology end-to-end, but I do read copiously, try different things, and adopt those that appear to make a difference to my work and drop those that do not.

The problem, I think, is that for a lot of people what you are suggesting would amount to a license to disregard method and guidelines without the careful consideration and continuous learning that most people who care about the craft should follow.

My $0.02.

Remi Despres-Smyth on February 14, 2009 7:16 AM

Sorry Jeff, tried really hard to post my comments here but since you don't allow HTML, the formatting came out wrong.

Hadi Hariri on February 14, 2009 7:37 AM

@Markle - Spot on.

jm on February 14, 2009 7:44 AM

Programmers are not the problem. The problem is the continual interruptions by management, marketing and sales people - who, all believe, that programmers can and should be interrupted at any time, work overtime with no pay, be subject to environmental conditions which are not conducive to creativity nor productivity.

When those road blocks are removed, then and only then will real productivity and creativity begin to emerge. Not any of this agile or scrum crap.

Mike on February 14, 2009 7:45 AM

My Response:
http://dotnettricks.com/blogs/craigbowesblog/archive/2009/02/14/739.aspx

craig on February 14, 2009 7:54 AM

Ok, so we're suppose to keep our programming simple so we have more time to rape teen boys? Or, just have more time to joke about it? I'd appreciate if you could expound upon your last point. I think there are a few confused people here.

Daved on February 14, 2009 8:10 AM

And how do we expect the average developer to find out about these? In a word, marketing.

Through education, otherwise they have no business working as programmers.

So, if we know the programmers who would benefit most from these rules and principles and guidelines are:

highly unlikely to ever read them of their own volition
almost impossible to reach through traditional religion/marketing

Then those programmers should not be programming. Some minimum of professionalism is required, otherwise the business as a whole reflects this (and I think it does so now).

I think we would be doing these people a disservice by catering to them through any kind of marketing, except maybe word by mouth, but then that's how people always woke up and found out about how to do things better, or just new interesting things.


Dennis Decker Jensen on February 14, 2009 8:14 AM

I think we can interpret Jeff's post in the other way around.

It's not that principles like SOLID are bad, redundant or anything, just that their goals are all the same. To educate developer to write a 'quality' program that easy to read and maintain. That's DRY, KISS and YAGNI.

Though, having so many principles to follow has some draw back. Some people just don't try to understand them well before using them. I've met some developers who are so zealous about some 'design patterns' and 'principles' and make their program an over designed piece of junk that suffered anyone who try to maintain it.

Maybe it's just that these programmers don't put enough effort understanding these 'principles', or maybe it's just that there are too many things for them too learn and make them forget the very basic things like DRY, KISS and YAGNI?

cc on February 14, 2009 8:14 AM

@Just Wow

Could someone who actually agrees with this post, please give a non-trivial example of how not adhering to any of the SOLID principles leads to a better design?

Agreeing with the point Jeff is making is not the same as deliberately avoiding all the SOLID principles (or similar ideas that have emerged from software engineering experience over the years). It certainly doesn't mean believing that avoiding them leads to better design.

To me the basic point here is that there are no silver bullets. You always have to think about what you are doing, and if you should find yourself in a situation where breaking some principle gets the job done better, then don't be afraid to do that.

Console on February 14, 2009 8:34 AM

So fundamentals are OK but principles are bad?

I've spent years trying to increase acceptance of Agile fundamentals in developers with traditional OOP backgrounds. These people are not unreachable - they do read and think about software development, and their ideas have merit. Endlessly chanting YAGNI! will NEVER bridge the gap.

What can? Show them how design can evolve. Write clean, maintainable code using Agile techniques. Demonstrate how TDD reduces defects and enables refactoring. Understand and speak their language.

Doctors have to learn the Latin names of body parts, as those are part of the technical vernacular of the profession. Arm bone just isn't specific enough. Terms like Strategy Pattern or Inversion of Control can provide the same benefits to communication in our profession.

Bill Sorensen on February 14, 2009 8:37 AM

Jeff--

There is a huge flaw in your thinking. For programmer to know how to keep from repeating herself, to know how to keep it simple, to know she ain't gonna need it, and yes, even to love a boy, she needs to study and understand a core set of programming principles.

At the core of this Jeff I don't think you really believe what you are saying. You're baiting us--and man is it working. You've hit on a formula to generate noise about you and your blog.

StackOverflow is superb and I respect you greatly for the work and time you've invested there. As a blogger, though, you've become the technical version of the ShamWow guy. You're carnival barking for your brand.

Sincerely,
Roger Pence

Roger Pence on February 14, 2009 9:00 AM

@Jeff

I didn't recognise your acronym #4 and looked it up on wikipedia. For what it's worth I am upset about this attempt at a joke and I wish you hadn't done it.

I read quite enough vile twisted sick stuff in one day just by looking at newspaper headlines.

Console on February 14, 2009 9:03 AM

While I agree in general, the whiff of elitist backpatting does bother me a bit.

Various methodologies are not really about programming at all, and even the most brilliant coder can benefit from thinking and using them. There are many activities related to getting good, robust, code out the door that satisfies customer requirements, and in my opinion the programming part is only a smart part (just like good construction is only a small part of what makes, say, a successful automobile).

Sure there are common principles throughout. In Carlin style we could probably whittle these down to be excellent. But the actual formulation of this principles into guidelines provides a framework that all parties (customers, programmers, testers, config managers, project managers, et al.) can understand and follow.

If it was easy as expecting people to just do the right thing we wouldn't have any of these methodologies and every project would succeed.

A on February 14, 2009 9:19 AM

I think part of the problem with software development and the reason we're having these discussions is that the barrier to entry is just too low. Anybody can download some free tools, put together a program and distribute it widely.

Many people think software development is not an engineering discipline but a craft or some form of creative art. Would you let anybody step into your shop and use your table saw or your lathe? If so, would you expect that anything good comes out of it. I was watching Jacques Pepin one day and he said that after years of apprenticeship he graduated to the stove.

And even if you agree software development is an engineering discipline, it's still way too easy to become undisciplined and lazy. The guy in the cube across from me designs plastic parts for our products. When he finishes his CAD work and releases the design we have a thorough design review. The mold guys get involved and figure out if it's ok to build a mold that costs hundreds of thousands of dollars.

Another guy is designing circuit boards. A board turn involves circuit design, PCB layout and fabrication and board stuffing. There's a huge cost and several months of cycle time.

Do you think the guys doing mechanical and electrical engineering should just throw the principles overboard and do what feels right. Maybe just build a few molds and see how it goes?

If you answered No then why should it be different for software? Because the website or app you're working on will be obsolete soon anyway?

I'd rather be a software engineer.

herbie on February 14, 2009 9:42 AM

Yeah, wtf is nambla with regards to software development?

Tim on February 14, 2009 9:55 AM

This debate is way too polarized and I think the far ends of the spectrum would learn a lot more from each other if there were less loaded words being flung around and more seeking for common ground (my longer-winded way of saying this is at http://www.above-average-software.com/articles/read/the-goldilocks-principle). I find both sides of the debate hard to stomach at times.

In the end, I don't think you can't rely on successful people to accurately communicate why they are successful. Having Jeff or Joel or Uncle Bob or Linus or Anders or a lot of other successful programmers tell you what they think works, whether Jeff's keep it simple stuff or someone else's 98 page thesis on the best practices of writing generic mock unit test framework interfaces... they're probably wrong about why what they have done has worked for them. Trying to copy what they say they do is just cargo cult programming taken to a higher level.

The success or failure of software projects probably has more to do with management of teams than with the practices of the coders involved. I think it's more important that the team you're on share a philosophy and style than what that philosophy and style are.

Michael on February 14, 2009 10:11 AM

@Console

Chill out man...it *was* a joke. And in my opinion, a good one...

Onyx Mueller on February 14, 2009 10:28 AM

You missed one - Brute Force Development:

http://softwareindustrialization.com/BruteForceDevelopmentBFD.aspx

Mitch on February 14, 2009 10:37 AM

My name is Jeff, and I can't stop thinking about programming. And neither should you.

I think this can be misinterpreted.

You don't need to be obsesed, you only need to have a *professional* attitude. It's a drag when the whole business world thinks that if you program, then you are not a profesional but a mere worker.

The best material you need to learn is *not* wrote by Software Engineering academics (who profess this corrupt programmer-worker analogy), but by Software DEVELOPERS in blogs and articles online.

PS: sorry for my english.

Demian Garcia on February 14, 2009 10:42 AM

PSS: Steve McConnell is a software developer. He just doesn't know it yet.

Demian Garcia on February 14, 2009 10:43 AM

Hate to be a bitch, but...


Throwing a book of rules at a terrible programmer just creates a terrible programmer with a bruise // on their head // where the book bounced off. -- ...on his head...

mrmermaid on February 14, 2009 10:45 AM

Here's one thing that I think messes up these software methodologies: as with many other management methods, there are a few relatively simple good ideas inside each of the software management methods.

Unfortunately, it's hard to make a successful career as a consultant training people on a few simple insights. This is actually a shame, since it's often very hard to get people to actually use the simple insights, and successfully training them to do so would be a real success.

Further, you can't write a good book out of a few simple insights. This is why management books are always so full of chaff, anecdotes, and filler. It's hard to sell an 84 page booklet as a trade paperback in the airport bookstore, so the authors always bulk them out.

I'm painfully conscious of that from having watched a very large company grab up scrum, which seemed to have a few good ideas in it about how to react to the unpredictability of the software development process.

But the large company sent everybody off to scrum school, which dressed the simple goodness up in a huge mass of stories, and story points, and heaven only knows what all else, until they had ended up with something as bloated as any waterfall process from the 1970s.

Now that I am writing this, it occurs to me that another problem is that a lot of the broadly agile processes are based on having a small number of excellent programmers work very intensely together. But large corporations that buy into the buzzwords all end up mis-fitting them onto some variation of human wave programming....

Robert Goldman on February 14, 2009 11:43 AM

I think I'm gonna come out as well:
My name is David, and I can't stop thinking about programming

(typed at 8a.m. at the start of my weekend, when I woke up early and thought 'lets check coding horror and possibly work on a web app'... oh, and it's supposedly something called 'valentines day'?)

As for the A4 design idea... I don't think he is that far off the mark. If you don't understand an idea well enough to explain it in a single sheet of A4, you probably don't understand it well enough to code it... go away and gain a better understanding. I think this should be hierarchical personally, but a single sheet of a4 for each bit of the system at each hierarchy level sounds better than reams of prose and diagrams that took months to create, still don't give a decent explanation and that are so big that no one will bother reading them anyway...

workmad3 on February 14, 2009 12:05 PM

@Roger Pence,

On the ShamWow Guy analogy; *wow* I think you have captured it PERFECTLY. That's exactly what I'm seeing.

I do think a lot of this Agile/SOLID etc stuff is problematic. I think Uncle Bob did a pretty poor job of defending his position.

Nevertheless, I'm worried that Jeff is advocating a very lazy view. I
ve seen this a lot lately. I think the views he has been expressing the past several months are like:

Don't worry about having in-depth knowledge of anything. It's pointless. C is hard and performance is hard and probably a waste of time. Look, if you are reading this blog, you've already won the battle. You reading programming blogs, THIS BLOG, in fact, therefore you are elite. Congratulate yourself. Think about programming all the time; just don't think very hard, you might hurt yourself. Remember, you've already won!

It just seems to be a very lazy view. Just because you read programming blogs doesn't mean you have knowledge that others don't. Even if it does mean that you have passed some magical level it doesn't mean you're right to just stay at the surface of everything. It just seems pretentious and self-congratulatory.

charles on February 14, 2009 12:30 PM

Jeff, this is so hypocritical. Go back and read your DRY post Curly's Law: Do One Thing, where you actually quote from Bob Martin's Single Responsibility Principle. Now, I am really confused with you about you and Joel were arguing about in your StackOverflow podcast.

I agree with your general principle about not drowning in methodologies and principles, but what you seem to be recommending and what you have actually done are contradictory. You have actually learnt what works for you and use that.

Would you be a better programmer if you didn't learn everything you learnt over the past several years? If so, why are you advocating to others that it is a waste of their time.

Krishna Kumar on February 14, 2009 12:30 PM

Some John Smith originals, not poetic: This is my world and you are just a tourist.


Emanuel Cunt on February 15, 2009 1:43 AM

vb coders != cowboy coders

John on February 15, 2009 2:53 AM

Am I the only one who is afraid of clicking a link named NAMBLA?

Matt on February 15, 2009 3:05 AM

Can someone explain NAMBLA from the point of view of someone
1. not in the USA and pretty unaware of american culture
2. has never heard of NAMBLA
3. has not seen the Southpark episode
4. has no access to youtube
5. cant understand how the main google results for NAMBLA are relevant to a list of programming principles

Leif Eriksen on February 15, 2009 3:36 AM

I vote we throw a book at Jeff. Something like Programming Windows (Charles Petzold) should do. It's a nice heavy volume. Solid, you might say.

For goodness' sake, man, when you make a blog post that betrays a serious ignorance and you get lambasted for it, the last thing you need to go and do is right another completely off-base post, incorporating various stupid elements (religion, NAMBLA) to try and put your point across in a cute manner.

Your golden rules might well work for you, but maybe, just maybe, there are real, honest-to-goodness professionals who adopt a different set of core principles, and perhaps, just perhaps, they work for them.

This lecture on robust code and software quality is, of course, coming from a guy whose web site leaves a hell of a lot to be desired, and who follows no real process for quality - not even a real bug tracker.

Rob on February 15, 2009 3:56 AM

Is NAMBLA the reason programmers get sacked at 40 and why they're mainly male?

other wayne on February 15, 2009 4:14 AM

I've been reading this blog for a while now, and every time I finish an article I get the feeling I'm a worthless programmer.

I don't think it's because I actually am worthless (at least I hope not). I think it's the tone. It feels elitist and condescending. The subject always seems to be, Do you adopt/know about this? If not, you're an idiot! It's painful to read in the same way that I imagine it's painful to be shouted at by a drill sergeant.

I wouldn't be so bold as to demand or even ask for a change. I just thought I had to say my bit.

nichevo on February 15, 2009 6:58 AM

I spend my time learning new web development technologies like RIA, AJAX, and open source web applications. I don't have time to keep up with the latest programming fads being pushed by enterprisy fashionistas.

Robert S. Robbins on February 15, 2009 7:25 AM

Hey Jeff, your Atwood System of Real Ultimate Programming Power list appears as all ones, instead of one through four, in Opera 9.63, because your generated HTML has wrapped your LI items with H1's.

1. DRY
1. KISS
1. YAGNI
1. NAMBLA

Joe Chung on February 15, 2009 8:28 AM

@Leif Eriksen

Google has a great Define feature:
define:NAMBLA

It stands for the North American Man/Boy Love Association.

It is a pedophile organisation. Others have pointed this out before! I can't really find a reference to explain any other meaning.

@Rob
I'm inclined to agree to an extent. For someone who has read so broadly, the development mistakes are staggeringly basic - like the SQL deadlock mistake a few months back. A rookie DBA would have known his thought process was flawed.

So - what does this tell us? Even someone who promotes professionalism in programming will not implement professionalism in programming?

Actually - I don't think that is the full story. I think Jeff actually does a stand up job in development and in the development community. I just think that there might be a lack of objective introspection. That is - how can we rate ourselves when we are never independent?

It is my opinion that, reading every book ever written will help us to become better programers, but to be great programmers we must receive independed objective feedback from our peers (i.e. not management and not customers).

This is only a theory as I have never seen this implemented.


Philip on February 15, 2009 8:32 AM

Jeff, I love your blog and StackOverflow! Keep it up!

Chance on February 15, 2009 9:10 AM

I've come up with the latest programming paradigm! yay!.

FDD , or Fanboy Driven Development.

You get the latest idea or fad in programming , and stuff it down the throat of everyone who's around you , to the extent that you proclaim that any previous code written must be garbage because it doesn't use your throat-stuffing idea.

pizzathief on February 15, 2009 9:25 AM

@philip

thanx - I still really dont understand why its in the list.

some seem to indicate its a joke, in which case I dont get it.

maybe i'll just reference the first 3 - nothing new there.

Leif Eriksen on February 15, 2009 9:28 AM

Jeff,

I tend to be skeptical of new methodologies (though SOLID isn't exactly new) also. I think the reason is that they get overhyped, and then instead of good principles we are innundated with bastardized versions of principles that required refinement and clarification in the first place. For instance, now that Agile has taken the developer community by storm (I haven't consulted at a company in the past year that hasn't claimed to be doing some form of Agile) it is starting to sour, and all we can say is that people aren't doing it right (c.f., Fowler's Flaccid Agile bliki). But if so many people aren't doing it right, wasn't there something wrong, or inherently vague, about the principles in the first place?

Programming is inherently difficult, however, and I don't think assuming that the community is full of dummies (I understand this was rhetorical and you probably don't really think this) is the way to go. The intended audience of these various principles and methodologies is reasonably smart and competent people who may be stuck in shops that don't promote good programming.

The right way to evaluate SCRUM, XP, SOLID, et.al., is whether they are helpful to that kind of audience. If not, then there are problems -- that is, if they are only helpful to the 5% of genius developers out there, then they aren't useful. If they are good for the 75% of developers who are neither geniuses or dummies (me!) then we need to see what is good about them and what could be better.

Thank you for raising the issue, Jeff. Someone of stature really did need to do it. We have lots of methodologies and our code isn't necessarily getting better as a result. In some cases, it may be getting worse.

James Ashley on February 15, 2009 10:41 AM

Yeah, but we still use object oriented programming.

Silvercode on February 15, 2009 10:55 AM

@Leif Eriksen

My assumption is that it actually means something else - but since I can't get You Tube at the moment - I can't confirm that....

Philip on February 15, 2009 10:58 AM

your argument is sound, but it represents a single programmer position. In most places, the programmer does not work alone and needs some supporting workplace. The workplace should support the programmer and provide him with the tools and information.
this might me the team leader or system engineer.
more can be found at:
http://design-to-last.com/index.php/Technical/software-design-rules-made-to-be-broken.html

Daniel

daniel leiderman on February 15, 2009 12:39 PM

Nope. You're still missing it. Papers and books on design patterns and software engineering principles help those who do care. It's not an overarching concern about those who don't.

Should those in the know not share because it will immediately get labeled as you've labeled the SOLID principles? Why even read all those programming books? Why did the GOF waste their time?

Your argument still rings hypocritical.

Stephen R on February 15, 2009 12:40 PM

Jeff,

Your argument about being unreachable is a bit over the top: you either can or cannot stand on your feet as as programmer, architect or whatever you call yourself. Those who can will find information and resources that will give them the edge in the marketplace.

Those who don't will continue their feeble existence. Nobody, including you and your blog will change that. You can throw a digital library on their head and it would not help.

Your blog has become the Enquirer of the technical blogs. I read it for the scandal and gossip.

BugFree on February 16, 2009 1:19 AM

There's one thing you can do trying to keep up with progress or code like you always did. If you started in maybe Fortran, Basic, VB, ASP or maybe PHP - you continue to script your code in good old plain procedural programming. Too much OO slows you down...
New shiny thing,,, i don't give a damn - I code it like I used to, get the machine obey my will, not the other way around...
And you don't get more paid if you code spaghetti or nice code when your boss asks for results, time is money!!!
Ideals are good in a perfect world - I could say the search for programming utopia or something...

Wanko on February 16, 2009 1:41 AM

It'll never catch on, ASRUPP is not a catchy acronym. I wonder how often the acronym comes first. I mean 'SOLID' principles to create solid code - what are the chances of that ;-)

My name is Dave and I can't stop thinking about programming.

Because it's a highly creative process and inspiration can come from anywhere at anytime.

Skizz on February 16, 2009 2:04 AM

I'm terribly suspicious of some of the dates presented for real paradigms (that is, NOT Agile/Scrum/XP/whatever nonsense). Structured programming is older than 1969, even if it was not expressed as a concept until around then, and object oriented programming is FAR older than 1990; indeed, there has been nothing of particular interest new in object oriented programming SINCE 1990.

Robert Synnott on February 16, 2009 2:21 AM

Just a quick comment on YAGNI.

YAGNI assumes you are only writing code for yourself. YAGNI is a principle that only applies to one-man-companies or very small companies, where I can simply type into a chat Hey Paul, could you please implement a function to do XYZ and he'll reply Sure, will be done it two hours.

Everything a little bigger than that will fail horribly if you program according to YAGNI. I'm writing a lot of libraries other people will use. I may not need a certain function, but I would be a moron to assume just because I don't need it nobody else will. As a library developer I have to foresee what OTHER people will need. And since that is impossible (I'm no fortuneteller), I must implement everything any developer *might* need one day. I have a time schedule, I cannot leave half of the functions out and just implement them if someone asks me for that, I must implement it when my time schedule says Work on that library and everything that is not there won't be there, regardless if someone needs it. That's how it works once you have 10+ developers in a company.

Mecki on February 16, 2009 2:31 AM

You could at least have signalled that the nambla link is nsfw. I thought I could trust the links on this site. In future I'm going to have to hover over each one and check the URL - just like on some cheesy el cheapo waste of time blog.

dan on February 16, 2009 2:39 AM

@Wanko -

Yes, there is no perfect solution or code base. And you'll be surprised to learn that there can be quite a pay difference between code coders and spaghetti coders or those who can design something flexible and those who can't. Try getting through an interview where I work. You won't.

It's about being a professional and personal responsibility. The best in any profession do this. Jeff does this too - don't misinterpret. Spaghetti is crap. No one here encourages crap.

Stephen R on February 16, 2009 2:47 AM

2002 Enterprise Unified Process
2003 Rational Unified Process
2004 Constructionist Design Methodology
2005 Agile Unified Process

Too much churn, it takes time to learn something and more time to master. Your better off using a process well rather than the lastest badly!

Bob on February 16, 2009 3:00 AM

The plural of Jeremy is NOT Jeremies.

Jeremy on February 16, 2009 3:42 AM

Console: To me the basic point here is that there are no silver bullets.

It always amazes me how many people just say that there are no silver bullets, indirectly indicating that nothing can make things better.

What No Silver Bullet really asserts is that no single software engineering development will produce an order-of-magnitude improvement in programming productivity within ten years (quoted from No Silver Bullet Refired). It also says that a tenfold improvement is possible incrementally through many efforts.

Nobody is claiming that SOLID, TDD etc. would produce an order-of-magnitude (10x) improvement. But if it would produce 2x, 1.5x, or even 1.1x improvement in productivity or quality, do you not think that it would be worth the effort to learn how to do it? They might very well be part of those incremental efforts that Brooks advocates in No Silver Bullet.

Esko Luontola on February 16, 2009 3:49 AM

@Jeff
the types of programmers who would most benefit from these guidelines, rules, principles, and checklists are the least likely to read and follow them

Seems a pretty big assumption to make. Inexperienced programmers would benefit from them, for example. There are certainly developers out there who are quite resistant to improvement, but that doesn't mean these guidelines are irrelevant.

Are you suggesting that good ways to program not be documented? Not everyone will be in a position to be mentored well, and things like this are a way of promulgating the collective wisdom of better developers.

How did you get better at programming? By being directly taught, or by reading things like this and thinking about them?

It seems kind of obvious to me that you have read about these things, so I don't see why you think no-one else should.

Also, you have at least one of those dates wrong. RUP dates from the 90s sometime, as the Kruchten book dates from then

http://www.amazon.com/Rational-Unified-Process-Philippe-Kruchten/dp/3827315433/ref=sr_1_5?ie=UTF8s=booksqid=1234786008sr=8-5

Jim Cooper on February 16, 2009 4:10 AM


Also, object oriented programming dates from at least 1967

Jim Cooper on February 16, 2009 4:10 AM

And Scrum is from no later than 1995

Jim Cooper on February 16, 2009 4:12 AM

I assume that the point of the NAMBLA joke is to hint that this whole post is a joke.

When you reduce common sense statements to simple-minded slogans, the true intent gets lost, and you lose sight of why they matter, and when they should be avoided. All of the fundamental abbreviations are as dangerous as NAMBLA if you don't understand what they actually mean.

At least I'm guessing that's Jeff's point. To be honest I'm finding it increasingly difficult to follow any of these recent posts, and wish he'd actually stop throwing in all these meaningless metaphores, and just explain what the problem with SOLID is.

Steve W on February 16, 2009 4:36 AM

More comments»

Verify your Comment

Previewing your Comment

This is only a preview. Your comment has not yet been posted.

Working...
Your comment could not be posted. Error type:
Your comment has been posted. Post another comment

The letters and numbers you entered did not match the image. Please try again.

As a final step before posting your comment, enter the letters and numbers you see in the image below. This prevents automated programs from posting comments.

Having trouble reading this image? View an alternate.

Working...

Post a comment

Content (c) 2009 Jeff Atwood. Logo image used with permission of the author. (c) 1993 Steven C. McConnell. All Rights Reserved.