Se cuenta que una vez le preguntaron a Miguel Ángel cómo había procedido para esculpir el David. Su respuesta fue que lo que había hecho era, simplemente, eliminar del bloque de piedra original todo lo que sobraba. Independientemente de la verosimilitud de esta anécdota, podemos encontrar en ella la enseñanza de una actitud a tomar para abordar problemas prácticos de desarrollo en ingeniería.
Si la pregunta se le hiciese a un escultor que modelase en barro la respuesta equivalente sería, posiblemente, que lo que había hecho era rellenar el espacio disponiendo el barro estrictamente necesario en las zonas adecuadas. Estas dos respuestas se refieren a dos aproximaciones para abordar procesos constructivos: la sustractiva, natural en la escultura en piedra, en la que se eliminan elementos de una solución primigenia hasta que se cumple con las restricciones de la solución definitiva, y la aditiva en la que se aborda el problema partiendo de una solución inicial vacía, añadiendo elementos según ciertos criterios con el fin de conseguir que la solución final cumpla los objetivos de diseño. Estas dos son aproximaciones extrapolables a otras disciplinas y en general, en muchos otros casos, la solución se alcanza con aproximaciones mixtas, en las que se opera con acciones aditivas y sustractivas combinadas.
El desarrollo de software es una disciplina práctica relativamente nueva que tiene poco más de medio siglo de existencia, pero que conceptualmente es hija de las disciplinas clásicas constructivas englobadas bajo el paraguas de las ingenierías y la arquitectura. De ellas hereda una de las habilidades que necesita un buen informático; la de resolver problemas. Por ella me refiero a la capacidad, en palabras de Allen Downey, el autor de «Think Python. How to Think Like a Computer Scientist», para formular problemas, pensar en soluciones de manera creativa, y expresarlas de forma clara y precisa. A esto se debe probablemente mucha de la genialidad de Miguel Ángel.
Volviendo a las disciplinas clásicas de la ingeniería y la arquitectura, el objetivo de estas no es el de las ciencias clásicas de carácter analítico, es decir, no intenta entender, explicar y describir algo ya existente como lo hacen la física, la química o la biología, sino más bien sintético, es decir, orientado a desarrollar y construir cosas nuevas que satisfagan un objetivo expresado normalmente por la función definida a priori que debe cumplir el resultado. En este ámbito, el conocimiento acerca de cómo realizar bien las tareas de desarrollo de nuevas soluciones es un trabajo de destilación que se produce en ciclos de vida resumibles en «observación-análisis-propuestas de solución-realización práctica-evaluación de resultados-refinamiento, para alcanzar el nivel de aceptación-corrección para iniciar de nuevo el ciclo o descarte de la propuesta» según corresponda. Estos procesos se realizan iterativamente en el tiempo, constituyendo la fuente del conocimiento práctico del saber hacer de la disciplina y que se terminan expresando como recetas metodológicas y conjuntos de buenas prácticas para ejecutar los proyectos y tareas futuros. Su fin es llevar esos proyectos a buen término en forma de una solución que sea eficiente y efectiva y cumpla las restricciones impuestas al mínimo coste de realización posible medido en horas-hombre. Este proceso es análogo, de nuevo, a los desarrollos de la ingeniería y la arquitectura primigenia, donde los constructores y albañiles desarrollaban su conocimiento y metodologías de forma práctica enfrentándose a retos y problemas nuevos. Ello permitió, por ejemplo, construir las grandes obras de ingeniería civil durante la época de esplendor de Roma, como es el caso de los acueductos, palacios o coliseos, o la gran arquitectura revolucionaria de las catedrales de estilo gótico. Esas construcciones fueron productos pero también retos, que permitieron desarrollar conocimiento y metodologías que se explotaron y depuraron durante siglos.
La realización de proyectos en disciplinas sintéticas es pues una combinación virtuosa de la concepción y uso de las herramientas adecuadas para el desarrollo, con el conocimiento, las habilidades con esas herramientas y procesos y la experiencia disponible en la mente de quienes los ejecutan, que se manifiesta en la capacidad de resolución de problemas y se expresa como recetas metodológicas y conjuntos de buenas prácticas para llevar a buen fin los proyectos por parte de equipos de personas cualificadas. Una buena ingeniería o una buena arquitectura podrían entenderse en el sentido de Miguel Ángel como las disciplinas que tienen por objetivo el uso adecuado del conjunto de herramientas, conocimiento y habilidades combinados con una metodología que permite construir lo nuevo que se propone cumpliendo los objetivos de diseño, buscando quedarnos con lo estrictamente necesario en sentido constructivo y eliminando lo superfluo.
¿Cuál es la diferencia entre el desarrollo de proyectos de programación y el desarrollo de proyectos de ingeniería o arquitectura más o menos convencionales? Pues, conceptualmente el único conjunto de diferencias surge, básicamente, de la naturaleza del objeto de trabajo. En el caso de los últimos, el objeto lo constituyen tangibles físicos, mientras que en el caso del primero, el objeto es fundamentalmente un intangible: todo lo relacionado con la información y sus transformaciones. Además, por la naturaleza de su resultado y al contrario que en otras disciplinas constructivas, el objeto de la ejecución de proyectos software no está sometido a ley física alguna, excepto la que regula la entropía. De hecho, una gran parte de la actividad metodológica en el desarrollo de proyectos está dirigida a luchar contra la degradación y el desorden. Esta situación es la que establece la particularidad de la ejecución de proyectos software como cuerpo disciplinar, y es la que delimita el territorio sobre el que se tienen que desarrollar herramientas, conocimiento y metodologías.
Este libro pretende ser una aportación a la recopilación y la transmisión del conocimiento y la experiencia de un grupo de buenos y experimentados programadores profesionales en el desarrollo de proyectos de programación. Constituye pues un documento valioso para aquellas personas interesados en el mundo profesional del software.
Un valor interesante del libro reside en que se dedica a temas que no suelen formar parte del flujo de conocimientos que se manejan usualmente en los procesos de formación básica de los desarrolladores e ingenieros de software, como son los que aparecen en el índice de este documento: el desarrollo de software bajo el paradigma de programación funcional, la documentación activa, la prueba de programas, la calidad del software o los procesos de integración continua. Más bien podemos entenderlo como un texto que intenta servir como transmisor de conocimiento experto desde quienes tienen años de experiencia profesional en el campo y se dirige hacia un amplio espectro de informáticos, tanto experimentados en otros saberes, como noveles en estos temas. En este sentido constituye una obra de valor en los ámbitos que le compete.
Espero y confío en que esta contribución sirva para los fines que se propusieron sus autores y resulte de utilidad para sus lectores.
Mario Hernández Catedrático de Universidad en Ciencias de la Computación e Inteligencia Artificial Las Palmas de Gran Canaria, octubre de 2012