This series is about design process and organizing our thoughts for effective development. The main goal is to establish a mental model and intuition for effective design process. This post reviews what we’ve learned.

First we explored the motivating questions

  • What is programming? Software Engineering?
  • How do we effectively break down problems?
  • Can software be perfect?
  • What makes software good?

We learned software is fundamentally a design activity trying to model problems as automated processes. Banishing vague notions is a primary responsibility for programmers, who incrementally break off unknowns from the problem to zero in on clear problem descriptions that computers can execute.

This iterative process can be understood through the design tree, threat matrixes, and similar design tools. We start by listing known requirements, and incrementally break off sub-problems, folding knowledge back until the root problem is clear enough to solve. Ultimately, there is no perfect solution, only solutions that meet our known needs.

Any tool for this design process should help us communicate clearly. Duck docs are but one flexible technique for getting ideas out of our heads, making them clear, and balancing solutions against our problem’s goals and constraints.

The big picture process of clarifying ideas is similar at all stages, but each stage has its own questions and techniques for discovering the next level of clarity