Characteristics of "Great Software Design"TM

This post is not about design-design, but the internal design of a software system. Such a design has several general characteristics, and Code Complete 2 has a list of these. First, a related quote by R. Buckminster Fuller:

“When I am working on a problem I never think about beauty. I think only how to solve the problem. But when I have finished, if the solution is not beautiful, I know it is wrong.” Great Software Design would have all these characteristics, but that’s almost never possible. Some of them contradict each other, so often we have to make tradeoffs. Anyway, here’s the list:

And, whatever you do: DO NOT CONSIDER SPEED! NEVER OPTIMIZE WHILE DESIGNING! (yes, those really needed to be capitalized). If I have one more PHP coder tell me that the MVC solution probably won’t be speedy, I will have to slashdot him physically in public. You don’t want to start off by trading any of the characteristics above for speed.

You design the system with design in mind, and if it turns out to be slow then you optimize. You will know what the bottleneck is, and you will make a sensible and thought-through trade-off. Then you will have your good design, and your speed. You will, rule the entire planet. Hah, kidding, the last part I just made up.

Well, what are you waiting for? Run out in a flowery meadow with your pen and paper and design something beautiful!


Comment by Austinwiltshire on 2009-07-19 20:25:58 +0000

I definitely take note with your proclamation not to consider speed. I see where you are getting at – certainly when some argue that one of the tools of abstraction (polymorphism for example) which has an associated runtime cost should not be used, despite an utter lack of profiled evidence, I’m with you. But when you’re designing a system that you well know must scale in particular directions, i.e., you expect it to be handling millions of X a second, then whatever algorithm or data structure you use to handle X needs to be built with speed in mind. This is more of the Big ‘Oh sort of ‘speed’ rather than pure clock cycles. For many applications, such as embedded, games, scalable aps or libraries, performance should actually be on your mind from day one. It’s just that many people believe performance comes from forgoing abstraction and maintainability, when real performance comes from an analysis of the available algorithms, domain specific design patterns, etc…

Comment by Andy on 2009-07-19 21:35:38 +0000

“If I have one more PHP coder tell me that the MVC solution probably won’t be speedy, I will have to slashdot him physically in public.”

mind to elaborate more on this ?

Comment by Sean on 2009-07-20 17:11:38 +0000

I just started learning basic programming after years working on the business side of web development / web marketing. This is an outstanding set of lessons for a newbie hacker and articulated in a way that it is easy to understand, yet fundamentally valuable. Thanks for posting!