We adhere to 7 principles of engineering that act as guide rails for the partnerships we form and the products we build. These principles are not hanging as decorations on the walls of our office, nor are they trite sayings that sound clever but never get applied. They are hard-learned, battle-tested principles by which we solve complex engineering problems.
1 — The Principle of Dedication
The principle of dedication centers on dedicated teams working with dedicated focus. Working in isolation creates knowledge silos and in-the-box thinking. Juggling multiple projects reduces focus and quality. The negative effects of multitasking are well-documented here and here (in the general sense), as well as here and here (in the engineering sense). At Caxiam, individuals work on teams and teams work on projects.
2 — The Principle of Reduction
The principle of reduction centers on limiting the amount of software being built and released at any single point in time, recognizing that "big bangs" lead to bloated software that end-users have no opportunity to shape over an extended period of use. This principle models itself on other popular ideas such as Yagni, MVP, and Lean Startup.
3 — The Principle of Prioritization
The principle of prioritization centers on helping stakeholders identify which features of their product are the most critical to the success of the project and then focusing on those first. We use a MoSCoW prioritization model, which helps stakeholders think through whether a given feature of the product is a must-have, should-have, could-have, or won't-have.4 — The Principle of Decentralization
The principle of decentralization centers on building distributed, API-driven architectures. This results in numerous benefits over monolithic architectures — namely independent deployability, platform and technology independence from component to component, distinct axes of scalability, testing granularity, decoupled maintainability, and increased architectural flexibility.5 — The Principle of Standardization
The principle of standardization centers on avoiding proprietary solutions, favoring community standards, and adopting patterns wherever possible. This includes following coding style guides with linters (e.g., PEP8), adhering to specifications (e.g., API Blueprint, JSON-API), and designing software in a manner that promotes componentry reuse.6 — The Principle of Automation
The principle of automation centers on building software in a manner that reduces opportunities for human failure. We want as much confidence as possible that our software continues to operate as intended when changes are introduced (accomplished via automated testing) and is easily deployable in the event of a hardware failure (accomplished through automated continuous delivery).7 — The Principle of Verification
The principle of verification centers on ensuring software is never built in a vacuum, and that all code undergoes multiple reviews before it's released. Test-driven development ensures core functionality has corresponding automated tests to avoid regression. Third-party static analysis of the code ensures styles and conventions are properly followed. Peer-review ensures all code is manually reviewed by at least one other engineer, and hands-on testing (actual humans interacting with the software) serves as our fourth layer of verification.
When these principles are applied in aggregate, the resulting software produced is incredibly stable, maintainable, and durable.