I produced this list for Chris Palmer, who was interested in doing some background research on design patterns, design issues and programming best practice. I was planning on just jotting down some titles as they occurred to me, but when I sat down to think about all the books (of Computer Science or programming) that had inspired me, the list began to grow and grow. So I thought it might be worth committing it to a blog entry that I can refer to and extend later on.
These are things that were influential to me – some of them are now obsolete or irrelevant technologies (at least to someone specialising in C#/.NET), so should be ignored where appropriate, but there are nuggets of wisdom in them too. The design section is a little short – I guess my opinions are a combination of having made mistakes (the ones I noticed) and the consensus that is emerging out there (reflected in countless best practice articles on the forums and esp. MSDN which is a distillation of the forums) Some of the techniques rub off from using particular APIs – some rub off from watching the way APIs have changed over the years. Anyway, the ones that are there, are generally _current_ best practice…
Computer Science (& AI)
Gödel, Escher, Bach: An Eternal Golden Braid – Douglas Hofstadter
Probably the most beautiful book ever written. This is without doubt the most inspiring book I have ever read. It ties together strands of ideas from computer science, art, mathematics and neuroscience and (playfully) demonstrates the equivalence of so many deep and seemingly disparate ideas that I came away with a whole new outlook. I spent a whole summer working through this book, doing paper and pencil simulations of his languages and automata. It won the Pulitzer prize, which for a book on cognitive science is quite amazing. I can quite understand why, because it draws you into a deep and complex subject without you ever feeling out of your depth.
The Art of Computer Programming, Volumes 1-3 Boxed Set – Donald Knuth
This is arguably one of the best books on computer science. It is a distillation of the early work on computer science and contains an in depth analysis of the fundamental data structures and algorithms for sorting, searching, random number generation &c. It doesn’t reflect current programming concerns and all fo the code examples are in assembler, but it is deep and wide, and thus worth a $150 of anybodies money.
Introduction to Algorithms, Second Edition – Cormen, Lieserson and Rivest
This is my default reference for algorithms, much more clearly written and illustrated with pascal style pseudocode rather than MIX assembler. Less depth than Knuth, but with good analysis of algorithm time/space complexity.
Compilers – Aho Sethi and Ullman
This book is famously known as “The Dragon Book”. Compilers are one of the most complex peices of software you will ever write. This book focussed very heavily on state machines, and language equivalencies. I learned more about computer science from this book than from any other two books I ever read (except possibly GEB-AEGB). I guess I ought to place this near the top of the list.
Artificial Intelligence (3rd Edition) – Patrick Winston
A broad introduction to the science. A background reference. (This guy runs/ran MIT AI lab)
Out of Control: The New Biology of Machines, Social Systems and the Economic World – Kevin Kelly
A very inspiring look at the inter-connections between various sciences that inform and are informed by complexity theory (It was so hot 10 years ago, but where is it now?).
Adaptation in Natural and Artificial Systems: An Introductory Analysis with Applications to Biology, Control, and Artificial Intelligence – John Holland
This is the book that introduced the genetic algorithm, and promoted the emerging science of complexity theory. It contains a hard but cool mathematical analysis of the process of evolution.
The Age of Spiritual Machines: When Computers Exceed Human Intelligence – Ray Kurtzweil
This guy is a futurist who prodicts an omega point very soon. His ideas are over optimistic, but leave you breathless in their scope.
Mind Children : The Future of Robot and Human Intelligence – Hans Moravec
Very similar to the above. Radical hard AI with apocalyptic overtones, but very inspiring especially if your interested in how one of the leading roboticists views the future of his science.
Object-Oriented Analysis and Design with Applications – Grady Booch
Booch was a leading methodologist prior to the introduction of UML, and is arguably the largest influence on that standard. This book provides various heuristics to employ when designing OO software. I came away thinking that there was a lot of truth in this book, but that I was only ever going to ‘get’ it by going out there and programming. Design is not an academic subject in that sense – its got more to do with practice than theory. Just as one could read about aesthetics but never learn to paint, so one can read about design but never master it. I suppose its more of a way of criticising your efforts rather than a framework. I guess a design pattern is what’s left when you criticise your design in various problems and find that you’ve boiled your designs down to something similar each time. (I need to take a writing course – sorry)
Design Patterns – Gamma, Helm, Johnson and Vlissides (the gang of four)
The boiled down essence of 20 years of object oriented design. High value stuff, only depart from these designs after much thought…
Patterns of Enterprise Application Architecture – Martin Fowler
The same, only for enterprise designs. Lots of good stuff about data persistence and O/R Mapping here.
Enterprise Integration Patterns : Designing, Building, and Deploying Messaging Solutions – Hohpe & Wolfe
Inside OLE – Kraig Brockschmidt
This really got me into component based design. The whole thought process of working with COM is conducive to better software development, and (if you extend the idea to its logical conclusion) to service oriented development.
Advanced C++ Programming Styles and Idioms – James Coplien
Eiffel : The Language – Bertrand Mayer
This book explains the value of design by contract. It also demonstrates the core class libraries of the eiffel language, that were extremely elegant. It’s a pity this language didn’t take off.
Exceptional C++ Style : 40 New Engineering Puzzles, Programming Problems, and Solutions
(C++ in Depth Series) – Herb Sutter
This book explores some advanced reasoning behind the use of exceptions that apply as well to C# as to they do to C++. Some valuable concepts for dealing with errors.
Modern C++ Design: Generic Programming and Design Patterns Applied – Andrei Alexandrescu
Effective C++ : 55 Specific Ways to Improve Your Programs and Designs – Scott Meyers
The C# Programming Language – Anders Hejlsberg
Advanced .NET Remoting (C# Edition) – Ingo Rammer
Techniques & technologies
- Write a compiler (any compiler) it’ll expand your perspective of how software works.
- TCP/IP programming – write a sockets based programming system – send objects down it. It’ll give you an insight into how far we’ve come from 10 years ago, and why it is a good thing.
- Master nant – write nant scripts for a complex project, then augment it with a task of your own. This is the build tool of the moment, and is better than VS.NET project files.
- Mess about with NMock and mock objects – see where this leads you in developing code. You’ll find that to use it your code will have to be cleaner.
- Develop an abstraction framework around some complex system that allows it to be removed/enhanced without writing/modifying any client code. This is hard to do and naturally promotes good design. This is where the bulk of my design efforts are spent these days – everything else flows out of this effort. Once you start doing this sort of thing you’ll notice that most best practice is actually idiomatic application of this technique.
- Develop/use a code generator – most code is the expression of desires through the expansion of code (design patterns) with metadata. Name anything that you have written lately that wasn’t like that to some extent.