Jay Taylor's notes

back to listing index

Programming books you might want to consider reading | Hacker News

[web search]
Original source (news.ycombinator.com)
Tags: programming book-list books news.ycombinator.com
Clipped on: 2016-10-28

Image (Asset 1/2) alt= Hacker News new | threads | comments | show | ask | jobs | submit jaytaylor (2501) | logout
Programming books you might want to consider reading (danluu.com)
1019 points by deafcalculus 12 days ago | flag | hide | past | web | 131 comments | favorite

Image (Asset 2/2) alt=

The best Calculus book I've ever found is free from MIT.


Adrian Banner's The Calculus Lifesaver is an excellent companion text as well. It's not really a textbook, but it's a great reference to help you alongside it that's written in a way meant to be accessible to introductory students.


Adding to this thread, Paul Dawkin's online notes really helped me get through Calc 1-3. There's also notes for basic algebra & differential equations.


Made account to reply:

I got this book at a used bookstore for $10 as my first calculus book, I read the entire thing over a week long vacation.

It was sweeter than candy, I have not read a better non-fiction book in my entire (18 year old) life.

Welcome to HN! I feel hopeful when I see passionate comments like this from newly minted adults :)

Stewart, Calculus, at a mere $285. Or like $5 for the fifth edition. He's very readable.

Strang is a fine lecturer, especially his Linear Algebra videos. But Linear Algebra Done Right is much better than Strang. MIT, Stanford and Berkeley agree on this one thing.


The abridged version sans proofs is available in PDF:


I've read significant amounts of both, and I don't think Axler is better than Strang or vice versa. They teach the material with a different emphasis and interpretation.

Having read both, my vote is with Axler over Strang. It may be because I read Axler later, but I found it more intuitive and riper for generalisation.

This may be the best book and it's great that you can download it for free, but it's scanned, and that makes it horrible to read. Still I marked it in my book list under math, and hope I'll find the time to read it in the future. I will buy a decent EPUB or PDF then. I don't mind to pay for that convenience.

Your comment prompted me to look at the contents of the online PDFs. They are scanned-in documents, but I didn't find the text too hard to read. To my surprise there were active links to sections of the book from the TOC. Certainly for the free price it's a generous thing to offer.

Lang's "Short Calculus" (a reprint of the 1st edition of his calculus textbook) is a welcome change from those 2234th edition doorstop textbooks that make calculus into a boring parade of examples, where the goal of the game seems to be becoming an ace at pattern-matching.

More recent, more idiosyncratic but quite nice is T.W. Körner's Calculus for the Ambitious. I could see a motivated high-schooler learn calculus from this.

Thank you for sharing this.

I used calculus book that written by Mathematics department of my university. Beside that, I read Calculus book by Purcell et al. [1]. This book is a good choice for supplement and exercise.

[1]: https://www.amazon.com/Calculus-Differential-Equations-Dale-...

I often here comments about finishing a mathematical/technical book over the course of a "few" weekends.

But I don't see how thats possible if it includes completing all (or even most of) the given exercises. Especially when you have a full-time job.

Some people are able to do it. But most are exaggerating or not doing the exercises. It takes me weeks to properly finish a good technical book due to time constraints. Either way, just do your best and forget about anybody else.

Over the weekend? I can't do it. Even if I forced myself to read for 6 hours Saturday and Sunday I'd forget everything during the weekdays.

An hour or so every day is much better and realistic.

Depending on the material it is doable over the course of a few weekends. Consider many college courses meet twice a week for one hour each time, so two hours a week. ~14 weeks leaves only 28 hours of in class instruction time. Devote three of your weekends this month to complete study and you'll easily match the hourly total lecture-wise (you could even do it in one weekend if you're hardcore), what can kill you is the exercises, and the time it takes for actually learning the material.

Despite meeting more frequently I don't think college students learn the material any better than an upfront binge learner, because most of them have no clue how to actually learn something. They read and cram exercises enough to match the patterns and pass by (a sort of compressed periodic binge learning), and then they're done. Course interdependence forces some amount of actual learning that lasts but not that much.

Anyway to pull off the weekend study you wouldn't spend 6 hours on each day of your weekends just "reading". You would be reading (not necessarily in order or even every page), doing exercises, creating mnemonics, finding other resources to clear something up, and possibly making some flash cards to take advantage of spaced repetition later, which has an important characteristic that you don't need to review every day for an hour, only at the moment before you'd naturally forget which could be days, months, or years away. Depending on the subject you may also just be "practicing", for whatever that means for the subject. (Writing programs is a common programmer method to supplement in the learning of something.)

Another benefit to the intense approach is that you create many associations up front, instead of living in confusion until (if you don't give up beforehand) your slow and steady schedule advances to the point where learning something new makes enough older things click together. If you're just casually reading for 6 hours a day on Saturday and Sunday, and do no review, and have no intensity of making it an active exercise instead of a passive reading-only one, then yeah, you're not going to learn anything, but I doubt you'd learn much more by converting the same behavior to an hour a day.

I always thought the point of a university was to teach you _how_ to learn, the actual material learned being an added bonus.

Some students might learn how to learn as a side effect of surviving the system, but there are easier ways of surviving the system than actually learning. There are strong incentives against actually learning too -- e.g. when the material to be learned is obsolete or irrelevant in the face of modern technology. In any case I think you're the first I've heard say they thought the point of the system is to learn how to learn, I've never seen that even historically. (And if it were true, the system is an even bigger failure than it already is while addressing its other stated purposes...)

"The aim of the University is a true enlargement of mind... the power of viewing many things at once." [0]

Would very much like to see Cardinal Newman's Ideas around 'liberal' and 'servile' education catch the attention of the HN crowd. We're doing learning and advancement all wrong by focusing on utilitarian outcomes for universities rather than pure development of the mind (whence would flow marvellous creativity).

[0] http://www.newmanreader.org/works/idea/

I cannot find that quote on the site you linked. Do you have an expansion? The closest I found in the text was this paragraph:

"Instances, such as these, confirm, by the contrast, the conclusion I have already drawn from those which preceded them. That only is true enlargement of mind {137} which is the power of viewing many things at once as one whole, of referring them severally to their true place in the universal system, of understanding their respective values, and determining their mutual dependence. Thus is that form of Universal Knowledge, of which I have on a former occasion spoken, set up in the individual intellect, and constitutes its perfection. Possessed of this real illumination, the mind never views any part of the extended subject-matter of Knowledge without recollecting that it is but a part, or without the associations which spring from this recollection. It makes every thing in some sort lead to every thing else; it would communicate the image of the whole to every separate portion, till that whole becomes in imagination like a spirit, every where pervading and penetrating its component parts, and giving them one definite meaning. Just as our bodily organs, when mentioned, recall their function in the body, as the word "creation" suggests the Creator, and "subjects" a sovereign, so, in the mind of the Philosopher, as we are abstractedly conceiving of him, the elements of the physical and moral world, sciences, arts, pursuits, ranks, offices, events, opinions, individualities, are all viewed as one, with correlative functions, and as gradually by successive combinations converging, one and all, to the true centre."

If the quote comes from this, it is crucially leaving off the continuation: "...as one whole, of referring them severally to their true place in the universal system, of understanding their respective values, and determining their mutual dependence." This implies that by learning a lot, you enlarge your mind, and then can connect everything. This has nothing to do with learning how to learn, especially as a primary goal of university. Here is a college that supposedly follows his guidance: http://www.thomasmorecollege.edu/academics/true-enlargement-... Again, from that page, "it is plainly both the knowledge of architectonic principles and the familiarity with the substance of the various arts and sciences of which a liberal education is composed, including such pursuits as history, literature, rhetoric, mathematics, and the study of the natural world." So what you learn matters.

Thanks for the link though, should be interesting reading later. I agree it'd be nice if universities embodied some of the purpose they historically set out to be for, and we resurrected utilitarian trade schools with tight integration into what companies want so that those without the inclination or ability to pursue intellectualism can still learn something useful and create a better life for themselves.

Hi Jach,

I'm glad you find the Cardinal's thoughts stimulating. Yes, I pulled that quote from a Google result without sourcing it correctly, but perhaps you would agree they convey the spirit of the discourses? I'd love to hear your remarks on Cardinal's distinction between liberal and servile education[0], or, indeed, your impressions of the essay as a whole.

Addressing your point, it seems that these things are not that different (being able to fit knowledge within a universal system and understanding how to learn), or that in achieving the stated end (being able to fit knowledge within a universal system), one would need to 'learn how to learn.'

If you'd like to continue the discussion offthread, I'm available at myusername at geemayl dawt com

[0] http://www.newmanreader.org/works/idea/discourse5.html

Great point about forgetting the material. If you really want to learn something you need to review it more than once, and you need to encounter it in more than one environment / context (unless you're a genius, maybe). It's science, yo.



context based learning --> https://www.ted.com/talks/deb_roy_the_birth_of_a_word

I learned that from math literature. To really solidify a topic you need to express it in as many ways and "different angles" as possible. It's related to the more ways you've seen a problem solved the better your understanding.

It probably isn't if you're coming at the material for the first time, or after a long break. I took a 15-week course in Linear Algebra a few months ago, and we only covered about half the book in that time. I spent just about every weekend and evening doing those exercises. It's very time consuming.

However, if you gave me my old College Algebra book, I might be able to skim through it in a month of weekends and refresh myself on most of it, because I've used that stuff a lot in various jobs. Same goes for a lot of (but by no means all) programming books. I'm immersed in that stuff daily, so I can get through it pretty quickly.

Well, math really isn't a spectator sport. You have to do the work on your own, reading is only part of the work. A very time consuming hobby indeed.

It depends. I tend to remember a fair amount of material in math classes from just paying attention. I rarely explicitly study at all for math classes and when I do the results are mixed. Example: In calculus 2 there were all those annoying weird trig integral forms. I couldn't remember them all because it was like a new one arrived daily for a while. I set out to do practice problems with them but still didn't remember much and did poorly on parts of tests that required them. Other things like arc length, double integrals, integration by parts or integrating vertically instead of horizontally, all were just intuitive to me and I remembered them without trying to. I'm not sure how typical or not my results are but in general throughout school if I felt the need to study something and practice it, it was bad news, but if something made sense to me it stuck without much further effort.

I'll add on my own anecdote here, I'm a stats major and I've found that in my stats (as opposed to pure math) classes, I find the learning is very much done just by reading the book because every new concept is just an intuitive application of earlier ones, once introduced to the concept I can understand it even without working through the excercises.

In my more pure math classes (and admittedly in some topics like counting problems) I have to spend a lore more time doing exercises to actually have a grasp of the material. It's frustrating but that's just how life goes.

It can be if you make it. It has been about a decade since I finished coursework for my pure math degree, I do not work in mathematics, and I am enjoying mathematics more than ever just from reading books. I do not miss doing textbook exercises (evaluating integrals? computing determinants? I reach for Maxima or Wolfram Alpha), and am content with reading other people's proofs.

I rarely "finish" a technical book. I instead skim over it once or twice and then keep it on hand as a reference. Some books are indeed worth reading front-to-back and in-depth, but usually the use as reference material is more important to me.

Mmm. Besides, I find my programming/work/etc. improves when I read novels in my spare time :)

On the contrary, I find my work/family life improves when I do nothing in my spare time ヅ

I think such books are pointless if you aren't going to use them in your day-to-day work.

You don't believe in knowledge for the sake of enjoying the perspective that more knowledge gives you?

I do, but with a kid my time is now limited. Unused knowledge has this habit of being forgotten. It turns out to be a terrible waste, at least from my POV.

FWIW, I read a lot and while I often find it difficult to "recall on demand" particular things I've read, I have often experienced that I'll recall what I read in a relevant situation. I first experienced this when I did engineering calculus in college which covered a lot of (for me) obscure parts of calculus. And frankly I couldn't recall much of it at all, but when I took electromagnetic field theory and needed it to answer a question, it would bubble up to the surface.

That experience lead me to keep reading interesting things even if I couldn't recall them a week later on the assumption that when the need arose, if it was relevant, my brain might somehow surface the information for me.

That is indeed a perfectly valid trade-off, and not one the grandparent was mentioning. One thing worth mentioning is that if you don't read those books, you will probably not get a job that involves reading those books, nor will you turn your job into something that involves reading those books and applying their content.

If you are a software engineer, you can pretty much use linear algebra, calculus, algorithms in your dayjob, right there! Even if you write CRUD apps or the xth tower defense on android. It's all bytes and numbers and numbers stored in bytes and asymptotic behaviour and relational algebra and type systems and transistors, it just depends on how deep you want to look.

I'm currently a stay-at-home twin dad, and I absolutely crave to learn something new in my spare time (which varies from none to even two hours a day if I'm lucky). I don't care if I forget, but for me life just becomes too stressful without constant learning.

Of course, if I was working, I'd probably have enough to learn at work.

Here here, constant learning is the only thing to save our sanity.

Regarding work, I do have a fulltime job, yet one has to fight hard to ensure any amount of learning, constant or otherwise.

Whoops, thanks, how did that slip past my brain filter ;-)

There is a good video from Niel deGrasse Tyson talking about learning.


His argument is learning is never a waste of time, even if you don't ever use and forget everything you studied. The simple act of learning is beneficial, it helps build connections in your brain. You develop skills that can be applied to other problems.

It's always beneficial but is it always more beneficial than going to the gym, being with your kids/SO, sleeping more, etc?

Everything has a cost.

I'm very heavy on learning for learnings sake but I don't like the way it's framed as the correct thing to do.

Learn with your kinds/SO. Let's be honest, a lot of your time with them is spent watching TV or something like that anyway. Turn it off and read together.

Baseball players waste 9 of every 10 swings on misses. It's a terrible waste.

>Baseball players waste 9 of every 10 swings on misses.

And swinging a bat is one of the skills baseball players need to use for their job. The comment you replied to was talking about skills that are not going to be used every day. So I don't think your analogy is very useful.

Also, people who get paid to play baseball never have a batting average that low

Batting average will be higher than the percentage of swings that don't miss.

Yep, we don't use our brains every day.

So what you meant to say was with your current situation it is useless to you.


"Mr. Potter, one of the requisites for becoming a powerful wizard is an excellent memory. The key to a puzzle is often something you read twenty years ago in an old scroll"

I skim technical books that are not immediately useful to i) build a mental index and ii) fill the gap of my unknown unknowns.

When I hit a problem, sometimes much later, I won't remember the details, but I'll remember that there is a concept that could help me, and know where to look to find more information.

For example, I've read much more about low level networking and messaging than was immediately useful at the time. Months later, a messaging pattern I read about turned out to be a good solution to a problem I was facing. If I hadn't read the book I wouldn't even have known what to search for.

(I also read about some technical topics more deeply for my own enjoyment/future career prospects, but the value of that is more uncertain.)

I've actually ended up having to let go almost every person working for me that takes your view.

Learning such things expands what you can do at work, no matter what it is. We no longer live in a world where you can punch a clock and do the same thing for decades until you get the gold watch and are send home to wait to die watching TV on your barcolounger (I don't think I've seen one of those in 30 years). Things are changing so fast that the only way to stay ahead is to learn, learn deep and actively practice your art or craft.

it nice being reminded how boring and simple my job is...

created a thread asking just this https://news.ycombinator.com/item?id=12718444

Dan Luu's style is so impressive for his ability to be super objective about pros and cons of things. There's a post he wrote where he traces his career and lists out possible missteps and successes. His ability to dispassionately look at situations and evaluate them on their merits rather than allow their connotations into his judgement is quite enjoyable to read.

Also his talk at strange loop was spectacular.

Can you link to his post tracing his career. I often wonder how others have made decision to make career choices, and what they think of their past decisions.

Any chance you can link it? For some reason i cannot seem to find it.

ok sorry, I mean't the career analysis.

Whoops. In that case, I think they are referring to http://danluu.com/learning-to-program/

Interesting read.

"I managed to get a B.S. degree without ever using or seeing anyone use version control."

This agrees with my own experience. Do tech courses teach VCS's these days?

> Do tech courses teach VCS's these days?

I would kinda hope not. They're one of those things you'll quickly get lots of experience with on-the-job, and there are so many useful things you can learn at university that no employer will let you learn on the job.

I took two semester-long group project courses that required version control, but they were optional upper-level classes. At my school I think you could feasibly get through the degree without being forced to use version control, although it would be difficult to not ever hear about it.

Thank you very much

I agree. Especially on the Windows vs Linux thing.

He comes off as an expert but he hasn't done anything impressive to my mind.

Most experts haven't, you don't need to do anything impressive to have expertise.

The best introduction to optimization methods book I've ever read is "Optimization by Vector Space Methods" by Luenberger. This is the book that opened my eyes to the generality of least-squares methods, the actual geometry of the problem, and how to apply it extremely generally. I read this before Boyd and Vanderberghe's "Convex Optimization", and I'm glad I did - it goes much more deeply into the intuition and exposition. It's not as well known as it should be, but it's a complete gem.

One of my favorites not on the list: Code: The Hidden Language of Computer Hardware and Software, by Charles Petzold


Takes you from simple mechanical switches all the way to a CPU.

You're dead, marincounty. I've never seen it before, where someone's comments can be dead sometimes and available others.

The mechanism is called 'vouch'.

I have that book.

It's good for other field too. I've know union Electricians who didn't know how a three way switch works. They could wire it, but couldn't conceptualize it. Same with relay, and transformers.

It wasen't there fault. They just weren't taught it in the right fashion.

I do feel the book is dry though. I don't feel you need to read it front to back. I personally got more out of the diagrams, than the writing.

(My pet peeve in most technical books is the apparent lack of editing. If anyone is on the road to writing a technical book; there is nothing wrong with short books. People will pay for short books. Less is more--much of the time.)

Luu says regarding the Little Book of Semaphores:

"If I’m writing grungy low-level threading code today, I’m overwhelmingly like to be using c++11 threading primitives, so I’d like something that uses those instead of semaphores,"

But as someone whose lowest-level experience of concurrency is with APIs similar to the C++ primitives (which are not that different from pthreads), I disagree. I found it a real eye-opener to see how all this can be broken down to semaphores.

I am starting to think that a semaphore-only set of primtives would be easier to reason about. I've seen better coders than me make over-complicated mutex based solutions when sempahores gave a simple answer. And I bet I've done it too.

I totally agree. I've spent way too much time in the depths of terrible embedded operating systems trying to do basic synchronisation out of whatever terrible primitive they'd decided to implement instead of semaphores, when semaphores would be so much easier.

(Frequently I ended up just implementing semaphores, and then doing everything else in terms of those, frequently using a standard library I had precisely for that purpose...)

(Embedded device flashback moment: a mobile phone OS where the only concurrency primitive was a mutex, each of which contained a fixed-size buffer of waiting tasks. The size of the buffer was smaller than the number of tasks on the system, and if a task blocked on the mutex while the buffer was fill, another task would randomly wake up.)

When you use pthread semaphores, be careful reading the documentation, because there are some gotchas that are not immediately obvious. I think that's why more programmers don't use them, because at first they seem intimidating.

> This book agrees with my biases and I’d love for this book to be right, but the meta evidence makes me want to re-read this with a critical eye and look up primary sources.

Too true. Peopleware did not live up to my expectations. It's very light on evidence, has the chapter flow of a monthly-newsletter-turned-book, and contradicts itself in a few places without blinking an eye.

I think it's on-topic to offer a shout-out to the csbooks subreddit [1], where we share links to freely (legally) available CS books.

[1] https://www.reddit.com/r/csbooks/

Shen & Lipasti, an under appreciated book.

I like Hennessy and Patterson Computer Organization more than their Computer Architecture, especially the last edition. I'm looking forward to reading the ARM version of COAD:


I own the ARM version. I have enjoyed reading it, but if I recall correctly, most of the chapters are the same, and the few that do mention ARM kind of mention that ARM is similar to MIPS and then proceed with the old MIPS content. It never goes deeply into ARM architecture.

I would like to see a true rewritten version for ARM.

I assume you mean the "Modern Processor Design: Fundamentals of Superscalar Processors" by Shen and Lipasti. I agree that is a great book to read. Just quite an expensive book for a casual reading. I was fortunate to get it cheap at a local used book store.

The idea is good: a list of general topics, a "why should you care" section for each (the part I really liked) and a few specific titles.

I would love an expanded list of topics (the current one is short) e.g., compilers, comms, security, Arduinos/ raspberry Pi / IoT. I personally did not like long lists of specific books -- I'd rather know about the topic and browse bookshelves at a Barnes and Noble to pick a couple that I like, but that's just my preferences.

This is vaguely similar in style and much broader: http://lesswrong.com/lw/3gu/the_best_textbooks_on_every_subj...

I also put together a list http://astore.amazon.com/adamnemecek-20 I'm not actually making money from the links because amazon closed my affiliate account.

We had "Structure and Interpretation of Computer Programs" by Abelson/Sussman when I was at university, which I found a good introductory book.

For a more thorough understanding I would recommend Donald Knuth's "The Art of Computer Programming".

Both of those books were recently (as in two days ago on here) in a list of "Books people claimed they read but really don't."

I've tried a couple of times. Gearing up for another attempt soon.

But there's one thing I've found interesting. I'm still stuck in Chapter 1.2: the infamous Mathematical Preliminaries section. I am not proud of this. From what I can tell, the various aborted liveblogging attempts I've seen also all get stuck here. Knuth himself recommends skipping it if you get stuck.

But even though I haven't yet managed to finish that single part of the book -this part which comes before any actual computer stuff- I STILL come out of it a much better programmer. Every. Single. Time. I haven't yet written a line of MIX or MMIX, and I have STILL been able to use this book to level-grind, just by getting further in 1.2 than I was able to get before. It's awesome. Even when I fail, I come out stronger.

I do eventually plan to blog my own attempt. My plan, though, is to not actually blog 1.1 and 1.2 live: I will do these chapters, write the articles on them to give myself a buffer, and only put up the blog once I'm already through The Big Filter. I figure this will give me a much better chance of actually succeeding once I start.

> I'm still stuck in Chapter 1.2: the infamous Mathematical Preliminaries section

You might want to try starting with "Concrete Mathematics" (also by Knuth): it's a longer intro to the same material, but covering a lot more of the background that TAOCP just kind of assumes that you already know.

SICP is still a very good book for learning abstraction techniques, although it does sort of throw you in at the deep end in some ways.

TAoCP is great as a set of reference books that you can take a look at when stuck on a problem, but I don't think it's really designed to be read from cover(s) to cover(s).

I certainly don't think TAOCP is designed to be a reference. If so, it wouldn't be full of excellent exercises.

Agree wholeheartedly. I've seen people suggest from time to time that TAOCP should be used strictly as a reference book (like a dictionary or a thesaurus) - I suspect people who try to use it that way are going to be disappointed when they look up, say, the Trie algorithm and find out that the text assumes that you're already proficient in MIX programming, and back-references a half-dozen formulas from previous volumes (sometimes from the exercises!)

These type of lists have nothing to do with efficient learning. In the information age we have more available information than time. Knowing how to learn is the multiplication factor. If you do your due diligence these lists quickly becomes anecdotal.

I kind of disagree. Knowing what to learn is hard. You have two choices, listen to the advice of others, or learn everything. The latter isn't practical, so I appreciate seeing lists like this. If I see a book on 2 or 3 of these lists, it makes me at least curious to read it if I haven't.

I prefer learning what I find interesting, since I'll learn the most that way. I suppose that gets informed by the advice of others to some extent though.

I also believe in similar lines. These are just good to have list. I personally think its easier to lean from Internet articles, getting started guides, hello world programs etc. Not sure how many here buy and read a programming book end to end before starting to code. (or start with examples given in this book , given that its 2016)

Off-topic, but

  body {
    font-family: sans-serif;
    line-height: 1.4;
    margin: 0 auto;
    width: 50em;
Please? I get that these websites aim to be simple, but it's really hard to read like this.

I use printfriendly.com for such cases

Interesting comment on DeMarco's Peopleware:

> This book seemed convincing when I read it in college. It even had all sorts of studies backing up what they said. No deadlines is better than having deadlines. Offices are better than cubicles. Basically all devs I talk to agree with this stuff.

> But virtually every successful company is run the opposite way. Even Microsoft is remodeling buildings from individual offices to open plan layouts. Could it be that all of this stuff just doesn’t matter that much? If it really is that important, how come companies that have drank the koolaid, like Fog Creek, aren’t running roughshod over their competitors?

The answer is in another recent post (http://danluu.com/sounds-easy/#fn:S):

> For a lot of products, the sales team is more important than the engineering team.

Put another way, every measure of engineer / software quality and project success (including the qualitative ones that are harder to measure) like delivering on time / under budget, correctness of implementation, system performance, uptime / reliability, number of bugs, ease of maintenance, minimal technical debt, etc. etc., are very often only nice-to-haves. Not necessarily all of them at all times, but often enough most of them except one or two (not the same one or two, though).

Which is a good thing, or startups would never be able to trade off covering edge and corner-cases, or scale, or 'standard' feature-completeness, etc. in favor of new and game-changing capabilities (or business models) & incumbents could never be disrupted.

But as it happens, we know that 'worse is better' in lots of ways and in lots of circumstances. So companies that 'drink the kool-aide' and focus on developer productivity and happiness may produce 'better' software by any and all measures you care to use as a developer, instead of focusing on only the most important ones that directly relate to optimizing the customer acquisition funnel and subsequently reducing customer churn.

At the level of the corporation, programming is a competitive sport, but companies are not scored on software quality, or developer productivity, or developer happiness. Companies are only scored on 'getting and keeping customers' and 'making a profit' (which may require paying attention to some quality measures, just not all of them all the time).

Put yet another way: If you're doing Lean Startup / Customer Development right, the customer decides what 'quality' means, not you.

This is a very interesting idea and something I am questioning at the startup I'm currently working for (~50 engineers). I don't think the idea of software quality and time to market are diametrically opposite ideas. I'm the tech lead of an infrastructure team and we have been focusing on refactoring some of the most egregious code. After completing a few of these projects, my team has noticed that the development speed of some of the teams interfacing with our refactored code have seen improvement. Small projects with 5 day estimates are completing in 3 days and engineers are not as frustrated at the state of the codebase.

I understand that time to market can sometimes be a differentiator and its acceptable to build a quick and dirty MVP. Version one of a startup's codebase is going to be messy because you are constantly making tradeoffs to survive. Once the startup leaves crunch mode, engineering leadership should be allocating at least 10% of engineering time to refactoring. Otherwise the bloated, unstructured codebase could be holding the organization back from building the next market defining feature in time to beat the competition.

Anyone counting Microsoft as "successful" is scoring companies on their ability to threaten price discrimination to exclude competitors' products from the marketplace.

Anyone who thinks that was the only (or even the primary) driver of Microsoft's success doesn't understand the dynamics of the market (and isn't it interesting that you thought of Microsoft specifically?).

Certainly plenty of people thought so at the time (including myself, as well as Microsoft's execs, or they wouldn't have done it), but although without the underhanded tactics they would have had a somewhat smaller market share and correspondingly smaller profit margins, in hindsight they would still have been the dominant platform vendor for desktops, office suites, and back office servers.

It turns out that Microsoft's strategy of sucking customers in with 'Better Together' all-MS integrated offerings, never making a customer have to consider another vendor because some custom in house software they rely on won't run anymore due to an upgrade (no matter how poorly), and as a distant second, introducing breaking changes for competing vendors' offerings wherever they could (eg. 'Windows isn't done until Lotus won't run', and even that tactic was eventually abandoned due to the overhead it introduced), was all they needed in order to maintain and grow their early lead.

Or using pretty much any metric of successful you can think in the financial world.

Upvoted for recommendation of "Dasgupta, Papadimitriou, and Vazirani; Algorithms".

Unlike TAOCP and CLRS it's actually readable in realistic amount of time.

This book is also very good at explaining theoretical computer science. In particular - NP completeness.

Official copy is available at home page of Umesh Vazirani at berkeley.edu:

0: Prologue - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap0....

1: Algorithms with numbers - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap1....

2: Divide-and-conquer algorithms - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap2....

3: Decompositions of graphs - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap3....

4: Paths in graphs - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap4....

5: Greedy algorithms - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap5....

6: Dynamic programming - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap6....

7: Linear programming and reductions - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap7....

8: NP-complete problems - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap8....

9: Coping with NP-completeness - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap9....

10: Quantum algorithms - https://people.eecs.berkeley.edu/~vazirani/algorithms/chap10...

Personally, my favorite algorithms/data structures books is Algorithms 4th ed by Sedgwick and Wayne. It does a great job explaining the material from a theoretical standpoint, but also focuses on practical application in addressing real problems, and every algorithm comes with real, working Java code that in some cases is even superior to the implementations in the standard Java libraries.

And it perfectly accompanies Sedgwick's free algorithms course on Coursera.

I saw that he mentioned that he got the book off of an author's website for free and went looking for it -- found Dr. Vazirani's site and course page[0]. He mentions that it's available for download because at the time of writing, it wasn't found in bookstores.

Berkeley, in the meantime, has deliberately blocked access to the linked algorithms.html[1], as well as the root directory of the algorithm PDF files, suggesting to me that this is not an actual "free" book.

If anyone knows otherwise, I'd love to hear about it since I love free books.

[0] http://www-inst.eecs.berkeley.edu/~cs170/fa06/

[1] http://www.cs.berkeley.edu/~vazirani/algorithms.html

Can anyone recommend a good book about compilers? I just watched Martin Odersky's talk from Scala World [1] where he talks about the new Scala compiler he is working on called Dotty [2], but he talks a bit about other compilers and now I am interested to learn more.

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

[2] http://dotty.epfl.ch

My three favorite books on compilers (in no particular order) are:

* Engineering a Compiler: https://www.amazon.com/Engineering-Compiler-Second-Keith-Coo...

* Modern Compiler Implementation in ML: https://www.cs.princeton.edu/~appel/modern/ml/

* Compiling with Continuations: https://www.amazon.com/Compiling-Continuations-Andrew-W-Appe...

I second Modern compiler implementation in ML. I'd also add Types and Programming Languages by Pierce, commonly referred to as TAPL for background on type systems. https://www.cis.upenn.edu/~bcpierce/tapl/

Could anyone weigh in on his assessment of Martin Fowler's Refactoring book? I'm considering picking it up - some seem to be of the opinion that its ideas are old news in 2016 and there's not much to learn from it, others say there's still lots of useful information.

It's still extremely relevant and useful. Once you've read it cover-to-cover, it remains useful as a reference. I would also recommend Michael Feathers "Working with Legacy Code".

Personally, I found "Working with Legacy Code" much more insightful. Fowler's stuff is great in theory but hard to use in practice.

Hacker's Delight by Henry S. Warren

I'm surprised the author didn't include Axler's Linear Algebra Done Right under the math section considering how fundamental linear algebra is to so many domains of computer science.

Cool to see lots of comments on real life algorithm applications, if anyone is interested in diving deeper there's a good book that came out recently called "Algorithms to Live By" by Brian Christian and Tom Griffiths. It talks about how we often use CS algorithms in real life without knowing.

If you want a glimpse here's a talk they gave at Google: https://www.youtube.com/watch?v=OwKj-wgXteo

A little-known book, quite dated by now, but one of those books that takes a tightly-focused problem and shows how to solve it in a beautiful way that doesn't just solve the problem but also creates meaning that transcends the initial problem, is "Threaded Interpretive Languages" by Loeliger.

I could use a good book on combinatorics. The ones I have are way too dry and doesn't explain well in plain English.

High-speed Digital Design should probably be on the hardware list. It was recommended in all kinds of places plus doing high-performance often takes different style. Id be interested in an ASIC engineer's opinion on it if one of you are here.

Read through peopleware recently; I was surprised to see it on this list, mainly because it felt targeted more at low-mid level software engineering managers than "devs".

Nice list that I'll certainly pick a title or two from to add to my queue.

A good list for sure; I'll be adding a few of these to my reading list (and a couple, like "Higher Order Perl", already are).

"I find algorithms to be useful in the same way I find math to be useful"

I'd hope so :)

A pretty cool book I'd like to see translated into other languages.

There's an unofficial companion that has the examples translated to Javascript: http://interglacial.com/hoj/hoj.html

Same for Ruby: http://graysoftinc.com/higher-order-ruby

Regarding OS; how does the Comet book compare to the Dinosaur book?

Meta question: does author blocks requests from some countries? Somehow danluu.com is only accessible for me through vpn, else times out.

Refreshing post title! It beats the tired old "10 xxxx books you MUST read, or else" you see all over the place

It's language specific but I would recommend eloquent Ruby. One of the most engaging programming books I've read

Still worth reading because ruby is beautiful.

Tanenbaum's Operating Systems isn't there. Sorry, this isn't a good list.


I'm really happy to see the books on game theory and auction theory on there.

Coincidentally, this very book on auction theory was suggested to me by a fellow faculty member about three months ago. I guess I really ought to find some time to read it!

Mythical Man-Month and Software Project Survival Guide

So pretty much every book from the CS course.

Guidelines | FAQ | Support | API | Security | Lists | Bookmarklet | DMCA | Apply to YC | Contact