Table of Contents
Overview
I don't believe you can master Software Design without an awful lot of Systems Programming knowledge and experience; this is probably explained best by Joel Spolsky, who notes that, in today's immature world of software, all of the abstractions "leak". And even if you are listed as a Software Architect on your card, unless the company is large enough to have the Ivory Tower Problem (non-practicing architects; non-functioning systems), Systems Programming is likely what will be doing most of the time anyway, unless of course you're just starting out, in which case you might be doing web scripting or Java or some such.
My point is that you have to know how everything underneath works, in order to get the best designs.
Philosophy and Design
I've been, variously, an OO True Believer (I was young once, OK?), then a classical kernel programmer, which washed the C++ straight out of my system for at least a year. (Until I had to write the custom compiler.) I then gradually worked my way back into C++, via a fresh re-reading of Stroustrup's D&E. That worked great for the mixed-project style at Apprion, where I was writing mostly user-space programs to hack the network stack of various wireless sensors and sensor management systems (with the blessings of the various manufacturers, of course).
After moving to NVIDIA in 2007, however, I've settled into what I hope is a long term role as an OS (mainly Linux, but some Windows) kernel engineer, and GPU (graphics processing unit) specialist. This requires using C almost exclusively. And so I now have some very entertaining anecdotes explaining just how badly C++ falls short in kernel programming.
What I'd really like is something that is as standard as C and C++, but adds just a very tiny bit of C++ to C. Embedded C++ took a similar approach, except that they subtracted a tiny bit from C++, which is not good enough for kernel programming: the system is still too large, too buggy, and too non-portable.
- Bjarne Stroustrup: The Problem with Programming (November, 2006)
- You and Your Research (Richard Hamming). A great inspiration for those of us on a largely technical career path: no need to apologize for not being interested in project management.
- Brian Foote. A madman in the trenches. Click here for a hilarious romp through programming and design fads. Curiously enough, as funny as I find these articles, most of them have actually made it into "PLoP" (Pattern Languages of Programming Design).
- Verity Stob: The Best of Verity Stob (Amazon.com). Well, it doesn't get much more fun than this.
- Hackers and Painters, by Paul Graham (web site) and hardcopy (Amazon.com) Enjoyable, deep philosophy, with all the advantages and pitfalls that that implies. Read other philosophers, and think for yourself; Mr. Graham is badly mistaken in the same articles in which he is brilliant and enlightened. (Is writing a new Lisp variant really the most productive thing to do right now? Is Java, as much as I cannot abide it, really "dead"? I don't think so, folks--half my team does Java, and the result is one of the most useful, fashionable GUIs I've seen in years. I'll add a link to an example, once Apprion has a public demo somewhere.) Part of the problem, I suspect, is getting rich--the startup equivalent of winning the Nobel prize. And, as described in Richard Hamming's article (also cited by Paul Graham), once you succeed in that visible a fashion, you're practically doomed.
- Guns, Germs, and Steel: The Fates of Human Societies
- Pattern Languages of Program Design, etc: Pattern Languages of Program Design, vol. 2, Pattern Languages of Program Design, vol. 3
Linux / Unix (but lately...mostly just Linux)
- HTML man pages at www.die.net . These are printable and searchable, two reasons to get away from "man topic" on the command line. Also, may I add that it never hurts to read the whole man page, and the web page encourages that, whereas, oddly enough, there is something about the command line that imparts a slight sense of urgency, that one should stop reading the man page and get on with the "real work". I'm not sure why this is. But it is a real effect, and it's not a desirable one.
- Advanced Programming in the Unix Environment (2nd edition)
- Fedora Core 4: The Complete Reference (Osborne) (Or, Fedora Core N, since they are released at a fast and furious pace. One edition will hold you over for at least three or four releases.)
- Learning the Bash Shell (Nutshell Handbooks) . Clear, concise, and more or less usable (with ample patience and even more bookmarks) as a reference.
System maintenance
Hardware-specific reading; assembly language
The C Language
- C: A Reference Manual (5th Edition)
- There's a reason that this is on it's 5th edition: it's clear, concise, and excellent.
- The Standard C Library
- If you have C: A Reference Manual (above), then you don't really need this. But it does give you some additional insight, due to its presentation of the actual implementation code. Before Linux--with its accompanying source code--was widely used, that was a bigger help than it is today.
- C Programming Language (2nd Edition)
- For historical value; for beginners in the C language; and for a marvelously concise description of a production programming language.
Scripting languages, Makefiles, and Build Systems
Kernels and Operating Systems
- Linux Device Drivers, 3nd Edition
- Understanding the LINUX Kernel, 3nd edition (covers the 2.6 kernel)
- Understanding Linux Network Internals.
One of the most well-written Linux kernel or networking books to be found anywhere, and brand-new as of early 2006--not to be missed!
- Linux Kernel Development, by Robert Love. Robert Love was one of the kernel developers. This book is light on coverage, but the content that is there is very well-written and extremely helpful.
- QNX RTOS
- Solaris Internals: Core Kernel Architecture
- The Design and Implementation of the FreeBSD Operating System, version 5.2 (Addison Wesley)
- The Design and Implementation of the 4.4 BSD Operating System
- Real-Time Systems, by Jane W.S. Liu (Prentice-Hall, 2000)
- Distributed Systems: Principles and Paradigms, by Andrew S. Tannenbaum and Maarten van Steen (2003)
- Operating Systems Review (ACM Press)
- You'll have to join ACM, and join their SIGOPS group, in order to get this. It includes a few of the latest and best papers on the topic.
Networking
- The Protocols (TCP/IP Illustrated, Volume 1), by W. R. Stevens
- UNIX Network Programming, by W. R. Stevens (3rd. edition)
- UNIX Network Programming, Volume 2: Inter process Communications, by W. R. Stevens (2nd Edition)
- The Implementation (TCP/IP Illustrated, Volume 2), by W. R. Stevens
- SSL and TLS
- This discusses the network-level protocol, as well as the cryptographic aspects of SSL and TLS.
- Essential SNMP (O'Reilly)
- SNMP, SNMPv2, SNMPv3, and RMON 1 and 2 (3rd Edition), by Stallings
Telecom
Cryptography
Security
Web and database programming
In case you have to pay the bills in between better jobs, you may end up doing some web programming. Here are a few books to help keep you out of trouble, or at least allow you to sound silly and pretentious enough to survive a UML whiteboard session.
Algorithms
Multi-threaded Programming
Compilers and Compiler Design
C++
- The C++ Programming Language (Special 3rd Edition)
- This is long, but then, C++ is large. Despite the length, it is enjoyable and easy to read, if you already know C++. Look elsewhere to learn the language. (Scott Meyers' first book is probably a good start.)
- The Annotated C++ Reference Manual
- Published in 1990, but still surprisingly useful.
- The Design and Evolution of C++
- Effective C++: 50 Specific Ways to Improve Your Programs and Design (2nd Edition)
- The 2nd edition is pure gold, but unfortunately, the 3rd edition is an unorganized pile of rubble, in which the reader is exhorted to use for_each as an "improvement" on a simple for loop--because, heaven knows, it is just too, too hard to pay attention to your work long enough to keep the errors out when writing "for(int i = 0; i < MAX_VALUE; ++i) ...". What rot. Try to find copies of the 2nd edition.
- Efficient C++: Performance Programming Techniques
- Exceptional C++: 47 Engineering Puzzles, Programming Problems, and Solutions
- Modern C++ Design: Generic Programming and Design Patterns Applied
- Mr. Andrescue really goes off the deep end with templates. But despite all the unanswered questions on multithreading and testing, he has some powerful template techniques. Just be careful with the power tools. (An update, May 2006: really, this is the wrong way to go with C++. But if you're on a large C++ project, you may end up having to know some of this stuff.)
- Standard C++ IOStreams and Locales: Advanced Programmer's Guide and Reference
- The C++ Standard Library: A Tutorial and Reference, by Nicolai M. Josuttis.
- This is very well done and a great advanced reference.
- STL Programming from the Ground Up
OO and Design Patterns
Design patterns are a way to ease communications among developers, and sometimes with other people (software managers; marketing types). They are also used for two other situations:
- During a design dispute, in a bid to demonstrate that developer A is more OO-centric than developer B (this tactice has fallen somewhat out of fashion, since the dot-com bust of late 2000--too many of those dot-bombs were have-you-been-saved-brother OO True Believers), and
- By novice developers, in the mistaken belief that, with a cookbook full of design patterns, programming is really little more than flour, sugar, oven temperature, and picking out the color of the frosting.
Here are a few entertaining books on the topic of OO programming:
Project Management
- Joel [Spolsky] on Software (web site) and hardcopy (Amazon.com). Insufferable, just like everyone else who has started a small company and thinks they've found the One True Way. Don't move to New York, and don't start doing Microsoft Borg programming just to be "practical" (unless you've somehow ended up with legal access to their source code). But Joel is not to be missed. He is full of refreshing insights (god, I felt a load come off my shoulders when he tore apart network programming and bad RPC abstractions) and is a marvelously gifted, entertaining writer.
- Software Craftsmanship: The New Imperative. Caution: this is for pleasure. If you actually believe it, you'll probably run into problems somewhere. The purpose of software is not to be a craft unto itself; you're there to help someone accomplish something useful. Try to remember that. I have equipped an entire garage with woodworking tools, as an outlet for my "craftsmanship". And yet, I'm still an insufferable perfectionist at the wrong times...well, you owe it to yourself to keep a sense of perspective, even if I can't lead the way here.
- Software Estimation, by Steve McConnell. If you don't know the things in this book, your professional life is going to suffer. Your personal life will, too, as you put in long hours to cover for your scheduling errors. In fact, I've created a spreadsheet that captures the basic statistical approach that he describes, in order to transform your understanding of task breakdown into a larger, yet reasonably accurate estimate. Someday I'll post it here, perhaps. Mr. McConnell's other big contribution, Rapid Development : Taming Wild Software Schedules, is also useful, but probably not too surprising to most software veterans.
Last updated: December 12, 2009