Principles

Design methodology

We construct large-scale systems using a systematic approach to design:

  1. State the requirements clearly so that any initial assumptions are obvious.
  2. Design an overall architecture that answers the needs of the project.
  3. Break the architecture into well-defined components. Give the components clear names so that everyone agrees on what is what.
  4. Define the interactions between each component, as messages or APIs.
  5. Define the structure of each component in terms of technical implementation, internal design, functionality. Write state-machine models for event-driven components.
  6. Describe all end-user scenarios and detail how these are implemented as processing steps and exchanges of data.
  7. Establish a cost estimate for each component. Add the cost of unit design and testing and integration testing. Add project management at about ten percent.
  8. From this, define a planning and get the customer's approval of the planning.

Basic ingredients

For any successful project we need three basic things:

  1. A competent client
  2. A technically skilled team
  3. Technology that we can fully control

Team Organisation

We work with small teams (two or three people) that each focus on one or more components of the overall architecture. Small teams communicate well and resolve problems rapidly. All teams in a project have shared access to source code and documentation. All projects with more than three or four participants get their own mailing lists and microsite (wiki).

Testing and Quality Control

We aim to produce unbreakable systems. This demands heavy testing during and after development, using test environments that simulate realistic use cases. The cost of building and maintaining test cases must be accounted for in the project planning. For all significant projects, we nominate a 'product manager' who is responsible for quality control and testing, and generally acts as prime contact with the customer team.