The Wabe Personal Notebook First principles in Software Engineering


(From a personal communication with James W. Earhart.)

First principles in Software Engineering

When designing any large-scale software system, there are three objectives to keep in mind:

Expansibility
One should be able to add new functionality to the system with only minimal disruption. OO methodology does this well; dynamic linking does it even better. “Hot” linking is the best; no downtime.
Orthogonality
No component of the system should replicate the functionality of another component. This does not apply to redundancy, which is intentional replication. Again, OOD helps here; but the design must be object-oriented, not object-based.
Scalability
The system should be able to adsorb new resources transparently, or at least with minimal difficulty. Design limitations affect scalability; hardware and performance limits only hinder it.

With scalability, one must be willing to set arbitrary limits that can be changed at a moment’s notice. Setting compile-time limitations—such as limiting the number of users because the algorithms involved are of exponential order—is OK, because these limits can be changed as the hardware evolves.

The best way to achieve scalability is to remove all fixed numbers from your design. Make relationships many-to-many when possible, even if it is a “rare case” where a many-to-many will be needed (cf. ASCNet and the phones-per-order debate).

Last Modified: 2005/03/27 04:38:55 GMT
(Send problems to Rob Menke)
Page style: Classic | Cyan | Dark