Hacker News new | past | comments | ask | show | jobs | submit login
Ask HN: Most interesting, mildly impractical, well-written books on software?
105 points by eatonphil on Nov 22, 2021 | hide | past | favorite | 100 comments
Books like nand2tetris, Let Over Lambda, Lisp in Small Pieces, Hacker's Delight are iconic. They aren't required reading to do well in software but they are extremely interesting and are fairly easy to read (they are well edited).

What other books are in this vein?

Due to popularity, feel free to skip The Littler Schemer/MLer, HtDP, SICP, On Lisp, Thinking in Forth. And let's skip history, biography books like Soul of a New Machine and Isaacson's Jobs.

And again, let's skip books that you might actually consider required reading for experienced developers.




I thought Knuts Literate Programming book (https://www-cs-faculty.stanford.edu/~knuth/lp.html) was extremely interesting, the paper "the errors of TeX" which is a part of it is one of the more interesting papers I've read.

Joe Armstrong used to recommend Algorithms + Data structures = Programs (https://en.wikipedia.org/wiki/Algorithms_%2B_Data_Structures...) but I haven't read it.

Okay I know you said no to the little schemer but you technically didn't mention The Reasoned Schemer which is just amazingly fun to go through and wrap your head around (https://mitpress.mit.edu/books/reasoned-schemer-second-editi...). Also see Will Byrds latest strangeloop keynote: https://www.youtube.com/watch?v=AffW-7ika0E


> I thought Knuts Literate Programming book (https://www-cs-faculty.stanford.edu/~knuth/lp.html) was extremely interesting, the paper "the errors of TeX" which is a part of it is one of the more interesting papers I've read.

I haven't read any of Knuth's stuff because doesn't having 7 volumes kinda imply it can't possibly be well edited? Or maybe I really do just need to suck it up and read these books. I know it's not the same exact book but I took his style to be to generate encyclopedic tomes rather than interesting reading.

> Algorithms + Data structures = Programs

Oo a Wirth book. Those are always good.

> I know you said no to the little schemer but you technically didn't mention The Reasoned Schemer

Man you're cutting it close there!


> I haven't read any of Knuth's stuff because doesn't having 7 volumes kinda imply it can't possibly be well edited?

That's a very bad assumption in this case. The contents of TAOCP are very well edited, just massive in scope and it's one man putting it all together. However, those aren't his only books. Concrete Mathematics is a completed text that expands on, in particular, the math in Chapter 1 of TAOCP. Literate Programming is a collection of papers on topics in programming, and is the first of eight such books. If you want interesting but mildly impractical, check out his Computers & Typesetting [0] which includes two books which are actually literate programs.

[0] https://www-cs-faculty.stanford.edu/~knuth/abcde.html


Just read his introduction to generating pseudo-random numbers or his sketch of a proof of Benfords law in Seminumerical Algorithms. Excellent stuff.

For moderately impractical, look at tape sorting in Sorting and Searching.


Thanks for the suggestions!


> I haven't read any of Knuth's stuff because doesn't having 7 volumes kinda imply it can't possibly be well edited? Or maybe I really do just need to suck it up and read these books. I know it's not the same exact book but I took his style to be to generate encyclopedic tomes rather than interesting reading.

Of the Knuth I've read (which includes [a tiny] _some_ of AoCP, lets not kid ourselves) I think he is a very good writer with great sense of humour between the academicness of some of his writing. Take the Surreal Numbers book for example.


You've convinced me. I'll have to go for some of his books. Worst case I've got some intelligence-signaling paperweights.


> I haven't read any of Knuth's stuff

You're missing out on some of the best writing on any topic!

Not all Knuth's books are the same: The Art of Computer Programming (TAOCP) is his mangum opus, an ever-expanding encyclopedic knowledge fire-hose of various computer science topics. But the series of books that are simply "collected papers" makes it easy to focus on something much narrower. For impractical, you may want to start from Selected Papers on Fun and Games.

And then he has books like Surreal Numbers, which is written as a story of a couple discovering mathematical notation and deriving a whole system...


Donald Ervin Knuth's original book on TeX is a fascinating case study in how a computer science genius approached the task of typesetting algorithmically. What is easy to overlook is the beauty of the mental models he makes explicit; e.g., boxes, glue.


The whole Computers and Typesetting volume series is worth at least thumbing through at least once in life.


Here are the few I've really enjoyed.

Inside the Machine: An Illustrated Introduction to Microprocessors and Computer Architecture

Explains how Microprocessors operate, going from operands and building up a lot of the execution tricks used, all whilst going through popular examples of CPUs (thee pentium chips, PowerPCs, etc), discussing their history, their specs, their capabilities, etc.

Hardware and Support Support for Virtualization

This one corners on useful, but it's short and it's free and unless you work in virtualization it probably won't be much use but I found it helpful in getting a grasp on what is actually happening.

------

Edit: Removed history books but, for anyone interested, the ones I listed previously were The Idea Factory, Valley of Genius, and Android: The Team that Built the Android OS


> Hardware and Support Support for Virtualization

This whole series is truly awesome.

> Inside the Machine: An Illustrated Introduction to Microprocessors and Computer Architecture

I'm always looking for more like nand2tetris or Harris and Harris' book on comp arch to suggest. Thank you!


Programming Pearls and More Programming Pearls by Jon Bentley contain short articles "in the realm of insight and creativity." These articles appeared during the 80s in Communications of the ACM, but I think they are still mostly relevant and inspiring today.

The second edition from 2000 is online available at https://archive.org/details/ProgrammingPearls2ndEditionJonBe...


> the realm of insight

Definitely helped understand in place quicksort and need to swap pivot value.

For those still confused remember the invariants

Start with:[????????????p?????], end with:[|<=p|p|>p|]

Partition via:[p|<=p|???|>p] (pivot|less than or equal to pivot|untested values|greater than pivot).

Giving: [|p|<=p|>p|]

pivot|less than or equal pivot|greater than. This requires swapping pivot at end of partition step


Not quite in the vein, but I think Ted Nelson's "Computer Lib/Dream Machines" deserves mention (although it's partly history.)

https://computerlibbook.com/

https://en.wikipedia.org/wiki/Computer_Lib/Dream_Machines

https://archive.org/details/computer-lib-dream-machines

- - - -

Also "Scalable Internet Architectures" by Theo Schlossnagle


> Not quite in the vein, but I think Ted Nelson's "Computer Lib/Dream Machines" deserves mention (although it's partly history.)

That does look very interesting!


The Little Book of Semaphores: https://greenteapress.com/semaphores/LittleBookOfSemaphores....

It's about multithreading synchronization issues like the Dining Philosopher's problem, and it's brief, interesting, and very readable.


That looks awesome. Thanks!


"The Algorithmic Beauty of Plants"

> ... is a book by Przemyslaw Prusinkiewicz and Aristid Lindenmayer. It's notable as it is the first comprehensive volume on the computer simulation of certain patterns in nature found in plant development (L-systems).

> The book is no longer in print but is available free online.

https://en.wikipedia.org/wiki/The_Algorithmic_Beauty_of_Plan...

http://algorithmicbotany.org/papers/#abop


The Psychology of Computer Programming by Gerald Weinberg. There's a silver anniversary edition, that's the one to get. It has the author's commentary framing each chapter where he reflects on the contents.


That looks very interesting. Thanks!


The Art of Prolog is now open access: https://mitpress.mit.edu/books/art-prolog-second-edition

You could think of it as "SICP for Prolog".


I own it and have tried to read it but man I have a really hard time getting past the first chapter. I think it would be better for me to study Prolog first for a while before trying to continue reading this. I've always heard good things about it.


I recently added some books by Nils M Holms[0] to my library. Given some of the titles you mentioned, I think you might like them. I enjoy their writing style.

[0]: https://www.t3x.org/


Yeah! I loved LISP System Implementation.


Designing Data-Intensive Applications: The Big Ideas Behind Reliable, Scalable, and Maintainable Systems https://www.amazon.com/Designing-Data-Intensive-Applications...

I surprisingly really enjoyed it. Well written and it pulled back the veil on a lot of concepts that I thought were too complex for me to understand/enjoy.


I agree that this is a great book, but I think it fails the "impractical" test - DDIA is an immensely practical book that's basically required background reading if you work with distributed data systems.


I agree it's well written but for me that's way more on the side of required reading.

I'm thinking about books you don't _need_ to read but that are just really neat or advanced discussions.


When I was learning Racket, I really liked Beautiful Racket[0] by Mathew Butterick. The book is accessible, well structured and the web design & typography is outstanding (IMHO). The author created a Racket Package (Pollen) and used it to write this book. I have special admiration for craftsmanship and this book is certainly one of them.

[0]: https://beautifulracket.com/


Definite props for beauty.


Code: The Hidden Language of Computer Hardware and Software https://en.wikipedia.org/wiki/Code:_The_Hidden_Language_of_C... comes to mind.


Yes that's in the spirit! I personally did not enjoy it though because it tried to explain at a level that non-programmers could understand so it didn't exactly go fast enough. I got bored reading it so I wouldn't recommend it to other programmers.


I feel the opposite. I read it right after taking a computer organization class in college. Both Code and the course covered very similar topics. I really enjoyed and appreciated how clear and concise and friendly of a read it was even more after taking the course.


Fair enough!


Maybe Clever Algorithms: Nature-Inspired Programming Recipes[1]. These techniques might not be useful to everybody, all the time, but they can be very handy in places.

Edit:

A couple of other suggestions.

Managing Gigabytes: Compressing and Indexing Documents and Images[2]

Mining of Massive Datasets[3]

Algorithm Design Manual[4]

Network Algorithmics[5]

Neural Network Design[6]

I think all of these fall into the category of "Won't be applicable to everyone, but can be good for those who need this kind of stuff."

[1]: https://github.com/clever-algorithms/CleverAlgorithms

[2]: https://people.eng.unimelb.edu.au/ammoffat/mg/

[3]: http://www.mmds.org/

[4]: https://www.amazon.com/Algorithm-Design-Manual-Steven-Skiena...

[5]: https://www.amazon.com/Network-Algorithmics-Interdisciplinar...

[6]: https://hagan.okstate.edu/NNDesign.pdf


That looks good! Thanks!


Not about software per se but The Systems Bible/Systemantics (original title) is a good read: https://www.amazon.com/SYSTEMANTICS-SYSTEMS-BIBLE-John-Gall-...


Yeah that is a very fun read for sure!



> xchg rax,rax

Yes!!!

Great list, thanks for sharing.


I must be missing something here. Care to explain what this is?


Seems it's a book of assembler snippets. The Amazon page is less cryptic: https://www.amazon.com/dp/1502958082



A list of this exact kind of books is presented here: https://blog.fogus.me/2015/04/27/six-works-of-computer-scien...


Awesome! Specifically not on my list already there's: Concepts, Techniques, and Models of Computer Programming; Smalltalk-80: The language and its implementation; The Architecture of Symbolic Computers and Project Oberon: The design of an operating system and compiler.

This reminds me Niklaus Wirth's Compiler Construction probably belongs in this thread.


> Project Oberon: The design of an operating system and compiler - Wirth’s magnum opus is the quintessential example of Computer Science alternative-history world-building.

hilarious


I think these meet the criteria...

P. J. Plauger's "Programming on Purpose" series of essays.

Purely Functional Data Structures by Chris Okasaki.

I would put both of these alongside Bentley's "Programming Pearls" books which I saw mentioned in another comment.


> Purely Functional Data Structures

A classic! Good suggestion.

I'm curious to check out Programming on Purpose.


Based on the prompt, I feel like Why’s (Poignant) Guide to Ruby would qualify.

https://poignant.guide/


Weird! I like the originality. But does it actually go into depth or is it really just a tutorial to Ruby basics? If it's ultimately just a guide to Ruby basics I wouldn't include it here since I'm thinking of books with some serious technical depth/discussion.


Oh no, it went quite deep in areas (e.g. eigenclasses) but it was generally in service of some of its more esoteric aims, not a ground-covering tome geared towards complete understanding.


There was one about Mockingbirds I read a few decades ago. I think this is the one:

https://en.wikipedia.org/wiki/To_Mock_a_Mockingbird

Nothing explicit computery or even technical in there. Only all kinds of invented birds with specific weird behavior. You need to know nothing above what a 10 year old knows (and be interested in logic). And yet, when you're at the end, it turns out you know what 'Y combinator' actually means.


Pretty much everything by Smullyan is interesting (probably all, but I haven't read it all yet).


What else have you read of his that you recommend (related or not to this thread)?


https://en.wikipedia.org/wiki/Raymond_Smullyan

Under "Logic Puzzles", through To Mock a Mockingbird (about to reread it because I read it years ago and a lot of things didn't stick at that point). I picked up his books to flesh out my home library (I'd read some of them back in college) and started rereading from the beginning. Have a notepad and pencil to help puzzle through the problems (or index cards, I have a few stuck in the books).

They span from riddles, to logic puzzles (the classic Knight & Knave puzzles), to computation-based puzzles with combinators.


"Planet Without Laughter"

> excerpted from This Book Needs No Title: A Budget of Living Paradoxes by Raymund Smullyan

https://www-cs-faculty.stanford.edu/~knuth/smullyan.html


> And yet, when you're at the end, it turns out you know what 'Y combinator' actually means.

Sweet. I just learned about this book earlier today. It's on my list now!


How about "The Land of Lisp"? [0]

It comes with a bonus music video! [1]

[0] http://landoflisp.com

[1] https://www.youtube.com/watch?v=HM1Zb3xmvMc


That is a pretty fun one indeed. :)


For a great introduction to file systems, I highly recommend Practical File System Design with the Be File System by Dominic Giampaolo, creator of the Be File System who ended up moving to Apple and designed Spotlight, the file indexing and search system that was introduced in Mac OS X Tiger. It's very well written and you'll learn a lot. When I was hired in 2006 as a summer undergraduate research intern at an academic storage systems lab, I used this book to study up on file systems design and implementation. At the time I haven't even taken an operating systems class (I had just completed my freshman year), though I already knew a lot about operating systems by reading a lot of papers and books on Unix as well as writing C programs that used POSIX system calls. This book helped me a lot on my very first research project: exploring the use of SQLite as the basis of a non-hierarchical file system. That was a fun project that helped start my research career.

I still refer to this book from time to time to brush up on file system basics.


Very interesting! Do you know if this book also talks about the basics of distributed file systems or is it only for single machine?


If I recall correctly, I don't believe the book covers distributed file systems. For those, I highly recommend reading the research papers describing modern distributed file systems such as HDFS, Google's various storage systems and databases (such as Bigtable and Spanner), and Ceph, making sure to check the bibliographies and read the cited papers to get a better understanding of the background material. That's how I learned the basics of distributed file systems when I worked on a research project involving Ceph back when it was brand new.


Somewhat varied but I think some of these may fit your criteria.

Programming Erlang by Joe Armstrong

Communicating Sequential Processes by Hoare

The algorithmic beauty of plants by Prusinkiewicz, Lindenmayer

Network Performance Analysis Using the J Programming Language by Alan Holt

Relational Programming in miniKanren by William Byrd

Exercises in Programming Style by Cristina Videira Lopes

edit: also "SAT/SMT by example" by Dennis Yurichev


Nice list! Anything with Hoare has my ear.


Type-Driven Development with Idris. If you haven't delved into dependent typing before, you absolutely owe it to yourself.


The Feynman Lectures on Computation, Goedel's Proof, maybe Crafting Interpreters?

I've been following the development of http://browser.engineering/ and it's so much fun to go through. Highly recommended!

Mazes for Programmers is on my bookshelf. I've gone through the first few chapters coding along in Go and going on weird diversions. It's totally pointless, and I love it. There's also "The Ray Tracer Challenge" by the same author, which looks phenomenal.


Just today my wife asked me if we could get rid of "The Magic Garden, Explained", since I never use it. I told her it's just one of those books I like knowing is there even if I never crack it open again. Highly impractical in that it is so out of date (historical at this point) and from what I remember very well put together. It was so eye opening when I read it to see the inner workings of SVR4 and how every little bit of information had it's neat little place.


The requirements seem a bit unclear to me, but I'll toss a couple of titles into the ring:

The Inmates Are Running the Asylum (Alan Cooper) makes the case that user interfaces can and should be easier to understand. I think in the years since this book was written, there has been much improvement in the UI world overall, but still worth thinking about.

Expert C Programming (Deep C Secrets) (Peter van der Linden) goes into some fascinating technical (and historical) tidbits related to C.


Added both to my personal lists! Thank you!


I don't know if mine qualify and how HN feels about self-promotion, but I can't resist the opportunity to mention my project.

I'm working on a collection of 12 books about software development and IT: https://dev-concepts.dev/table-of-contents

I try not to get down to the level of atoms and molecules, but I'm going deep down the rabbit hole, and it's quite fun!


Self promotion in general is fine on HN but I think it's pretty hard to objectively say anything you write yourself is well written!


I fully agree with you. Quite the opposite actually, it's hard to know when what you write is good enough for others to read ;-)


Since you want impractical suggestions, you might enjoy “if Hemingway wrote JavaScript”


Wow I love both Hemingway and JavaScript. I look forward to this book.


J Paul Morrison "Flow-based Programming", while not really about documenting historical methods, got my head thinking about programming in terms of the pre-CPU paradigms of data processing with unit record machines, since that is what this style draws on most strongly.

Along the same lines, while not a book, videos and documents about debugging electromechanical pinballs and modular analog synthesizers provide great reference points for what digital systems could look like or strive to emulate, and physical engineering, woodworking and construction decenter the computer as the whole of the process while still being very logical and systematic. At the top level it's usually finding the right structural metaphor that dogs practical programming and gets it into a loop of endless data collection and reprocessing, so it helps to have other things in mind and try to discern ultimate aims.


Simply Scheme[0] as an intro to scheme and a good bridge for taking on SICP. It is available for free online. [0] https://people.eecs.berkeley.edu/~bh/ss-toc2.html


Neat! I haven't heard of this one.


Is GEB considered to be one? It's not exactly CS but can be related, plus it was very well written.


It's definitely interesting! I don't know if I've ever met someone who finished the book though. It's a skewed definition maybe, but I don't personally consider things well written if it requires inhuman dedication to finish. :D


I finished it. But I was in high school and a lot of it likely flew over my head.


could you explain why it's meant to be so important?

Heard little about it and tried reading start but didn't seem very groundbreaking


Learn you a Haskell for Great Good.

Not required reading but entertaining and only somewhat practical unless you happen to write Haskell for a living, in which case yeah - too bad.


If you're interested in compilers and programming language design, I highly recommend Bob Nystrom's "Crafting Interpreters". One of the best written programming books I've read.

Free to read online:

http://craftinginterpreters.com/contents.html


It's been on my list to read for a while! I wonder if it really is one of the best books on interpreters or if it just hit the right spot of being free online and in a mainstream language (i.e. not Haskell, OCaml, or Scheme) and with code you could actually run whereas most PL _textbooks_ stay too abstract and don't walk you through building a working thing.


It is by far the best book (website content?) I read around compilers.

It's extremely accessible, easy to follow and digest, plus it challenges you to experiment to see how things work by adding new features or breaking existing ones; fascinating stuff!

Now...if it wasn't the Java part and was fully dedicated in C it would be awesome! :-D


“Working Backwards: Insights, Stories, and Secrets from Inside Amazon” - https://www.amazon.com/dp/1250267595 by Amazon executives. Gives overview of Amazon’s core practices that made them successful.


I liked this book too! But not at all in the vein I'm talking about here. Thinking books that actually talk about software/programming in technical depth.


I loved that book I'd recommend it to everyone. It's more of an Information Theory book than a software development book.



> And again, let's skip books that you might actually consider required reading for experienced developers.

Would be a great suggestion in a generic good books list but this one is about books that are not pragmatic!


Not a book, but I truly enjoy this guy’s videos: https://youtu.be/h7apO7q16V0. I usually watch them while eating lunch. He does a truly fantastic job.


Turtle Geometry, is a very interesting book: https://mitpress.mit.edu/books/turtle-geometry


The psychology of Computer Programming, Gerald Weinberg, 1971.


I read this some quarter century ago. It was about a quarter century old then. It was a big influence.

Prompted by this comment, I'm reading it again. Holy cow, this is better than I remembered. So relevant too; it's hard to keep in mind that this is from before Unix.

The author was involved in numerous cognitive experiments with programmers, and also as a teacher. His group researched programming language development. So a lot of it is from that angle. The book is full of interesting anecdotes and gems of wisdom.


Excerpt from one of my favorite passages, Chapter 7, p. 136:

To detect errors, the programmer must have a conniving mind, one that delights in uncovering flaws where beauty and perfection were once thought to lie. Perhaps a touch of paranoia helps---the kind of thinking that automatically conjures up the worst imaginable cases.

For locating errors, however, we want a person who has the persistence of a mother-in-law and the collecting instincts of a pack rat. In one project, for instance, a bug in the operating system was known to exist for six months before it was finally tracked down by one programmer who had saved every dump taken in that period---three nine-foot stacks of paper! Late at night he could be found poring over his dumps---searching, groping, rummaging about for some slight clue that would have escaped the eye of a Sherlock Holmes. Months went by, and then, in one dump, a single bit which didn't seem quite right. Back he went through all the other dumps, until he had ferreted out two more cases, then five, then a dozen out of the hundreds. These twelve cases he arranged on a large table, first in one pattern, then another until some threads of connection became visible.

By this time, his mind was so specialized to the cases at hand that it was fruitless for him to try to explain his hypothesis to anyone else. It seemed to him that one of the data channels---when certain conditions were just right---was picking up a bit in one of the positions of its address register, thus causing a single character to be stored out of its regular sequence. Since this error usually occurred in the middle of a large data block, the stray character was usually wiped out by subsequent characters in the block, but in a few cases---the twelve---the character was found just past the end of the block. He tried to convince the engineers, but they would not listen. Programmers always say that there are machine errors. So, finally, he constructed a program that would force the channel into just the right circumstances with an increased frequency. Then, when made the error occur with more regularity, he was able to define the circumstances with enough precision to find on the schematic exactly the circuit card that must be in error. The engineers were impressed with his diligence, so they finally granted him a test of the card---and found he was right!

Such programming sleuths are not rewarded for their discoveries with the fame of a Pasteur or a Salk. Nonetheless, they are satisfied--beyond the comprehension of ordinary men---with the work itself.


I'll add Shellcoder's Handbook to the list. Great intro to compiler/language flaws for programmers who don't know much about software security (like me).


I have been looking for this. https://my-estub.fyi/


Keep sharing such. https://fmcdealer.site/


deleted, misread the question


> And again, let's skip books that you might actually consider required reading for experienced developers.

It would be a totally fine suggestion but it's way too practical! Let's keep this thread off topic!




Consider applying for YC's Spring batch! Applications are open till Feb 11.

Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: