Some considerations for software design
Filed Under Techniques, Design, Improvement, Model, Development, Process, Software | Posted on September 3, 2007
Software designs tend to be incredibly large and complex. This may seem obvious but the magnitude of the problem is often ignored. Typical commercial software products have designs that consist of hundreds of thousands of lines. Many software designs run into the millions. Additionally, software designs are almost always constantly evolving. While the current design may only be a few thousand lines of code, many times that may actually have been written over the life of the product.
Designing software is an exercise in managing complexity. The complexity exits within the software design itself, within the software organization of the company, and within the industry as a whole. Software specifications tend to be fluid, and change rapidly and often, usually while the design process is still going on. In order to deal with the complexity, software is designed in layers. When a programmer is worrying about the detailed design of one module, there are probably hundreds of other modules and thousands of other details that he can not possibly worry about at the same time. For example, there are important aspects of software design that do not fall cleanly into the categories of data structures and algorithms. Ideally, programmers should not have to worry about these other aspects of a design when designing code.
Most current software development processes try to segregate the different phases of software design into separate pigeon-holes. The top level design must be completed and frozen before any code is written. Testing and debugging are necessary just to weed out the construction mistakes.
There are many aspects to consider in the design of a piece of software. The importance of each should reflect the goals the software is trying to achieve. Some of these aspects are:
* Extensibility - New capabilities can be added to the software without major changes to the underlying architecture.
* Robustness - The software is able to operate under stress or tolerate unpredictable or invalid input. For example, it can be designed with a resilience to low memory conditions.
* Reliability - The software is able to perform a required function under stated conditions for a specified period of time.
* Fault-tolerance - The software is resistant to and able to recover from component failure.
* Security - The software is able to withstand hostile acts and influences.
* Maintainability - The software can be restored to a specified condition withing a specified period of time. For example, virus software may include the ability to periodically receive virus definition updates in order to maintain the software’s effectiveness.
* Compatibility - The software is able to operate with other products that are designed for interoperability with another product. For example, a piece of software may be backward-compatible with an older version of itself.
Some general facts related to design:
- Real software is incredibly expensive to design. This is true because software is incredibly complex and because practically all the steps of a software project are part of the design process.
- Programming is a design activity — a good software design process recognizes this and does not hesitate to code when coding makes sense.
- There are other design activities — call them top level design, module design, structural design, architectural design, or whatever. A good software design process recognizes this and deliberately includes the steps.
- Software development is still more a craft than an engineering discipline. This is primarily because of a lack of rigor in the critical processes of validating and improving a design.
Leave a Reply