Ingeniería de software

La ingeniería de software es una disciplina que se ocupa de todos los aspectos de la producción de software desde las primeras etapas de la especificación del sistema hasta el mantenimiento del mismo una vez que se ha puesto en uso. En esta definición, hay dos frases clave:

  1. Disciplina de ingeniería. Los ingenieros hacen que las cosas funcionen. Aplican teorías, métodos y herramientas cuando son apropiados. Sin embargo, los usan de forma selectiva y siempre intentan descubrir soluciones a los problemas, incluso cuando no hay teorías o métodos aplicables. Los ingenieros también reconocen que deben trabajar para cumplir las restricciones organizativas y financieras, por lo que buscan soluciones dentro de estas restricciones.
  • Todos los aspectos de la producción de software. La ingeniería de software no solo se ocupa de los procesos técnicos del desarrollo de software. También incluye actividades como la gestión de proyectos de software y el desarrollo de herramientas, métodos y teorías para apoyar la producción de software. La ingeniería consiste en obtener resultados de la calidad requerida dentro del cronograma y el presupuesto. Esto a menudo implica hacer compromisos: los ingenieros no pueden ser perfeccionistas. Sin embargo, las personas que escriben programas para sí mismas pueden dedicar todo el tiempo que deseen al desarrollo del programa.

En general, los ingenieros de software adoptan un enfoque sistemático y organizado para su trabajo, ya que esta es a menudo la forma más efectiva de producir software de alta calidad. Sin embargo, la ingeniería consiste en seleccionar el método más apropiado para un conjunto de circunstancias, por lo que un enfoque de desarrollo más creativo y menos formal puede ser efectivo en algunas circunstancias. Un enfoque menos formal es particularmente apropiado para el desarrollo de sistemas basados en la web, que requieren una combinación de software y habilidades de diseño gráfico.

La ingeniería de software es importante por dos razones:

  1. Cada vez más, los individuos y la sociedad confían en sistemas de software avanzados. Necesitamos poder producir sistemas confiables tanto económica como rápidamente.
  2. Generalmente es más barato, a la larga, usar métodos y técnicas de ingeniería de software en lugar de simplemente escribir los programas como si fuera un proyecto de programación personal. Para la mayoría de los tipos de sistemas, la gran parte de los costos se relacionan con cambiar el software después de que se haya puesto en uso.

El enfoque sistemático que se utiliza en la ingeniería de software a veces se denomina proceso de desarrollo de software. Un proceso de software es una secuencia de actividades que conduce a la producción de un sistema final. Hay cuatro actividades fundamentales que son comunes a todos los procesos de software. Estas actividades son:

  1. Especificación de software, donde los clientes e ingenieros definen el software que se va a producir y las limitaciones de su funcionamiento.
  2. Desarrollo de software, donde el software es diseñado y programado.
  3. Validación de software, donde se verifica el software para garantizar que sea lo que el cliente requiere.
  4. Evolución del software, donde el software se modifica para reflejar los requisitos cambiantes del cliente y del mercado.

Los diferentes tipos de sistemas necesitan diferentes procesos de desarrollo.

Por ejemplo, el software en tiempo real en una aeronave debe especificarse por completo antes de que comience el desarrollo. En los sistemas de comercio electrónico, la especificación y el programa generalmente se desarrollan juntos. En consecuencia, estas actividades genéricas pueden organizarse de diferentes maneras y describirse con diferentes niveles de detalle según el tipo de software que se esté desarrollando. 

La ingeniería de software está relacionada tanto con la informática como con la ingeniería de sistemas:

  1. La informática se preocupa por las teorías y los métodos que subyacen a las computadoras y los sistemas de software, mientras que la ingeniería de software se preocupa por los problemas prácticos de la producción de software. Algunos conocimientos de informática son esenciales para los ingenieros de software de la misma manera que algunos conocimientos de física son esenciales para los ingenieros eléctricos. La teoría de la informática, sin embargo, a menudo es más aplicable a programas relativamente pequeños. Las teorías elegantes de la informática no siempre se pueden aplicar a problemas grandes y complejos que requieren una solución de software.
  • La ingeniería de sistemas se ocupa de todos los aspectos del desarrollo y la evolución de sistemas complejos donde el software juega un papel importante. Por lo tanto, la ingeniería de sistemas se ocupa del desarrollo de hardware, el diseño de políticas y procesos y la implementación de sistemas, así como la ingeniería de software. Los ingenieros de sistemas están involucrados en la especificación del sistema, definiendo su arquitectura general y luego integrando las diferentes partes para crear el sistema terminado. Les preocupa menos la ingeniería de los componentes del sistema (hardware, software, etc.).

Hay muchos tipos diferentes de software. No existe un método o técnica universal de ingeniería de software que sea aplicable a todos estos. Sin embargo, hay tres problemas generales que afectan a muchos tipos diferentes de software:

  • HeterogeneidadCada vez más, se requiere que los sistemas operen como sistemas distribuidos a través de redes que incluyen diferentes tipos de computadoras y dispositivos móviles. Además de ejecutarse en computadoras de uso general, el software también puede tener que ejecutarse en teléfonos móviles. A menudo es necesario integrar un nuevo software con sistemas heredados más antiguos escritos en diferentes lenguajes de programación. El desafío aquí es desarrollar técnicas para construir software confiable que sea lo suficientemente flexible como para hacer frente a esta heterogeneidad.
  • Cambio empresarial y social. Los negocios y la sociedad están cambiando increíblemente rápido a medida que las economías emergentes se desarrollan y las nuevas tecnologías están disponibles. Deben poder cambiar su software existente y desarrollar rápidamente un nuevo software. Muchas técnicas tradicionales de ingeniería de software requieren mucho tiempo y la entrega de nuevos sistemas a menudo lleva más tiempo de lo planeado. Deben evolucionar para que se reduzca el tiempo requerido para que el software entregue valor a sus clientes.
  • Seguridad y confianza. Como el software está entrelazado con todos los aspectos de nuestras vidas, es esencial que podamos confiar en ese software. Esto es especialmente cierto para los sistemas de software remotos a los que se accede a través de una página web o interfaz de servicio web. Debemos que asegurarnos de que los usuarios malintencionados no puedan atacar nuestro software y que se mantenga la seguridad de la información.

Por supuesto, estos no son problemas independientes. Por ejemplo, puede ser necesario realizar cambios rápidos en un sistema heredado para proporcionarle una interfaz de servicio web. Para abordar estos desafíos, necesitaremos nuevas herramientas y técnicas, así como formas innovadoras de combinar y utilizar los métodos de ingeniería de software existentes.