Pytania rekrutacyjne ze wzorców projektowych z odpowiedziami
Wzorce GoF w JS i React, SOLID, DRY/KISS/YAGNI, podejścia architektoniczne: MVC, Flux, FSD, Clean Architecture.
225 pytań na rozmowę rekrutacyjną z tematu Wzorce projektowe z odpowiedziami i wyjaśnieniami - poziomy Junior, Middle i Senior. Przykładowe pytania, testy online i zadania z kodu.
- GoF
- SOLID
- Architecture
- FSD
- Anti-patterns
Pytania według poziomu
Junior
Podstawowe pojęcia i składnia · 50 pytań
Middle
Praktyka, niuanse i optymalizacja · 50 pytań
Senior
Architektura, mechanizmy wewnętrzne, przypadki brzegowe · 50 pytań
Przykładowe pytania
Kilka pytań z każdego poziomu z poprawną odpowiedzią i wyjaśnieniem.
Wzorce projektowe · Junior
- Czym jest wzorzec projektowy?
Poprawna odpowiedź: Typowym rozwiązaniem często występującego problemu projektowego
Wzorzec to nie kod, lecz opis idei: jaki problem rozwiązuje, z jakich części składa się rozwiązanie, jakie ma zalety i wady. Implementacja zależy od języka i kontekstu. Znajomość wzorców daje zespołowi wspólny słownik: „tu potrzebna jest strategia” jest zrozumiałe bez długich wyjaśnień.
- Na jakie trzy grupy dzielą się klasyczne wzorce GoF?
Poprawna odpowiedź: Kreacyjne, strukturalne, behawioralne
Wzorce kreacyjne dotyczą tworzenia obiektów (Factory, Builder, Singleton), strukturalne - składania obiektów (Adapter, Decorator, Facade), behawioralne - interakcji i podziału odpowiedzialności (Observer, Strategy, Command). Książka „Bandy Czworga” (1994) opisała 23 wzorce.
- Co gwarantuje wzorzec Singleton?
Poprawna odpowiedź: Klasa ma tylko jedną instancję i globalny punkt dostępu do niej
Przykłady: jeden klient API, jeden logger, jedno połączenie z bazą. W JS najprostszy singleton to moduł:
export const api = new ApiClient()- moduł wykonuje się raz, a wszyscy importujący dostają ten sam obiekt. - Dlaczego Singleton często nazywa się antywzorcem?
Poprawna odpowiedź: Wprowadza ukryty stan globalny i utrudnia testowanie
Kod, który bezpośrednio odwołuje się do singletona, niejawnie od niego zależy: testy wpływają na siebie nawzajem, a podmiana implementacji jest trudna. Kompromis: utworzyć jedną instancję, ale przekazywać ją jawnie (dependency injection), by w testach podstawić mock.
Wzorce projektowe · Middle
- Czym Decorator różni się od Proxy, skoro ich struktura jest podobna?
Poprawna odpowiedź: Celem: Decorator dodaje zachowanie, Proxy kontroluje dostęp do obiektu
Oba opakowują obiekt tym samym interfejsem. Dekoratory zwykle się łączy, rozbudowując funkcjonalność (logowanie + cache + ponowienia). Proxy zarządza cyklem życia i dostępem: leniwe ładowanie, sprawdzanie uprawnień, zdalny obiekt. Wiele wzorców różni się właśnie celem.
- Czym Adapter różni się od Fasady?
Poprawna odpowiedź: Adapter dopasowuje interfejs do oczekiwanego, Fasada upraszcza pracę z podsystemem
Adapter zwykle opakowuje jeden obiekt i czyni go zgodnym z istniejącym kodem. Fasada definiuje nowy, prostszy interfejs nad wieloma obiektami. W praktyce warstwa API często łączy oba: fasadę nad HTTP i adaptery danych.
- Kiedy zamiast prostej fabryki odpowiednia jest Abstract Factory?
Poprawna odpowiedź: Gdy potrzebne są rodziny powiązanych, zgodnych ze sobą obiektów
Przykład: UI kit dla dwóch platform - fabryka tworzy przycisk, pole i modal w jednym stylu i nie da się ich wymieszać. Prosta fabryka wybiera jeden produkt według parametru. Nie wprowadzaj abstrakcyjnej fabryki, jeśli rodzina jest tylko jedna.
- Co jest niebezpiecznego w singletonie na poziomie modułu (
export const cache = new Map()) w aplikacji SSR?Poprawna odpowiedź: Na serwerze moduł jest wspólny dla wszystkich żądań, więc dane użytkowników się mieszają
W przeglądarce zmienna modułu żyje w obrębie jednej karty. Proces serwera obsługuje tysiące użytkowników, a wspólny cache lub store na poziomie modułu może podać dane jednego użytkownika innemu. Stan żądania tworzy się per żądanie (np.
cache()z React,QueryClientna żądanie).
Wzorce projektowe · Senior
- Czym model „sygnałów” (Solid, Preact Signals, Angular Signals) różni się od modelu React?
Poprawna odpowiedź: Aktualizują się tylko zależne miejsca, bez ponownego renderu komponentu
Sygnał to reaktywna wartość (Observer): odczyt rejestruje zależność, a zapis aktualizuje dokładnie jej subskrybentów (tekst, atrybut, obliczenie). React natomiast przerenderowuje komponent i porównuje wirtualne drzewo; React Compiler zmniejsza ten koszt, ale model jest inny.
- Jaki jest główny kompromis mikrofrontendów?
Poprawna odpowiedź: Niezależne zespoły i wdrożenia kosztem złożoności, duplikacji i spójności UX
Mikrofrontendy są uzasadnione przy wielu autonomicznych zespołach i dużym produkcie: każdą część wdraża się osobno. Kosztem są zduplikowane zależności, złożona integracja, wspólny design, routing i komunikacja między częściami. Mniejszym zespołom zwykle wystarcza modularny monolit.
- Dlaczego w Module Federation React deklaruje się jako singleton
shared?Poprawna odpowiedź: Dwie kopie React w jednej aplikacji psują hooki i kontekst
Hooki i kontekst są powiązane z konkretną instancją React: komponent ze zdalnego modułu z własną kopią powoduje „Invalid hook call”, a konteksty nie są widoczne. Współdzielone zależności-singletony wymagają uzgadniania wersji między zespołami.
- Jak działa wzorzec Strangler Fig przy migracji przestarzałego frontendu?
Poprawna odpowiedź: Nowy system stopniowo przejmuje trasy i funkcje starego, aż ten zniknie
Na przykład proxy kieruje
/checkoutdo nowej aplikacji Next.js, a resztę do starej. Ryzyko jest mniejsze niż przy „wielkim przepisaniu”: wartość dostarcza się stopniowo, a na każdym kroku można się wycofać.
Testy łączone z tym tematem
Pytania z kilku tematów naraz - jak na rozmowie rekrutacyjnej na konkretne stanowisko.
Zadania z kodu
Napisz rozwiązanie prosto w przeglądarce, a testy od razu je sprawdzą. Klasyka rozmów rekrutacyjnych: debounce, throttle, deepClone, Promise.all, EventEmitter, cache LRU i inne.
Otwórz zadania →