Like many programmers, I’m always on the lookout for the perfect programming book. Over the years I have tried to enumerate a few key examples, however after reading them all I am still left wanting. However, I recently came across a couple interesting blog posts [^motivation] that motivated me that the only way to find the set of perfect books for programmers was to build them myself.
The process is simple:
YOU, and NO ONE ELSE, is responsible for your career. – Uncle Bob Martin
After thinking about the possible topics that would be beneficial to my own enrichment (and to the programmer in general), I hit on the following seven:
Core
Things that every programmer should know and read about; taken mostly from the list compiled by Michael Feathers with some of my own additions.
The Lambda Papers
Including the original Lambda Papers and relevant essays pertaining to them and their topics.
Functional Programming
Topics concerning functional programming in general including, but not limited to: state, immutability, lambda calculus, purity, recursion, pattern matching, laziness, type systems, closure, anonymous functions, and currying.
Language Development
One way to learn more about developing new programming languages is to learn how other programming languages were created. This book would be similar to the previous two books except with a slant toward the more practical aspects of language development.
Object-oriented Design
While I am learning more and more the virtues of functional programming, I still think that object-oriented programming has just as an important role as ever in software design and development.
Software Development Management
While my own brief foray into software development manager can only be described as a failure, I believe that the right person implementing the right management techniques can be as valuable as the greatest programmer that you’ve ever met.
Operating Systems Development
From web-based, to monolithic, to exo-kernel, to micro-kernels, there is a lot to be learned from the field of operating system development and their relationships to the underlying hardware; as long as I do not constrain myself to the Von Neumann architechture.
Interviews and Anecdotes
What better way to become a better software developer and designer than to read about the art from the masters.
And that is it. I think that after crunching through the seven books outlined above, I should, at least minimally, be smarter than I was this time last year. I’m always looking for suggestions and comments about my outline above. I do not want these books to be my vision of the best, but instead I want them to be the best available. In addition, I will likely discover new essays, code snippets, and interviews after books are created, so I will likely create an 8th or even 9th book to cover those.
To end this post, I present the table of contents and summary section [^summaries] to Book 0: Core:
THE ORIGINS OF PATTERN THEORY THE FUTURE OF THE THEORY, AND THE GENERATION OF A LIVING WORLD – Christopher Alexander
On the Criteria to Be Used in Decomposing Systems Into Modules – Parnas
This is a very old paper, but it is more than a classic. In in it, Parnas introduces a forerunner to the Single Responsibility Principle. He introduces the idea that we should use modularity to hide design decisions – things which could change. People still don’t consider this as often as they should.
Another thing I really like in the paper is his comment on the KWIC system which he used as an example. He mentioned that it would take a good programmer a week or two to code. Today, it would take practically no time at all. Thumbs up for improved skills and better tools. We have made progress.
A Note On Distributed Computing – Waldo, Wyant, Wollrath, Kendall
Abstraction is great but it can only go so far. In this paper, the authors lay to rest what was once a pervasive myth – that we could design a distributed system and make distribution transparent. Ever wonder why you had to implement specific interfaces to do remoting in Java? This is why.
In the aftermath it might seem hard to believe that people thought this was possible. I think we can we partially thank this paper for that.
The Next 700 Programming Languages – Landin
Most of us have spent a lot of time working in traditional programming languages, but functional programming languages are slowly seeing an uptick and many OO languages are gaining functional features. This paper (which reads like a tutorial) makes an argument for an expression-oriented style of programming. It also lays the foundation for lazy evaluation.
One of the other neat things about this paper, from a historical point of view, is that there is a discussion section at the end in which there a number of questions and comments about whether making indentation significant in a language is a good idea. I was thrown to see people asking whether or not this would be a problem for functions which span over several pages(!).
Can Programming Be Liberated from the von Neumann Style? – Backus
John Backus is known for a number of achievements in computer science. He received the ACM Turing Award for his work on Fortran. This paper, which he presented at the award ceremony was rather shocking at the time because it said, in essence, “we got it wrong.” Backus took the opportunity to make a plea for pure functional programming. His arguments were convincing and they helped to set a research agenda which is just now starting to make some waves in the mainstream.