As an “expert” (maybe experienced is better description?) programmer, I’ve found that most books are extremely beginner oriented and of little value. Yet, there are others I’ve found that as of my last reading improved my thought process, or expanded my mind in beneficial / fun ways.
One such book (which I read 5 years ago or more) is Bentley’s classic Programming Pearls. But, even this targets the early career in a lot of ways.
So, Lobsters, what books do you recommend for the mind expansion of a mid-career, individual contributor path programmer?
I can’t find:
Do you mean Close to the Machine by Ullman? Want to make certain I’m looking at the right book.
Yes. Gah, dumb typo on my one of my favorite books.
I forgot Working Effectively with Legacy Code. I dispute that Starting Strength is a programming-related book :p
[Comment removed by author]
The follow-up book is “Practical Programming for Strength Training”…
This was my first strength training book, I definitely recommend it. Another great one it Body by Science which does a great job of teaching the science of muscle growth and metabolic adaptation.
One thing that you find out once you’re an old expert is that you’re neither. There’s a ton to learn.
I recommend:
I’ve heard good things about Lisp In Small Pieces but I haven’t read it myself.
Gödel, Escher, Bach is one of the best books I’ve ever read. I also anjoyed some of Hofstadter’s other books, like surfaces and essences.
Experience is likely to lead to specialization. I’ve spent a lot of time in with Parsing Techniques: A Practical Guide, Salomon’s Handbook of Data Compression, Noble/Weir’s Small Memory Software, and various books about TCP/IP protocols and implementations in the last year, but for someone who focuses on machine learning, mobile, or front-end development, that list would probably be completely different. (I do mainly embedded & distsys stuff.) Learning programming is about learning problem domains as much as it is learning languages and libraries.
That said, Christina Lopes’s Exercises in Programming Style is cross-cutting and thought-provoking. It takes a fairly straightforward task, shows a few dozen different ways the program could be structured, and compares the approaches' design trade-offs.
This tweet also comes to mind:
Hard to even say how much I like that!
Serious question, what do people here think is likely to be a better fit for a self-taught programmer, math or hardware? I’ve dabbled with both, both were fun. I currently work in the financial world, and like low-stress, high-paying jobs.
I want to complement my skills, but I suspect neither math nor hardware offer much career opportunities without a degree in math or engineering. Is this the case? I’ve only got a BA in CS.
For me (being self-taught), I hit a wall about ten years into my career where I realized I needed to learn a lot more math to go further as a programmer, and I’ve never regretted it. Both math and hardware are deeply related to all the hard problems in programming.
That’s orthogonal to career opportunities, though; for me, it’s more about mastery and finding ways to go deeper. If you want better career opportunities, I think learning about project management is a better bet.
For learning more about hardware coming from a software background, I highly recommend the two Patterson and Hennessy books: Computer Organization and Design and Computer Architecture: A Quantitative Approach. The former is the introductory textbook on the subject, and the second is a more advanced level book.
I would like to mention Paradigms of Artificial Intelligence Programming since I haven’t seen it here. It’s a bit old but I am really impressed by the clarity of Peter Norvig when he explains AI concepts.
At a point, one must set aside the beginner thoughts; then the thoughts of the early hacker: when you grasp the nature of computation and continuations in Scheme, type judgements in Haskell (and the proofs of same), the laws of distributed systems, the operation of the (actual) processor & RAM, virtual machines, the essence of operating system kernels, the ideas of learning tools in AI, and the nature of graphics - and so forth - one has to really know what the computer does from JTAG on up - one must realize that the paths are well worn; new ideas are needed to shatter the mental matrix of understanding. The quest becomes how to move to a different order of thought: to rewire the thought by yourself rather than to learn new facts. This is much harder.
Going back to the classic 60s mindbenders:
Structure of Scientific Revolutions
Understanding Media (McLuhan)
Psychology of Computer Programming
Tao te Ching
I would also suggest investing significant time in a deep and nuanced hobby that doesn’t relate to software engineering and learning it from 0 to competent. This has side effects across the mental space.
The Art of the Metaobject Protocol
I see nobody has mentioned Coders at Work. I think it offers some good opportunities for reflection.
Depending on your interests:
This isn’t a book, exactly, but I found it to be a delightful way to do something very different from the day-to-day and learn something in the process.
http://git.annexia.org/?p=jonesforth.git;a=blob;f=jonesforth.S;hb=HEAD
Also, I second the people saying to learn some hardware. FPGA dev boards are cheap and the free tools are all you need.
These four are amazing
Communicating Sequential Processes
I think learning specializations is often a good way to go for this, but that makes it hard to recommend because it depends on your interests. e.g. I read “Grammatical Inference: Learning Automata and Grammars” recently, which I thought was great, but it’s hard for me to recommend it to an open ended question like this.
The problem is that in general it’s really hard to write books for the “expert” because every expert is different. If you’re writing a book for use as a reference manual that’s fine because you can just make it a bunch of self-contained sections, but if you want to write something intended to be read from cover to cover I think the best you can really do is write something targeted at beginners in increasingly specific niches.
The New C Standard: An Economic and Cultural Commentary was written for experts to learn more and has the unintended use of showing how much has been forgotten (at least it has this effect on me these days).
Those are all pretty good insights into our work, and are varying degrees of mind bending. I especially like the last as an exploration of software architecture in legacy codebases.
I’ve seen this recommended before, and I’ve often wondered why? But, after reading the WikiPedia article about it, it’s become a little clearer.
This excerpt in particular
The Art of Computer Programming Vol. 4a - I own it and have yet to seriously dive into it, but have read some very interesting nuggets. It took many years to write, and probably years to seriously read.
Types and Programming Languages - A classic.
Prolog and Natural-Language Analysis:
http://www.mtome.com/Publications/PNLA/prolog-digital.pdf
good thread
The Elements of Computing Systems: Building a Modern Computer From First Principles has been a great way to unify my background in computer science from logic, to architecture, to programming languages.