points: Swarm of new apps everyday, with... Limited scalability Tangled, unclear, spread dependencies Need a rewrite to scale easily Different patterns and practices for different projects, environments, languages
specific info to run a deployment of a codebase Ex: database credentials, paths, resource urls, etc Keep it outside the app Don't version control it Real world test: "can you make it open source right now?"
The 12 factor app is completely self-contained The contract with the execution environment is binding to a port, and only that This means that one app can become the backing service for another app
The need for scaling out... Scale out via processes, unix style Different processes types (web, db, worker) Processes don't daemonize nor write PID's Trust system's process manager
graceful shutdown Rapid deployment of new changes Start quickly More agility to scaling up Process Manager can more easily move processes to new machines
as similar as possible There are usually some gaps between dev and prod: Temporal (days to prod after dev) Personnel (dev & ops) Tooling (DB's, SO's, VM's, etc)
deploy ASAP after coding Get Devs involved in Operations Envs must be as similar as possible Resist the urge to use different backing services in dev machines. (Tip: Docker, Vagrant, Otto, Puppet, Chef, Ansible...)
processes Eg: Database migrations Console / REPL One-time scripts Run as a separate process From same codebase/release (same dependencies, isolation, etc)