Dłubię pewien projekt.
<hermetyczny żart>Spędziłem 2 ostatnie dni i 2 ostatnie noce, czyli cztery dni, na kodzeniu.</hermetyczny żart> Staram się pisać zgodnie ze sztuką, dbać o detale, automatyzować co się da i pisać testy jak grzeczny chłopiec. Klepać kod zaczynając od niższych warstw w PHP, myśląc nad schematem bazy danych itp itp.
Gdy czytam cudzy kod i widzę, że jest niechlujny, bez testów, z ręcznym, by nie powiedzieć murzyńskim automatyzowaniem, coś mnie trafia.
Zacząłem się zastanawiać, dlaczego, na Latającego Potwora Spaghetti, idzie mi to tak wolno? Fakt, że kilka razy samemu coś spieprzyłem i próbowałem cofać zmiany ręcznie zamiast wesprzeć się Gitem. Fakt, że w końcu nauczyłem się jak używać takich wynalazków jak composer i bower. Fakt, że to mój pierwszy projekt w Laravel 4 (mam doświadczenie z Laravel 3). Ale do jasnej, dlaczego idzie mi to 3x wolniej, niż w trakcie uczenia kogoś, kto PHP widzi pierwszy raz na oczy?
Zacząłem myśleć nad tą sprawą. W pracy korzystam z RedBean, phpQuery i SlimFramework jako prostego routera z obsługą filtrów. Niby mam tam przygotowane snippety które sprawdzają dane z $_POST pod kątem zgodności z formularzem i zapisem do bazy danych ($_POST->phpQuery do formularza->html->phpQuery po polach formularza->redbean). Dziesiątki razy podczas zajęć z kursantami pisaliśmy autoryzację, czasem nawet sprawdzenie ról, prosty CMS.
Za każdym razem, gdy kogoś uczę, po murzyńsku dogrywamy zależności. Po murzyńsku, znaczy się ręcznie. Testujemy z kursantem kod również metodą murzyńską. Gdybym miał tłumaczyć jak działa phpUnit i Mockery, to kursant zrobiłby jeszcze większe oczy niż do tej pory, a o tym, że musiałby mi uwierzyć na słowo, że tak się robi to już nawet nie wspominam. W czasie jaki mam do wykorzystania NIE da się o wszystkim powiedzieć i wszystkiego pokazać. Domknięcia są proste, gdy ktoś wcześniej zobaczył jak działa jQuery, phpQuery z jQuery czerpie garściami, tylko selektory trochę bardziej zaawansowane, a kod trochę bardziej imperatywny i pisany bardziej wprost niż callbackowo-eventowy.
Baza danych? Jaka baza danych? RedBean sam robi schemat, dodaje potrzebne kolumny na zawołanie, zmienia ich typy gdy potrzeba. Foreach opisany w nawiasie wyżej – dane z $_POST trafiają do bazy danych, wstępnie zabezpieczone przed sql injection. Foreach w drugą stronę – dane z bazy danych trafiają do formularza, wstępnie zabezpieczone przed xss. Nie wiem, na ile to są pewne zabezpieczenia, nie miałem okazji ich sprawdzać. Seed bazy danych robiony banalnie prostym skryptem, na minimalnie szczątkowych danych. RedBean ma kilka często używanych metod opartych o statyczną fasadę – dispense, load, find, save, trash. Bez większej filozofii. Prosty design – jest Bootstrap. Składanie szablonu? PhpQuery wstrzykuje kawałki HTMLa do zbiorczego pliku. Pisanie formularzy? Bootsnipp, z gotowymi snippetami i z generatorem formularzy. Czego tutaj więcej potrzeba?
Opcjonalnie można nawet robić wstępną walidację danych po stronie klienta za pomocą angularjs ale jeszcze nie miałem okazji. Za mało czasu w trakcie kursu.
Mam nawet własny prototyp takiej aplikacyjki, z rozszerzonym SlimFramework i automatycznym ładowaniem funkcji/domknięć na wzór Laravel, aby nie trzymać wszystkiego w jednym olbrzymim pliku, a także z naiwnym RESTem opartym o BeanCan z RedBean, w którym na dobrą sprawę można wybrać i zmienić wszystkie dane gdyby człowiek się postarał. 🙂
I dotarło do mnie. Zardzewiałem. Z powodu wewnętrznego lenia, zacząłem traktować nowości typu composer jako ciekawostki, a nie praktyczne narzędzia. Przyzwyczaiłem się do często używanego pakietu narzędzi, a gdy przyszło mi pisać coś poważniejszego – to po prostu wolniej idzie. Gdy pracuję nad zleceniem, trzymam się innej metodyki niż gdy kogoś uczę. Takie coś leżące blisko waterfall z testami. W trakcie kursu mamy Agile pełną gębą, z testami murzyńskimi, bez specyfikacji, na czuja. I, do cholery ciężkiej, to jest totalnie dużo szybsze niż to, co robiłem przez ostatnie dni.
Może teraz też powinienem tak robić? :> A testy czy inne pierdoły pisać dopiero później? A co jeśli nie będzie mi się chciało? 😀
Ps. Nie, nie mam nic przeciwko murzynom i nie jestem rasistą. Mógłbym jeśli nie lubisz wykorzystywania murzynów, podstaw “chińczyk”, a jeśli i o nich się martwisz, wstaw mrówkę czy coś innego pracowitego, co też robi i nie dyskutuje.