Best resources for learning software design?
February 15, 2006 11:13 AM   Subscribe

What are the best books to teach the fundamentals of software design and architecture?

I have taught myself several languages to the point where I can write a basic functional program (a small game is usually my initial project). I know enough Perl to have written several 2000+ line programs that work pretty well, and several utilities in general use at my workplace. I've worked with both OO and procedural languages, and feel like I have a fairly good handle on the basics of OO.

I've had several people tell me that a solid grounding in software architecture is invaluable, and looking back it definitely seems that some of the biggest problems I've faced have been trying to figure out the architecture of my projects. I've been getting through by just designing small pieces and then making them work together, but I have the vague feeling that for my bigger programs this isn't the best strategy.

I'd like to eventually get to the point where I could create something open-source that people would find useful or fun, or perhaps contribute to an open-source project. (Probably in Python.)

With all this in mind, what books should I read? "Design Patterns" seems to have a more narrow focus than what I'm looking for, but it's difficult for me to tell. "Code Complete" or "The Pragmatic Programmer" look like they might be good ones, but again, it's hard to tell since I'm not entirely sure what I should be trying to learn.

Also welcome: Suggestions on better questions I should be asking, and suggestions on how to move toward the level of competency required to contribute meaningfully to open-source projects.
posted by agropyron to Computers & Internet (12 answers total) 9 users marked this as a favorite
Before I read the "more inside", I clicked on the link to recommend Code Complete and The Pragmatic Programmer. The third on my list would have been something like Head First Design Patterns, so all in all it looks to me like you are on the right track. Another one on my bookshelf that I use regularly is Refactoring by Martin Fowler.
posted by Lokheed at 11:36 AM on February 15, 2006 [1 favorite]

Best answer: If you haven't read Design Patterns you absolutely must do so now. It gives you a more rigorous structure that will inform and direct your own efforts (one of the signal joys of reading the GOF book is discovering the various patterns you've independently re-invented in your own work.)

Code Complete is probably useful as well, although I think I looked at it and basically found that most of the advice was self-evident and stuff I already practiced. Your millage may vary.

A non-technical book that may provide insight is Kidder's The Soul Of A New Machine.

Alexandrescu's book is mind-bending, but probably only really useful if you plan to do lots of C++. Stroustrup's D&E, on the other and, should be read by anyone looking to do large-scale design, even though it's ostensibly only about C++. Coplien's Advanced Idioms should also be read regardless of language preference.
posted by orthogonality at 11:37 AM on February 15, 2006

I know you've asked me this before, and I came up blank as well. Design Patterns is essential but, to use a college metaphor, is more 300- or 400-level than the 101 type of thing you are asking for. Code Complete is an awesome and essential book to read if you are going to do any development, but it will not teach you anything about architecture. Similarly, the Pragmatic Programmer is a great book about how you go about doing your work, but again is not relevant to architecture.

Most of what I know about architecture I have picked up from working on enterprise-scale projects and listening to the people around me. If there exists such a book, I'd love to read it.

On preview, the Head First book is really good and is probably a better introduction to design patterns for a beginner than going directly into the GOF, but it still might be more advanced than what you are looking for. Refactoring is also an essential book that I would highly recommend, but again, it doesn't seem to address directly what you are looking for.
posted by matildaben at 11:40 AM on February 15, 2006

Response by poster: Thanks for the answers so far. I just ordered Head First Design Patterns, since the library didn't seem to have it. Based on matildaben's comments, I'm still hoping to see some more recommendations.
posted by agropyron at 12:44 PM on February 15, 2006

Response by poster: (Code Complete and the GOF book are on hold at the library now)
posted by agropyron at 12:45 PM on February 15, 2006

agropyron, even the best auto-didact inevitably misses some things. You might also find that the more rigorous structure of an intro programming class may serve to organize what you already know. If so, you can choose from three intro CS classes, each with a somewhat different emphasis, webcast by UC Berkeley. You might follow the current classes, or if you feel like moving faster, the same courses as archived from each of several prior semesters.

I myself am following the CS 162 webcasts/podcasts of the Operating Systems and System Programming class. This might also be a good introduction to large-scale programming. (And if you'd like to join me in this, you know how to get in touch.)
posted by orthogonality at 12:50 PM on February 15, 2006

You know the way that people who discover religion later in life will go on and on about it and how their lives can change (giving up alcohol, gambling, etc)?

That's how I felt when I read "Design Patterns" (the GOF book). I exaggerate only slightly when I say that it changed my life. Though it did not cause me to give up alcohol or gambling.

IMO, software architecture has become much simpler in the last 10 years with the rise of "pre-fab" meta-architectures, like .NET and the various types of systems in Java (servlets, EJB, etc). These systems both provide pre-built architectures and good examples of architectures to study to help understand the underlying principles they're built on.

I would suggest getting some books on specific software frameworks (Java, .NET, maybe windows non-.NET) and read them not to learn the specific APIs, but to get a feel for how the same problem is solved different ways, architecturally.

I hope that makes some sense.
posted by GuyZero at 12:56 PM on February 15, 2006 [1 favorite]

Best answer: I wouldn't recommend The Pragmatic Programmer. A lot of people like it, but I get annoyed at being lectured about what is basically just common sense.

I like Code Complete, despite being deeply distrustful of anything that hails from Microsoft. I've got the first edition, though. I can't vouch for anything other than that.

Two books that have definitely made me a better programmer, are by Scott Meyer. The first, Effective C++, has provided lots of eye-openers about OO best-practice. My background is C++, I currently do Java and C#, and I think that this book is invaluable no matter what OO language you use. Some bits are C++ only, but a lot of its principles are universal.

The second, Effective STL, is (obviously) only really useful in a C++ context. But, if that's your bag, it's the best book you could possibly buy. With it, you'll nail STL, and if you do that, the big bucks will be yours for the taking.

My suggestion as to being useful on an open-source project: Just pick a small project on SourceForge, and jump right in. It won't take long to pick up the 'house style'. Most of the really good developers of my generation learnt the foundations of their trade by typing in long complicated progams from magazines into their CBM-64s (or equivalent). Today's open-source is yesteryear's computer magazine program.
posted by mad judge pickles at 1:05 PM on February 15, 2006

I like Luke Holman's book Beyond Software Architecture: Creating and Sustaining Winning Solutions, Artima has a 6 part series of interviews with him online that are relatively quick reading that inspired me to get the book.
posted by freshgroundpepper at 8:50 PM on February 15, 2006

Response by poster: Hey ortho, thanks for the recommendation on the CS webcasts from Berkeley. I just finished the first class of CS 162, and it's quite fascinating. Did you bother with CS 61A, B, or C? I may start at the very beginning.
posted by agropyron at 11:04 PM on February 15, 2006

I looked the CS 61s a bit; basically they seem to be intro scheme, intro java, and intro MIPS assembly, so there's not much I need there (I don't know MIPS assembly, but I do know 8086, so I'm not going to sweat the (very real) differences). For 162, you'll need the book, which is about US $60 - $100, depending on where you get it.

But before tackling 162, make sure that 61 is old hat. A good test for this might be to look at the GOF book, and see how much of that makes sense to you. the original GOF used examples in C++ and Smalltalk -- you should be able to follow the examples in at least one of these languages, and preferably both (I can "follow" the Smalltalk code, even though I couldn't write it).
posted by orthogonality at 7:04 AM on February 16, 2006

Patterns of Enterprise Application Architecture might be useful if you're interested in the architecture of enterprise systems ("Enterprise applications are about the display, manipulation, and storage of large amounts of often complex data and the support or automation of business processes with that data."). I haven't read it, but it's by the always excellent Martin Fowler, and I've seen it on a few people's desks at my company.
posted by matildaben at 4:19 PM on February 16, 2006

« Older Memes that cause people to think outside the box...   |   buddhist boston Newer »
This thread is closed to new comments.