Software, hardware, networks, the internet and the wider history and practice of technology and engineering. Read by engineers, product people and readers tracking how technology reshapes everything else.
John Ousterhout · Ousterhout's core argument — that the enemy of good software is complexity, and that complexity accumulates through shallow abstractions and tactical shortcuts — maps directly onto the failure mode of AI-assisted development. Models are natural tactical coders. This book argues for the strategic counterweight.
Robert C. Martin · Controversial in its prescriptiveness, but useful precisely because AI-generated code routinely violates every heuristic in it: long functions, unclear names, mixed levels of abstraction. Reading Martin sharpens the vocabulary for what to fix in a model's output, even if the rules are applied with judgment rather than dogma.
Ethan Mollick · Mollick is a Wharton professor who studies AI adoption and writes with unusual clarity about working alongside LLMs across knowledge domains. The framing — that effective AI collaboration requires treating the model as a co-worker with specific strengths and specific blind spots — is the most practically useful frame available for day-to-day coding with AI.
Martin Fowler · Fowler catalogued the moves that make existing code better without changing its behavior. In an era where AI generates working-but-messy first drafts, refactoring is the core skill: not writing code from scratch, but reshaping what you have. The catalog of smells is a better prompt-debugging tool than most people realize.
David Thomas, Andrew Hunt · The craft baseline. Hunt and Thomas articulate the discipline that AI code generation does not replace: knowing when code is good enough, how to automate the right things, and what a working developer owes to the person reading the code next. The 20th-anniversary edition updated the examples but the reasoning has not aged.