20 Essential Programming Rules for Cleaner, Safer Code
This article distills Chris Zimmeman's "Programming Rules" into twenty concrete guidelines—covering simplicity, bug containment, naming, generalization, deferred optimization, code reviews, debugging, refactoring, conventions, and more—each explained with its rationale and core takeaway for developers.
The piece summarizes Chris Zimmeman's book Programming Rules: How to Write Better Code , extracting twenty actionable principles that help developers write simpler, more maintainable, and less error‑prone software. Each rule is presented with the problem it addresses, the reasoning behind the advice, and a concise core idea.
Rule 1 – As Simple as Possible, but No Simpler
Avoid unnecessary complexity while ensuring the code fully solves the problem.
Code should be easy to understand and maintain.
This rule underpins all other guidelines.
Core idea: Simplicity is valuable, but not at the expense of required functionality or clarity.
Rule 2 – Bugs Are Contagious
The earlier a bug is discovered, the easier it is to fix.
Code that depends on a bug can appear nearby, upstream, or downstream, making debugging harder.
Core idea: Once a bug exists, developers may unintentionally write code that relies on it, complicating repairs.
Rule 3 – A Good Name Is the Best Documentation
Names must accurately reflect the purpose of variables, functions, or classes.
Consistency in naming is crucial.
Avoid overly short or obscure names.
Mechanical naming rules can improve consistency.
Core idea: Clear, expressive names serve as the primary documentation for code intent.
Rule 4 – Generalization Takes Three Examples
One example is insufficient to infer a general pattern.
Two examples may give false confidence.
Three examples allow a more conservative and accurate generalization.
Core idea: Do not generalize until you have at least three concrete use cases.
Rule 5 – Optimize Later
Write simple, clear code first, then measure performance.
Optimization should be driven by performance analysis, not guesswork.
Premature optimization adds complexity and hampers maintainability.
Core idea: Only optimize when a real performance problem is identified.
Rule 6 – Code Reviews Are Good for Three Reasons
They help discover bugs and potential issues.
They promote knowledge sharing among team members.
They improve code maintainability.
Core idea: Code reviews are essential for raising overall code quality.
Rule 7 – Eliminate Failure Cases
Make incorrect usage impossible by leveraging compiler type checks.
Decompose multi‑stage operations into independent objects.
Use C++ templates to implement type‑safe optional parameters.
Core idea: Design code so that misuse is prevented rather than relying on user discipline.
Rule 8 – Code That Isn’t Running Doesn’t Work
Emphasize testing and actual execution.
Encourage removal of dead code instead of keeping it.
Assume other parts of the system function correctly.
Core idea: Unexecuted code is unreliable and should be deleted or fixed.
Rule 9 – Write Collapsible Code
Use abstraction to simplify complex logic.
Consider human short‑term memory limits; reduce the amount a reader must hold simultaneously.
Prioritize readability for quick comprehension.
Core idea: Write code that can be collapsed into a few memorable ideas.
Rule 10 – Localize Complexity
Encapsulate complex logic to avoid duplication.
Keep interfaces simple and consistent.
Use abstraction and encapsulation to reduce cognitive load.
Core idea: Limit the scope of complexity as much as possible.
Rule 11 – Is It Twice as Good?
Refactoring is risky; only undertake it when the benefit is substantial.
If gains are marginal, prefer incremental improvement.
When architecture changes, assess whether a full rewrite is justified.
Core idea: Only perform large‑scale refactoring when the new system is at least twice as good.
Rule 12 – Big Teams Need Strong Conventions
Adopt unified naming, formatting, error handling, and organization conventions.
Conventions reduce the cognitive burden of understanding code.
Strong conventions boost team efficiency and collaboration.
Core idea: Large teams require strict conventions to ensure consistency and maintainability.
Rule 13 – Find the Pebble That Started the Avalanche
Reduce state to make problems easier to locate.
Use breakpoints and step‑by‑step debugging to pinpoint errors.
If the root cause is near the code, it is easier to discover.
Core idea: Debugging focuses on finding the root cause, not just surface symptoms.
Rule 14 – Code Comes in Four Flavors
Simple problem → simple solution.
Simple problem → complex solution.
Complex problem → complex solution.
Complex problem → simple solution.
Core idea: Classify code based on the complexity of the problem and its solution.
Rule 15 – Pull the Weeds
Clean up inconsistent naming, outdated comments, and spelling errors.
Delete dead code to keep the codebase tidy.
Even minor issues deserve time to fix.
Core idea: Remove small problems promptly to prevent them from accumulating.
Rule 16 – Work Backward from Your Result, Not Forward from Your Code
Start with the final goal and design code structure accordingly.
Avoid getting lost in details too early.
Use clear data structures to organize code.
Core idea: Begin with the desired outcome and reason backward to the implementation.
Rule 17 – Sometimes the Bigger Problem Is Easier to Solve
If a specific issue is hard, consider abstracting to a more general case.
General solutions can be simpler and more elegant.
Seek the simplest approach, not necessarily the most generic.
Core idea: Solving a broader problem can be easier than tackling a narrow one.
Rule 18 – Let Your Code Tell Its Own Story
Use meaningful variable and function names.
Organize code with whitespace and indentation.
Prefer assert statements over comments to verify assumptions.
Core idea: Code should be self‑explanatory through clear structure, naming, and formatting.
Rule 19 – Rework in Parallel
When refactoring, keep the old code while gradually introducing the new.
Use the Adapter pattern to switch between old and new implementations.
Control code paths with runtime flags.
Gradually migrate to the new code to reduce risk.
Core idea: Perform refactoring in parallel, preserving existing functionality until the new version is stable.
Rule 20 – Do the Math
Base decisions on quantitative analysis rather than intuition.
Weigh automation costs against benefits.
Use actual data instead of estimates.
Consider all relevant factors.
Core idea: Apply mathematical reasoning and real data to guide engineering choices.
Rule 21 – Sometimes You Just Need to Hammer the Nails
Programming sometimes requires direct, practical solutions without over‑engineering.
Not every problem needs a complex abstraction or algorithm.
Simple, straightforward code can be sufficient.
Avoid over‑design in pursuit of perfection.
Core idea: Use the simplest effective solution; over‑design is unnecessary.
BirdNest Tech Talk
Author of the rpcx microservice framework, original book author, and chair of Baidu's Go CMC committee.
How this landed with the community
Was this worth your time?
0 Comments
Thoughtful readers leave field notes, pushback, and hard-won operational detail here.
