Software design gets worse before it gets better

Rewrites vs Incremental Change

  • Strong debate over rewriting from scratch vs gradually transforming existing systems.
  • Some argue whole‑app rewrites are almost never justified; targeted refactors and partial replacements are different and often preferable.
  • Others note cases where years spent “bashing legacy into shape” feel like sunk‑cost fallacy, and a clean reimplementation (guided by tests) might have been better.
  • Several point out that test suites can be incomplete or encode unintended “bug‑as‑feature” behavior, limiting how far you can safely rewrite.

Microservices, Architecture, and Org Decisions

  • Microservices are seen as an infra/org choice that heavily constrains software design, often adopted prematurely as a “template” rather than a design.
  • Some argue infra/devops/org structure are themselves part of software design, especially in distributed systems.
  • Merging microservices or building new services “next to” legacy code is suggested as a practical middle ground.

The “Trough of Despair” and Redesign Risk

  • Many agree that moving from a local maximum to a better design requires a temporary dip: intermediate states are messier and more complex.
  • Others say the article conflates “less improvement than hoped” with “actually worse,” and that intermediate states are transitions, not designs.
  • Advice: prototype, draw current vs ideal vs feasible architectures, and build “stairs” before fully descending into the trough.
  • A frequent failure mode: orgs fund the “make it worse” step but never the “make it better” step.

What Counts as “Better”?

  • For developers: easier to change, clearer architecture, lower marginal cost for future features, less technical debt.
  • For users: simpler, more predictable tools that support goals with minimal friction.
  • Tension noted between developer convenience (e.g., cross‑platform stacks, Electron) and user experience (native, “Mac‑like” apps).
  • Some emphasize measurable qualities (maintainability, reliability, performance, security) over aesthetic purity.

People, Incentives, and Skill

  • Frequent job‑hopping and weak career paths make long‑term refactoring less appealing; companies often under‑reward those who stay.
  • Outsourcing and “cheap labor” are blamed for poor design that later must be redone by smaller, more skilled teams.
  • Others note high salaries do not guarantee high skill; tooling and abstraction can mask incompetence.

Metaphors: Local Maxima, Activation Energy, Evolution

  • Commenters liken redesign to leaving a local optimum, chemical activation energy, and simulated annealing.
  • Debate over whether real‑world evolution is monotonic; consensus that non‑monotonic change (taking short‑term “worse” steps) is often necessary to escape design traps.