La programación como un Arte (Parte II)
La programación de computadores como un arte
Por Donald Knuth
(lee la primera parte)
Ciencia versus Arte
La palabra “ciencia” parece haber sido usada por muchos años en el mismo sentido que “arte”; por ejemplo, la gente hablaba también de las siete ciencias liberales, que eran las mismas siete artes liberales. Duns Scotus en el siglo trece llamaba a la lógica “la ciencia de las ciencias, y el arte de los artes”. Como la civilización y la enseñanza se desarrollaron, las palabras tomaron más y más sentidos independientes, “ciencia” se empezó a usar para el conocimiento, y “arte” para la aplicación del conocimiento. Luego, la ciencia de la astronomía era la base para el arte de la navegación. La situación era casi exactamente como la manera en que nosotros ahora distinguimos entre “ciencia” e “ingeniería”.
Muchos autores escribieron sobre las relaciones entre arte y ciencia en
el siglo diecinueve, y creo que la mejor discusión fue dada por John
Stuart Mill. El dijo lo siguiente, entre otras cosas, en 1844: “Muchas
ciencias son necesarias a menud para el trabajo básico de un único arte.
Tal es la complicación de los asuntos humanos, que para permitir que una
cosa sea hecha, es un requisito a menudo necesario saber la naturaleza y
las propiedades de muchas cosas... El arte en general consiste de las
verdades de la ciencia, dispuestas en el orden más convieniente para la
práctica, en lugar de el orden que sea más conveniente para el
pensamiento. La Ciencia agrupa y ordena sus verdades de modo que nos
permite tomar en una vista tanto como sea posible del orden general del
universo. El arte... junta partes de el campo de la ciencia las más
remotas unas de otras, las verdades relacionadas a la producción de las
condiciones diferentes y heterogeneas necesarias para que tengan efecto
con las exigencias que la vida práctica requiere.”
Mientras buscaba estas cosas sobre el significado de “arte”, encontré que los autores han estado pidiendo la transición de arte a ciencie por al menos dos siglos. Por ejemplo, el prefacio de un libro de texto sobre mineralogía, escrito en 1784, dice lo siguiente: “Antes del año 1780, la minerología, aunque tolerablemente entendida por muchos como un Arte, apenas puede ser llamada una Ciencia.”
De acuerdo a muchos diccionarios “ciencia” significa conocimiento que ha sido lógicamente dispuesto y sistematizado en la forma general de “leyes”. La ventaja de la ciencia es que nos alivia de la necesidad de pensar sobre cada caso individual; podemos llevar nuestros pensamientos a conceptos de más alto nivel. Como John Ruskin escribió en 1853: “El trabajo de la ciencia es sustituir hechos por apariencias, y demostraciones por impresiones.”
Me parece que si los autores que estudié estuvieran escribiendo hoy, estarían de acuerdo con la siguiente caracterización: La Ciencia es conocimiento que entendemos tan bien que se lo podemos enseñar a un computador, y si no podemos entender algo completamente, es un arte tratar con él. Dado que la noción de un algoritmo o programa de computador nos provee de una prueba extremadamente útil de la profundidad de nuestro conocimiento sobre un asunto dado, el proceso de ir desde un arte a una ciencia significa que aprendemos cómo automatizar algo.
La inteligencia artificial ha hecho progresos significativos, pero aún hay una brecha enorme entre lo que los computadores pueden hacer en el futuro previsible y lo que las personas comunes pueden hacer. Las misteriosas ideas que la gente tiene al hablar, escuchar, crear, e incluso cuando están programando, siguen estando fuera del alcance de la ciencia y casi todo lo que hacemos es todavía un arte.
Desde este punto de vista ciertamente es deseable hacer una ciencia de
la programación de computadores, y de hecho hemos recorrido un largo
camino en los 15 años transcurridos desde la publicación de las
observaciones que he citado al comienzo de esta charla. Hace quince años
la programación de computadores estaba tan mal entendida que
difícilmente alguien aún pensaba sobre probar que los programas fueran
correctos, nosotros sólo jugabamos con nuestro programa hasta que
“sabíamos” que funcionaba. En esa época no sabíamos siquiera cómo
expresar el concepto de que un programa fuera correcto, de una manera
rigurosa. Sólo en los últimos años hemos estado aprendiendo acerca de
los procesos de abstracción mediante los cuales los programas se
escriben y entienden,
y este nuevo conocimiento acerca de la programación está produciendo
grandes ganancias en la práctica, aunque pocos programa son realmente
probados cómo correctos con completo rigor, dado que estamos recién
empezando a comprender los principios de la estructura de los programas.
El punto es que cuando es que cuando escribimos programas hoy en día,
sabemos que podríamos, en principio, construir pruebas formales de su
corrección si quisieramos, ahora que sabemos cómo se formulan tales
pruebas.
Esta base científica se traduce en programas que son mucho más fiables
que los que se escribieron en tiempos pasados, cuando la intuición era
la única base de la corrección.
El campo de la “programación automática” es una de las mayores áreas
de la investigación en inteligencia artificial hoy. A sus defensores les
gustaría dar una charla titulada “La Programación de Computadores como
un Artefacto” (lo que significa que la programación se ha convertido en
una reliquia del pasado), porque su objetivo es crear máquinas que
escriben programas mejor de lo que podemos, dándoles sólo la
especificación del problema.
Personalmente no creo que tal meta sea alguna vez alcanzada
completamente,
pero pienso que e
sta investigación es extremadamente importante, porque todo lo que
aprendamos sobre programación nos ayuda a mejorar nuestro propio arte.
En este sentido, deberíamos esforzarnos continuamente para transformar
todo arte en una ciencia: en el proceso, avanzamos el arte.