Susa Β· basalt or diorite Β· 2.25 m Β· c. 1754 BCE Β· 282 laws
Every law in the Code of Hammurabi is a conditional β Ε‘umma awΔ«lum, βif a manβ¦β. So is every law here: if the mechanism holds, then do this, unless the counter-force applies.
ββ¦to bring about the rule of righteousness in the land, so that the strong should not harm the weak.β
β The Code of Hammurabi, c. 1754 BCE
Hammurabi did not invent justice; he wrote it down, numbered it, and set it in stone where everyone could read the same law. This codex does that for engineering β the recurring forces that govern systems, teams, and decisions, carved as articles so they can be cited, argued, and amended, rather than rediscovered at 3 AM.
The brain instinctively treats all failures as threats to survival, demanding excessive caution for reversible decisions (Two-way doors). This causes "Analysis Paralysis."
Then
βIf a decision is easily reversible (two-way door), ship within 24 hours to gain data. Only spend days/weeks on "one-way doors" (e.g., core database schema, security protocols).β
Unless
The "One-Way Door" Filter
SourceJeff Bezos, 2015 Letter to Shareholders (Amazon.com, Inc., filed April 2016) β the letter that introduced the "Type 1 / Type 2 decisions" framing. The 1997 letter is the "Day 1" letter and does not contain it.
When a minor rule is broken (e.g., skipping a test) and no immediate disaster occurs, the brain re-classifies this "deviance" as "normal." This is how catastrophic failures begin.
Then
βIf you see a "hack" or a bypassed alert, do not say "it worked before." Either fix it immediately or document it as high-priority technical debt.β
Unless
Broken Windows Theory
SourceDiane Vaughan, The Challenger Launch Decision (1996) β coined while analyzing the NASA Challenger disaster.
We view legacy code/processes as "clutter" because we lack the context of their origin. The ego jumps to "simplify" by deleting what it doesn't understand.
Then
βYou are forbidden from removing a "fence" (code/rule) until you can explain why it was put there β but put a deadline on the search. When it expires, take the fence down behind a flag, with a rollback ready, and watch what complains.β
Unless
Time-Boxed Archaeology β taken absolutely the rule removes nothing ever, because the reason is sometimes gone with the person who had it
SourceG. K. Chesterton, The Thing (1929) β the original parable of the fence in the road.
In the face of a true anomaly, the brain defaults to the most "frequent" explanation to save energy. "It's probably just a transient network error," we say as the database corrupts.
Then
βWhen an error occurs, ask: "If this were the start of a total system collapse, what would the next 10 minutes look like?" If that scares you, investigate now.β
Unless
Pre-mortem / Red Teaming
SourceDisaster psychology literature; widely surveyed in Amanda Ripley, The Unthinkable (2008).
People provide more feedback on simple things (naming variables) than complex things (distributed consensus) because everyone understands the simple things, creating a false sense of value.
Then
βIf a PR review spends 80% of comments on style/naming, approve immediately and move the discussion to an automated linter config.β
Unless
Core Value Focus
SourceC. Northcote Parkinson, Parkinson's Law and Other Studies in Administration (Houghton Mifflin, 1957), in the chapter "High Finance, or the Point of Vanishing Interest" β the original bike-shed committee parable. Published in the UK as Parkinson's Law: The Pursuit of Progress (John Murray, 1958).
With a sufficient number of users, every observable behavior of your system (even bugs) will be depended on by someone.
Then
β"Internal" doesn't exist once you have users. Version and feature-flag what you promise; deliberately vary what you do not, so nobody can build on it in the first place.β
Unless
Deliberate Variance β if every observable behaviour were sacred nothing could ever change, so vary what you never promised β randomised iteration order, planned outages β and the dependency never forms
SourceHyrum Wright, hyrumslaw.com; canonicalized in Software Engineering at Google (Winters, Manshreck, Wright, 2020).
Adding people to a late project increases communication overhead quadratically (n(n-1)/2 communication channels for n people). New people take more time from veterans than they contribute.
Then
βIf a project is late, do not add people. Remove features or push the date.β
Unless
Scope Cutting
SourceFred Brooks, The Mythical Man-Month (1975, anniversary edition 1995).
In a distributed system, assuming everyone follows the spec perfectly leads to brittle failures.
Then
βBe conservative in what you send (strict compliance) and liberal in what you accept (handle messy inputs gracefully).β
Unless
Fail-Fast (Internal only)
SourceJon Postel, RFC 761 (DoD Standard TCP, January 1980) Β§2.10 β "be conservative in what you do, be liberal in what you accept from others". The same guidance appears in RFC 760 (IP) Β§3.2 in different words, and verbatim again in RFC 793 (1981).
We study only the successes that survived and draw conclusions from them, ignoring the silent graveyard of failures that used the same strategy. The data we see is fundamentally skewed.
Then
βBefore adopting a strategy because "Company X succeeded with it," research how many companies failed using the same approach. The dead don't write blog posts.β
Unless
Failure Studies / Post-mortem Culture
SourceAbraham Wald, A Method of Estimating Plane Vulnerability (SRG Memo, 1943) β the WWII bomber-armor analysis.
"Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it."
Then
βCode "cleverness" is a liability, not an asset. Write code that your future self, sleep-deprived at 3 AM, can still understand in 6 months.β
Unless
KISS (Keep It Simple, Stupid)
SourceBrian W. Kernighan & P. J. Plauger, The Elements of Programming Style, 2nd ed. (1978).
A solution designed to fix a problem creates a worse problem. In colonial India, a bounty on cobras led people to breed cobras for the reward. When the bounty was cancelled, breeders released their stock, making the problem worse.
Then
βFor every incentive you create, ask: "If someone wanted to game this, how would they?" If you can find a way, the design is wrong.β
Unless
Second-Order Effects Analysis / System Dynamics
SourceHorst Siebert, Der Kobra-Effekt: Wie man Irrwege der Wirtschaftspolitik vermeidet (2001).
Humans can maintain approximately 150 stable social relationships. Dunbar's result is about neocortex size and group size across primates β it is not about work teams. What engineering extrapolates from it is a separate argument: communication channels grow as n(n-1)/2, so past the size where everyone can still hold everyone else's context, added people go into coordination rather than output.
Then
βWhen a team exceeds 7Β±2 people, split it. If "information-sharing meetings" start multiplying, that's the symptom of exceeding the cognitive limit.β
Unless
Two-Pizza Rule / Team Topologies
SourceRobin I. M. Dunbar, Neocortex size as a constraint on group size in primates (Journal of Human Evolution, 1992). The smaller team-size figures usually quoted alongside it β 7Β±2, the two-pizza rule β are folklore rather than Dunbar's finding.
A simpler, "inferior" design that is easy to implement and adopt will beat a theoretically "correct" but complex design in the real world. Unix beat Lisp. HTTP beat CORBA.
Then
βA solution that is 80% correct and ships today will outperform a 100% correct solution that ships next year. Optimize for adoption, not elegance.β
Unless
The Right Thing / Perfectionism
SourceRichard P. Gabriel, Lisp: Good News, Bad News, How to Win Big (1991) β the "Worse is Better" essay.
"The best way to get the right answer on the internet is not to ask a question; it's to post the wrong answer." People are more motivated to correct mistakes than to answer questions.
Then
βWhen documentation is missing, post your best guess of how something works. The person who knows the truth will appear to correct you far faster than if you had asked directly.β
Unless
Socratic Method
SourceAttributed to Ward Cunningham (inventor of the wiki) by Steven McGeady; named in this form on Wikipedia (~2010).
In an emergency, the more people who are present, the less likely any single person is to take action. "Someone else will handle it." In engineering, a page sent to a group channel often means nobody responds.
Then
βNever say "Can someone look at this?" Instead, say "@name, you are investigating this." Assign a single, named owner for every incident.β
"Anything that can go wrong, will go wrong." Given enough time, traffic, or unexpected input, every latent failure mode eventually fires. Engineers who design only for the happy path build systems that are one network blip away from collapse.
Then
βTreat every external dependency, retry, and timeout as something that will fail in production. Build the failure path before the success path.β
Unless
Defensive Design / Chaos Engineering
SourceCapt. Edward A. Murphy Jr., USAF Project MX981 (1949); popularized by Maj. John Paul Stapp.
Codebases decay because cleanup is always "someone else's job." Each engineer absorbs the entropy hit but defers the fix to a future refactor that never lands. The graph trends down.
Then
βAlways leave the code cleaner than you found it, and keep the cleanup small enough to read inside the same diff β a one-line rename, a clearer comment, a deleted dead branch. Anything bigger gets its own commit.β
Unless
One Reason Per Diff β cleanup riding along with a behaviour change hides the change, and a pull request that also renames forty things is one nobody reviews
SourceRobert C. Martin, The Boy Scout Rule, in Kevlin Henney (ed.), 97 Things Every Programmer Should Know (O'Reilly, 2010) β adapting Baden-Powell's "leave this world a little better than you found it". Also stated in Clean Code (2008).
Every system has an irreducible amount of complexity that cannot be removed β only relocated. Hide it from the user and it lands on the developer. Hide it from the developer and it lands on the operator. Hide it from the operator and it lands on the customer at 3 AM.
Then
βWhen a "simple API" feels too clean, ask: who absorbed the complexity I just removed? If you can't name them, you didn't simplify β you displaced.β
Unless
Honest Layering / Explicit Tradeoffs
SourceLarry Tesler, while at Xerox PARC / Apple (~1984); cited as the "Law of Conservation of Complexity."
Lacking expertise in a domain also means lacking the meta-skill required to recognize one's own incompetence. In the original study the bottom quartile scored around the 12th percentile and placed themselves near the 60th. Top performers under-rated themselves, because they assumed others found the task as easy as they did.
Then
βWhen someone declares a hard problem "easy," check their domain history before trusting the estimate. During scoping, pair confident newcomers with quiet veterans and weight the quiet voice.β
Unless
Calibrated Confidence β the effect is contested β much of the classic pattern is reproduced by regression to the mean in noisy self-assessment, so treat overconfidence as a prompt to check the record rather than as a diagnosis
SourceJustin Kruger & David Dunning, Unskilled and Unaware of It (JPSP, 1999).
Once you know a thing, you cannot easily imagine not knowing it. Engineers write docs, error messages, and APIs that are obvious to themselves and opaque to the next person who has to use them.
Then
βBefore shipping documentation or a public API, have someone who has never touched the system attempt the task while you watch silently. Their confusion points exactly at the assumptions you forgot to spell out.β
Unless
User Testing / Onboarding Buddies / Documentation Reviewers Outside the Author's Team
SourceColin Camerer, George Loewenstein & Martin Weber, The Curse of Knowledge in Economic Settings: An Experimental Analysis (Journal of Political Economy, 1989).
Every protective layer (review, test, alert, runbook, rollback) has holes. Accidents happen when holes across multiple independent layers happen to align. No single layer can ever be perfect, so resilience comes from layers that fail in independent ways.
Then
βDuring an incident review, do not stop at "the one thing that failed." Enumerate every layer that should have caught the failure and ask why each hole was open at exactly that moment. The fix is rarely a single layer; it's plugging the cheapest two.β
Unless
Defense in Depth / Independent Controls / Hole-Audit at Post-Mortem
SourceJames Reason, Human Error (Cambridge University Press, 1990).
"Premature optimization is the root of all evil." Optimizing code before measurement proves it matters wastes engineering hours, adds complexity, and obstructs the eventual real optimization by entangling hot and cold paths.
Then
βWrite the obvious code first. Only optimize hot paths that a profiler proves are bottlenecks. Leave the other 97% of the code simple β that's where the next maintainer will live.β
Unless
Profile First / Make It Work, Make It Right, Make It Fast (in that order)
SourceDonald E. Knuth, Structured Programming with go to Statements (Computing Surveys, 1974).
"Given enough eyeballs, all bugs are shallow." A defect that looks impossible to one person often becomes trivial when many independent perspectives are applied to it β provided the code is actually visible to those perspectives.
Then
βIf the same class of bug keeps slipping through, the fix is not more careful review by the same people β it is exposing the code to more, differently-shaped eyes. Rotate reviewers, open up internal libraries, run bug bounties.β
A networked data store cannot simultaneously guarantee Consistency, Availability, and Partition tolerance. Because network partitions are not optional in the real world, the live choice is really between consistency and availability at the moment a partition happens.
Then
βDecide before an outage whether each operation prefers consistency or availability. The partition will happen; the only question is what your system does when it does.β
Unless
PACELC / Tunable Consistency
SourceEric Brewer, Towards Robust Distributed Systems (PODC keynote, 2000); proved by Seth Gilbert & Nancy Lynch (SIGACT News, 2002).
In any stable system, the average number of items in the system (L) equals the average arrival rate (Ξ») times the average time each item spends in it (W): L = Ξ»W. It holds regardless of arrival distribution or service discipline.
Then
βTo cut latency (W) without adding capacity, cut work-in-progress (L). Cap concurrent requests β a shorter queue is faster than a faster server.β
Unless
Backpressure / Admission Control
SourceJohn D. C. Little, A Proof for the Queuing Formula L = Ξ»W (Operations Research, 1961).
Two parties communicating over an unreliable channel can never be certain they have reached agreement β every message needs an acknowledgment, which itself needs an acknowledgment, forever. No fixed number of messages yields common knowledge.
Then
βNever assume "I sent it, so they got it." Make every cross-network action safely retryable and idempotent, and reconcile state instead of trusting a single round-trip.β
In a hierarchy, people are promoted on performance in their current role, not the one above. So everyone tends to rise until they reach a role they are bad at β and there they stay. Competence is promoted away; incompetence accumulates.
Then
βDo not promote your best engineer into management as a reward β it removes a great engineer and risks creating a poor manager. Offer a technical ladder, and evaluate candidates for the role above, not the one they already mastered.β
Unless
Dual Career Ladders / Role-Specific Evaluation
SourceLaurence J. Peter & Raymond Hull, The Peter Principle (1969).
"Work expands so as to fill the time available for its completion." Give a task a week and it takes a week; the same task with a two-day deadline ships in two days. Slack is consumed, not banked.
Then
βSet deliberately short timeboxes for open-ended work and review at the deadline. A tight box forces the scoping decisions an open one defers forever.β
Unless
Timeboxing
SourceC. Northcote Parkinson, Parkinson's Law (The Economist, 19 November 1955); expanded into Parkinson's Law and Other Studies in Administration (Houghton Mifflin, 1957).
"Software is getting slower more rapidly than hardware is becoming faster." Each hardware gain is absorbed by added abstraction layers, features, and carelessness, so user-perceived speed stays flat or worsens.
Then
βTreat the speed a faster machine buys you as a budget to protect, not a license to spend. Set a performance budget and fail the build when a release regresses against it.β
Unless
Performance Budgets / Lean Software
SourceNiklaus Wirth, A Plea for Lean Software (IEEE Computer, 1995).
"The first 90% of the code accounts for the first 90% of the development time. The remaining 10% of the code accounts for the other 90% of the development time." The visible work hides a second, equally large body of integration, edge cases, and polish.
Then
βWhen something looks "almost done," assume an entire second project remains: the last-10% of hardening, edge cases, and integration. Schedule it explicitly instead of treating it as a rounding error.β
Unless
Demo on Real Data / Hard Definition of Done
SourceTom Cargill (Bell Labs); popularized by Jon Bentley, Programming Pearls (CACM, 1985).
"Any code of your own that you haven't looked at for six months might as well have been written by someone else." Your mental model of the code evaporates far faster than the code does; context is not stored in the source.
Then
βWrite code and commit messages for the stranger you will become in six months. If a decision is not obvious from the code, record the why in a comment or an ADR β not just in your head.β
Unless
ADRs / Self-Explaining Code / Code Comments on the "Why"
SourceProgramming folklore attributed to Peter Eagleson; a long-circulated adage among the catalogued "laws of software development."
The time to make a decision grows logarithmically with the number of choices: T = bΒ·logβ(n+1). More options do not just add visual clutter β they measurably slow every user down.
Then
βCut the number of choices on any screen or API surface to the few that matter; push the rest behind defaults and progressive disclosure. Fewer doors, faster decisions.β
Unless
Progressive Disclosure / Sensible Defaults
SourceWilliam E. Hick (1952) and Ray Hyman (1953) β the "HickβHyman Law."
The time to move to a target depends on its distance and size: distant, small targets are slow and error-prone; near, large targets are fast. Pointing is a physical act with a measurable cost.
Then
βMake frequent or destructive actions big and easy to hit; make rare or dangerous ones small and far. Screen edges and corners are effectively infinite targets β put primary actions there.β
Unless
Edges & Corners / Sizing by Frequency
SourcePaul M. Fitts, The Information Capacity of the Human Motor System in Controlling the Amplitude of Movement (Journal of Experimental Psychology, 1954).
"The Magical Number Seven, Plus or Minus Two" β human working memory holds only about seven chunks at once. Cross that limit and recall collapses; the brain drops items rather than slowing down.
Then
βGroup related items into a handful of named chunks β phone-number style β wherever a person must hold state in their head: function arguments, form fields, menu groups, on-call steps.β
Unless
Chunking / Information Hiding
SourceGeorge A. Miller, The Magical Number Seven, Plus or Minus Two (Psychological Review, 1956).
Newcomers to distributed systems silently assume the network is reliable, latency is zero, bandwidth is infinite, the network is secure, topology is stable, there is one administrator, transport cost is zero, and the network is homogeneous. Every one of these eight assumptions fails in production.
Then
βBefore shipping any cross-process call, name which of the eight assumptions you are relying on and add an explicit timeout, retry, and failure path for each.β
Unless
Design for Failure β without gold-plating against impossible modes
SourceL. Peter Deutsch (fallacies 5β7, 1994) and James Gosling (the 8th, ~1997), building on earlier work at Sun Microsystems.
Automating the routine parts of a task leaves the human only the rarest, hardest exceptions β while their manual skill and situational awareness atrophy from disuse, precisely at the moment a failing automated system hands control back to them.
Then
βKeep operators sharp with regular game-days and hands-on drills, and design handoffs so a human takes over with context, not cold.β
Unless
Human-in-the-Loop Drills β better teaming, not less automation
SourceLisanne Bainbridge, Ironies of Automation (Automatica, 1983).
Every component granted more authority than it strictly needs enlarges the blast radius of any bug, compromise, or accident, and multiplies the interactions an auditor must reason about.
Then
βDefault every process, service account, and token to deny, then add only the minimal scopes the job provably needs; re-audit the grants whenever the job changes.β
Unless
Psychological Acceptability β over-restriction that users route around defeats itself
SourceJerome Saltzer & Michael Schroeder, The Protection of Information in Computer Systems (Proceedings of the IEEE, 1975).
A cryptosystem should remain secure even if everything about it except the key is public. Secrecy of the algorithm is brittle: mechanisms leak, get reverse-engineered, and get reused across systems.
Then
βAssume the attacker has your source and design. Put all of the secret in rotatable keys, and never rely on a hidden algorithm to protect anything.β
Unless
Defense in Depth β obscurity may be one thin extra layer, never the foundation
SourceAuguste Kerckhoffs, La cryptographie militaire (Journal des sciences militaires, 1883).
For a fixed time budget, a larger machine lets you solve a proportionally larger problem, so the serial fraction shrinks with scale and speedup grows near-linearly β the optimistic counterpart to Amdahl's fixed-workload pessimism.
Then
βBefore justifying more cores, ask whether the problem size grows with the hardware. If the workload is fixed, reason with Amdahl; if it scales, Gustafson applies.β
Unless
Amdahl's Law β for a fixed-size workload, the serial fraction still hard-caps speedup
SourceJohn L. Gustafson, Reevaluating Amdahl's Law (Communications of the ACM, 1988).
In a service that fans out to many components, rare per-node slowness (GC pauses, contention, a failing disk) is near-certain to hit some node on every request. So tail latency (p99, p99.9) governs the user experience even when medians look healthy.
Then
βSet SLOs on p99/p99.9, not the mean, and deploy tail-tolerance β hedged requests, micro-partitioning β instead of trying to make every node uniformly fast.β
Unless
Redundancy Has a Price β hedged and tied requests add load; don't chase the tail where the median is what users feel
A controller can regulate a system only if it can match the variety of states that system can produce. Under-powered control simply cannot cope with a sufficiently rich environment.
Then
βWhen incidents keep escaping your alerts and runbooks, either add matching response capability or deliberately shrink the system's state space: fewer configurations, stricter inputs.β
Unless
Constrain the Environment β excess control variety is itself cost and complexity
SourceW. Ross Ashby, An Introduction to Cybernetics (Chapman & Hall, 1956).
An object that reaches through other objects' internals (`a.getB().getC().doThing()`) couples itself to the entire dependency chain, so a change anywhere along that chain ripples back and breaks it.
Then
βOnly call methods on your direct collaborators, your arguments, objects you create, and your own fields. If you are chaining getters, add a method to the object that owns the data.β
Unless
Pragmatism over Dogma β strict application breeds forwarding and wrapper bloat
SourceKarl Lieberherr & Ian Holland, Assuring Good Style for Object-Oriented Programs (IEEE Software, 1989).
Making a resource cheaper to use per unit lowers its effective price and can raise total consumption instead of lowering it β the efficiency gain is spent on more usage rather than banked as savings.
Then
βWhen you make something cheaper β compute, storage, an internal API β expect demand to balloon; provision and budget for the rebound instead of assuming a net reduction.β
Unless
Cap the Rebound β pair efficiency with a quota, cap, or price signal to actually capture the savings
SourceWilliam Stanley Jevons, The Coal Question (1865).
In systems that are both interactively complex and tightly coupled, small independent failures interact in ways no designer anticipated and propagate faster than operators can intervene β so accidents become a property of the structure, not bad luck.
Then
βReduce coupling β add buffers, timeouts, bulkheads, and circuit breakers β and cut complexity before adding more safety interlocks, which themselves add interactions.β
Unless
High-Reliability Organizations β culture, slack, and decoupling measurably beat fatalism
SourceCharles Perrow, Normal Accidents: Living with High-Risk Technologies (Basic Books, 1984).
An unrepaired broken window signals that nobody is watching, which lowers the cost of the next violation. In a codebase, one tolerated hack, one skipped test and one permanently silenced alert together announce that the standard is optional.
Then
βRepair the first visible defect in a file you are already touching, and give every tolerated exception an owner and a date. Do not open a refactor for a window you are not standing next to.β
Unless
Repair Is Not Free β attention spent on paint is attention not spent on the foundation, and the criminological evidence for the original claim is contested
SourceJames Q. Wilson & George L. Kelling, Broken Windows (The Atlantic, March 1982).
Speculative generality is paid for three times: writing the abstraction, carrying it while it is unused, and unpicking it when the anticipated requirement finally arrives in a different shape. Predictions about future requirements are usually wrong in exactly the details the abstraction fixed.
Then
βImplement the case you actually have. When you feel the pull to generalise, name the second concrete case first β if you cannot, you do not have a pattern, you have a guess.β
Unless
Chesterton's Fence β YAGNI licenses you not to build something; it never licenses you to delete something whose purpose you have not established
SourceRon Jeffries, Extreme Programming practice notes; named "You Aren't Gonna Need It" and popularised in Kent Beck, Extreme Programming Explained (1999).
"Keep it simple, stupid" came out of aircraft design, where the requirement was that a jet be repairable by an average mechanic in a field with basic tools. The test was never elegance β it was whether an ordinary person could fix it in the worst circumstances the thing would actually meet.
Then
βJudge a design by who can repair it at 3 AM, not by how it reads in review. If the on-call engineer needs the author on the call, it is not simple β it is familiar to one person.β
Unless
Ashby's Law of Requisite Variety β a system simpler than the problem it has to regulate cannot cope with it, and simplicity below that floor is displaced complexity rather than less of it
SourceAttributed to Kelly Johnson at Lockheed's Skunk Works (c. 1960), as a field-maintainability requirement for combat aircraft.
Duplicated knowledge drifts, because nothing forces the copies to change together. The cost is not the extra characters β it is that some future editor fixes one copy and ships a system that now quietly contradicts itself.
Then
βDeduplicate knowledge, not text. Before merging two similar blocks, ask whether they change for the same reason and at the request of the same person; if not, leave them apart.β
Unless
Duplication Is Cheaper Than the Wrong Abstraction β two blocks that merely look alike today will fight each other the moment they need to diverge
SourceAndrew Hunt & David Thomas, The Pragmatic Programmer (Addison-Wesley, 1999) β "every piece of knowledge must have a single, unambiguous, authoritative representation within a system."
Every chain has one weakest link. Improvement anywhere else raises local efficiency while total throughput stays flat β and often makes things worse, because the faster upstream stage simply piles more work in front of the real bottleneck.
Then
βFind the constraint, exploit it fully before you buy capacity, and subordinate every other stage to it. Then measure again β you have just created a different bottleneck somewhere else.β
Unless
The Constraint Moves β relieve one and another takes its place, so a process permanently optimised around yesterday's bottleneck starves at the new one
SourceEliyahu M. Goldratt & Jeff Cox, The Goal: A Process of Ongoing Improvement (North River Press, 1984).
Under incident pressure the mind reaches for the interesting hypothesis β a kernel bug, a bad disk, an attacker. The explanation requiring the fewest unverified assumptions is almost always the deploy that went out twenty minutes ago.
Then
βRank your hypotheses by how many unverified assumptions each needs, and test the cheapest first. Ask "what changed?" before "what is broken?"β
Unless
Hickam's Dictum β a system can carry several independent faults at once, and the simplest story that fits the symptoms is not automatically the true one
SourceAttributed to William of Ockham (c. 1287β1347); the shaving metaphor and the formula entia non sunt multiplicanda praeter necessitatem are both later glosses on his principle of parsimony.
When one module serves two audiences, their change requests arrive on different schedules and collide in the same file. Coupling is not really about calls between modules β it is about who is entitled to force you to edit them.
Then
βDefine responsibility by who asks for the change, not by what the code does. If two different people can each demand an edit to the same module, split it along that line and nowhere else.β
Unless
Premature Decomposition β splitting by imagined responsibilities produces a scatter of one-method classes and moves all the complexity into the wiring between them
SourceRobert C. Martin, Agile Software Development: Principles, Patterns, and Practices (2002); sharpened to "a module should be responsible to one, and only one, actor" in The Single Responsibility Principle (The Clean Code Blog, 8 May 2014), which is what this links to, and restated in Clean Architecture (2017).
Users arrive with a model assembled from every similar thing they have used. A behaviour that is defensible but surprising costs more than a behaviour that is slightly worse but predicted, because the surprise is paid again by every user, every time, forever.
Then
βWhen two designs are close, take the one that matches the convention your users already know β the flag name, the exit code, the sort order. Spend deliberate surprise only where you can afford to announce it.β
Unless
Astonishment Is Relative β designing only for today's expectations freezes bad conventions in place; sometimes the right move is to surprise everyone once, loudly, with a migration path
SourceLong-standing folklore in language and interface design; stated explicitly in Michael F. Cowlishaw, The Design of the REXX Language (IBM Systems Journal, 1984).
The first system is built cautiously, by someone unsure of the ground. Its success converts that caution into confidence, and every idea deferred the first time is loaded into the rewrite at once. The result is over-general, late, and frequently never ships at all.
Then
βWhen rewriting, carry forward the constraints and not just the wish list. Cut the deferred features to the two that actually blocked users, and replace the original one piece at a time.β
Unless
Gall's Law β the answer is not to freeze the first system but to grow it β a rewrite that ships in slices is not a second system
SourceFred Brooks, The Mythical Man-Month (Addison-Wesley, 1975), chapter 5.
Moore's observation was economic rather than physical: the component count giving the lowest cost per component doubles about every two years. It held for half a century and quietly underwrote every plan that assumed hardware would rescue it β but single-thread performance stopped following it once Dennard scaling ended around 2005.
Then
βDo not budget for the hardware bailing out a design. If the workload is single-threaded and latency-bound, next year's machine will not save it β you have to parallelise it or do less work.β
Unless
Wirth's Law β the gains get spent rather than banked, and clock speed stopped rising long before transistor counts did
SourceGordon E. Moore, Cramming More Components onto Integrated Circuits (Electronics, 19 April 1965).
A new technology is judged on a demo, which flatters it, and then adopted against an installed base, which resists it β so the first two years disappoint. The same compounding that made the early forecast wrong then runs for a decade in the other direction, and the ten-year forecast turns out to be wrong too, this time low.
Then
βDiscount two-year forecasts about a new technology and take ten-year ones seriously β but plan around the version that actually ships, not the one in the demo.β
Unless
Some Things Simply Do Not Arrive β survivorship makes the law look inevitable, because the technologies that never got a long run are not the ones quoted back at us
SourceRoy Amara, president of the Institute for the Future; attributed and circulated from the 1970s onward.
Across seven decades of AI research the approaches that won were search and learning scaled with available computation, not the ones that encoded human insight about the domain. Built-in knowledge helps in the short run and becomes the ceiling in the long run, because unlike computation it does not get cheaper every year.
Then
βWhen choosing between encoding what you know and building something that learns from more data or more compute, ask which one improves on its own when the budget doubles. Bet on that one for anything with a multi-year horizon.β
Unless
Compute Is Not Free β inside a fixed budget domain knowledge is often the only lever you have, and the lesson describes the trajectory of a field rather than the right move this quarter
SourceRichard S. Sutton, The Bitter Lesson (13 March 2019).
A network of n nodes has n(nβ1)/2 possible connections, so its value was claimed to scale with nΒ². The exponent is disputed β n log n fits real networks better β but the shape holds: each new node adds value to every existing node, which is why networks tip rather than grow smoothly.
Then
βFor a product whose value comes from other users, spend early effort on the smallest network that is already useful to its own members, not on features. For a team, do the opposite and cut connections.β
Unless
The Same Quadratic Is a Cost β connections are an asset between users and a liability between colleagues; Brooks' Law is Metcalfe's Law with the sign flipped
SourceAttributed to Robert Metcalfe (c. 1980); the n log n critique is Bob Briscoe, Andrew Odlyzko & Benjamin Tilly, Metcalfe's Law is Wrong (IEEE Spectrum, July 2006).
Ringelmann had men pull a rope alone and in teams, and measured the force. Each additional person contributed less than they had alone β partly coordination loss, partly reduced individual effort once the contribution stopped being separable. It shows up wherever output is pooled and nobody can see who produced which part.
Then
βGive every workstream one named owner and a visible output. If you cannot say who produced which part of a result, expect the group to produce less than the sum of its members.β
Unless
Separable Contribution β the effect is a property of how the work is measured rather than of the people; make the individual contribution legible and most of it disappears
An organisation built to solve a problem draws its budget, headcount and status from that problem persisting. Nobody has to be cynical for this to work: the incentives simply never point at making the team unnecessary, so over time the solution quietly becomes an argument for the problem.
Then
βFor any team or tool created to fix something, write down what "fixed" looks like and when you will check. A platform team that cannot describe its own obsolescence is optimising for its own survival.β
Unless
Some Problems Are Permanent β treating every long-lived team as self-serving destroys the ones doing necessary maintenance, which is invisible precisely when it is working
SourceClay Shirky, named and quoted in Kevin Kelly, The Shirky Principle (The Technium, 2010).
Epilogue
Good engineering is not the avoidance of all risk, but the deliberate choice of which risks are worth taking.
β The Code
Let the engineer who tears down a fence without learning why it stands, who turns a measure into a target, or who calls a hard problem easy β inherit the pager at 3 AM.