chapter four

4 Constraints

 

The whispering whizz of mowing scythes startles sleepy birds nesting near the ancient Nile Delta. Workers harvest the papyrus plant quickly and efficiently, before the unbearable heat of the Egyptian sun turns the labor into an even bigger nightmare. The fibers of these plants are to be converted into a valuable writing material similar to paper by expert papyrus makers.

In the second century BC, king Ptolemy V promptly ordered craftsman to stop exporting one of their treasured national products. The reason was as simple and mundane as jealousy. A rival library in Pergamon, in then Mysia (now western Turkey), had gained enough traction to greatly annoy the king, who wanted to protect the fame and power of his Great Library of Alexandria at all costs.

The sudden papyrus shortages did not stop the Hellenistic king Eumenes II from expanding the library in Pergamon. His hunger for literature was much, much bigger than the literary ambition of his predecessors. The papyrus plant does not grow well outside of the Nile delta, and resorting to clay tablets greatly decreases the capacity of a single book. Instead of accepting defeat, Eumenes' experts perfected the eastern art of writing on animal skin, a method that until then was only used locally and not highly regarded.

4.1 Constraint-based thinking

4.1.1 Greenfield or Brownfield?

4.1.2 A taxonomy of constraints

4.2 Intrinsic constraints

4.2.1 Intrinsic hardware constraints

4.2.2 Intrinsic software constraints

4.3 Imposed constraints

4.4 Self-imposed constraints

4.4.1 Passionate pixel artists

4.4.2 Let limitations guide you to creative solutions

4.4.3 Game Boying into constraints

4.4.4 Limited fantasy consoles

4.4.5 New old hardware

4.4.6 Limited programming languages

4.4.7 Crack intros and the demoscene

4.5 Hitting that sweet spot

4.5.1 Sweetness or bitterness?

4.6 Working with constraints in practice

4.6.1 Divergent thinking

4.6.2 Naivety and constraints

4.6.3 A naive but legendary poet

4.6.4 A naive James Bond

4.6.5 Naive algorithm implementations

4.7 Summary