Kernel (de) Kernel (it) Books Shell Sed/awk RAM/swap P35

Books on programming, software design, C++, and project management

Here is a list of books about programming in C++, software design in general, and (software) project management. I own all of them. There are many books available - some are very good while others cannot be recommended at all. So I try to give a short overview whether a particular book might be of interest to you. I provide this list 'as is' without warranty of any kind. Please note that the comments reflect my own personal opinion only! The latest version of this document can always be found at http://www.thomashertweck.de/cpp.html.

General C++

The C++ Programming Language, Bjarne Stroustrup, Addison-Wesley: This book is written by the creator of C++, Bjarne Stroustrup. It describes all elements of the C++ programming language in a clear way and is a "must have" for any serious C++ programmer. Every language feature is explained with illustrative code snippets. While it might be a little bit too complicated for beginners, i.e. to learn programming from scratch with C++, it is a very good reference book. Highly recommended.
C++ ent-packt, Herbert Schildt, mitp: A similar bool to the above-mentioned C++ Programming language, this time in German. It starts with an introduction to C and is in general not as complicated as Bjarne's book, i.e. it is also suitable to learn the C++ language from scratch (beginners). It has quite a lot of examples and also serves as a reference book. If you already own Bjarne's book and you are happy with it, then presumably there is no need to buy this one.
Thinking in C++: Introduction to Standard C++ (Vol 1), Practical Programming (Vol 2), Bruce Eckel, Prentice Hall: A great collection of books, in particular useful for new programmers to C++ coming from a C background. It comes with lots of simple, easy to understand code examples and excercices. Bruce Eckel has a very good writing style as well as a fine grasp of C++, compilers, and language issues in general. The second volume focuses on practical C++ beyond the introductory level, including STL, design patterns, etc. The two books can also be downloaded in electronic format for free from Bruce Eckel's mindview website (download). This is particularly useful to get an impression of the books - if you like them, consider buying them.
Accelerated C++, Andrew Koenig, Barbara E. Moo, Addison-Wesley: This is a great book for beginners and newbies to C++. Unlike other books on C++ that start with an introduction to the C programming language, this book starts with C++ language features (such as STL, class design, etc.) from the very beginning. It really does what it says on the cover: programming by example. This book is a unique attempt to teach C++ without teaching C first, based on practical experiences of the authors with their summer C++ course at Stanford University. Highly recommended for C++ beginners without previous C knowledge.

C++ Standard (Template) Library

The C++ Standard Library, Nicolai M. Josuttis, Addison-Wesley: In a nutshell, the best book about the Standard Library on the market. It explains all containers and the generic algorithms in detail, along with numerous examples in understandable code. It also explains common pitfalls, the quirks and peculiarities, and the limitations of the STL. While it is a great reference, it is also a good read from front to end. You need at least some knowledge of C++ before reading this book. A German translation is available, but reading the English version should be preferred. Highly recommended. The latest edition also covers the C++11 updates.
C++ Concurrency in Action, Anthony Williams, Manning: This book describes the new C++ standard threading library that comes along with C++11. It certainly assumes a fairly good understanding of C++, i.e. it shouldn't be your first book to read on C++. The book is well written but sometimes maybe a bit short on explanations/examples, i.e. it feels more like a reference than a tutorial. You should note that this book doesn't provide a general introduction to C++11 although it uses other new features that come along with the new C++ standard.
Beyond the C++ Standard Library: An Introduction to Boost, Björn Karlsson, Addison-Wesley: The Boost libraries provide functionality that you might miss in the standard C++ Library. Some of them are proving so useful that they are planned for inclusion in the next version of the C++ standard. This book outlines all available Boost libraries in 2005 and explains 12 of them in great detail. The topics range from smart pointers and type conversions to containers and data structures. Obviously, this book is only recommended for advanced C++ programmers.
Effective STL: 50 Specific Ways to Improve the Use of the Standard Template Library, Scott Meyers, Addison-Wesley: Scott Meyers is a well known C++ expert. This book teaches techniques which allow you to make best use of the STL. The book is organised into 50 tips that explore different areas of the STL. Scott gives a lot of recommendations what to do and what to avoid. Each tip is accompanied by in-depth coding samples. This book is only recommended for intermediate and advanced C++ programmers - if you are one, then this book should not be missing on your desk. Highly recommended.

Special C++ topics and software design

C++ Coding Standards, Herb Sutter, Andrei Alexandrescu, Addison-Wesley: People have different opinions about coding standards. However, even if you are working alone, certain standards improve the software quality, reduce errors, and simplify maintenance. Of course, certain things are just not worth standardizing. This book focuses on important topics and descibes each introduced standard concisely and with practical examples. People working in programming departments should certainly have a look at this book.
Imperfect C++: Practical Solutions for Real-Life Programming, Matthew Wilson, Addison-Wesley: C++ is certainly not a perfect language. This book covers some of the imperfections and language limitations and shows workable compromises or workarounds. It is a good source of C++ information and a practical guide to taming C++. However, I am not sure whether I would use all of the techniques shown in this book. This book can only be recommended to the intermediate and advanced programmer who might already have experienced some of the C++ imperfections.
Large-Scale C++ Software Design, John Lakos, Addison-Wesley: Although the book title mentions C++, it is not a book about the C++ language itself. Most ideas presented in this book apply to any (object-oriented) programming language. This book might be a tough read. However, everybody involved in large-scale software development projects should have a look at it. John explains the process of decomposing large systems into physical and logical components and how to design them. We all know that design is an important aspect in writing stable, reusable C++ software.
Design Patterns: Elements of Reusable Object-Oriented Software, Erich Gamma, Richard Helm, Ralph E. Johnson, John Vlissides, Addison-Wesley: Although quite old, this book is still the standard reference on design patterns. It is sometimes also called GoF, Gang of Four. This book contains lots of useful information about object-orientation and design but it is also a tough read and requires deep concentration, in particular in the second half. This book has examples in C++ and Smalltalk but the patterns do not depend on a particular language.
Head First Design Patterns, Eric Freeman, Elisabeth Robson, Bert Bates, Kathy Sierra, O'Reilly: Another book on design patterns. Probably easier to read than above mentioned GoF book, but you have to get used to the style in which this book is written - it's probably not for everybody. I would recommend borrowing this book first to make up your own mind. In general, an interesting book on a difficult and relatively dry subject. Examples are based on Java but this shouldn't cause any problems, even if you aren't well versed in Java.
C++, UML und Design Patterns, Helmut Herold, Michael Klar, Susanne Klar, Addison-Wesley: A book that might serve new and advanced programmers equally well which could be its strength but also its weakness. It explains the relation of software engineering and object-oriented programming, UML and design patterns. The book starts fairly easy but becomes more complicated when it presents complex object-oriented features. It suffers a bit from the attempt to address such a broad audience. Nevertheless, I learned quite a lot (I haven't had any UML experience)!
Modern C++ Design: Applied Generic and Design Patterns, Andrei Alexandrescu, Addison-Wesley: This book should only be read by experienced programmers familiar with templates and STL. You should also be somewhat familiar with the GoF. It is a tough read and sometimes hardcore C++ code is presented. The book demonstrates pattern templates as a powerful concept, so it could also be in my "C++ Templates" category. The book is useful for those who want to learn modern library writing techniques or are interested in details of template programming. Others might find it too freaky.
API design for C++, Martin Reddy, Morgan Kaufmann: This book concentraces on the Application Programming Interface, or API, for code developed in C++. Experienced developers will probably know most topics presented in this book. However, if you are involved in writing libraries that need to be used by others, this book is worth a try. You won't learn C++ from this book but it might help you improving the design of your code. A good API is worth much!

C++ templates

C++ Templates: The Complete Guide, David Vandervoorde, Nicolai M. Josuttis, Addison-Wesley: Again, a book that is not suitable for beginners and even advanced C++ users might have problems. You need a solid understanding of C++, then you can make the best out of this book. While "Modern C++ Design" deals with the practice of implementing a template library, this book explains the theoretical aspects in great detail. If you are looking for a solid, general grounding in everything templates can do then this book is exactly what you should read.
C++ Template Metaprogramming, David Abrahams, Aleksey Gurtovoy, Addison-Wesley: The first part of the book covers the basics of template metaprogramming. It is a good introduction to this technique. The second part, however, does not go into more theoretical details that help to understand the topic but explains more or less the API of the Boost metaprogramming library. I think this book will be of interest to intermediate and advanced C++ programmers interested in library development. I would not recommend it to other audiences.

FAQs, programming puzzles and tips

Effective C++: 55 Specific Ways to Improve Your Programs and Designs and More Effective C++: 35 New Ways to Improve Your Programs and Designs, Scott Meyers, Addison-Wesley: Scott is a C++ expert and it is a pleasure to read his books. The two books present various aspects and intricacies of the C++ language. You need to know at least the basics of C++ before reading these books. The information given in this book is very valuable and practical, the organisation of the books is great. They have solid examples that show exactly why Scott recommends certain ways of programming and software design. Highly recommended.
Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions and More Exceptional C++: 40 New Engineering Puzzles, Programming Problems, and Solutions, Herb Sutter, Addison-Wesley: Those two books are similar to Scott Meyer's books mentioned above. The books are organized in question and answer form, so you can find the answers for yourself if you want (and if you have the time and knowlegde to do so). The books contain excellent analyses and detailed information and are targeted to the experienced C++ programmers. They can certainly bring you to the next level of C++. Highly recommended.
C++ FAQs, Marshall Cline, Greg Lomow, Mike Girou, Addison-Wesley: A great book for all levels, from beginner to expert. This book is organized in chapters that cover different C++ topics. Each chapter consists of numerous FAQs that are answered in great detail. The authors are moderators of comp.lang.c++, thus this book really covers practical programming challenges you face every day. I would not recommend learning C++ off of this book but it certainly helps to deepen your understanding of this language. Highly recommended.
How Not to Program in C++: 111 Broken Programs and 3 Working Ones, or Why Does 2+2=5986?, Steve Oualline, No Starch Press: This book has some funny C++ puzzles which are based on real-world errors. They might be challenging for beginners or intermediate C++ programmers but should (hopefully) not cause a headache for professional programmers. The book consists mainly of source code and humorous tales and comments. It should not be taken too seriously, but in particular beginners might have some fun. However, don't expect too much when buying this book.
97 Things Every Programmer Should Know, Kevlin Henney, O'Reilly: One of those books that you find either quite interesting, or quite boring because you have seen and heard most of its content already. I must admit, I probably belong to the latter category. The book contains 97 stories, each story just two pages long. These stories are written by various different people who try to give some advice on certain aspects of software development, based on their own knowledge and experience.

C++ and numerics

Numerical Recipes in C++: The Art of Scientific Computing, William H. Press, Saul A. Teukolsky, William T. Vettering, Brian P. Flannery, Cambridge University Press: I think the Numerical Recipes books (C, F77, F90) are very well known. This is now the C++ version. The strength of this book is certainly not the code itself (most of the time you can easily find much better code on the internet) but the explanations of the numerical algorithms. It is a good way to get an overview of numerical methods. Be aware that you cannot simply execute the source code shown in this book.
C++ and Object-Oriented Numeric Computing for Scientists and Engineers, Daoqi Yang, Springer: The title of this book suggests that it is about numeric computing. However, in fact most of it is just an introduction to C and C++, unfortunately more C than C++ in the beginning. Therefore, this book might better be listed in my "General C++" category. I would only recommend it for beginners with a scientific background, for instance students who have to learn programming at the university. Intermediate or advanced C++ programmers or people really interested in numeric computations will not benefit from this book.

Pocket references

C++ Pocket Reference, Kyle Loudon, O'Reilly: This book is designed for people who (occasionlly) program in C++ and need a syntax reminder. It is certainly not a tutorial and it does not provide detailed instructions on the subject. However, it is great for a one paragraph explanation on a particular topic. If you need a reference book that you can easily carry with you on the way to university, here it is.
STL Pocket Reference, Ray Lischner, O'Reilly: This pocket reference deals with the STL and helps to quickly look up how to code something that you don't do every day. Like all of these books, this book is a hybrid of introduction, cookbook, and reference in one package. It usually has not many code examples, strictly speaking it is an aid to memory. Together with the "C++ Pocket Reference", it might do a good job when you sit in the class room at university.
Bash Pocket Reference, Arnold Robbins, O'Reilly: A simple pocket reference for those of you writing scripts using the Bourne-again shell (bash). It is a concise little book not meant to teach you all about bash (there are better books out there doing so) but a quick guide to the bash syntax and its built-in commands. If you know everything about arrays in bash and you are able to write complex shell scripts in no time without even looking at the bash man page, then you probably don't need this book.
C/C++ ge-packt, Herbert Schildt, mitp: This book could be considered as a combination of the previous two books, O'Reilly's pocket references. It is a handy book that fits easily in your bag or even pocket. It covers the C and C++ basics, library functions, and all containers of the STL. It includes information on the C99 standard. The main drawback of this book is its bad index which makes it difficult to use as a real reference for quick lookups. Otherwise, it is fine.

Software Projects & Management

Ship it: A Practical Guide to Successful Software Projects, Jared R. Richardson, William A. Gwaltney, Pragmatic Programmers: This book is about running successful software projects. If you have ever worked on a difficult software project on death march, you know what it feels like. There is not much material that is truly new in this book, but it is a rare book that speaks convincingly to both developers and managers and summarizes possible solutions (e.g. continuous integration, automated testing, lightweight planning) to ship your software in time. Recommended for both developers and managers.
Joel on Software: And on Diverse and Occasionally Related Matters That Will Prove of Interest to Software Developers, Designers, and Managers, and to Those ... or Ill-Luck, Work with Them in Some Capacity, Joel Spolsky, Apress: If you deal with software development, either as a programmer or manager, you should (have to?) read this book. Full stop. It covers every conceivable aspect of software development, from the best way to write code, to the best way to design an office in which to write code! If you are in the software development business, you probably already know Joel from his blog and website. This book is a nice distillation of all his early online documents. If you know all of these documents, there's maybe no need to buy this book. Otherwise, go and get the book!
Code Craft: The Practice Of Writing Excellent Code, Pete Goodliffe, No Starch Press: You probably know how to write code that works. This book is about code that is well written and easy to understand. The book covers code writing concerns, including code presentation style, variable naming, error handling, security, and the wider issues of programming in the real world, such as good teamwork, development processes, and documentation. In some sense, it's similar to Joel's book mentioned above. It's easy to read and comes with a subtle, gentle humour. The author comes from a C language background and uses C for his examples but the point being made can always be generalized to other programming languages. Some people might say that this book covers common programming knowledge. That's only partially true - it's certainly a good summary of things programmers and managers should know, therefore I highly recommend it.
brilliant project management: what the best project managers know, say and do, Stephen Barker and Rob Cole, Pearson Prentice Hall: This book isn't about software projects but about project management in general. It covers the core project management skills (planning, dealing with risks, delivering, handling resources) and people-related skills (providing leadership, running meetings, etc). It's all about practical advice (not just theoretical explanations) and there a loads of useful check lists and tips. It's certainly one of the better project management books I've come across!
The Rules of Management, Richard Templar, Pearson Prentice Hall: I think everybody knows that management isn't easy and it's certainly not rocket science. This book shows 100 rules (guidelines) that should help you in your role as (project) manager: manging projects, managing people, but also managing yourself. The rules are for the most part very obvious and things that most people who are natural leaders will know anyway, still it is good as an occasional reminder to make you think through these things properly. People new to the management role should have a closer look.
Assertiveness at work, Ken Back, Kate Back, Mcgraw-Hill Professional: Communication is the key in our modern work life. If you need to manage other people, you know the problem that on the one hand you don't want to come across as aggressive or threatening but on the other hand you also don't want to be submissive. There's a thin line in between and it isn't easy to get right under all possible circumstances. This book can help you finding your way in being assertive to benefit both yourself and your organisation.

GPU programming

CUDA By Example: An Introduction to General-Purpose GPU Programming, Jason Sanders, Edward Kandrot, Addison-Wesley: This book does exactly what it says on the tin. It's a good introduction to parallel programming and CUDA. If you are arealdy familiar with this topic, then the extensive CUDA documentation from NVIDIA will probably be more than enough. If you are new to CUDA then this book is probably a good start.
Programming Massively Parallel Processors: A Hands-On Approach, David B. Kirk, Wen-Mei W. Hwu, Morgan Kaufmann: Another introduction to the world of parallel computing using many-core systems like GPUs. The thumbnail shows the second edition of the book, I own the first edition. I would probably not recommend learning CUDA solely from this book, but in combination with other books and the NVIDIA manuals it's a solid start. If you already know about CUDA and you are familiar with programming models for many-core systems then you should most likely skip this book.

Miscellaneous

The C Programming Language, Brian W. Kernighan, Dennis Ritchie, Prentice Hall: I think there is no need to provide any details on this book. It is the best and standard reference for the C programming language. It gives a complete picture of the C language. This is a technical book that focuses on the language itself - so if you are a novice, it might be a bit hard to read (no explanations on how to use compilers etc.). However, it is certainly worth its money. Highly recommended.
Why Programs Fail: A Guide to Systematic Debugging, Andreas Zeller, dpunkt: Andreas is the creator of the Data Display Debugger (ddd) and has lots of experience in debugging programs. This book attempts to provide a systematic approach to finding, reproducing, and fixing programming errors, with a strong focus on the automation of many debugging techniques. Many interesting (and practical) ideas are explored. If you would like to improve your detective skills, this book is for you.
The Definite Guide to SQLite, Michael Owens, Apress: SQLite is an open source embeddable SQL database with a very small footprint. It's a great solution when you don't need a client/server SQL database. The book serves as an introduction to relational models and the SQL language in general, and the capabilities and APIs of SQLite, in particular the C/C++ interface. If you would like to work with SQLite, then this book is your perfect companion.
Pragmatic Guide to Subversion, Mike Mason, Pragmatic Programmers: This book is relatively short. If you need an introduction to subversion and some practical advice, then this book might be for you (although the svn manual is already pretty good, to be honest). It's not really a tutorial and it lacks addressing some real-world issues when working with svn but as an introduction it's okay.