Saturday, December 14, 2013

Important concepts in software

The following is a collection of important concepts all software professionals should understand.  For each of them, the moment of understanding is often an ephiphany - an "aha" moment when what has up until then either felt good or was second nature now has a label, a vocabulary.

Jeff Atwood lists the first 3: http://www.codinghorror.com/blog/2009/03/five-dollar-programming-words.html
Brandon Byers lists #4 and #5 when explaining #3: http://brandonbyars.com/2008/07/21/orthogonality/
Some good definitions in this SO answer.

Idempotence
The result of doing something more than once is the exact same result as doing it once

Immutability

Orthogonality
Nonorthogonal systems are hard to manipulate because it's hard to tweak isolated parts

Composability
Features can be combined. Unix philosophy.

Consistency
Principle of Least Surprise

Determinism
There's a single, well-defined correct value. Important for reasoning about what a program is doing at any point in time.  In contrast, imperative concurrency can give different answers, depending on a scheduler or whether you're looking or not, and they can even deadlock.

Complexity: Essential vs Accidental

Temporality
State changes over time. The temporally discrete nature of imperative computation is an accommodation to a particular style of machine, rather than a natural description of behavior itself