Taka dość typowa historia: w pewnym zespole programiści nie chcą zajmować się testami. Ba, Scrum Master, który jednocześnie jest też programistą, przygotował nawet specjalną prezentację na ten temat, by opowiedzieć o tym innym Scrum Masterom. Wynikało z niej, że testować ogólnie nie warto, bo programista przecież wie, że to co zrobił działa, więc to dla niego jest stratą czasu, a poza tym programiści są od programowania, testów nie lubią. Zresztą testy to coś pośledniejszego i oni, wykonując taką gorszą pracę, źle się czują. Więc nie będą.

Historię tę opowiedział mi niedawno zaprzyjaźniony Agile Coach z pytaniem dość oczywistym: co z takim przypadkiem robić? Oczywiście coś doradziłem (między innymi zasugerowałem szersze pochwalenie się na świecie kolegą Scrum Masterem – programistą, który tworzy bezbłędny kod – ktoś taki to prawdziwy skarb), miło porozmawialiśmy i być może nawet coś pomogłem. Niemniej pozostało poczucie pewnego niedosytu – miałem wrażenie, że w tej rozmowie nie doszliśmy do sedna sprawy.

Analizując podejście, zgodnie z którym programista nie powinien zajmować się testami (względnie, że zajmowanie się nimi jest poniżej jego godności i statusu społecznego) dochodzę do wniosku, że opiera się ono przede wszystkim na dwóch fałszywych przesłankach.

Edukacyjny grzech pierworodny

Pierwsza z nich to przekonanie, że rolą programisty jest programowanie, a ściślej, że „rolą programisty jest tworzenie kodu”. Takie redukcjonistyczne podejście widzi osobę, która umie programować, tylko w jednym wymiarze – tej właśnie umiejętności. W ten sposób redukuje się tego kogoś do biologicznej maszyny, która ma z punktu widzenia organizacji spełniać jedną funkcję. Nie dziwota, że skoro maszyna „programista” umie tylko jedno – „tworzyć kod” – to trzeba ją odpowiednio nastawić, a więc poprzedzić ją maszyną „architekt”, która „zaprojektuje rozwiązanie” oraz dostarczyć jej półprodukt do przetwarzania, co jest zadaniem maszyny „analityk”, która go tworzy pod postacią „specyfikacji”. Po wyjściu oprogramowania z maszyny „programista” przekazujemy je do maszyny „tes-ter”, której zadaniem jest sprawdzić czy to, co zrobiła maszyna „programista” jest zgodne z tym, co wyprodukowała maszyna „analityk”. Wszystko na podobieństwo łańcucha wytwórczego w przemyśle.

Jak łatwo zauważyć, wszystko jest zoptymalizowane na takie traktowanie pracownika począwszy już od etapu kształcenia (wąska specjalizacja), poprzez rekrutację (stanowiska opisane zadaniem, jakie ma być wykonywane), a kończąc na metrykach (godziny pracy, czyli godziny wykorzystywania umiejętności). Dołóżmy do tego formowanie menedżerów w taki sposób, że każdy z nich niemal instynktownie czuje się zobowiązany do dbania o to, by każda maszyna (zasób) była maksymalnie zajęta – i mamy obraz dysfunkcyjnego mechanizmu, który umacnia to błędne przekonanie – a co za tym idzie, jego konsekwencje.

Nie dziwne zatem, że wykształcona w tym kierunku i rozliczana z godzin programowania maszyna „programista” oburza się, gdy miałaby zajmować się czynnościami innych maszyn lub odpowiadać za ich wyniki. Nie dziwne, że osoba obsadzona w roli maszyny „programista” nie czuje się w pełni zaangażowana w produkt, czy w całość określonej pracy.

Tymczasem tak naprawdę zadaniem programistów, testerów i w ogóle wszystkich innych jest rozwiązywanie problemów użytkowników poprzez oprogramowanie, a więc dostarczanie użytkownikom nowych możliwości, które są dla nich wartościowe. Wymaga to wielu umiejętności i czynności – samo tworzenie kodu (a więc umiejętność przypisywana programistom) jest tylko jedną z nich. Wśród tych umiejętności, poza umiejętnością programowania, mamy także umiejętności analityczne (rozumienie problemu), jak i związane z testowaniem oraz wiele innych. Wszystkie one są potrzebne i ważne, bo bez nich nie może powstać kompletny efekt pracy. Przy czym nie jest nim działające oprogramowanie, ale danie użytkownikowi wartościowych możliwości, których wcześniej nie miał.

Jeśli zbierzemy zespół, to z pewnością różni jego członkowie mieć będą owe umiejętności rozwinięte i wyćwiczone w różnym stopniu. Jest to dobre, pod warunkiem, że będą z sobą współpracować w taki sposób, by wykorzystać swoje silne strony i zminimalizować słabe, dzięki czemu możliwości zespołu będą sumą ich możliwości. To zaś możliwe jest jedynie przy wspólnocie pracy (wszyscy razem tworzymy rozwiązanie dla naszego użytkownika/klienta) i odpowiedzialności za produkt. Innymi słowy, „testera” równie interesuje poprawność rozwiązania co i „analityka”, a „programista” przejmuje się nie tylko kodem, ale i tym, czy ów kod działa oraz czy efekt jego działania spełnia oczekiwania klienta. Łatwiej jest stan taki osiągnąć, jeżeli patrzymy na zespół nie jako na zbiór odrębnych wyspecjalizowanych maszyn, ale jako na grupę ludzi o różnych umiejętnościach, którzy wspólnie coś tworzą. Jak sądzę, taki stan właśnie mieli na myśli twórcy Scruma, kiedy nalegali, by wszystkich członków zespołu nazywać „developer” niezależnie od tego, jaką specjalność reprezentują.

Dojrzałość i odpowiedzialność

Drugą fałszywą przesłanką twierdzenia, że „programista nie powinien zajmować się testami” jest przekonanie, że „w pracy powinienem (względnie powinnam) zajmować się rzeczami przyjemnymi”, połączone z brakiem odpowiedzialności za swoją pracę. Nastawienie takie nie jest szczególnie oryginalne i występuje nie tylko w naszej branży. Przeciwnie, jest ogólną bolączką społeczną naszych czasów z ich naciskiem na fun i endemicznym brakiem zrozumienia dla takich pojęć jak obowiązek.

Temat to – wraz z naszym specyficznym tłem kulturowym – na osobny długi artykuł. Dość powiedzieć, że konieczna jest pewna dojrzałość i odpowiedzialność, która powoduje, że wstydzimy się oddać pracę niekompletną. Oprogramowanie, które nie zostało przetestowane jest w sposób ewidentny niekompletne, zbudowane niezgodnie ze sztuką. Profesjonalny, odpowiedzialny programista powinien się tym przejmować, a nie uważać, że czynności te go nie obchodzą i nie interesują. Nie powinien być zdania, że to jest w porządku, że może oddać coś, bo „u mnie działa”, a sprawa ewentualnych testów to już zajęcie dla kogoś innego, gdyż on jest ponad to…

Warto zauważyć, że w grach zespołowych – a Scrum to ma być „zespołowa gra w rozwój oprogramowania” (stąd nazwa) – choć są specjalności, to jednak zawodnicy, jeśli to konieczne, wychodzą poza nie. Na przykład jeśli obrońca znajdzie się w sytuacji dogodnej do oddania strzału na bramkę przeciwnika to to zrobi, a nie będzie się wymawiał, że on nie jest od tego specjalistą. Podobnie napastnik nie będzie obserwował spokojnie z boku akcji drużyny przeciwnej, twierdząc, że tą sprawą powinni zająć się obrońcy, a jego to nie obchodzi, bo on się w obronie źle czuje i pasjonuje go atak.

Ta metafora dość dobrze pokazuje o co chodzi. Nie idzie o to, że istnienie w zespole osób o specjalizacji bardziej ku testom („testerów”) nie ma sensu – wprost przeciwnie. Niemniej granica nie powinna być tak ostro zarysowana jak to ma miejsce ewidentnie w umyśle osoby, która zainspirowała ten przydługi artykuł. Innymi słowy, nie powinno być podziału w zespole, powinna być współpraca, w ramach której każdy robi to, co umie najlepiej, ale w miarę potrzeby także i to, co robi tylko przeciętnie, najlepiej jak umie, wkładając swój wysiłek w pracę zespołu w danym momencie i na danym etapie. Oczywiście, jest to trudniejsze niż po prostu powiedzenie, że „ja nie będę tego robił”, będące właśnie przejawem braku dojrzałości. W połączeniu z równie fałszywym przekonaniem, że celem metod agile jest, aby pracownikom – a szczególnie programistom – było miło i przyjemnie, prowadzi do wypowiedzi i postaw jak wyżej.

Co zatem należy robić? Po pierwsze, usunąć mechanizmy organizacyjne, które mogą wzmacniać pierwsze przekonanie (przede wszystkim skończyć z naciskiem na to, by wszyscy byli zajęci i idiotycznym liczeniem godzin). Po drugie, zdecydowanie walczyć z niedojrzałością i nieodpowiedzialnością, najlepiej już na etapie rekrutacji.

Andy Brandt Andy Brandt  

Jest założycielem i senior consultantem firmy doradczo-szkoleniowej Code Sprinters. Wcześniej był między innymi Country Managerem Swisscom CEE (w Polsce pod marką Air Bites), a także menedżerem i konsultantem w 4pi, Unisys i T-Mobile Polska, jak też pierwszym redaktorem naczelnym „Linux+”.