I just ran across a post by Paul Graham titled Six Principles for Making New Things. Paul succinctly stated his principles as:
"I like to find (a) simple solutions (b) to overlooked problems (c) that actually need to be solved, and (d) deliver them as informally as possible, (e) starting with a very crude version 1, then (f) iterating rapidly."Sweet. I like it. I was immediately reminded of one of my own often used design aphorisms:
Start simple, build complexity over time
Yes, I'm aware that the grammar is a bit awkward. And I also admit that this is just a variant on Occam's razor.
But I'm amazed at how often we in the software industry paint ourselves into design corners by violating the law of parsimony. Really good software design takes a tremendous amount of discipline, and a willingness to draw boundaries in the name of elegance, simplicity, and usability. Design for the essential, not the edge cases. It turns out to be much easier said than done.