An IEEE Spectrum article (Oct 1992) about systems architecture included a list of heuristics/advice for building a system. I believe it applies to software systems just as well as hardware. The list is reprinted from Systems Architecting: Creating and Building Complex Systems, by Eberhardt Rechtin, Prentice Hall 1991.
The conceptual phase
- The choice between architectures may well depend on which set of drawbacks the client can handle best.
- Extreme requirements should remain under challenge throughout system design, implementation and operation.
- Don't assume that the original statement of the problem is necessarily the best or even the right one.
- No complex system can be optimum to all parties concerned, nor all functions optimized.
- A model is not reality. (!)
- Complex systems will develop and evolve within an overall architecture much more rapdily if there are stable intermediate forms than if there are not.
- Build in and maintain options as long as possible.
- Don't make an architecture too smart for its own good.
The build and test phases
- The product and process must match.
- An element good enough in a small system is unlikely to be good enough in a more complex one.
- Within the same class of products and processes, the failure rate of a product is linearly proportional to its cost.
- High quality, reliable systems are produced by high quality architecting, engineering, design and manufacture, not by inspection, test and rework.
- Regardless of what has gone before, the acceptance criteria determine what is actually built.
- To be tested, a system must be designed to be tested.
- Qualification and acceptance tests must be both definitive and passable.
- The cost to find and fix a failed part or software bug increases by an order of magnitude as that part is successively incorporated into higher levels in the system.
The operations phase
- Before the flight, it's opinion. After the flight, it's obvious.
- The first quick-look failure analyses are often wrong.
- For every competitive system, there is a countersystem.
- Success is defined by the beholder, not the architect.
- There's nothing like being the first success.