At a brown-bag lunch at work the other day, someone asked about the process of learning design. After thinking about it for a while, I’ve come up with a short answer: experience. This response is based on a couple of things and leads to a couple different courses of action.
One of them is my own experience. As I’ve progressed through my career, I’ve built up a body of experiential knowledge. Some designs age well, some don’t. I’ve designed things that have stood up to abuse, but more often I’ve designed something that I’ve later wanted to redo in order to alleviate some problem or other. Having worked on many projects, I have an easier time seeing where pitfalls lie and avoiding them, in addition to being able to make simple, flexible designs. I don’t think a good designer can be made without significant experience in the field.
Another facet of this “experience” argument is the aspect of knowledge acquisition. The seed of this idea was planted when I read The Knowledge Deficit, by E.D. Hirsch, Jr. In this book, Hirsch blames illiteracy in the USA on the approach taken by educators. According to Hirsch, the wrong approach is to teach the ability to read and the ability to analyze what you’re reading, and the right approach is to expose the students to a wide breadth of knowledge. I have found this point to be applicable to software engineering in a couple of ways. The first is that my own design skills have been markedly improved by reading things like the GoF’s Design Patterns book. When David Anderson visited SEP, I noticed that he made lots of references to books and articles he had read. Some of his comments made it sound like he reads a book or two per month. Finally, in the last few years, I’ve enjoyed reading historical texts (either old/original speeches texts, or, sometimes, non-fiction history books from the library). Reading these books has colored my perspective (for the better, I think) on current events in a way that other learning methods could not. Being exposed to a breadth of knowledge broadens my perspective and helps me understand how things got to be the way they are, in addition to allowing me to glean insight from other people’s experience.
In summary, good design skills are something that comes by practical experience and by knowledge. Read books and blogs about the things you are trying to do. Try new tools and techniques. Grow.