A Philosophy of Software Design: el Clean Code modern?
BettaTech revisa el llibre de John Ousterhout i les seves idees per reduir complexitat, crear mòduls profunds i dissenyar millor el programari.
Quin llibre recomanaries avui a una persona que vol escriure programari fàcil de mantenir? Durant anys, una resposta gairebé automàtica ha estat Clean Code, de Robert C. Martin. BettaTech proposa una alternativa més recent i menys dogmàtica: A Philosophy of Software Design, del professor de Stanford John Ousterhout.
El vídeo no presenta el llibre com una col·lecció de normes mecàniques. El seu atractiu és un marc per pensar: la qualitat del disseny depèn sobretot de com es gestiona la complexitat. Aquesta mirada permet discutir mòduls, interfícies, abstraccions, comentaris i deute tècnic sense reduir el problema a la mida d’una funció o a un estil concret de programació.
Un llibre curt per a un problema molt gran
A 00:00, BettaTech identifica el llibre i situa el seu autor. Ousterhout és professor de ciències de la computació a Stanford i ha treballat tant en recerca com en empreses tecnològiques. Aquesta doble experiència es nota en una obra que evita receptes dependents d’un llenguatge i intenta formular principis aplicables a sistemes reals.
La pàgina oficial del llibre explica que la segona edició va aparèixer el 2021. Entre els canvis hi ha un capítol dedicat a decidir què és important i una defensa ampliada dels mòduls d’ús general. El volum és relativament breu, però demana una lectura activa: cada principi s’ha de contrastar amb el codi i les decisions d’arquitectura del lector.
Al 00:48, el vídeo remarca precisament aquesta utilitat pràctica. No és un manual per copiar patrons, sinó una manera d’adquirir vocabulari per detectar males decisions abans que s’escampin per tot el sistema.
La complexitat és l’enemic central
La tesi apareix a 00:48: el principal obstacle del desenvolupament de programari és la complexitat. Ousterhout la defineix, en essència, com qualsevol element de l’estructura que fa difícil entendre o modificar un sistema. Les notes del seu curs de disseny assenyalen tres símptomes: una modificació obliga a tocar molts llocs, la càrrega cognitiva és elevada i existeixen dependències que el programador ni tan sols sap que hauria de buscar.
Aquesta definició és útil perquè desplaça el debat. El codi no és bo perquè compleixi una llista de convencions, sinó perquè permet efectuar canvis amb una comprensió raonable i un risc controlat. Una funció de cinc línies pot augmentar la complexitat si obliga a saltar entre moltes capes; una classe més gran pot reduir-la si amaga detalls i ofereix una interfície coherent.
BettaTech subratlla a 03:13 que la complexitat s’acumula gradualment. Cada drecera sembla insignificant, però centenars de decisions locals converteixen una base de codi en un sistema que ningú no s’atreveix a modificar. Per això el disseny no és una fase inicial que s’acaba: és una activitat contínua.
Programació tàctica i programació estratègica
Al 02:30, apareix una de les distincions més memorables del llibre. La programació tàctica busca que la funcionalitat d’avui funcioni tan aviat com sigui possible. La programació estratègica reserva una part del temps per millorar l’estructura i facilitar els canvis de demà.
La primera actitud és temptadora perquè produeix resultats visibles. El problema arriba quan cada entrega afegeix excepcions, duplicació i dependències. L’equip manté la velocitat unes setmanes, però després qualsevol canvi costa més. La segona actitud no significa perseguir una arquitectura perfecta ni ajornar indefinidament el producte. Significa invertir deliberadament en disseny mentre encara és barat.
A 03:13, la ressenya converteix aquesta idea en una pregunta d’equip: quant esforç estem disposats a dedicar ara per evitar una càrrega repetida durant anys? La resposta depèn de la vida esperada del programari, però ignorar la pregunta ja és una decisió —i acostuma a ser la més cara.
Mòduls profunds i interfícies petites
Ousterhout defensa els “mòduls profunds”: components que amaguen molta funcionalitat darrere d’una interfície senzilla. BettaTech ho explica a 05:50. La metàfora és geomètrica: la superfície representa el que l’usuari del mòdul ha d’aprendre; la profunditat, tot el treball que el component resol internament.
Un mòdul superficial fa el contrari. Exposa moltes opcions, obliga a entendre detalls interns i, tot i així, aporta poca funcionalitat. Dividir-lo en peces encara més petites pot empitjorar el resultat si el consumidor ha de conèixer l’ordre exacte de les crides i coordinar estats que haurien d’estar encapsulats.
Les notes de Stanford sobre abstraccions resumeixen l’objectiu com obtenir la mínima superfície per al màxim volum. A 06:59, el vídeo relaciona aquest principi amb l’ocultació d’informació: decisions susceptibles de canviar —formats, algoritmes, estructures de dades o regles de validació— han de quedar concentrades dins un límit clar.
En què discrepa de Clean Code
La comparació central arriba a 06:13. Clean Code va popularitzar funcions petites, noms expressius i la idea que el codi hauria d’explicar-se gairebé sol. Ousterhout coincideix en la importància de la claredat, però adverteix que fragmentar per sistema pot augmentar la càrrega cognitiva. Llegir vint funcions diminutes no és necessàriament més fàcil que entendre una operació cohesionada.
El cas pràctic comença a 07:45. En una API feta amb Express, funcions que haurien de representar el domini rebien directament l’objecte de la petició HTTP. Això filtrava detalls del transport cap a una capa que no els necessitava. Al 08:27, explica la conseqüència: canviar Express per esdeveniments, una CLI o un altre mecanisme obligava a reescriure lògica de negoci. La qualitat del disseny es revela, així, en les dependències que una modificació força a conèixer.
Ousterhout i Robert C. Martin van publicar després una discussió directa sobre les diferències entre els dos llibres. El diàleg confirma que no són visions totalment incompatibles. Comparteixen l’objectiu de produir programari comprensible, però prioritzen de manera diferent la descomposició, els comentaris, el desenvolupament guiat per proves i el moment de dissenyar.
Conclusions
A 09:16, la ressenya conclou que A Philosophy of Software Design és especialment valuós perquè obliga a justificar cada decisió. En lloc de dir “una funció ha de ser curta”, pregunta si la separació redueix la informació que cal tenir al cap. En lloc de jutjar una capa pel patró que utilitza, mesura quanta informació obliga a retenir per completar una tasca.
No és un substitut universal de Clean Code, ni una nova bíblia. És un contrapunt útil contra l’aplicació automàtica de regles. El consell més transferible és observar el cost de cada canvi: quants fitxers s’han de tocar, quantes dependències s’han de recordar i quantes sorpreses apareixen.
Al 10:00, BettaTech recomana la lectura com una eina per millorar el criteri. Aquesta és probablement la millor definició d’un llibre modern sobre disseny de programari. Les tecnologies canvien, però la necessitat de construir abstraccions profundes, limitar dependències i reservar temps per pensar continua intacta.
Contrast i context
Fonts consultades
-
01
BettaTech ¿Es este libro el Clean Code Moderno?
-
02
Stanford University A Philosophy of Software Design
-
03
Stanford University CS 190: Introduction and complexity
-
04
John Ousterhout i Robert C. Martin A Philosophy of Software Design vs. Clean Code
Font de treball
Transcripció amb marques de temps
Consulta la transcripció
-
0:00
, obre el vídeo en una pestanya nova
Hay libros que te enseñan a escribir código y hay libros que te enseñan a pensar mejor. Y si tuviera que escoger solamente un libro de esta segunda categoría, escogería a filosofi of software design, de John Osterhoud. El libro que yo considero el sucesor spiritual de clean code. Bienvenido la serie del club de lectura con Betatek, una serie en la que analizamos libras técnicos y resumimos sus ideas principales. Y en este vídeo, te voy a hablar de complejidad y modularización. En resumen, de cómo hacer un mejor diseño de software. Y es que este libro es muy bueno explicando alto nivel que es todo esto de la complejidad, ¿qué hace que un software sea complejo y difícil de mantener con diferentes ejemplos y diferentes maneras de detectar? cuando estás haciendo algo incorrecto. En el oco conductor de todo el libro
-
0:48
, obre el vídeo en una pestanya nova
es que es el objetivo que tenemos nosotros como desarrolladores, es hacer software poco complejo, es decir, reducir la dificultad para entender un código. de hecho, en el libro se define la complejidad de la siguiente manera. La complejidad es lo que un desarrollador experimenta cuando en un punto del tiempo está intentando conseguir un objetivo. Lo que intenta yo es distinguir la complejidad tal como la entendemos como un mente, que sería pues tener un sistema grande, con un montón de ficheros, con un montón de funcionalidades, cuando en realidad un proyecto muy grande puede no tener complejidad siempre y cuando sea fácil trabajar en él. Es por ello que yo ofrece una definición alternativa a modo de fórmula matemática. La complejidad de un sistema C se determina por la complejidad de cada parte, pondérada por la fracción del tiempo que los
-
1:37
, obre el vídeo en una pestanya nova
desarrolladores gastan trabajando en esa parte. Básicamente si sumamos todas estas complejidades tenemos la complejidad total del sistema. La C es decir, si nosotros eliminamos el tiempo que un desarrollador está trabajando en estas partes que tienen complejidad virtualmente es como si estuvieramos eliminando la complejidad del sistema. Es por esto que la idea de este libro es tan interesante. En resumen, plantear un dicino de software que haga que no tengas que trabajar ni tocar la complejidad hace que, virtualmente, sea mucho menos complejo trabajar en ese proyecto. Aunque por debajo tengo un montón de algoritmos superdaros, tengo un montón de funcionalidades super extrañas, pero si están muy bien aisladas y no tienes que tocarlas, a la práctica no existen. Y para conseguir esto, en este libro se hace muchísimo enfasis en los dos tipos de pensamiento que tenemos la gente que
-
2:30
, obre el vídeo en una pestanya nova
trabaja en desarrollo de software, que es el trabajar de manera estratégica o el trabajar de manera táctica. Y de hecho, yo he dicho textualmente que este es uno de los elementos más importantes para el diseño de buen software, la mentalidad. La mentalidad táctica sería esa mentalidad en la que tú desarrollas software simplemente para que funcionen. Hoy en día eso es super común y más con el auge de la inteligencia artificial en el que a la que funciona, ya no te preocupas de nada más. El problema que describe Jones sobre esta metodología, sobre esta mentalidad de trabajo, es que es muy corto plazista. Es decir, estas intentando apagar los juegos que tienen entendidos en cada momento, pero no estás planteando un sistema que realmente soporte a los ingenios. O incluso que no se pueda incendiar. Según este libro, esta
-
3:13
, obre el vídeo en una pestanya nova
es la causa de que los sistemas cada vez se vaya volviendo más complejos y más difíciles de manera. que no pensamos de una manera estratégica. El primer paso para pensar de manera estratégica es asumir que el código funciona no es suficiente. Hay que tener en cuenta también la estructura a largo plazo del proyecto. El libro dice de exoalmente, no deberías pensar en código funcional como tu principal objetivo. Tu principal objetivo debería ser producir un buen diseño que casualmente funciona. Eso sí, también tiene unos capítulos dedicados a... ¿Cuánto tenemos que invertir a pensar de manera estratégica? Teniendo en cuenta, pues, dificultades de entrega, gestes que nos están presionando o pues el tiempo que podemos tardar en tener algo para el mercado. Pero, argumentos sigue siendo el mismo. ¿Cuánto más programemos de manera estratégica más podremos mantener la velocidad de
-
4:04
, obre el vídeo en una pestanya nova
desarrollo a la ropa? En resumen, el libro no míega que si desarrollas de manera táctica, al principio va a seguir más rápido, porque no le digas tanto tiempo a plantear como tiene que lucir la estrategia futuro. Ahora bien, si desarrollas de manera estratégica preocupándote del diseño de software, a la larga vas a acabar siendo capaz de mantener un progreso mucho más rápido, porque no tendrás tanta complejidad, porque no tendrás tanta deuda técnica y por lo tanto podrás seguir entregando de una manera escalable. Ahora bien, hemos hablado de la complejidad y de la importancia de tener un buen diseño, pero como detecta realmente que estás haciendo un buen diseño o no? Pues en este libro también se algunas técnicas para que puedas detectar si estás haciendo malas asacciones o si tienes que invertir más tiempo en el pensamiento estratégico.
-
4:51
, obre el vídeo en una pestanya nova
De lo mostra. Una de las señales que te indica que estás añadiendo complejidad a tu software es lo que en el libro se denomina amplificación del cap. ¿Cuántas veces has tenido que hacer una implementación pequeña de algo? Lo que sea, en un sistema de vaco, en un sistema de fronten, ya se ha quedado teniendo que tocar. un montón de ficheros repartidos por un montón de carpetas. Esto lo que indica es que tu cambio se tiene que amplificar. Tienes que tocar un montón de piezas diferentes para poder aplicar esa nueva característica del producto o para regular ese book. Normalmente cuando ocurre algo así es sintoma de una de estas tres cosas. Obien tienes lógica duplicada que se podría refactorizar. Obien tienes dependencias que no están muy bien planteadas. Obien tienes información que se está filtra en los que están
-
5:39
, obre el vídeo en una pestanya nova
en los que
-
5:50
, obre el vídeo en una pestanya nova
están En el libro será preferencia a los modulos profundos con interpaces sencillas. Es decir, si yo tengo mucha complejidad o culta dentro de lo que sea una clase, la interfaz que luego se va a utilizar desde fuera de la clase para interactuar con esta complejidad tiene que ser sencillas. Lo que hemos dicho antes tenemos que ocultar la complejidad y no tener que dedicar tiempo
-
6:13
, obre el vídeo en una pestanya nova
a tocarla. Yo no os terjo a otras bastante insistentenes, el problema no es que una clase sea muy grande o sea muy pequeña. El problema es que tanta de la realidad está ocultando esa clase. Puedes tener una clase de miles de líneas que si es los miles de líneas, porque yo que sé es un algoritmo largísimo. oculta en la complejidad y simplifican la complejidad del sistema total porque te dan simplemente una pequeña función que tú puedes utilizar super simple eso ya sirve eso ya está eliminando y disminuyendo la dificultad de mantenimiento del código por eso a veces digo que este libro es el suceso espiritual de Kingcout precisamente porque esta explicación se parece un poquito a la explicación de la segregación de interfaces de los principios solitos Ahora bien, explicado de una forma mucho más aplicable, mucho más
-
6:59
, obre el vídeo en una pestanya nova
realista al desarrollo de su afuérmode. Entonces, de todo lo que estamos hablando, mientras vamos a ir en este libro, es de un concepto clave, el de ocultar información. Básicamente, explicado al ton nivel, decidir qué se muestra y qué no se muestra, es una de las decisiones clave que tenemos que hacer nosotros como desarrolladores cuando estamos diseñando su afuérmode. De hecho, el libro dice que es una de las decicciones que más impacto tiene sobre la mantenibilidad del código. Esplico porque, básicamente, ocultar información significa que los detalles importantes de la implementación de algo no se filtren. fuera del módulo. El objetivo de esto es que si yo tengo que modificar una decisión, por ejemplo, tengo que cambiar de implementación de una base de datos, tengo que cambiar cómo se hace una cuera y tengo que cambiar el protocolo que yo
-
7:45
, obre el vídeo en una pestanya nova
utilizo, pues cuando yo quedo hacer un cambio de este estilo, solamente tenga que hacerlo en un solo sitio. De te cuenta que esto se parece mucho cuando estamos hablando de los principios solitos, pero explicado de una manera mucho más adaptada al contexto actual. Y te veía comentar ahora un ejemplo de algo que yo me encontré que violaba directamente lo que se decía en este libro en un proyecto en el que trabajé hace unos años. Se trataba de un proyecto super sencillo era una ápico en Express, una ápica ATP con sus rutas, con sus peticiones, básicamente podíamos entenderlo como una especie de crud medio res. Lo que pasa es que teníamos toda la parte de Express. plantada y luego cuando nos íbamos a funcionar y ya de dominio es decir, funcionalidades dentro de nuestra propia aplicación. ¿Qué no tendrían
-
8:27
, obre el vídeo en una pestanya nova
por qué saber si se están ejecutando por RHDTP o si se están ejecutando con cualquier otra cosa? Pues en esta capa, que en teoría tenía que hacer abstracta, también le lanzábamos, le pasamos por parámetro, pues la recuest. de Express. Es decir, nuestras funciones de dominio tenían que conocer que se estaba utilizando htp, porque tenían que entrar a la ricoest, tenían que mirar los headers y en función de esa ciencia una sección es vuotras. Claramente, no estaba bien desacoplado, no había una buena modulación. Si yo quería cambiar Express, por otro tipo de transporte, por ejemplo, para utilizar mi proyecto como una celeí. o lanzar ciertas funciones mediante eventos, pues no lo podía hacer de una manera sencilla. Estaba todo super acoplado, es decir, no había una ocultación de información. Y esto también añadía un nuevo concepto que también se
-
9:16
, obre el vídeo en una pestanya nova
define en este libro a los desarrolladores, que es el concepto de carga cognitiva. Para tu poder trabajar de forma esficiente, para poder hacer un cambio, no vas a estar con entender el cambio que querías hacer a nivel de dominio. Tenía también que entender cómo estaba implementado. Si todo te llegaba de un gd, todo te llegaba a medio que sea un parámetro en el body de la petición en definitiva. Tenías que tener un montón de información en tu cabeza para poder hacer una tarea. Tenías mucha carga cognitiva. Imagínate un proyecto en el que simplemente para implementar una nueva característica, mira lo que quieres hacer, mira es que vento tener que mandar, hace una función que consume ser en todo lo proceso y devuelve un resultado. Simple ocuparte, ni de dónde viene, ni dónde va, ni dónde se guarda. Imagínate
-
10:00
, obre el vídeo en una pestanya nova
un proyecto, en el que puedes desarrollar sin tener que conocer cómo funciona todo el ende. Para conseguir un proyecto así te recomendaría que le echara un ojo a este libro. Y si te ha gustado este vídeo y quieres ver más estrategias ya atocando código real sobre cómo se pueden implementar ciertos patrones que te podrían ayudar a ocultar esta complejidad de dejo por aquí un vídeo en el que habló de patrones de diseño. Se está trabajando en programación en el entador J2 este vídeo te parece la super interesante. Espero que les si vio te haya gustado si es si les si por favor suscríbete y déjame un buen like, dale también al botón de hype y nos vemos en la siguiente con más informática. Hasta otra!