Ingeniería de Software != Computer Science

En un largo e interesante artículo escrito por Chuck Connell, que tiene el mismo título de este post, el autor señala varios puntos que indican que el desarrollo de software nunca será una disciplina completamente formal y rigurosa. La razón de que esto sea así es que la ingeniería de software incluye a lo seres humanos como parte central del proceso. Desde esa perspectiva el desarrollo de software estaría más próximo a una ciencia social como la economía que a una ciencia exacta.

El artículo de Connell para Dr. Dobb’s puede ser encontrado en este URL, pero debido a su importancia he decidido traducir las partes más resaltantes del mismo, para los lectores de este blog.

Hace pocos años, yo estudie Algoritmos y Complejidad. El campo es maravillosamente claro, con cada concepto claramente definido y cada resultado construido en demostraciones anteriores. Cuando usted aprende un hecho en esta área, usted podria llevarlo al banco, desde que la matemática debería ser inconsistente para hacerle cambiar de dirección de lo que usted ha aprendido. Aún los resultados imperfectos, como las aproximaciones y los algoritmos probabilisticos, tienen un analisis riguroso sobre sus imperfecciones. Otras disciplinas de Computer Science, como la topología de redes y la criptografía tambien gozan de un estatus similar.

Ahora trabajo en Ingeniería de Software, y esta área es desesperante resbaladiza. No hay Conceptos definidos con precisión. Los resultados son calificados de "usualmente" o "en general". La investigación realizada hoy en día podría, o no, ayudar en el trabajo futuro. Nuevos enfoques a menudo revocan los métodos anteriores, con los nuevos enfoques brillando claramente por un tiempo para luego pasar de moda cuando sus limitaciones surgen. Creíamos que la programación estructurada fue la respuesta. A continuación, pusimos nuestra fé en los lenguajes de cuarta generación y, a continuación, los métodos orientados a objetos y, a continuación, la programación extrema, y ahora tal vez el modelo open source.

Pero la ingeniería de software es donde la llanta se une a la carretera. Pocas personas prestan atención de si P es igual a NP sólo por la belleza de la cuestión. El campo de Computer Science es hacer cosas con las computadoras. Esto significa escribir software para resolver problemas humanos, y que dicho software se ejecute en máquinas reales. Por la Tesis de Church-Turing, todos las computadoras son esencialmente equivalentes. Así, mientras que la nueva arquitectura de una máquina es novedosa, el verdadero reto que restringe a Computer Science es el problema de la creación de software. Necesitamos software que pueda ensamblarce en un monto de tiempo razonable, por un costo razonable, que trabaje de la forma como esperamos, y funcione con pocos errores.

Con estos objetivos en mente, algo que siempre me ha molestado (y a muchos otros investigadores) es: por qué no podemos tener resultados más rigurosos con la Ingeniería de Software, como las otras ramas de la Computer Science? Reformulando la pregunta de otro modo, "Cuánto del software diseñado y construido puede ser formalizado y probado?". La respuesta a dicha pregunta reposa en la siguiente figura:

Figura 1

Los temas por encima de la línea constituye la ingeniería de software. Las áreas de estudio por debajo de la línea son las materias básicas de Computer Science. Estos últimos temas son claros y de resolución formalizada. Para las preguntas aún abiertas en estos temas, esperamos que los nuevos resultados también sean formalizados. Estos temas se basan entre sí – la criptografía de la complejidad, y compiladores en algoritmos, por ejemplo. Además, creemos que demostrado resultados en estos ámbitos, los resultados seguirán siendo válidos por los próximos 100 años.

Entonces, ¿qué es que esa línea brillante y por qué ninguno de los temas de ingeniería de software está debajo de ella? La línea es la propiedad que "implica directamente la actividad humana". La ingeniería de software tiene esta propiedad, mientras que la Computer Science tradicional no. Los resultados de las disciplinas por debajo de la línea pueden ser utilizados por las personas, pero sus resultados no son afectados directamente por las personas.

La ingeniería de software tiene un componente humano. La mantenibilidad del software, por ejemplo, es la capacidad de las personas para comprender, encontrar y reparar los defectos de un sistema de software. El mantenimiento de software puede ser influenciado por algunas nociones formales de Computer Science – quizás la complejidad ciclica de los gráfos de control de software. Pero la mantenibilidad fundamentalmente implica humanos, y su capacidad para comprender el significado y la intención del código fuente. La cuestión de si un determinado sistema de software es altamente mantenible no puede ser respondida sólo por el examen de la mecánica de software.

[…]

Esta observación conduce a la tesis de Connell:

     Ingeniería de software nunca será una disciplina rigurosa con resultados probados, ya que implica la actividad humana.

Se trata de una declaración extra-matemáticas, acerca de los límites de los sistemas formales. Yo no ofrezco ninguna prueba del enunciado previo, aunque no hay pruebas de que no existe ninguna prueba. Pero el hecho es que las cuestiones centrales de la ingeniería de software son las preocupaciones humanas:

     * ¿Qué debe hacer este software? (requisitos, usabilidad, seguridad)
     * ¿Qué debe tener el software dentro de, por lo que es fácil de fijar y modificar? (arquitectura, diseño, escalabilidad, portabilidad, extensibilidad)
     * ¿Cuánto tiempo se tarda en crear [el software]? (estimación)
     * ¿Cómo debemos construir [el software]? (codificación, verificación, medición, la configuración)
     * ¿Cómo debemos organizar el equipo para trabajar con eficiencia? (gestión, proceso, documentación)

Todos estos problemas giran en torno a las personas.

Luego de la presentación de su hipótesis Connell procede a discutir detalladamente por qué método considerados formales en la Ingeniería de Software como COCOMO II o el CMMI, no producen resultados confiables pues se basan en tratar de sacar fuera de una ecuación matemática formal, el comportamiento humano que está intrínsicamente envuelto en los procesos que pretende modelar.

Realmente es un magnífico paper sobre Ingeniería de Software y recomiendo la lectura completa del mismo a todos los estudiantes de Computer Science, Informática o ramas afines envueltas en el desarrollo, despliegue, gestión y mantenimiento de sistemas de software.

Un comentario en «Ingeniería de Software != Computer Science»

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.