How to make websites that will require lots of your time and energy
Modern web projects often become far more complex than their requirements justify, as developers reach for heavy frameworks, ORMs, and elaborate build pipelines even for simple sites. Commenters weigh the trade-offs between minimal, dependency-light stacks (plain HTML, PHP templating, simple scripts) and tool-heavy setups (React/Next.js, TypeScript, Prisma, Kubernetes), highlighting issues like churn, breakage, security, and maintainability versus productivity, features, and job-market relevance. Many conclude that the core problem is not any specific tool but the tendency to over-engineer, and argue for more deliberate, context-driven choices about when added complexity is actually worth it.
Dependencies, Reuse, and “Rolling Your Own”
- Many agree the problem isn’t dependencies themselves but using them indiscriminately for trivial tasks (“is-odd”-style packages).
- Some prefer vendoring tiny libs or reimplementing simple logic rather than pulling in full npm trees.
- Others point out that correctness in JavaScript edge cases and bad inputs can justify even small utilities, depending on how much you care about trash input.
Components, Templating, and PHP
- Simple copy‑paste HTML is defended for tiny sites, but others describe how it quickly becomes unmanageable when shared headers/nav bars change across many files.
- Lightweight templating (custom scripts, includes, nginx/Lua, bash/Python generators) is presented as a middle road between “just HTML” and full frameworks.
- PHP is praised as an underrated HTML preprocessor, but critiqued as becoming unmaintainable once inline logic grows beyond triviality.
Frameworks, Overengineering, and Motivation
- A recurring theme: frameworks and complex stacks often stem from overengineering, boredom, or resume/skill maintenance rather than need.
- Some deliberately avoid frameworks to keep things simple, then end up with small ad‑hoc “frameworks” anyway.
- Others argue frameworks (Astro, Svelte, Django, etc.) can be a huge productivity boost for non‑trivial sites, and that refusing them can be its own kind of dogma.
Build/Compilation Steps and TypeScript
- The article’s jab at “always requiring a compilation step” resonated as a joke about needless complexity.
- Several commenters defend compilation and TypeScript as essentially mandatory for large projects; using TS is framed as a practical, not fashionable, choice.
- Others prefer JSDoc or minimal build steps to avoid long‑term tooling churn and bitrot.
ORMs, SQL, and Performance vs Safety
- ORMs trigger a large, mixed debate: some complain about N+1 queries, bloated joins, and performance mysteries; others report years of success with mature ORMs (Django, EF, Ecto, etc.).
- Pro‑ORM arguments: safer defaults (avoiding SQL injection), easier migrations, schema evolution, type safety, and clearer data‑layer boundaries.
- Anti‑ORM arguments: hidden complexity, custom DSLs to learn, leaky abstractions for complex queries, and teams eventually fighting both ORM and database.
- Multiple people note that teams avoiding ORMs often reinvent worse, homegrown versions—or scatter raw SQL insecurely across the codebase.
Maintenance, Dependency Churn, and Security
- Frontend stacks (React/Next, CRA) are cited as particularly brittle: old projects become hard to update, with time spent fighting the toolchain instead of adding features.
- Some advocate pinning versions and updating cautiously; others highlight that pinned dependencies still become security liabilities and must eventually be replaced or patched.
Organizational and DevOps Complexity
- Commenters joke (and complain) about spinning up CI, platform teams, Terraform, Kubernetes, multi‑AZ clusters, etc. before a single page ships.
- Backend “anti‑patterns” listed include hand‑configured servers, no config management, no backups, unmanaged TLS certs, and noisy monitoring/alerts.
- Several threads suggest that much of modern complexity exists to justify roles or follow cargo‑culted “big company” practices, not actual project needs.