What are some good ways I can improve my system architecture design skills?
I'm particularly interested in designs I can learn from... can anyone shoot out some examples of good design practice, lessons learned, things to guide me?
What are some good ways I can improve my system architecture design skills?
I'm particularly interested in designs I can learn from... can anyone shoot out some examples of good design practice, lessons learned, things to guide me?
In order to be a good architect you will first have to be familiar with design patterns, algorithms, and relevant technologies.
You could always enter architecture contests at topcoder.com. You'll get pretty good feed back from the reviewers and possibly win some money as well.
There are "methodologies", most of which say something like: get a requirement spec, for each noun in it, make a class, and for each verb in it, make a method, etc. etc.
I prefer a different approach. (The specific question there is about optimization, but it's really about overall system design.) The idea is to identify each kind of information that comes in and out. Who provides it, when, and in what form? From this you can identify a range of representations for that information, with pros and cons. You can identify how, why, and when to retain it, and how to minimize redundant representations. You can identify how to minimize the redundancy of the source code, and thereby minimize maintenance effort and bugs.
Like any skill, it just takes time and lots of practice to learn. It's not so much about knowing the techniques, but building up a solid intuition to know when a technique will or will not work.
A big part of learning is learning from your mistakes. So make a lot of mistakes and make them as quickly as possible. Projects should be relatively short-lived. Dealing with buggy, poorly designed stuff you made will teach you nothing except the consequences of writing buggy, poorly designed stuff.
In your design, find the sweet spot between actually having thought about the problem seriously and coming up with a design you could actually finish. In almost every situation, the tendency is to over-engineer, so Keep It Simple, Stupid (KISS) and do the simplest thing that could possibly work. Keep in mind computers are not infinitely powerful --- they are unboundedly powerful. You can add whatever features you want to your system, but at some point you have to say "screw it, anything else the user wants to do, they will have to do it with pen and paper".
Check out Grady Booch's work in progress, the Handbook of Software Architecture. Material is also available as podcast.
Microsoft have also published information on MSDN, such as the Application Architecture Guide.