Thursday, December 22, 2011

Software design vs Hardware design

Recently, I designed a circuit for a home project. It got me thinking about the differences between circuit design and hardware design. In hardware design, we operate with a set of discrete components, furthermore our design is constrained by: time, money, space, availability and power. Based on these constraints we would find well defined functional building block (components) and function by function construct a device that produces the desired output, given a particular set of inputs. This process is iterative, the design of the system follows the same process and any of the sub-systems. In some ways the constraints and the fact that inputs and outputs are well defined (making system design the same as that for sub-systems) makes the design process uniform and relatively easy. I was amazed at how deterministic my circuit design was as compared to software design.

In software design, we have become overwhelmed by the number of components, the complexity of the inputs and outputs, computing power is not and issue and time and money are not that easily measured a-priori (as they are in circuit design). The effect is that software projects are often not well constrained, can explode in complexity and the system design process may differ from the sub-system design process. Initially computer scientists tried to solve this project by creating objects, that were meant to be functional units that had inputs, outputs and state (thus mimicking electronic components). In reality they are more complex than discrete components, as anyone can design them, they take any number of inputs, they have an infinite possibility of states and have very complex outputs. It requires a great deal of discipline to constrain a software project in the way that a circuit hardware design project is constrained.