
"Can we deliver Friday?" You say you will try. Product tells the customer a date. In your mind, there was a possibility contingent on technical discovery; in the listener's mind, there was an agreed delivery. When the unknown dependency surfaces, the conversation already involves trust, pressure and a commercial expectation nobody recorded properly.
The Clean Coder deserves attention because it treats situations like this as part of developing software. It asks developers to communicate explicitly and take responsibility for their decisions. My recommendation comes with a substantial qualification: that demand must recognize what an individual controls and what depends on the organization. Otherwise, a proposed code of conduct can become a sophisticated way to blame the person with less power.
This review covers The Clean Coder: A Code of Conduct for Professional Programmers, by Robert C. Martin, first edition, published in 2011, ISBN 9780137081073. Its subjects include saying yes and no, estimation, practice, testing, pressure and collaboration, as the Pearson/InformIT catalog documents. The similar title can create a mistaken expectation: the central concern here is how programmers behave and form working agreements.
I would recommend it to someone who already delivers code but finds that implementation skill does not resolve difficult conversations about scope, quality and dates. Its contribution is to provide situations for discussing how technical decisions affect other people. It also presents strong positions that deserve challenge. Treating every recommendation as a universal requirement of professionalism limits the usefulness of that discussion.
In an interview about the book's release, Martin emphasizes the distinction between an estimate and a commitment. My practical interpretation separates three pieces of information. A forecast describes what we expect under particular assumptions. A commitment says what we undertake to do. A commercial deadline says when someone needs an outcome. Giving all three the same date does not resolve conflicts between them.
For example, "the customer needs the report Friday" says nothing about implementation effort. "Similar work has taken a few days" does not guarantee the outcome of this task. "I will investigate the data format and present alternatives tomorrow" describes a more bounded action. Unexpected events remain possible, but the agreement identifies something people can follow without pretending the whole problem has been solved.
A duration range can help when its assumptions are visible. Giving a forecast three numbers does not itself produce trustworthy probabilities. Discussing confidence requires comparing earlier forecasts with outcomes, recognizing scope changes and separating working time from waiting time. Otherwise, the range merely presents a guess in a more elaborate format. A team needs feedback on its predictions as much as it needs careful wording.
Consider this original fictional scenario. On Monday, a team is asked to deliver a report by Friday with a date filter, CSV export, PDF output and automatic email delivery. A data query exists, but nobody has checked volume, permissions or time-zone differences. The email service requires external approval with no confirmed date.
Saying yes to the whole package passes that uncertainty to the customer without explaining it. Saying "impossible" and ending the discussion also leaves alternatives unexplored. Perhaps the customer needs to check amounts during a meeting, and a validated CSV would meet the immediate need. Perhaps a PDF is a genuine requirement and the CSV has little value. Negotiation must discover that difference.
An initial agreement could read:
By Tuesday at 3 p.m., I will validate query permissions, a data sample and expected volume, then present a scope proposal. On Wednesday, we will demonstrate CSV export for a known period if that validation confirms our current assumptions. Product will confirm whether this meets the customer's Friday meeting need. PDF output and automatic delivery will receive separate forecasts after investigation; email-service approval needs an owner. We will update this agreement Tuesday and communicate any blocker before then.
This is a negotiation example, not a recommended schedule for real reporting work. Its value is in making decisions visible that "we will try to deliver" concealed. Engineering owns investigation and communication. Product owns clarifying the need. The external dependency gets an owner. The meeting date still matters, now accompanied by choices people can discuss.
If the query fails validation Tuesday, the Wednesday demonstration must be reconsidered. An explicit condition does not authorize silence until the next check-in. The duty to communicate remains, and the impact should be presented while alternatives still exist. If email approval arrives early, one uncertainty falls away; that does not establish that scheduling is ready to use.
Free and paid products to turn ideas into a foundation you can actually ship.
13 products availableContinue exploring similar topics

Turn passive study into a learning project with direct practice, feedback and spaced retrieval.

A review of The Pragmatic Programmer's anniversary edition: DRY, reversibility, prototypes and feedback examined through an inventory-import scenario.

Apply Michael Nygard's approach to timeouts, isolation and recovery through a controlled failure exercise.
A 47-point checklist to find bugs, security risks, and performance issues before launch.
Production-tested templates trusted by developers. Save weeks of setup on your next project.
The official Saying Yes excerpt connects commitment with clearly stated action. Its guest section, A Language of Commitment, is written by Roy Osherove and deserves that credit. The discussion becomes useful when the recipient can repeat the agreement without relying on an optimistic interpretation.
The report scenario offers alternatives with different consequences:
| Alternative | Possible benefit | Cost or condition to accept |
|---|---|---|
| Manual CSV export for the meeting | Enables checking data by the commercial deadline | Requires manual operation and customer validation of the format |
| Complete report after investigation | Keeps PDF and scheduling in scope | Requires renegotiating the Friday expectation |
| Delay the customer promise until the query is validated | Avoids announcing an unsupported outcome | Leaves less time to organize the meeting |
No option is automatically correct. The decision depends on usefulness and risk, and should involve whoever owns the commercial need. Declining the complete Friday package may allow agreement on a smaller delivery. Removing access authorization or data validation merely to preserve the date, however, creates a different and potentially unsuitable outcome. Those properties belong in the definition of done.
I would also distinguish technical refusal from decision authority. A developer presents constraints and consequences; leadership and product must decide priorities, resources and customer communication. If their response is simply "deliver everything anyway," the conflict remains. Better wording from the developer cannot resolve that incompatibility on its own.
The official Coding sample discusses lateness, pacing, defining done and seeking help. My application to the report would be to define acceptance examples before declaring export complete. A known period should produce expected amounts. Someone without permission should remain unable to access the data. An empty result needs an agreed treatment.
Those examples improve a progress conversation. "I finished the function" says little to the person expecting to use the report. "The agreed cases pass; real-volume validation remains" describes a capability and a gap. Tests do not eliminate unknown defects, but they provide evidence for the stated claim. Negotiation improves when the team distinguishes a demonstration, validation and availability to users.
Practice should have a concrete outcome too. Before committing to an important migration, a developer might rehearse recovery in a controlled environment and record unanswered questions. To improve estimation, they might compare anticipated work with completed work, including interruptions. I would plan space for this learning in the team's routine. Repetition helps when feedback addresses a skill that the work requires.
That does not make any particular discipline an automatic certificate of competence. Using TDD, practicing exercises or helping colleagues does not independently establish that a commercial commitment is feasible. Ask which uncertainty the practice reduces and which evidence it makes available for the next decision. This keeps a discussion about professionalism tied to useful behavior rather than visible rituals.
My strongest reservation concerns the force of some individual prescriptions. In the interview cited earlier, Martin goes as far as assigning responsibility for failure to developers who yield to a deadline they do not believe in. I consider that insufficient for organizations where refusing a promise can threaten evaluation, income or continued employment. A person can communicate honestly and still face a structure that punishes honesty.
Leaders need to make it possible to report risk, remove obstacles and revise priorities. Access controlled by another team does not materialize because someone phrases a commitment better. Understaffing and conflicting priorities require organizational decisions. Recording dependencies supports coordination; using the record only to find someone to blame would undermine the incentive to report problems early.
I would also avoid caricaturing the book as a simple endorsement of exhaustion. The sample advocates pacing and stepping away when fatigue takes over, and places conditions on overtime. My position goes further: recurring excessive hours and mandatory learning outside paid work should not function as tests of seriousness. Sustainable practice needs to account for health, caring responsibilities and people's actual circumstances.
Personal stories make abstract positions easier to discuss, but remain stories. A successful experience reported by the author does not establish that the same approach will have the same effect in another company. I would use those accounts to generate hypotheses and questions, without presenting them as empirical demonstrations or as descriptions of every working relationship.
Architecture expertise is unnecessary. Participating in a group delivery, even a small one, provides reference points for thinking about promises and dependencies. Someone in a first job may find language for requesting clarification and help. I particularly recommend reading it jointly with engineering leaders so that responsibility does not fall on only one side of the conversation.
I would postpone it when the immediate need is learning syntax, debugging or a first test. The book cannot replace that technical foundation. For someone facing an organization that consistently ignores warnings, it offers arguments but cannot guarantee protection or cultural change. Requiring a reader to transform that environment alone would be unfair.
In this series, I would put Peopleware alongside it to examine the working conditions surrounding individual conduct. The Pragmatic Programmer broadens the discussion toward technical choices and everyday learning. Accelerate helps frame questions about organizational delivery capability. My proposed comparison is to identify what belongs to the individual, the team and the working system before deciding who needs to change what.
Choose a real task that remains open. Record the required outcome, current forecast, assumptions, dependencies and definition of done. While reading about commitments, rewrite one vague answer as a bounded action with a review point. While reading about testing and pressure, add the necessary evidence and an alternative if the principal assumption fails.
Ask someone else to explain the agreement in their own words. If they understand what they will receive, what remains uncertain and when they will get an update, there is observable progress. Compare the eventual result with the forecast to learn about the work, without treating every deviation as a moral assessment of its implementer.
I recommend The Clean Coder as a critical reading about trust and responsibility. Its strongest use is to make working conversations more explicit and delivery claims better supported by evidence. Its limitation appears when individual duties become the proposed answer to problems of power and organization. A favorable review should keep both considerations present when recommending the book.