I just read the article The Other Side of Complexity, by Chuck Allison. In this article Allison claims that complexity in software can be transformed into simplicity by using abstractions.
This is bollocks.
The writer has fallen in two different traps with just one step. Quite an achievement, if you ask me. But one that I myself have been guilty of more than once, so I’m not complaining. I’m just glad I found myself something to rant and rave about.
Trap 2: Lines of code are complicated, but software is complex The behavior of most software products depends in a large part on the input from complex systems (humans). The behavior of these users is complex and can never be simplified. Therefore, software behaves in a non-deterministic way and can never be simplified. Only the deterministic parts of software systems can be simplified. Embedded software can be complicated. But web sites are usually complex.
This quote illustrates it better than I can describe it myself:
The wiring on an aircraft is complicated. To ﬁgure out where everything goes would take a long time. But if you studied it for long enough, you could know with (near) certainty what each electrical circuit does and how to control it. The system is ultimately knowable. If understanding it is important, the effort to study it and make a detailed diagram of it would be worthwhile.
So complicated = not simple, but ultimately knowable.
Now, put a crew and passengers in that aircraft and try to ﬁgure out what will happen on the ﬂight. Suddenly we go from complicated to complex. You could study the lives of all these people for years, but you could never know all there is to know about how they will interact. You could make some guesses, but you can never know for sure. And the effort to study all the elements in more and more detail will never give you that certainty.
So complex = not simple and never fully knowable. Just too many variables interact.