Tough Tech Problems

April 7th, 2006
[ Software Development ]

As defined in Solving Tough Problems, problems are tough because they are complex, and that there are three types of complexity: dynamic, generative, and social.

A problem has low dynamic complexity if cause and effect are close together in space and time. In a car engine, for example, causes produce effects that are nearby, immediate, and obvious; and so, why an engine doesn’t run can usually be understood and solved by testing and fixing one piece at a time.

A problem has low generative complexity if its future is familiar and predictable. In a traditional village, for example, the future simply replays the past, and so solutions and rules from the past will work in the future. A problem has high generative complexity if its future is unfamiliar and unpredicatble.

A problem has low social complexity if the people who are part of the problem have common assumptions, values, rationales, and objectives. In a well-functioning team, for example, members look at things similarly, and so a boss or an expert can easily propose a solution that everyone agrees with. A problem has high social complexity if the people involved look at things very differently.

So how does this apply to writing software? A few ideas come to mind.

Reduce dynamic complexity through designing simple, intuitive code and bring cause and effect as close together in code as possible. The goal being to quickly locate the cause (buggy code) when an effect is reported (bug).

Reduce generative complexity by leveraging concepts such as design patterns. Design patterns offer a way to use our past to solve our future patterns.

Reduce social complexity through hiring practices that allow teams to effectively vet new team members. Facilitate and stimulate the social networks within teams and realize how key they are to the success of your business. A lot of environments mistakenly view social events as goofing off when it could be the best money they ever ‘waste’.

What else?