As the software is written and requirements are changed and refined, opportunities to introduce new classes present themselves naturally when refactoring or changing code: new classes "grow" from existing code. Of course, obsolete classes are "pruned"; it's like gardening. The accumulating complexity of a developing piece of software is managed by organizing it with appropriate abstractions; if classes are not allowed to become too complicated, in the long run their number can only increase. The opposite of grown classes are classes introduced from outside: any kind of BigDesignUpFront, patterns and conventions requiring sets of classes (e.g., components with interfaces, normal and test implementations, implementation factories, etc.), or something "that might be useful later". -- LorenzoGatti