Engineering principles

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

We want high quality code, and this means no code checking would be allowed without unit tests and 90% code coverage

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.

Every feature should have a flag, so that it can be shown only to an x percentage of users

Other requirements