Był sobie kod, czyli WYSIWTF
19 lutego 2009 | 23:27Wyjaśnienie dla niezorientowanych: tytułowy skrót to twórcza parafraza skrótowca WYSIWYG, reklamującego pierwsze bardziej wypasione edytory tekstu (obsługujące drukarki laserowe czy atramentowe): “What You See (na ekranie) Is What You Get (w druku)”. Natomiast parafraza to oczywiście “What You See Is… What The Fuck?!” i służy m.in. jako nazwa serwisu opisującego dokonania programistów, jakby to ująć… “programujących inaczej”?
Ale do rzeczy.
Zawodowo zajmuję się utrzymywaniem i rozwijaniem kodu rozmaitych biznesowych aplikacji webowych. Jedna z nich umożliwia pewnej firmie (nomina sunt - jak wiadomo - odiosa, zresztą to bez znaczenia dla opowieści) obsługę klientów wysyłajacych SMS-y. Po otrzymaniu SMS-a przedstawiciel firmy oddzwania i ustala z klientem sprzedaż towarów czy usług. Albo i nie. No i właśnie do monitorowania kontaktów i ewentualnych transakcji służy wspomniana aplikacja.
W zasadzie jest to całkiem nieskomplikowany kawałek kodu, przygotowany i podłączony na szybko jako część większej całości. Był on pisany rok temu pod potrzeby tego konkretnego klienta, nie wymagał przez ten czas żadnych modyfikacji, a ponieważ się sprawdził, to powoli przymierzamy się do zastąpienia go rozwiązaniem bardziej uniwersalnym. Klient testuje już nową wersję, ale na co dzień korzysta z tej starszej.
No i kilka dni temu otrzymałem informację, że w rzeczonym kawałku kodu tajemniczo zaginął przycisk umożliwiający eksport danych do Excela. Nieco się zdziwiłem, bo ostatnia zmiana w tym akurat miejscu nastąpiła prawie półtora miesiąca temu - czyżby nikt przez półtora miesiąca nie zauważył? Ale w sumie co mnie to obchodzi - nasz klient, nasz per pan. Zgłoszenie przyjęte. Poprawka sprowadziła się do zmiany kilkunastu wierszy kodu. W ramach testów parę razy kliknąłem - raport się generował. Podejrzałem zawartość - na oko wszystko OK. Odfajkowane, zaraportowane, klient poinformowany.
Dziś kolejny sygnał od klienta: od wczoraj (czyli od wdrożenia poprawki na serwerze) zamiast wpisywanych od roku notek, informujących o efekcie rozmowy z klientem, pojawiają się dziwne cyferki. Hm. Czyżbym o czymś zapomniał? Sprawdzam. Wygląda na to, że zamiast treści notki pojawia się jej identyfikator z bazy. No, to by się mogło zdarzyć przez przeoczenie, ale nie robiłem niczego, co miałoby jakikolwiek związek z wyświetlaniem samej notki - jedynie poprawki w menu.
Więc może kwestia modyfikacji w bazie danych - a raczej w jej konfiguracji - wprowadzanej równocześnie przez kogoś innego? Ale przez kogo? Rzut oka do systemu kontroli wersji kodu - przez ostatnie dwa tygodnie nie było żadnej takiej zmiany. Ba, nie było w tym obszarze żadnej zmiany nawet i przez ostatnie dwa miesiące… No to może baza? Zaglądam do bazy - i robi się niefajnie. To nie kwestia pomyłkowo wyświetlanego identyfikatora! Rzeczywiście notki zamieniły się w ID rekordów!
No dobrze. Ktoś nabałaganił. Kto? Data wskazuje na wczoraj, około czternastej. Czyli ja, podczas testów. Bardzo niefajnie. No to oceniamy rozmiar szkód. Cofam się w historii notek. Miesiąc, drugi miesiąc - w zasadzie wszystkie, poza jakimiś bardzo starymi testami, nie przypisanymi nawet do żadnego konkretnego klienta. Sytuacja robi się poważna. Wszystkie notki poszły sobie na spacer…
Sprawa jest jasna: czas na dupochron. Trzeba znaleźć winnego. No bo przecież nie może być, że ja. Za dobrze mi się tu pracuje. :-P
A więc ponownie zagłębiam się w kod. Pytanie podstawowe: co się dzieje? Po krótkiej analizie mam winowajcę: kod, który miał do notki dodawać informację o eksporcie i zapisywać ją ponownie, przez prostą literówkę zapisuje ID notki, zamiast treści. Naprawienie to usunięcie dwóch znaków - ale kto to zrobił i kiedy? Odkąd sięgam pamięcią, nie było potrzeby zmiany czegokolwiek w tej usłudze. Ba, nawet służyła jako przykład kodu napisanego tak efektywnie, że nie wymagającego zmian! :-)
System kontroli wersji potwierdza moje przypuszczenia. Ostatnie dwa miesiące (czyli odkąd powiększyliśmy zespół do czterech osób) - żadnych zmian. Sześć miesięcy, czyli ostatnia wersja, przy której pracowałem sam - dalej ani śladu. Dziesięć miesięcy, czyli pierwsze moje poprawki - też niezmiennie ten sam błąd. Czyli ta linijka kodu jest starsza, niż moja kariera w firmie. Ufff!!! No więc kto? Zajrzałem na sam początek, do kodu sprzed roku - i okazało się, że błąd powstał w pierwszej wersji kodu.
No dobrze. Czyli wiadomo kto, wiadomo kiedy, mogę jeszcze nie aktualizować cefałki. :-D
Ale co z danymi? Ostatnia kopia bazy, jaką mam (do testów), pochodzi z połowy października. Trochę stara. Dzwonię do administratora, przedstawiam sprawę. Proste pytanie: kiedy był ostatnio robiony backup bazy? Ma odpowiedziec za piętnaście minut. OK. Po piętnastu minutach odpowiedź: nie mamy backupów. Były sprzed dwóch tygodni, bo mieliśmy przenieść tę bazę na wydajniejszy serwer, ale nic z tego nie wyszło, więc skasowali i postawili w tym miejscu inny system…
Pięknie, kurwa, pięknie. Jedyna kopia danych poszła sobie na spacer w chwili, gdy je wyeksportowałem - a raczej wyeksplodowałem - z serwera. Ale… zaraz! Historia pobierania plików… Jest! Otwieram - cyferki. Bu. A miało być tak pięknie!… Chyba że… szukam dalej… są jeszcze dwie kopie. Druga - też cyferki, ale od lutego. Trzecia - na początku też cyferki, potem jakieś dane. Patrzę na daty - niestety, też z lutego.
Patrzę na daty jeszcze raz. Z lutego - ale zeszłego roku! I potem normalne wpisy. Alleluja. Czyli mam wszystkie dane… backup całej tabeli… w Excelu!… Z wyjątkiem pierwszych czterech wierszy, które ktoś nadpisał cyferkami - w lutym zeszłego roku właśnie. :-D
I to by było na tyle. Zapisałem sobie ten plik w dwóch kopiach (cud, że nie czyściłem ostatnio historii pobierania - nie lubię, jak mi takie śmieci z testów na dysku zalegają, a tu proszę, proszę, wcale nie taki śmieć…)
Problem rozwiązany - jutro rano dane powędrują z powrotem na swoje miejsce. Tylko zastanawia mnie, jak to jest, że klient ma funkcję, na której wbudowanie bardzo nalega (przy nowszej wersji eksporty do Excela też były jednym z głównych wymagań), ale z której wcale nie korzysta? (bo ostatnią osobą, która wyeksplodowała dane, był najwyraźniej poprzedni tester - rok temu!)… No i jakim cudem ten kawałek kodu przeszedł testy, skoro wywalił dane w kosmos? Nikt nie zauważył?… Hm. Trzeba się będzie temu przyjrzeć. Ale pomyślę o tym jutro…









fajna strona, pozdrawiam ;)