The Timeless Way of Building by Christopher Alexander (1979)
This book introduces the concept of a pattern language. The book is about constructing buildings and communities, not designing software. Some software movements have nonetheless applied its concepts to software development.
A Pattern Language by Christopher Alexander, et al (1977) A Pattern Language fleshes out the concepts introduced in The Timeless Way of Building by providing a complete set of patterns from which a community could be created. The first few patterns may seem hopelessly utopian to some readers, but most of the remaining patterns are practical and widely applicable. Like The Timeless Way of Building, this book is specific to the creation of physical buildings and communities, rather than to software. Its value lies in providing concrete examples of patterns and a complete pattern language. It is up to the reader to make the analogy to software systems and their development.
Design Patterns: Elements of Reusable Object-Oriented Software by Erich Gamma, et al (1995)
A brief primer on design patterns followed by a well-organized catalog of about two dozen patterns.
The Visual Display of Quantitative Information by Edward R. Tufte (2001)
Though this book is mostly concerned with display of data, the concepts it covers are applicable to documentation of hardware and software designs.
High-Speed Digital Design: A Handbook of Black Magic by Howard Johnson (1993)
What every digital designer should know but never learned in school. Howard Johnson is a popular authority on high-speed digital design issues and an excellent communicator. In this book he satisfies the engineer's need for both theory and intuitive tools.
The C++ Programming Language by Bjarne Stroustrup (various editions)
The authoritative reference on C++. This book may be a bit terse for some beginners, though more experienced programmers may appreciate this same quality. Later editions of the book include a detailed chapter on the C++ Standard Library.
The Pragmatic Programmer by Andrew Hunt and David Thomas (2006)
As its title suggests, this book provides practical tips for creating quality software. The conscientious experienced programmer will already believe much of what this book advises, but the book can provide the stimulation necessary to act on what the programmer already believes. The book is an entertaining read, no matter how experienced the reader.