Engineering principles
-
High-level design
This is the decomposition of the system into high-level components. This serves as the blueprint that the product and code need to follow at every stage of the product development life cycle. For example, once we have a layered architecture (see the following section), then we can easily identify for any new requirement to which layer each new component should
-
Quality attributes
We want high quality code, and this means no code checking would be allowed without unit tests and 90% code coverage
-
Product velocity
The product has a bounded value in time and, to ensure that there is high developer productivity, the team should build Continuous Integration / Continuous Deployment (CICD) pipelines from the start.
-
A/B testing
Every feature should have a flag, so that it can be shown only to an x percentage of users
Other requirements
- To fulfill its purpose, software must be soft—that is, it must be easy to change. When the stakeholders change their minds about a feature, that change should be simple and easy to make