April 11, 2019

A Philosophy of Software Design

Durante las últimas semanas he estado leyendo este maravilloso libro escrito por John Ousterhout y me gustaría compartir algunas conclusiones que he podido extraer tras su lectura.

Lo primero, es que el libro me ha parecido un contrapunto muy interesante a Clean Code. Básicamente, ambos presentan estrategias para reducir la complejidad en el diseño, desarrollo y mantenimiento de software (y la complejidad es un término sobre el que se discute largo y tendido en A Philosophy of Software Design) pero lo hacen, bajo mi punto de vista, desde dos ópticas diferentes.

Robert C. Martin (y mucha de la literatura que hay por ahí fuera) pone el foco especialmente en reglas y principios: tamaño de las entidades (¡funciones de menos de 10 líneas!), el número de responsabilidades de una abstracción, código sobre documentación, evitar duplicidades, etc. Sin embargo, en A Philosophy of Software Design nos encontramos un par de capítulos dedicados en exclusiva al “arte” de escribir buenos comentarios y a las ventajas de invertir tiempo en expresar, a través de los mismos, aspectos relacionados con el diseño de software que son prácticamente imposibles de describir utilizando únicamente código (por ejemplo, el conocimiento del dominio que nos lleva a aplicar ciertos patrones o arquitecturas, workarounds para lidiar con known issues, etc).

De todos, el capítulo 10: Define Errors Out Of Existence, me ha parecido una delicia, y creo que introduce conceptos muy interesantes para lidiar con los casos esquina y errores de cualquier aplicación.

Del mismo modo, algunos pasajes hablando sobre la ventaja de definir abstracciones “profundas” (deep) en lugar de “planas” (shallow) ilustran bastante bien los problemas de llevar técnicas de Clean Code al extremo, sin aplicar un buen criterio.

Creo que la lectura de este libro me ha servido para adoptar un enfoque más pragmático a la hora de escribir código, alejado de dogmatismos y poniendo el foco en lo que realmente importa, tratar de reducir al máximo la complejidad de nuestras soluciones (lo que implícitamente nos llevará también a la aplicación de buenas prácticas de diseño).