W dużym projekcie nie da się pamiętać, że gdzieś już jest funkcja licząca to samo – więc pisze się ją drugi i trzeci raz. To nie lenistwo, to koszt pamięci. Problem w tym, że kopie z czasem się rozchodzą: ta sama najlepsza próba ucznia potrafiła być inna na ekranie i w PDF-ie, a w aplikacji mobilnej ten sam egzamin pokazywał czas raz jako 12:05, raz jako 12 min 5 s. Ta sama choroba złapała niezależnie backend Django i aplikację w React Native. O tym, dlaczego duplikacja to fabryka takich rozjazdów, i jak posprzątać ją bezpiecznie: najpierw dopisać testy, potem scalać, a zielona suita ma świecić tak samo przed i po.
Studium przypadku z zawodowe.edu.pl: platforma ruszyła na początku 2025 na Bootstrapie 5, po roku miałem w planach jego usunięcie, po półtora – było zrobione. Nie przez wielki przepis, tylko szablon po szablonie, z bezpiecznym przełącznikiem i testami pilnującymi, żeby Bootstrap nie wrócił tylnymi drzwiami. Co go zastąpiło: details, dialog, :has(), natywne selecty i garść vanilla JS.
Nowy projekt i pierwsza decyzja: React czy Vue? Dla wielu to już nie decyzja, tylko odruch – zaczyna się od frameworka, zanim wiadomo, czy jest potrzebny. Kiedy framework naprawdę się broni (duży współdzielony stan, zespół, ekosystem), a kiedy wystarczy sama platforma: Web Components, moduły ES, Intl, View Transitions. Na przykładzie tego bloga – statyku prawie bez JavaScriptu.
Rozwijane menu, zakładki, akordeon, tooltip, sticky nagłówek, płynne przewijanie, pozycjonowanie dymka względem przycisku – to wszystko pisaliśmy odruchowo w JavaScripcie, bo CSS tego nie potrafił. Dziś potrafi. Przegląd rzeczy przeniesionych ze skryptu do arkusza stylów: :has(), popover, details, scroll-snap, position: sticky, container queries – z przykładami before/after i uczciwym rozdziałem o granicach.
Nie piszę o was, piszę o sobie sprzed lat. Kiedy pojawiło się PHP, trzymałem się CGI i Perla tak długo, że na PHP spojrzałem dopiero koło wydania czwartego. Ten sam odruch – nauczyłem się czegoś raz i tak będę pisał dalej – dziś każe ludziom zaczynać nowe projekty od jQuery. Przegląd tego, po co naprawdę braliśmy tę bibliotekę i co z tego jest już w gołej przeglądarce, z uczciwym rozdziałem o tym, kiedy jQuery wciąż ma sens.
Ostatnia część cyklu o sortowaniu: co naprawdę dzieje się po wywołaniu sorted() w Pythonie, Arrays.sort w Javie, std::sort w C++, sort() w PHP i JavaScripcie oraz sort_unstable w Ruście. Powersort od CPythona 3.11, dual-pivot quicksort dla typów prostych, stabilność wymuszona specyfikacją, sortowanie zewnętrzne, quickselect zamiast sortowania i klasyczne pułapki: sortowanie liczb jak napisów oraz niespójny komparator.
W kieszeni nosisz babiloński kalkulator sprzed czterech tysięcy lat. Skąd wziął się system sześćdziesiątkowy i liczenie na paliczkach, czemu 60 i 12 wygrywają z 10 liczbą dzielników, jak Egipcjanie podzielili noc na 12 godzin, skąd pochodzą słowa minuta i sekunda – i dlaczego rewolucyjna Francja przegrała z 10-godzinną dobą, choć jej dziesiętny czas przeżył w uniksowym timestampie.
Ostatnia cyfra PESEL-u, NIP-u, numeru karty płatniczej i dwie cyfry w IBAN-ie nie są losowe – to sumy kontrolne oparte na arytmetyce modularnej. Jakie błędy człowiek robi najczęściej, dlaczego wagi i moduł pierwszy łapią przestawione cyfry, algorytm Luhna w 15 linijkach oraz implementacje walidacji PESEL, NIP i IBAN w Pythonie, PHP i JavaScript.
Trzecia część cyklu o czasie: komputery nie liczą dat, tylko sekundy od 1970 roku. Skąd się bierze problem roku 2038 (i kogo naprawdę dotknie), czym są sekundy przestępne i dlaczego znikną do 2035, oraz czemu strefy czasowe to baza danych IANA, a nie matematyka – z dniami, które nie istnieją, i godzinami, które zdarzają się dwa razy.
Dlaczego Wielkanoc skacze po kalendarzu między 22 marca a 25 kwietnia? Computus – najstarszy algorytm świata: reguła paschalna, cykl Metona i kościelna pełnia Księżyca, algorytmy Gaussa i Meeusa z implementacjami w Pythonie i JavaScript, wyliczanie ruchomych świąt oraz wbudowane funkcje PHP easter_date i easter_days.
Pół historii, pół kodu: dlaczego mamy lata przestępne (reguła 4/100/400), jak Europa gubiła dni przy reformie gregoriańskiej – 10 dni w 1582, 11 dni w Anglii w 1752, szwedzki 30 lutego 1712 – oraz algorytmy wiecznego kalendarza: kongruencja Zellera, metoda Sakamoto i Doomsday, z implementacjami i wbudowanymi funkcjami języków.
Przełącznik jasny/ciemny, który naprawdę szanuje ustawienia systemu (także zmieniane w trakcie sesji), i regulacja rozmiaru tekstu – w ~30 liniach czystego JS, bez FOUC i bez bibliotek. Sztuczka: w localStorage nie zapisuję koloru, tylko 'opposite'.
jQuery, lodash, moment, Popper, jQuery UI datepicker – całe pokolenie bibliotek łatało dziury w przeglądarce. Dziś tych dziur już nie ma: CSS, HTML i natywny JavaScript przejęły to, co latami doklejaliśmy zależnościami, a miejscami CSS wyprzedził JavaScript. Przegląd z konkretnymi przykładami before/after i aktualnym stanem Baseline.
Zamiana liczb dziesiętnych na binarne – z częścią całkowitą i (rzadko porządnie tłumaczoną) częścią ułamkową. Algorytm mnożenia przez 2, kiedy ułamek jest skończony, a kiedy nieskończony, wykrywanie okresu oraz implementacje w Pythonie, JavaScript, PHP i C++. Plus most do niedokładności liczb zmiennoprzecinkowych.
Ten sam kalendarz miesięczny co w serii z jQuery, ale bez żadnych zależności: Web Component, natywne API DOM, Intl do nazw miesięcy i dni oraz fetch zamiast AJAX-a. Pokazuję, że w 2026 jQuery jest po prostu zbędne.
Jak zamienić liczbę binarną na dziesiętną: algorytm dla części całkowitej i ułamkowej oraz gotowy kod w Pythonie, JavaScripcie, PHP i C++. Krok po kroku.