You are on page 1of 10

Algorithms

Algorithms by S. Dasgupta & C. H. Papadimitriou & U. V. Vazirani


This is a good book on algorithms. It may not be a very big book but it does exp
lain some rather important things. It also shows just how having a good grasp of
math will help improve the quality of your code. At the very end, it has a nice
introduction on quantum algorithms.
Algorithms, 4th ed. by Robert Sedgewick & Kevin Wayne
This is a renowned book that will teach you how to use some of the best algorith
ms and data structures no matter what sort of software you're working on. It eve
n has a chapter that highlights how everything connects to certain application a
reas.
Algorithms and Data Structures, Oberon version by N. Wirth
This is a classic written by the creator of the Pascal language. Although it doe
s contain introductory material, a reasonable understanding of computers will ma
ke your life easier. This book teaches some nice algorithms and how to build goo
d abstractions but it doesn't seem to me like the author is very experienced at
writing books, which is why it's not particularly easy to read.
This book exists in 4 versions. The first one is called "Algorithms + Data Struc
tures Programs," followed by "Algorithms and Data Structures," "Algorithms & Dat
a Structures," and finally "Algorithms and Data Structures (Oberon version)," wh
ich has been updated in 2004. The latter is what I link to.
Introduction to Algorithms, 3rd ed. by Thomas H. Cormen & Charles E. Leiserson &
Ronald L. Rivest & Clifford Stein
This
and
rgue
w it

very popular textbook covers not just the fundamentals in modern algorithms
data structures but also makes the leap for multithreading. However, some a
that in some places the material is presented without the explanation of ho
actually works. That should be an exercise for the reader IMNSHO.

Programming Pearls, 2nd ed. by Jon Bentley


This book is composed of a collection of the author's own essays that help begin
ners nail down all the quirks when they start writing more complex algorithms the emphasis is on the D&C paradigm. It's a very good book.
The Art of Computer Programming, vol. 1 & 2 @ 3rd ed. & vol. 1 fasc. 1 & vol. 3
@ 2nd ed. & vol. 4A by Donald E. Knuth
The is simply the book on sequential algorithms, no one can argue with that. In
fact, at the end of 1999, this series was named among the best twelve physical-s
cience monographs of the century by American Scientist. Better keep these volume
s close and read what you need, when you need it.
The Art of Multiprocessor Programming by Maurice Herlihy & Nir Shavit
Compiler theory

Compilers: Principles, Techniques, & Tools, 2nd ed. by Alfred V. Aho & Monica S.
Lam & Ravi Sethi & Jeffrey D. Ullman
A.K.A. the Dragon Book, this is the greatest introduction to compiler theory, ev
en though it is missing a few things such as SSA representation.
Linkers and Loaders by John R. Levine
If you've built your own compiler why not go all the way? To be honest, you shou
ld probably understand the theory behind linkers and loaders by now, but if you
don't or just want to make sure you're an expert, read this book.
Modern Compiler Implementation in Java by Andrew W. Appel, 2nd ed.
This will tell you everything you need in order to build a modern optimizing com
piler. Appel's name should say enough. Note that there is no C version for the s
econd edition.
Hardware
Computer Architecture: A Quantitative Approach by John L. Hennessy & David A. Pa
tterson, 4th ed.
Most people think they know what they are doing when they are in fact clueless.
The worst part is that they are clueless of how clueless they are. You are most
likely one of them. Before doing systems programming you need to read this book;
you will see that computers are not just a bunch of CPUs, buses and peripherals
... There's also an undergraduate version of this book but who cares?
:!: Don't forget to read the extra appendices on the accompanying CD.
The Grid: Blueprint for a New Computing Infrastructure, 2nd ed. by Ian Foster &
Carl Kesselman
Describes a type of distributed computing that is sometimes overlooked by many p
eople around here.
General
The Indispensable PC Hardware Book by Hans-Peter Messmer, 4th ed.
This should be your hardware programming Bible when dealing with PCs. It covers
almost everything an OS should have support for including PCI, AGP and USB. When
you are done implementing drivers for everything in this book you will surely h
ave more than just a hobby OS.
The Undocumented PC by Frank van Gilluwe, 2nd ed.
This book covers all of the material that most of the people strive to understan
d when starting OS development for PCs. Apart from that, it talks at length abou
t a couple Cyrix CPUs - most people forget that Intel and AMD aren't the only x8
6 vendors. As a bonus, this book gives insight on some undocumented hardware fea
tures (hence, the title).
Graphics
Graphics Programming Black Book by Michael Abrash, special ed.
This was once the holy grail of x86 assembly optimizations and VGA graphics prog

ramming. It's still an awesome resource even though the material is ageing daily
(it's still relevant to the hardware in question, though). It contains material
from 3 of his previous books, namely Zen of Assembly Code Optimization, Zen of
Graphics Programming (2nd ed.), and Zen of Assembly Language, together with nume
rous articles that he has written over the years (some - if not all - printed in
the DDJ columns). At the end, he details his experiences in the making of Quake
. I strongly recommend that you read it.
Programmer's Guide to the EGA, VGA, and Super VGA Cards by Richard F. Ferraro, 3
rd ed.
Ferraro's books were very well received back in the days when they were publishe
d. This huge tree log of a book contains possibly all the details you will ever
need on programming graphics cards like the ones mentioned in the book's title.
It also includes some additional information about things like sound processing.
The OpenGL Programming Guide: The Official Guide to Learning OpenGL Version 3.0
and 3.1, 7th ed. by Dave Shreiner
The OpenGL Reference Manual: The Official Reference Document to OpenGL, Version
1.4, 4th ed. by Dave Shreiner
The OpenGL Shading Language, 3rd ed. by Randi J. Rost & Bill Licea-Kane
The OpenGL ES 2.0 Programming Guide by Aaftab Munshi & Dan Ginsburg & Dave Shrei
ner
Not everyone is interested in hardcore graphics, some program for embedded devic
es. In this case, OpenGL ES is obviously the way to go.
Languages
Assembly
ARM Assembly Language: Fundamentals and Techniques by William Hohl
It seems like the embedded marked has simply exploded (not that it's a surprise
or anything) and as a result, more and more people write ARM code. This book sho
uld cover everything you need; it is the best one you can find at the present ti
me.
MIPS
MIPS RISC Architecture by Gerry Kane, 2nd ed.
This is the classic textbook on RISC CPUs and MIPS. It's a superb book and you s
hould definitely read it as everything is beautifully described in a comprehensi
ble yet detailed manner.
See MIPS Run by Dominic Sweetman, 2nd ed.
As an extension to the book above, this one covers some more modern MIPS CPU mod
els. If you're going to write code for such processors this should be your next
read.
x86
Assembly Language Step by Step: Programming with Linux by Jeff Duntemann, 3rd ed
.
This book offers the best introduction to assembly language I have read so far;

except for that it has pretty good coverage on handling strings. In fact, it was
written for people who have never programmed before. I am frequently asked abou
t this book by people just starting out with x86 assembly. Alas, over half of th
is book is sort of meaningless: a couple of chapters were probably taken from a
story book (failed attempts at metaphors) and many others teach you how to be a
Linux user (how to install and use certain programs) - I'm pretty sure people wh
o want to learn assembly language have used computers before. If they haven't, t
hey can surely consult the free documentation for the software they use and not
spend money on this book.
Mastering Turbo Assembler, 2nd ed. by Tom Swan
TASM's popularity decreased significantly ever since it stopped being a stand-al
one product. However, in addition to its less-than-Ideal syntax, it also provide
s compatibility for MASM source code and adds language support for OOP, which is
a big advantage. This is probably the only reason for which TASM is worth looki
ng into, in my opinion.
Optimization manuals by By Agner Fog
Once you become a guru, be sure to check Agner's stuff, he's well-know for his c
utting-edge optimizations. His focus is on Intel, AMD and VIA CPUs alike.
PC Assembly Language by Paul A. Carter
This is more of an assembly tutorial than an actual book. Its C examples are not
particularly good, but it does provide a few interesting assembly tricks - howe
ver, they seem to be based more on the author's own intuition rather than solid
knowledge. It even covers the FPU stack to some extent, but is lacking the more
modern usage of it.
Programming from the Ground Up by Jonathan Bartlett, ver. 1.0
This too is a book for learning x86 assembly as your first programming language.
It explains how interoperability with higher-level languages works and deals wi
th more "fun" topics (e.g., working with files and GUI programming). However, it
doesn't go beyond a certain level.
Professional Assembly Language by Richard Blum
This book seems to have gained some popularity as of late so I thought I'd revie
w it: it's really nice... even though it too uses AT&T syntax. It's the only boo
k that I know to also cover more advanced topics such as MMX, SSE, SSE2 (SSE3 in
structions are also presented but not discussed at length) and even Hyperthreadi
ng.
The Art of Assembly Language, DOS 16 Bit ed.
This is probably the best text on x86 assembly ever written. People tend to skip
the chapters they think they already know but that's not recommended. The first
three chapters will help you more than you think, for instance. One slightly an
noying issue with this book is that it jumps right in the middle of everything,
or so it seems at first. Everything will come together a bit later on, it's okay
to be confused for a little while. Some of the examples are a bit boring, too.
:!: The first edition comes in 3 editions (32 Bit Windows, 32 Bit Linux, 16 Bit
DOS) and the second edition comes in only one that covers only Windows and Linux
(and it's not even free). There is a catch, however: the 32-bit versions of the
book use HLA (High Level Assembly, a language invented by the author), which is
not mainstream. Don't be disillusioned though, the simplicity of DOS is an adva

ntage for you can focus your effort on learning x86 assembly rather than waste t
ime with bloated APIs - you won't even touch anything DOS-specific until the las
t chapters and when you do, you will learn about some privileged instructions th
at you don't get to use in the other OSes. Moreover, 32-bit instructions and reg
isters are also covered.
:!: The HTML version of the book doesn't contain any of the footnotes so I recom
mend reading it in PDF format.
The Waite Group's Microsoft Macro Assembler Bible, 2nd ed. by Randall Hyde & Nab
ajyoti Barkakati
The ultimate MASM reference manual.
C
C: A Reference Manual by Samuel P. Harbison III & Guy L. Steele Jr., 5th ed.
A.K.A. C:ARM, this book is on par with K&R and is the ultimate reference manual
on the C programming language (dialects: traditional C, C89, C99 and clean C). I
n other words, it's the C standard (or several versions of it) written in a much
more friendly manner. Better keep this close when doing serious C coding!
:arrow: Errata available here and here.
The C Programming language by Brian W. Kernighan and Dennis M. Ritchie, 2nd ed.
A.K.A. K&R; no comments should be needed. Unfortunately, it's an old book focusi
ng on C89 when C1X is just around the corner, yet it's still the absolute best o
ne around: a short (but good) description for a small language. It even touches
subjects such as trees, recursivity, parsing and even implementing your own stan
dard library. At the end, there's a handy language reference. Most beginners don
't like the idea of reading such an old book as they know this is a rapidly evol
ving field. The fact is that good programming will always be good.
:arrow: Errata available here.
C++
Accelerated C++ by by Andrew Koenig & Barbara E. Moo
Good book for learning C++, a lot of people are fond of it.
:arrow: Errata available here.
The Annotated C++ Reference Manual by Margaret A. Ellis & Bjarne Stroustrup
A.K.A. C++ARM, this was once considered the best book on C++ ever written and wa
s heavily used even by compiler writers. It's very dated today but you should re
ad it anyway; just keep in mind that the language has evolved a lot since the ti
me of the book's writing. Unfortunately, Bjarne doesn't think he will ever have
the time to work on a new edition.
The C++ Programming Language by Bjarne Stroustrup, special ed.
This book was written by Bjarne Stroustrup, the creator of C++. You should proba
bly read this book often if you want to learn/know C++ (this book can be easily
consulted as a reference). In it, he puts great emphasis on portability and good
coding practices. He also argues that it is easier to go from C++ to C than the
other way around.

:arrow: Errata available here.


Thinking in C++ by Bruce Eckel, 2nd ed.
This is a very popular book on C++ that presents the proper C++ mindset by follo
wing just a few simple rules laid out by the author (who, like Bjarne, is a memb
er of the C++ standards committee).
:!: Not all the download mirrors contain the latest edition of the book (althoug
h the links provided here are fine).
:arrow: Available for download: vol. 1 and vol. 2.
Web programming
JavaScript: The Definitive Guide, 6th ed. by David Flanagan
Usually used for client-side programming, which is why I included it under this
category, JavaScript is a powerful language that can prove extremely useful in m
any situations outside its original purpose. This is the authoritative guide to
learning the language.
PHP Manual by the PHP Documentation Group
Chances are that if you're going to use PHP for server-side programming, you'll
misuse it because you've been indoctrinated by the world at large. If you're goi
ng to do so, at least misuse it with high-quality code. If you're going to use i
t properly (i.e., in order to generate pages which should indeed be dynamically
generated) then cuddles to you.
:arrow: Available for download.
The C# Programming Language by Andres Hejlsberg & Mads Torgersen & Scott Wiltamu
th & Peter Golde, 4th ed.
You won't hear me talking about Java much (since I hate it with a passion) and I
don't much like .NET either - luckly this book doesn't talk about it. A lot of
people don't understand that .NET is god damned framework that can be used separ
ately from C#. However, C# is really something. The book starts off with a quick
description of the language after which an annotated reference follows.
The Java Programming Language by Ken Arnold & James Gosling & David Holmes, 4th
ed.
Apart from a few design flaws, I hate Java so much because C# is a lot better an
d I have a choice. You may not. Java is a good language, after all, it's a very
high-level language that uses garbage collection and thus makes the programmer's
life a whole lot easier. The easier the language, the less bugs.
Smalltalk
Smalltalk-80: Bits of History, Words of Adivce by Glen Krasner
:arrow: Available for download.
Smalltalk-80: The Language and its Implementation by Adele Goldberg & David Robs
on
:arrow: Available for download.

Smalltalk-80: The Interactive Programming Environment by Adele Goldberg


:arrow: Available for download.
Smalltalk-80: The Language by Adele Goldberg & David Robson
An updated language description (it was published after the blue book), without
implementation details.
XML Bible by Elliotte Rusty Harold, Gold ed.
Not that XML is complicated in any way but everything has quirks of some nature.
This is your aid.
:arrow: Errata available here.
Miscellaneous
Code Complete by Steve McConnell, 2nd ed.
Look over this one when you're on a train or something. Software practices, shou
ld be an easy read. However, do not underestimate its importance. Programming is
n't all about coding - it's about designing as good as possible for the requirem
ents at hand, implementing using good practices and skill and finally, testing.
:arrow: Additional resources and updates available online.
Learning the vi and Vim Editors, 7th ed. by Arnold Robbins & Elbert Hannah & Lin
da Lamb
There are probably no better editors than Vim
editor and Vim is its successor (yes, it can
oth are covered in this book. A lot of people
od editors/IDEs but have no idea how flexible

and Emacs. vi is the standard UNIX


be integrated with a debugger) - b
today think that they are using go
one can actually be.

:arrow: Errata available online here and here (the latter link is for still unco
nfirmed errors).
The Art of Unix Programming by Eric Steven Raymond, rev. 1.0
The UNIX great is a big part of our past and hopefully not a very big part of ou
r distant future. This is a fun read because the author is opinionated (you are
free to disagree with him, of course). The interesting stuff in this book are th
e several case studies presented.
:arrow: Available online.
The Chicago Manual of Style by the University of Chicago Press, 16th ed.
Perhaps this is not the right place for this book, perhaps it is. If you're a do
cumentation freak like me, you might want to follow what has been established as
the de facto standard in how to put together technical documentation. Don't be
like the Linux douchebags, people should not read your source code in order to u
nderstand how it works.
:arrow: Free 30-day trial available online.
The Mythical Man Month by Frederick P. Brooks, Jr.

This book is more related to OS development than you might think. It just goes t
o show how people usually think they will be done much faster than they will and
how working in teams is a very subtle problem. This book is critically acclaime
d.
Operating systems
General
Distributed Systems: Principles and Paradigms by Andrew S. Tanenbaum & Maarten v
an Steen, 2nd ed.
:arrow: Errata available online.
MMURTL V1.0 by Richard A. Burgess
This book gives me the impression that it was written by someone with not much p
rior experience in systems programming. As noted by someone earlier on this post
, it looks to me like the author got excited about writing his first OS so he pu
t a book together. Nonetheless, it's a lot better than following a tutorial.
:arrow: Available for download.
Modern Operating Systems by Andrew S. Tanenbaum, 3rd ed.
MOS was was written by Andrew Tanenbaum, who has also co-authored Operating Syst
ems: Design and Implementation, which describes the implementation of MINIX (loo
k for the 3rd ed. if you must) - his books are very popular and his name is well
-known in the academia. The reason for which I'm recommeding former book over th
e latter is that it contains more theory and is more up-to-date. Some of the mat
erial in the other book was stripped down in order to make room for the MINIX so
urce code listing. Learn programming from other books!
Operating System Concepts (with Java) by Avi Silberschatz & Peter Baer Galvin &
Greg Gagne, 8th ed.
There are three versions of this book but only two of them are relevant to us: o
ne targeted at C and the other at Java. There are some minor differences between
the two (other than the code snippets). For instance, the C one can more accura
tely reflect topics such as shared memory as Java really has no equivalent. On t
he other hand, the Java edition covers stuff such as Java thread scheduling and
process synchronization. This texbook and MOS are the most used in universities
at the moment.
:arrow: Errata available online for both C and Java.
Project Oberon by Niklaus Wirth & Jrg Gutknecht
This book presents building a non-toy multi-server OS and compiler to go with it
. Even though unconventional, the material presented in this book is in no way l
egacy.
:arrow: Available for download.
Specialized
Practical File System Design with the Be File System by Dominic Giampaolo
Rumours have it that this is the best book on the subject and there certainly ar
en't many around. It describes the design and implementation of BeFS but a lot o

f the information is universal across file systems.


:arrow: Available for download.
Task-Centered User Interface Design: A Practical Introduction by Clayton Lewis &
John Rieman
More often than not, user interfaces suck badly. Add that to lack of documentati
on and you one big mess. Fortunately, there's a free book that talks at length a
bout designing efficient user interfaces that the human mind will easily compreh
end.
:arrow: Available for download.
TCP/IP Illustrated, vol. 1--3 by W. Richard Stevens
This is the absolute best book for learning about the subtle TCP/IP stack: not o
nly detailed descriptions but also the protocols shown in action.
:arrow: Errata available here, here and here.
Paradigms
Flow-Based Programming by J. Paul Morrison, 2nd ed.
:arrow: First edition available for download.
Structure and Interpretation of Computer Programs by Harold Abelson & Gerald Jay
Sussman & Julie Sussman, 2nd ed.
Awesome, and only a bit dated, this will give useful insight on both functional
languages and programming concepts.
:arrow: Available for download.
POSIX
Advanced Programming in the UNIX Environment by W. Richard Stevens & Stephen A.
Rago, 2nd ed.
This is probably the greatest book on the unfortunate subject of programming und
er UNIX.
:arrow: Extra chapter available here.
:arrow: Errata available here.
The UNIX Programming Environment by Brian W. Kernighan and Rob Pike
This classic is certainly dated. Unlike the other programming books on this list
, this one doesn't only focus on programming in but rather on brigning everythin
g together - build systems, several tools, etc. Obviously, we're talking UNIX he
re.
:arrow: Errata available here.
UNIX Network Programming by W. Richard Stevens & Bill Fenner & Andy Rudoff, vol.
1 @ 3rd ed. & vol. 3 @ 2nd ed.
UNIX socket programming is described at length in this great book.

:arrow: Errata available online for both vol. 1 and vol. 2.

You might also like