Porządki pod podłogą
Moonlight urósł do rozmiaru, w którym nikt już nie trzyma całości w głowie. Dwa tysiące adresów, prawie trzysta kontrolerów, sto sześćdziesiąt serwisów. Przy takiej skali dzieje się rzecz nieprzyjemna: funkcja może być napisana, wdrożona i nie działać, a nikt tego nie zauważy, bo nikt akurat tamtędy nie przechodził.
Postanowiłem to sprawdzić uczciwie. Nie z pamięci, nie z dokumentacji — z kodu.
Najpierw spis treści
Powstał katalog wszystkiego, co platforma robi: komiksy, książki, muzyka, animacja, fanpage z forum i wiki, czat, kino, anime, mozaiki, PinIT, marketplace, merch, certyfikaty autorstwa, studia, nauka japońskiego, bitwy artystyczne. Każda domena z opisem, gdzie mieszka w kodzie i czy ma testy.
Potem sprawdziłem sam katalog — automatycznie, klasa po klasie. Pierwsza wersja pominęła sześćdziesiąt trzy kontrolery. To już samo w sobie było odpowiedzią na pytanie „czy da się to ogarnąć na oko".
Potem szukanie dziur
Napisałem sto dwa testy dla siedemdziesięciu miejsc, które wcześniej nie miały ani jednego. Nie żeby zaliczyć metrykę — żeby zobaczyć, co pęknie.
Pękło sporo.
Bitwy artystyczne nie dojeżdżały do końca. Drabinka powstawała, uczestnicy się rejestrowali, płacili wpisowe — i na tym się kończyło. Rundy nie posuwały się dalej, zwycięzca nie był wyłaniany, pula nagród zostawała w depozycie. Cały mechanizm czekał na cztery zadania cykliczne, których nikt nie włączył. Teraz chodzą co kwadrans.
Publikacja z datą nie publikowała. Ustawiasz rozdział na wtorek dziesiątą, wtorek mija, rozdział stoi. Zadanie odpowiedzialne za wypuszczanie zaplanowanych treści również nie miało wpisu w harmonogramie.
Osiem stron witało błędem serwera. Lejek rejestracji, metryki weryfikacji, analiza spamu, alerty, pulpit analityki twórcy, statystyki książki i rozdziału, strona rekomendacji. Kontrolery były gotowe, dane liczone — brakowało samych widoków. Dopisane.
Analityka pokazywała zera. Profil zainteresowań czytelnika wypełniał się z metod, które zwracały pustkę, a jego odświeżanie było zakomentowane przy okazji jakiegoś dawnego debugowania i nigdy nie wróciło. Efekt: cztery segmenty odbiorców w panelu twórcy były nieosiągalne matematycznie, niezależnie od tego, jak ktoś się zachowywał. Wskaźniki liczą się teraz z realnych danych — różnorodność czytanych treści, tempo sięgania po nowości, przywiązanie do twórców, ryzyko odpłynięcia mierzone własnym rytmem czytelnika, a nie sztywną liczbą dni.
Raport przychodów albumu był martwy. Odpytywał tabele skasowane migracją rok wcześniej. Sprzedaż jednorazowa i przedsprzedaż, dotąd twarde zero, wreszcie się liczą.
Do tego pomniejsze: ranking aktualności wywracał się na premii dla subskrybentów, więc subskrybent widział to samo co przypadkowy gość. Odebranie komuś uprawnień w zespole nie działało od razu, bo stary wpis w pamięci podręcznej dalej je przyznawał. Jedenaście zadań sprzątających nie chodziło, więc pliki tymczasowe scen, dźwięku i PDF-ów zostawały na dysku w nieskończoność. Serwis rekomendacji potrafił zadławić kolejkę zadań w tle.
Osobno przeszedłem ścieżkę bezpieczeństwa płatności i utwardziłem obsługę cofniętych transakcji. Bez szczegółów — to akurat obszar, którego nie opisuje się publicznie.
Co z tego wynika
Najbardziej nauczyło mnie to, że kod, który nikogo nie budzi w nocy, wcale nie musi działać. Nie było zgłoszeń o bitwach, bo nikt nie doszedł do finału i nie miał czego zgłosić. Nie było zgłoszeń o pustych segmentach, bo skąd czytelnik ma wiedzieć, że powinien być gdzieś przypisany. Cisza nie jest dowodem sprawności — bywa dowodem, że funkcji po prostu nikt nie używa, bo się nie da.
Stąd te sto dwa testy. Nie zastąpią przeglądu funkcja po funkcji, ale od dziś siedemdziesiąt miejsc, które wcześniej nie miały żadnego zabezpieczenia, odezwie się samo, zanim ktokolwiek na nie trafi.
Zostały rzeczy do decyzji: kilka tysięcy linii kodu, do którego nie prowadzi żaden adres — w tym dwie równoległe kopie działających systemów — oraz analityka fanpage, gdzie osiemnaście metod nadal zwraca pustkę. Jedno i drugie do osobnego zamachu.