„Na prodzie działa” — fraza, którą programista wypowiada, gdy błąd nie reprodukuje się na produkcji, choć na stagingu lub lokalnej maszynie błąd stabilnie się pojawia. Problem prawie zawsze jest spowodowany rozbieżnością środowisk: różne wersje zależności, pliki konfiguracyjne, stan bazy danych lub ustawienia serwera. Według danych analizy Stack Overflow Developer Survey 2024, 43% programistów przynajmniej raz w miesiącu spotyka się z sytuacją, gdy kod działa na lokalnej maszynie, ale pada na produkcji. Przyglądamy się, dlaczego powstaje ta rozbieżność i jak jej zapobiec.
Najważniejsze
„Na prodzie działa” — to utrwalone wyrażenie w środowisku programistów, oznaczające sytuację, gdy kod działa na serwerze produkcyjnym, ale odmawia pracy w środowisku testowym lub na lokalnej maszynie kolegi. Na zewnątrz brzmi to jak „nie ma problemu”, choć w rzeczywistości problem istnieje — po prostu nie reprodukuje się w środowisku produkcyjnym. Źródłem rozbieżności są różnice w konfiguracjach, wersjach i danych między środowiskami.
Fraza narodziła się jako przeciwieństwo innej znanej wymówki — „U mnie lokalnie działa”. Jeśli programista mówi „lokalnie działa”, oznacza to, że błąd występuje tylko u innych. A jeśli „na prodzie działa” — błąd występuje tylko na stagingu lub w środowisku testowym, ale produkcja jest czysta. Ironia losu: w obu przypadkach problem jest realny, po prostu objawia się nie u tego, kto patrzy. Według danych badania DevOps Research and Assessment (DORA) 2023, zespoły z wysokim poziomem automatyzacji wdrażania spotykają się z takimi rozbieżnościami 3 razy rzadziej.
Z punktu widzenia biznesu sytuacja „na prodzie działa” jest groźniejsza, niż się wydaje. Jeśli błąd występuje na stagingu, ale nie na produkcji, programista może go zignorować — i wtedy przy następnym wdrożeniu błąd trafi na produkcję. Tymczasowa ulga zamienia się w przyszły problem, który trzeba będzie naprawiać pod presją użytkowników.
Psychologiczna przyczyna trwałości tej frazy — odruch obronny. Programista, który widzi błąd na stagingu, ale nie na produkcji, może podświadomie bagatelizować problem: „skoro na produkcji wszystko jest dobrze, to nie jest pilne”. Klasyczny cognitive bias — błąd przeżywalności, gdzie widoczny sukces produkcji przeważa nad potencjalnym zagrożeniem przyszłej awarii.
Druga przyczyna — rozmyta odpowiedzialność. Jeśli produkcja działa, a staging nie, winnym okazuje się środowisko, a nie kod. Programista zdejmuje z siebie odpowiedzialność za błąd, przerzucając ją na inżyniera DevOps lub administratora. Według danych Atlassian State of DevOps 2022, w zespołach bez jednolitego środowiska wdrażania (Docker, Kubernetes) takie przerzucanie odpowiedzialności zdarza się o 60% częściej.
Trzecia przyczyna — strach przed wydaniem z zerowym przestojem. Jeśli programista naprawi błąd na stagingu i wdroży poprawkę, będzie to wymagać ponownego code review, testowania i deployu. Fraza „na prodzie działa” pozwala odłożyć poprawkę do następnego wydania, zmniejszając bieżące obciążenie. Odłożona poprawka — jeden z głównych powodów narastania długu technicznego w zespołach.
Produkcja i staging nigdy nie są w pełni identyczne — jest to technicznie niemożliwe ze względu na różnice w skali, obciążeniu i danych. Kluczowe parametry jednak powinny być zgodne: wersja systemu operacyjnego, kompilatora, interpretera, bazy danych, serwera WWW i wszystkich zależności projektu. Jeśli choć jeden parametr się różni — zachowanie kodu może się zmienić.
Główne różnice między środowiskami obejmują:
Konteneryzacja rozwiązuje większość tych problemów. Obraz Docker zbudowany dla produkcji powinien być używany również na stagingu. Jedyną różnicą są zmienne środowiskowe i montowania woluminów. Według danych Docker State of Application Development 2023, zespoły używające jednolitego obrazu dla wszystkich środowisk zmniejszają liczbę rozbieżności o 74%.
| Parametr | Środowisko lokalne | Staging | Produkcja |
|---|---|---|---|
| OS | macOS / Windows | Linux server | Linux server |
| Baza danych | SQLite / lokalny MySQL | MySQL cluster | MySQL cluster z replikacją |
| Obciążenie | 1 użytkownik | Symulacja 10–100 | 1000+ rzeczywistych |
| Dane | Fixtures | Zamaskowane | Rzeczywiste |
| CDN / cache | Brak | Częściowo | W pełni |
Pierwsza i najczęstsza przyczyna — różne wersje zależności. Programista instaluje pakiet lokalnie z flagą --save, ale zapomina zaktualizować package.json lub plik lock. Przy wdrożeniu na produkcję instalowana jest inna wersja, która zachowuje się inaczej. Dla ekosystemu npm plik lock całkowicie rozwiązuje problem, dla innych menedżerów pakietów — analogiczne mechanizmy (Gemfile.lock, Podfile.lock, pubspec.lock).
Druga przyczyna — brakujące lub nadmiarowe zmienne środowiskowe. Programista używa pliku .env na lokalnej maszynie, ale nie dodaje odpowiednich zmiennych w pipeline CI/CD ani na serwerze. Rezultat — kod pada z błędem połączenia do API lub bazy danych. Według danych GitLab DevSecOps Survey 2023, 27% incydentów na produkcji związanych jest z nieprawidłowymi zmiennymi środowiskowymi.
Trzecia przyczyna — stan bazy danych. Na stagingu baza danych może zawierać rekordy, których nie ma na produkcji, lub odwrotnie — brakować migracji. Typowy scenariusz: programista pisze kod działający z nowym polem w tabeli, ale migracja nie została jeszcze zastosowana na produkcji. Strategia migracyjna z zachowaniem wstecznej kompatybilności — jedyny sposób uniknięcia takich sytuacji.
Czwarta przyczyna — ustawienia regionalne i językowe. Formatowanie dat, separatory części dziesiętnych, kodowanie tekstu — wszystko to może się różnić na lokalnej maszynie programisty i serwerze. Szczególnie istotne w projektach z internacjonalizacją. Rozwiązanie — jawnie określać locale w konfiguracji aplikacji i nie polegać na ustawieniach systemowych.
Pierwszy krok — porównać logi obu środowisk. Różnica w poziomie logowania często ukrywa przyczynę: na produkcji może być włączony INFO, a na stagingu DEBUG. Skonfiguruj ten sam poziom logowania i upewnij się, że oba środowiska zapisują w formacie umożliwiającym maszynowe porównanie. Używaj scentralizowanych systemów zbierania logów — Sentry, Datadog, ELK Stack.
Drugi krok — sprawdzić wersje zależności. Porównaj pliki lock, wyświetl listę zainstalowanych pakietów w obu środowiskach. Różnica w wersji minor lub patch — najbardziej prawdopodobna przyczyna rozbieżności. Narzędzia takie jak npm ls, pip freeze, mvn dependency:tree pomogą szybko wykryć niezgodności.
Trzeci krok — odtworzyć środowisko produkcyjne lokalnie. Użyj Docker Compose lub podobnych narzędzi do uruchomienia dokładnej kopii infrastruktury produkcyjnej. Jeśli błąd reprodukuje się w lokalnym kontenerze — problem leży w kodzie, a nie w środowisku. Jeśli się nie reprodukuje — szukaj różnicy w konfiguracji.
Czwarty krok — sprawdzić feature flags i testy A/B. Być może na produkcji kod działa w innym trybie, ponieważ włączona jest niewłaściwa flaga. Według danych LaunchDarkly State of Feature Management 2023, do 40% nieoczekiwanego zachowania na produkcji jest związane z nieprawidłowymi wartościami flag funkcji. Jednolity manifest flag dla wszystkich środowisk rozwiązuje ten problem.
Główne narzędzie zapobiegania — Infrastructure as Code (IaC). Wszystkie środowiska powinny być opisywane w kodzie: Dockerfile, docker-compose.yml, skrypty Terraform lub playbooki Ansible. Ręczne zmiany na serwerze są zabronione — każda zmiana konfiguracji przechodzi przez repozytorium i code review. Gwarantuje to, że wszystkie środowiska mają identyczną konfigurację.
Drugim co do ważności narzędziem jest jednolity pipeline CI/CD. Ten sam skrypt budowania, testowania i wdrażania powinien być używany dla wszystkich środowisk. Różnica dotyczy tylko zmiennych docelowych (URL, klucze). Jeśli pipeline dla stagingu i produkcji różni się krokami — rozbieżności są nieuniknione.
Trzecie narzędzie — automatyczna synchronizacja danych. Regularnie (raz na dobę lub zgodnie z harmonogramem) aktualizuj staging anonimizowaną kopią produkcyjnej bazy danych. Pozwala to testować kod na rzeczywistych danych, a nie na syntetycznych fixtures. Narzędzia: pg_dump/pg_restore dla PostgreSQL, mysqldump dla MySQL, specjalistyczne usługi takie jak DataGrip.
Czwarte — monitorowanie rozbieżności. Skonfiguruj powiadomienia przy wykryciu różnic między stagingiem a produkcją. Prosty skrypt porównujący hashe plików konfiguracyjnych lub wersje zainstalowanych pakietów zaoszczędzi godziny debugowania. Profilaktyka jest zawsze tańsza niż diagnoza: zapobieganie rozbieżnościom środowisk wymaga mniej wysiłku niż szukanie przyczyny błędu „na prodzie działa”.
Często zadawane pytania
W pierwszym przypadku błąd widoczny jest na stagingu, ale nie na produkcji. W drugim — błąd widzą wszyscy oprócz programisty, u którego kod działa lokalnie. Wspólne źródło — w rozbieżności środowisk, ale sytuacja objawia się na różnych etapach.
Pokaż, że błąd na stagingu to błąd, który jest już gotowy trafić na produkcję z najbliższym wdrożeniem. Naprawa teraz będzie tańsza niż hotfix pod presją użytkowników. Podaj przykłady z historii projektu.
Według danych DORA 2023, około 25–30% incydentów na produkcji jest spowodowanych różnicami między środowiskami. W zespołach bez konteneryzacji wskaźnik ten sięga 50%. Konteneryzacja obniża go do 10–15%.
Tak, to jedna z częstych przyczyn. Na produkcji włączony jest CDN, Varnish lub Redis cache, a na stagingu — nie. Jeśli błąd jest związany z dostarczaniem buforowanych danych, na stagingu się ujawni, a na produkcji będzie ukryty przez cache.
Docker gwarantuje identyczność środowiska na wszystkich etapach: rozwój, testowanie, staging, produkcja. Jeśli obraz jest zbudowany raz i używany wszędzie — rozbieżność wersji i konfiguracji jest wykluczona. Jednolity obraz to podstawa powtarzalności wdrożenia.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również