| This is such a powerful paper! I made some notes of the first 11 pages when I read it if someone wants a summary: Complexity (Section 2): Complexity is the root cause of most problems with software. The danger of complexity comes from its impact on our attempts to understand a system. Being able to think and reason about our systems is of crucial importance. Simplicity is hard. Approaches to Understanding (Section 3): Testing and Informal Reasoning are two common mechanisms used to try to understand systems. Improvements in informal reasoning can lead to less errors being created, while improvements in testing can lead to more errors being detected. Testing alone is inadequate because while it can be used to show presence of bugs it can never show their absence. When considered next to testing and reasoning, simplicity is more important. Causes of Complexity (Section 4) State: Complexity arises from the presence of many possible states of a system. It is difficult to conceive, describe, and test large number of different states of a system. Informal reasoning relies on case-by-case mental simulation of behavior, which buckles as the number of scenarios grows. For every bit of state we add, we double the total number of possible states. The more we can do to limit and manage state, the better Control:
Control is concerned with the order in which things happen. Control is almost always an implicit part of the language and forces the programmer to specify control. Subtle and hard-to-find bugs can happen when reader assumes specified ordering is significant when it is really not. Concurrency:
Concurrency results in adding further to the number of scenarios that must be mentally considered. We can no longer be assured of result consistency in the presence of concurrency, even with known initial states. Code Volume:
Code volume is the easiest form of complexity to measure. In most current systems complexity exhibits nonlinear increase with size of code. Other:
Complexity breeds complexity - complexity is introduced as a result of not being able to clearly understand a system. Simplicity is Hard. In the absence of language-enforced guarantees, mistakes (and abuses) will happen. The more powerful the language the harder it is to understand systems constructed in it. |