Software reuse can take many forms from simple code reuse to complete application reuse. There are various levels of reuse including components, frameworks, libraries, services, patterns and full applications. The optimal approach depends on the available software, skills, and needs of the organization, with factors like schedule, lifetime, team, criticality and domain determining the best fit. Software reuse provides a cost-effective way to develop software.