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.