Jeden monolit frontendowy, sześć zespołów i ciągłe konflikty
Sklep internetowy to jedna aplikacja React, nad którą pracuje 6 zespołów (katalog, koszyk, płatności, konto, wyszukiwarka, CMS). Merge conflicty są codziennością, wdrożenie raz w tygodniu wymaga koordynacji wszystkich, a zmiana w jednym miejscu psuje inne. Zaproponuj docelową architekturę i drogę do niej.
Zanim rozwiniesz: powiedz na głos, jak byś to rozwiązał, i nazwij co najmniej jeden kompromis.
Moje rozwiązanie
Zapisuje się samo w tej przeglądarce. Kopię zrobisz na stronie Notatki.
Pokaż, czego szuka rekruter, i modelową odpowiedź
Co sprawdza rekruter
- Czy dobierasz granice modułów do domen i zespołów
- Czy porównujesz opcje (modularny monolit, monorepo, mikrofrontendy) z kosztami
- Czy planujesz przejście bez zatrzymania rozwoju
- Czy myślisz o własności kodu i procesie
Odpowiedź seniora
Problemem nie jest jedna aplikacja, tylko brak granic. Najpierw modularny monolit: moduły według domen (features/catalog, features/cart…) z publicznym API przez index.ts, granicami pilnowanymi przez eslint-plugin-boundaries lub reguły Nx oraz CODEOWNERS, więc każdy zespół ma swój obszar i swoje review.
Następnie monorepo (Nx lub Turborepo) z modułami jako paczkami: build i testy tylko dotkniętych projektów, cache, wspólne paczki design systemu i klienta API. Niezależne wdrożenia uzyskuję przez trunk-based development, feature flags i częste, małe deploye, zamiast wydań raz w tygodniu.
Mikrofrontendy rozważam dopiero, gdy zespoły naprawdę potrzebują niezależnych cykli wydań lub różnych technologii, bo kosztują: duplikację zależności, spójność UI, komunikację między aplikacjami i złożoną infrastrukturę. Migracja idzie od najbardziej konfliktowego obszaru, z metrykami: liczba konfliktów, czas od merge do produkcji, liczba incydentów po wdrożeniu.
Typowe wpadki
- Od razu mikrofrontendy jako odpowiedź na problem organizacyjny
- Podział na foldery bez wymuszenia granic
- Brak metryk, po których poznamy, że jest lepiej
Dopytają o
- Jak zespoły współdzielą komponenty bez blokowania się?
- Kto jest właścicielem modułów wspólnych?
- Jak wygląda routing między modułami?