Etiquetas
beatiful code, brevedad, familiaridad, flexibilidad, simplicidad
Hace unos días fui a poner en la estantería el libro Beatiful Code y se abrió en un capítulo llamado Treating Code As an Essay, de Yukihiro Matsumoto. Enseguida me llamó la atención el título, no sé cómo se me pudo haber pasado ese capítulo.
Mis alumnos de informática pueden atestiguar que no aprueban las prácticas sin el código bien sangrado y «legible» (también hablé de ese tema varias veces en mi blog, últimamente en Belleza, fealdad y complejidad o Colega, let’s see the code). Les doy el coñazo que no inventamos lenguajes para facilitar el trabajo de las máquinas, sino el de los humanos, los programadores.
Por otro lado en la asignatura –de libre configuración– Seducciones de la Informática les pido como trabajo final un ensayo, en la definición e idea original de Montaigne.
Volviendo al tema del capítuo. Cuando lo ví no tenía tiempo, estaba saliendo de viaje, pero hoy me acordé y lo leí. El primer párrafo dice:
Los programas comparten algunos atributos con los ensayos. La cuestión más importante para los ensayos es «¿de qué se trata?». Para los programas la fundamental es «¿qué hace?». De hecho el propósito debe ser lo suficientemente claro para evitar que siquiera nos formulemos esas preguntas. No obstante, para los ensayos y programas, es siempre importante prestar atención a cómo está escrito cada uno. Aún si la idea es buena, será difícil transmitirla a la audiencia deseada si es difícil de entender. El estilo en el que están escritos es tan importante como su propósito. Ambos, ensayos y líneas de código, existen –antes que nada– para ser leídos e interpretados por seres humanos.
Yikihiro luego explica los aspectos que considera más relevantes para los programas. Aunque los explica para justificar el diseño de Ruby, pueden servir como regla general (especialmente, para mi gusto, la primera y tercera):
- Brevedad: La brevedad es una virtud, definitivamente hay un coste de lectura para el ojo humano, el código debe eliminar la información redundante [*]
- Familiaridad: Las personas son más conservadoras de lo que pensamos. Las curvas de apredizaje elevadas crean estrés y reducen productividad. Un lenguaje no debe oblighar a los progamadores a trabajar con conceptos nuevos y complejos. No ser demasiado innovador es también una ayuda para el «código bello».
- Simplicidad: Si un programa es complicado de entender no puede tener belleza.
- Flexibilidad: Lo define como la «libertad de los hábitos forzados por las herramientas». Cuando un programador es forzado a hacer algo en contra de suis inenciones se genera más estrés, lo que afecta negativamente al programador.
- Balance: Ninguno de los elementos anteriores hará que el código sea bello, sino un adecuado balance entre ellos.
[*] Como contraste de brevedad muestra el siguiente código para el «Hola mundo»:
Java:
class Sample {} public static void main(String[] argv) { System.out.println("Hola mundo") }
Y luego la siguiente línea que hace exactamente lo mismo funciona igual en Ruby, Perl, PHP y Python (en Python es aún más breve, no hace falta el \n):
print "Hola mundo\n"
Unas pocas páginas más adelante del capítulo mencionado hay otro, Code in Motion, hacen referencia a otro ensayo Seven Pillars of Pretty Code, que da unos parámetros relacionados:
- Fusión: El estilo del código nuevo debe ser similar al ya existente. No debe notarse la diferencia entre ambos.
- Estilo libro: Hay que mantener las columnas limitadas ya que exigen un esfuerzo de desplazamiento de los ojos. La primera parte debe mantener la estructura fundamental, la derecha los detalles. Si una línea es muy larga se puede hacer nombres más cortos, agrupar por similaridad (pro ejemplo separando argumentos por líneas).
- Separar bloques: Separar los bloques lógicos en cada función, así se facilita la lectura más rápida y en «diagonal».
- …
Hace poco que tengo este libro, a ver si en verano me pongo con él…
Estoy de acuerdo en muchos puntos, pero no en todos. Todo lo anterior vale para programas en los que no haya «secciones críticas» (me vienen a la cabezas todos los sitemas de tiempo real) en los que el código «bonito» no tiene que ser la prioridad sino la «velocidad».
Otro ejemplo son los algoritmos más o menos «ofuscados» que son infinitamente más eficientes que otros más simples. Si no conoces el algoritmo de forma teórica te parecerá un galimatías increible (por muy bien escrito el código que este)
Coincido contigo en tu opinión. Dejemos que los compiladores hagan su trabajo y si no queda más remedio que generar código poco legible, no cuesta nada poner un comentario que ayude a su comprensión, pero siempre bajo la máxima de que la mejor documentación comienza (no «es», que es lo que dicen algunos) con un código bien escrito.
Por aportar algo y para complementar tu comentario de pasada sobre Montaigne, aprovecho este artículo tuyo para «divulgar» uno de Paul Graham que me parece imprescindible (supongo que ya conoces su blog, pero si no, te lo recomiendo, pues no tiene desperdicio (estés de acuerdo con él en sus opiniones, o no)). El artículo en cuestión es:
The Age Of The Essay ( http://www.paulgraham.com/essay.html ).
Saludos y gracias por escribir cosas que, estando de acuerdo contigo, o no, invitan a usar esa cosa viscosa que habita en nuestra cabeza.
Hace tiempo leí The Tao Of Programming (http://www.canonical.org/~kragen/tao-of-programming.html)
Hay una parte que dice: \»A well-written program is its own heaven; a poorly-written program is its own hell.\»
Siempre supuse que la frase se refería a la indentacion y no solo al codigo
Knuth y otros llevan algún tiempo proponiendo el ‘literate programming’, que no se si será lo mismo por que no lo he mirado en profundidad, pero lo poco que he visto se parece bastante a la propuesta de ‘escribir código para que lo lean las personas’.
Pingback: Programar y escribir para la web: no tan diferentes / Blog (artículos) // jordisan.net