>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
TypeScript

Jak przestać gubić decyzje architektoniczne w kodzie dzięki Log4brains

Log4brains logo

Czy kiedykolwiek patrzyłeś na moduł sprzed półtora roku, widziałeś dziwną decyzję architektoniczną i szczerze nie rozumiałeś, dlaczego została podjęta? Ręce swędzą cię, żeby go przepisać. Ale potem dowiadujesz się, że ta osobliwość została specjalnie zaprojektowana, aby obejść błąd w zewnętrznym API lub konkretne wymaganie bezpieczeństwa. Osoba, która to wymyśliła, dawno temu przeszła do innego zespołu, Confluence jest puste, a wszystko, co pozostało w git, to commit z lakonicznym fix: refactor storage.

Koncepcja Architecture Decision Records (ADR) rozwiązuje ten problem od trzynastu lat. Jednak ręczne utrzymywanie plików markdown i ich organizacja zazwyczaj jest czymś, do czego nikt nie ma ochoty. Francuski programista Thomas Vaillant stworzył Log4brains, narzędzie przekształcające rejestrowanie decyzji architektonicznych w wygodny workflow docs-as-code.

Co to za narzędzie

Log4brains pobiera twoje ADR, przechowywane w repozytorium obok kodu źródłowego, analizuje je i buduje szybką stronę statyczną z wygodnym wyszukiwaniem i osią czasu.

Demo Log4brains

Narzędzie jest napisane w TypeScript i działa przez linię poleceń. Jednak projekt nie jest powiązany z ekosystemem JS. Możesz uruchomić je w repozytoriach Python, Go, Java lub Rust poprzez globalny pakiet npm lub obraz Docker.

Istorą ADR jest to, że te dokumenty są niezmienne. Rejestrujesz problem, kontekst, wybraną opcję i konsekwencje. Jeśli decyzja stanie się nieaktualna za rok, nie edytujesz starego pliku retroaktywnie. Tworzysz nowy ADR ze statusem supersedes, który odwołuje się do poprzedniego. Historia myśli pozostaje nienaruszona.

Co potrafi Log4brains

Pod maską narzędzie ukrywa kilka praktycznych funkcji oszczędzających czas podczas pracy z dokumentacją.

Lokalny podgląd z hot reload

Gdy piszesz dokumentację w swoim IDE, nie ma potrzeby ciągłego ręcznego przebudowywania strony statycznej. Polecenie log4brains preview uruchamia lokalny serwer oparty na Next.js z Hot Reload. Zapisałeś plik .md — przeglądarka natychmiast się aktualizuje.

Interaktywny CLI bez sztywnych ograniczeń

Wiele narzędzi ADR wymaga ścisłego numerowania plików jak adr-0001.md, adr-0002.md. Podczas równoległych pull requestów, gdy dwóch programistów tworzy dokumenty z tym samym numerem, staje się to koszmarem.

Log4brains nie polega na sztywnym numerowaniu. Metadane (autor, data utworzenia, status) są odczytywane z tekstu i git log. Szablony można dostosować do własnych potrzeb, chociaż domyślnie używany jest sprawdzony format MADR.

Tworzenie nowego wpisu wygląda prosto:

log4brains adr new

Polecenie zapyta interaktywnie o tytuł, utworzy plik markdown z szablonu i umieści go w strukturze projektu.

Wsparcie dla monorepozytoriów

Jeśli projekt jest podzielony na wiele pakietów, często желательно oddzielić dokumentację. Log4brains może obsługiwać globalne decyzje na najwyższym poziomie i rekordy zależne od pakietów w packages/service-name/docs/adr.

Jak zacząć

Wszystko zaczyna się od kilku poleceń w terminalu. Będziesz potrzebować Node.js LTS i Git:

npm install -g log4brains
log4brains init

Kreator instalacji zada kilka podstawowych pytań, utworzy plik konfiguracyjny .log4brains.yml, doda szablon do projektu i wygeneruje pierwszy powitalny ADR.

Plik konfiguracyjny okazuje się zwięzły:

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

Jeśli masz monorepo, możesz rozbudować strukturę:

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

Publikacja w CI/CD

Najcenniejszą częścią jest wdrożenie bazy wiedzy zewnętrznie, aby zespół mógł wyszukiwać rozwiązania przez interfejs sieciowy. Ponieważ kompilacja generuje czyste pliki statyczne, łatwo jest przesłać je do GitHub Pages, GitLab Pages lub S3.

Przykład dla 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

Istotny szczegół: zwróć uwagę na fetch-depth: 0. Narzędzie absolutnie potrzebuje pełnej historii commitów, aby wyodrębnić rzeczywiste daty utworzenia i autorów każdego dokumentu.

Kto skorzysta z tego projektu

Log4brains sprawdza się w zespołach od 3-4 inżynierów, gdzie ludzie okresowo zadają pytania w stylu „dlaczego wybraliśmy tę bibliotekę/bazę danych/wzorzec".

Narzędzie dobrze wpisuje się w proces przeglądu kodu. Dyskutujecie o architekturze w pull requeście, łączycie kod wraz z plikiem .md w tym samym commicie. Dokumentacja nie żyje oddzielnym życiem na zapomnianych stronach wiki — jest aktualizowana automatycznie podczas wdrażania.

Jeśli projekt jest mały i pracujesz nad nim sam, narzut związany z dokumentowaniem decyzji może wydawać się niepotrzebny. Ale w przypadku długowiecznych produktów to jeden z najbardziej bezbolesnych sposobów zachowania kontekstu decyzji.

Powiązane projekty