Pozwolę sobie pójść śladami mojego ostatniego wpisu z jednego z moich pozostałych blogów. Chodzi mianowicie o jednego z naszych klientów, a ściślej o jego serwis internetowy.
Kiedy przyszło mi wprowadzać tam pierwsze poprawki, urzekła mnie swoboda, z jaką w kodzie html zostały porozrzucane różne, bardziej lub mniej poprawne, tagi. Swoista lekkość kodowania może jeszcze znaleźć uzasadnienie w niedoświadczeniu zespołu, który serwis ów budował x lat temu, nic natomiast nie przychodzi mi na myśl, kiedy szukam jakiejś wiarygodnej wymówki odnośnie interfejsu.
Pal licho stronę główną, na której nic nie ma poza stertą animacji we flashu. Pal licho strony z informacjami, które działąją tylko pod JedynąSłuszną™ przeglądarką. Pal licho niespójność graficzną kolejnych podstron i intro flashowe, które działa tylko sporadycznie. To jest nic, prawdziwa radość przepełnia człowieka w momencie, kiedy zorientuje się, że strona ta zawiera sklepik internetowy.
A sklep jest nie lada wynalazkiem. Na wstępie powiem, że zajmuje się sprzedażą tylko i wyłącznie części i akcesoriów tuningowych do wszystkich możliwych samochodów. Właśnie te “wszystkie samochody” są największym problemem. Proszę sobie bowiem wyobrazić, że oferta do niedawna przekraczała grubo dwadzieścia siedem tysięcy produktów. Do niedawna, bo trochę się tutaj zmieniło, ale o tym za chwilę. Teraz jednak proponuję, aby każdy zastanowił się, czy przez całe życie widział dwadzieścia siedem tysięcy różnych przedmiotów? Cały trik polega na tym, że większość części jest dostępna w wersjach dla różnych marek i modeli pojazdów. Jedynym sposobem na prezentację tego, jaki przychodzi mi do głowy, byłaby lista rozwijalna w szczegółach każdego produktu, umożliwiająca przy zamawianiu zaznaczenie, do czegóż dany artykuł mamy zamiar wykorzystać. Klient w swym geniuszu poszedł jednak dalej, postanowił bowiem za jednym zamachem obniżyć koszty wykonania serwisu, jednocześnie upraszczając interfejs. Może wielu z was domyśla się już, jakiż to przesprytny zabieg został zastosowany? Mimo wszystko powiem to, tak, każdy produkt jest dodany do bazy sto kilkanaście razy, za każdym razem do jego nazwy zostały doklejone marka i model pojazdu docelowego. Czyż to nie przewspaniała idea? Pozazdrościć pomysłowości, przecież jak dotąd żaden klient sklepu nie skarży się, że po wybraniu konkretnej części, jego samochód jest gdzieś w okolicach czternastej strony. Kupił volvo, miał świadomość, że wcześniej alfabetycznie jest po 10 modeli alfa romeo, audi, bmw, citroena, mini-coopera, … czy też w końcu toyoty. Tak oto powstał najbardziej przejrzysty sklep internetowy, jaki kiedykolwiek matka magistrala nosiła.
Napisałem wcześniej, że dwadzieścia siedem tysięcy produktów było do niedawna. To prawda, przez ostatnich kilka dni roboczych moim głównym zadaniem było zaimportowanie do wspomnianego sklepu kolejnych czterech tysięcy artykułów. Zaimportowanie to takie proste słowo, przy okazji pozwolę sobie zatem powiedzieć, że właściciel zleca nam aktualizację sklepu, przesyłając w załączniku… arkusz excela wyeksportowany do formatu CSV. Teraz grzecznie podnieście szczęki i kontynuujemy o wspomnianym imporcie. Tym razem okazało się, że import mamy wykonać z… konkurencyjnego sklepu. “Oczywiście, wszystko zostało załatwione i otrzymamy wszystkie dane i zrzuty z bazy”. Oczywiście.
Faktycznie, otrzymaliśmy kilka plików w formacie SQL, zawierających dziwaczne struktury, jakiegokolwiek opisu brak. W końcu pola typu “prod”, “mode”, “mode2” i kilkanaście innych są całkowicie intuicyjne. Po kilku godzinach mieliśmy już o strukturze wyeksportowanej tabeli pojęcie rodem z kraju kwitnącej wiśni, czyli jako-takie. Zaintrygowała mnie tylko jedna rzecz… Gdzie się podział eksport tabeli z drzewem kategorii? Przecież nie wrzucę czterech tysięcy produktów do jednej. Gdybym wiedział, co mnie czeka, bez chwili zastanowienia umieściłbym nowoprzyjęte towary jeden pod drugim.
Sześć godzin później miałem już przepisane wszystkie 554 kategorie ze strony klienta, który to proces został przeprowadzony przy wdrożeniu najnowszych dostępnych na rynku technologii automatyzacji - a dokładniej przy użyciu jednego okna przeglądarki z dwoma zakładkami, w jednej otwarty sklep klienta, w drugiej konkurencja. Jestem rewelacyjną maszynistką. Oprócz tego w ciągu wspomnianych 6 godzin udało mi się rozgryźć, jakich kosmicznych metod konkurencja używa do przypisania produktu do kategorii (do dyspozycji miałem adresy url ze strony i eksport z bazy, który nie zawierał słowa na temat kategorii), przypisałem zatemstosowne identyfikatory i zabrałem się za pisanie skryptu importującego zrzut do odpowiedniego formatu bazy (“odpowiedni” nie jest tu najlepszym słowem, chodzi mi o format stosowany w sklepie klienta, bo z odpowiednim ów ma niewiele wspólnego).
Wszystko szło pięknie i dane zostały zaimportowane. Dzień później okazało się, że import musi obejmować również zdjęcia towarów. Tylko skąd wziąć zdjęcia? Okazało się to prostsze niż przypuszczaliśmy, przynajmniej w teorii. Jeden z plików sql dostarczonych nam przez klienta okazał się posiadać adresy url do zdjęć… na serwerze jeszcze innego sklepu! Kolejna chwila potrzebna była już tylko na napisanie funkcji zapisującej zdjęcie z podanego urla do postaci dużej i miniaturki, a potem nie pozostało już nic innego, jak przystąpić do ponownego importu. Teoretycznie. W praktyce okazało się, że trzeba jakoś te 554 kategorie wyczyścić. Kolejny skrypt do napisania. Czyszczenie wszystkiego zajęło jakieś 5 minut. Zaczynamy więc import od zera. Idzie dobrze, idzie dobrze, niespodzianka. Przy tysiąc pięćsetnym którymś zdjęciu, czyli po jakiejś godzinie importu wystąpił błąd przy odpytywaniu DNS i wszystko szlag trafił. Wznowić od tego momentu nie da rady, kolejne czyszczenie, ale ale. Tym razem trzeba jeszcze wyczyścić tabelę ze zdjęciami produktów i katalog z powyższymi. Z tym, że nie wszystko, bo nie można uszkodzić wcześniejszych dwudziestu siedmiu tysięcy. Kolejne przeróbki w skrypcie czyszczącym i pół godziny jego działania. Przed kolejnym importem podjąłem kroki prewencyjne, zbudowałem system pagowania importu w paczki po 100 elementów i system cofający ostatnią paczkę w przypadku, gdyby wystąpił błąd. Godzina testowania i debugowania, i oto chwila tryumfu, bestia padła dnia trzeciego, po kolejnym pięciogodzinnym imporcie, tym razem w krokach po 100. Zastanawialiśmy się tylko, kiedy administracja serwera utrzymującego zdjęcia produktów zauważy, że w ciągu trzech dni wygenerowaliśmy im kilkaset megabajtów ruchu?