Long Term Software Development
Software evolution & long-term view
- Several commenters point to Lehman’s Laws and related research on software evolution as empirical backing for the article’s themes.
- Others recommend books on legacy systems and empirical software engineering, reinforcing that long-lived systems are common (banking, aerospace, elections, archiving).
Dependencies, versioning, and “DLL hell”
- Many see deep, fast‑moving dependency trees as the main enemy of longevity, citing Python, Node, and ML stacks as fragile and short‑lived.
- The historical “DLL Hell” on Windows is used as analogy; some argue it’s largely solved now via versioned assemblies and app‑local DLLs, while others note it was “solved” mostly by bundling private copies.
- Rust’s model (multiple versions of a crate in one binary, name‑mangled) is praised for safety but criticized as encouraging sprawling, slow‑compiling dependency graphs.
- Reproducible builds are proposed as a counter to dependency drift, but others point out they do not solve security updates or abandoned libraries.
Third‑party libraries vs in‑house code
- A strong contingent argues for minimizing third‑party deps, especially in performance‑critical C/C++ systems or long‑lived infrastructure, citing:
- Poor performance and scalability of many OSS libs.
- Harder observability and debugging across many libraries.
- Supply‑chain and maintenance risk, especially when tooling must be aggressively updated.
- Counter‑arguments stress that some domains (auth, crypto, image parsing, ML libraries) are too hard or risky to re‑implement, and that popular, well‑scrutinized libs are safer than bespoke code.
- There’s nuanced middle ground: use a few “platform‑level” mature deps, vendor or replace narrow ones, and accept interim libs as stopgaps.
Simplicity, documentation, and style
- Many reinforce “write boring, simple, obvious code” and avoid premature optimization or over‑architected layers.
- Some warn not to conflate “simple” with “easy”; a good architecture can be “clever” in service of making application code simple.
- Documentation is widely seen as crucial for longevity; disagreement focuses on avoiding meaningless boilerplate vs providing high‑level intent and system context.
- Style uniformity is de‑emphasized; learning to work with mixed styles is considered more valuable than rigid enforcement.
Critical systems vs typical web/apps
- Commenters note a gap between practices for life‑critical / industrial systems (assertions, no dynamic allocation, highly conservative change) and the more pragmatic mitigation‑oriented advice suitable for typical web and business software.