Let’s look at some ways programming languages make developers miserable:
| Downside | Languages | What happens |
|---|
| Slow build times because of compiler or project-system constraints | C#, Rust | - Iteration speed collapses.
|
| Nullability handled badly or bolted on late | C#, Java | - More debugging during development.
- Avoidable runtime crashes slip through.
- Code reviews miss dangerous assumptions.
|
| No static type checking | Python, Elixir | - Refactors feel less safe than they should.
|
| Reflection- or decorator-heavy patterns | C#, Java, TypeScript | - Refactors feel less safe than they should.
|
| Allocation-happy idioms | C#, Java, TypeScript, Python | - Ordinary code creates GC pressure.
- Performance problems appear in boring places.
- Efficiency drops without anyone doing anything exotic.
|
| Dependency churn | TypeScript, Python | - Dependencies or sub-dependencies keep breaking.
- Upgrades become a recurring chore.
|
| Overcomplicated project setup | C#, Java, TypeScript | - What if dependency hell, but with your own project’s build system?
|
| Language design favors heavy abstraction | C#, Java | - Simple features disappear under ceremony.
- Tracing behavior takes too long.
- The real problem gets buried under glue code.
|
| Sparse support for expressive static types | Go, C, Python | - You end up repeating the same patterns by hand.
- Reusable code stays more limited than it should.
- Designing clean APIs takes more boilerplate and compromise.
|
| Overly clever type systems | TypeScript, Rust, Scala | - Type checking turns into puzzle solving.
- Compile times get worse.
- Higher barrier to understanding.
|
| Verbose syntax for normal work | C#, Java | - Routine code becomes tiring to write.
- Reading ordinary code takes longer than it should.
- Cleanup and experimentation feel more expensive.
|
| Too many syntax special cases | C#, Rust, TypeScript | - The language gets harder to learn.
- People forget edge cases.
- Small mistakes turn into annoying traps.
|
| Async models that infect everything | C#, TypeScript, Python, Rust | - Complexity spreads across the codebase.
- Error handling gets worse.
- Simple flows become harder to follow.
|
Based on this table, guess which language I am starting to despise?
The answer is C#, because its slow compilation times compound its other weaknesses very painfully. The painfulness factors multiply to create a truly annoying experience.
There you go. Throw your legacy C# crap away and write it smaller, with less features, and in a language that doesn’t suck the joy out of coding.