How I Program in 2024
An essay on “How I Program in 2024” — advocating minimal abstractions, few or no tests, and largely ignoring version control workflows for a small, personal codebase — has triggered a broader re‑examination of modern software practices. Commenters contrast solo projects with large-team, user-facing systems, arguing over when types, automated tests, and rigorous source control are essential safeguards versus unnecessary cognitive load. Many see value in questioning tooling dogma and experimenting with austere workflows, but warn that abandoning tests and disciplined version control does not scale and shifts risk onto users and collaborators.
Static vs dynamic typing
- Some argue dynamic languages shine when context is stable and known (e.g., files you know exist); heavy type-checking there feels like overkill and slows development.
- Others praise mature static type systems (TypeScript, Scala, etc.) for catching whole classes of errors, typing DB queries and APIs end-to-end, and dramatically reducing unit-test needs.
- Complaints focus on “fighting the types” and boilerplate in languages like older Java/C#, and cultural issues like bikeshedding in TypeScript-heavy teams.
- Several note that the ideal amount of typing is “small but judicious” and that types, abstractions, and tests are tools, not dogma.
Shell and foundational tools
- Broad agreement that learning at least one shell well pays off long-term, especially for remote work, quick automation, and debugging environments.
- Advice: know when shell is the right tool; don’t build large, complex systems in shell because of its design pitfalls.
Tests: value, limits, and domain dependence
- Many insist automated tests are essential even for solo work: they prevent regressions, enable safe refactoring, document behavior, and reduce reliance on memory.
- Others emphasize domain: UI, graphics, and fast-changing workflows are harder and sometimes less cost-effective to test; small, short-lived scripts may not warrant tests.
- There’s pushback against brittle, over-mocked unit tests and coverage quotas; integration/end-to-end and property-based tests are often seen as higher value.
- Some treat tests as temporary scaffolding that can be discarded after major rewrites; others see this as wasteful or risky.
- A minority claim to never write tests and rely on manual or user testing; this is strongly criticized as offloading cost and risk to users.
Version control and workflows
- Confusion over the article’s “giving up versions”: thread clarifies this mostly means de-emphasizing history/branching and merge-conflict anxiety, not abandoning tools like git entirely.
- Most commenters see basic version control as near-zero-cost and indispensable, even for single-developer projects (history, rollback, branching experiments, multi-machine work).
- Some argue that complex branching workflows and process around VC can add cognitive overhead and shape architecture in suboptimal ways; you can choose simpler usage patterns.
Solo vs team, scope, and constraints
- Many note the article’s philosophy fits solo, small, largely frozen-feature desktop apps, not large, evolving systems with many users and collaborators.
- Several advocate intentionally austere setups (fewer tools, minimal abstractions, data-oriented design, holistic rewrites) as a way to escape local optima and think more clearly.
- Others counter that in professional contexts with paying users, tests and disciplined version control are hard-won practices, not optional niceties.
LLMs and modern workflow
- A few participants describe workflows where LLMs draft significant portions of code and tests, with humans focusing on design, verification, and fixing AI mistakes.
- Some speculate richer types and structure will make AI-generated code more reliable, reinforcing interest in static typing.
Overall reception of the article
- Reactions range from appreciation for honest experimentation and alternative workflows to calling the piece confused, misleading, or “trolling.”
- The most common criticism is that presenting “giving up tests and versions” as a route to a “better program” is highly context-dependent and dangerous if generalized.