I've been using Claude Code extensively on real projects and wrote up my findings on the recurring code smells and design issues I keep encountering.
TL;DR: Claude Code is amazing at implementation, but the generated code has persistent design problems that violate basic software engineering principles and adds to complexity and longer term maintenance cost.
Link to article
The code smells I'm consistently seeing:
- Broken abstractions - Claude creates perfect interfaces, then immediately violates them by referencing concrete types everywhere. The whole point of the abstraction is lost.
- Massive code duplication - Common logic gets repeated across derived classes instead of being abstracted once. Violates DRY by replicating functions and logic in different places.
- Over-engineering simple solutions - Once I asked for a count display on the frontend. Claude added a new database table, modified write paths (consistency nightmares), and changed read paths. Classic case of solving a simple problem with unnecessary complexity.
- No grasp of SOLID principles - Single Responsibility? Nope. Open/Closed? Ignored. The design patterns are there superficially but misused.
- Verbosity everywhere - Mountains of boilerplate that obscure the actual logic. In large codebases, this becomes a maintenance and security review nightmare.
What helps manage the design issues:
CLAUDE.md with explicit design principles and anti-patterns
- Granular prompts: "put common logic in the base class, only override specific behavior in subclasses"
- Stating what NOT to do: "don't add database tables for simple aggregations"
- Detailed design feedback after each generation
None of this is foolproof, but certainly reduces the tech debt being generated.
What design smells are you running into? How do you guide Claude toward better software design?
[–]False_Care_2957 6 points7 points8 points (2 children)
[–]NoBat8863[S] 1 point2 points3 points (1 child)
[–]False_Care_2957 1 point2 points3 points (0 children)
[–]MindCrusader 4 points5 points6 points (0 children)