By Jakob Engblom
Making good design decisions is hard, making bad decisions is easy. The best way to avoid really bad design is to actually work through how a certain design works in practice. One of my favorite examples is how Jeff Hawkins walked around with a mockup of the original Palm Pilot to tests its real feel through daily "use".
The same principle applies to software architecture. When you design a software component that other programmer's will use, the best way to make sure the design makes sense is to use it to accomplish something. Just creating an API and some unit tests is not likely to result in a design that is easy to use and that works well in practice. To me, this is one of the key insights of agile methods and iterative software development. By geting something half-finished into the hands of users and collecting feedback from actual use, the final design is much more likely to be good.