Classes & TalksInvite Me!SubscribeContact

Recommended BooksBlogsAncient BlogsOld ArticlesClean Code Gear

Fundamental Algorithms

Donald Knuth

Addison Wesley, 1973,1968

This is Volume I of Knuth's series on The Art of Computer Programming.

The book walks through the basics of data structures and computational number theory. Topics covered include stacks, queues, linked lists, doubly linked lists, trees, etc.

These are basics that every programmer needs to know.

The other books in this series include: Sorting and Searching and Seminumerical Algorithms. Each is fascinating in it's own regard and ought to be part of the repertoire of knowledge that every programmer is familiar with.

Structured Programming

O.-J. Dahl, E. W. Dijkstra and C. A. R. Hoare

Academic Press, 1972

This is the book in which Dijkstra told us that goto might not be such a good idea. This is also the book in which Ole-Johan Dahl described the early principles of Object-Oriented Programming. There is much wealth within these pages that all who aspire to Software Craftsmanship should be familiar with.

Structured Analysis and System Specification

Tom DeMarco

Yourdon Press, 1979, 1978

This is a classic of early software system design. DeMarco describes the top-down approach of functional decomposition and introduces the use of Data Flow Diagrams and Data Dictionaries to specify that decomposition.

The book is very approachable, and full of deep insights. Every programmer ought to be familiar with it.

Design Patterns

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides

Addison Wesley, 1995

Probably the most important software design book written within the last half decade. This book contains nothing new or revolutionary. Rather it documents a set of tried and true techniques for solving common well-known problems of software design.

The techniques are given cannonical names and cannonical forms so that designers can recognize them and converse about them.

All software developers should know and understand these patterns and be able to apply them in their designs, and converse about them with other developers.

This is minimum critical knowledge.

Structure and Interpretation of Computer Programs (SICP)

Harold Abelson and Gerald Jay Sussman with Julie Sussman

MIT, 1996

This book was life changing. Or at least it was career modifying. It was my first introduction to functional programming; though neither the title, nor the first two chapters mentioned the term.

The book is completely unapologetic in it's approach, giving no quarter to those who want an easy ride. It moves at light speed from one topic to the next, demonstrating concept after concept with clear, concise, and plentiful code.

The language of the book is Scheme; but the reader barely notices because the language is so lightweight, and because the topics are so intense.

I read this book with a kind of ecstatic energy – virtually throwing the pages from one to the next in my enthusiasm. And then at page 217 the authors slammed on the brakes, apologized profusely for what they were about to do to me, and then introduced the first assignment statement.

I was thunderstruck. While reading all the previous code I had not realized that they had not used assignment. I had to go back and check.

It was then – quite late in my career – that I realized that Functional Programming was important for me to learn.

Analysis Patterns

Martin Fowler

Addison Wesley, 1997

An extremely important and vastly under-utilized book. Analysis Patterns is the harbinger of Domain Driven Design and provides a deep look into the most common data and behavior models for real business applications. In this book the author draws from decades of experience with real applications. He shows, with his usual clarity and dexterity, the traps that you can easily fall into during the exploration of a business domain; and how to avoid them using simple models of data and behavior.

This is a must read for any software developer of more than 2 years experience.

Domain Driven Design

Eric Evans

Addison Wesley, 2004

This is the definitive work on domain analysis. It provides both the motivation for, and the techniques that support, the analysis of an automated business domain. The book is deeply technical, and yet covers the behavior of the business and the development team in it's broad scope. The writing style is engaging, and the information content is extremely rich.

This book is an invaluable resource for developers on the path to becoming technical leads and architects. It's the kind of book that you'll come back to over and over as you gain systems experience.