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.
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.
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.

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.

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.
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.

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.