Skip to content

Computer Science Core Reference Collection

The collection of Core Computer Science Reference books is the result of a generous gift from Ken Shrum, a software engineer for the Firehunter group (www.firehunter.com) within Agilent Technologies , where he does product development in Java. Mr. Shrum has been a full time practicing software engineer since 1983 and has taught at CSU as a lecturer in the Department of Computer Science.

This selective collection of books is intended to provide a focused reference collection for undergraduate CS majors. In addition to providing the books, Mr. Shrum also wrote the commentary that is included on this page, which will serve as practical advice to students who are planning to work in the computer science industry.

Two copies of each book are located at Morgan Library's Loan/Reserve Desk on Green Reserve. Although one copy is on two-hour reserve, the second copy can be checked out for three days at a time.

 

Learning C++
Learning Java
Other Programming Books
Complete list of books with summaries

Learning C++

The recommended approach for learning C++ is to start with Accelerated C++, assuming that you already know at least one other programming language.  From there, dip into The C++ Programming Language as a reference to find the details on things glossed over in Accelerated C++.  Then, as soon as practical, pick up Effective C++ and More Effective C++.  You'll still need The C++ Programming Language, but don't necessarily need to read it cover to cover yet.  Finally, read The C++ Programming Language, and then Exceptional C++.  Use The C++ Standard Library as a reference along the way, and read it in its entirety towards the end.

Along the way, write a lot of code.

If you accomplish all this, you'll know C++ almost as well as a practicing software engineer.  You won't have the experience, and you'll need the daily hands-on activity with the language, but you'll be in good shape.

Books to read:

[top]

Learning Java

There's no Java book that corresponds to Accelerated C++.  The Java Programming Language is good and definitive, but a little rough going for many people.  Consequently, once you've had some exposure to Java (CS 153 or CS 154), start with The Java Programming Language.  From there, read The Java Tutorial (either online or in the soon-to-be-published third edition), and dip into The Java Class Libraries as needed to further pick up the libraries. 

Similarly, there's no Java book that corresponds to Effective C++ and More Effective C++. The best available along those lines are Practical Java and Java Pitfalls, so read them to learn a bit more about how to write Java well. The C++ book community is much more mature than the Java community, which makes sense since C++ is an older language.  I expect to find really good Java books someday.

If you don't understand (at least) the contents of The Java Programming Language you'll have a hard time finding work.

Books to read:

[top]


Other Programming Books

The Practice of Programming is a terrific book full of practical advice about how to write small programs well, possibly using multiple languages.  It's must reading.  Pragmatic Programmer is also extremely good.  When you're ready for design, read Design Patterns and Refactoring.  For broader life cycle issues from two different perspectives, see Extreme Programming Explained and Rational Unified Process. Notation is ably covered in UML Distilled, and testing in Testing Object-Oriented Systems. Throughout your academic career, you might also find a couple of Extreme Programming practices very valuable: simple design, unit testing with JUnit, and "test first, by intention". 

Books to read:

[top]

Complete List and Summary of Books

Accelerated C++
As Andy Koenig says (paraphrased), you need to know everything in this book to be good at C++, but you also need to know other things that are not in this book.  Accelerated C++ is the definitive book for quickly learning modern, idiomatic C++.  You'll then need to know other things that Andy doesn't cover.  Good places to pick those things up are The C++ Programming Language, Effective C++, More Effective C++, and The C++ Standard Library.  This book does not cover how to program, which it assumes that you already know in some language.  Rather, it covers the core parts of C++ and its standard usage in a very accessible manner.  I recommend working through this book in its entirety to learn C++, perhaps in parallel with formal coursework.  Mastery of this material is expected of software engineers that claim to know C++.

The C++ Programming Language, Third Edition
This book is the definitive treatment of C++, by the language's primary author.  It's not a beginner's book, but is structured more like a reference.  You can find very good information about any facet of the language (as opposed to the C++ Standard Library) in this book.  Don't start here to learn C++, but definitely use it to learn it in more depth, once you've started with something more accessible like Accelerated C++. Language lawyers might also need a copy of the ISO standard itself.  Rumor has it that Bjarne and Barbara Moo are working on an annotated version of the ISO standard, which would replace the now-dated Annotated Reference Manual.

Much of this material is advanced or optional when viewed academically.  A working software engineer who uses C++ should be expected to be familiar with the contents, possibly using it as a reference as needed.

The C++ Standard Library
This book covers every detail of the standard library, from collections and iterators to iostreams and streambufs. Not only does it provide reference material, but it also provides small examples of most features, thereby serving as a tutorial.  It's comparable to The Java Class Libraries. The C++ Programming Language only gives a brief overview of the libraries (as does Accelerated C++), so come to this book when you want to learn the ins and outs of the library.  It assumes that you already know C++ as a programming language.  Use this book as a reference as an undergraduate, but expect to have full command of the material as a working software engineer.  A good book to review before interviews.

Concurrent Programming in Java, 2nd Edition
This is the definitive book on how to use threads in Java.  It's also a remarkably difficult read, since there's a lot of information presented at a relatively advanced level.  Many software applications don't really need to deal with concurrent programming, or only deal with it idiomatically within Swing (for example). A quick skim though the book as an overview will tell you something, though: programming with threads is complex, and easy to get wrong.  Some level of understanding is crucial, if only to let you know that there's much more to threads than new Thread(r).start().  Otherwise, use the book as a reference.

Design Patterns
This book started the entire design patterns movement, and has been called one of the best books of the 90's.  If you're going to do object oriented design, you need to be familiar with the contents of this book. Practicing software engineers know the contents and/or use it as a reference.  Expect technical interviews to include questions from this book.

It's not a book on how to program, nor is it a book on how to do design.

Effective C++, 2nd Edition
More Effective C++
Until Accelerated C++ came out, this book and its sequel More Effective C++ were the only available "style" guides to C++. The C++ Programming Language mostly presents the language itself, rather than standard idiomatic practice.  Effective C++ and More Effective C++ talk about standard practice, about things you should and should not do when using the language.  Some of the advice is perhaps dated now, but knowing the contents of these two books is essential for proper use of C++.

Read these books after Accelerated C++, and really understand them.  Expect to use the information as a working engineer, and perhaps also in interviews.

Although these books are fundamentally about proper use of C++, the concepts in them might also affect how you use Java.  Expect a little bit of cross-over effect.  There are (as of 12/1/00) no Java books that do for Java what these books do for C++

Exceptional C++
This book can be taken in two chunks.  One chunk is the best treatment of exceptions and exception safety than I've seen anywhere, and that information (largely) applies to Java as well.  The other chunk is a guru-level treatment of C++.  Working through this book in its entirety is very valuable for anyone who plans on using C++ professionally.  Working through the exception safety portion should be required reading for anyone using C++ or Java.

This book is certainly accessible after having read Accelerated C++.  To get the most out of it, I'd read it again after having read The C++ Programming Language, Effective C++, and More Effective C++.

Extreme Programming Explained
This book is the manifesto for Extreme Programming (XP), written at a fairly high level and hence pretty accessible.  The audience is experienced software engineers and managers, but it would make very interesting reading before, during, or after CS 314.  The list of people that really understand XP is pretty short right now, so you should weigh what anyone tells you about it against what Kent says in this book.

This is not a book on how to program, but rather a book on how to do software development.  Think of XP as an alternative to the waterfall, iterative, or spiral models of development. When you want to know more, there's Extreme Programming Installed, which goes into more detail.  There's also a wealth of information available at http://www.c2.com/cgi/wiki?ExtremeProgrammingRoadmap

Java Pitfalls
Another "how to write good Java" book.  It's not bad, some of the advice is misleading, but there's not much out there that's better yet.  It can be read at about the same time as Practical Java.

The Java Programming Language, Third Edition
This is the definitive treatment of Java, the language.  For the libraries, as in C++, you'll need to look elsewhere (The Java Class Libraries, The Java Tutorial, http://java.sun.com).  Unfortunately, it's not a book on how to program.  Instead, use this book as a down in the trenches look at all of the details of the language.  A software engineer who knows Java knows the contents of this book quite well.  Expect to be asked questions about everything in the book during interviews.

The JFC Swing Tutorial
This is a very accessible treatment of how to develop Java GUIs using Swing, part of the Java class libraries.

This raises the question: what parts of the Java class libraries should you be familiar with, if you claim to know Java?  Certainly you should be familiar with the major packages and classes, notably java.lang, java.util, some of java.text, and java.io.  Swing, on the other hand, can be viewed as an optional thing to know about.  If you're going to be doing GUIs in Java, you need to be intimately familiar with Swing.  If not, you can happily get by without knowing Swing at all.

This book assumes that you're already familiar with Java the language and the rest of the class libraries.

Practical Java Programming Language Guide
This book attempts to be for Java what Effective C++ and More Effective C++ are for C++.  It doesn't fully succeed, but it's still a good book. Rely on this book to give pretty good advice about how to use Java well, beyond just being able to use Java at all.  Balance the advice against that given in Effective C++ and More Effective C++, if only to get a second opinion.

This book assumes that you have a working familiarity with Java and the core class libraries.

The Practice of Programming
This book, by Kernighan and Pike, has impeccable credentials.  Kernighan and Pike go way back in software development, and are no Johnny-come-lately's. It isn't about any particular programming language, but shows how some basic techniques can be used to help you get work done quickly and practically.  It also shows the usefulness of scripting languages to solve certain problems.

The book is accessible once you have a basic exposure to how to program.  More advanced students will get more and different things out of it, so it's worth revisiting late in your academic career.

Pragmatic Programmer: From Journeyman to Master
This book is a down in the trenches view of software development, with particular attention paid to the actual practice of writing code. It's full of advice on techniques, pitfalls, general practices, etc. The material is thought provoking and valuable. It covers material from a broader perspective than The Practice of Programming, so some of the life cycle information might not be as useful early on.

The book is a good read during or after CS 200. Like The Practice of Programming, you'll get different things out of it when you have more experience.

Rational Unified Process: An Introduction
A brief overview of RUP, which is the software engineering process that goes along with UML.  Heavy process shops often use RUP, and exposure to it is a good thing.

Read this book along with or following CS 314 to get a different perspective.  Also consider contrasting RUP with Extreme Programming, as described in Extreme Programming Explained and Extreme Programming Installed.

Refactoring: Improving the Design of Existing Code
This is a major book, as important as Design Patterns.  Refactoring is the process by which you can incrementally improve designs and code, while keeping them constantly operational.  Along the way you'll learn how to recognize bad code/design, ways to structure good code/design, and the techniques to incrementally transform bad into good.

This book assumes that you already know some object-oriented language.  The examples are in Java, but translate naturally to C++.  I recommend that you already be comfortable with object-oriented design or programming;  if you don't "get" runtime lookup of methods, this book will be beyond you.

Testing Object-Oriented Systems
This book covers every major technique for testing object-oriented software.  The Extreme Programming guys say "Strive to write programs such that you will only need to scratch the surface", and I think that's very good advice.  The techniques covered here are very good, and exposure to them will help you appreciate the need for simple modular design.  What's more, the techniques are essential if testing a significant system "after the fact."

Treat the book as a reference, but possibly skim it for familiarity during or after CS 314.

UML Distilled
Martin Fowler (author of Refactoring) takes on UML.  Martin is a pragmatist, and consequently covers the core bits of UML and leaves out things beyond the core.  Frankly, it's most of what you need to know, anyway, and the book is thankfully thin.  Martin takes a minimalist approach to UML, encouraging you to only use the notation you need to.  That's very good advice.

Use this book to get necessary conversational skills with UML.  Break it out as soon as any course starts drawing UML diagrams.

Computer Science Resources ||| Research Guides