On the cruelty of really teaching computing science (1988)
Role and Feasibility of Formal Methods
- Many agree the essay correctly emphasizes mathematical rigor and formal proofs, especially for safety‑critical domains (aerospace, medical, crypto, kernels).
- Several note current tools (proof assistants, verifiable languages, expressive type systems) make this somewhat practical for medium‑sized codebases, but cost and scaling remain major barriers.
- Others argue that only a small fraction of software justifies this rigor; most work is closer to “residential construction” where rules of thumb and testing suffice.
LLMs and Proof Automation
- Some are optimistic that LLMs will drastically lower the cost of writing specifications and proof scripts, auto‑formalizing math and code and “filling in” proofs with humans guiding decomposition.
- Others report that current LLMs are “really bad” at actual machine‑checked proofs, easily failing combinatorial or detailed reasoning tasks.
- Consensus: LLMs may help with boring glue work and specification writing, but not replace human judgement or solve the specification problem itself.
Computer Science Education
- There is debate over curricula that begin with formal methods and program correctness proofs versus more pragmatic, trial‑and‑error programming.
- One account of a proof‑heavy curriculum reports it was coherent and intellectually satisfying but not obviously practical, and was eventually abandoned.
- Several lament that modern CS often teaches patterns and frameworks rather than how computers work or how to reason rigorously.
Programming Practice, Performance, and “Clean Code”
- Some criticize popular design doctrines (e.g., heavy abstraction, “clean code”) as leading to poor performance and not clearly improving maintainability.
- Others counter that non‑critical code should optimize for maintainability and that modern runtimes can mitigate overhead; performance should be profile‑driven.
- There is broader agreement that many developers function mainly as “framework glue,” with real value coming from architecture and critical thinking.
Programming vs. Mathematics
- Several comments explore whether programming really involves deeper conceptual hierarchies than mathematics, as the essay claims.
- Examples from both sides are given: massive proof projects in math vs. enormous codebases, formal proofs of simple arithmetic in proof assistants, and the difficulty of writing even a correct binary search.
- Some argue programming is essentially discrete mathematics; others stress its physical, operational nature and the centrality of changing, ambiguous requirements.
Testing, Correctness, and Real‑World Constraints
- The essay’s skepticism toward testing is challenged: extensive automated tests, fuzzing, and model checking can prove absence of certain bug classes, at least in theory.
- Practically, most teams settle for “doesn’t usually fail” rather than exhaustive guarantees.
- A recurring theme is that requirements are often inconsistent or unstable, making full formal correctness less valuable than adaptability (“software as gardening”).