Przejdź do treści

Dług techniczny: jak go mierzyć i co naprawić najpierw?

Dla CTO i programistówDecyzje CTO

Filip PapranecZałożyciel Digitaliko

Dług techniczny spowalnia rozwój. Najpierw kod, który się zmienia. Ilustracja: lista plików posortowana według liczby zmian, najczęściej zmieniane wyróżnione.Dług techniczny spowalnia rozwój. Najpierw kod, który się zmienia. Ilustracja: lista plików posortowana według liczby zmian, najczęściej zmieniane wyróżnione.

Dług techniczny spowalnia rozwój, gdy każda nowa funkcja trwa dłużej niż poprzednia. Dla firmy oznacza to roadmapę, która ciągle się przesuwa, i programistów, którzy gaszą pożary zamiast budować.

Można go zmierzyć bez drogiego narzędzia, na podstawie historii git i błędów. Najpierw warto spłacić dług w kodzie, który zmienia się najczęściej, a nie w tym najbrzydszym.

Większość naszego kodu pisze AI. Senior sprawdza każdą zmianę i odpowiada za produkcję. Przez lata rozwijaliśmy jeden produkt SaaS. Długu w produkcie, który żyje latami, nie rozwiąże się w jednym sprincie. Spłaca się go na bieżąco.

Jak poznać, że dług techniczny Państwa spowalnia?

Dług sam się nie zgłasza. Objawia się jako powolność, którą każdy tłumaczy inaczej. Przycisk, który powinien zająć dzień, zajmuje tydzień. Proszę zaznaczyć, co dotyczy Państwa zespołu. Każdy niezaznaczony punkt to jeden sygnał długu.

Jak zmierzyć dług techniczny bez drogiego narzędzia?

Nie potrzebują Państwo platformy do analizy kodu. Potrzebują Państwo odpowiedzi na jedno pytanie: gdzie zmiany kosztują najwięcej?

Co mierzyćGdzie to znaleźćCo to mówi
Jak często zmienia się plikhistoria gitgdzie dług boli najbardziej
Skąd biorą się błędytracker, hotfixy, incydentyktóre części są kruche
Testy w często zmienianym kodzieraport CIgdzie każda zmiana to ryzyko
Kto rozumie dany modułgit blame, reviewgdzie zależą Państwo od jednej osoby
Czas od merge do wdrożenialogi CI i wdrożeńczy spowalnia kod, czy proces
Szacunek a rzeczywistośćsprinty, trackerile długu płacą Państwo przy każdym zadaniu

Najsilniejszym sygnałem są dwa pierwsze wiersze razem. Plik, który często się zmienia i do tego wciąż generuje błędy, to dług z odsetkami. Listę najczęściej zmienianych plików daje jedno polecenie:

git log --since="6 months ago" --format= --name-only | sort | uniq -c | sort -rn | head -20

Przy każdym pliku z wyniku proszę zanotować błędy, które go dotyczyły. Kilka pierwszych wierszy to Państwa lista.

Co naprawić najpierw?

Nie to, co najbrzydsze. To, co teraz kosztuje najwięcej czasu. Kolejność, którą stosujemy:

  1. Dług na drodze roadmapy

    Jego spłata będzie widoczna przy następnej funkcji i da się ją obronić przed zarządem.

  2. Często zmieniany kod z błędami

    Płacą za niego Państwo przy każdym zadaniu.

  3. Testy i CI, które mogą się nie powieść

    Bez nich każda kolejna spłata jest ryzykowna.

  4. Wiedza w jednej głowie

    Jeśli ta osoba odejdzie, dług zamieni się w awarię.

Estetyka i przejście na nowszy framework „bo jest nowszy” są na samym końcu. Kod, którego nikt nie dotyka od miesięcy, może pozostać brzydki. Nic Państwa nie kosztuje. Jeśli w ogóle nie jest używany, nie spłacamy go, tylko go usuwamy. Tak samo robimy we własnych repozytoriach: nieużywany kod i narzędzia, których nikt nie wywołuje, znikają.

Jeśli dług w jakiejś części jest tak duży, że rozważają Państwo przepisanie, warto zacząć tak samo. Najpierw testy obecnego zachowania, potem decyzja. Jak testy i review naprawdę zatrzymują złą zmianę, opisujemy w artykule Claude Code best practices dla zespołu: 7 zasad, które działają.

Jak spłacać dług bez zatrzymywania roadmapy?

W tym samym rytmie co funkcje. Nie w „sprincie refaktoryzacji”, który ciągle się przesuwa, bo pojawiła się pilna funkcja.

  • Stała część mocy zespołu. Proszę ustalić ją z góry z produktem i nie sięgać po nią przy pierwszym alarmie.
  • Spłata tam, gdzie Państwo pracują. Gdy budują Państwo funkcję w zadłużonym module, proszę posprzątać go w tym samym pull requeście.
  • Najpierw test, potem zmiana. Test obecnego zachowania wyłapie to, co inaczej by się zepsuło.
  • Żadnego nowego długu bez zapisu. Jeśli świadomie idą Państwo na skróty, proszę zapisać to jako zadanie z uzasadnieniem.

Tak to wygląda na jednej funkcji z roadmapy:

Dług techniczny w czterech krokach na przykładzie: git pokazuje najczęściej zmieniany plik invoice.ts z błędami, funkcja z roadmapy Nowa logika cen go potrzebuje, testy i CI go zabezpieczają, a porządki trafiają do tego samego pull requesta. report.php, którego nikt nie dotyka, czeka.Dług techniczny w czterech krokach na przykładzie: git pokazuje najczęściej zmieniany plik invoice.ts z błędami, funkcja z roadmapy Nowa logika cen go potrzebuje, testy i CI go zabezpieczają, a porządki trafiają do tego samego pull requesta. report.php, którego nikt nie dotyka, czeka.

AI zmienia tu rachunek. Testy istniejącego kodu, przenoszenie i zmiana nazw były drogie, więc je odkładano. Z AI są tanie. Bez reguł i review AI dokłada jednak długu równie szybko. Co zostawiamy jej w repozytorium, opisujemy w artykule Reguły dla kodu AI w zespole.

Pierwsze kroki na ten miesiąc:

  1. Proszę wyciągnąć z git listę najczęściej zmienianych plików.
  2. Przy każdym zanotować błędy z ostatnich miesięcy.
  3. Wybrać trzy miejsca, które blokują następną funkcję z roadmapy.
  4. Ustalić z produktem stałą część mocy zespołu na dług.
  5. Sprawdzić, czy CI potrafi zatrzymać zły merge.

Kiedy tego nie polecamy

  • Dług Państwa nie spowalnia, po prostu się nie podoba. Jeśli ten kod się nie zmienia, proszę go zostawić. Moc zespołu lepiej przeznaczyć na roadmapę.
  • Produkt za kilka miesięcy zostanie wyłączony lub zastąpiony. Spłacanie długu w kodzie, który się kończy, nie opłaca się.

Chcą Państwo spłacać dług z kimś, kto robi to codziennie?

Senior od pierwszego dnia wchodzi do Państwa repozytorium i pull requestów. Spłaca dług na drodze roadmapy, obok funkcji, a nie zamiast nich. Tak pracujemy jako zewnętrzny programista dla zespołów produktowych.

Proszę napisać, która część systemu najbardziej Państwa spowalnia. Odezwiemy się w ciągu dwóch dni roboczych z kilkoma pytaniami o Państwa pracę. Potem ustalimy, co zrobimy najpierw.

Jeśli wolą Państwo najpierw porozmawiać, proszę zarezerwować 15-minutową rozmowę wstępną.

Którego pliku w Państwa repozytorium cały zespół boi się otworzyć?

W skrócie

  • Dług techniczny zmierzą Państwo na podstawie historii git i błędów, bez drogiego narzędzia.
  • Najpierw dług na drodze następnej funkcji z roadmapy, a nie najbrzydszy kod.
  • Przed zmianą: testy obecnego zachowania i CI, które może się nie powieść.
  • Spłacać go w zwykłych pull requestach, ze stałą częścią mocy zespołu.

Najczęstsze pytania

Jak zmierzyć dług techniczny?

Najprościej na podstawie historii git i błędów. Pliki, które zmieniają się najczęściej i jednocześnie generują błędy, to dług, który naprawdę kosztuje Państwa czas. Do tego warto obserwować, jak rosną szacunki przy małych zmianach.

Co naprawić najpierw?

Dług w kodzie, którego potrzebują Państwo do następnej funkcji z roadmapy. Potem często zmieniany kod z błędami. Kod, którego nikt nie dotyka, lepiej zostawić w spokoju, nawet jeśli jest brzydki.

Jak wytłumaczyć dług techniczny zarządowi?

Językiem czasu i ryzyka, nie jakości kodu. Proszę pokazać, o ile dłużej trwają zmiany w konkretnej części i ile błędów z niej pochodzi. Najlepiej na funkcji z roadmapy, na którą czeka zarząd.

Czy AI zwiększa dług techniczny?

Bez reguł i review tak, bo pisze szybko i bez kontekstu. Z regułami w repozytorium, testami i review wykonanym przez kogoś innego pomaga go spłacać. Testy i przenoszenie kodu są z AI tanie.

Zapytaj AI o ten artykuł

AI przy odpowiedzi wykorzysta też nasze inne artykuły i doświadczenia z prawdziwych projektów.

ChatGPTClaudePerplexity
Engineering

Kolejne artykuły

Decyzje CTO

Refaktoryzacja czy przepisanie od zera? Jak zdecydować

Refaktoryzacja, gdy kod robi właściwą rzecz źle. Przepisanie, gdy robi niewłaściwą rzecz albo kod nie należy do Państwa. Tabela decyzyjna dla CTO i sposób, by zrobić to bez zatrzymywania roadmapy.

Decyzje CTO

Body leasing czy senior w zespole? Jak wybrać

Body leasing daje godziny programisty, którymi zarządzają Państwo sami. Senior w zespole daje zrealizowane zadania i zespół, który uczy się pracy z AI. Porównanie z outsourcingiem i rekrutacją, dla CTO.

Decyzje CTO

Alternatywy dla Vercel: dlaczego używamy Vercel i Cloudflare

Nie zastąpiliśmy Vercel, podzieliliśmy pracę. Strony w Next.js zostają na Vercel, nowe aplikacje działają na Cloudflare Workers i D1, opisane w TypeScript za pomocą Alchemy. Ceny ze źródłami, nasza konfiguracja i zablokowany deploy agenta AI.