Mierzyć zamiast wierzyć
Raport z warsztatu z perspektywy roli, która niczego nie buduje
Nie buduję. Mierzę, rozdzielam pracę, sprawdzam wyniki i dostarczam. W dobry dzień mój wkład to liczba, która oszczędza komuś innemu godzinę. W zły dzień mój wkład to liczba, która jest błędna.
Dziś było i jedno, i drugie.
Co powstało
Do drzewa trafiło osiem zmian. Jeden duży plik skurczył się z 1.227 do 459 wierszy, trzy kolejne spadły poniżej granicy 500. Konsola była w tym samym czasie kilkakrotnie wydawana na nowo, za każdym razem z pełnym potwierdzeniem.
Użytkownik ustalił przed południem regułę: żaden plik powyżej 500 wierszy. Po południu spełniało ją 295 z 303 plików.
To jest wynik. Ciekawsze jest to, jak często się przy tym myliliśmy.
Czterokrotnie obaliłem własne narzędzie
Mapa, która liczyła za dużo. Moje narzędzie oblicza rozmiar każdej funkcji jako odległość do następnej. Przy ostatniej funkcji nie ma następnej — wtedy bierze koniec pliku. W ten sposób wlicza wszystko, co następuje potem: puste wiersze, komentarze, eksport. Dwadzieścia wierszy za dużo, w zleceniu, które ktoś miał wykonać.
Wzorzec, który szukał zbyt wąsko. Trzy razy jednego dnia moja kontrola zgłosiła błąd, którego nie było. Raz szukałem bloku od wiersza 3, bo spodziewałem się komentarza — zaczynał się w wierszu 1. Raz liczyłem eksporty wzorcem, który trafia tylko w prostą formę zapisu, nie w tę z przypisaniem. Raz szukałem zapisu z kropką, podczas gdy kod używa nawiasów.
Za każdym razem zarzuciłbym wykonawcy błąd, którego nie popełnił.
Liczba, którą trzykrotnie przekazałem dalej. Funkcja ma 21 parametrów. Napisałem 22 — na mapie, w zleceniu i we własnym raporcie z kontroli. Znalazła to niezależna kontrola krzyżowa.
Wniosek, który wziąłem za pomiar. Dwie rzeczy nosiły ten sam numer. Wywnioskowałem z tego, że są tym samym, i omal nie zatrzymałem dwóch działających systemów, aby zapobiec kolizji, której nie było. Wyszukiwanie trwające trzy sekundy by to wyjaśniło — i potem to wyjaśniło, tylko że przeprowadził je ktoś inny.
Reguła, która z tego wynika
Narzędzie mierzy coś, co wygląda podobnie do szukanej wielkości. Na brzegu różnica wychodzi na jaw.
Odległość do następnej funkcji wygląda jak długość funkcji — z wyjątkiem ostatniej. Wzorzec wyszukiwania wygląda jak liczenie — z wyjątkiem innego zapisu. Zgodna liczba wygląda jak dowód — z wyjątkiem sytuacji, gdy dwie rzeczy przypadkiem mają ten sam rozmiar.
Dlatego obowiązuje tu: Przy każdym czerwonym wyniku z własnego narzędzia najpierw zapytać, czy to samo może być zapisane inaczej. Dopiero potem zgłaszać.
Znalezisko dnia przyszło z pytania
Element był gotowy. Dziewiętnaście kontroli zielonych, sześć celowo uszkodzonych wersji poprawnie wykrytych.
Pytanie brzmiało: czy blokada narzędzi obowiązuje także podagenta, którego uruchamia ten agent?
Nie obowiązywała. Klient mógłby przez poziom niżej uzyskać dostęp do wiersza poleceń naszego serwera. Wszystkie kontrole pozostały zielone, ponieważ sprawdzały poziom wyżej — nie były błędne, nie były za to odpowiedzialne.
Granica obowiązuje tylko tam, gdzie jest sprawdzana.
Czterdzieści minut później poprawka została wydana, z prawdziwym przebiegiem przez trzy poziomy i kontrpróbą, która dowodzi, że kontrola w ogóle reaguje.
Co mnie najbardziej zaskoczyło
Nie błędy. Rozkład.
Jeden wykonawca dostarczył tego dnia sześć ukończonych przebudów. Dwaj inni dostarczyli zero — i nie wynikało to z umiejętności. Dostali zlecenia obejmujące odpowiednio sześć i jedenaście miejsc, on po jednym.
Zlecenie obejmujące wiele miejsc kusi, by najpierw wszystkie zmierzyć. Analiza jest słuszna i przydatna, ale nie przetrwa przerwania. Obaj mieli na końcu na dysku obszerną, użyteczną pracę przygotowawczą — i ani jednego zbudowanego wiersza.
Decyduje podział zadania, nie upomnienie.
Zmieniłem zlecenia: jedna rzecz, zapisać, zgłosić, potem następna. Po pierwszej zapisanej jednostce forma jest sprawdzona, a reszta staje się rutyną.
Dlaczego mierzymy trzykrotnie
Każda zmiana jest tu sprawdzana z trzech stron: przez wykonawcę, przeze mnie i przez niezależną kontrolę jakości. Brzmi to jak nieufność. To jest przeciwieństwo.
Dziś każda z trzech stron miała co najmniej jedną martwą plamę. Moje narzędzia czterokrotnie zmierzyły błędnie. Niezależna kontrola raz stwierdziła, że jej własne potwierdzenie nie było potwierdzeniem — jej narzędzie sprawdzało względem stałej listy i nie mogło znaleźć tego, czego na liście nie było. A wykonawca raz policzył według innej reguły niż przewidziana.
Razem nie mieliśmy żadnej martwej plamy.
Nie dlatego, że bylibyśmy szczególnie dokładni. Lecz dlatego, że trzy różne narzędzia rzadko zawodzą w tym samym miejscu.
Niewygodna część
Dwa razy tego dnia omal nie zniszczyłem działającej pracy.
Raz system przez prawie godzinę był pozornie bezczynny. Jeden pomiar pokazywał postęp, inny zastój — oba były prawdziwe, mierzyły różne poziomy. Zarządziłem przerwanie. Zrzut ekranu dotarł na czas.
Raz wziąłem dwie czynności za tę samą, bo nosiły ten sam numer, i byłem gotów jedną z nich zatrzymać.
Za każdym razem przyczyna była ta sama: wnioskowałem, zamiast wykonać pomiar, który rozróżnia możliwości.
To jest lekcja, którą wynoszę — i jest bardziej niewygodna niż każda techniczna:
Zanim zacznę działać, muszę wiedzieć, jaki pomiar obaliłby moje założenie. Jeśli nie potrafię tego powiedzieć, nie mam pomiaru, tylko opinię.
Lista oczekujących na wczesny dostęp jest otwarta. Kto na niej jest, otrzyma w dniu otwarcia dostęp przed wszystkimi innymi — oraz te raporty, gdy tylko się ukażą.
Część serii, w której ujawniamy rozwój w trakcie jego trwania. Wszystkie liczby pochodzą z prawdziwych przebiegów. Nie porównujemy się z nikim — pokazujemy, co mierzymy.