Essentially, designing programs for use by other programs. The designed program has an interface usable by other programs - an ApplicationProgrammingInterface. In common with UiDesign, it is a good idea to ''not'' put awkward or dangerous controls in an API. A number of oft-debated programming language features assist in ApiDesign more than anything else: * ConstCorrectness * AccessControl * StrongTypes * ExceptionHandling * ''AttributesInNameSmell'' Not all APIs are object-oriented. Polymorphism is probably the most-sorely-missed feature of such APIs. MicroSoft and SunMicrosystems expend considerable effort towards ApiDesign, apparently to good effect. Who says ReuseHasFailed? --MattRickard ---- Good point, if I interpret your ReuseHasFailed reference correctly. Perhaps reuse has failed for those waiting for software IC's, but from the standpoint of OS provided tools, capabilities, and widgets, reuse has been growing ever since the Macintosh toolbox. ---- Why should you emphasise API design? If programs don't have a UI, they are easier to test i.e. you get to UnitTest instead of doing GuiTesting. You will have to separate UI code from algorithmic code, so both will probably be easier to understand and maintain, maintaining algorithms won't break the UI, and vice versa. See IsolationLayer --MattRickard