*The key to understanding complexity is abstraction, which means rising above the code level. The best language for being simple and precise is math — the kind taught in elementary math courses: sets, functions, and simple logic. To make it easier to build tools for checking specs, most formal specification languages add things that are not found in elementary math classes — for example, types. However, the further a language departs from simple math, the more it hinders the abstraction needed to help us understand a complex program or system.*