Codebase. One codebase tracked in revision control, many deploys
Dependencies. Explicitly declare and isolate dependencies
Config. Store config in the environment
Backing services. Treat backing services as attached resources
Build, release, run. Strictly separate build and run stages
Processes. Execute the app as one or more stateless processes
Port binding. Export services via port binding
Concurrency. Scale out via the process model
Disposability. Maximize robustness with fast startup and graceful shutdown
Dev/prod parity. Keep development, staging, and production as similar as possible
Logs. Treat logs as event streams
Admin processes. Run admin/management tasks as one-off processes
SOLID
The Single-responsibility principle. There should never be more than one reason for a class to change or every class should have only one responsibility
The Open—closed principle. Software entities should be open for extension, but closed for modification
The Liskov substitution principle. Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it
The Interface segregation principle. Many client-specific interfaces are better than one general-purpose interface
The Dependency inversion principle. Depend upon abstractions, not concretions