Worth sharing for the production engineering perspective this community rarely gets in detail.
The operational points: WhatsApp deploys to 1% of servers first, one region next, then the rest - monitoring throughout, ready to roll back. Hot code upgrades at this scale are less a technical problem than an engineering practice problem. When you deploy multiple times a day, maintaining the discipline required for safe hot upgrades becomes impractical.
At scale, certain failures become routine. Disaster recovery drills normalize the response before an emergency requires it.
The anti-pattern with the most sustained pain: overly dynamic code. Atoms as function names, runtime module references - the kind of thing that’s valid Erlang but makes static analysis, debugging, and human navigation increasingly painful at codebase scale. Part two covers the tooling built to address this.