For cute, neat, small and minuscule systems, you won’t need any model.

For larger, distributed, risky or otherwise complicated systems, architectural information in addition to source code can support both development and evolution of systems.

Models in our sense are arbitrary abstractions of architecture or architecture decisions, relating to either structure or (crosscutting) concepts.

Examples of such models we found useful:

  • Context of the system, showing external neighbors and interfaces.
  • Building blocks (e.g. subsystems, modules or such), representing potentially large chunks of source code.
  • Other views, e.g. runtime or deployment
  • A domain model, representing the core of your domain.

Models can be expressed using diagrams plus explanations, but might also be textual or tabular…

Btw: compare a sequence diagram generated from code with a (carefully) modeled one which only contains the most important abstract elements (and not all detailed classes and methods).