- En el pasado, el entorno de desarrollo Ada ya había resuelto el problema del formateo de código
- Los desarrolladores trabajaban con el código en forma de representación intermedia (IR) DIANA, y cada quien lo visualizaba con la configuración de pretty-printing que prefería
- Incluso hoy siguen existiendo ineficiencias y discusiones repetitivas por políticas de linter o formateo
- La workstation Rational R1000 ofrecía un entorno y funciones de desarrollo innovadores
- Tomando como referencia un enfoque de hace una generación para el problema del formateo de código, se proponen ideas para cambiar las prácticas de desarrollo actuales
El debate sobre el formateo de código: una solución de los años 80
- El autor menciona su experiencia con Mr. Paige, un profesor de ciencias de la computación que participó en el trabajo de un compilador de Ada cuando él estaba en la preparatoria
- Cuando en 2016 se quejó de lo incómodo que era configurar herramientas de linter y preguntó: “¿por qué seguimos teniendo que pasar por esto?”, le contaron que este problema ya se había resuelto hace más de 40 años
La llegada de Ada y DIANA
- En lugar de guardar código fuente en texto, los desarrolladores de Ada usaban una representación intermedia llamada DIANA (Descriptive Intermediate Attributed Notation for Ada)
- Cada desarrollador podía consultar el código de la forma que quisiera, con su propia configuración de pretty-printing
- No existían debates de formateo ni problemas con linters, y en el editor se podía modificar directamente el árbol del programa (similar al projectional editing moderno)
Rational R1000: un entorno de desarrollo pionero
- La workstation Rational R1000 integraba varias funciones avanzadas como compilación incremental, análisis estático, control de versiones y depuración
- Se utilizó en desarrollos de software críticos como proyectos gubernamentales del DoD, la Estación Espacial Internacional (ISS) y el caza F-22, y también contribuyó al nacimiento de UML
- Según Grady Booch, la R1000 era una máquina basada en DIANA que no almacenaba código fuente, sino que solo usaba pretty-printing del árbol DIANA
Ventajas del desarrollo basado en DIANA
- No hacían falta discusiones sobre formateo, configuración de linters ni unificación del entorno de edición
- Gracias a la aceleración por hardware, ofrecía una experiencia de desarrollo innovadora con compilación incremental, refactorización sencilla y una integración rápida
- Tuvo un impacto importante en la eficiencia del desarrollo y en el trabajo sobre sistemas grandes
Lo que esto sugiere hoy
- La compilación acelerada por hardware es menos importante, pero la solución al problema del formateo sigue siendo insuficiente
- Aunque el enfoque dominante no sea el projectional editing ni los entornos en vivo, quizá ya sea momento de considerar, como en el pasado, la adopción de prácticas de desarrollo más eficientes y con menos discusiones
Material de referencia
- El autor cita diversos documentos e informes técnicos sobre la R1000 mientras investigaba este tema
4 comentarios
Según entiendo, el código compartido ya tiene una función para formatearse automáticamente con una configuración unificada, y sé que muchas empresas la usan.
Parece que el punto no es el formateo automático, sino que es innecesario tanto asumir que cierto formato es superior como pasar por el proceso de abandonar mi propio formato y adaptarme a uno ajeno. La lógica es que se almacene una representación intermedia que no dependa del formato y luego, según cada usuario, se haga pretty-printing de la manera que le resulte más cómoda.
Quería decir que, con el formateo automático, se puede lograr lo mismo en los lenguajes existentes sin necesidad de una representación intermedia, pero no lo expliqué lo suficiente.
Opiniones de Hacker News
include: si no están ordenadas, siempre se agrega al final y eso genera muchos merge conflicts. Igual que con la ventaja de los autoformateadores, también se debería ahorrar tiempo ordenando. Y además soy sensible a los estilos inconsistentes: lo más importante es unificar todo en un solo estilo.blackde Python divide consultas de SQLAlchemy en demasiadas líneas y termina reduciendo la legibilidad.register, mientras que los punteros se representan con un asterisco (*). Cada notación podría ser más intuitiva y clara, pero aun así se insiste en formas complejas y difíciles de leer. Los símbolos o palabras reservadas también podrían reemplazarse por términos más familiares y naturales, pero se sacrifica legibilidad por apego excesivo a convenciones tradicionales o existentes. Como ejemplo, se explica que la funciónstrcpyde C podría reconstruirse por completo con términos y sintaxis más claros y fáciles de leer.char *argv[]. Y también cree que el estilo de formateo tipo C++ —por ejemplochar* a, b— puede inducir a confusión, así que debería evitarse.=, o si se agregan tabs para hacer más visible la profundidad de la estructura mediante indentación. Si se quiere destacar el valor mismo, se podrían alinear los números a la derecha; si se quiere destacar la estructura, se podrían alinear las variables miembro para que sean más fáciles de ver. Dependiendo del aspecto del código que el autor quiera enfatizar, el resultado cambia. Se argumenta que esta información no se puede extraer del AST sin metadata adicional.setValue([bar, glob], 1)o con una sintaxis de comentarios para overrides de estilo, entre varias otras opciones.git diffsería mejor si pudiera revisarse como una proyección de IR (representación intermedia). Gracias a la aparición de herramientas AST como treesitter, uno empieza a imaginar interfaces donde las personas puedan manipular AST o IR de forma más eficiente. Como ejemplo, la estructura de compilación ordenada de f# ayuda a simplificar code reviews. En cambio, en lenguajes o estructuras que permiten orden libre, para revisar un diff pequeño hay que ir y venir por varios lugares para entender el contexto completo del cambio, y eso resulta engorroso.eslint-config-airbnb. Los problemas representativos son #1271, #1122. Perdió más de una hora peleando para aplicar la config de Airbnb a un proyecto existente, y sintió que era improductivo por reglas innecesarias aunque el código ya estaba perfecto. Al final desactivó localmente solo esas reglas, y después nunca volvió a usarlo en ningún proyecto. Este ejemplo muestra cuánto pueden arruinar la productividad las reglas de lint equivocadas.