Przejdź do głównej zawartości

Strategie dla baz kodu 1M+ LOC

Poproszono cię o dodanie funkcjonalności do modułu przetwarzania płatności. Baza kodu to 1,8 miliona linii w 12 000 plikach. Otwierasz Cursor, wklejasz wymagania, a AI zmyśliło ścieżkę importu, która nie istnieje, odwołało się do przestarzałego wewnętrznego API i pominęło trzy inne serwisy, które muszą się zmienić jednocześnie. Okna kontekstu mają swoje ograniczenia — a duże bazy kodu przekraczają je o rzędy wielkości.

  • Strategie dzielenia dużych baz kodu na fragmenty przyswajalne dla AI
  • Wzorce promptów dające narzędziom AI wystarczający kontekst bez ich przeciążania
  • Techniki utrzymywania spójności architektonicznej przy zmianach wieloplikowych
  • Przepływy pracy dla bezpiecznych, przyrostowych modyfikacji w systemach krytycznych
  • Metody budowania trwałego kontekstu, który przetrwa między sesjami

Problem główny: Okno kontekstu vs. rozmiar bazy kodu

Dział zatytułowany „Problem główny: Okno kontekstu vs. rozmiar bazy kodu”

Nawet przy modelach wspierających okna kontekstu 200K+ tokenów, baza kodu z milionem linii nie zmieści się. Rozwiązaniem nie jest większy kontekst — to mądrzejszy dobór kontekstu.

Myśl o kontekście jako o piramidzie z czterema warstwami:

  1. Warstwa architektoniczna (zawsze obecna): Dokumentacja wysokopoziomowa, mapy zależności, granice modułów
  2. Warstwa domenowa (specyficzna dla zadania): Podsystem, nad którym pracujesz, jego interfejsy i kontrakty
  3. Warstwa implementacyjna (specyficzna dla pliku): Faktyczne pliki, które modyfikujesz
  4. Warstwa referencyjna (na żądanie): Przykłady podobnych wzorców w innych częściach bazy kodu

Indeksowanie bazy kodu w Cursor obsługuje warstwę architektoniczną automatycznie. Wzmocnij je za pomocą:

.cursor/rules
This is a large-scale payment processing platform.
Key modules:
- /src/payments/ - Payment processing (Stripe, PayPal, internal ledger)
- /src/accounts/ - User account management and KYC
- /src/notifications/ - Event-driven notification system
- /src/shared/ - Shared types, utilities, and base classes
When modifying any module, always check:
1. The module's public API in its index.ts barrel export
2. Integration tests in /tests/integration/{module-name}/
3. The event contracts in /src/shared/events/

Użyj oznaczeń @file i @folder, aby wciągać konkretny kontekst do konwersacji. Dla zmian przekrojowych, odwołaj się do grafu zależności: @src/shared/types/payment.ts przed modyfikacją jakiegokolwiek modułu związanego z płatnościami.

Zanim cokolwiek zmodyfikujesz, zmapuj promień rażenia twojej zmiany.

Twórz żywe dokumenty architektoniczne, do których narzędzia AI mogą się odwoływać.

Użyj trybu Agent w Cursor do generowania i utrzymywania podsumowań architektonicznych:

Scan the /src directory and create a concise architectural summary.
For each top-level module, document:
- Purpose (one sentence)
- Public API surface (exported functions/classes)
- Dependencies on other modules
- Database tables it owns
Save this to .cursor/architecture.md

Odwołuj się do tego pliku w przyszłych konwersacjach za pomocą @.cursor/architecture.md.

Nigdy nie próbuj dużej zmiany w jednym podejściu. Rozbij ją na weryfikowalne kroki.

  1. Zidentyfikuj wszystkie pliki, które muszą się zmienić

    Poproś AI o wylistowanie każdego dotkniętego pliku przed napisaniem jednej linii kodu. Zweryfikuj tę listę z własnym zrozumieniem.

  2. Modyfikuj najpierw współdzielone interfejsy

    Zacznij od definicji typów, interfejsów i kontraktów. Te zmiany propagują błędy, które ujawniają ukryte zależności.

  3. Aktualizuj implementacje moduł po module

    Modyfikuj każdy konsumujący moduł niezależnie. Uruchom testy tego modułu przed przejściem do następnego.

  4. Uruchamiaj testy integracyjne po każdym module

    Nie czekaj, aż wszystkie moduły zostaną zaktualizowane. Wyłapuj problemy integracyjne wcześnie.

  5. Finalna weryfikacja przekrojowa

    Uruchom pełny zestaw testów, sprawdź błędy typów w całej bazie kodu i przejrzyj kompletnego diffa przed zatwierdzeniem.

Duże bazy kodu nieuchronnie zawierają kod legacy. Narzędzia AI mogą pomóc w nawigacji, ale potrzebujesz konkretnych strategii.

Znajdź najnowszy, dobrze napisany moduł, który stosuje aktualne konwencje. Użyj go jako wzorca referencyjnego, którego AI ma się trzymać przy modyfikowaniu kodu legacy.

“AI ciągle zmyśla ścieżki plików i nazwy importów.” Twoja warstwa kontekstu jest zbyt cienka. Dodaj jawne listy plików do swojego pliku reguł lub poproś AI o wyszukanie poprawnych ścieżek przed generowaniem kodu: “First, find where UserService is actually defined in this codebase, then write the import.”

“Zmiany działają w izolacji, ale łamią integrację.” Pominąłeś krok mapowania zależności. Zawsze mapuj promień rażenia przed rozpoczęciem. Użyj strategii przyrostowej modyfikacji z weryfikacją między każdą fazą.

“AI sugeruje wzorce, które są sprzeczne z naszą architekturą.” Dokumentacja twojej warstwy architektonicznej jest brakująca lub nieaktualna. Zainwestuj czas w utrzymywanie plików CLAUDE.md lub .cursor/rules kodujących decyzje i ograniczenia architektoniczne.

“Okno kontekstu wypełnia się, zanim skończę zadanie.” Rozbij zadanie na podzadania. Każde podzadanie powinno być możliwe do ukończenia w jednej konwersacji. Użyj podsumowań architektonicznych do szybkiego odbudowywania kontekstu w nowych sesjach.