Modern software is commonly delivered as a service. These include web apps, or SaaS. The Therefore it is important to build apps that:
Use declarative formats for setup automation. This minimizes time and cost for new developers joining the project.
Have a clean contract with the underlying operating system thus offering maximum portability between execution environments.
Are suitable for deployment on modern cloud platforms.
Minimize divergence between development and production, enabling continuous deployment for maximum agility.
Can scale up without significant changes to tooling, architecture, or development practices.
Factors to consider in developing scalable and dynamic apps
- 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 and 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 tasks as one-off processes