1. 48

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?

  1.  

  2. 19
    • Closer to the Machine
    • The Pragmatic Programmer
    • Haskell Programming: From First Principles
    • Concepts, Techniques, and Models of Computer Programming
    • The Structure and Interpretation of Computer Programs
    • Thinking Forth
    • Working Effectively with Unit Tests
    • Working Effectively with Legacy Code
    • Hacker’s Delight
    • Starting Strength
    1. 3

      I can’t find:

      Closer to the Machine

      Do you mean Close to the Machine by Ullman? Want to make certain I’m looking at the right book.

      1. 3

        Yes. Gah, dumb typo on my one of my favorite books.

      2. 3

        I forgot Working Effectively with Legacy Code. I dispute that Starting Strength is a programming-related book :p

        1. [Comment removed by author]

          1. 3

            The follow-up book is “Practical Programming for Strength Training”…

            1. 1

              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.

      3. 16

        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:

        • Godel, Escher, Bach
        • Structure and Interpretation of Computer Programs
        • Concepts, Techniques and Models of Computer Programming
        • Parallel and Concurrent Programming in Haskell – both a great concurrency book and a great Haskell book.
        • Computer Systems: A Programmer’s Perspective
        • Elements of Statistical Learning
        • Types and Programming Languages

        I’ve heard good things about Lisp In Small Pieces but I haven’t read it myself.

        1. 4

          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.

        2. 15

          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:

          Advice I gave to a talented dev (already good at half a dozen langs) on which prog language he should learn next - “learn math or hardware” - @ravi_mohan

          1. 5

            learn math or hardware

            Hard to even say how much I like that!

            1. 3

              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.

              1. 3

                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.

              2. 3

                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.

              3. 8

                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.

                1. 7

                  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.

                    1. 5

                      I see nobody has mentioned Coders at Work. I think it offers some good opportunities for reflection.

                      1. 3

                        Depending on your interests:

                        • The Art of Multiprocessor Programming
                        • Types and Programming Languages
                        • Handbook of Applied Cryptography
                        • Hacker’s Delight
                        • The Design and Implementation of the FreeBSD Operating System
                        • Concrete Mathematics: A Foundation for Computer Science
                        1. 3

                          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.

                          1. 3

                            These four are amazing

                            • Structure and Interpretation of Computer Programs
                            • Let Over Lambda (completely mind bending)
                            • Code Complete
                            • Programming Languages - Application And Interpretation
                              1. 3

                                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.

                                1. 3

                                  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).

                                  1. 4
                                    • Zen and the Art of Motorcycle Maintenance
                                    • Principa Discordia
                                    • Catch-22
                                    • House of Leaves

                                    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.

                                    1. 3

                                      Zen and the Art of Motorcycle Maintenance

                                      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.

                                      1. 3

                                        This excerpt in particular

                                        In the book, the Narrator describes the “Romantic” approach to life of his friend, John Sutherland, who chooses not to learn how to maintain his expensive new motorcycle. John simply hopes for the best with his bike, and when problems do occur he often becomes frustrated and is forced to rely on professional mechanics to repair it. In contrast, the “classical” Narrator has an older motorcycle which he is usually able to diagnose and repair himself through the use of rational problem-solving skills.

                                    2. 2

                                      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.

                                      1. 2

                                        Prolog and Natural-Language Analysis:

                                        http://www.mtome.com/Publications/PNLA/prolog-digital.pdf

                                        1. 1
                                          • Data and Reality
                                          • A Timeless Way of Building
                                          • Patterns of Software
                                          • Seeing Like a State
                                          • Invisible Cities
                                          1. 1

                                            good thread

                                            1. 1

                                              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.