John Carmack on inlined code (2014)
Inlining vs Abstraction
- Many commenters echo the article’s point: inlining impure, stateful logic can expose hidden dependencies and timing, but overdoing it leads to giant, unreadable functions.
- Others strongly prefer small, named functions for “global clarity”: the top-level code reads as a sequence of well‑named steps instead of a wall of logic.
- Several distinguish true abstractions (new semantic levels) from mere indirections (just another place to jump), arguing the latter often age poorly.
DRY, YAGNI, and Over‑Engineering
- A recurring theme: rigid application of DRY, SOLID, “clean code” can create brittle, over‑abstracted systems.
- Heuristics offered:
- “Twice is fine, third time maybe abstract.”
- Prefer a little duplication over new dependencies/indirections.
- YAGNI should default: don’t generalize until you have at least 2–3 real call sites.
- Others push back, noting that duplicated code can hide bugs when only some copies are fixed.
Functional Style and Purity
- The article’s later endorsement of more functional style is highlighted: pure functions reduce the very state‑mutation hazards that motivate inlining.
- Debate over what “pure FP” really entails; some emphasize referential transparency and segregation of IO, others see this as academic or hard to apply in non‑FP languages.
- There's tension between seeing FP as transformative vs. “just another tool” with significant tradeoffs and learning curve.
Readability, Human Limits, and Developer Maturity
- Several describe a career arc:
- Early “simplest thing that works.”
- Mid‑career over‑abstraction and architecture obsession.
- Later preference for boring tech, minimal speculative reuse, and clearer code for “low‑effort mode” reading.
- Different minds prefer different styles: some want every gritty detail in one place; others rely on abstractions to filter noise. Mixed teams need compromise.
Testing and Unit Boundaries
- Inlined or nested functions reduce the surface area that can be called incorrectly, but also reduce direct unit‑testability of small pieces.
- Some argue the true “unit” is the public API; internals should be tested via that. Others like fine‑grained tests on small helpers, especially for tricky edge cases.
Performance, Control Loops, and Context
- The original context of tight control loops and latency‑sensitive game/embedded code matters: in those domains, inlining, deterministic control flow, and minimized branches are often worth extra complexity.
- Multiple voices caution that most application and backend code is not in that regime; for it, clarity and maintainability should dominate.