The best designs in software emerge from building working solutions and step by step widening the scope, not from sitting around a table and writing architecture specifications.