Zestawy rozmówBlog

Twoja wymarzona praca? Lets Git IT.
Interaktywna platforma przygotowująca do rozmów technicznych dla nowoczesnych programistów.

XGitHub

Platforma

  • Kategorie

Zasoby

  • Blog
  • O aplikacji
  • FAQ
  • Sugestie

Prawne

  • Polityka prywatności
  • Regulamin

© 2026 LetsGit.IT. Wszelkie prawa zastrzeżone.

Monolity

Baza pytań rekrutacyjnych i wiedzy. Filtruj, szukaj i sprawdzaj swoją wiedzę.

Tematy

Czym jest architektura monolityczna?

easymonolitharchitecturedeployment
Otwórz pytanie

Odpowiedź

Architektura monolityczna to pojedyncza wdrażalna aplikacja, w której moduły działają w jednym procesie i zwykle współdzielą jedną bazę danych. System buduje się, testuje i wdraża jako całość, co jest proste na początku, ale może prowadzić do silnych powiązań przy wzroście.

Zalety i wady monolitów?

easymonolithtradeoffsscalability
Otwórz pytanie

Odpowiedź

Zalety: prostszy rozwój i wdrożenia, łatwe testowanie/debugowanie lokalne oraz silna spójność i proste transakcje. Wady: trudniej niezależnie skalować części systemu, wolniejsze cykle wdrożeń i rosnący kod może stać się silnie powiązany i trudniejszy do bezpiecznych zmian.

Jak utrzymać monolit w dobrej kondycji wraz z rozwojem?

mediummodular-monolithboundariesmaintainability
Otwórz pytanie

Odpowiedź

Utrzymuj jasne granice modułów (np. domenowe), egzekwuj zasady zależności, utrzymuj cienkie warstwy i dodawaj testy automatyczne. Stosuj wewnętrzne API, ograniczaj współdzielony stan i regularnie refaktoruj, aby monolit pozostał modułowy i łatwy w zmianach.

Czym jest monolit modułowy?

mediummodular-monolitharchitectureevolution
Otwórz pytanie

Odpowiedź

Monolit modułowy to wciąż jedna jednostka wdrożeniowa, ale z silną separacją modułów. Każdy moduł posiada własną domenę i komunikuje się przez dobrze zdefiniowane interfejsy, co poprawia utrzymanie i ułatwia przyszłe wydzielanie usług.

Strategie migracji z monolitu do mikroserwisów?

hardmigrationstrangler-figmicroservices
Otwórz pytanie

Odpowiedź

Preferuj migrację krokową (Strangler Fig): wydzielaj po jednej funkcji/domenie za stabilnym API i dodaj dobre logi/metryki/tracing. Unikaj big‑bang rewrite’u; rozdzielaj dane i logikę stopniowo.

Co to jest monolit (i czemu nie jest z automatu „zły”)?

easymonolitharchitecturetradeoffs
Otwórz pytanie

Odpowiedź

Monolit to jedna jednostka wdrożeniowa (jedna aplikacja/serwis) zawierająca wiele modułów/funkcji. Często jest świetny na start, bo upraszcza development, testy i wdrożenia oraz ułatwia transakcje i debugowanie.

Kiedy monolit jest lepszym wyborem niż mikroserwisy?

easymonolithmicroservicesteam-size
Otwórz pytanie

Odpowiedź

Gdy zespół jest mały, domena szybko się zmienia i chcesz szybko iterować przy prostych operacjach. Mikroserwisy zwykle opłacają się dopiero, gdy realnie potrzebujesz niezależnych wdrożeń/skalowania i masz jasne granice.

Jak zdefiniujesz monolit modułowy?

easymodular-monolithboundariesarchitecture
Otwórz pytanie

Odpowiedź

To wciąż jedna jednostka wdrożeniowa, ale z mocnymi granicami wewnętrznymi: moduły posiadają swoją domenę i komunikują się przez jasno zdefiniowane interfejsy. To poprawia utrzymanie i ułatwia przyszłe wydzielanie serwisów.

Jak utrzymać monolit w dobrej kondycji, gdy rośnie?

mediummaintainabilitymodularityrefactoring
Otwórz pytanie

Odpowiedź

Ustal jasne granice modułów (często domenowe), egzekwuj zasady zależności i utrzymuj cienkie warstwy. Dodaj testy automatyczne i regularnie refaktoruj, żeby kod pozostał modułowy i łatwy do zmian.

Jak skalować monolit poziomo?

mediumscalingstatelessload-balancer
Otwórz pytanie

Odpowiedź

Zrób aplikację stateless (sesje w Redis/DB), uruchom wiele instancji za load balancerem i osobno skaluj bazę (indeksy, cache, read repliki). Zwróć uwagę na współdzielone zasoby jak pliki i joby w tle.

Co to są feature flagi i czemu są przydatne w monolicie?

mediumfeature-flagsrolloutrelease
Otwórz pytanie

Odpowiedź

Feature flagi pozwalają włączać/wyłączać funkcje w runtime bez wdrożenia. Ułatwiają bezpieczne release’y (dark launch, rollout) i szybki rollback, ale wymagają sprzątania, żeby nie mieć „flag debt”.

Migracja Strangler Fig — wypunktuj kroki.

hardstrangler-figmigrationmicroservices
Otwórz pytanie

Odpowiedź

Dodaj warstwę routingu, wybierz małą funkcję/domenę, wydziel ją za stabilnym API i stopniowo przełączaj ruch. Powtarzaj kroki „po plasterku” z monitoringiem i rollbackiem, aż stara ścieżka będzie do usunięcia.

Podział bazy przy wydzielaniu serwisu — co jest najtrudniejsze?

harddatabasemigrationdata-ownership
Otwórz pytanie

Odpowiedź

Własność danych i spójność: kto jest właścicielem których tabel i jak utrzymać spójność w trakcie przejścia (dual writes/outbox/eventy). Migracja powinna być krokowa z jasnym momentem cutover i strategią rollback.

Jak znaleźć dobre granice (seams) do wydzielania serwisów z monolitu?

hardbounded-contextseamsdecomposition
Otwórz pytanie

Odpowiedź

Szukaj bounded contexts: funkcji z jasnym właścicielem, danymi i małą liczbą zależności. Zacznij od części, które często się zmieniają lub mają wyraźne potrzeby skalowania, i nie dziel na początku mocno sprzężonych fragmentów.

Co to jest „distributed monolith” i jak go unikać?

harddistributed-monolithcouplingmicroservices
Otwórz pytanie

Odpowiedź

To system podzielony na serwisy, ale nadal mocno sprzężony (wspólna baza, synchroniczne „gadatliwe” wywołania, skoordynowane wdrożenia). Unikasz przez jasną własność, asynchroniczność tam gdzie trzeba, stabilne kontrakty i niezależne wdrożenia.

Monorepo vs monolit — jaka jest różnica?

easymonorepomonolithrepo-structure
Otwórz pytanie

Odpowiedź

Monorepo to strategia repozytorium (wiele projektów w jednym repo). Monolit to jednostka wdrożeniowa/runtime (jedna aplikacja). Możesz mieć monolit w monorepo albo mikroserwisy w monorepo.

Co to jest „big ball of mud” i po czym go poznać?

mediummaintainabilitycouplingcode-smell
Otwórz pytanie

Odpowiedź

To kod bez jasnych granic i z dużą, przypadkową zależnością między częściami. Objawy: brak jasnej odpowiedzialności, losowe regresje po zmianach, dużo globalnego stanu i „wszystko zależy od wszystkiego”.

Jak egzekwować granice modułów wewnątrz monolitu?

mediummodulesboundariesarchitecture-tests
Otwórz pytanie

Odpowiedź

Organizuj kod po funkcjach/domenach, zdefiniuj jasne publiczne API między modułami i ogranicz zależności (np. reguły pakietów, testy architektury). Trzymaj wspólne utilsy małe i unikaj „god modułów”.

Jak bezpiecznie wprowadzić breaking change w bazie danych w dużym monolicie?

harddb-migrationexpand-contractdeployment+1
Otwórz pytanie

Odpowiedź

Zastosuj expand/contract: najpierw dodaj nowy schemat (np. nullable kolumna/nowa tabela) i wdroż kod obsługujący stare i nowe; potem zmigruj dane; a na końcu usuń stare w kolejnej wersji. To minimalizuje downtime i wspiera rollback.

Podaj dwa sposoby skalowania monolitu bez dzielenia na mikroserwisy.

hardscalingmonolithqueues+1
Otwórz pytanie

Odpowiedź

Skaluj poziomo (wiele stateless instancji za load balancerem) i przenieś ciężkie zadania do asynchronicznych jobów/kolejek (background processing). Dodatkowo skaluj odczyty przez cache i repliki.

Package-by-layer vs package-by-feature — jaka jest różnica?

easystructuremodularitymonolith
Otwórz pytanie

Odpowiedź

Package-by-layer grupuje kod po warstwach technicznych (kontrolery/serwisy/repo). Package-by-feature grupuje kod po funkcji/domenie. Struktura feature-based często lepiej skaluje, bo powiązany kod jest razem i granice są czytelniejsze.

Jak uruchamiać background joby w monolicie w sposób niezawodny?

mediumjobsqueueworker+1
Otwórz pytanie

Odpowiedź

Użyj osobnego procesu workera (ta sama baza kodu, inny entrypoint) konsumującego kolejkę, z retry i idempotencją. To nie blokuje requestów web i daje lepszą kontrolę współbieżności oraz błędów.

Jak unikać „śmietnika utils” w rosnącym monolicie?

mediumshared-codeownershipmodularity
Otwórz pytanie

Odpowiedź

Trzymaj utilsy blisko funkcji, która jest ich właścicielem, a wspólny kod wydzielaj dopiero, gdy realnie potrzebuje go wiele modułów. Preferuj małe, nazwane biblioteki ze znanym właścicielem zamiast jednego ogromnego `utils`.

Jak skrócić CI/build time w dużym monolicie/monorepo?

hardcibuildcaching+1
Otwórz pytanie

Odpowiedź

Użyj cache (zależności i artefaktów builda), uruchamiaj testy/linty inkrementalnie dla zmienionych modułów i równoleglij joby. Pomaga też niezależność modułów, żeby nie przebudowywać wszystkiego po małej zmianie.

Jak refaktorować bałagan w monolicie bez zatrzymania rozwoju funkcji?

hardrefactoringincrementaltesting+1
Otwórz pytanie

Odpowiedź

Rób to krokowo: wybierz jedną granicę, dodaj testy wokół zachowania, refaktoruj za stabilnym interfejsem i wypuszczaj małe kroki. Planuj czas na dług techniczny i unikaj big-bang rewrite’u.

Co oznacza “single deployable” i czemu to siła monolitu?

easymonolithdeploymentrelease+1
Otwórz pytanie

Odpowiedź

Single deployable oznacza, że wdrażasz jeden artefakt jako jedną całość (jedna wersja do zbudowania, przetestowania i wdrożenia). To upraszcza release’y i rollbacki oraz unika niedopasowania wersji między serwisami. Minusem jest większy blast radius, gdy coś pójdzie źle.

Jak podejść do testów integracyjnych w monolicie, żeby nie zabić CI?

mediumtestingmonolithci+1
Otwórz pytanie

Odpowiedź

Trzymaj piramidę testów: dużo szybkich unit testów, mniej integracyjnych i mało E2E. W integracji testuj kluczowe “seamy” (DB, messaging) z realistycznymi zależnościami (np. Testcontainers) i dbaj o równoległość oraz stabilność. Unikaj jednego gigantycznego test-suite “testuje wszystko”.

Jak utrzymać czytelne granice domen w monolicie?

mediummonolithmodularityboundaries+1
Otwórz pytanie

Odpowiedź

Organizuj kod po funkcjach/domenach (a nie tylko po warstwach technicznych), wystawiaj małe wewnętrzne API między modułami i zabraniaj “sięgania” do wnętrza innych modułów importami. Dodaj ownership (kto utrzymuje co) i checki architektoniczne (granice modułów), żeby granice nie rozjeżdżały się w czasie.

Multi-tenancy w monolicie: jakie są typowe podejścia do izolacji danych?

hardmonolithmulti-tenancysecurity+1
Otwórz pytanie

Odpowiedź

Typowe opcje: osobna baza per tenant (mocna izolacja, większy koszt), osobna schema per tenant (dobra izolacja, średnia złożoność) albo współdzielone tabele z `tenant_id` (najtańsze, najtrudniejsze do poprawnego egzekwowania). Niezależnie od podejścia musisz wszędzie wymuszać tenant scoping oraz dodać właściwe indeksy i checki bezpieczeństwa.

Jak zapobiegać regresjom wydajności w dużym monolicie?

hardmonolithperformanceobservability+1
Otwórz pytanie

Odpowiedź

Zdefiniuj SLI wydajności (np. p95) i monitoruj je cały czas. Dodaj profiling/tracing dla wolnych endpointów, rób load testy krytycznych flow i ustaw budżety/alerty, żeby łapać regresje wcześnie. Feature flagi pomagają szybko wycofać zmianę, gdy trzeba.

Structured logging: co to jest i czemu pomaga w monolicie?

easymonolithsloggingobservability
Otwórz pytanie

Odpowiedź

Structured logging oznacza, że logi mają stałe pola (np. JSON) typu `level`, `message`, `requestId`, `userId`. Pomaga, bo możesz je łatwo filtrować, wyszukiwać i łączyć między wieloma fragmentami kodu bez parsowania „losowego” tekstu.

Correlation ID w monolicie: co to jest i gdzie go generujesz?

mediummonolithsloggingrequest-id+1
Otwórz pytanie

Odpowiedź

Correlation ID (request ID) to unikalny identyfikator requestu, który trafia do logów. Generuj go na wejściu (middleware/filter HTTP) albo przyjmij z upstreamu, a potem przekazuj przez wszystkie warstwy oraz joby uruchomione przez ten request.

Jak zapobiegać cyklicznym zależnościom między modułami w modularnym monolicie?

mediummonolithsmodular-monolithboundaries+1
Otwórz pytanie

Odpowiedź

Zdefiniuj granice modułów i reguły kierunku zależności (np. moduły funkcjonalne mogą zależeć od shared kernel, ale nie od siebie nawzajem). Wymuszaj to buildem (osobne moduły Gradle/Maven), testami architektury oraz wystawianiem stabilnych interfejsów/fasad zamiast sięgania do „wnętrzności”.

Domain events w monolicie: po co ich używać i jakie są pułapki?

hardmonolithsdddevents+1
Otwórz pytanie

Odpowiedź

Pomagają rozsprzęgać moduły: jeden moduł publikuje event („OrderPlaced”), a inne reagują bez ścisłych zależności. Pułapki: decyzja sync vs async, niewrzucanie ciężkiej pracy do tej samej transakcji oraz niezawodność i idempotencja handlerów (event może się powtórzyć).

Wspólna baza w monolicie: jak uniknąć „shared-everything” między modułami?

hardmonolithsboundariesdatabase+1
Otwórz pytanie

Odpowiedź

Traktuj tabele jako „własność” modułów: tylko właściciel zapisuje dane i wystawia dostęp przez swoje API/fasadę. Unikaj cross-module joinów „gdzie popadnie”; zamiast tego pobieraj dane przez moduł właściciela albo użyj domain events. Jeśli trzeba, wymuszaj to osobnymi schematami, granicami repozytoriów oraz code review/regułami architektury.