2017年/04月/05日
108本书
[Algorithms] P vs NP review by Scott Aaronson :*Seriously even if you only read 5 pages, you’ll learn a lot and have a few laugh. I’ve ever read
[Algorithms] The Algorithm Design Manual by Steven Skiena :* Each section contains a story of some situation he was in where he faced a problem which he solved by applying one of various algo techniques (DP, divide and conquer, etc.). After reading CLRS for a class, it was nice to see how some of the most common textbook algorithms have been applied by a notable computer scientist.
[Algorithms] Algorithms to Live By :*I’m a cognitive scientist who got into programming and computing, and so this book, co-authored by a computational cognitive scientist, was right up my alley. It talks about sorting, scheduling, networks, caching, and more, in an extremely accessible but informative manner. Very quick read.
[Algorithms] Algorithmics — The Spirit of Computing :*A light read on the essentials of computer science. Didn’t really get the hang of algorithms until after I read this book.
[Algorithms] Pearls of Functional Algorithm Design :* My favorite programming book. This book not only gives you a great collection of purely functional algorithms, it provides many key insights and techniques for findings such algorithms.
[Algorithms] Algorithms + Data Structures = Programs.
[Algorithms] Introduction to Algorithms by CLRS.
[Algorithms] Algorithms by Sedgewick :*(http://algs4.cs.princeton.edu/home/) is a much better book for learning and understanding algorithms. Skienas book is a simple collection of (sometimes very exotic) algorithms. It won’t teach you anything, it will only tell you what exists. Sedgewicks book is much better in that respect. One can compile and run the given Java examples and actually play around with them. Skienas book is a good reference for postdocs in algorithmic design. Sedgewicks book on the other hand is for people who actually want to implement these algorithms.
[Algorithms] Algorithms In A Nutshell :*Creating robust software requires the use of efficient algorithms, but programmers seldom think about them until a problem occurs.
[Algorithms] Grokking algorithms :*Great book, especially for someone like me who doesn’t deal too much with this stuff (as an embedded systems engineer).
[Architecture] Essentials of Computer Architecture by Douglas Comer :*Clear, concise approach to computer architecture that readers love.
[Bioinformatics] A Life out of Sequence — A Data Driven History of Bioinformatics :* If you you work in bioinformatics it is weird how little history the average bioinformatician knows (the field only really dates back to the late 1960s). People may know things like PAM matrices, but not Margaret Dayhoff who created them (not to mention the standard amino acid codes used today).
[Compilers] Engineering a Compiler 2nd Ed by Cooper & Torczon :*I used it to supplement my prescribed compiler construction textbook and it’s incredibly useful! Also surprisingly easy to read compared to some texts with a very math-heavy approach.
[Compilers] The Basics of Compiler Design by Torben Mogensen
[Compilers] Modern Compiler Implementation in C” by Andrew Appel :*(ML and Java versions available too)
[Compilers] Modern Compiler Design by Grune, Bal et al
[Compilers] Principles of Program Analysis by Flemming Nielson :*Uber hardcore and beautiful approaches to static analysis and optimization, on a very general mathematical framework.
[Compilers] Introduction to the Theory of Computation by Michael Sipser :*Constructing Turing Machines is real fun.
[Compilers] Dragon book (Compilers: Principles, Techniques, and Tools)
[C#] C# in depth by John Skeet :*This could easily be one of the best computer related books i’ve ever read. The amazing thing is that is shows with code examples how the language progressed from one version to the next. I’ve never read anything similar in computer literature. It gave me a deep understanding of the language and all its caveats.
[C++] Problem solving with C++ 9th edition
[C++] Elements of Programming :*This book proposes how to write C++ code in a mathematical way that makes all your code terse. In this talk, Sean Parent, at that time working on Adobe Photoshop, estimated that the PS codebase could be reduced from 3,000,000 LOC to 30,000 LOC (=100x!!) if they followed ideas from the book. Another point of his is that the explosion of written code we are seeing isn’t sustainable and that so much of this code is algorithms or data structures with overlapping functionalities. As the codebases grow, and these functionalities diverge even further, pulling the reigns in on the chaos becomes gradually impossible. Bjarne Stroustrup (aka the C++ OG) gave this book five stars on Amazon (in what is his one and only Amazon product review).
[Data Structures] Structure and Interpretation of Computer Programs(SICP) :This is a great bottom-up tour through selected topics in computer-science and the underpinnings of defining a programming language. If I had to give one book to interns and new grads on their first day of work, it would be this book.**Definitely recommended. There are some unit test libraries for SICP aroundhttp://web.mit.edu/~axch/www/test_manager.html There’s also the MIT online tutor for exercises http://icampustutor.csail.mit.edu/6.001-public/ ** I read it twice and it is still a gem. Teaches the principles of computer programming, such as abstraction in programming, metalinguistic abstraction, recursion, interpreters, and modular programming.
[DevOps] (Phoenix Project) — The DevOps Handbook: How to Create World‑Class Agility, Reliability, and Security in. by Gene Kim — * The story they’ve wrapped around the shift to Agile for this company was extremely entertaining and kept me coming back to read more! Plus it has some very good thought exercises to take with you to your own job :)
[Erlang] [Distributed Systems] Designing for Scalability with Erlang/OTP — Implement Robust, Fault-Tolerant Systems :*Even though this is an Erlang book (I don’t really know Erlang), 1/3 of the book is devoted to designing scalable and robust distributed systems in a general setting which I found the book worth it on it’s own.
[Go] The Go Programming Language :*This is more (only, in fact) about programming but I found The Go Programming Language to be an absolutely perfect introduction to Go with fantastic examples and succinct prose. It’s beautifully typeset as well, which doesn’t hurt.
[Go] Web-dev-golang-anti-textbook :*I found this to be helpful for learning basics of web development — https://github.com/thewhitetulip/web-dev-golang-anti-textbook
[General] The Annotated Turing :* It’s a book made to explain the paper Turing wrote where he invented his universal computing machine, which of course lead to the modern computer. It begins with a back story and necessary background knowledge then goes through the paper paragraph by paragraph. You need to be a bit mathematically minded and it can be challenging to understand at times but I found it difficult to out down. Charl Petzold books are all phenomenal!
[General] Code by Charles Petzold:The Hidden Language of Computer Hardware and Software Hands down, without a doubt. Read that before doing anything with the code. It is truly one of my favourite books I’ve ever read. I learned a lot about machines from the books and how computers operate.I still haven’t read anything better than Code by Charles Petzold.
[General] From Mathematics to Generic Programming by Alex Stepanov
[General] Clean Code by Robert Martin
[General] Code Complete by Steve Mcconnell
[General] Code Complete 2 by Steve McConnell :*This book is super practical, and is only about reading, writing, and debugging code. IIRC there an entire chapter on how to name your variables. It also gives incredibly good advice on how you should approach debugging, stuff I wish I wouldn’t have had to learn on my own.
[General] The Imposters Handbook by Rob Connelly’s
[General] Weapons of Math Destruction by Cathy O’Neil :*excellent (recent) book, not specifically about coding, but she talks about the ethics surrounding programming and how big data/data mining is increasingly finding its way into every aspect of our lives. I actually listened to the audio book — which the author reads herself.
[General] Quantum Computing Since Democritus by Scott Aaronson :*A brilliant MIT professor’s reflections on the intersection between computer science, physics and philosophy. Here are the lecture notes and book: http://www.scottaaronson.com/democritus/ I also very much recommend the author’s blog: http://www.scottaaronson.com/blog/ **takes on a tour through some of the deepest ideas of maths, computer science and physics. Full of insights, arguments and philosophical perspectives, the book covers an amazing array of topics. Beginning in antiquity with Democritus, it progresses through logic and set theory, computability and complexity theory, quantum computing, cryptography, the information content of quantum states and the interpretation of quantum mechanics.
[General] The Elements of Computing Systems — Building a Modern Computer from First Principles by Noam Nisan and Shimon Schocken :* Basically, it has you hands-on work through the basics of every concept active in a modern computer save for networks and the web. You use software tools provided with the book to design memory, ALUs, interpreters, VMs, compilers Operating Systems and applications. Available as a free online class at http://www.nand2tetris.org. **I’d definitely recommend TECS for folks looking to learn more about the many layers of abstraction sitting under their interpreter/VM. Also worth taking a look at the Little OS Book or the OSDev wiki for some more insight into a less idealised/more crufty architecture.
[General] The Mythical Man-Month by Fred Brooks :*It was written 40 years ago, but it is still relevant to today. Its so important to think about how to build effective engineering teams.
[General] Peopleware: Productive Projects and Teams by Timothy Lister and Tom DeMarco :*“It is the one thing every software manager needs to read… not just once, but once a year.” (Joel Spolsky)
[General] A Science of Operations by Mark Priestley (http://www.springer.com/gb/book/9781848825543) :*This is cheating a bit, because the book is history of computer science rather than computer science, but I think anyone interested in programming should read it. We often think about history of computing (and what it teaches us) in a retrospective way (we see all the amazing totally revolutionary things that happened), but it turns out that if you look deeper, there is often a lot more continuity behind key ideas (and we just think it was a revolution, because we only know a little about the actual history). This book goes into detail for a number of major developments in (early) programming and it makes you think about possible alternatives.
[General] Writing Efficient Programs by Jon Bently
[General] More Programming Pearls: Confessions of a Coder by Jon Bently
[General] The Practice of Programming by Pike, Kernighan :*I’ve been reading, it’s mainly geared towards Java and C/C++ programmers, but even as a DevOps engineer I’m finding a lot of it useful.
[General] Zero Bugs and Program Faster :A book about programming, improving skill, and avoiding mistakes.The author spent two years researching every bug avoidance technique she could find. Here’s a brief reflection — https://www.opinionatedgeek.com/Blog/2016/11/23/zero-bugs-and-program-faster-by-kate-thompson [General] Measuring and managing performance in organizations by Robert Austin :The best CS-related book I’ve ever read was probably . It completely changed the way I see the world, both professional and personally. Austin uses agency theory, an application of game theory, to show how incentives in an information economy drive dysfunction into organizations because not all metrics of behavior can be adequately or economically measured. This is extremely applicable to, for example, incentive programs in high tech organizations. At the time he wrote it, Austin was working on his Ph.D. in (I dimly recall) operations research at Carnegie Mellon while working as an executive in IT for Ford Motor Company Europe. Now he’s on the tenured faculty at Harvard Business School.
[General] Designing Data-Intensive Applications :*This book will help you navigate the diverse and fast-changing landscape of technologies for storing and processing data. We compare a broad variety of tools and approaches, so that you can see the strengths and weaknesses of each, and decide what’s best for your application. **He does a great job of distilling storage systems to concepts and discussing conceptual trade offs instead of focusing on particular storage products. Plenty of footnotes to relevant research papers too. http://dataintensive.net/
[General] Concepts, Techniques, and Models of Computer Programming by Peter Van Roy & Seif Haridi — https://mitpress.mit.edu/books/concepts-techniques-and-models-computer-programming
[General] Practical Foundations for Programming Languages by Bob Harper :*is really good. This text develops a comprehensive theory of programming languages based on type systems and structural operational semantics.
[General] GEB: Gödel, Escher, Bach: an Eternal Golden Braid :* You just read and re-read it over and over and still find something interesting
[General] D is for Digital: What a well-informed person should know about computers and communications, by Brian Kernighan.
[General] How To Solve It: Modern Heuristics by Michalewicz & Fogel :* is a classic. Shows the main techniques that optimization and problem solving enthusiasts should know.
[General] Semantic web for the working ontologist by Dean Allemang and Jim Hendler :*A very clear book that learns you to think about integrating data semantically.
[General] Basic Category Theory for Computer Scientists by Benjamin C. Pierce
[General] The Plausibility of Life by Kirschner & Gerhart :*OK, this is an oddball one, in that a book on Evo Devo is pretty far from CS, but reading it completely changed how I look at software architecture, protocols, formats, programming languages, and a whole range of other CS-related topics.
[Graphics & Visualization] Grammar of graphics :*This book changed my perception of creativity, aesthetics and mathematics and their relationships. Fundamentally, the book provides all the diverse tools to give you confidence that your graphics are mathematically sound and visually pleasing. After reading this, Tufte just doesn’t cut it anymore. It’s such a weird book because it talks about topics as disparate Bayesian rule, OOP, color theory, SQL, chaotic models of time (lolwut), style-sheet language design and a billion other topics but always somehow all of these are very relevant. It’s like if Bret Victor was a book, a tour de force of polymathical insanity. The book is in full color and it has some of the nicest looking and most instructive graphics I’ve ever seen even for things that I understand, such as Central Limit Theorem. It makes sense the the best graphics would be in the book written by the guy who wrote a book on how to do visualizations mathematically. The book is also interesting if you are doing any sort of UI interfaces, because UI interfaces are definitely just a subset of graphical visualizations.
[Haskell] Learn you a haskell for great good
[Interview] CTCI - * I had to say it, I’ve had it since my sophomore year of college, but I never really had use for it. Now that I’m searching for full-time jobs, its such a valuable resource. I just wish some of the explanations were more thorough, but I realized its not a highly rated book for no reason.
[Interview] Elements of programming interviews — *One of the best ways to prepare for solving technical interview questions. They are literally a problem trove with in depth explanations and solutions for which you can refer to after trying to solve it. Huge vouch for them. IMO, much better for CTCI if you can handle mathematical rigor and learning about the more technical reasons why an algorithm is correct. That is, if you are beginner or don’t have a rigorous CS education stick with CTCI otherwise EPI will do you much better.
[Javascript] You Don’t Know JS
[Javascript] Javascript : the good parts — *Invaluable if you are interviewing for a front end position.
[Javascript] Secrets of the Javascript ninja — *takes you on a journey towards mastering modern JavaScript development in three phases: design, construction, and maintenance.
[JavaScript] Eloquent JavaScript — *thoroughly revised edition reflects the current state of JavaScript and Web browsers, with new material, such as a chapter on code performance in JavaScript, and expanded coverage of recursion and closures.
[JavaScript] I recommend the MOOC and book for Nature in Code — evolutionary dynamics in Javascript — https://www.edx.org/course/nature-code-biology-javascript-epflx-nic1-0x
[Java] Effective Java 2nd Ed — *I highly recommend since it really helps to explain some of the best practices you see and explains why they are the best practices.
[Machine Learning] AI: A Modern Approach by Peter Norvig :* If you’re into Artificial Intelligence. You’re definitely gonna like this. Peter is the director of Google Research. He mentions how AI came into being, how it’s gonna be used, how AI principles should be laid be out. It also explains theories with mathematical terminology. ** is a great read.
[Machine Learning] Superintelligence by Nick Bostrom :*It’s a book about how a superintelligent AI can develop and the issues that can arise from it. It is like the logical inevitability of computational theory, at least as done by humans. Bostrom is very thorough and precise as to the issues, and he says that the book is at best a lower bound on what an AI could accomplish because something superintelligent would create ideas that we cannot even comprehend, much as a worm cannot comprehend a human’s mental capacity.
[Machine Learning] Paradigms Of AI Programming: Case Studies in Common Lisp by Peter Norvig
[Machine Learning] Deep Learning (Adaptive Computation and Machine Learning series) by Ian Goodfellow, Yoshua Bengio, Aaron Courville :* Came out in November 2016. Split in 3 parts- Part I: Applied Math and Machine Learning Basics (Linear Algebra, Probability and Information Theory, Numerical computation) Part II: Deep Networks: Modern Practices (Deep Feedforward Networks, Regularization, CNNs, RNNs, Practical Methodology & Applications) Part III: Deep Learning Research (Linear Factor Models, Autoencoders, Representation Learning, Structured Probabilistic Models, Monte Carlo Methods, Inference, Partition Function, Deep Generative Models). Available at http://www.deeplearningbook.org/
[Machine Learning] Reinforcement Learning: An Introduction by Sutton & Barto.
[Machine Learning] Machine Learning for Hackers by Drew Conway and John Myles White
[Machine Learning] The Master Algorithm by Pedro Domingos
[Machine Learning] Scala for Machine Learning by Patrick Nicolas :* This book almost never gets mentioned but it’s a superb intro to machine learning if you dig types, scalable back-ends or JVM. It’s the only ML book that I’ve seen that contains the word monad so if you sometimes get a hankering for some monading (esp. in the context of ML pipelines), look no further. Discusses setup of actual large scale ML pipelines using modern concurrency primitives such as actors using the Akka framework.
[Machine Learning] Markov Logic: An Interface Layer for Artificial Intelligence :* Have you ever wondered what’s the relationship between machine learning and logic? If so look no further.
[Machine Learning] Introduction To Statistical Learning with Applications in R, by Daniela Witten, Gareth James, Robert Tibshirani, and Trevor Hastie :*It’s the easiest book I’ve found to get into machine learning without any formal statistics training. And it’s free online — http://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf
[Machine Learning] Machine Learning: A Probabilistic Perspective (Adaptive Computation and Machine Learning series) :* Exhaustive overview of the entire field of machine learning. It’s engaging and full of graphics.
[Mathematics] Good Math: A Geek’s Guide to the Beauty of Numbers, Logic, and Computation :*A great review of college math and CS. The book goes over FOPL, Set theory, Turing machines and lambda calculus among other things. A fun read!
[Multicore programming] The Art of Multiprocessor Programming by Shavit & Herlihy :*Recommend topping it off with the lecture delivered at Microsoft Research (https://youtu.be/nrUszqrlvi8) This is an excellent book! It was my prescribed textbook for an undergrad concurrent systems course. It’s very “proofy” but explains a lot of important concepts quite well. The book is divided into two sections: Principles and Practice. The former introduces basic terminology, concepts and common mistakes. The latter is where it gets interesting and introduces real-world problems like cache coherence traffic. The language used in the book is Java but the concepts can be applied to practically any language that supports concurrency. Highly recommended!
[Networks] Hacking — The Art of Exploitation by Jon Erickson
[Networks] Patterns in Network Architecture: A Return to Fundamentals by John Day :*highly opinionated book (by someone who was around for the development of the Internet and OSI standards), and one that provided a radically new perspective on networking and network protocols that I have found useful over the past year.
[Networks] Internetworking with TCP/IP by Dr Douglas Comer :* This volume answers the question “How does one use TCP/IP?” — focusing on the client-server paradigm, and examining algorithms for both the client and server components of a distributed program. [.NET] Applied Microsoft .NET Framework Programming by Jeffrey Richter :* describes .NET Framework architecture, the common language runtime, and core types in the .NET Framework Class Library — deftly presenting the concepts, insights, and examples needed to begin developing robust, .NET Framework–based applications. describes .NET Framework architecture, the common language runtime, and core types in the .NET Framework Class Library — deftly presenting the concepts, insights, and examples needed to begin developing robust, .NET Framework–based applications.
[Networks] High Performance Browser Networking by Ilya Grigorik :*Lots of great insights about how TCP/IP, 3G etc work and how it affects the performance of websites.
[Networks] Network Security Through Data Analysis by Michael Collins :*several techniques and tools for collecting and analyzing network traffic datasets. You’ll understand how your network is used, and what actions are necessary to protect and improve it.
[Networks] A First Course in Network Theory :*The study of network theory is a highly interdisciplinary field, which has emerged as a major topic of interest in various disciplines ranging from physics and mathematics, to biology and sociology.
[Networks] Network algorithmics by George Varghese :*In designing a network device, you make dozens of decisions that affect the speed with which it will perform-sometimes for better, but sometimes for worse.
[Open Source] The Cathedral and the Bazaar by Eric S. Raymond :*It’s inspiring to embrace Open Source collaboration and also very useful for manage projects. In Guy Kawasaki’s quote “The most important book about technology today, with implications that go far beyond programming”.
[Operating System] The Design and Implementation of the FreeBSD Operating System
[Operating System] Commentary of xv6, a simple Unix-like teaching operating system :* By far the best book on operating systems I have encountered so far. https://pdos.csail.mit.edu/6.828/2012/xv6.html (The alternative is learning PDP-11 assembler and reading the original Unix v6 sources with Lion’s commentary)
[Python] Learn Python the hard way
[Python] Effective Python :*I highly recommend since it really helps to explain some of the best practices you see and explains why they are the best practices.
[Python] Problem Solving with Algorithms and Data Structures using Python :*truly great read, especially if one learning python.
[Parallel Programming] Structured Parallel Programming: Patterns for Efficient Computation by Michael McCool, James Reinders, Arch D. Robison :* It introduces some important parallel patters, explains what makes them tick and how to make them efficient. The book makes a strong case for using parallel frameworks, namely TBB and Cilk+ to create general and portable solutions. There’s also a set of slide available, — http://ipcc.cs.uoregon.edu/curriculum.html
[Quantum Computing] Non-Abelian Anyons and Topological Quantum Computation — *Not a book, but it’s a 70 page paper that changed (substantially) the way I thought about computing systems. The gist is a model of computation based on knotting the worldlines of a certain kind of particle (well, particle/anti-parricle pairs) and measuring properties of the knots/links. It’s also the theory behind Microsoft’s effort to build a quantum computer. Highly recommend at least reading the non-technical sections (ie, everything but section 3 and appendix A). Copy of paper: https://arxiv.org/abs/0707.1889
[Quantum Computing] Quantum Mechanics: The Theoretical Minimum by Leonard Susskind
[Quantum Computing] Quantum Computation and Quantum Information by Nielsen & Chuang
[Quantum Computing] Quantum Computing for Computer Scientists :*Note, you have to be willing to put the time in, especially if your linear algebra is rusty or (like me) you have only a passing familiarity with complex numbers. With that in mind, it’s almost entirely self-contained and you can immediately start to make connections with classical computing if you’re familiar with automata. I’ve been interested in learning about quantum computing for a few years now and this book finally got me going.
[Ruby] [Computation theory] Understanding Computation: From Simple Machines to Impossible Programs by Tom Stuart :*It’s a joy to read, explains fundamental concepts of things like parsers, interpreters and Lambda Calculus using minimal Ruby syntax.
[Ruby] Practical Object-Oriented Design in Ruby (POODR) by Sandi Metz http://www.poodr.com/
[Redis] Redis in Action
[Software Design] Star Schema — The Complete Reference by Christopher Adamson :*One of the best technical books ever written. The definitive guide to dimensional design for your data warehouse, Learn the best practices of dimensional design. This offers in-depth coverage of design principles and their underlying rationales.
[Software Design] Programming Pearls by Jon Bently :*The essays in this book present programs that go beyond solid engineering techniques to be creative and clever solutions to computer problems. The programs are fun and teach important programming tecniques and fundamental design principles.
[Software Design] Head First Design Patterns by Eric freeman :*at any given moment, someone struggles with the same software design problems you have. And, chances are, someone else has already solved your problem. This edition of Head First Design Patterns — shows you the tried-and-true, road-tested patterns used by developers to create functional, elegant, reusable, and flexible software. By the time you finish this book, you’ll be able to take advantage of the best design practices and experiences of those who have fought the beast of software design and triumphed.
[Software Design] Design Patterns: Elements of Reusable Object-Oriented Software :* Also known as Gang of Four. With Design Patterns as your guide, you will learn how these important patterns fit into the software development process, and how you can leverage them to solve your own design problems most efficiently.
[Software Design] The Design of Design by Fred Brooks :*One of the most important books ever written on software engineering practice. Author Frederick Brooks won the Turing Award for this book and for his work on IBM’s System/360 (the main example project used in the book). http://amturing.acm.org/award_winners/brooks_1002187.cfm
[Sofware Engineering] The Effective Engineer by Edmond Lau — *Not CS, more SW dev, but it is fairly new and I thought it was very good
[Scala] Programming in Scala by Martin Odersky, Lex Spoon, and Bill Venners :*Beside a good introduction into Scala, that book also teach me the principles in computer programing. It’s worth read again several times.
[Types] Type Inheritance & Relational Theory by C.J. Date :* Type inheritance is that phenomenon according to which we can say, for example, that every square is also a rectangle, and so properties that apply to rectangles in general apply to squares in particular.
[Types] Type-Driven Development with Idris by Edwin Brady :*Types are often seen as a tool for checking errors, with the programmer writing a complete program first and using the type checker to detect errors. It was a real eye-opener of what types can do.