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
- 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
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: 1) 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 2) 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.
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.) Since then, I've gradually worked my way back into C++, via a fresh re-reading of Stroustrup's D&E, and am now having quite a good time.
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.
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
- (he's one of the kernel developers)
- 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
Algorithms
Multi-threaded Programming
Compilers and Compiler Design
Last updated: June 11, 2007