When it comes to adding complexity to the code, I generally see two schools of programming:

  1. Top-down: start with abstractions, then write implementations for it.
  2. Bottom-up: write down the whole implementation, then make abstractions out of it.

This post advicates the second school.

Continue reading