A collection of software concepts I plan to apply to some up coming projects. Some fundamental philosophies:
Automation everywhere. A clean (agnostic) contract with the underlying operating system, promoting portability between execution environments. Can scale without major changes to tooling, architecture or development. Smallest possible delta between development and production, enabling continuous integration. Deployment Processes are first class citizens. Execute the application as one or more stateless processes. Model process types explicitly, e.g. HTTP requests might be handled by a web process, while long running backend tasks by a worker process. Always rely on the operating systems user-space process manager (e.g. systemd, Upstart) to manage output streams, respond to crashed processes and handle user initiated restarts and shutdowns. Concurrency; Physical distribution and clean contract with operating system, e.g. containers (e.g. docker). Versioning; the ability to deploy and hotswap versions side by side. Pluggable; ability to snap modules into architecture (punch through all layers), see attached resources under backing services. Store all runtime configuration as environmental variables. They are a language and OS agnostic standard, and unlike other config options such as Java System Properties, are not accidentially added into the source code repo. The array of process types and number of processes of each type is known as the process formation.
...