40 puntos por GN⁺ 2025-12-30 | 4 comentarios | Compartir por WhatsApp
  • La participación real en el diseño de sistemas a gran escala solo es posible para los ingenieros que trabajan directamente con ese código, y los consejos abstractos casi siempre carecen de valor
  • El consejo general de diseño (generic design) suele darse entendiendo el dominio, pero sin conocer la base de código
  • En el trabajo real, las restricciones concretas y mantener la consistencia son mucho más importantes que los principios de diseño, y entender el estado actual del código es clave
  • Al diseñar un sistema nuevo o decidir la dirección tecnológica de toda la empresa, los principios generales de diseño sí pueden ser parcialmente útiles
  • Sin embargo, las estructuras de diseño centradas en arquitectos separados de la realidad del trabajo suelen fracasar, y quien propone el diseño debe responsabilizarse por el resultado

Límites del diseño de software general

  • Para diseñar sistemas a gran escala, es indispensable un entendimiento profundo de los detalles concretos del código
    • Los consejos abstractos casi no ayudan a resolver problemas reales
    • En la práctica, la consistencia (consistency) es más importante que un “buen diseño”
  • Como las bases de código reales son complejas y producen resultados impredecibles, las formas de implementación que pueden elegirse para hacer cambios seguros son limitadas
  • Una gran base de código compartida siempre está en un estado intermedio donde conviven varios diseños, y el estado actual de acoplamiento del código importa más que una meta ideal
  • Como en la mayoría de los sistemas es imposible una reescritura completa (rewrite), hay que apoyarse en la consistencia interna y en el cuidado minucioso de los ingenieros

Características del diseño de software concreto

  • Las discusiones de diseño efectivas ocurren en conversaciones entre unos pocos ingenieros que trabajan con el sistema todos los días
    • Los temas de discusión no son principios generales, sino contextos concretos como la estructura detallada del sistema o el flujo de datos
  • Por ejemplo, en lugar de discutir si “DRY es bueno”, se dan discusiones técnicas detalladas como “¿se puede poner esta función en el subsistema A?” o “¿la información B está accesible en el contexto C?”
  • Las contribuciones importantes surgen al corregir pequeños malentendidos o el impacto detallado de cambios en el código

Cuándo sí es útil el consejo general de diseño

  • Al diseñar un proyecto nuevo desde cero, los principios generales son útiles porque aún no existen restricciones concretas
  • Cuando cuesta elegir entre varias implementaciones, los principios generales pueden servir como criterio de desempate (tie-breaker)
  • También ayudan a mantener la consistencia a nivel de toda la empresa, y esa es una de las funciones formales del arquitecto de software
  • Incluso en decisiones tecnológicas amplias como cloud vs on-premise, AWS vs Azure, los principios generales pueden servir de referencia, aunque todavía no se pueden ignorar las restricciones concretas

Los arquitectos y el problema del “mínimo local”

  • Muchas empresas caen en estructuras de diseño abstracto centradas en arquitectos sin experiencia de campo
    • Este enfoque parece eficiente a simple vista, pero en la práctica produce diseños que los ingenieros de campo no pueden implementar
  • Como los arquitectos no implementan directamente, les falta responsabilidad sobre el resultado (skin in the game)
    • Si el diseño tiene éxito, se llevan el mérito; si falla, pueden culpar al equipo de ejecución
  • Este tipo de estructura tiende a reforzar actividades formales de diseño más que el valor real

Conclusión y propuesta

  • Las discusiones de diseño útiles ocurren en conversaciones concretas al nivel del código, y quien diseña debe conocer bien la base de código
  • Los principios generales de arquitectura deben limitarse al diseño de sistemas nuevos, al apoyo en decisiones puntuales de sistemas existentes y a definir la dirección tecnológica a nivel de empresa
  • Quien propone el diseño de un proyecto debe asumir responsabilidad por su éxito o fracaso, y los ingenieros que realmente trabajan con el código deben ser los protagonistas del diseño
  • Así, quien entiende y puede desplegar el sistema real podrá ser reconocido como el verdadero diseñador

4 comentarios

 
khris 2025-12-31

> En el trabajo real, las restricciones concretas y mantener la consistencia son mucho más importantes que los principios de diseño, y entender el estado actual del código es clave.

Es una idea que siempre he defendido, así que me da gusto al corazón.

 
cshj55 2025-12-31

Con razón últimamente los gurús dicen que los recién llegados hasta usan mucho mejor los agentes. Como era algo que les daba dinero por mucho tiempo, no hacen el unlearning.

 
coremaker 2025-12-31

¿No sería posible resolver suficientemente bien los puntos planteados si se mejorara el proceso de completar la arquitectura?

 
GN⁺ 2025-12-30
Opiniones de Hacker News
  • Describe la situación en la que, en una reunión de equipo, en vez de hablar de cosas como “¿DRY es mejor o WET?”, la conversación deriva en debates complejos de dependencias como “¿podemos meter esta funcionalidad en el subsistema A? No, ahí no tenemos la información de B, y para exponerla habría que reescribir D...”
    Dice en tono de broma que es una escena muy familiar, enumera varios nombres de sistemas ficticios y al final agrega un enlace de YouTube

    • “Wingman” da risa. Pero todavía hay demasiados programas que no soportan ISO8601. Ni siquiera Git es totalmente compatible
    • Parece una sátira demasiado real. Idealmente, creo que un equipo debería ser responsable de un solo servicio. Pero hoy en día vivimos en una época en la que cada desarrollador carga con cuatro microservicios, y eso agota mucho
    • Esta situación aparece seguido cuando los programadores también se encargan de diseñar sistemas de negocio. El análisis y diseño deberían estar liderados por analistas de sistemas
  • Llevo 30 años desarrollando, pero casi nunca he visto casos en los que realmente se invierta un esfuerzo consistente en diseño y arquitectura
    La mayoría de los “arquitectos” no diseñan nada; la estructura suele ser que un desarrollador senior diseña y luego solo recibe retroalimentación
    Si la permanencia promedio es de 2 años, la gente termina diseñando entendiendo apenas una parte del sistema, y muchas veces el arquitecto solo da el visto bueno

    • John Ousterhout aborda este problema, da clases sobre el tema en Stanford y lo amplió en el libro 『A Philosophy of Software Design』. También hay un video de la clase
    • Hace tiempo participé en un proyecto con un “arquitecto”, pero en la práctica era alguien que solo iba a reuniones. No había nadie que diera consejos reales de diseño
    • Dos años alcanzan para cambiar por completo o arruinar un subsistema. El software actual cambia así de rápido
    • En 2 o 3 años se puede llegar a entender bastante a fondo una base de código de 50 a 100 personas. Si después se le da a esa gente la oportunidad de liderar mejoras de arquitectura, la empresa puede crecer técnicamente. El arquitecto debería cumplir el papel de coordinar esas ideas y garantizar la consistencia
  • ‘Generic Software Design’ sirve para orientar la dirección de implementación. Proporciona un lenguaje y un marco comunes que facilitan resolver problemas
    Pero la implementación real puede terminar siendo distinta al plan. Como en la teoría de la programación de Naur, el conocimiento real del sistema está en la cabeza de los desarrolladores

  • La frase “en una base de código grande, la consistencia importa más que un buen diseño” es justamente una trampa de ese tipo de consejo generalizado
    Si solo se enfatiza la consistencia, los malos hábitos se quedan intactos

    • En mi empresa pasa lo contrario: hay demasiada libertad, y eso también es un problema. Cada quien hace las cosas a su manera, así que terminas con Redux en una esquina y otra librería de queries en otra. Al final mantener eso se vuelve más difícil
    • Esto no es solo un problema de calidad de código, sino de eficiencia organizacional. Si hay consistencia, se desarrolla más rápido, hacer reviews y onboardings es más fácil, y los bugs se pueden corregir de una sola vez
    • Esa frase me hizo hacer una mueca. Pero si lees el texto completo, la esencia de la consistencia es la uniformidad y la exactitud
    • Hay que mantener la consistencia, pero también importan las mejoras graduales. Lo ideal es ir sumando “victorias fáciles” con pequeñas mejoras cada vez que tocas el código
    • Decir que “la consistencia importa más que un buen diseño” va contra la Boy Scout Rule. Si te obsesionas con la consistencia, eso puede llevar a un refactor completo y volverse riesgoso
  • De un lado están los “arquitectos” que no entienden la realidad, y del otro los Real Programmer obsesionados solo con optimizar detalles
    Ambos extremos son problemáticos, y quien toma decisiones debe entender tanto los detalles como el contexto
    Como historia relacionada, mencionan The Story of Mel

  • Estoy de acuerdo con la idea de que “la persona que hizo el diseño debe hacerse responsable del éxito y el fracaso del proyecto”
    Eso también debería aplicarse a quien eligió la metodología de desarrollo. Un Scrum master no carga el mismo nivel de responsabilidad que un lead engineer

  • Las mejores apps en las que he participado tenían estas tres características

    1. Valoraban sistemas simples y efectivos
    2. Los desarrolladores entendían todos los casos de uso porque también eran usuarios reales
    3. Tenían la autonomía para corregir de inmediato los problemas que encontraban
      Esa libertad elevaba tanto la satisfacción de los desarrolladores como la calidad del producto
  • En mi experiencia, en una base de código grande la obsesión con la consistencia en realidad es un error
    Cada módulo tiene requisitos distintos, así que también deberían variar la estrategia de testing o los nombres

  • En el caso ideal, el desarrollador también debería ser usuario real del software que crea
    Así puede sentir directamente los errores o incomodidades y tener motivación para mejorarlos

    • Hace falta una vía para que los desarrolladores puedan ver directamente los problemas de los usuarios sin pasar por soporte al cliente. Los insights que salen de tickets, foros o redes sociales son muy valiosos
    • En XP fue una gran idea incluir al cliente dentro del equipo. Reemplazar eso por un representante de negocio fue uno de los pecados originales de Scrum
  • Un arquitecto de software separado que no participa en el mantenimiento no es algo realista
    Los proyectos cambian constantemente, así que un rol que solo da instrucciones desde lejos no ayuda

    • Nunca he estado en una empresa donde exista ese rol. El software complejo es como una partida de ajedrez en curso. Hacen falta principios estratégicos, pero si no conoces la situación real del tablero, cualquier consejo carece de sentido