The following is my attempt to generalize DesignForTestability. The software design process should be targeted at development process in whole as well as at the product being designed. Development process includes "listen-test-code-refactor" chain, according to KentBeck. Design is being spread in all links of the chain. So, doing your design and producing SystemMetaphor, try keeping in mind: * "The user" (the real user and a software developer) should be able to listen to your system, to learn from it. This can include ability to do experiments with a system * The system on each abstraction layer should be testable (DesignForTestability). * It should be natural to add code to your system (don't design the application, design the "language" instead). * The system should permit refactoring I've found above statements somehow related to the GreatDesign. Thoughts anyone? -- PavelPerikov