The whole category in one page.
WHAT SEPARATES ENGINEERING FROM PROGRAMMING IS TIME AND OTHER PEOPLE
Most project failures are not technical. Building the wrong thing is the commonest and most expensive.
What reduces nearly all of them: deliver something small, early, to real users, and repeat.
ASK OF ANY DECISION HOW EXPENSIVE IT IS TO CHANGE LATER
That determines how much thought it deserves now, and what should be deferred.
PEOPLE DESCRIBE SOLUTIONS, NOT PROBLEMS
Ask what they are trying to achieve and how they would know it succeeded. Watch what they actually do — it differs from what they describe.
Adjectives are not requirements. Ask of everything: how would we verify this?
START SIMPLE, AND DRAW BOUNDARIES WHERE THINGS CHANGE TOGETHER
Most systems should begin as a well-structured monolith. Boundaries that are not enforced are eroded.
Record decisions and their reasoning — they are questioned for years and forgotten within months.
WRITE FOR THE READER
Code is read far more often than written. Clever code costs time every time anyone reads it, including its author six months later.
Refactor continuously in small steps, never as a project.
ONLY DELIBERATE, RECORDED COMPROMISE IS DEBT
Allocate a consistent proportion of capacity to it, and justify it in delivery speed rather than technical terms.
ONE LOGICAL CHANGE PER COMMIT, MERGED WITHIN DAYS
And never commit a secret — once in history, it is there permanently.