Bloat is still software's biggest vulnerability (2024)
Cultural and Organizational Drivers of Bloat
- Several comments blame management incentives: only visible features count, so cleanup, simplification, and security get cut.
- Agile/Scrum metrics (story points, “value every sprint”) discourage refactoring and pruning, locking teams into ever-increasing complexity.
- Some argue big tech’s security problems are not primarily about coders’ skills but slow, political decision‑making around removing bad dependencies.
Microservices, Containers, and Local Dev Hell
- Multiple anecdotes of needing many interdependent microservices, containers, and consoles just to run or debug a feature; 20+ containers, manual auth steps, 20‑minute startup times.
- Docker and Kubernetes are seen as both helpful (isolation, reproducibility) and a bloat amplifier (many layers, huge images, long downloads, fragile setups).
- Desire for a “developer orchestration layer” that can easily switch services between local source, local containers, and remote endpoints.
Dependencies, Package Managers, and Supply Chain Risk
- Easy package managers (npm, cargo, Maven, etc.) encourage enormous transitive dependency trees (hundreds or thousands of deps) where a single function pulls in megabytes of code.
- Some praise C/C++’s painful dependency story for forcing restraint; others note this just shifts bloat into giant all‑in‑one libraries and homegrown “standard libraries.”
- Debate over mirroring dependencies vs. relying on ecosystem tools for vulnerability tracking; no consensus on how to “know” a dep is safe.
Security, Memory Safety, and Attack Surface
- One camp emphasizes memory-unsafe languages (C/C++) as a major security risk; another argues this is overstated compared to the impact of overall attack surface and supply‑chain bloat.
- Heartbleed vs. Log4j is used to show major exploits occur in both unsafe and memory‑safe ecosystems.
- Several stress that smaller, simpler binaries and fewer features reduce attack surface regardless of language.
Web, NPM, and Application Platforms
- JavaScript’s weak standard library is blamed for the extreme dependency explosion (e.g., “is-odd,” left-pad‑style packages).
- Some wish for a move back to native apps or WASM, others counter that browsers’ sandboxing, inspectability, and ad‑blocking are major advantages over opaque native binaries.
Reinventing vs. Reusing: Where to Draw the Line
- Strong disagreement over “write it yourself”:
- Pro‑reuse: you can’t realistically reimplement SSL, databases, or IAM; high‑quality shared libraries are essential.
- Pro‑minimalism: for non‑core or simple features, bespoke code can be leaner, easier to understand, and have a smaller attack surface than pulling in a huge library.
- Heuristics suggested:
- The closer to your core business, the less you outsource.
- Treat security/crypto as something to reuse carefully, but note many “expert” security products have had serious flaws too.
Bloat vs. Technical Debt and Performance
- Some distinguish UX bloat (too many features, toolbars) from code‑level technical debt (indirection, tangled logic) and from pure performance/size issues.
- Examples: tiny apps doing trivial tasks but shipping multi‑MB binaries; Android and modern desktop apps cited as especially egregious.
- Tree‑shaking and link‑time optimization help but can’t remove complex, reachable features that you don’t actually need.
Operating Systems, Distros, and Minimalism
- Nostalgia for tiny systems (Plan 9/9front, floppy‑boot Linux) contrasts with today’s multi‑GB “minimal” distros.
- Alpine and unikernels are praised for size, but musl and ecosystem incompatibilities limit their use.
- Debate over whether a 1 GB “minimal” Linux is a practical problem in a world of cheap SSDs vs. still significant for SBCs, phones, and constrained environments.
Developer Burnout and Cognitive Load
- Several describe burnout and even quitting jobs due to the stress of maintaining bloated, over‑engineered systems with many moving parts.
- One commenter coins “cognitive sovereignty”: over‑reliance on opaque tools and libraries erodes developers’ understanding of what their systems actually do.
- Concern that AI‑assisted “vibe coding” will further accelerate code and dependency bloat.
Proposed Directions and Emerging Tools
- Suggestions include: stricter vetting of dependencies, more granular libraries, richer standard libraries to reduce external deps, and making systems “one‑script installable.”
- Go is cited as an example of a leaner ecosystem (strong stdlib, simpler module system, supply‑chain controls), though not everyone agrees it’s actually better.
- Research work is mentioned on tools that automatically remove unused code from containers and shared libraries as a practical way to shrink attack surfaces.