Chapter 13: GRAND DESIGNS How to Produce Good Software Designs
- There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.
- Think before you type; establish a coherent design. Otherwise you’ll end up with chaotic code.
- Less is more. Strive for simple code that does a lot with a little.
- It’s a complicated job to make something simple. If a code structure looks obvious, don’t assume that it was easy to design.
- Design modules that are internally cohesive with minimal coupling. The decomposition must represent a valid partition of the problem space.
- Draw lines in the sand that people don’t need to cross: Identify clear APIs and interfaces.
- Design for extensibility, but don’t be hopelessly general—you’ll end up writing an OS, not a program.
- Do it once. Do it well. Avoid duplication.
- Manage the portability of your code in its design, rather than hacking it in as an afterthought.
- No one is born able to design code: We learn.
- Take a pragmatic approach to design tools and methodologies—use them when they are genuinely helpful—but don’t become a slave to them.
- The architecture is the single largest influence on the design and future growth of a software system. It is therefore essential to get it right in the early stages of development.
- Capture system architecture in a known place; a document accessible to everyone involved—programmers, maintainers, installers, managers (perhaps even customers).
- The architecture is the initial system design. It is therefore the first developmental step after the requirements have been agreed upon.
- An architecture specification is an essential device to communicate the shape of your system. Ensure that you keep it in sync with the software.
- Architecture identifies the key components of the system and how they interact. It doesn’t define how they work.
- A good architecture leaves space for maneuverability, extension, and modification. But it isn’t hopelessly general.
- Recognize the key architectural styles and appreciate their pros and cons. This will help you to sympathetically work with existing software and perform appropriate system design.
Jul 16, 2010