Programming books you might want to consider reading
danluu.com
danluu.com
https://ocw.mit.edu/resources/res-18-001-calculus-online-tex...
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.
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 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-...
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.
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.
An hour or so every day is much better and realistic.
https://en.wikipedia.org/wiki/Spaced_repetition
&
context based learning --> https://www.ted.com/talks/deb_roy_the_birth_of_a_word
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.
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).
"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.
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
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.
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.
https://m.youtube.com/watch?v=utedyJ7QRBs
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.
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.
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.
Of course, if I was working, I'd probably have enough to learn at work.
Regarding work, I do have a fulltime job, yet one has to fight hard to ensure any amount of learning, constant or otherwise.
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.
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.)
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.
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.
Also his talk at strange loop was spectacular.
"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?
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.
https://www.amazon.com/dp/B00JDMPOK2/
Takes you from simple mechanical switches all the way to a CPU.
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.)
"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.
(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.)
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 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:
https://www.elsevier.com/about/press-releases/research-and-j...
I would like to see a true rewritten version for ARM.
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.
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.> 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.
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.
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.
For a more thorough understanding I would recommend Donald Knuth's "The Art of Computer Programming".
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).
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.
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.
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...
And it perfectly accompanies Sedgwick's free algorithms course on Coursera.
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.
* 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...
If you want a glimpse here's a talk they gave at Google: https://www.youtube.com/watch?v=OwKj-wgXteo
Nice list that I'll certainly pick a title or two from to add to my queue.
"I find algorithms to be useful in the same way I find math to be useful"
I'd hope so :)
Same for Ruby: http://graysoftinc.com/higher-order-ruby
/fanboy