-
Czemu programiści nie chcą testować?
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 się źle czują taką gorszą pracę wykonując. 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 (m.in. 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 przekonanie, że „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 wszystkiem na dwóch fałszywych przesłankach.
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 jej umiejętności. Redukuje ją więc do biologicznej maszyny, która ma z punktu widzenia organizacji tą właśnie, 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ółproduktu do przetwarzania, co jest zadaniem maszyny „analityk”, która go tworzy pod postacią „specyfikacji”. Po wyjściu z maszyny „programista” stawiamy maszynę „tester”, 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 tj. 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ść 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 czynność przypisywana programistom) jest tylko jednym etapem tego procesu. 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 – a nie jest nim działające oprogramowanie, jest nim danie użytkownikowi wartościowych możliwości, których wcześniej nie miał.
Z pewnością jeśli zbierzemy zespół to 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, a więc możliwości zespołu były 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śli 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ą.
Druga fałszywa przesłanka, na której opiera się przekonanie, że „programista nie powinien zajmować się testami” to przekonanie, że „w pracy powinienem (wzgl. powinnam) zajmować się rzeczami przyjemnymi” połączone z brakiem odpowiedzialności za swoją pracę. Nastawienie takie nie jest szczególnie oryginalne, 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ć i nie uważać, że czynności te go nie obchodzą i nie interesują. Nie powinien uważać, że to jest w porządku, że może oddać coś bo „u mnie działa” a sprawa ew. testów to już zajęcie dla kogoś innego, 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 wychodzą poza nie jeśli jest to konieczne. 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ę obronie źle czuje, 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, 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, w ten sposób 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 to 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.
-
Jak zetknąłem się z Agile
Z Agile zetknąłem się równo dziesięć lat temu, w roku 2006. Taka okrągła rocznica to dobra okazja, żeby podzielić się tą historią.
Aby o tym opowiedzieć muszę się jednak cofnąć do roku 2005. Wtedy właśnie zostałem menedżerem w nieistniejącej już firmie Air Bites Polska. Firma ta utworzona przez Swisscom (szwajcarski odpowiednik TP S.A. z tą różnicą, że nadal kontrolowany przez państwo Helwetów) była nowym ISP oferującym tani, prosty dostęp do Internetu. Był to zasadniczo startup, a ja odpowiadałem tam za stworzenie pionu technicznego. Od zera. Obejmowało to budowanie i konserwację sieci, podłączanie nowych klientów, bieżące operowanie siecią – i rozliczenia. By nie przedłużać tej historii skupię się tylko na tym ostatnim elemencie, ponieważ system bilingowy pisaliśmy sobie sami, także od zera.
Zaczęło się to od zatrudnienia pierwszego programisty, Adama (zresztą świetnego gościa, który obecnie po paroletnim pobycie w Google i wzięciu udziału w rejsie żeglarskim dookoła świata kreuje technikę w pewnym londyńskim startupie), który położył podwaliny pod system. Powoli rekrutowałem kolejnych aż doszliśmy do zespołu liczącego 5 czy 6 osób (było to 10 lat temu, nie pamiętam już dokładnie) w skład którego poza programistami wchodziła także testerka która dbała również o dokumentację. Jak zespół ten pracował?
Ano, ponieważ miałem pełnię władzy nad obszarem techniki i dużo swobody (żadnych narzuconych procesów i standardów) zorganizowałem pracę w sposób, który był dla mnie najbardziej naturalny i normalny:
- prowadziłem w narzędziu zwanym OmniOutliner listę funkcjonalności, które powinny się w systemie znaleźć w najbliższym czasie,
- raz na miesiąc spotykałem się z zespołem i dyskutowaliśmy o tym co dodamy do systemu w tym miesiącu – lista była przy tych dyskusjach wyświetlana z rzutnika na ścianę i dynamicznie zmieniana/edytowana w razie potrzeby,
- potem zespół dyskutował jeszcze dodatkowo jak to zrobi, w późniejszym okresie przyklejali do ściany w swoim pokoju karteczki z zadaniami,
- z inicjatywy Adama zespół codziennie się spotykał i omawiał co będzie robił, mieli także uzgodnione standardy kodowania i testów, część testów – zwłaszcza API – była zautomatyzowana,
- na bieżąco był dostępny system testowy zasilany wprost z repozytorium (wtedy w nowoczesnym narzędziu pt. Subversion), gdzie często zaglądałem patrząc co się pozmieniało,
- pod koniec miesiąca spotykaliśmy się, zespół pokazywał co zrobił, po czym robiliśmy wydanie – i dzień po wydaniu proces się powtarzał.
Tak to działało, kiedy to pewnego dnia w 2006 roku Adam przyniósł mi tą książkę i powiedział, że koniecznie muszę ją przeczytać. Tak też zrobiłem i wtedy odkryłem, że to co robiliśmy w zasadzie ma nazwę – jest to mianowicie Scrum. Brakowało nam tak naprawdę trzech rzeczy:
- sztywnej długości sprintu (czasem wydawaliśmy wcześniej a czasem później o parę dni),
- formalnie określonego kryterium ukończenia (Definition of Done),
- retrospekcji.
Oczywiście natychmiast te elementy wprowadziliśmy i można powiedzieć, że od razu, bez wielkich bóli i problemów pracowaliśmy już w pełnym Scrumie. Dość szybko też okazało się, że miesięczny sprint jest stanowczo zbyt długi – i skróciliśmy sprinty do dwóch tygodni, co znacznie poprawiło nam relacje z biznesem. Potem na bazie tego zespołu powstało Code Sprinters, gdzie tradycje pracy w ten sposób były kontynuowane w pracy dla zewnętrznych klientów – ale to już inna historia.
Dlaczego zdecydowałem się podzielić historią mojego osobistego zetknięcia z Agile na blogu?
Po pierwsze dlatego, że jak wiem z doświadczenia jest ona dość niezwykła – dla większości ludzi, z którymi spotykam się w mojej pracy Agile (Scrum czy Kanban) było odkryciem idącym w poprzek tego co wcześniej znali i co robiono u nich pracy. Tymczasem dla mnie to było na zasadzie: „o rany, to to ma już nazwę?” – nazwanie, uzupełnienie tego co już stosowałem, w czym już pracowałem.
Po drugie dlatego, że to doświadczenie – jak i kolejne lata pracy z zespołami Code Sprinters budującymi oprogramowanie dla klientów – dały mi jedną rzecz, której wielu nawet praktyków Agile nie ma: doświadczenie pracy w tak zwanym „pełnym” albo „książkowym” Scrumie.Przydaje się to kiedy pojawiają pytania z gatunku „ale czy to gdzieś może tak działać?”. Wiem, że może, bo sam tego doświadczyłem, co więcej, to dla mnie naturalny i normalny sposób pracy. Jest oczywiście wiele czynników, które spowodowały, że było to dla nas możliwe, wśród których warto wyróżnić ten oto, że organizacja była tak zrobiona od samego początku nie musieliśmy zatem mozolnie wychodzić z dysfunkcji i walczyć z zaszłościami. Niemniej – da się – i fajnie wiedzieć to z własnego życia, a nie z książek czy konferencji.
Ale jeszcze bardziej przydaje się to przy „leczeniu” ułomnego Agile, nieudanych „wdrożeń”, pomaganiu zespołom i firmom z problemami. Nie idzie nawet o to, żeby wszystkich doprowadzić do takiego idealnego stanu – bo to z różnych powodów nie zawsze jest możliwe – ale o to, by mieć go jako punkt odniesienia i przypomnienie, że to jest jednak możliwe.
Każdemu życzę takiego doświadczenia – zetknięcia ze „zdrowym Agile”, zdrową kulturą – a już zwłaszcza tym, którzy myślą o byciu Agile Coachami czy trenerami.
-
Czemu pracuję z korpo?
Ostatnio kolega Agile Coach zapytał mnie czemu przy moim sceptycyzmie wobec koncepcji „transformacji Agile” w korporacjach wciąż szkolę i doradzam w tychże korporacjach.
Robię tak czterech powodów:
- po pierwsze rozróżniam „bycie Agile” od stosowania metod Agile – w korpo da się zastosować metody Agile (np. Scrum czy Kanban w teamach, Nexus albo LeSS przy większej skali itp.) i uzyskać w ten sposób mniejszą lub większą poprawę (w tym mam na myśli zarówno poprawę wyników biznesowych czy wskaźników produktowych jak i poprawę jakości życia tych, którzy tam pracują a ściślej tej jego części, którą spędzają w pracy),
- po drugie mam dużo szacunku dla ludzi, którzy mimo wszystko próbują zmieniać duże organizacje (co zawsze podkreślam) i w związku z tym ich w tym wspieram – zwłaszcza kiedy mnie o to poproszą; nawet jeśli nie mam wiary w to, że ich wysiłek przyniesie długofalową głęboką zmianę w ich organizacjach to przynajmniej może przynieść (i najczęściej przynosi) pewne konkretne efekty i korzyści w ich zespołach a czasem i większych grupach,
- po trzecie nie uważam, że zjadłem wszystkie rozumy i jestem otwarty na przypadek, który przekona mnie, że nie mam racji,
- po czwarte „nie potrzebują lekarza zdrowi, lecz ci, którzy się źle mają”. I tu mała metafora: przychodzi do lekarza facet chory na płuca, który tak poza tym pali. Wiadomo, że póki pali wyleczyć się go całkiem nie da. Ale trochę mu pomóc, wydłużyć życie, podnieść jego komfort i owszem. Leczyć czy pryncypialnie odmówić? Ja wybieram to pierwsze.
Wciąż uważam, że nie da się przerobić korpo na „zwinną firmę” (co wielu wciąż obiecuje) metodą transformowania (a więc przekształcania) istniejących struktur i procesów. Da się w ten sposób uzyskać pewne usprawnienia (i to jest coś warte), ale nie stworzyć nową formę organizacji, nową jej wersję. By tego dokonać trzeba ją zbudować od zera – albo jako startup albo jako „nowotwór” obok firmy-matki, który ją w końcu „zje” (to np. poleca John Kotter). W każdy przypadku – czy to by uzyskać pewne usprawnienia czy to by zbudować coś nowego – pomocna jest wiedza. Tej wiedzy dostarczam jak umiem najlepiej.
Tak na marginesie „Agile” jest w ogóle za małym konceptem, żeby na nim zbudować nowe organizacje. Za małym, bo skoncentrowanym na oprogramowaniu – a przynajmniej produktach – a tu trzeba objąć więcej i pochylić się głównie nad organizacją jako taką a nie tylko niektórymi procesami, samą organizację poddać empirycznej ewolucji. Do tego zmierza Holakracja i inne podobne podejścia. Być może to byłoby w stanie zmienić istniejące organizacje od środka. Ale to temat na kolejny post/artykuł.