Cuando se desarrolla software no tenemos un catálogo donde acceder a componentes previas, y aunque hay que se venden a grande escala, la mayoría del software se fabrica a medida, con lo que el hecho de que se vuelva a utilizar el mismo es más bien poco probable. Si que es posible comprar software desarrollado pero como unidad completa, no como componentes para a partir de ellas crear otro nuevo.

Se ha intentado mucho esto de la reutilización aunque sin mucho éxito, en lo que más énfasis se le ha aplicado ha sido en las Bibliotecas, se desarrollaron estas subrutinas para poder ser reutilizadas. Muchos de los lenguajes actuales incluyen estas bibliotecas para que sea más fácil algunas gestiones como los entornos de ventanas.

Por contra, hay problemas que no tienen soluciones tan genéricas y suelen ser más particulares, por ello no queda otra solución que programarlo de forma particular, este podría ser por ejemplo la búsqueda de un elemento en una estructura de datos ya que hay diversidad en la organización cuanto interna de las estructuras.

Un paso más en este ámbito, para poder reutilizar software se dio con la utilización de técnicas de programación estructurada y modular pero, realmente tampoco se investiga mucho con el fin de crear módulos generales para este fin, si los hay tampoco están documentados, lo que se suele hacer es programar módulos muy semejantes.

Por otro lado tenemos que la programación estructurada nos deja hacer programas con una estructura más fácil y nítida, con ello, nos permite un mejor y más claro estudio del producto en si y el poder utilizar de base algunos módulos en los programas y en algunos proyectos aunque, como es lógico, utilizar código así en proyectos no se suele hacer.

Hay técnicas orientadas a objetos, estos dejan ejercer la programación por especialización, lo que hacen es coger todos los datos como métodos, así los detalles hacen que la implementación sea irrelevante a quien los usa, también los fallos que se cometan durante su desarrollo pueden ser corregidos en sin necesidad de afectar a todo el código entero con lo que se pueden reescribir y así ser posible su reutilización.