>_ DevTrendses

Idioma

Inicio

Lenguajes

Secciones

Frontend Backend Móvil DevOps AI / ML GameDev Blockchain Embebidos Seguridad
TypeScript

Cómo dejar de perder decisiones arquitectónicas en el código con Log4brains

Log4brains logo

¿Alguna vez miraste un módulo que tiene un año y medio de antigüedad, viste una extraña decisión arquitectónica y genuinamente no entendiste por qué se tomó? Tus manos te pican por reescribirlo. Pero entonces descubres que este detalle fue diseñado específicamente para trabajar alrededor de un bug en una API de terceros o un requisito de seguridad particular. La persona que se le ocurrió ya se mudó a otro equipo, Confluence está vacío, y todo lo que queda en git es un commit con el lacónico fix: refactor storage.

El concepto de Architecture Decision Records (ADR) ha estado resolviendo este problema durante trece años. Pero mantener manualmente archivos markdown y mantenerlos organizados es usualmente algo con lo que todos están demasiado perezosos para hacer. El desarrollador francés Thomas Vaillant creó Log4brains, una herramienta que convierte la captura de decisiones arquitectónicas en un flujo de trabajo conveniente de docs-as-code.

Qué es esta herramienta

Log4brains toma tus ADR, almacenados en el repositorio junto con tu código fuente, los analiza y construye un sitio estático rápido con búsqueda conveniente y una línea de tiempo.

Log4brains demo

La utilidad está escrita en TypeScript y se ejecuta a través de la línea de comandos. Sin embargo, el proyecto no está atado al ecosistema JS. Puedes ejecutarlo en repositorios de Python, Go, Java o Rust a través de un paquete npm global o imagen Docker.

El punto de los ADR es que estos documentos son inmutables. Registras el problema, el contexto, la opción elegida y las consecuencias. Si una decisión queda obsoleta un año después, no editas el archivo antiguo de forma retroactiva. Creas un nuevo ADR con un estado de supersedes que referencia al anterior. El historial de pensamiento permanece intacto.

Qué puede hacer Log4brains

Bajo el capó, la utilidad esconde varias características prácticas que ahorran tiempo cuando trabajas con documentación.

Vista previa local con recarga en caliente

Cuando estás escribiendo documentación en tu IDE, no hay necesidad de reconstruir manualmente el sitio estático constantemente. El comando log4brains preview inicia un servidor local basado en Next.js con Hot Reload. Guardaste el archivo .md — el navegador se actualiza instantáneamente.

CLI interactivo sin restricciones rígidas

Muchas utilidades ADR requieren una numeración estricta de archivos como adr-0001.md, adr-0002.md. Esto se convierte en una pesadilla durante pull requests paralelos cuando dos desarrolladores crean documentos con el mismo número.

Log4brains no depende de una numeración rígida. Los metadatos (autor, fecha de creación, estado) se leen del texto y del log de git. Las plantillas pueden personalizarse según tus necesidades, aunque el formato MADR, bien probado, se usa por defecto.

Crear un nuevo registro se ve simple:

log4brains adr new

El comando preguntará interactivamente el título, creará un archivo markdown desde la plantilla y lo colocará en la estructura del proyecto.

Soporte para monorepos

Si el proyecto está dividido en múltiples paquetes, a menudo es deseable separar la documentación. Log4brains puede manejar decisiones globales de nivel superior y registros dependientes de paquetes dentro de packages/service-name/docs/adr.

Cómo comenzar

Todo comienza con un par de comandos en la terminal. Necesitarás Node.js LTS y Git:

npm install -g log4brains
log4brains init

El asistente de configuración hará algunas preguntas básicas, creará el archivo de configuración .log4brains.yml, añadirá una plantilla al proyecto y generará tu primer ADR de bienvenida.

La configuración termina siendo compacta:

project:
  name: My Service
  tz: Europe/Moscow
  adrFolder: ./docs/adr

Si tienes un monorepo, puedes expandir la estructura:

project:
  name: Core Platform
  tz: Europe/Moscow
  adrFolder: ./docs/adr
  packages:
    - name: auth-service
      path: ./packages/auth
      adrFolder: ./packages/auth/docs/adr
    - name: billing-service
      path: ./packages/billing
      adrFolder: ./packages/billing/docs/adr

Publicación en CI/CD

La parte más valiosa es desplegar la base de conocimientos externamente para que el equipo pueda buscar soluciones a través de una interfaz web. Dado que el build genera archivos estáticos limpios, es fácil empujar a GitHub Pages, GitLab Pages o S3.

Ejemplo para GitHub Actions:

name: Publish Log4brains
on:
  push:
    branches:
      - main
jobs:
  build-and-publish:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          persist-credentials: false
          fetch-depth: 0 # обязательно, утилите нужна история git
      - uses: actions/setup-node@v4
        with:
          node-version: lts/*
      - name: Build
        run: |
          npm install -g log4brains
          log4brains build --basePath /${GITHUB_REPOSITORY#*/}/log4brains
      - name: Deploy
        uses: JamesIves/[email protected]
        with:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          BRANCH: gh-pages
          FOLDER: .log4brains/out
          TARGET_FOLDER: log4brains

Un detalle importante: presta atención a fetch-depth: 0. La utilidad absolutamente necesita el historial completo de commits para extraer las fechas reales de creación y los autores de cada documento.

Quién se beneficiará de este proyecto

Log4brains es una buena opción para equipos de 3-4 ingenieros o más, donde la gente periódicamente hace preguntas como "¿por qué elegimos esta biblioteca/base de datos/patrón".

La herramienta encaja bien en el proceso de revisión de código. Discutes la arquitectura en un pull request, mezclas el código junto con el archivo .md en el mismo commit. La documentación no vive una vida separada en páginas wiki olvidadas — se actualiza automáticamente durante el despliegue.

Si el proyecto es pequeño y estás trabajando solo, la sobrecarga de documentar decisiones podría parecer innecesaria. Pero para productos de larga vida, esta es una de las formas más painless de preservar el contexto de las decisiones.

Proyectos relacionados