Wdrożenie niebiesko-zielone a kanarkowe: Różnice, kompromisy i sposób wyboru
Obie strategie pozwalają na wydanie bez zamykania witryny, ale zarządzają ryzykiem w odwrotny sposób. Dowiedz się, jak działa każdy z nich, ile tak naprawdę kosztuje, jak obsługiwać bazę danych i który pasuje do Twojego zespołu.
- Niebiesko-zielony utrzymuje dwa pełne środowiska i przełącza cały ruch jednocześnie.
- Canary najpierw wysyła nową wersję do niewielkiej części użytkowników, a następnie stopniowo ją rozszerza.
- Niebiesko-zielony oferuje bardzo szybkie wycofywanie. Canary ogranicza liczbę użytkowników, których może dotknąć zła wersja.
- Obydwa zależą od wstecznie kompatybilnych zmian w bazie danych i dobrego monitorowania.
Wydawanie oprogramowania oznaczało kiedyś okno konserwacyjne i trzymane kciuki. Nowoczesne zespoły stosują strategie, które sprawiają, że wydawanie wersji jest rutynowe, a wybór niebiesko-zielonego vs wdrożenie kanarkowe jest jednym z pierwszych, z którymi się spotkasz. Obydwa zmniejszają ryzyko, ale robią to w przeciwny sposób: jeden przygotowuje pełny zamiennik, a drugi po trochu testuje z prawdziwymi użytkownikami.
W tym przewodniku wyjaśniono, jak działa każdy z nich i ile kosztuje w praktyce. Uruchomiliśmy małe przykłady routingu użytkowników i wycofywania zmian w Pythonie 3.13, a dane wyjściowe pochodzą z tego uruchomienia. Przykłady Kubernetes mają charakter ilustracyjny i nie uruchomiliśmy ich. Potraktuj wartości procentowe i progi jako przykłady wyjściowe do dostosowania.
Krótka odpowiedź
W przypadku wdrożenia niebiesko-zielonego uruchamiasz dwa identyczne środowiska produkcyjne. Jeden obsługuje użytkowników podczas wdrażania i testowania nowej wersji, drugi zaś umożliwia przełączenie całego ruchu w jednym ruchu.
W przypadku wdrożenia canary nowa wersja działa obok starej. Wysyłasz do niego niewielki procent rzeczywistego ruchu, porównujesz wyniki i krok po kroku zwiększasz udział, aż obsłuży wszystkich. Nazwa pochodzi od górników, którzy kiedyś używali kanarków jako wczesnego ostrzegania przed niebezpieczeństwem.
Niebiesko-zielony kontra kanarek obok siebie
| Aspekt | Niebiesko-zielony | Kanarek |
|---|---|---|
| Zmiana ruchu | Wszystko na raz | Stopniowe |
| Użytkownicy narażeni na złą wersję | Wszystko, dopóki nie przełączysz się z powrotem | Tylko kanarek |
| Wycofanie | Przełącz ruch z powrotem | Ustaw udział kanarkowy na zero |
| Zwolnij prędkość | Szybkie przełączenie | Wolniej, etapami |
| Koszt infrastruktury | Nawet dwukrotnie podczas premiery | Mały dodatkowy udział |
| Potrzebne wyznaczanie tras ruchu | Prosty przełącznik | Routing procentowy |
| Potrzebny monitoring | Dobrze | Znakomicie, ze wskaźnikami według wersji |
| Wersje żyją razem | Krótko, jeśli w ogóle | Na całe wdrożenie |
| Informacje zwrotne od prawdziwych użytkowników przed pełnym wydaniem | Nie | Tak |
Jak działa wdrożenie niebiesko-zielone
- Niebieski jest aktywny i obsługuje cały ruch.
- Wdróż nową wersję w green, który nie będzie odbierał ruchu użytkowników.
- Dokładnie przetestuj ekologię w rzeczywistym środowisku produkcyjnym, korzystając z testów dymnych i użytkowników wewnętrznych.
- Zmień router, moduł równoważenia obciążenia lub DNS, aby skierować ruch na zielony.
- Obserwuj uważnie, niebieski wciąż działa i jest gotowy.
- Jeśli coś jest nie tak, przełącz się z powrotem. Jeśli wszystko jest w porządku, kolejnym bezczynnym środowiskiem będzie kolor niebieski.
W Kubernetes możesz dokonać zmiany, zmieniając selektor usługi, tak aby ruch był przenoszony do podów o różnych etykietach:
apiVersion: v1
kind: Service
metadata:
name: shop
spec:
selector:
app: shop
version: green # was: blue
ports:
- port: 80
targetPort: 8000
Mocne strony: Koncepcyjnie jest to proste, możesz przetestować dokładną konfigurację produkcyjną, zanim użytkownicy ją zobaczą, a wycofanie jest niemal natychmiastowe. Słabe strony: Zduplikowana infrastruktura może być kosztowna, błąd, który prześlizgnie się przez testy, dotrze do wszystkich na raz, a otwarte sesje i praca w locie wymagają ostrożności podczas zmiany. Jeśli używasz DNS do przełącznika, rekordy w pamięci podręcznej mogą to opóźnić. Nowy w koncepcjach? Zobacz nasz samouczek Kubernetes dla początkujących.
Jak działa wdrożenie kanarek
- Wdróż nową wersję obok wersji stabilnej.
- Skieruj niewielką część ruchu, na przykład 5%, na kanarek.
- Porównaj liczbę błędów, opóźnienia i wskaźniki biznesowe z wersją stabilną.
- Jeśli jesteś zdrowy, zwiększ do 25%, następnie 50%, a następnie 100%.
- Jeśli coś ulegnie pogorszeniu, prześlij cały ruch z powrotem do wersji stabilnej.
Wiele zespołów zaczyna od „kanarka” z personelem wewnętrznym, następnie od regionu niskiego ryzyka, a dopiero potem od szerszej publiczności.
Mocne strony: Zła wersja wpływa tylko na małą grupę, a z prawdziwego ruchu można się dowiedzieć, że żadne środowisko testowe nie jest w stanie w pełni odtworzyć. Słabe strony: Potrzebujesz routingu opartego na procentach i wskaźników według wersji, wdrażanie trwa dłużej, a dwie wersje działają razem przez jakiś czas. Mały kanarek może być również zbyt cichy, aby dać znaczący sygnał, szczególnie w godzinach małego ruchu.
Stabilne routing użytkowników
Losowe wybieranie wersji na każde żądanie powoduje, że użytkownicy mogą czuć się mylący, ponieważ mogą przełączać się między starą a nową. Typowym rozwiązaniem jest zaszyfrowanie stabilnego identyfikatora użytkownika w zasobniku, dzięki czemu każdy użytkownik zawsze otrzyma tę samą odpowiedź:
import hashlib
def bucket(user_id):
digest = hashlib.sha256(user_id.encode()).hexdigest()
return int(digest, 16) % 100
def version_for(user_id, canary_percent):
return "v2" if bucket(user_id) < canary_percent else "v1"
users = [f"user-{i}" for i in range(10000)]
for percent in (5, 25, 50, 100):
share = sum(version_for(u, percent) == "v2" for u in users) / len(users)
print(percent, round(share * 100, 1))
# 5 5.0
# 25 24.5
# 50 49.9
# 100 100.0
Rzeczywisty udział był zbliżony do docelowego. Ta metoda ma jeszcze dwie przydatne właściwości, a nasz test potwierdził obie. Ten sam użytkownik zawsze otrzymywał tę samą wersję. Wszyscy w grupie 5% byli nadal uwzględnieni w 25%, więc nikt, kto miał już nową wersję, nie został przeniesiony z powrotem w miarę wzrostu wdrożenia.
W rzeczywistych systemach takim routingiem zajmuje się zazwyczaj siatka usług, moduł równoważenia obciążenia lub narzędzie takie jak Argo Rollouts czy Flagger, więc nie trzeba tego pisać samodzielnie. Nadal pomocne jest zrozumienie, co robią.
Automatyzacja decyzji
Kanarek działa tylko wtedy, gdy ktoś faktycznie porównuje wersje. Automatyczne kontrole są bardziej wiarygodne niż osoba oglądająca wykresy. Oto podstawowa idea, porównując poziom błędów Canary z wersją stabilną:
def should_rollback(canary_errors, canary_total, base_errors, base_total,
tolerance=1.5, min_requests=500):
if canary_total < min_requests:
return False # not enough data to decide
return (canary_errors / canary_total) > (base_errors / base_total) * tolerance
should_rollback(3, 100, 10, 5000) # False: too few requests
should_rollback(30, 1000, 100, 10000) # True: 3% against 1%
should_rollback(12, 1000, 100, 10000) # False: 1.2% is within tolerance
Zwróć uwagę na pierwszy przypadek. Poziom błędów wydaje się wysoki, ale przy zaledwie 100 żądaniach nie jest to jeszcze wystarczający dowód. Prawdziwe narzędzia stosują dokładniejsze statystyki i analizują kilka sygnałów łącznie:
| Sygnał | Przykład |
|---|---|
| Błędy | Współczynnik 5xx odpowiedzi |
| Opóźnienie | p95 i p99, jak wyjaśniono w testowaniu obciążenia a testowaniu warunków skrajnych |
| Nasycenie | Procesor, pamięć, pule połączeń |
| Biznes | Rejestracje, kasy, pomyślna płatność |
Wskazówka: Porównaj wersję Canary z wersją stabilną w tym samym przedziale czasowym, a nie z liczbami z poprzedniego tygodnia. Ruch i zachowanie zmieniają się z godziny na godzinę, więc bezpośrednie porównanie daje znacznie sprawiedliwszy sygnał.
Problem z bazą danych
Kod aplikacji można zamienić w ciągu kilku sekund, ale danych nie. Obie strategie zwykle korzystają z jednej bazy danych, więc podczas wdrażania i po wycofaniu stara i nowa wersja muszą działać z tym samym schematem.
Standardową odpowiedzią jest wzorzec rozwiń i zwiń. Załóżmy, że chcesz zmienić nazwę name na full_name:
- Rozwiń: dodaj nową kolumnę. Stary kod pozostaje nienaruszony.
- Migracja: wydanie kodu, który zapisuje dane w obu kolumnach i wypełnia stare wiersze.
- Przełącz: kod wydania odczytywany z nowej kolumny.
- Umowa: gdy już nic nie będzie używać starej kolumny, usuń ją w późniejszej wersji.
Wymaga to kilku zwolnień, ale każdy krok można bezpiecznie wycofać. Uruchomienie RENAME COLUMN za jednym razem zepsułoby wersję, która oczekiwała innej nazwy. Zachowaj ostrożność również w przypadku długotrwałych zmian schematu, ponieważ mogą one powodować blokady. Więcej informacji na ten temat znajdziesz w transakcjach SQL.
Rolling i inne strategie
| Strategia | Jak to działa | Dobre dla |
|---|---|---|
| Odtwórz | Zatrzymaj stare, a następnie rozpocznij nowe, z przestojami | Narzędzia wewnętrzne, systemy wsadowe |
| Toczenie | Wymień kilka instancji na raz | Typowa wartość domyślna, w tym w Kubernetes |
| Niebiesko-zielony | Przełączaj się między dwoma środowiskami | Szybkie przełączanie i wycofywanie |
| Kanarek | Stopniowo rozwijaj mały udział | Duży ruch, duże ryzyko |
| Cień | Skopiuj ruch do nowej wersji i odrzuć jego odpowiedzi | Testowanie przy rzeczywistym obciążeniu, bez wpływu na użytkownika |
Wdrożenie Kubernetes domyślnie wykonuje aktualizację ciągłą, co pasuje do wielu usług. Aktualizacja krocząca również zmienia się stopniowo, ale jej udział jest powiązany z liczbą wystąpień i sama w sobie nie analizuje wyników ani nie wstrzymuje się od złych wskaźników.
A co z flagami funkcji?
Wdrożenie umieszcza kod na serwerach, a wersja udostępnia użytkownikom funkcję. Flagi funkcji oddzielają je, umożliwiając włączenie funkcji dla wybranych użytkowników bez konieczności wdrażania czegokolwiek. Działają bardzo dobrze w przypadku obu strategii: wdrażaj z wyłączoną flagą, a następnie włączaj ją stopniowo. Nie zastępują one tych strategii, ponieważ flaga nie może chronić Cię przed wersją, która ulega awarii podczas uruchamiania. Pamiętaj, aby usunąć stare flagi, ponieważ narastają jako dług techniczny.
Jak wybrać
| Twoja sytuacja | Rozsądny wybór |
|---|---|
| Prosta aplikacja i niewielu użytkowników | Aktualizacja krocząca |
| Potrzebujesz bardzo szybkiego przełączania i wycofywania | Niebiesko-zielony |
| Chcesz przetestować w produkcji przed zmianą | Niebiesko-zielony |
| Duży ruch i wysokie koszty awarii | Kanarek |
| Silne monitorowanie i wskaźniki poszczególnych wersji | Kanarek |
| Niski ruch | Niebiesko-zielony, ponieważ sygnały dla kanarków są zbyt słabe |
| Napięty budżet na infrastrukturę | Kanaryjski lub toczący się |
Można je również łączyć. Niektóre zespoły wdrażają zielone środowisko, a następnie stopniowo przenoszą do niego ruch, uzyskując czyste środowisko i ograniczony promień wybuchu. Cokolwiek wybierzesz, zautomatyzuj to za pomocą potoku CI/CD, jak wyjaśnia nasz przewodnik po działaniach GitHub.
Typowe błędy
- Wprowadzanie istotnych zmian w schemacie. Przywracanie zmian nie pomaga, jeśli stary kod nie może odczytać danych.
- Brak kryteriów wycofywania. Zdecyduj, co oznacza „zły” przed rozpoczęciem wydania, a nie w trakcie incydentu.
- Pozwól, aby otoczenie dryfowało. Jeśli kolor zielony różni się od niebieskiego, Twoje testy wykażą mniejszą skuteczność. Zdefiniuj oba za pomocą infrastruktury jako kodu.
- Pomiar wyłącznie wskaźników technicznych. Wersja może być wolna od błędów i mimo to przerywać proces płatności.
- Nigdy nie ćwicz wycofywania się. Ćwicz to, aby zadziałało, gdy jesteś pod presją.
- Zapominanie o zadaniach w tle. Pracownicy i zaplanowane zadania również potrzebują planu podczas zmiany.
Podsumowanie
Niebiesko-zielony zapewnia czystą i szybką zmianę. Canary zapewnia małą, zmierzoną ekspozycję. Jeśli Twoje monitorowanie jest nadal proste, zacznij od aktualizacji ciągłych lub niebiesko-zielonych i zainwestuj w wskaźniki poszczególnych wersji, zanim wypróbujesz kanarkowe aktualizacje. Następnie przećwicz wycofanie w następnej wersji, łącznie z bazą danych. To pojedyncze ćwiczenie zwykle ujawnia, co naprawdę wymaga naprawy.
Najczęstsze pytania
Jaka jest różnica między wdrożeniem niebiesko-zielonym a wdrożeniem kanarkowym?
Niebiesko-zielony przełącza cały ruch z jednego pełnego środowiska na drugie. Canary kieruje niewielką część ruchu na nową wersję i stopniowo ją rozwija.
Co jest bezpieczniejsze, niebiesko-zielone czy kanarkowe?
Canary ogranicza liczbę użytkowników, których dotyczy zła wersja, a niebiesko-zielony oferuje bardzo szybkie wycofanie zmian. Bezpieczniejszy wybór zależy od ruchu, narzędzi i monitorowania.
Czy wdrożenie niebiesko-zielonego jest drogie?
Może tak być, ponieważ podczas wydania możesz uruchomić dwa pełne środowiska. Automatyczne skalowanie w chmurze i zamykanie bezczynnego środowiska może obniżyć koszty.
Od jakiego procentu powinien zaczynać się kanarek?
Zespoły zwykle zaczynają od około 1 do 5 procent, o ile zapewnia to wystarczający ruch, aby uzyskać znaczący sygnał. Systemy o małym natężeniu ruchu mogą wymagać większego udziału.
Jak kanarek i niebiesko-zielony radzą sobie ze zmianami w bazie danych?
Zwykle ze zmianami kompatybilnymi wstecz, takimi jak rozszerzanie i kurczenie, ponieważ obie wersje mogą współużytkować jedną bazę danych i obie muszą działać podczas wdrażania.
Ucz się dalej
Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?
Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.
Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój
Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.
Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć
Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…
Przeczytaj artykuł →DevOpsWyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo
Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429
Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …
Przeczytaj artykuł →Automatyzacja testówWyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią
Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…
Przeczytaj artykuł →Testowanie oprogramowaniaWyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%
Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…
Przeczytaj artykuł →Bazy danych i SQLDELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich
DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami
Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…
Przeczytaj artykuł →Tworzenie oprogramowaniaInterfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora
Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…
Przeczytaj artykuł →Tworzenie oprogramowaniaPython *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami
Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…
Przeczytaj artykuł →Tworzenie oprogramowaniaFunkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać
Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…
Przeczytaj artykuł →Sztuczna inteligencjaKim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić
Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…
Przeczytaj artykuł →DevOpsMonitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami
Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…
Przeczytaj artykuł →DevOpsWoluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób
Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…
Przeczytaj artykuł →Automatyzacja testówTDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich
TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…
Przeczytaj artykuł →Testowanie oprogramowaniaTestowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady
Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać
Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…
Przeczytaj artykuł →Bazy danych i SQLInstrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy
SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…
Przeczytaj artykuł →Tworzenie oprogramowaniaCo to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania
Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami
Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…
Przeczytaj artykuł →Tworzenie oprogramowaniaWyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom
Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …
Przeczytaj artykuł →Sztuczna inteligencjaCzym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa
Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…
Przeczytaj artykuł →DevOpsWdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru
Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…
Przeczytaj artykuł →Automatyzacja testówNiestabilne testy: co je powoduje i jak je naprawić na dobre
Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…
Przeczytaj artykuł →Testowanie oprogramowaniaLoad Testing vs Stress Testing: Differences, Metrics and k6 Examples
Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…
Przeczytaj artykuł →Testowanie oprogramowaniaPrzypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich
Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…
Przeczytaj artykuł →Bazy danych i SQLOptymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją
Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…
Przeczytaj artykuł →Bazy danych i SQLSQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność
SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…
Przeczytaj artykuł →Tworzenie oprogramowaniaSamouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu
Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…
Przeczytaj artykuł →Tworzenie oprogramowaniaObsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami
Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…
Przeczytaj artykuł →Tworzenie oprogramowaniaKlasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami
Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …
Przeczytaj artykuł →Sztuczna inteligencjaCo to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu
Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…
Przeczytaj artykuł →DevOpsPolecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami
Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…
Przeczytaj artykuł →Automatyzacja testówSelenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór
Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…
Przeczytaj artykuł →Testowanie oprogramowaniaPartycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach
Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…
Przeczytaj artykuł →Testowanie oprogramowaniaWażność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady
Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…
Przeczytaj artykuł →Bazy danych i SQLSamouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami
Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…
Przeczytaj artykuł →Bazy danych i SQLWyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji
Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…
Przeczytaj artykuł →Tworzenie oprogramowaniaGit merge vs rebase: różnice, przykłady i kiedy czego używać
Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.
Przeczytaj artykuł →Tworzenie oprogramowaniaPython list comprehension: składnia, przykłady i kiedy jej unikać
Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…
Przeczytaj artykuł →Bazy danych i SQLSQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)
Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…
Przeczytaj artykuł →