Hace unos días, un ayudante de Algoritmos 3 se quedó horririzado al ver mi remera de Syn/Ack: claro se veían desde lejos los GOTOs típicos del código de kernel. Le expliqué que eran necesarios y que mejoraban la claridad del código, y hasta confesé que los he usado en situaciones especiales, el tipo de argumentos visto en lkml; por supuesto que no lo convencí ni un poquito.

Hoy tuve una discusión similar con compañeros de trabajo, horrorizados porque usaba break para salir de un while, en vez de usar un flag que determine la salida en la próxima iteración. El argumento era que eso está mal en un paradigma de programación orientada a objetos (?), lo que creo que muestra lo peor de la universidad, imponiendo dogmas y no sentido crítico. Por supuesto que nadie se queja de los return prematuros, que son la misma cosa.

Para refutarme, mencionaron al goto como otra cosa que "está ahí, pero no hay que usarla porque es mala, mala, mala". Mi defensa del vapuleado goto los dejó incrédulos de mi ignorancia. Todo esto me hizo ponerme a buscar la opinión de otra gente, y sobre todo, la de los Grandes Maestros.

Terminé leyendo artículos de los 60 y 70, en especial algunas cosas de Donald Knuth y Edsgar W. Dijsktra, que resistieron muy bien el paso del tiempo.

Empecé por buscar el famoso artículo con el cual se inicia todo ataque contra el goto: Go To Statement Considered Harmful -del cual Dijkstra no parecía estar muy contento, a pesar de ser una de los bases de la creación de la programación estructurada (término inventado por él)-. Vuelto a leer, junto con las críticas que recibió y notas posteriores, es razonable en su contexto y -por sobre todo- no me parece dogmático. Creo que el dogma se fue formando a su alrededor, echándole toda la culpa a la herramienta, cuando el problema eran los programadores mediocres; llevando al goto al infierno mismo de la ciencia de la computación.

Buscando otros puntos de vista, me hallé con un artículo de Knuth publicado en el '74 que parece que el mismo Dijkstra recibió bien: Structured Programming with Goto Statements. En él, Knuth hace una defensa razonable y sustentada de la instrucción del pecado, además de escribir la tan citada frase (que en realidad es de Hoare) "We should forget about small efficiencies, say about 97%25 of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%25."

Después de haber "perdido" unas cuantas horas de mi vida leyendo todo esto, me enteré un poco sobre este Holandés tan particular, del que todos podemos aprender bastante. Al viejo Knuth hace rato que lo tengo en el pedestal... Sería bueno que aprendiésemos más de esta gente en la facultad y que hubiese más discusión, pero no veo mayor interés. Al fin y al cabo, uno puede terminar poniendo gotos en un trabajo práctico y justificándo su uso...

Como yapa, siguen algunas citas memorables de Dijkstra que encontré. Esta es para los que van atrás del último grito de la moda:

Testing is a very inefficient way of convincing oneself of the correctness of a program.

Otra:

I mean, if 10 years from now, when you are doing something quick and dirty, you suddenly visualize that I am looking over your shoulders and say to yourself, “Dijkstra would not have liked this”, well that would be enough immortality for me.

Un comentario sobre Dikstra, encontrado acá:

Dijkstra's life in the deeper sense was spent in the pursuit of making people think. Making people think through a problem before they put pen to paper. He was popular, but his students sometimes disliked him as much as they--grudgingly one would think-- respected him, because he insisted on handwritten papers and would not accept output from a word processor. His reasoning: by the number of corrections he could see if the person was thinking before they wrote, something he considered an essential skill in programming. So he lived what he taught, and made his students do the same.