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:
Brandon Byers lists #4 and #5 when explaining #3:
Some good definitions in this SO answer.

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


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

Features can be combined. Unix philosophy.

Principle of Least Surprise

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

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