En ingeniería, es usual diseñar productos y sistemas en términos de componentes. La innovación suele darse en la integración y “orquestación” de los componentes, vía un diseño externo que revela una interfaz de uso. Los componentes físicos son elementos de construcción que presentan diversos niveles de granularidad y se los especifica según sus funciones y por satisfacer ciertas restricciones, que permiten ensamblarlos y operar dentro de ciertos márgenes.
Para diseñar en términos de componentes, es necesario que sus características sean conocidas y confiables. Existen organismos de “tercera parte” que certifican las propiedades de los componentes físicos, posibilitando planteamientos que confían en las funciones que prestará cada componente.
El diseño y construcción de componentes desoftware busca implementar contratos de servicio. Los contratos referentes a funcionalidad pueden ser especificados en términos de precondiciones (supuestos), poscondiciones (efectos garantizados) e invariantes (restricciones de integridad).
Pero hay más características de interés: tolerancia a fallas, rendimiento, seguridad, portabilidad, interoperabilidad y escalabilidad, entre otras.
La especificación es imprescindible para certificar componentes de software. Hay teorías y métodos formales para todo esto, pero su uso es limitado por la dificultad del modelaje matemático, la complejidad de los elementos y sus relaciones, la carencia de herramientas de apoyo y la inversión en tiempo y recursos requeridos.
La tendencia haciasoftware como servicios expuestos en la nube plantea el reto de definir los contratos de servicios de manera que se logre amplia reutilización e interoperabilidad, pero estamos lejos aún de tener una base de confianza comparable a la que es posible en los artefactos y sistemas basados en elementos físicos