Complexity in Software Development

There is a limit to the amount of complexity mere humans can hold within their heads. At least there certainly is in my case.

There is a limit to the amount of complexity mere humans can hold within their heads. At least there certainly is in my case. The complexity of even a small modern software application is enormous. Complexity grows non-linearly as the size of a software system increases.

The two main techniques we have for handling complexity are:

  1. Decomposition and integration: breaking down the problem into smaller and smaller pieces until each piece can be solved easily and then putting these small solutions together to form solutions to the bigger problems until the overall solution is achieved.
  2. Abstraction: ignoring details of a problem that are not relevant to what we are currently doing to make it easier to work with the details that are. Abstraction enables us to solve a problem in simpler, more general terms first and then address specifics of the problem in detail

Given enough time our two friends in their garage could produce very large and complex software systems by solving one small problem after another. Adding more people to the team allows us to solve many of the small problems in parallel and deliver large systems quicker. The more people we add, the more we can do in parallel.

Here's the catch: the more people we have working in parallel, the more we are likely to bump into communication and coordination problems. If there are significant dependencies between the problems being solved, then we have to work hard at putting the right communication channels in place so everyone has the information they need at the right time.

So we are back to managing communication again.  

More about communication....

Copyright 2010 Stephen R. Palmer. All rights reserved.