Very hard to design reusable Software Design must be specific to problem on hand Design must be general enough to address future problems and requirements Almost impossible to do it right the first time Experienced designers don’t reinvent the wheel They use good solutions again and again Find & use recurring patterns of classes &