Computer Science Books
My inbox is overflowing with emails from people asking, “Matt, how can I be more like you?”
Honestly, that is only sort of true. Some of the emails say, “Lose 30 pounds in 12 minutes!” And some say, “I am the prince of Nigeria!” And some say, “I am lonely and looking for a purely physical relationship!”
More honestly, that pretty much comprises the bulk of the email I receive. Nobody has actually asked how to be more like me, strangely enough. But that day is surely coming, and since I am a computer scientist, or at least since USU says so, I could start with a list of books that you can read if you want to become a true nerd and rule the world the way I do, which is to say, not.
(So, in fairness, I haven’t actually read all of these or owned them. There are some that I haven’t read, but I read one like it; those are marked in blue. There are some that I haven’t read but think I should; those are marked in gray. There are some that where I read one like it, but I want to read that particular one – they are bluish-gray. And I didn’t list the probably 40-50 CS books I own or have owned and read that are not shown here. So cut me a break.)
Math and English
First off, in order to be a good software engineer and computer scientist, you have to be a good mathematician and a good writer. Sorry. You simply can’t be a competent software engineer without a solid mathematical background, and you can’t be an effective one if you can’t figure out how to express your ideas clearly in writing.
Learning to Program
Your next step is to learn basic programming concepts. In my opinion, you should learn two languages at this point: Python and C. Python is a good beginning language, very easy to create real applications, easy to learn, and very versatile and useful in the real world. C is the fundamental systems programming language. Knowing Python and C will allow you to program just about anything and gives you a good fundamental background.
Computer Science Fundamentals
Having learned how to write basic computer programs, now is time to get into the science of computer science.
Programming Technique and Methodology
How to write software well.
General Programming
Two other languages you might want to know are C++ and Java. C++ is much maligned, but widely used, especially for systems applications, games, and other high-performing software applications. Java is an abomination in every sense of the word. But it is also very popular and good to know. If you are going to learn Java, you should also learn JNI, so you can get from Java back to C and get some real work done.
Systems Programming
If you are going to do systems programming, you’ve got to know the specifics of how to program to the environment in question. It’s worth noting here that the UNIX books basically cover POSIX, which applies not only to UNIX but BSD, Linux, and Mac as well to varying reasonable degrees. I’ve also included an internals book for the big three platforms (Windows, Linux, and Mac). And if you are going to program for Mac, you will probably want to learn another language: Objective-C.
Other
Every good software engineer should clearly understand open source; hence The Cathedral and the Bazaar. You will find you are missing out on a number of inside jokes if you don’t read The Hitchhiker’s Guide to the Galaxy. And everyone should read The Code Book, simply because it is so interesting.















































