Revisiting The Facts and Fallacies of Software Engineering

March 25, 2008

I like to re-read my favorite books every few years, so I brought Robert Glass' seminal Facts and Fallacies of Software Engineering with me on my most recent trip. I thought it was a decent, but imperfect read when I originally bought it in 2004. As I scanned through the introduction and table of contents, I realized that I've written about almost everything in this book by now.

Facts and Fallacies of Software Engineering

I'm not sure I gave Facts and Fallacies its due on my first read.

Simply reciting the various facts and fallacies feels like a zen koan to software engineering. Even without any of the background discussion and explanation in the book, it's therapeutic to ponder the brief one sentence summaries presented in the table of contents. As you read these, what comes to mind, based on your experience?

People

  1. The most important factor in software work is the quality of the programmers.
  2. The best programmers are up to 28 times better than the worst programmers.
  3. Adding people to a late project makes it later.
  4. The working environment has a profound impact on productivity and quality.

Tools and Techniques

  1. Hype (about tools and technology) is a plague on the house of software.
  2. New tools and techniques cause an initial loss of productivity / quality.
  3. Software developers talk a lot about tools, but seldom use them.

Estimation

  1. One of the two most common causes of runaway projects is poor estimation.
  2. Software estimation usually occurs at the wrong time.
  3. Software estimation is usually done by the wrong people.
  4. Software estimates are rarely corrected as the project proceeds.
  5. It is not surprising that software estimates are bad. But we live and die by them anyway!
  6. There is a disconnect between software management and their programmers.
  7. The answer to a feasability study is almost always "yes".

Reuse

  1. Reuse-in-the-small is a solved problem.
  2. Reuse-in-the-large remains a mostly unsolved problem.
  3. Reuse-in-the-large works best in families of related systems.
  4. Reuseable components are three times as hard to build and should be tried out in three different settings.
  5. Modification of reused code is particularly error-prone.
  6. Design pattern reuse is one solution to the problems of code reuse.

Requirements

  1. One of the two most common causes of runaway projects is unstable requirements.
  2. Requirements errors are the most expensive to fix during production.
  3. Missing requirements are the hardest requirements errors to correct.

Design

  1. Explicit requirements 'explode' as implicit requirements for a solution evolve.
  2. There is seldom one best design solution to a software problem.
  3. Design is a complex, iterative process. Initial design solutions are usually wrong and certainly not optimal.

Coding

  1. Designer 'primitives' rarely match programmer 'primitives'.
  2. COBOL is a very bad language, but all the others are so much worse.

Error removal

  1. Error removal is the most time-consuming phase of the lifecycle.

Testing

  1. Software is usually tested at best to the 55 to 60 percent coverage level.
  2. 100 percent test coverage is still far from enough.
  3. Test tools are essential, but rarely used.
  4. Test automation rarely is. Most testing activities cannot be automated.
  5. Programmer-created, built-in debug code is an important supplement to testing tools.

Reviews and Inspections

  1. Rigorous inspections can remove up to 90 percent of errors before the first test case is run.
  2. Rigorous inspections should not replace testing.
  3. Post-delivery reviews, postmortems, and retrospectives are important and seldom performed.
  4. Reviews are both technical and sociological, and both factors must be accommodated.

Maintenance

  1. Maintenance typically consumes 40 to 80 percent of software costs. It is probably the most important software lifecycle phase.
  2. Enhancements represent roughly 60 percent of maintenance costs.
  3. Maintenance is a solution-- not a problem.
  4. Understanding the existing product is the most difficult maintenance task.
  5. Better methods lead to more maintenance, not less.

Quality

  1. Quality is a collection of attributes.
  2. Quality is not user satisfaction, meeting requirements, achieving cost and schedule, or reliability.

Reliability

  1. There are errors that most programmers tend to make.
  2. Errors tend to cluster.
  3. There is no single best approach to software error removal.
  4. Residual errors will always persist. The goal should be to minimize or eliminate severe errors.

Efficiency

  1. Efficiency stems more from good design than good coding.
  2. High-order language code can be about 90 percent as efficient as comparable assembler code.
  3. There are tradeoffs between optimizing for time and optimizing for space.

Research

  1. Many researchers advocate rather than investigate.

I had forgotten how much ground the book covers; it's a perfect springboard to all the essential topics in software engineering.

I've posted on almost every one of these facts in the intervening four years since I originally read them. As I delved into the table of contents presented above, I could barely contain myself. I remembered and mentally checked each post off the list as I went: check, check, check. I've been accused of gratuitous self-linking in the past, so I won't clutter up the rules with dozens of links to my old posts on these topics. If you're interested, you can find it. That's sort of the point.

If those are the fifty-five facts, then these are the ten fallacies presented at the end. Fallacies have the ring of truth, but upon closer inspection, turn out to be problematic when applied to a real live software project.

  1. You can't manage what you can't measure.
  2. You can manage quality into a software product.
  3. Programming can and should be egoless.
  4. Tools and techniques: one size fits all.
  5. Software needs more methodologies.
  6. To estimate cost and schedule, first estimate lines of code.
  7. Random test input is a good way to optimize testing.
  8. "Given enough eyeballs, all bugs are shallow".
  9. The way to preduct future maintenance costs and to make product replacement decisions is to look at past cost data.
  10. You teach people how to program by showing them how to write programs.

If you're curious about the rationale behind these facts and fallacies, that's entirely the reason the book exists: to remind us to question what we're doing. We should be thinking about our craft every day, in some small way, on our own software projects. That's how we collectively advance software engineering-- by building our shared memory and history in the field. As Mr. Glass states in the introduction:

In presenting these facts, I am also indentifying problems in the field. It is not my intention to present solutions to these problems. This is a what-is book, not a how-to book. That's important to me. I want to bring these facts into the open, where they can be freely discussed, and we can act on them to make progress.

I encourage you to pick up a copy of the full book for a deeper exploration. I do believe there's a rich learning experience-- or a rich remembering experience-- here for those of you who choose to read on.

Posted by Jeff Atwood
82 Comments

You'd do good to write a post detailing your top book purchases of all time ^_^

Tom J Nowell on March 25, 2008 9:10 AM

"I realized that I've written about almost everything in this book by now."

Yes, you HAVE pasted other people's thoughts on all of the subjects covered in this wonderful book. And then linked to your old posts about the exact same things over and over again.

Sean on March 25, 2008 9:10 AM

Fantastic book. I really enjoy Robert Glass' writing. Here is a guy who doesn't jump into the hype machine. Everything is clean and balanced and forces you to think about what he says. I also enjoy his columns in the Communications of the ACM. His column is always the first page I read.

siddhi on March 25, 2008 9:47 AM

Heh... No. 7 brought me a smile xD

7. Software developers talk a lot about tools, but seldom use them.

Kindler Chase on March 25, 2008 9:58 AM

wow, i'm impressed!

sikantis on March 25, 2008 10:03 AM

This has piqued my curiousity...

30. COBOL is a very bad language, but all the others are so much worse.

Can anyone who's read the book elaborate?

Gunther on March 25, 2008 10:08 AM

Agreed... Jeff, would you consider updating your must-read/all-time-favorite book list?

Cheers!

Patrick on March 25, 2008 10:15 AM

Reading this table of contents actual depressed me in some ways. I must have read a half dozen books that cover the contents and they all ring true, but the frustrating part is the effort it takes to work on any issue when the majority of your company doesn't share the same view.

To me this table of contents is a great bullet point list that non-software engineers should read. I personally work in the games industry and I think that many of the other disciplines (art, design and management) really don't understand anything about building software. Some of them have been doing it for years but I don't think they realize the truth of the statements in the list.

It kind of reminds me of a comment one of my friends made at work about STL code. We both love it but we realize that you have to code to the lowest common denominator of education to have a reusable and maintainable code base. Maybe our game studio is a bit in the dark ages in not pushing people to learn these new skills, but I find this table of contents a similar kind of problem where if other people in my company do not get creating software (an example would be only budgeting 20% of the software cycle for bug fixing and no maintenance budget at all) it just makes me want to stop reading and start fixing things with what I know already.

To end this long rant, perhaps this is something I would add to the list:
"Many engineers know more about software management than their managers, few of them want anyone to find out they do lest they will have to manage"

Jay on March 25, 2008 10:57 AM

I've never read the book, but I've probably crawled through every post on this Blog looking for useful tidbits to bring to my student life. It's shocking how little students are taught about these very issues you write about, and I'm grateful to you for doing so.

Regardless, I will definitely be purchasing this book.

Mike B on March 25, 2008 11:36 AM

"Yes, you HAVE pasted other people's thoughts on all of the subjects covered in this wonderful book. And then linked to your old posts about the exact same things over and over again."

Ah, I see; Jeff's blog sucks. Why are you commenting then? Don't you have better things to do?

I too am interested in #30.

I am buying the book, I have yet to be steered wrong about a recommendation here.

Geekstrada on March 25, 2008 11:42 AM

Jeff, I have been a software professional for 17 years now and can attest to (and have experience with) almost everything Robert Glass (and other authors have been extolling for years) says in his Facts and Fallacies.

However, I have a bone to pick with you – it is your usage of the word “craft.” Software engineering and craft do not mix. Jeff, I think you are doing a disservice to our industry. Software engineering is just that – an engineering discipline. In fact, here in British Columbia, Canada, you can become a Professional Software Engineer, complete with a P.ENG designation and be legally liable for the designs and code we produce - http://softwareindustrialization.com/PreparingTheWorldForSoftwareEngineeringPart1.aspx

I believe thinking about software engineering as a “craft” is yet another fallacy of our business. I work with electronics and mechanical “engineers” who laugh at our UML stickman and the like – and for good reason – its embarrassing man! We are so unindustrialized!

Instead of re-reading what we already know about our industry, why aren’t we actively doing something about it? Particularly you Jeff – you command a huge audience – you can have a major influence on what people do in our industry. Don’t have them just read (btw, you might want to go right back to the roots of software engineering - http://www.princeton.edu/~hos/mike/articles/sweroots.pdf ) about software engineering – get them to actively do some software engineering!

Mitch Barnett on March 25, 2008 12:05 PM

Mitch, I really like your point:
"Software engineering and craft do not mix. Jeff, I think you are doing a disservice to our industry."

However, I have a bone to pick with this as well and it is mostly about scale of development. I personally don't believe that most software needs engineering. I think it is ridiculous that people use the term software engineering for what is essentially construction work. I think that we have a lot of work that needs doing by people that know the basics of coding. I think you will see small, very well written applications by software craftsmen that are the peak of this industry and I think that we need software architects and software engineers to build systems that are more complicated and need long term vision and support. I think all of these terms are applicable and the issue is that a manager can't tell a software construction worker from a crafts person or an engineer.

So...I agree that we should push for software engineering to be an actual engineering profession, but I think we should allow the language an niches for those that fit the other descriptions.

Out of interest, being legal liable for code - how do you deal with the 2% (or something around there) cases where the code outside of your own may cause a catastrophe? I always wonder what that is like since I work in an industry where we depend on numerous technologies that aren't "engineered" and I cannot picture signing off on code I never reviewed.

Jay on March 25, 2008 12:22 PM

True. Thanks for an advice and your post.

Jimmy on March 26, 2008 2:07 AM

I've been accused of gratuitous self-linking in the past

Aw man. I like the self-linking. I guess people who’ve been regular readers for years (and have really good memories) might find it annoying, but to me it’s the perfect way to get introduced to your archives: articles relevant to the one I’m reading now.

Paul D. Waite on March 26, 2008 2:11 AM

Why do people keep having the stupid debate about is programming engineering, art, craftsmanship, whatever? It's not important in the least, just call it software development, or programming, and leave the question of which discipline it falls under alone.

Bernard on March 26, 2008 2:14 AM

Nice post! I've read some ob Robert Glass' books, but not this one. I may have to have it.

I would like to add to the list of good books suitable for all software engineers is Gause, Weinberg, "Exploring Requirements: Quality Before Design". This book was very influential for me. It changed some of what is now my Personal Software Process.

Another favorite way back when: Allan Holub, "Enough Rope to Shoot Yourself In the Foot". Specifically on programming technique. Focused on C/C++. It's been a while.

Lorenzo on March 26, 2008 2:16 AM

heh, wish I had thought of this earlier when I was composing my first comment.

"The quality of a software product is a direct function of the process used to produce it." -- Weinberg (I think). Anyway, it is a good rule of thumb.

Producing software that only I will use takes effort 1.

Producing software that others will use where those others will always have personal access to me takes effort 10.

Producing software that others will use where those others will never have personal access to me takes effort 100.

Lorenzo on March 26, 2008 2:20 AM

Better methods lead to more maintenance, not less.

Could this be Jevons paradox at work? I am not sure. What do you think?

http://en.wikipedia.org/wiki/Jevon%27s_paradox

"""
One way to understand the Jevons Paradox is to observe that an increase in the efficiency with which a resource (e.g., fuel) is used causes a decrease in the price of that resource when measured in terms of what it can achieve (e.g., work). Generally speaking, a decrease in price of a good or service will increase the quantity demanded (see supply and demand, price elasticity of demand). Thus with a lower price for work, more work will be "purchased". This increase in quantity demanded may or may not be large enough to offset the original efficiency gain.
"""

Tony Stratton on March 26, 2008 2:39 AM

In the country where I studied, Software was a part of the Engineering dept. There was no Computer Science, as such, all engineers had to spend 2 years taking the same foundational courses, no matter if they wanted to be an Industrial or Software engineer.

Looking back at it, I'd say those first 2 years were the most important, as any real software developer studies programing on their own during their entire career and probably even before going to school.

BoredGuyAtWork on March 26, 2008 2:48 AM

I like the self-linking too. Since I haven't read all your old posts, it gives me some more interesting reading without having to dig through the archives myself.

Lance Fisher on March 26, 2008 2:53 AM

If peeple write code as well as they write blog posts then indeed outsourcing is around for a long time.

Pardeep Singh on March 26, 2008 2:54 AM

I've been accused of gratuitous self-linking in the past

And I nearly posted a comment asking you to link to your earlier posts.

Spoon-feeding, anyone?

Arun Philip on March 26, 2008 3:42 AM

And you said you wouldn't become a full-time blogger.

:P

kevin on March 26, 2008 3:50 AM

Oh My, How do you people ever get anything done!

Judy on March 26, 2008 4:01 AM

Hey Judy, that's what I'm asking myself every time I scroll through this blog. Yes I know, why then read the blog I can hear them ask? Well once in a while there is an interesting link to another site. That's it all worth.

NickB on March 26, 2008 4:19 AM

Great post !!!
On reuse, I would add:
"re-use is just a nice side-effect"

Mickael on March 26, 2008 4:45 AM

Thanks for the recommendation. Another good book to improve my witchcraft... er, I mean software craftmanship (my background is mechanical engineering).

BTW, what's wrong with self-link? I like links! As long as it's useful, why not? It's not like there's an obligation to click or anything. Keep it coming Jeff.

Paulus on March 26, 2008 4:48 AM

I second (third?) the self-linking. The comment before about reading other relevant content is absolutely precise. I think the "gratuitous self-linking" comment came from the post on Paul Graham which invoked a little anger in a few people. But really, what is the point in writing a blog if you don't promote your own writing?

As for the discipline of Software Engineering - I think it's something which will need to grow a great deal in the coming years, and education of it for students as an extension of that. The entire content of my single "Software Engineering" module during university (3 yrs ago) was the Rational Unified Process - we spent so long drawing use-cases and sequence diagrams, I don't think anybody understood what Software Engineering was actually supposed to be.

mafro on March 26, 2008 5:33 AM

Wow, it was weird seeing a picture on here of the one computer science book I felt was good enough to keep around after college. The only things I can really criticize are minor. Here's one thing to nitpick:

Placing a number like "28 times better" on programming skills assumes that everyone is capable of coding anything given to them and that the best programmers are simply much faster at doing so. However, I think we can all agree that the ability to figure out *how* to design something in the first place is a gift in and of itself, and it shouldn't be taken for granted. Some people are simply much, much better problem solvers than others.

Mike on March 26, 2008 5:36 AM

I think I'll grow a beard.

yu fin on March 26, 2008 6:21 AM

Some additional thoughts I had based on my experience in certain segments of the industry:

1. Smaller teams are more productive teams. Larger teams result in layers of virtual paper pushers and "managers" who generally get in the way and waste resources (time, office space, computer pool dollars).

2. Meetings are seldom as useful as people think they'll be. Most communication can be done more effectively in an asynchronous fashion using e-mail, wikis and issue trackers.

3. Teams that don't insist that they have final decision on additions to the development team are asking to be stuck with someone who is underskilled or able to snowball the interviewer/manager. Senior developers ought to be very interested in the hiring process because they're likely to be the ones who have to deal with the boat anchors they'll get otherwise.

4. Communication is a key ingredient in software development. Teams need easy, quick ways to communicate that don't become a distraction to progress. Good communications between the end-users, the testers, the developers and all other stake holders helps to minimize misunderstandings. This is one area where smaller teams can excel, specifically because there are less folks to keep in the loop.

Just one Smurf's opinion.

Hefty Smurf on March 26, 2008 6:28 AM

Q. How many Open Source developers does it take to screw in a lightbulb?

A. One to screw it in. One to write the FAQ. Ten to test it. One to respond to forum posts about how to screw in a lightbulb. Two to decide they would do it differently, so leave to create a fork. A thousand to debate whether anyone should be using a proprietary light bulb. Four to develop a free lighbulb. Ten to test it. One to write the FAQ.

Andrew on March 26, 2008 6:40 AM

I also like the self linking, mainly because I've only been reading your blog for 6 months.

Also, do please write a revises must-read list, and don't be afraid to make it too long.

Grogs on March 26, 2008 6:46 AM

Excellent post again.

I also recommend Robert's latest book: Software Creativity 2.0.

It is really a good book that makes you think about the nature of software engineering based on past studies and historical data from real-life example. In his book, Robert always presents pros and cons for every topic he talks about: for instance theory vs practice, or discipline vs flexibility or process vs product. This allows us to create our own judgment and vision of why creativity is required in the software engineering field.

I also agree with a lot of readers: Jeff, updating your must-read/all-time-favorite book list would be great ! :)
Thanks !

Phil on March 26, 2008 6:49 AM

#30. COBOL is a very bad language, but all the others are so much worse.

Practical Programmer
Robert L. Glass
Cobol—A Contradiction and an Enigma

http://delivery.acm.org/10.1145/270000/260752/p11-glass.pdf?key1=260752key2=6678756021coll=GUIDEdl=GUIDECFID=61154436CFTOKEN=15120537

Stephen on March 26, 2008 6:49 AM

So it's not just McConnell who is picking up on these mistakes. Heh...now we just need to actually get people to heed these problems and actively DO something about them.

As a side-note, does your host have a tagging feature? It seems easier to just tag posts and have a related posts panel on the side/at the bottom. I don't mind self-linking at all, but why put all the effort into it when you can have the work done for you? After all, that's what computers are for, no? :)

James on March 26, 2008 7:11 AM

In Soviet Russia, software engineers you!

Kevin Fairchild on March 26, 2008 7:22 AM

What a superb list. It really does explain everything that's wrong with the management of this industry. Too bad it doesn't bring solutions. It can't bring solutions because the only people who will read it are the people who don't need it.

Well, that's where I come in. Software engineering manager extraordinaire. If your company displays all the problems cited in that list, just contract me for one day. My crack team of professionals will take care of any overly competent informed expert engineer who revealed those problems in your organization. Yes that's right, there's no silver bullet, we use:

The Steel Bullet on March 26, 2008 7:34 AM

It's frustrating to see all of us bitching about the same things we were bitching about 25 years ago. If we were so smart we might have gotten a lot of this figured out by now. My observation: there are no "stupid" people or "idiots" in this industry. There are, however, egos, egos and more egos. But don't ask the one developer who is "28 times better" than another developer.

PaulG. on March 26, 2008 7:36 AM

Some additional thoughts:

* take advantage of tools and methods like version control, continous integration, wikis, etc.
* developers make bad testers (at least on the long run)

By the way, keep up your self linking. People that dont like the links dont have to click on them. To the others this is a great service.

Florian Potschka on March 26, 2008 7:37 AM

Great post. And completely agree with Jay's first response on here. This is "is a great bullet point list that non-software engineers should read". I work as a tech pm in an ad agency, so I'm somewhere between the developers and the rest of the company. Reading through this was like a check list for where we go wrong on so many projects. While it's great to see acknowledgement on the outside that other people hit the same frustrations I do, my first reaction was how do I get the people I work with, the creative people, the strategy people and the sales people, to appreciate and understand these issues.

We've hit them so many times yet still I see timelines and budgets with no time for fixing bugs or maintaining code beyond a launch date and when things invariably go wrong the solution is to throw more people at the problem meaning it can branch into several more problems and cost yet more money.

Would be great if anyone is aware of any resources out there that discuss overcoming these problems. Or should I just buy the book?

Jake on March 26, 2008 7:46 AM

I see you added another side ad. Is Jeff a full-time blogger now?

Joe Beam on March 26, 2008 7:49 AM

I'm a definite Bob Glass fan-boy, I always dive for his article in the Communication of the ACM. If we could only get all the Project Managers and CXO's of the world to read this book along with Peopleware...

Adam Kahtava on March 26, 2008 7:53 AM

13. There is a disconnect between software management and their programmers.

I noticed that maybe half of the 55 facts apply to management more than to the programmer. That is one reason why PaulG's comment "Its frustrating to see us all bitching about the same things we were bitching about 25 years ago..." is true and will remain true.

I've tried managing a medium software project and it was hard. But what made it hell was the governance that the Corporate IT organization had established. They used the toll-gate method (kind of like the waterfall, but more starts and stops) where you had to estimate cost at Scope, Requirements Design before you could begin Construction. And none of the estimates could vary more than 10%.

I appreciate Coding Horror because I want to do what I can to be a better programmer (and its usually really entertaining). Could someone get a "CIO Horror" blog or write a book to get the guys at the top in-line with reality?

For what its worth, my manager and his manager are awesome technologists and managers. They represent the 2% of management that get it right. (I made the 2% up, but it feels about right.)

Jeff Schwandt on March 26, 2008 8:45 AM

Software Engineering is a Joke.

Check this out this statement:
http://dewitters.koonsolo.com/sejoke.html

Sooo true; true engineers try to find that "Engineering" property in software because their are used to it in their other professions, and can't accept how different creating software is, once it exceed certain size. (not talking about micro-controler code here)

Pointernil on March 26, 2008 9:12 AM

The thing that sticks out in that list of items is that they are all negative statements. I do hope those sections are constructive instead of just problem statement after problem statement.

Your book isn't very interesting if it only says "don't do this, don't do that" -- it must tell me what DOES work, and I argue that finding out what does work is where the value is.

Martin on March 26, 2008 9:20 AM

Lord, your hypocrisy is amazing, Jeff.

You get on Paul Graham's case because he came off as ... gosh... how did you put it... "Participatory Narcissism".

Then you go and start an article with this: "I realized that I've written about almost everything in this book by now."

This is no different than what P.G. does, except for one thing... P.G. is encouraging people to help themselves and you are writing prescriptions for us (apparently) ignorant masses.

Your blog's a joke. I'm going to have to unsubscribe.

Collin Cusce on March 26, 2008 9:29 AM

I'd add this to Glass' list:

The cost savings of outsourcing are usually overwhelmed up by the friction it adds to any software development process.

Richard on March 26, 2008 9:42 AM

@Jay: amen, brother. I'm in the middle of fixing a heavily multithreaded C++ app written by people who didn't quite understand multithreading or C++.

Richard on March 26, 2008 9:49 AM

I've completed (much better) stuff in two hours that takes other people 2 weeks to finish, does that change the rule to "up to 40 times better"?

Eber Irigoyen on March 26, 2008 9:58 AM

"there are no "stupid" people or "idiots" in this industry."

Hahahahahahaha.

E on March 26, 2008 10:03 AM

Regarding point 2. The best programmers are up to 28 times better than the worst programmers.

The amount of times i've fixed and still have to fix stupidity errors caused by useless programmers is insane.

BTW, These people are the ones that say they dont touch a computer outside of work hours.

I belive programming is more than just a 9-5. Its a passion that you need to keep up with. Our landscape changes daily and being on top of it requires a certain interest in the subject.

Such as reading blogs like this. Sure its not a definite sign of a good programmer, but its a good way to weed out a lot of useless ones :)

Shaun on March 26, 2008 10:15 AM

I appreciate Coding Horror because I want to do what I can to be a better programmer (and its usually really entertaining). Could someone get a "CIO Horror" blog or write a book to get the guys at the top in-line with reality?

This is an interesting comment, because that's essentially what Steve McConnell does now at Construx. Many of their seminars are targeted toward powerful CIO level people, and I always wondered why. Maybe now we know.

Jeff Atwood on March 26, 2008 11:22 AM

+1 for "Who cares if we call it engineering or craft?" It's both.

As a new subscriber the only thing I don't like about the self-linking is that it takes an hour to make it thru a post. Love the blog Jeff.

@Eber, with all your extra time maybe you should work on your blog. It looks a mess in IE.

MattH on March 26, 2008 11:31 AM

I recently gave this book as a gift to a project manager friend as she moved to a new company. I thought the material was broad enough to give a good idea of the issues involved in software development without requiring the reader to be a hardcore techie. This was one of the best books on software I'd read in a long time, for all the reasons listed in the above comments and more. I'm going through Michael Feathers' "Working with Legacy Code" book. So far, it's turning out to be just as good as this Glass book, but with a more practical day to day impact.

Michael Kimsal on March 26, 2008 11:34 AM

Great post. I'd also recommend these books:
The Pragmatic Programmer
Code Complete
Smart and Gets Things Done

My thoughts on some the one-sentence summaries:

The most important factor in software work is the quality of the programmers.

I totally agree. In the end, people do the work, not a programming language, process, or technology.

The best programmers are up to 28 times better than the worst programmers

I agree that great programmers are many times better than others. How'd they come up with 28? Must have referred to some actual study.

Software estimation is usually done by the wrong people.

Some companies allow engineers to estimate the time to do their work and I guess other companies don't. If an engineer is not allowed to estimate, then I'd recommend finding a better job that does.

Chris on March 26, 2008 11:54 AM

'I've been accused of gratuitous self-linking in the past, so I won't clutter up the rules with dozens of links to my old posts on these topics.'
Jeff the only people making these kind of complaints are people who don't like you or your blog, don't listen. It's a great way to introduce new vistors to the depth and quality of your writing. If it's relevant then it makes sense.

o.s on March 26, 2008 11:58 AM

"Yes, you HAVE pasted other people's thoughts on all of the subjects covered in this wonderful book. And then linked to your old posts about the exact same things over and over again."

I enjoy that Jeff shares what he reads in books, comments and wherever and adds his thoughts to it. It's like reading concentrated wisdom.

I'd read this blog even if it was all quotes. It's still been filtered by someone with a clue.

0gleth0rpe on March 26, 2008 1:50 PM

@collin

Where d'you get your troll costume? Think to yourself, would you say this to someone's face? If not it's a troll.

Paul Graham is the one who first pointed out that "software engineering" is a craft (at least to me) in "Hackers and Painters", which is all available on line. I don't get any conflict with what Jeff and PG say. Just different perspectives, different perspectives that help us all understand things better.

I don't remember Jeff having a go at PG, but hey, you put yourself in the public domain you will get criticised. So what? They are both trying very hard to help the rest of us make sense of things, and doing a good job.

Let's see what you have to say Collin? Eh? Then maybe we can make our minds up about your contribution.

Francis Fish on March 27, 2008 3:02 AM

Nos. 5, 6, and (less so) 7 all make me happy to see in print.

Fortunately, while my Overlord is keen on all sorts of New Shiny Things, he usually doesn't try to make us use them because they're New Shiny Things, until they've actually been evaluated and found to produce actual benefit.

(Of course, when there Iis/i actual benefit, the loss from #6 is more than recouped by the eventual gain.

Those in the Windows world may recall the transition to .NET - or those that haven't yet made it... what're you waiting for?)

Sigivald on March 27, 2008 3:12 AM

@Mitch Barnett

One just has to read the following to (re-)realise that the concept of "software engineering" is a joke.
http://blogs.msdn.com/ralflammel/archive/2008/03/27/about-the-fundamental-notion-of-software-languages.aspx

daemoncoder on March 28, 2008 7:12 AM

Way cool! I had my copy out yesterday.

I was expounding on Fact 33, and the part that says "Roughly 35 percent of software defects emerge from missing logic path..."

Of course, we had a missing logic path.

Tony Wesley on March 28, 2008 10:50 AM

I do international humanitarian work. Not a coding bone in my body (I topped out at BASIC thirty years ago). Most of that list, with a few tweaks for different practice and jargon, fits the international aid business too. I'm always on the lookout for new framing and new ways of thinking around the problems identified by Glass, so I'll pick up his book too.

Regarding #7, I've found that there are two types of people in the (international humanitarian aid) world: tool users and non-tool users. Non-tool users talk about tools constantly - mostly to explain why they can't possibly use this particular one on this project because the tool doesn't do X. Tool users don't talk about tools except to teach them; they're too busy using them to get stuff done.

Jesse on March 28, 2008 11:49 AM

An interesting set of topics for discussion, but at a quick glance, it seems to make a big point about programmers and a further related point about management.

What about design?

Surely that deserves more importance in the quality and functionality of delivered software

John Rutter on April 1, 2008 9:20 AM

I found all facts quite interesting, but I got stuck with quality:

"47. Quality is not user satisfaction, meeting requirements, achieving cost and schedule, or reliability."

What is quality then? How do you measure quality?
What are the attributes of number 46.? Aren't those attributes to be specified anywhere and then we have to meet these requirements in the process?

This sounds quite esoteric to me.

Jrgen on April 3, 2008 4:05 AM

@Mitch,
Your concept of real engineering is flawed. The best engineers I know tinker. What you perceive as real engineering is the outcome -- it's the finished product.

This fallacy of engineering taught in academia is flawed. This is one of the reasons Toyota is still beating the pants out of us, even on our own soil using the same American factories and using the same American workers. Toyota gets engineering.
--Stephan

Stephan Branczyk on April 10, 2008 2:22 AM

www.joeymonk.com for bonus codes that's joeymonk

Joey on May 6, 2008 12:34 PM

http://www.joeymonk.com

Joey on May 6, 2008 12:34 PM

@Stephan - I have worked with electronics engineers and we built real products - http://www.develcon.com/ These are not tinkerings otherwise we would not still be in business 25 years later.

I perceive engineering as the design of software. I believe what Jack Reeves believes - http://www.developerdotstar.com/mag/articles/reeves_design_main.html

And if you must know the truth about software engineering http://softwareindustrialization.com/TheTruthAboutSoftwareEngineering.aspx

Mitch Barnett on May 12, 2008 4:57 AM

Which post was it that said software engineering was like building a bridge... on jupiter with materials that didn't exist five years ago?

If you want software engineering to be as disciplined as electrical or mechanical engineering, we'd all still be programming COBOL on mainframes. Computer science software development have evolved too quickly for standard engineering practices to emerge. Some of the best practices of only 10-20 years ago have become bad practice today (Jeff - that's a perfect topic for another article). I don't think this phenomenon occurs in other fields of engineering, at least not on this short a timescale.

KG on May 12, 2008 5:09 AM

hmm.... sounds like a good read. off to amazon...

nick on May 27, 2008 7:57 AM

i dont found anything interesting here
calypsonaveen
=================================================================
There are a lot of sites out there showing book video. BookVideoTV, BookTelevision and of course CSPAN, but I like how BN.com and Reader's Entertainment TV have specific genre channels and original shows. There's just more to see and I can be specific in what genre I'm interested in. Anyone else watch online tv?

calypsonaveen on June 14, 2008 6:47 AM

Excellent post. I have learnt a thing or two so thank you!

Nasir on September 17, 2008 2:22 AM

I actually read this book.

@Gunther and others: fact 30 is about COBOL being a 'bad' language for business data processing, being pretty old and 'laughed at'. But actually (and factual) it's not dead yet, and still no demise in use is seen.

@Tony: Yes, fact 45 is a Jevon paradox. If enhancing maintenance can be performed more efficient, there will be a higher demand for even more enhancements.

@Jake: no need to buy the book for that, there are no 'answers' to the problems behind the facts.

@Eber: fact 2 is referring to a specific research result. That is the factual information, it doesn't change because you measured something else.

@Jrgen: don't worry, that's Glass getting picky about his personal definition of quality.

Albert on February 26, 2009 6:16 AM

Software tools have not fundamentally changed over the years unlike hardware tools.
There are IDEs, but, software tools need to be more CAD-like.

Sami on February 26, 2009 11:48 AM

please take this survey
http://www.kwiksurveys.com/online-survey.php?surveyID=HKKHM_aeb6a1a8

marcolocco on March 6, 2009 1:21 AM

I've tried managing a medium software project and it was hard. But what made it hell was the governance that the Corporate IT organization had established. They used the toll-gate method (kind of like the waterfall, but more starts and stops) where you had to estimate cost at Scope, Requirements Design before you could begin Construction. And none of the estimates could vary more than 10%.

Sat Upload on March 24, 2009 1:54 PM

This is in my top five of software engineering books.

I make a point of skim-reading it once a month just to keep it fresh in the mind the common pitfalls you can make on a project.

The fact it's such a concise book helps enormously, and it's littered with research references that back-up each one of his facts or fallacies.

I second Jeff on recommending this book 100%.

Simon.

Simon Johnson on February 6, 2010 10:25 PM

"I've been accused of gratuitous self-linking in the past, so I won't clutter up the rules with dozens of links to my old posts on these topics."

Who cares? That's what hyperlinks are for. If someone doesn't want to follow them, they can avoid clicking on them. One great feature of your blog is that you've written about a lot of things, and it's easy to find them from your links. And if I read a post again a year or two later, I'll probably get something new out of it.

Jon Peltier on February 6, 2010 10:25 PM

read some of this on the AW website a couple of years ago, good stuff. But how best to get your manager to read it?

John Ferguson on February 6, 2010 10:25 PM

The silver bullet has born. Having good processes is the answer to everything. If you have bad people, you can always get better ones with a good hiring process.

1. Its about the quality of all the people who participate in the software development, not only programmers. And even if you have great programmers, you are in deep trouble, if you don't have good processes.
2. The worst programmers wouldn't be that bad, if you had better processes that enabled the professional and productive approach in software development.
3. It would be easier to add more people to a late project, if you had good development processes.
5. You need real processes. Hype is not enough.
6. You need to invest in a process before it starts to create profit.
7. Software developers talk a lot about processes, but seldom use them.
8. One of the two most common causes of runaway projects is poor estimation process.
9. Software estimation usually occurs at the wrong time, because you don't have a proper process that says when you should estimate and when not.
10. Software estimation is usually done by the wrong people, because your process is not sufficiently advanced.
12. It is not surprising that software processes are bad. You should enhance them.
13. There is a disconnect between software management and their programmers, because you have good managers and good programmers, but a bad process that doesn't connect the two.
14. The answer to a feasability study is almost always "yes", because you are positive instead of using objective processes.
15. Reuse-in-the-small is a solved problem, but you should have a process for it in order to help solve the reuse-in-the large.
16. Reuse-in-the-large remains a mostly unsolved problem, because you only do reuse-in-the-small and mostly without a process.

And so on. Surely people are important, because without them you can't do anything - except with automated processes. But processes are the core of everything. For example even a good programmer has a living process: 1) Inhale 2) Exhale 3) Repeat until death. If you don't breath properly but only in small amounts, your brains don't get enough oxygen. You cannot be good without exercise processes.

Don on February 6, 2010 10:25 PM

"Yes, you HAVE pasted other people's thoughts on all of the subjects covered in this wonderful book. And then linked to your old posts about the exact same things over and over again."

Well, that's how people make money, by re-packaging/re-thinking/re-stating the products/thoughts/statements of others. Everyone is free to do the same, don't get upset because someone else is successful at it and you are not!

Jeff-atwood on July 2, 2010 6:49 PM

The comments to this entry are closed.