Tuesday, May 5, 2009

Broken Window Theory...

Teoria


Nie pamiętam już gdzie ale jakiś czas temu czytałem o "teorii rozbitej szyby". Termin ten kojarzony jest przede wszystkim z Rudolphem Giulianim burmistrzem Nowego Jorku.
Teoria ta w skrócie mówi iż jedna zbita szyba pozostawiona w budynku sprawi że będzie on dalej niszczony w dużo szybszym tempie.
Sam widziałem zastosowanie tej teorii w praktyce widując pozostawione na długie tygodnie/miesiące samochody. Gdy były "całe" nikt ich nie dewastował, wystarczyło że ktoś wybił pierwszą szybę, reflektor (i nikt go nie wymienił,nie zakleił folią szyby), a dewastacja następowała lawinowo z dnia na dzień. Milczące przyzwolenie sprawiało, że ludzie czuli się mniej odpowiedzialni, a odpowiedzialność za zniszczenie samochodu stawała się coraz bardziej rozmyta na wiele osób.


Problem


W wielu projektach w których byłem widziałem rozwiązania mało eleganckie lub wręcz sprzeczne z powszechnie przyjętymi zasadami tego rzemiosła. Gdy po krótkim dochodzeniu udawało się zlokalizować winnego ten tłumaczył się, że zrobił tak samo jak było to rozwiązane w innym miejscu. Na argument, że jest to zrobione w sposób nieprawidłowy, odpowiadał, że jemu też się to rozwiązanie nie podoba, ale przecież w innych miejscach ktoś inny też tak postąpił, więc nie wpłynie to istotnie na jakość projektu. Gdy udało się znaleźć tego kto zapoczątkował złą praktykę okazywało się, że to było rozwiązanie "tymczasowe" i "później" miało być zrobione to lepiej (lub w inny sposób tłumaczone deadline-ami). Bardzo szybko jedna zbita szyba zamieniła się w 2, potem 3 i liczba ta stale rosła. Co więcej wszyscy zaczęli narzekać na wyjątkowo niską jakość projektu, któremu "nic" już nie zaszkodzi, więc wszystkie chwyty stały się dozwolone.


Rozwiązanie ?


Sam muszę przyznać że zdarzało mi się rozwiązywać problem "łatając" coś w sposób brzydki ("skoro wszyscy tak robią"). Ale gdy ktoś zwrócił mi uwagę na pierwszą rozbita przeze mnie szybę zwykle od razu starałem się ją naprawić. Większość programistów, gdy popełnią taki błąd i zostanie im zwrócona uwaga nie jest dumna z tego faktu. Taki "winny developer" stara się jak najszybciej poprawić swój błąd/niedopatrzenie/lenistwo.
Burmistrz Giuliani zwiększył uprawnienia Policji i wypowiedział bezwzględną walkę graficiarzom, a co może zrobić architekt/lead developer/kierownik projektu ?


Myślę, że powołanie "Policji projektowej" nie jest złym pomysłem ;) Być może brzmi to śmiesznie, biurokratycznie i formalnie ale można spojrzeć na to pod innym kontem.
Policjant będzie to rola odpowiedzialna za jakość kodu. Może być nią jedna osoba lub grupa osób, może być to także funkcja "przechodnia". Policjant nie musi całymi dniami przeglądać kodu w poszukiwaniu "zbrodni". Wystarczy, że gdy przypadkiem ją zauważy nie przejdzie obok niej obojętnie. Być może przydało by się miejsce w którym takie fragmenty były by wypisywane (np. bug tracker, tablica korkowa) nawet anonimowo bez dochodzenia kto je popełnił. Osoba mając w danej chwili więcej czasu mogła by je poprawić i zdjąć z tablicy, mógłby zrobić to także sam autor widząc swoje "dzieło" na tablicy. Czy takie rozwiązanie sprawdziło by się w praktyce ? Prawdopodobnie tak, ale pewności nie mam gdyż nigdy nie widziałem jego zastosowania.
Na pewno najlepszą metodą dbania o jakoś kodu jest pisanie kody wysokiej jakości, ale jak sami widzimy różnie z tym bywa. Czasami taki błąd może być źródłem pośpiechu, niezrozumienia danego fragmentu aplikacji czy braku umiejętności. Jak pokazuje praktyka takich sytuacji uniknąć się nie da, ale to nie znaczy, że nie można z nimi walczyć.
Inną metodą przeciwdziałania są rewizje kodu. W takim podejściu każdy kawałek kodu musi zostać zaakceptowany przez innego programistę. Jest to metoda bez wątpienia bardziej skuteczna ale zarazem wymaga poświęcenia większej ilości dodatkowego czasu oraz skutecznego jej egzekwowania (np. za pomocą odpowiednich narzędzi zintegrowanych z repozytorium).

1 comment:

penszo said...

mialem taki samochod pod blokiem, idealne zobrazowanie tej teorii. jak stal to stal, potem ktos urwal w nim lusterko, a pozniej poszlo juz lawinowo :)

jezeli chodzi o programowanie to bledy sie zdarzaja. bledy skladniowe, bledy w samym projekcie, zalozeniach. jezeli chodzi o ten konkretny przypadek to chyba poprostu trzeba zapobiegac, a nie leczyc czyli uczyc ludzi dobrego programowania. dobrego tzn 'kulturalnego'.

konczac analogia samochodowa, co z tego, ze ludzie znaja wszystkie znaki, jak za kierownica i tak pozostaja burakami. ludzi poprostu nie uczy sie kultury jazdy. moze trzeba i uczyc kultury programowania? :P

generalnie to sie nie znam, bo nie jestem programista :)