La programación como un Arte (Parte V y final)

La programación de computadores como un arte

Por Donald Knuth, 1974

(Lee las partes I, II, III y IV)

Menos Facilidades: Más Diversión

Una cosa bastante curiosa que he notado sobre la satisfacción estética es que nuestro placer es significativamente mayor cuando logramos algo con herramientas limitadas. Por ejemplo, el programa del que personalmente estoy muy contento y orgulloso es un compilador de que una vez escribí para una minicomputadora primitiva, que sólo tenía 4096 palabras de memoria, 16 bits por palabra. Una persona se siente como un virtuoso real al lograr algo con tan severas restricciones.

Un fenómeno similar ocurre en muchos otros contextos. Por ejemplo, las personas parecen más a menudo enamorarse de su Volkswagen, pero rara vez con su Continental Lincoln (que probablemente funcionen mucho mejor). Cuando aprendí programación, era un pasatiempo popular hacer todo lo posible con programas que cupieran sólo en una tarjeta perforada. Supongo que es el mismo fenómeno que hace que los entusiastas de APL gocen con sus "one-liners". Cuando enseñamos a la programación hoy en día, es curioso el hecho de que rara vez se captura el corazón de un estudiante de ciencias de la computación hasta que ha tomado un curso que le permite "meter las manos" y ganar experiencia con un miniordenador. El uso de nuestras máquinas a gran escala con sus sistemas operativos y lenguajes de fantasía en realidad no parece generar ningún amor por la programación, por lo menos no al principio.

No está claro cómo aplicar este principio para aumentar el disfrute de los programadores en su trabajo. Seguramente los programadores gruñrán si su administrador de repente les anuncia que la nueva máquina tendrá sólo la mitad de memoria que la antigua. Y yo no creo que nadie, ni siquiera los más dedicados "artistas de programación", vayan a dar la bienvenida a esta perspectiva, ya que a nadie le gusta perder las instalaciones de manera innecesaria. Otro ejemplo puede ayudar a aclarar la situación: Los cineastas se opusieron firmemente a la introducción del cine sonoro en la década de 1920 porque estaban orgullosos de la forma en que podían transmitir palabras sin sonido. Del mismo modo, un artista de programación bien podría resentirse de la introducción de equipos más poderosos, los dispositivos de almacenamiento masivo de hoy en día suelen echar a perder gran parte de la belleza de nuestros viejos métodos de ordenamiento en cintas. Pero los cineastas de hoy no quieren volver a las películas mudas, no porque sean perezosos, sino porque saben que es muy posible hacer películas bellas utilizando tecnología mejorada. La forma de su arte ha cambiado, pero todavía hay mucho espacio para el arte.

¿Cómo desarrollaron estas habilidades? Los mejores realizadores de películas a través de los años por lo general parecen haber aprendido su arte en relativamente primitivas circunstancias, a menudo en países con una industria cinematográfica limitada. Y en años recientes las cosas más importantes que hemos estado aprendiendo sobre programación parecen tener su origen en personas que no tienen acceso a computadores muy grandes. La moraleja de esta historia, me parece, es que debemos hacer uso de la idea de recursos limitados en nuestra propia educación. Todos podemos beneficiarnos de hacer de vez en cuando "programas de juguete", cuando las restricciones artificiales se establecen, de manera que nos vemos obligados a impulsar nuestra capacidad hasta el límite. No debemos vivir en el regazo del lujo todo el tiempo, ya que que tiende a ponernos letárgicos. El arte de la lucha contra los mini problemas con toda nuestra energía va a agudizar nuestro talento para los problemas reales, y los la experiencia nos ayudará a obtener más placer de nuestros logros en equipos menos restringidos.

En una vena similar, no debemos eludir "el arte por el arte", no debemos sentirnos culpables por los programas que son sólo para divertirse. Una vez logre un gran placer alescribir un programa de ALGOL de un sóla sentencia que invocaba un procedimiento de product interno de una manera tan inusual que calculaba el m-ésimo número primo, en lugar de un producto interno. Hace algunos años los estudiantes de Stanford estaban entusiasmados por encontrar el programa más corto en FORTRAN que se imprimiera a sí mismo, en el sentido de que la salida del programa es idéntico al texto de su propia fuente. El mismo problema fue considerado para muchos otros lenguajes. No creo que fuera una pérdida de tiempo para que puedan trabajar en esto, ni que Jeremy Bentham, a quien ya he citado antes, negará la "utilidad" de tales pasatiempos. "Por el contrario," él escribió, "no hay utilidad de que sea más incontestable. ¿En qué se da el carácter de una utilidad, si no es una fuente de placer?

Proveyendo Herramientas Hermosas

Otra característica del arte moderno es su énfasis en la creatividad. Parece que muchos artistas hoy en día no parece importarle tanto la creación de cosas bellas; sólo la novedad de una idea es lo importante. No estoy recomendando que la programación de computadoras deba ser como el arte moderno en este sentido, pero me lleva a una observación que me parece importante. A veces nos asignan una tarea de programación que es casi irremediablemente aburrida, lo que no nos exige en absoluto nada de creatividad, y en esos momentos las personas suelen venir a mí y me dicen: "¿Así que la programación es hermosa? Está muy bien para que usted daclame que uno debería tener el placer de la creación de programas elegantes y encantadores, pero ¿cómo se supone que voy a hacer de este desastre una obra de arte? "

Bueno, es cierto, no todas las tareas de programación van a ser divertidas. Tengan en cuenta a la "ama de casa atrapada", que tiene que limpiar la misma mesa cada día: no hay espacio para la creatividad o el arte en cada situación. Pero incluso en esos casos, hay una manera de hacer una gran mejora: todavía es un placer hacer trabajos de rutina, si tenemos cosas bellas para trabajar. Por ejemplo, una persona puede realmente disfrutar el limpiar la mesa del comedor, día tras día, si es una mesa hermosamente diseñada, a partir de madera de fina calidad.

Por lo tanto, quiero dirigir mis palabras de clausura a los programadores de sistemas y los diseñadores de máquinas que producen los sistemas conque el resto de nosotros debe trabajar. Por favor, déjenos herramientas que sean un placer de usar, especialmente para nuestras tareas de rutina, en lugar de ofrecer algo con lo que tengamos que luchar. Por favor, déjenos herramientas que nos animen a escribir mejor los programas, mediante la mejora de nuestro placer cuando lo hacemos.

Es muy dificil para mí convencer a jóvenes universitarios de que la programación es hermosa, cuando tengo que decirles que es como "slash slash JOB es igual a esto y esto." Aún los lenguajes de control pueden ser diseñados de modo que sea un placer usarlos, en vez de ser estrictamente funcionales.

Los diseñadores de hardware de computador pueden hacer que sus máquinas sean mucho más agradables de utilizar, por ejemplo, proporcionando aritmética de coma flotante que cumpla las leyes matemáticas simples. Las instalaciones disponibles en la actualidad en la mayoría de las máquinas hacen el trabajo de análisis de errores de manera rigurosa e irremediablemente difícil, pero las operaciones de diseño adecuado sería alentar a los analistas numéricos que proporcionaran una mejor subrutinas que hayan certificado la exactitud.

Vamos a considerar también lo que los diseñadores de software pueden hacer. Una de las mejores maneras de mantener arriba el espíritu de un usuario del sistema es proporcionar las rutinas con las que se pueda interactuar. No debemos hacer que los sistemas sean demasiado automáticos, por lo que la acción va siempre detrás de las escenas, debemos dar el programador-usuario la oportunidad de dirigir su creatividad hacia canales útiles. Una cosa que todos los programadores tienen en común es que les gusta trabajar con las máquinas, así que vamos a mantengámoslo en el ciclo. Algunas de las tareas se hacen mejor con la máquina, mientras que otros se hacen mejor con la supervisión humana, y en un sistema bien diseñado se encuentra el equilibrio adecuado. (He estado tratando de evitar la automatización mal dirigida durante muchos años.)

Programar instrumentos de medición es un buen caso de ejemplo. Durante años, los programadores han sido inconscientes de cómo los costos reales de computación se distribuyen en sus programas. La experiencia indica que casi todo el mundo tiene una idea equivocada acerca de los verdaderos cuellos de botella en sus programas, no es de extrañar que los intentos de mejorar la eficiencia vayan mal tan a menudo, cuando a un programador no se le da un desglose de los gastos de acuerdo a las líneas de código que ha escrito. Su trabajo es algo así como la de una pareja de recién casados que intentan planificar un presupuesto equilibrado sin saber cuales serán los costos de los elementos individuales, como alimentos, vivienda y ropa. Todo lo que hemos estado dando a los programadores es un compilador de optimización, que misteriosamente hace algo a los programas que se traduce, pero que nunca explica lo que hace. Afortunadamente ahora estamos finalmente viendo la aparición de sistemas que le dan el crédito de usuario para una cierta inteligencia, sino que proporciona automáticamente la instrumentación de programas y la información apropiada sobre los costos reales. Estos sistemas experimentales han sido un gran éxito, ya que producen mejoras mensurables, y sobre todo porque es divertido de usar, así que confío en que es sólo cuestión de tiempo antes de que el uso de estos sistemas sea un procedimiento operativo estándar. Mi artículo en Computer Survey discute esto aún más, y presenta algunas ideas para otras formas en que una rutina interactiva apropiada puede mejorar la satisfacción de los programadores usuarios.

Los diseñadores del lenguaje también tienen la obligación de proporcionar los lenguajes que fomenten un buen estilo, ya que todos sabemos que el estilo es fuertemente influenciado por el lenguaje en el que se expresa. La oleada actual de interés en la programación estructurada ha puesto de manifiesto que ninguno de nuestros lenguajes existentes es realmente idóneo para abordar el programa y la estructura de datos, ni tampoco está claro como debe ser un lenguaje ideal. Por lo tanto, espero que muchos hagan experimentos cuidadosos en el diseño el lenguaje durante los próximos años.

Resumen

En resumen, hemos visto que la programación de computadoras es un arte, porque se aplica el conocimiento acumulado en el mundo, porque requiere habilidad e ingenio, y especialmente, debido a que produce objetos hermosos. Un programador que inconscientemente, se ve a sí mismo como un artista disfrutará de lo que hace y lo hará mejor. Por lo tanto, podemos alegrarnos de que la gente que da charla en las conferencias de computación hable sobre estado del arte.

Autor

Ingeniero, autor, emprendedor y apasionado programador. Mantengo este blog desde 2005.

comments powered by Disqus
Siguiente
Anterior

Relacionado

¿Te gustó?

Puedes apoyar mi trabajo en Patreon:

O puedes apoyarme con un café.