Suggested Books

One of the major goals of dlib is to have documentation that enables someone to easily make use of its various components. Ideally, you would read a short description of something, understand it immediately, and begin using it in your application without any difficulty. Obviously, this depends partly on the background of the user. For example, if you have never written C++ software before then it probably isn't going to be this easy.

This page is meant to complement the main library documentation by providing references to books, along with my commentary, which explain most of the background material needed to understand the various parts of the library. In most cases these are the books I learned from during the process of creating dlib. As always, if you disagree with anything or think I have left out an important text then shoot me an email.

## General Programming

### C++

- Programming: Principles and Practice Using C++ by Bjarne Stroustrup
  This is the sort of book you would use in a freshman introduction-to-programming class. So if you are just beginning to study programming and are interested in C++ then I think it is probably safe to say this is one of the best books you could read.
- Accelerated C++: Practical Programming by Example by Andrew Koenig and Barbara E. Moo
  If you are new to C++ but already know how to program then this is a great book. It's also about one fourth the size of the Stroustrup book.
- Effective C++: 55 Specific Ways to Improve Your Programs and Designs (3rd Edition) by Scott Meyers
  This is a great intermediate level C++ book. Most people have heard the jokes about how easy it is to shoot yourself in the foot with C++. This book explains many things you need to know about the language to avoid doing so on a regular basis. So if you are writing C++ software then this is a must-read. I would even claim that you are a danger to the C++ software you touch unless you know what is in this book. I'm not kidding. Finally, the book isn't just about the quirks of C++. It also discusses many general software engineering ideas which have wide applicability. So in this respect it is a great book for any software developer to read.
- More Effective C++: 35 New Ways to Improve Your Programs and Designs by Scott Meyers
  Consider this an expansion to Effective C++. If you are going to read the above book then you would almost certainly benefit from reading this one as well.
- The C++ Standard Library: A Tutorial and Reference by Nicolai M. Josuttis
  If you are going to buy a reference book on the C++ standard library then this is the one to get. I think you will find it is better than any of the available online references. So if you find yourself frustrated with the online resources, then this is the book for you.
- Online C++ Standard Library Reference
  What I said aside, this is a good online reference. I often find myself referring to it when I do not have the Josuttis book on hand.

### Multithreading

- Programming with POSIX Threads by David R. Butenhof
  When I was an undergrad, this book was my main resource for learning about multithreading. It was enjoyable to read, as are all the books on this list, and covered everything in great depth without becoming overbearing. Also, despite what the title may suggest, this book is useful for understanding multithreading broadly, not just multithreading on POSIX systems.

### Network Programming

- Unix Network Programming, Volume 1: The Sockets Networking API (3rd Edition) by W. Richard Stevens
  A lot of people call this book the network programming Bible and this praise is well deserved. If you want a deep understanding of how computer networks function, including the Internet, then this is the book to read. As with the Butenhof book above, this is an excellent choice even for people who do not intend to write software for Unix systems.

### WIN32 Programming

It has been a long time since I needed to refer to these two books. However, they contained information I couldn't find elsewhere no matter how hard I looked. So I recommend them in case you need to create or understand some low level win32 code.

- Win32 Programming by Brent E. Rector and Joseph M. Newcomer
- Programming Windows by Charles Petzold
- MSDN Library
  This is Microsoft's online reference documentation. It is very large and sometimes confusing. But at the end of the day you should be able to find the documentation for just about every function in the entire Windows API.

## Computer Science: Algorithms and Data Structures

- Introduction to Algorithms by Cormen, Leiserson, Rivest and Stein
  You should get this book if you are looking for a good discussion of the classic computer science algorithms and data structures (e.g. most of the components on the containers page).
- Algorithms in C++, Parts 1-4: Fundamentals, Data Structure, Sorting, Searching (3rd Edition) by Robert Sedgewick
  This is another good algorithms book. If you are going to get only one book on this subject then get the one above. However, when I was learning about these topics I used both these books and on many occasions I found it helpful to read the description of an algorithm or data structure in both. Where one description was a little vague or confusing the other generally filled in the gaps.

## Lossless Data Compression

- Text Compression by Bell, Cleary, and Witten
  When I was studying data compression this was my most useful resource. If you are looking to understand how lossless data compression algorithms work then this is the book you want. It is completely self-contained and an absolute joy to read. Note that contrary to one of the reviews on amazon.com, the book Managing Gigabytes is not the second edition of this book; if this topic interests you then be sure you get the 318 page book published in 1990.

## General Math

- Linear Algebra Done Right by Sheldon Jay Axler
  If a matrix seems like an arbitrary grid of numbers or you find that you are confused by vectors, matrices, and the various things that get done with them then this book will change your whole view of this subject. It doesn't teach you any algorithms. Instead, it will give you a general framework in which to think about all this stuff. Once you have that down everything else will start to make a lot more sense. If all goes well you will even start to agree with the following: linear algebra is beautiful. :)
- Numerical Linear Algebra by Trefethen and Bau
  While Linear Algebra Done Right is fairly abstract, this book by Trefethen and Bau will explain some of the actual algorithms that are often used. This is a great second book if you find that you want to know more about the SVD, LU decomposition, or various other algorithms involving linear algebra.
- Calculus: Single and Multivariable by Hughes-Hallett, Gleason, and McCallum
  Some of the books below will require and understanding of basic calculus. So I'm recommending this book. It was the book I used as an undergrad and I remember it being alright. That isn't exactly a glowing review so if you are really considering buying a calculus book you may want to check out other reviews before picking this one.
- Introduction to Real Analysis (third edition) by Bartle and Sherbert
  At some level real analysis is like a really rigorous repeat of calculus. So if you already have an undergraduate education in calculus and you are reading things that seem reminiscent of calculus but involve stuff you haven't seen before (e.g. sup, inf, "sets of numbers", sequences of points) then you may be in need of a real analysis book. This one is quite good and should be accessible to someone with the usual undergraduate computer science math background.

## Optimization

The subject of linear algebra is fundamental to optimization. So you must be familiar with the contents of a book like Linear Algebra Done Right if you are going to study this area. You will also need to know how to find the derivative of a function and understand what a derivative is all about. So you will need to know a little bit of calculus. Finally, once in a while you will need to know a little bit about real analysis. Ultimately, what you need all depends on how deep you want to go.

- Practical Methods of Optimization (second edition) by R. Fletcher 1987
  I love this book. When I got it I literally spent my weekends sitting around reading it for hours. It is a fascinating and well written introduction to the subject of optimization. This has been my most valuable resource for learning the fundamentals of optimization and I cannot recommend it highly enough.
- Numerical Optimization by Jorge Nocedal and Stephen Wright 2006
  This is a more recent text on optimization that is also very good. It covers many algorithms not covered by the above book.
- Introduction to Derivative-Free Optimization by Conn, Scheinberg, and Vicente
  If you want to understand algorithms like BOBYQA then this is a good recent book on the subject. Note that a book like Practical Methods of Optimization is almost certainly a prerequisite for reading this book. As an aside, BOBYQA is not discussed in this book but its predecessor, NEWUOA is.

## Machine Learning

- Artificial Intelligence: A Modern Approach (3rd Edition) by Stuart Russell and Peter Norvig
  This book is about the much broader field of AI but it contains an excellent introduction to machine learning and it also covers other useful topics like bayesian networks. Moreover, it is very well written and self-contained. So you don't need any particular background to be able to learn from it apart from a typical undergraduate background in computer science.
- Learning with Kernels: Support Vector Machines, Regularization, Optimization, and Beyond by Bernhard Schlkopf and Alexander J. Smola
  Most of the machine learning tools in dlib are implementations of various kernel methods. So if you want a book that covers this topic in great depth as well as breadth then this is probably the book for you. The most important prerequisite for this book is linear algebra. Virtually everything in this book depends on linear algebra in a fundamental way.

  The second important subject is optimization. Whenever you see the text mention the KKT conditions, duality, "primal variables", or quadratic programming it is talking about ideas from optimization. A good book which will explain all this to you is Practical Methods of Optimization. Note that this book calls the KKT conditions just the "KT" conditions. It is talking about the same thing. Also, duality is something that comes up a lot in optimization but in the context of machine learning usually people are talking about a particular form known as the Wolfe Dual.

  It would also be good (but maybe not critical depending on which parts you want to read) to be familiar with real analysis.
- Kernel Methods for Pattern Analysis by John Shawe-Taylor and Nello Cristianini
  This is another good book about kernel methods. If you have to choose between this book and Learning with Kernels I would go with Learning with Kernels. However, it is good to have both since reading different presentations of difficult subjects usually makes learning them easier.
- Structured Prediction and Learning in Computer Vision by Sebastian Nowozin and Christoph H. Lampert 2011
  If you are looking for a book discussing the background material necessary for understanding things like the Structural SVM tools in dlib then this is a good book. It is also available online in PDF form.

## Image Processing

- Digital Image Processing by Rafael C. Gonzalez and Richard E. Woods
  This is a terrific introduction to digital image processing. By and large this book doesn't require any special prerequisites. Sometimes calculus shows up, but not too much.