La ingeniería de software

La Ingeniería de software es la rama de la ingeniería que crea y mantiene las aplicaciones de software aplicando tecnologías y prácticas de las ciencias computacionales, manejo de proyectos, ingeniería, el ámbito de la aplicación, y otros campos.

El software es el conjunto de instrucciones que permite al hardware de la computadora desempeñar trabajo útil. En las últimas décadas del siglo XX, las reducciones de costo en hardware llevaron a que el software fuera un componente ubicuo de los dispositivos usados por las sociedades industrializadas.

La ingeniería de software, como las disciplinas tradicionales de ingeniería, tiene que ver con el costo y la confiabilidad. Algunas aplicaciones de software contienen millones de líneas de código que se espera que se desempeñen bien en condiciones siempre cambiantes.

En el 2002, en los Estados Unidos, la Oficina de Estadísticas del Trabajo (U. S. Bureau of Labor Statistics) contó 675.000 ingenieros de software de computadora con trabajo, y se estima que haya 1 millón y medio en Europa, Asia y el resto del mundo. Esto significa aproximadamente el 60% de los ingenieros de todas las áreas.

Orígenes

La Ingeniería del Software, término utilizado por primera vez por Fritz Bauer en la primera conferencia sobre desarrollo de software patrocinada por el Comité de Ciencia de la OTAN celebrada en Garmisch, Alemania, en octubre de 1968, puede definirse según Alan Davis como «la aplicación inteligente de principios probados, técnicas, lenguajes y herramientas para la creación y mantenimiento, dentro de un coste razonable, de software que satisfaga las necesidades de los usuarios«.

Significados

El término ingeniería de software se usa con una variedad de significados diferentes:

  • Como el término usual contemporáneo de un amplio rango de actividades que se solía llamar programación y análisis de sistemas;
  • Como un término amplio de todos los aspectos de la práctica de la programación de computadoras, en oposición a la teoría, que es llamada ciencia computacional o computación;
  • La ingeniería de software es «(1) la aplicación de un método sistemático, disciplinado y cuantificable al desarrollo, operación y mantenimiento de software, esto es, la aplicación de la ingeniería al software» y «(2) el estudio de los métodos de (1)», estándar IEEE 610.12.

Debate sobre quién es ingeniero de software

Algunas personas piensan que Desarrollo de Software es un término más apropiado que Ingeniería de Software para el proceso de crear software. Personas como Pete McBreen (autor de «Software Craftmanship») cree que el término IS implica niveles de rigor y prueba de procesos que no son apropiados para todo tipo de desarrollo de software.

Otras personas creen que el campo de la IS es suficientemente maduro para garantizar el título de «ingeniería».

No hay actualmente un criterio aceptado para distinguir alguien que es ingeniero de software de alguien que no lo es. Además la industria está inmersa en un complejo debate sobre el licenciamiento de los ingenieros de software practicantes.

La ingeniería de software en nuestros días

La ingeniería de software afecta a la economía y las sociedades de muchas maneras.

Económicamente 
En los EEUU, el software contribuyó a 1/4 de todo el incremento del PIB durante los 90’s (alrededor de 90,000 millones de dólares por año), y 1/6 de todo el crecimiento de productividad durante los últimos años de la década (alrededor de 33,000 millones de dólares por año). La ingeniería de software contribuyó a $1 billón de crecimiento económico y productividad en esa década. Alrededor del globo, el software contribuye al crecimiento económico en formas similares, aunque es difícil de encontrar estadísticas fiables.
Socialmente 
La ingeniería de software cambia la cultura del mundo debido al extendido uso de la computadora. El correo electrónico (E-mail), la WWW y la mensajería instantánea permiten a la gente interactuar en nuevas formas. El software baja el costo y mejora la calidad de los servicios de salud, los departamentos de bomberos, las dependencias gubernamentales y otros servicios sociales. Los proyectos exitosos donde se han usado métodos de ingeniería de software incluyen a Linux, el software del transbordador espacial, los cajeros automáticos y muchos otros.

Metodología

Un objetivo de décadas ha sido el encontrar procesos o metodologías predecibles y repetibles que mejoren la productividad y la calidad.

Pasos del proceso

La ingeniería de software requiere llevar a cabo muchas tareas, sobre todo las siguientes:

Análisis de requisitos 
Extraer los requisitos de un producto de software es la primera etapa para crearlo. Mientras que los clientes piensan que ellos saben lo que el software tiene que hacer, se requiere de habilidad y experiencia en la ingeniería de software para reconocer requisitos incompletos, ambiguos o contradictorios.
Especificación 
Es la tarea de describir detalladamente el software a ser escrito, en una forma matemáticamente rigurosa. En la realidad, la mayoría de las buenas especificaciones han sido escritas para entender y afinar aplicaciones que ya estaban desarrolladas. Las especificaciones son más importantes para las interfaces externas, que deben permanecer estables.
Diseño y arquitectura 
Se refiere a determinar como funcionará de forma general sin entrar en detalles. Yourdon dice que consiste en incorporar consideraciones de la implementación tecnológica, como el hardware, la red, etc.
Programación 
Reducir un diseño a código puede ser la parte más obvia del trabajo de ingeniería de software, pero no es necesariamente la porción más larga.
Prueba 
Consiste en comprobar que el software realice correctamente las tareas indicadas en la especificación. Una técnica de prueba es probar por separado cada módulo del software, y luego probarlo de forma integral.
Documentación 
Realización del manual de usuario, y posiblemente un manual técnico con el propósito de mantenimiento futuro y ampliaciones al sistema.
Mantenimiento 
Mantener y mejorar el software para enfrentar errores descubiertos y nuevos requisitos. Esto puede llevar más tiempo incluso que el desarrollo inicial del software. Alrededor de 2/3 de toda la ingeniería de software tiene que ver con dar mantenimiento. Una pequeña parte de este trabajo consiste en arreglar errores, o bugs. La mayor parte consiste en extender el sistema para hacer nuevas cosas. De manera similar, alrededor de 2/3 de toda la ingeniería civil, arquitectura y trabajo de construcción es dar mantenimiento.

Desarrollo de software

La ingeniería de software tiene varios modelos o paradigmas de desarrollo en los cuales se puede apoyar para la realización de software, de los cuales podemos destacar a éstos por ser los más utilizados y los más completos:

  • Modelo en cascada (ciclo de vida clásico)
  • Modelo en espiral
  • Modelo de prototipos
  • Método en V

Naturaleza de la IS

La Ingeniería de Software tiene que ver con muchos campos en diferentes formas:

Matemáticas 
Los programas tienen muchas propiedades matemáticas. Por ejemplo la corrección y la complejidad de muchos algoritmos son conceptos matemáticos que pueden ser rigurosamente probados. El uso de matemáticas en la IS es llamadométodos formales. Edsger Dijkstra ha dicho que la IS es una rama de las matemáticas.
Ciencia 
Los programas tienen muchas propiedades científicas que se pueden medir. Por ejemplo, el desempeño y la escalabilidad de programas bajo diferentes cargas de trabajo puede ser medida. La efectividad de los cachés, procesadores más grandes, redes más rápidas, nuevas tecnologías de base de datos tienen que ver con la ciencia. Se pueden deducir ecuaciones matemáticas de las medidas.
Ingeniería
La Ingeniería de Software es considerada por muchos como una disciplina ingenieril porque tiene los puntos de vistas pragmáticos y las características esperadas de los ingenieros. Análisis, documentación, y código comentado son signos de un ingeniero. David Parnas ha argumentado que es una ingeniería.
Manufactura
Los programas son construidos en una secuencia de pasos. El hecho de definir propiamente y llevar a cabo estos pasos, como en una línea de ensamblaje, es necesario para mejorar la productividad de los desarrolladores y la calidad final de los programas. Este punto de vista inspira los diferentes procesos y metodologías que encontramos en la IS.
Manejo de Proyectos 
El software comercial (y mucho no comercial) requiere manejo de proyectos. Hay presupuestos y calendarizaciones establecidas. Gente para liderar. Recursos (espacio de oficina, computadoras) por adquirir. Todo esto encaja apropiadamente con la visión del Manejo de Proyectos.
Arte 
Los programas contienen muchos elementos artísticos. Las interfaces de usuario, la codificación, etc. Incluso la decisión para un nombre de una variable o una clase. Donald Knuth es famoso por que ha argumentado que la programación es un arte.

Conferencias, organizaciones y publicaciones

Conferencias

Algunas conferencias académicas de IS se llevan a cabo cada año.

Organizaciones

  • Software Engineering Institute (SEI)
  • Association for Computing Machinery (ACM)
  • British Computer Society (BCS)
  • IEEE Computer Society
  • RUSSOFT Association
  • Society of Software Engineers