What functional programmers get wrong about systems
Article accessibility & style
- Several readers found the site hard to scroll (especially on Firefox mobile) and the article excessively long and repetitive for the amount of new ideas.
- Some felt the prose and section headers have an “LLM-ish” / clickbait tone; others strongly disagreed and praised it as clear, approachable, and well-structured.
- There’s back-and-forth over whether it’s “good technical writing,” with some calling it a survey/discussion piece rather than how‑to documentation.
Is this really about “functional programmers”?
- Multiple commenters argue the issues described (schema evolution, distributed versioning, semantic drift) are generic systems problems, not specific to FP, and the title is misleading or clickbaity.
- Others think it applies mainly to the highly-typed ML/Haskell tradition, not to Lisp/Erlang/Elixir-style FP that more freely uses unstructured data and embraces messy systems.
- A recurring point: the real distinction is “program vs system,” not FP vs non‑FP. FP just makes the program‑level part unusually strong, which can distract from system‑level concerns.
Versioning, schemas, and data evolution
- Strong agreement that the hard problems are:
- Coexistence of multiple code versions and schema versions.
- Logs and queues acting as “time capsules” of old data.
- Semantic drift where meanings change without type changes.
- Discussion of approaches:
- Temporal/bitemporal databases, event sourcing, and Datomic/Datalog-style immutable histories.
- IDLs and tools (GraphQL schema diffing, Buf, Cambria, Typical, CUE) that encode or check evolution rules.
- Modeling schema updates as typed functions between schema versions.
Static typing, FP tools, and their limits
- Many defend types/ADTs as extremely useful locally but insufficient for reasoning about whole evolving systems.
- Debate over “rigid types”: some say typed FP makes schema incompatibility painful; others counter that languages like Haskell can parse leniently into generic types when needed.
- Several note that even perfect local typing cannot detect semantic drift or user‑driven meaning changes.
Architectural strategies & critiques
- One long subthread argues for monorepos, monodeploys, and database/query systems integrated into the same language and type system to extend static checking across the system; others call this unrealistic and insufficient for real-world multi-service, multi-vendor environments.
- Model checking (e.g., TLA+) is proposed as a better fit for reasoning about global system properties.
- Erlang/Elixir are cited as examples of FP that are “honest” about distributed systems via processes and message passing.