Frage |
Antworten |
Co to jest atak mass assignment? Lernen beginnen
|
|
Atakujący dopisuje do requestu dodatkowe pole (np. is_admin), które przez update($request->all()) zostaje masowo przypisane do modelu.
|
|
|
Czy ORM zawsze chroni przed SQL Injection? Lernen beginnen
|
|
Nie - tylko przy użyciu standardowego API z bindingami.
|
|
|
Które metody w Laravelu omijają ochronę ORM przed SQL Injection? Lernen beginnen
|
|
DB: raw(), whereRaw(), orderByRaw() oraz NativeQuery w Doctrine.
|
|
|
Jak bezpiecznie posortować wyniki po kolumnie z parametru URL? Lernen beginnen
|
|
Filtrować przez białą listę dozwolonych nazw kolumn, nigdy wstawiać wartość z requestu wprost do ORDER BY.
|
|
|
Gdzie fizycznie trzymany jest token CSRF - w cookie czy poza nim? Lernen beginnen
|
|
Poza cookie - w ukrytym polu formularza lub nagłówku.
|
|
|
Dlaczego stateless API z Bearer tokenem nie potrzebuje ochrony CSRF? Lernen beginnen
|
|
Przeglądarka nie dołącza automatycznie nagłówka Authorization do requestów z obcych stron, w przeciwieństwie do cookies.
|
|
|
Co to jest session fixation? Lernen beginnen
|
|
Atakujący podrzuca ofierze znany sobie z góry session ID, a po jej zalogowaniu przejmuje uwierzytelnioną sesję.
|
|
|
Dlaczego md5/sha1 nie nadają się do hashowania haseł? Lernen beginnen
|
|
Są celowo szybkie, co pozwala atakującemu próbować miliardy kombinacji na sekundę przy wycieku bazy.
|
|
|
Dlaczego bcrypt/argon2id nadają się do hashowania haseł? Lernen beginnen
|
|
Są celowo wolne i konfigurowalnie kosztowne, co drastycznie ogranicza liczbę prób brute-force na sekundę.
|
|
|
Co daje wbudowana sól w bcrypt/argon2id? Lernen beginnen
|
|
Dwa identyczne hasła dają różne hashe, co chroni przed rainbow tables.
|
|
|
Co to jest PHP Object Injection? Lernen beginnen
|
|
unserialize() na inpucie od atakującego może stworzyć dowolny obiekt PHP i wywołać jego magiczne metody z efektem ubocznym.
|
|
|
Czym bezpiecznie zastąpić unserialize() na danych od użytkownika? Lernen beginnen
|
|
json_decode() - nie tworzy dowolnych obiektów PHP.
|
|
|
Jak chronić logowanie przed brute-force? Lernen beginnen
|
|
Rate limiting jednocześnie per IP i per konto, plus rosnące opóźnienie po nieudanej próbie.
|
|
|
Dlaczego komunikat błędu logowania nie powinien mówić czy zły był login czy hasło? Lernen beginnen
|
|
Jeden ogólny komunikat zapobiega enumeracji istniejących kont w systemie.
|
|
|
Jaki jest realny wektor ataku przy nazwie pliku image. jpg. php? Lernen beginnen
|
|
Podwójne rozszerzenie może wykonać się jako PHP zależnie od konfiguracji serwera.
|
|
|
Jak bezpiecznie sprawdzać typ uploadowanego pliku? Lernen beginnen
|
|
Po rzeczywistej zawartości pliku, nigdy po nagłówku Content-Type kontrolowanym przez klienta.
|
|
|
Gdzie przechowywać uploadowane pliki, żeby ograniczyć ryzyko? Lernen beginnen
|
|
Poza katalogiem serwowanym bezpośrednio przez webserver, z losową nazwą pliku.
|
|
|
|
Lernen beginnen
|
|
Endpoint sprawdza czy user jest zalogowany, ale nie czy ma prawo do TEGO konkretnego zasobu.
|
|
|
Jak Policy/Voter naprawiają podatność IDOR? Lernen beginnen
|
|
Wymuszają jawne sprawdzenie uprawnień na poziomie konkretnego obiektu, np. authorize('view', $invoice).
|
|
|
Co sprawdza composer audit? Lernen beginnen
|
|
Zainstalowane wersje pakietów względem bazy znanych podatności CVE.
|
|
|
Co robi nagłówek Content-Security-Policy? Lernen beginnen
|
|
Ogranicza źródła, z których przeglądarka może ładować skrypty/style - dodatkowa warstwa obrony przed XSS.
|
|
|
Co robi nagłówek Strict-Transport-Security (HSTS)? Lernen beginnen
|
|
Wymusza, żeby przeglądarka zawsze łączyła się przez HTTPS z daną domeną.
|
|
|
Co robi X-Frame-Options / frame-ancestors? Lernen beginnen
|
|
Blokuje osadzanie strony w iframe na obcej domenie, chroniąc przed clickjackingiem.
|
|
|
Czy usunięcie sekretu z pliku w nowym commicie usuwa go z repozytorium? Lernen beginnen
|
|
Nie - sekret zostaje w historii gita, trzeba go rotować i użyć git filter-repo.
|
|
|
Dlaczego walidacja tylko po stronie frontendu to ryzyko bezpieczeństwa? Lernen beginnen
|
|
Atakujący pomija formularz i wysyła dowolny request wprost do API przez curl albo Postman.
|
|
|
Jak bezpiecznie unieważnić stateless JWT przed jego wygaśnięciem? Lernen beginnen
|
|
Krótki access token plus długożyjący refresh token po stronie serwera, który da się unieważnić.
|
|
|
Dlaczego sprawdź czy klucz istnieje, potem ustaw jest niebezpieczne dla locka w Redis? Lernen beginnen
|
|
Między dwiema operacjami jest okno czasowe, w którym inny proces zdąży zrobić to samo - race condition.
|
|
|
Co to jest XSS w skrócie? Lernen beginnen
|
|
Atak polegający na wstrzyknięciu i wykonaniu złośliwego JavaScriptu w przeglądarce ofiary.
|
|
|
Co to jest CSRF w skrócie? Lernen beginnen
|
|
Atak wykorzystujący to, że przeglądarka automatycznie dołącza cookies ofiary do sfałszowanego requestu.
|
|
|
Czym różni się kontrola przepływu w Symfony od Laravela? Lernen beginnen
|
|
W Symfony jest rozproszona i deklaratywna przez eventy, w Laravelu jawna i sekwencyjna przez middleware.
|
|
|
Czym różni się kontener Symfony od kontenera Laravela pod względem budowy? Lernen beginnen
|
|
Symfony generuje gotowy kod PHP przy kompilacji, Laravel buduje graf zależności przez Reflection w runtime.
|
|
|
Czym fundamentalnie różni się Doctrine od Eloquenta? Lernen beginnen
|
|
Doctrine to Data Mapper - encja nie wie o bazie, Eloquent to Active Record - model sam się zapisuje.
|
|
|
Co daje retry_strategy w Messengerze ponad tries/backoff z Laravela? Lernen beginnen
|
|
Osobną strategię retry per transport, konfigurowaną w YAML bez kodu w każdej wiadomości.
|
|
|
Dlaczego przełączenie symlinku na nowy release jest bezpieczne w trakcie ruchu? Lernen beginnen
|
|
Stary release nadal obsługuje ruch podczas budowania cache, a przełączenie jest atomowe.
|
|
|
Co dokładnie przechowuje OPcache? Lernen beginnen
|
|
Skompilowany opcode (bytecode), nie tekst źródłowy pliku PHP.
|
|
|
Czym różni się OPcache od Redis/Memcached? Lernen beginnen
|
|
OPcache przyspiesza wykonanie kodu PHP, Redis/Memcached cache'uje wyniki zapytań/danych.
|
|
|
Co się psuje przy opcache. validate_timestamps=0 bez restartu PHP-FPM po deployu? Lernen beginnen
|
|
Serwer nadal wykonuje stary, zcache'owany bytecode mimo podmienionych plików na dysku.
|
|
|
Jak zresetować OPcache po deployu bez restartu PHP-FPM? Lernen beginnen
|
|
|
|
|
Dlaczego strategia symlinkowa eliminuje potrzebę ręcznego resetu OPcache? Lernen beginnen
|
|
Każdy release to inna ścieżka na dysku, więc OPcache nie ma w cache nowych plików.
|
|
|
Dlaczego ALTER TABLE ADD COLUMN NOT NULL na dużej tabeli może dać downtime? Lernen beginnen
|
|
Może wymagać przepisania całej tabeli i trzymać blokadę na zapisy przez cały czas trwania.
|
|
|
Jak bezpiecznie dodać kolumnę NOT NULL na dużej tabeli? Lernen beginnen
|
|
Najpierw jako nullable, wypełnić dane w tle batchami, dopiero potem osobną migracją dodać NOT NULL.
|
|
|
Co to znaczy, że migracja musi być kompatybilna wstecz przy rolling deploy? Lernen beginnen
|
|
Stary i nowy kod działają jednocześnie na różnych instancjach - migracja nie może usuwać czegoś, z czego stary kod jeszcze korzysta.
|
|
|
Jaki jest pierwszy krok bezpiecznego dodania wymaganego pola z zerowym downtime? Lernen beginnen
|
|
Migracja dodająca kolumnę jako nullable, bez wymuszania wartości na istniejących wierszach.
|
|
|
Dlaczego worker kolejki trzeba restartować po deployu, a PHP-FPM nie? Lernen beginnen
|
|
Worker trzyma w pamięci raz wczytany kod z momentu startu procesu.
|
|
|
Jaki jest realny koszt zbyt dużej liczby indeksów przy zapisach? Lernen beginnen
|
|
Każdy indeks musi być zaktualizowany przy INSERT/UPDATE/DELETE, spowalniając zapisy.
|
|
|
Dlaczego dodaj with() wszędzie z automatu to zła praktyka? Lernen beginnen
|
|
Eager loading którego nikt nie potrzebuje marnuje czas zapytania i pamięć.
|
|
|
Co pokazuje kolumna type=ALL w EXPLAIN? Lernen beginnen
|
|
Pełny skan tabeli - silnik przegląda każdy wiersz, indeks nie jest użyty.
|
|
|
Co pokazuje kolumna type=ref lub range w EXPLAIN? Lernen beginnen
|
|
Że zapytanie korzysta z indeksu.
|
|
|
Dlaczego funkcja na kolumnie w WHERE (np. DATE(created_at)) blokuje użycie indeksu? Lernen beginnen
|
|
Indeks jest zbudowany na surowej kolumnie, nie na wyniku funkcji.
|
|
|
Dlaczego LIKE '%something%' nie może użyć standardowego indeksu B-tree? Lernen beginnen
|
|
Wildcard na początku uniemożliwia przeszukiwanie od lewej strony indeksu.
|
|
|
Dlaczego indeks na kolumnie boolean bywa bezużyteczny? Lernen beginnen
|
|
Zbyt niska selektywność - optymalizator uzna pełny skan za tańszy niż skakanie po indeksie.
|
|
|
Jaka kolumna powinna być pierwsza w indeksie kompozytowym: równościowa czy zakresowa? Lernen beginnen
|
|
Równościowa (=) - kolumna zakresowa (>, <, BETWEEN) powinna być ostatnia.
|
|
|
Dlaczego indeks kompozytowy bywa lepszy niż dwa osobne indeksy jednokolumnowe? Lernen beginnen
|
|
Pozwala w jednym przejściu po B-tree zawęzić dokładnie do potrzebnych wierszy.
|
|
|
Jaki jest koszt każdego dodatkowego indeksu? Lernen beginnen
|
|
Musi być aktualizowany przy każdym INSERT/UPDATE/DELETE, spowalniając zapisy.
|
|
|
|
Lernen beginnen
|
|
Oznaczenie rekordu jako usuniętego (np. kolumną deleted_at) zamiast fizycznego usunięcia.
|
|
|
Co to jest constraint na poziomie bazy danych? Lernen beginnen
|
|
Ograniczenie typu NOT NULL, UNIQUE, CHECK lub FOREIGN KEY wymuszane przez silnik bazy.
|
|
|
Czym różni się CHAR od VARCHAR? Lernen beginnen
|
|
CHAR ma stałą długość, VARCHAR zmienną - VARCHAR jest bardziej elastyczny.
|
|
|
Co to są migracje bazy danych? Lernen beginnen
|
|
Wersjonowanie struktury bazy pozwalające synchronizować schemat i rollbackować zmiany.
|
|
|
Jak monitorować wydajność zapytań do bazy? Lernen beginnen
|
|
Slow query log, monitoring zapytań w czasie rzeczywistym i analiza EXPLAIN.
|
|
|
Jakie błędy bazodanowe najczęściej występują na produkcji? Lernen beginnen
|
|
Brak indeksów, N+1, deadlocki, zbyt długie transakcje, brak limitów w zapytaniach.
|
|
|
Dlaczego używam ORM nie zwalnia z myślenia o wydajności zapytań? Lernen beginnen
|
|
ORM generuje SQL, ale to programista odpowiada za jego efektywność.
|
|
|
Dlaczego trzeba regularnie rotować sekrety produkcyjne? Lernen beginnen
|
|
Ograniczają okno czasowe, w którym wyciekły sekret jest użyteczny dla atakującego.
|
|
|
Co jest potrzebne, by rotacja sekretu przebiegła bez downtime? Lernen beginnen
|
|
Wsparcie dwóch aktywnych wersji naraz, zanim stara zostanie unieważniona.
|
|
|
Dlaczego aplikacja nie powinna łączyć się z bazą jako root? Lernen beginnen
|
|
Zasada least privilege ogranicza zakres szkód przy kompromitacji aplikacji.
|
|
|
Jakie uprawnienia powinien mieć użytkownik bazy używany przez aplikację? Lernen beginnen
|
|
Tylko te faktycznie potrzebne - SELECT/INSERT/UPDATE/DELETE na konkretnych tabelach.
|
|
|
Dlaczego ENV DB_PASSWORD=xyz w Dockerfile jest niebezpieczne? Lernen beginnen
|
|
Wartość zostaje na stałe w warstwie obrazu i jego historii.
|
|
|
Jak bezpiecznie przekazać sekret podczas budowania obrazu Dockera? Lernen beginnen
|
|
Przez BuildKit --secret, który nie zapisuje wartości w żadnej warstwie.
|
|
|
Gdzie trzymać sekrety używane w pipeline CI/CD? Lernen beginnen
|
|
W zaszyfrowanym storage narzędzia CI, nigdy w pliku konfiguracyjnym repo.
|
|
|
Czy maskowanie sekretów w logach CI zawsze działa? Lernen beginnen
|
|
Nie - ominie je np. zakodowanie base64 lub połączenie z innym stringiem.
|
|
|
Co daje menadżer sekretów (Vault, AWS Secrets Manager) ponad. env? Lernen beginnen
|
|
Audyt dostępu, automatyczną rotację i precyzyjne uprawnienia per sekret.
|
|
|
Dlaczego IAM role jest lepsza niż statyczny klucz API? Lernen beginnen
|
|
Dostarcza tymczasowe, automatycznie rotowane poświadczenia bez przechowywania sekretu.
|
|
|
Co robisz najpierw, gdy wycieknie sekret produkcyjny? Lernen beginnen
|
|
Natychmiastową rotację tego konkretnego sekretu.
|
|
|
Co robisz zaraz po rotacji wyciekłego sekretu? Lernen beginnen
|
|
Audyt logów dostępu i unieważnienie aktywnych sesji/tokenów.
|
|
|
Dlaczego dev/staging nie powinny mieć dostępu do prawdziwych sekretów produkcyjnych? Lernen beginnen
|
|
Mają zwykle słabsze zabezpieczenia - to najsłabsze ogniwo wycieku.
|
|
|
Dlaczego dane produkcyjne w środowisku testowym to osobne ryzyko? Lernen beginnen
|
|
Problem zgodności z RODO - dane powinny być zanonimizowane.
|
|
|
Czy usunięcie hasła z kodu w kolejnym commicie usuwa je z repo? Lernen beginnen
|
|
Nie - nadal jest w historii gita.
|
|
|
Dlaczego hardcodowanie sekretu w prywatnym repo też jest złe? Lernen beginnen
|
|
Widoczne dla każdego kto kiedykolwiek dostanie dostęp - kontraktorów, forki.
|
|
|
Co to jest build-time secret? Lernen beginnen
|
|
Sekret potrzebny tylko podczas budowania obrazu, np. token do rejestru paczek.
|
|
|
Co to jest runtime secret? Lernen beginnen
|
|
Sekret potrzebny dopiero gdy kontener działa, np. hasło do bazy.
|
|
|
Jak wstrzykiwać runtime secret do kontenera? Lernen beginnen
|
|
Przez zmienne środowiskowe albo montowany plik przy starcie, nigdy zapisany w obrazie.
|
|
|
Co kluczowego wprowadził PHP 8.0 względem PHP 7? Lernen beginnen
|
|
JIT, union types, named arguments, match expression, nullsafe operator?->, atrybuty, constructor property promotion.
|
|
|
Co to jest constructor property promotion (PHP 8.0)? Lernen beginnen
|
|
Deklarowanie i przypisywanie właściwości klasy bezpośrednio w sygnaturze konstruktora, bez powtarzania kodu.
|
|
|
Czym różni się match od switch w PHP 8? Lernen beginnen
|
|
match używa ścisłego porównania (===), nie wymaga break i zwraca wartość jako wyrażenie.
|
|
|
Co robi operator nullsafe?-> w PHP 8? Lernen beginnen
|
|
Zwraca null zamiast rzucać błąd, jeśli obiekt po lewej stronie jest null, przerywając dalsze wywołania łańcucha.
|
|
|
Co zmienił PHP 8.0 w obsłudze błędów funkcji wbudowanych? Lernen beginnen
|
|
Wiele z nich zaczęło rzucać TypeError zamiast zwracać null/warning przy złych argumentach.
|
|
|
|
Lernen beginnen
|
|
Enumy, readonly properties, fibers, first-class callable syntax, typy intersection.
|
|
|
Czym są readonly properties (PHP 8.1)? Lernen beginnen
|
|
Właściwość można zainicjalizować tylko raz w dozwolonym kontekście inicjalizacji (typowo konstruktor, ale nie jedyny możliwy przypadek) - kolejna próba przypisania rzuca błąd.
|
|
|
Co to są enumy w PHP 8.1? Lernen beginnen
|
|
Typ wyliczeniowy z ograniczonym zbiorem wartości, może implementować interfejsy i mieć metody.
|
|
|
|
Lernen beginnen
|
|
Readonly classes, typy DNF, standalone types (true/false/null), deprecację dynamicznych właściwości.
|
|
|
Co zmienia deprecacja dynamicznych właściwości w PHP 8.2? Lernen beginnen
|
|
Przypisanie właściwości nieistniejącej w deklaracji klasy generuje deprecation warning.
|
|
|
|
Lernen beginnen
|
|
Typed class constants, atrybut #[Override], funkcję json_validate().
|
|
|
|
Lernen beginnen
|
|
Property hooks i asymmetric visibility dla właściwości.
|
|
|
Co to jest asymmetric visibility (PHP 8.4)? Lernen beginnen
|
|
Różna widoczność dla odczytu i zapisu tej samej właściwości, np. public read, private set.
|
|
|
Czym HTTP/2 różni się od HTTP/1.1? Lernen beginnen
|
|
Multiplexing wielu requestów na jednym połączeniu TCP zamiast head-of-line blocking.
|
|
|
Czym HTTP/3 różni się od HTTP/2? Lernen beginnen
|
|
Działa na protokole QUIC (UDP) zamiast TCP, eliminując blokowanie na poziomie transportu.
|
|
|
Czym Symfony Console różni się architektonicznie od Laravel Artisan? Lernen beginnen
|
|
Artisan jest w praktyce cienką nakładką na komponent symfony/console używany przez Laravel pod spodem.
|
|
|
Czy Symfony ma wbudowany scheduler jak Laravel? Lernen beginnen
|
|
Nie tradycyjnie - klasyczne podejście to zwykły cron systemowy wołający komendę konsolową (od Symfony 7.3 istnieje komponent Scheduler).
|
|
|
Co oznacza akronim SOLID? Lernen beginnen
|
|
Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.
|
|
|
Czym różni się DRY od KISS? Lernen beginnen
|
|
DRY mówi nie powielaj logiki, KISS mówi nie komplikuj bez potrzeby - trzeba balansować oba.
|
|
|
|
Lernen beginnen
|
|
You Aren't Gonna Need It - nie implementuj czegoś, dopóki nie jest faktycznie potrzebne.
|
|
|
Co oznacza SRP w praktyce? Lernen beginnen
|
|
Jedna klasa, jeden powód do zmiany.
|
|
|
Dlaczego rozbicie OrderService na mniejsze klasy nie jest tylko estetyczne? Lernen beginnen
|
|
Każda odpowiedzialność zmienia się z innego powodu i w innym tempie.
|
|
|
Jaki wzorzec zastępuje rosnący if/elseif na typ płatności? Lernen beginnen
|
|
Strategy pattern - interfejs z osobną implementacją per dostawca.
|
|
|
Jak dodanie nowego dostawcy płatności zgodnie z OCP wpływa na istniejący kod? Lernen beginnen
|
|
Zwykle nie wymaga zmiany istniejącego kodu biznesowego - dodajemy nową klasę implementującą interfejs i konfigurujemy DI.
|
|
|
Co łamie zasadę LSP w przykładzie CachedRepository rzucającego wyjątek zamiast zwrócić null? Lernen beginnen
|
|
Podklasa zmienia kontrakt metody bazowej w sposób niewidoczny na etapie kompilacji.
|
|
|
Dlaczego złamanie LSP jest podstępniejsze niż inne naruszenia SOLID? Lernen beginnen
|
|
Kod kompiluje się i przechodzi typechecking, a mimo to zachowuje się nieprzewidywalnie w runtime.
|
|
|
Co łamie ISP w jednym dużym interfejsie Repository? Lernen beginnen
|
|
Klasa musi implementować metody, których nigdy nie użyje.
|
|
|
Jak naprawić naruszenie ISP w dużym interfejsie? Lernen beginnen
|
|
Rozbić na mniejsze, węższe interfejsy per odpowiedzialność.
|
|
|
Czym DI (Dependency Injection) różni się od DIP (Dependency Inversion)? Lernen beginnen
|
|
DI to technika wstrzykiwania obiektu, DIP to zasada zależności od abstrakcji, nie konkretnej implementacji.
|
|
|
Czy można stosować DI bez DIP? Lernen beginnen
|
|
Tak - wstrzykując konkretną klasę zamiast interfejsu, logika nadal jest sprzężona z implementacją.
|
|
|
Kiedy Repository pattern faktycznie się opłaca? Lernen beginnen
|
|
Gdy realnie planujesz zmianę źródła danych albo chcesz testować logikę bez zależności od frameworka.
|
|
|
Kiedy Repository pattern to niepotrzebny narzut? Lernen beginnen
|
|
W małej aplikacji CRUD, gdzie Eloquent wystarczy na lata.
|
|
|
Jak Decorator dodaje cache do repozytorium bez zmiany jego kodu? Lernen beginnen
|
|
Nowa klasa implementuje ten sam interfejs i owija realną implementację.
|
|
|
Czy Laravel Events / Symfony EventDispatcher to czysty GoF Observer? Lernen beginnen
|
|
Nie do końca - pośredniczy globalny Dispatcher, subject nie zna listenerów bezpośrednio.
|
|
|
Jaki jest sygnał, że wzorzec projektowy to overengineering? Lernen beginnen
|
|
Interfejs z jedną, jedyną implementacją na wszelki wypadek.
|
|
|
Do czego służy typ String w Redis? Lernen beginnen
|
|
Cache pojedynczej wartości lub licznik przez INCR.
|
|
|
Do czego służy typ Hash w Redis? Lernen beginnen
|
|
Mapa pole-wartość pod jednym kluczem, np. cały obiekt usera bez serializacji do JSON.
|
|
|
Do czego służy typ List w Redis? Lernen beginnen
|
|
Prosta kolejka lub stos przez LPUSH/RPOP.
|
|
|
Do czego służy typ Set w Redis? Lernen beginnen
|
|
Unikalne elementy z szybkim sprawdzeniem przynależności przez SISMEMBER.
|
|
|
Do czego służy Sorted Set w Redis? Lernen beginnen
|
|
Ranking/leaderboard i rate limiting z oknem czasowym przez ZADD/ZRANGE.
|
|
|
|
Lernen beginnen
|
|
Okresowy snapshot całego stanu do pliku binarnego - szybki restart, ryzyko utraty danych od ostatniego zapisu.
|
|
|
|
Lernen beginnen
|
|
Log każdej operacji zapisu, jak WAL - mniejsza utrata danych, wolniejszy restart.
|
|
|
Która polityka eviction pasuje do Redisa jako czystego cache? Lernen beginnen
|
|
allkeys-lru lub allkeys-lfu.
|
|
|
Dlaczego noeviction jest błędem dla czystego cache? Lernen beginnen
|
|
Redis zacznie odrzucać zapisy zamiast usuwać stare wpisy przy zapełnionej pamięci.
|
|
|
Jaki jest problem z rate limitingiem przez osobne INCR i EXPIRE? Lernen beginnen
|
|
Między komendami jest okno czasowe - klucz może zostać bez TTL na zawsze.
|
|
|
Jak bezpiecznie zrobić atomowy rate limiting w Redis? Lernen beginnen
|
|
Skryptem Lua łączącym INCR i EXPIRE w jedną niepodzielną operację.
|
|
|
Jaka jest pułapka Redisa jako session store przy równoległych requestach? Lernen beginnen
|
|
Drugi zapis może nadpisać zmiany pierwszego (lost update).
|
|
|
Jaka jedna komenda bezpiecznie realizuje distributed lock w Redis? Lernen beginnen
|
|
|
|
|
|
Lernen beginnen
|
|
Monitoruje master/replica i automatycznie promuje replikę przy awarii.
|
|
|
|
Lernen beginnen
|
|
Dzieli dane (sharding) między wiele węzłów po hashu klucza.
|
|
|
Dlaczego KEYS pattern* jest niebezpieczne na produkcji? Lernen beginnen
|
|
Redis jest jednowątkowy - KEYS blokuje wszystkie inne operacje na czas skanowania.
|
|
|
Czym zastąpić KEYS na produkcji? Lernen beginnen
|
|
|
|
|
Jak działa exchange typu direct? Lernen beginnen
|
|
Routing key musi dokładnie pasować do binding key kolejki.
|
|
|
Jak działa exchange typu topic? Lernen beginnen
|
|
Routing key z wildcardami * i # - elastyczne dopasowanie wzorca.
|
|
|
Jak działa exchange typu fanout? Lernen beginnen
|
|
Ignoruje routing key, wysyła kopię do wszystkich podłączonych kolejek.
|
|
|
Jak działa exchange typu headers? Lernen beginnen
|
|
Routing na podstawie nagłówków wiadomości, nie routing key.
|
|
|
Co gwarantuje trwałość samej definicji kolejki? Lernen beginnen
|
|
durable: true przy deklaracji kolejki.
|
|
|
Co gwarantuje zapisanie konkretnej wiadomości na dysk? Lernen beginnen
|
|
delivery_mode: 2 (persistent message).
|
|
|
Czy sama durable queue wystarczy, by wiadomość przeżyła restart brokera? Lernen beginnen
|
|
Nie - potrzebna jest też persistent message.
|
|
|
Co się dzieje z wiadomością przy auto-ack, gdy konsument padnie w trakcie przetwarzania? Lernen beginnen
|
|
Jest bezpowrotnie stracona - broker uznał ją za dostarczoną od razu.
|
|
|
Co się dzieje z wiadomością przy manual ack, gdy konsument padnie przed ack? Lernen beginnen
|
|
Broker wykrywa zerwane połączenie i doręcza ją ponownie.
|
|
|
Co określa prefetch count? Lernen beginnen
|
|
Ile nieodpowiedzianych wiadomości broker może wysłać do jednego konsumenta naraz.
|
|
|
Dlaczego brak limitu prefetch jest niebezpieczny? Lernen beginnen
|
|
Może zalać wolnego konsumenta tysiącami wiadomości naraz.
|
|
|
Kiedy wiadomość trafia do Dead Letter Exchange? Lernen beginnen
|
|
Gdy zostanie odrzucona, wygaśnie jej TTL, albo kolejka osiągnie max długość.
|
|
|
Czym DLX różni się od failed_jobs w Laravelu? Lernen beginnen
|
|
Działa na poziomie brokera, łapie też przypadki jak OOM kill konsumenta.
|
|
|
Dlaczego kolejki gwarantują at-least-once, a nie exactly-once? Lernen beginnen
|
|
Broker nie ma pewności, czy konsument zdążył wysłać ack po przetworzeniu.
|
|
|
Co musi zapewnić kod konsumenta przy at-least-once delivery? Lernen beginnen
|
|
Idempotentność - wielokrotne przetworzenie tej samej wiadomości musi dać ten sam efekt.
|
|
|
Czym różni się Redis pub/sub od RabbitMQ trwałościowo? Lernen beginnen
|
|
Redis pub/sub jest bez trwałości - nieaktywny subskrybent traci wiadomość bezpowrotnie.
|
|
|
Co daje Laravel Queues/Symfony Messenger ponad surowy RabbitMQ? Lernen beginnen
|
|
Wspólne API retry/backoff/failed jobs niezależnie od backendu.
|
|
|
Jaki błąd produkcyjny powoduje niekontrolowany wzrost opóźnień w kolejkach? Lernen beginnen
|
|
Konsumenci przestają działać, a producenci dalej publikują.
|
|
|
Co to są Jobs/Queues w skrócie? Lernen beginnen
|
|
Mechanizm asynchronicznego wykonywania zadań, np. maili, webhooków, długich operacji.
|
|
|
Do czego służy Horizon (Laravel) / Messenger (Symfony) na poziomie operacyjnym? Lernen beginnen
|
|
Monitoring kolejek, zarządzanie workerami, retry i failure handling.
|
|
|
Po co fixtures, skoro są migracje? Lernen beginnen
|
|
Migracje odpowiadają za strukturę bazy, fixtures za przewidywalne dane testowe.
|
|
|
Czym różni się Stub od Mocka? Lernen beginnen
|
|
Stub tylko zwraca dane, Mock dodatkowo weryfikuje jak został wywołany.
|
|
|
Czym różni się Fake od Spy? Lernen beginnen
|
|
Fake to uproszczona implementacja, Spy obserwuje wywołania prawdziwego obiektu.
|
|
|
Jakie są trzy główne rodzaje testów? Lernen beginnen
|
|
Unit, integracyjne i end-to-end (E2E).
|
|
|
Co sprawdzają testy jednostkowe? Lernen beginnen
|
|
Pojedynczą jednostkę kodu w izolacji - powinny być szybkie i deterministyczne.
|
|
|
Co sprawdzają testy integracyjne? Lernen beginnen
|
|
Współpracę kilku komponentów, np. serwis plus baza danych.
|
|
|
Co mówi piramida testów (test pyramid)? Lernen beginnen
|
|
Dużo testów unit, mniej integracyjnych, najmniej E2E.
|
|
|
|
Lernen beginnen
|
|
Cykl: napisz test (red), zaimplementuj (green), refactor.
|
|
|
Czym BDD różni się od TDD? Lernen beginnen
|
|
Skupia się na zachowaniu systemu z perspektywy użytkownika, językiem Given/When/Then.
|
|
|
Czy 100% code coverage oznacza brak bugów? Lernen beginnen
|
|
Nie - coverage pokazuje ile kodu jest testowane, nie jakość testów.
|
|
|
Co robi statyczna analiza kodu? Lernen beginnen
|
|
Wykrywa błędy typów, martwy kod i naruszenia standardów bez uruchamiania programu.
|
|
|
Jakie narzędzia do statycznej analizy PHP są popularne? Lernen beginnen
|
|
PHPStan, Psalm, PHP_CodeSniffer.
|
|
|
|
Lernen beginnen
|
|
Test, który losowo przechodzi lub failuje, często przez zależność od czasu lub async.
|
|
|
Jak radzić sobie z flaky testami? Lernen beginnen
|
|
Eliminacja sleepów, stabilne dane, poprawna synchronizacja zamiast czekania na czas.
|
|
|
Dlaczego rebase na wypchniętej gałęzi jest niebezpieczny? Lernen beginnen
|
|
Przepisuje historię - każdy commit dostaje nowy hash, rozjeżdżając się z kopiami innych osób.
|
|
|
Na jakich gałęziach bezpiecznie robić rebase? Lernen beginnen
|
|
Tylko lokalnych, niewypchniętych.
|
|
|
Co robi squash w interactive rebase? Lernen beginnen
|
|
Łączy kilka commitów w jeden.
|
|
|
Kiedy stosuje się interactive rebase przed PR? Lernen beginnen
|
|
Żeby uporządkować bałagan commitów w czytelną historię dla reviewera.
|
|
|
Na czym polega git bisect? Lernen beginnen
|
|
Wyszukiwanie binarne commita, który wprowadził regresję.
|
|
|
O ile szybszy jest git bisect od ręcznego przeglądania przy 1000 commitach? Lernen beginnen
|
|
Potrzeba ok. 10 kroków zamiast setek.
|
|
|
|
Lernen beginnen
|
|
Każdą zmianę wskaźnika HEAD lokalnie, nawet commity niedostępne z żadnej gałęzi.
|
|
|
Jak odzyskać commity po przypadkowym git reset --hard? Lernen beginnen
|
|
Znaleźć je w git reflog i zrobić reset --hard na tamten hash.
|
|
|
Do czego służy git cherry-pick? Lernen beginnen
|
|
Przeniesienia jednego konkretnego commita na inną gałąź, np. hotfix backport.
|
|
|
Jaki jest kompromis git-flow względem trunk-based development? Lernen beginnen
|
|
Więcej struktury i bezpieczeństwa wydań kosztem bolesnych merge'y długich gałęzi.
|
|
|
|
Lernen beginnen
|
|
Prosi proces o zakończenie, dając szansę posprzątać.
|
|
|
Co robi kill -9 (SIGKILL)? Lernen beginnen
|
|
Natychmiast ubija proces bez żadnej szansy na sprzątanie.
|
|
|
|
Lernen beginnen
|
|
Tylko gdy proces zawiesił się i nie reaguje na SIGTERM.
|
|
|
Dlaczego chmod -R 777 na storage/var to zły pomysł? Lernen beginnen
|
|
Daje zapis każdemu userowi na serwerze, nie tylko procesowi PHP-FPM.
|
|
|
Jakie poprawne uprawnienia dla katalogu storage/var? Lernen beginnen
|
|
chown na usera serwera (np. www-data) plus chmod 775.
|
|
|
Dlaczego trzeba restartować workery kolejki po deployu? Lernen beginnen
|
|
Trzymają w pamięci stary kod wczytany przy starcie procesu.
|
|
|
Dlaczego hasło do SSH to zła praktyka? Lernen beginnen
|
|
Podatne na brute-force i wymaga przesyłania sekretu przy każdym logowaniu.
|
|
|
|
Lernen beginnen
|
|
Trzyma odszyfrowany klucz prywatny w pamięci, żeby nie wpisywać passphrase za każdym razem.
|
|
|
|
Lernen beginnen
|
|
Pokazuje na żywo nowe linie dopisywane do pliku logu.
|
|
|
Do czego służy journalctl -f? Lernen beginnen
|
|
To samo co tail -f, ale dla logów usług zarządzanych przez systemd.
|
|
|
Dlaczego warto mieć jeden spójny kształt JSON błędu API? Lernen beginnen
|
|
Frontend pisze jedną ścieżkę obsługi błędów zamiast rozgałęziać się per typ.
|
|
|
Które metody HTTP są idempotentne? Lernen beginnen
|
|
|
|
|
Czy POST jest idempotentny? Lernen beginnen
|
|
Nie - powtórzenie tworzy kolejny zasób.
|
|
|
Jak zweryfikować, że webhook faktycznie pochodzi od zaufanego nadawcy? Lernen beginnen
|
|
Weryfikacja podpisu HMAC liczonego ze wspólnego sekretu.
|
|
|
Od czego zacząć odpowiedź na pytanie zaprojektuj system X? Lernen beginnen
|
|
Od pytań doprecyzowujących skalę i wymagania, nie od razu od technologii.
|
|
|
Co przede wszystkim ocenia rekruter w pytaniu system design? Lernen beginnen
|
|
Proces dochodzenia do rozwiązania i zadawane pytania, nie podręcznikową odpowiedź.
|
|
|
Dlaczego skalowanie poziome wymaga aplikacji stateless? Lernen beginnen
|
|
Każdy request może trafić na dowolną instancję i musi dostać ten sam wynik.
|
|
|
Co się psuje przy skalowaniu poziomym, jeśli sesja jest w pamięci procesu? Lernen beginnen
|
|
User przekierowany na inną instancję przestaje być rozpoznawany jako zalogowany.
|
|
|
Co robi strategia cache-aside? Lernen beginnen
|
|
Aplikacja czyta cache, przy miss czyta bazę i sama zapisuje wynik do cache.
|
|
|
Który wzorzec cache stosuje typowa aplikacja Laravel/Symfony z Redis? Lernen beginnen
|
|
Cache-aside, przez Cache: remember().
|
|
|
|
Lernen beginnen
|
|
Każdy zapis aktualizuje jednocześnie bazę i cache.
|
|
|
|
Lernen beginnen
|
|
Zapis trafia najpierw do cache, do bazy asynchronicznie z opóźnieniem.
|
|
|
Kiedy relacyjna baza jest lepszym wyborem niż NoSQL? Lernen beginnen
|
|
Gdy dane mają silne relacje i potrzebujesz transakcyjności ACID.
|
|
|
Kiedy NoSQL dokumentowa faktycznie coś daje? Lernen beginnen
|
|
Gdy struktura danych jest zmienna między rekordami albo unikasz kosztownych JOINów.
|
|
|
Czym różni się token bucket od sliding window w rate limiterze? Lernen beginnen
|
|
Token bucket pozwala na krótkie wybuchy ruchu, sliding window liczy dokładnie w oknie czasowym.
|
|
|
Jaki redirect HTTP utrudnia zliczanie kliknięć w URL shortenerze? Lernen beginnen
|
|
301, bo jest cache'owany przez przeglądarkę.
|
|
|
Który redirect daje dokładną analitykę kliknięć w URL shortenerze? Lernen beginnen
|
|
Analitykę zapewnia przede wszystkim endpoint aplikacji rejestrujący kliknięcie przed redirectem - 302/307 można użyć do samego przekierowania, ale trzeba uwzględnić cache i zachowanie klienta.
|
|
|
Jaka jest praktyczna konsekwencja CAP theorem dla read replica MySQL? Lernen beginnen
|
|
Odczyt zaraz po zapisie powinien iść do mastera, nie do repliki z replication lag.
|
|
|
Dlaczego sticky sessions są gorsze niż współdzielony session store? Lernen beginnen
|
|
Nierównomierne obciążenie i utrata sesji przy awarii konkretnej instancji.
|
|
|
Czym różni się == od === w PHP? Lernen beginnen
|
|
== porównuje z konwersją typów, === porównuje wartość i typ.
|
|
|
Dlaczego type juggling bywa niebezpieczny? Lernen beginnen
|
|
Może dać nieoczekiwane wyniki logiczne przy porównaniach dwóch różnych typów.
|
|
|
Jak uniknąć niejawnej konwersji typów przy porównaniach? Lernen beginnen
|
|
Używać === i jawnego rzutowania zamiast ==.
|
|
|
Do czego służy declare(strict_types=1)? Lernen beginnen
|
|
Wymusza ścisłe typowanie argumentów i wartości zwracanych funkcji.
|
|
|
Czym różni się isset() od empty()? Lernen beginnen
|
|
isset() sprawdza istnienie i brak null, empty() dodatkowo traktuje 0, pusty string i false jako puste.
|
|
|
Czym różni się require od include? Lernen beginnen
|
|
require rzuca fatal error przy braku pliku, include tylko warning.
|
|
|
Po co _once w require_once/include_once? Lernen beginnen
|
|
Zapobiega wielokrotnemu załadowaniu tego samego pliku.
|
|
|
|
Lernen beginnen
|
|
Standard mapowania namespace na katalog na dysku dla autoloadingu.
|
|
|
Jak działa garbage collector w PHP? Lernen beginnen
|
|
Reference counting plus wykrywanie cykli referencji.
|
|
|
Jak ręcznie wymusić wykrycie cykli referencji w PHP? Lernen beginnen
|
|
|
|
|
Co robi magiczna metoda __toString? Lernen beginnen
|
|
Definiuje jak obiekt zamienia się na string, np. przy echo $obj.
|
|
|
Jakie ryzyko niesie nadużywanie __get/__set/__call? Lernen beginnen
|
|
Zachowanie klasy przestaje wynikać wprost z jej deklarowanych właściwości i metod.
|
|
|
Czym różni się trait od abstract class? Lernen beginnen
|
|
Trait to reużycie kodu bez hierarchii, klasa może użyć wielu traitów naraz.
|
|
|
Ile klas abstrakcyjnych może dziedziczyć jedna klasa PHP? Lernen beginnen
|
|
|
|
|
Co robi late static binding (static:)? Lernen beginnen
|
|
Odnosi się do klasy, na której faktycznie wywołano metodę, nie do klasy ją deklarującej.
|
|
|
Czym różni się static: od self:? Lernen beginnen
|
|
self: zawsze wskazuje klasę deklarującą metodę, static: klasę wywołującą.
|
|
|
Co to są union types w PHP? Type2 pozwalający określić kilka możliwych typów. Lernen beginnen
|
|
|
|
|
Co oznacza? Type w sygnaturze PHP? Lernen beginnen
|
|
Typ nullable, równoważne Type
|
|
|
Dlaczego warto unikać typu mixed? Lernen beginnen
|
|
Utrudnia testowanie, statyczną analizę i ukrywa realny kontrakt funkcji.
|
|
|
Co to jest immutability obiektu? Lernen beginnen
|
|
Obiekt nie zmienia stanu po utworzeniu - każda zmiana zwraca nowy obiekt.
|
|
|
|
Lernen beginnen
|
|
Obiekt reprezentujący wartość bez własnej tożsamości, porównywany przez wartość, nie ID.
|
|
|
Czym jest callable w PHP? Lernen beginnen
|
|
Typ reprezentujący funkcję, metodę lub closure, którą można wywołać.
|
|
|
Co pozwala closure przechwycić ze swojego zewnętrznego zakresu? Lernen beginnen
|
|
Zmienne, przez słowo kluczowe use.
|
|
|
Kiedy warto użyć generatora (yield)? Lernen beginnen
|
|
Przy pracy z dużymi zbiorami danych - oszczędza pamięć, generując dane na żądanie.
|
|
|
Czym różni się Error od Exception w PHP? Lernen beginnen
|
|
Exception to błędy aplikacyjne, Error to błędy silnika PHP - oba implementują Throwable.
|
|
|
Po co jest namespacing w PHP? Lernen beginnen
|
|
Zapobiega konfliktom nazw klas i funkcji, ułatwia organizację dużych projektów.
|
|
|
Dlaczego __autoload() jest dziś przestarzały? Lernen beginnen
|
|
Zastąpiony przez Composer i PSR-4.
|
|
|
Co to jest fluent interface? Lernen beginnen
|
|
Styl API umożliwiający łańcuchowe wywołania metod.
|
|
|
Czym różnią się echo i print w PHP? Lernen beginnen
|
|
echo jest szybsze i nie zwraca wartości, print zwraca 1.
|
|
|
Co może prowadzić do memory leak w PHP mimo automatycznego zwalniania pamięci po requeście? Lernen beginnen
|
|
Cykle referencji, statyczny cache i długie procesy CLI/workery.
|
|
|
|
Lernen beginnen
|
|
Kontrakt umożliwiający komunikację między systemami, definiujący operacje, format danych i autoryzację.
|
|
|
Na czym opiera się styl architektoniczny REST? Lernen beginnen
|
|
Na zasobach, metodach HTTP, statelessness i jednolitym interfejsie.
|
|
|
Czym różni się REST od SOAP? Lernen beginnen
|
|
REST jest lekki i używa JSON/HTTP, SOAP jest cięższy, oparty na XML i różnych protokołach.
|
|
|
Czym różni się REST od GraphQL pod względem endpointów? Lernen beginnen
|
|
REST ma wiele endpointów, GraphQL jeden endpoint z precyzyjnymi zapytaniami.
|
|
|
Jaki jest częsty problem REST, który rozwiązuje GraphQL? Lernen beginnen
|
|
Overfetching - pobieranie więcej danych niż faktycznie potrzeba.
|
|
|
Co to jest zasób (resource) w REST? Lernen beginnen
|
|
Logiczny byt, np. /users albo /orders/123, na którym operuje się metodami HTTP.
|
|
|
Do czego służy metoda GET? Lernen beginnen
|
|
|
|
|
Do czego służy metoda POST? Lernen beginnen
|
|
Utworzenie nowego zasobu.
|
|
|
Czym różni się PUT od PATCH? Lernen beginnen
|
|
PUT robi pełną aktualizację zasobu, PATCH częściową.
|
|
|
Co oznaczają kody statusu z grupy 2xx? Lernen beginnen
|
|
|
|
|
Co oznaczają kody statusu z grupy 4xx? Lernen beginnen
|
|
|
|
|
Co oznaczają kody statusu z grupy 5xx? Lernen beginnen
|
|
|
|
|
Czym różni się 401 od 403? Lernen beginnen
|
|
401 to brak autentykacji, 403 to brak uprawnień mimo zalogowania.
|
|
|
|
Lernen beginnen
|
|
Błąd walidacji danych wejściowych.
|
|
|
Co to jest stateless API? Lernen beginnen
|
|
Serwer nie przechowuje stanu klienta między requestami - każdy request musi nieść komplet informacji.
|
|
|
Czym różni się autentykacja od autoryzacji? Lernen beginnen
|
|
Autentykacja to kim jesteś, autoryzacja to co możesz zrobić.
|
|
|
Jakie są najpopularniejsze metody autentykacji w API? Lernen beginnen
|
|
Basic Auth, token Bearer, OAuth2, JWT.
|
|
|
Z jakich trzech części składa się JWT? Lernen beginnen
|
|
Header, payload i signature.
|
|
|
|
Lernen beginnen
|
|
Do autoryzacji dostępu do zasobów bez ujawniania hasła, często w integracjach zewnętrznych.
|
|
|
|
Lernen beginnen
|
|
HTTP callback wysyłany przez system zewnętrzny po zajściu zdarzenia.
|
|
|
Po co jest rate limiting w API? Lernen beginnen
|
|
Chroni przed nadużyciami, atakami DDoS i błędnymi integracjami.
|
|
|
Czym różni się paginacja offset-based od cursor-based? Lernen beginnen
|
|
Cursor-based lepiej się skaluje przy dużych zbiorach danych.
|
|
|
Jak bezpiecznie wersjonować API? Lernen beginnen
|
|
Przez prefiks w URL (/api/v1), nagłówek lub subdomenę - nigdy łamiąc kontrakt bez wersji.
|
|
|
Co to jest backward compatibility w API? Lernen beginnen
|
|
Nowa wersja API nie psuje działania istniejących klientów.
|
|
|
Po co są timeouty w integracjach? Lernen beginnen
|
|
Chronią system przed wiszącymi requestami i blokowaniem zasobów.
|
|
|
Kiedy stosować retry przy integracji z zewnętrznym API? Lernen beginnen
|
|
Przy timeout i błędach 5xx, zawsze z limitem prób i backoffem.
|
|
|
Co to jest Circuit Breaker? Lernen beginnen
|
|
Mechanizm zapobiegający ciągłym wywołaniom niedziałającego serwisu, chroniący przed kaskadowymi awariami.
|
|
|
Czym różni się integracja synchroniczna od asynchronicznej? Lernen beginnen
|
|
Synchroniczna czeka na odpowiedź, asynchroniczna działa przez event/kolejkę/webhook.
|
|
|
Co powinno się logować przy komunikacji API? Lernen beginnen
|
|
Request id, status odpowiedzi, czas trwania - nigdy dane wrażliwe.
|
|
|
Do czego służy OpenAPI/Swagger? Lernen beginnen
|
|
Dokumentacja, kontrakt API i generowanie klientów.
|
|
|
Co sprawdzają testy kontraktowe? Lernen beginnen
|
|
Zgodność API między konsumentem a dostawcą, ważne przy mikroserwisach.
|
|
|
Do czego służy API Gateway? Lernen beginnen
|
|
Routing, autoryzacja, rate limiting i monitoring w jednym miejscu przed właściwymi serwisami.
|
|
|
|
Lernen beginnen
|
|
Kultura i zestaw praktyk łączących development i operacje, celem szybszego i stabilnego deploymentu.
|
|
|
Co to jest środowisko (environment) w kontekście aplikacji? Lernen beginnen
|
|
Oddzielna konfiguracja aplikacji, np. local, staging, production.
|
|
|
Dlaczego nie wolno pracować bezpośrednio na produkcji? Lernen beginnen
|
|
Ryzyko utraty danych, downtime'u i nieodwracalnych błędów.
|
|
|
|
Lernen beginnen
|
|
Platforma do uruchamiania aplikacji w kontenerach, zapewniająca spójność środowiska.
|
|
|
Czym różni się Docker od maszyny wirtualnej? Lernen beginnen
|
|
Docker jest lżejszy, dzieli jądro systemu, szybciej startuje.
|
|
|
|
Lernen beginnen
|
|
Bazowy image, zależności i sposób uruchomienia aplikacji.
|
|
|
Do czego służy Docker Compose? Lernen beginnen
|
|
Uruchamia wiele kontenerów (aplikacja, baza, cache) jednym poleceniem.
|
|
|
Jak wygląda typowy setup PHP w Dockerze? Lernen beginnen
|
|
PHP-FPM, Nginx, baza danych (MySQL/Postgres) i Redis.
|
|
|
|
Lernen beginnen
|
|
Continuous Integration - automatyczne testy i build przy każdej zmianie.
|
|
|
|
Lernen beginnen
|
|
Continuous Deployment/Delivery - automatyczne wdrażanie zmian.
|
|
|
Co powinno się dziać w typowym pipeline CI? Lernen beginnen
|
|
Lint, statyczna analiza, testy, build.
|
|
|
Na czym polega blue-green deployment? Lernen beginnen
|
|
Dwie wersje produkcji (stara i nowa) pozwalające na szybki rollback.
|
|
|
Na czym polega canary release? Lernen beginnen
|
|
Nowa wersja trafia najpierw do małej części użytkowników, minimalizując ryzyko.
|
|
|
Do czego służą feature flags? Lernen beginnen
|
|
Kontrola funkcji, szybkie wyłączanie i testy A/B bez nowego deployu.
|
|
|
|
Lernen beginnen
|
|
Endpoint sprawdzający stan aplikacji, używany przez load balancer i orchestrator.
|
|
|
Po co jest load balancer? Lernen beginnen
|
|
Rozkłada ruch na wiele instancji aplikacji, zwiększając dostępność.
|
|
|
Co powinno się monitorować w aplikacji produkcyjnej? Lernen beginnen
|
|
Uptime, zużycie CPU/RAM, czas odpowiedzi, error rate.
|
|
|
|
Lernen beginnen
|
|
Powiadamia o problemach zanim zauważy je użytkownik.
|
|
|
Jak często i co warto backupować? Lernen beginnen
|
|
Bazę danych i pliki - zawsze regularnie testując proces przywracania.
|
|
|
Kiedy i jak robić rollback wdrożenia? Lernen beginnen
|
|
Przy błędach krytycznych lub spadku wydajności - rollback musi być szybki, przewidywalny i najlepiej zautomatyzowany.
|
|
|
Czym różni się CLI od Web w kontekście PHP? Lernen beginnen
|
|
CLI to długie procesy jak cron i queue workery, Web to krótki cykl życia requestu.
|
|
|
Do czego służy cron w aplikacji webowej? Lernen beginnen
|
|
Zadania cykliczne, sprzątanie, raporty.
|
|
|
Czym jest worker w architekturze aplikacji? Lernen beginnen
|
|
Proces przetwarzający zadania asynchroniczne z kolejki.
|
|
|
Jak unikać memory leaków w długo działających workerach? Lernen beginnen
|
|
Regularny restart workerów i unikanie statycznego cache w pamięci.
|
|
|
Co to znaczy przygotować aplikację pod produkcję (Laravel/Symfony)? Lernen beginnen
|
|
Cache config/routes, włączony OPcache, env prod, wyłączony debug.
|
|
|
Jaki jest pierwszy krok rozbicia fat controllera? Lernen beginnen
|
|
Zidentyfikować odrębne odpowiedzialności wymieszane w jednej metodzie.
|
|
|
Czym różni się DTO od Value Object na przykładzie Money? Lernen beginnen
|
|
DTO to płaski nośnik danych bez logiki, Value Object hermetyzuje wartość razem z logiką i jest niemutowalny.
|
|
|
Jakie konkretne liczby warto podać projektując retry logic do API płatności? Lernen beginnen
|
|
Np. 3 próby, exponential backoff 1s/2s/4s, retry tylko dla 5xx/timeout, nigdy dla 4xx.
|
|
|
Co brać pod uwagę decydując hotfix teraz czy porządna naprawa za 2 dni? Lernen beginnen
|
|
Wpływ biznesowy, ryzyko samego hotfixa i jawną komunikację decyzji zespołowi.
|
|
|
Jak zorganizować foldery modularnego monolitu? Lernen beginnen
|
|
Podział po module domenowym (np. Orders, Billing), nie po typie klasy.
|
|
|
Co powinna zawierać dobra odpowiedź STAR o optymalizacji zapytania? Lernen beginnen
|
|
Konkretny EXPLAIN przed/po i liczbę - o ile szybciej.
|
|
|
Co odróżnia mid developera od juniora? Lernen beginnen
|
|
Samodzielna praca i rozumienie konsekwencji decyzji technicznych na produkcji.
|
|
|
Jak reagować na krytykę kodu w code review? Lernen beginnen
|
|
Wysłuchać, dopytać o intencję, nie traktować jako ataku personalnego.
|
|
|
Czym różni się monolit od mikroserwisów pod względem złożoności startu? Lernen beginnen
|
|
Monolit jest prostszy do wdrożenia i wystarcza mniejszemu zespołowi.
|
|
|
Co to jest modularny monolit? Lernen beginnen
|
|
Monolit podzielony logicznie na moduły z jasnymi granicami i bez bezpośrednich zależności między nimi.
|
|
|
Jaka jest typowa rekomendacja architektoniczna na start nowego projektu? Lernen beginnen
|
|
Modularny monolit, nie mikroserwisy.
|
|
|
Po czym poznać dobry kod? Lernen beginnen
|
|
Jest czytelny, ma testy, łatwo go zmienić i nie zaskakuje.
|
|
|
Kiedy refaktoryzować kod? Lernen beginnen
|
|
Gdy jest często modyfikowany lub regularnie powoduje bugi.
|
|
|
Kiedy nie refaktoryzować kodu? Lernen beginnen
|
|
Bez testów, tuż przed deadlinem, albo tylko dlatego że się nie podoba.
|
|
|
Co to jest dług techniczny (technical debt)? Lernen beginnen
|
|
Koszt przyszłych poprawek wynikający z szybkich, nieoptymalnych rozwiązań przyjętych teraz.
|
|
|
Jak radzić sobie z długiem technicznym? Lernen beginnen
|
|
Dokumentować go, dzielić na małe kroki i spłacać przy okazji feature'ów.
|
|
|
Jak analizować bug na produkcji krok po kroku? Lernen beginnen
|
|
Logi, monitoring, reprodukcja, hotfix lub rollback, dopiero potem root cause analysis.
|
|
|
Jak zapobiegać bugom produkcyjnym? Lernen beginnen
|
|
Testy, code review, monitoring i feature flags.
|
|
|
Jak rozpoznać overengineering we własnym kodzie? Lernen beginnen
|
|
Rozwiązanie jest skomplikowane mimo prostego problemu i nikt go nie rozumie.
|
|
|
Jak komunikować problem techniczny biznesowi? Lernen beginnen
|
|
Bez żargonu, przez wpływ (czas, pieniądze, ryzyko) i z propozycją rozwiązania.
|
|
|
Jak uczyć się nowej technologii efektywnie? Lernen beginnen
|
|
Dokumentacja, małe POC, realne użycie - bez tutorial hell.
|
|
|
Jak ocenić sukces projektu? Lernen beginnen
|
|
Stabilnością, wartością biznesową i łatwością dalszego rozwoju, nie liczbą linii kodu.
|
|
|
Jakie pytania warto zadać przed rozpoczęciem taska? Lernen beginnen
|
|
Po co, dla kogo, co z edge case'ami, jak testować.
|
|
|
Jak radzić sobie z presją czasu w projekcie? Lernen beginnen
|
|
Świadome priorytety i kompromisy, jawna komunikacja ryzyka, bez hero codingu.
|
|
|
|
Lernen beginnen
|
|
Transakcja czyta dane zapisane przez inną transakcję, która jeszcze nie zrobiła commit - jeśli ta druga zrobi rollback, przeczytane dane nigdy nie istniały.
|
|
|
Co to jest non-repeatable read? Lernen beginnen
|
|
Dwukrotny odczyt tego samego wiersza w tej samej transakcji zwraca różne wartości, bo inna transakcja zdążyła go zmienić i zacommitować między odczytami.
|
|
|
|
Lernen beginnen
|
|
Powtórzenie tego samego zapytania z warunkiem WHERE w tej samej transakcji zwraca inny zestaw wierszy, bo inna transakcja dodała lub usunęła pasujące rekordy.
|
|
|
Który poziom izolacji jako jedyny eliminuje dirty read, ale nadal dopuszcza phantom read? Lernen beginnen
|
|
|
|
|
Jaki jest domyślny poziom izolacji w MySQL InnoDB? Lernen beginnen
|
|
|
|
|
Jaki jest domyślny poziom izolacji w PostgreSQL? Lernen beginnen
|
|
|
|
|
Jakim kosztem Serializable eliminuje wszystkie trzy anomalie odczytu? Lernen beginnen
|
|
Wydajnością - transakcje faktycznie wykonują się sekwencyjnie albo są blokowane/odrzucane przy konflikcie.
|
|
|
Na czym polega pesymistyczne blokowanie (pessimistic locking)? Lernen beginnen
|
|
Transakcja blokuje wiersz na czas edycji (np. SELECT ... FOR UPDATE), inne transakcje czekają lub dostają błąd.
|
|
|
Na czym polega optymistyczne blokowanie (optimistic locking)? Lernen beginnen
|
|
Każdy zapis sprawdza czy wersja/kolumna zmieniona od odczytu się nie zmieniła - konflikt wykrywany dopiero przy próbie zapisu, bez blokowania w międzyczasie.
|
|
|
Kiedy wybrać pesymistyczne blokowanie zamiast optymistycznego? Lernen beginnen
|
|
Gdy konflikty zapisów są częste - np. wysokiej konkurencyjności aktualizacje tego samego rekordu, jak stan magazynowy.
|
|
|
|
Lernen beginnen
|
|
Command Query Responsibility Segregation - rozdzielenie modelu zapisu (commands) od modelu odczytu (queries), często z osobnymi bazami/reprezentacjami danych.
|
|
|
Jaki jest główny zysk z CQRS? Lernen beginnen
|
|
Model odczytu można niezależnie optymalizować i skalować (np. zdenormalizowane widoki), bez kompromisów narzuconych przez model zapisu.
|
|
|
Co to jest Event Sourcing? Lernen beginnen
|
|
Stan encji nie jest zapisywany wprost, tylko odtwarzany z sekwencji zapisanych zdarzeń, które go doprowadziły do obecnego kształtu.
|
|
|
Jaki jest koszt Event Sourcingu, którego nie ma w zwykłym CRUD? Lernen beginnen
|
|
Złożoność odtwarzania stanu (replay, snapshoty) i konieczność projektowania nieusuwalnego, wersjonowanego strumienia zdarzeń.
|
|
|
Czy CQRS wymaga Event Sourcingu? Lernen beginnen
|
|
Nie - to niezależne wzorce, często łączone, ale każdy da się zastosować bez drugiego.
|
|
|
|
Lernen beginnen
|
|
Identyfikator (hash) konkretnej wersji zasobu - klient wysyła go z powrotem przy kolejnym żądaniu, by serwer sprawdził czy zasób się zmienił.
|
|
|
Co zwraca serwer, gdy ETag klienta wciąż pasuje do aktualnej wersji zasobu? Lernen beginnen
|
|
304 Not Modified, bez ciała odpowiedzi - klient używa swojej zcache'owanej kopii.
|
|
|
Czym różni się Cache-Control: no-cache od no-store? Lernen beginnen
|
|
no-cache pozwala zapisać odpowiedź, ale wymusza rewalidację przed użyciem, no-store zabrania jakiegokolwiek zapisu.
|
|
|
Czym różni się Last-Modified od ETag? Lernen beginnen
|
|
Last-Modified to znacznik czasu z rozdzielczością sekundy, ETag to dowolny identyfikator wersji - precyzyjniejszy, bo wykrywa zmiany szybsze niż sekunda.
|
|
|
Na czym polega wzorzec Factory Method? Lernen beginnen
|
|
Tworzenie obiektu deleguje się do metody, którą podklasy mogą nadpisać, by zwrócić inny konkretny typ.
|
|
|
Na czym polega wzorzec Singleton? Lernen beginnen
|
|
Klasa gwarantuje istnienie dokładnie jednej swojej instancji w całej aplikacji i daje do niej globalny punkt dostępu.
|
|
|
Dlaczego Singleton bywa krytykowany jako antywzorzec? Lernen beginnen
|
|
Wprowadza globalny stan i ukrytą zależność, utrudniając testowanie i podmianę implementacji.
|
|
|
Co to jest SSRF (Server-Side Request Forgery)? Lernen beginnen
|
|
Atakujący nakłania serwer do wykonania requestu HTTP w jego imieniu do adresu, który sam kontroluje lub który normalnie byłby niedostępny z zewnątrz.
|
|
|
Jaki jest typowy wektor ataku SSRF w aplikacji webowej? Lernen beginnen
|
|
Pole formularza przyjmujące URL (np. do pobrania obrazka/webhooka), które serwer odpytuje bez walidacji.
|
|
|
Dlaczego SSRF jest szczególnie groźny w środowisku chmurowym? Lernen beginnen
|
|
Serwer może odpytać wewnętrzny endpoint metadanych (np. 169.254.169.254) i wykraść poświadczenia IAM instancji.
|
|
|
Jak ograniczyć ryzyko SSRF? Lernen beginnen
|
|
Biała lista dozwolonych hostów/schematów i blokada requestów do adresów prywatnych/loopback.
|
|
|
Co to jest composer. lock? Lernen beginnen
|
|
Zapisuje dokładne, wylosowane w danym momencie wersje wszystkich zależności (łącznie z zależnościami zależności), by build był powtarzalny.
|
|
|
Czym różni się composer. json od composer. lock? Lernen beginnen
|
|
composer. json deklaruje dopuszczalne zakresy wersji, composer. lock zamraża konkretne, faktycznie zainstalowane wersje.
|
|
|
Co oznacza ^2.3 w składni semver Composera? Lernen beginnen
|
|
Dowolna wersja zgodna wstecznie do następnej głównej wersji, czyli >=2.3.0 <3.0.0.
|
|
|
Co to jest programowanie obiektowe (OOP)? Lernen beginnen
|
|
Paradygmat organizujący kod wokół obiektów łączących dane (właściwości) i zachowanie (metody), zamiast osobnych funkcji i zmiennych.
|
|
|
Czym różni się klasa od obiektu? Lernen beginnen
|
|
Klasa to szablon/definicja, obiekt to konkretna instancja utworzona na jej podstawie.
|
|
|
|
Lernen beginnen
|
|
Ukrywanie wewnętrznego stanu obiektu i udostępnianie go tylko przez zdefiniowane metody, nie bezpośredni dostęp do pól.
|
|
|
Co to jest dziedziczenie w OOP? Lernen beginnen
|
|
Klasa potomna przejmuje właściwości i metody klasy bazowej przez słowo kluczowe extends.
|
|
|
|
Lernen beginnen
|
|
Różne klasy implementujące ten sam interfejs/metodę mogą być używane zamiennie, każda z własnym zachowaniem tej samej metody.
|
|
|
Co to jest abstrakcja w OOP? Lernen beginnen
|
|
Ukrycie szczegółów implementacji za prostym interfejsem, który pokazuje tylko co obiekt robi, nie jak.
|
|
|
Co robią modyfikatory dostępu public, protected, private? Lernen beginnen
|
|
public - dostępne wszędzie, protected - w klasie i podklasach, private - tylko w tej samej klasie.
|
|
|
Do czego służy konstruktor klasy? Lernen beginnen
|
|
Metoda __construct wywoływana automatycznie przy tworzeniu obiektu, do inicjalizacji jego stanu.
|
|
|
Czym różni się interfejs od klasy abstrakcyjnej (podstawowo)? Lernen beginnen
|
|
Interfejs definiuje tylko kontrakt metod bez implementacji, klasa abstrakcyjna może mieć częściową implementację i stan.
|
|
|
Co robi słowo kluczowe implements? Lernen beginnen
|
|
Deklaruje, że klasa dostarcza implementację wszystkich metod zadeklarowanych w danym interfejsie.
|
|
|
Co to jest klucz główny (primary key)? Lernen beginnen
|
|
Kolumna lub zestaw kolumn jednoznacznie identyfikujący każdy wiersz w tabeli.
|
|
|
Co to jest klucz obcy (foreign key)? Lernen beginnen
|
|
Kolumna odwołująca się do klucza głównego w innej tabeli, wymuszająca spójność powiązań między tabelami.
|
|
|
Czym różni się INNER JOIN od LEFT JOIN? Lernen beginnen
|
|
INNER JOIN zwraca tylko wiersze pasujące w obu tabelach, LEFT JOIN zwraca wszystkie wiersze z lewej tabeli nawet bez dopasowania w prawej.
|
|
|
|
Lernen beginnen
|
|
Grupuje wiersze o tej samej wartości kolumny, żeby policzyć na nich funkcję agregującą, np. COUNT czy SUM.
|
|
|
Czym różni się WHERE od HAVING? Lernen beginnen
|
|
WHERE filtruje wiersze przed grupowaniem, HAVING filtruje już zgrupowane wyniki po zastosowaniu funkcji agregującej.
|
|
|
Co to jest indeks bazodanowy w skrócie? Lernen beginnen
|
|
Dodatkowa struktura danych przyspieszająca wyszukiwanie po danej kolumnie kosztem miejsca i wolniejszych zapisów.
|
|
|
Po co jest normalizacja bazy danych? Lernen beginnen
|
|
Eliminuje redundancję danych, dzieląc je na powiązane tabele zamiast powtarzać te same informacje w wielu wierszach.
|
|
|
|
Lernen beginnen
|
|
Dodaje zmiany z working directory do staging area, przygotowując je do commita.
|
|
|
|
Lernen beginnen
|
|
Zapisuje zawartość staging area jako nowy punkt w historii repozytorium.
|
|
|
Czym różni się git push od git pull? Lernen beginnen
|
|
git push wysyła lokalne commity do zdalnego repozytorium, git pull pobiera i scala zmiany ze zdalnego repozytorium.
|
|
|
Czym różni się git fetch od git pull? Lernen beginnen
|
|
git fetch tylko pobiera zmiany bez scalania, git pull to fetch plus automatyczny merge.
|
|
|
|
Lernen beginnen
|
|
Tworzy nową niezależną linię rozwoju kodu, żeby zmiany nie trafiały od razu do głównej gałęzi.
|
|
|
|
Lernen beginnen
|
|
Łączy historię jednej gałęzi z drugą, tworząc commit scalający.
|
|
|
|
Lernen beginnen
|
|
Kopiuje całe zdalne repozytorium (historię i pliki) na lokalny dysk.
|
|
|
Co robi polecenie ls -la? Lernen beginnen
|
|
Wypisuje wszystkie pliki w katalogu, łącznie z ukrytymi, w formacie ze szczegółami (uprawnienia, właściciel, rozmiar).
|
|
|
|
Lernen beginnen
|
|
Wyszukuje linie pasujące do wzorca w pliku lub strumieniu tekstu.
|
|
|
Co oznacza liczba w chmod 755? Lernen beginnen
|
|
Uprawnienia rwx dla właściciela, r-x dla grupy, r-x dla innych - trzy cyfry to trzy grupy uprawnień.
|
|
|
Czym różni się proces w tle (&) od procesu na pierwszym planie? Lernen beginnen
|
|
Proces w tle zwraca terminal od razu, nie blokując go do zakończenia zadania.
|
|
|
Do czego służy polecenie ps aux? Lernen beginnen
|
|
Wypisuje wszystkie uruchomione procesy w systemie wraz z ich zużyciem zasobów.
|
|
|
|
Lernen beginnen
|
|
Model-View-Controller - podział aplikacji na dane (Model), logikę żądania (Controller) i warstwę prezentacji (View).
|
|
|
Czym różni się framework od biblioteki? Lernen beginnen
|
|
Framework narzuca strukturę i sam woła twój kod (inversion of control), bibliotekę wywołujesz ty, kiedy chcesz.
|
|
|
Co to jest sesja w aplikacji webowej? Lernen beginnen
|
|
Sposób przechowywania stanu użytkownika między requestami, zwykle powiązany z ciasteczkiem zawierającym identyfikator sesji.
|
|
|
|
Lernen beginnen
|
|
Mały fragment danych zapisywany w przeglądarce i wysyłany automatycznie z każdym requestem do tej samej domeny.
|
|
|
Co to jest ORM w skrócie? Lernen beginnen
|
|
Warstwa mapująca wiersze bazy danych na obiekty w kodzie, żeby nie pisać SQL ręcznie.
|
|
|
Co to jest routing w aplikacji webowej? Lernen beginnen
|
|
Mechanizm dopasowujący adres URL i metodę HTTP do konkretnego kontrolera/akcji, która go obsłuży.
|
|
|
Co to jest kontroler w Laravelu/Symfony? Lernen beginnen
|
|
Klasa grupująca metody obsługujące konkretne żądania HTTP i zwracające odpowiedź.
|
|
|
Co to jest middleware w skrócie? Lernen beginnen
|
|
Warstwa kodu wykonywana przed lub po kontrolerze, np. do autoryzacji, logowania czy modyfikacji requestu/response.
|
|
|
Czym różni się array_key_exists() od isset() dla wartości null w tablicy? Lernen beginnen
|
|
array_key_exists() zwraca true nawet gdy wartość pod kluczem to null, isset() dla null zwróci false.
|
|
|
Co daje słowo kluczowe final przy klasie lub metodzie? Lernen beginnen
|
|
final na klasie blokuje dziedziczenie, final na metodzie blokuje jej nadpisanie w podklasach.
|
|
|
Co to są intersection types w PHP (Type1&Type2)? Lernen beginnen
|
|
Wymóg, żeby wartość spełniała jednocześnie wszystkie wskazane typy/interfejsy, nie tylko jeden z nich jak w union types.
|
|
|
Jak działa multi-catch w PHP (catch (TypeA Jeden blok catch obsługuje kilka typów wyjątków naraz, bez powielania identycznej logiki w osobnych blokach. Lernen beginnen
|
|
|
|
|
|
Lernen beginnen
|
|
Menadżer zależności dla PHP - instaluje paczki, generuje autoloader zgodny z PSR-4 i zarządza wersjami przez composer. json/composer. lock.
|
|
|
Co to jest Dependency Injection w skrócie? Lernen beginnen
|
|
Przekazywanie obiektowi jego zależności z zewnątrz, np. przez konstruktor, zamiast tworzenia ich samodzielnie wewnątrz klasy.
|
|
|
Czym różni się coupling od cohesion? Lernen beginnen
|
|
Coupling to stopień zależności między modułami (im niższy tym lepiej), cohesion to stopień spójności odpowiedzialności wewnątrz jednego modułu (im wyższy tym lepiej).
|
|
|
Co oznacza zasada composition over inheritance? Lernen beginnen
|
|
Preferowanie budowania zachowania przez złożenie mniejszych obiektów/interfejsów zamiast rozbudowanej hierarchii dziedziczenia, która usztywnia kod.
|
|
|
Czym Entity różni się od Value Object? Lernen beginnen
|
|
Entity ma tożsamość (ID) i pozostaje tym samym bytem mimo zmiany atrybutów, Value Object jest identyfikowany przez swoją wartość i jest niemutowalny.
|
|
|
Co to jest klasa Service w architekturze aplikacji? Lernen beginnen
|
|
Hermetyzuje logikę biznesową niezwiązaną bezpośrednio z jedną encją, koordynując repozytoria i inne serwisy - odciąża kontroler i model.
|
|
|
Co to jest covering index? Lernen beginnen
|
|
Indeks zawierający wszystkie kolumny potrzebne zapytaniu, więc silnik odpowiada z samego indeksu bez sięgania do właściwych wierszy tabeli.
|
|
|
Co oznacza selektywność (cardinality) kolumny pod kątem indeksowania? Lernen beginnen
|
|
Stosunek liczby unikalnych wartości do liczby wierszy - wysoka selektywność czyni indeks opłacalnym, niska (np. boolean) zwykle nie.
|
|
|
Co to jest deadlock w bazie danych? Lernen beginnen
|
|
Dwie transakcje wzajemnie czekają na zwolnienie blokad trzymanych przez tę drugą - baza wykrywa cykl i przerywa jedną z transakcji błędem.
|
|
|
Co to jest race condition przy równoległym dostępie do tych samych danych? Lernen beginnen
|
|
Wynik zależy od nieprzewidywalnej kolejności wykonania dwóch operacji na tym samym zasobie, np. dwóch równoległych aktualizacji tego samego wiersza.
|
|
|
Dlaczego unique constraint w bazie jest bezpieczniejszy niż sprawdzenie unikalności w kodzie aplikacji? Lernen beginnen
|
|
Baza gwarantuje atomowość na poziomie silnika - dwa równoległe requesty mogą ominąć sprawdzenie w kodzie przed zapisem, ale nie ominą constraintu.
|
|
|
Co to jest CTE (Common Table Expression)? Lernen beginnen
|
|
Nazwane, tymczasowe zapytanie zdefiniowane przez WITH, używane w głównym zapytaniu jak zwykła tabela - poprawia czytelność złożonych zapytań.
|
|
|
Co robią window functions (np. ROW_NUMBER() OVER())? Lernen beginnen
|
|
Liczą wartość względem grupy wierszy (partycji) bez zwijania ich do jednego wiersza, w przeciwieństwie do GROUP BY.
|
|
|
Co to jest subquery (podzapytanie)? Lernen beginnen
|
|
Zapytanie zagnieżdżone wewnątrz innego zapytania, którego wynik jest używany jako wartość, lista lub tabela dla zapytania nadrzędnego.
|
|
|
Co robi atrybut cookie SameSite? Lernen beginnen
|
|
Ogranicza wysyłanie cookie przy requestach cross-site - SameSite=Strict/Lax znacząco utrudnia CSRF.
|
|
|
Co robi atrybut cookie HttpOnly? Lernen beginnen
|
|
Blokuje dostęp do wartości cookie z poziomu JavaScript - chroni token sesji przed kradzieżą przez XSS.
|
|
|
Co robi atrybut cookie Secure? Lernen beginnen
|
|
Każe przeglądarce wysyłać cookie wyłącznie przez HTTPS, nigdy przez zwykłe HTTP.
|
|
|
Czym różni się merge od rebase? Lernen beginnen
|
|
Merge tworzy nowy commit scalający i zachowuje pełną historię obu gałęzi, rebase przepisuje commity jednej gałęzi na czubek drugiej, dając liniową historię.
|
|
|
Czym różni się git reset od git revert? Lernen beginnen
|
|
Reset cofa wskaźnik gałęzi i opcjonalnie zmiany, przepisując historię, revert tworzy nowy commit odwracający zmiany, zachowując historię - bezpieczny na wypchniętej gałęzi.
|
|
|
Co realnie trzeba zrobić przy konflikcie mergowania? Lernen beginnen
|
|
Ręcznie wybrać lub połączyć sprzeczne fragmenty w oznaczonych blokach <<<<<<< ======= >>>>>>>, dodać plik i dokończyć commit/rebase.
|
|
|
Do czego służy git stash? Lernen beginnen
|
|
Tymczasowo odkłada niezacommitowane zmiany z working directory, np. żeby przełączyć się na inną gałąź z czystym stanem.
|
|
|
|
Lernen beginnen
|
|
Wskaźnik na aktualnie wybrany commit/branch, na którym pracuje working directory.
|
|
|
Czym różni się image od container w Dockerze? Lernen beginnen
|
|
Image to niezmienny szablon (warstwy plików), container to jego uruchomiona, żywa instancja z własnym stanem w runtime.
|
|
|
Do czego służy volume w Dockerze? Lernen beginnen
|
|
Trwałe przechowywanie danych poza cyklem życia kontenera, np. dane bazy, które mają przetrwać restart lub usunięcie kontenera.
|
|
|
Co daje sieć Docker (docker network)? Lernen beginnen
|
|
Izolowaną komunikację między kontenerami po nazwie usługi zamiast po IP, bez wystawiania portów na zewnątrz.
|
|
|
Co daje multi-stage build w Dockerfile? Lernen beginnen
|
|
Oddziela etap budowania (z narzędziami/zależnościami dev) od finalnego obrazu produkcyjnego zawierającego tylko to, co potrzebne w runtime - mniejszy i bezpieczniejszy image.
|
|
|
Czym różni się ENV od ARG w Dockerfile? Lernen beginnen
|
|
ARG istnieje tylko podczas budowania obrazu, ENV zostaje w finalnym obrazie i jest dostępny również w runtime kontenera.
|
|
|
Jak Docker wykorzystuje cache przy budowaniu obrazu? Lernen beginnen
|
|
Cache'uje wynik każdej instrukcji warstwowo - zmiana w danej linii Dockerfile unieważnia cache tej i wszystkich kolejnych warstw, dlatego rzadziej zmieniane instrukcje warto umieszczać wcześniej.
|
|
|
Do czego służy polecenie top? Lernen beginnen
|
|
Pokazuje w czasie rzeczywistym listę procesów wraz z bieżącym zużyciem CPU i pamięci.
|
|
|
|
Lernen beginnen
|
|
Zmienia właściciela, a opcjonalnie też grupę, pliku lub katalogu.
|
|
|
Do czego służy polecenie find? Lernen beginnen
|
|
Wyszukuje pliki i katalogi w drzewie katalogów po nazwie, typie, dacie modyfikacji i innych kryteriach.
|
|
|
Do czego służy polecenie curl? Lernen beginnen
|
|
Wysyła requesty HTTP(S) i inne z linii komend - przydatne do testowania API bez przeglądarki.
|
|
|
Do czego służy polecenie ss? Lernen beginnen
|
|
Pokazuje aktywne połączenia sieciowe i nasłuchujące porty, nowocześniejszy odpowiednik netstat.
|
|
|
Czym różni się redirect 301 od 302? Lernen beginnen
|
|
301 to przekierowanie stałe, cache'owane przez przeglądarki i wyszukiwarki, 302 to tymczasowe i nie powinno być trwale cache'owane.
|
|
|
Czym różni się redirect 307 od 302? Lernen beginnen
|
|
307 gwarantuje zachowanie oryginalnej metody HTTP i body requestu, 302 historycznie bywał zamieniany przez klienty na GET.
|
|
|
Czym różni się redirect 308 od 301? Lernen beginnen
|
|
308 to trwały odpowiednik 301, ale tak jak 307 gwarantuje zachowanie metody HTTP i body, czego 301 nie gwarantuje.
|
|
|
Co oznacza status 303 See Other? Lernen beginnen
|
|
Każe klientowi pobrać wskazany zasób metodą GET niezależnie od metody oryginalnego requestu - typowe po POST, żeby uniknąć ponownego wysłania formularza przy odświeżeniu.
|
|
|
Czym różni się array_map() od array_walk()? Lernen beginnen
|
|
array_map() zwraca nową tablicę z wynikami, array_walk() modyfikuje oryginalną tablicę przez referencję i nie zwraca nowej.
|
|
|
Co robi array_filter() bez podanego callbacku? Lernen beginnen
|
|
Usuwa z tablicy elementy, które są falsy (0, ", null, false, []).
|
|
|
Do czego służy array_reduce()? Lernen beginnen
|
|
Redukuje tablicę do pojedynczej wartości, akumulując wynik przez callback i wartość początkową.
|
|
|
Czym różni się array_merge() od operatora +? Lernen beginnen
|
|
array_merge() dla kluczy numerycznych przenumerowuje i dopisuje wartości z obu tablic, + zachowuje klucze z pierwszej tablicy i ignoruje duplikaty z drugiej.
|
|
|
Co się dzieje z kluczami tekstowymi przy array_merge() z konfliktem? Lernen beginnen
|
|
Wartość z drugiej tablicy nadpisuje wartość z pierwszej pod tym samym kluczem.
|
|
|
Czym różni się in_array() z trzecim argumentem true od domyślnego wywołania? Lernen beginnen
|
|
Z true porównanie jest ścisłe (===, sprawdza też typ), domyślnie porównanie jest luźne (==).
|
|
|
Czym różni się sort() od usort()? Lernen beginnen
|
|
sort() sortuje wg domyślnego porównania i resetuje klucze, usort() sortuje wg własnej funkcji porównującej.
|
|
|
Co zwraca array_search(), gdy nie znajdzie elementu? Lernen beginnen
|
|
false, dlatego trzeba porównywać wynik przez === false, bo poprawny klucz 0 też jest falsy.
|
|
|
Do czego służy array_column()? Lernen beginnen
|
|
Wyciąga wartości jednej kolumny z tablicy tablic/obiektów, np. same id z listy rekordów.
|
|
|
Czym różni się array_diff() od array_intersect()? Lernen beginnen
|
|
array_diff() zwraca elementy z pierwszej tablicy, których nie ma w pozostałych, array_intersect() zwraca elementy wspólne dla wszystkich.
|
|
|
Czym różni się array_slice() od array_splice()? Lernen beginnen
|
|
array_slice() zwraca wycinek bez modyfikacji oryginału, array_splice() modyfikuje oryginalną tablicę (usuwa/wstawia elementy) i zwraca usunięte.
|
|
|
Co robi array_unique() i jaki ma domyślny sposób porównania? Lernen beginnen
|
|
Usuwa duplikaty wartości, porównując je domyślnie jako stringi (SORT_STRING).
|
|
|
Czym różni się array_combine() od array_flip()? Lernen beginnen
|
|
array_combine() tworzy tablicę z jednej tablicy jako kluczy i drugiej jako wartości, array_flip() zamienia miejscami klucze i wartości tej samej tablicy.
|
|
|
Czym różni się explode() od str_split()? Lernen beginnen
|
|
explode() dzieli string wg separatora na tablicę części, str_split() dzieli string na kawałki o stałej długości znaków.
|
|
|
Czym różni się substr() od mb_substr()? Lernen beginnen
|
|
substr() liczy pozycje w bajtach (psuje wielobajtowe znaki UTF-8), mb_substr() liczy w znakach.
|
|
|
Czym różni się str_replace() od preg_replace()? Lernen beginnen
|
|
str_replace() podmienia stały tekst, preg_replace() podmienia dopasowania wyrażenia regularnego.
|
|
|
Do czego służą str_contains(), str_starts_with(), str_ends_with()? Lernen beginnen
|
|
Sprawdzają odpowiednio: czy string zawiera podciąg, czy zaczyna się od podciągu, czy kończy się podciągiem - bez potrzeby liczenia pozycji jak przy strpos().
|
|
|
Dlaczego strpos() == false to częsty błąd, a strpos() === false jest poprawne? Lernen beginnen
|
|
Dopasowanie na pozycji 0 jest falsy przy ==, więc trzeba porównywać ściśle (===), inaczej pozycja 0 zostanie potraktowana jak brak dopasowania.
|
|
|
Co robi sprintf() i czym różni się od printf()? Lernen beginnen
|
|
Formatuje string wg wzorca z placeholderami (%s, %d itd.) i go zwraca, printf() robi to samo, ale od razu wypisuje wynik zamiast zwracać.
|
|
|
Czym różni się trim() od ltrim() i rtrim()? Lernen beginnen
|
|
trim() usuwa białe znaki z obu końców stringa, ltrim() tylko z lewej, rtrim() tylko z prawej.
|
|
|