Model pre koda: zašto sat sa zaposlenima vredi više od sata sa rukovodstvom
Najveći broj softverskih projekata propada zbog jednog razloga: izgrađen je sistem koji savršeno radi, ali ne radi pravu stvar.
Najveći broj softverskih projekata propada zbog jednog razloga: izgrađen je sistem koji savršeno radi, ali ne radi pravu stvar.
Kod je jeftin u poređenju sa otkrivanjem da ste pravi mesec dana modelovali pogrešan proces. I baš zato, mi započinjemo svaki ozbiljan posao na potpuno isti način — pre nego što napišemo i jednu liniju koda, sedimo sa ljudima koji bi taj sistem koristili i pratimo šta zaista rade.
Organizaciona šema je laž
Svaka firma ima organizacionu šemu. U njoj su uloge, odeljenja, hijerarhija. Ako je čitate kao softverski inženjer, dolazi vam u iskušenje da od šeme napravite sistem — komercijalisti vide ovo, supervizor odobrava ono, knjigovodstvo radi sledeće.
To gotovo nikad ne odgovara stvarnosti. Stvarni proces je gušći, kompleksniji i pun izuzetaka koje šema ne pokazuje. Komercijalista ne ide uvek pravo supervizoru — ako je supervizor van kancelarije, ide kod kolege; ako je dokument hitan, ide direktno u knjigovodstvo. U knjigovodstvu sve nije isto — jedna osoba radi fakturisanje, druga obračun PDV-a, treća se javlja na pitanja kupaca. Šema ne kaže ništa o tome.
Zato prva faza svakog projekta nije pisanje koda. Ona je razgovor.
Spustiti se do nivoa uloge i radnje
Otkrivanje koje radimo nije sastanak sa menadžerima. To je vreme provedeno sa ljudima koji rade konkretne poslove — kako popunjavaju formular, kako prosleđuju, šta se dešava kada nešto fali. Sedimo sa komercijalistima na terenu. Sedimo sa knjigovodstvom dok rade. Sedimo sa magacionerima dok izdaju robu.
Cilj nije da naučimo "kako sistem treba da izgleda". Cilj je da naučimo kako firma stvarno funkcioniše — do najnižeg nivoa pojedinačne radnje. Ko šta pita, kome šta šalje, šta se desi kada se nešto ne uklopi.
Formulari koje vidimo na stolu nisu sam proces. Oni su dokaz pukotina u procesu. Svaki formular postoji jer je nekada nešto bilo zaboravljeno, izgubljeno ili pogrešno preneto, pa je tim sebi izmislio papir koji to sprečava. Tih obrazaca obično ima više nego što sami ljudi misle. Tek kada pitate "a šta radite u slučaju da..." izlazi novi obrazac koji svako popunjava ali niko ne pominje na sastanku.
Mašine stanja, ne moduli
Kada izađemo iz faze otkrivanja, ono što nosimo nazad nije lista funkcija. To je model entiteta i mašina stanja.
Razlika je važna. Lista funkcija je "ekran za unos kupaca, ekran za prodaju, ekran za naplatu". To je dizajn aplikacije, ne dizajn procesa. Mašina stanja je drugačija: dokument se rađa u stanju kreirano, odlazi u verifikovano, može da pređe u fakturisano ili vraćeno, iz fakturisanog može u plaćeno ili stornirano. Iz svakog stanja postoje samo određeni prelazi, i svaki prelaz ima svoja pravila.
Zašto je to važno? Zato što firma ne funkcioniše kroz ekrane — funkcioniše kroz tokove. Dokument nema "ekran"; on ima životni ciklus, i taj ciklus mora biti modelovan eksplicitno da bi sistem znao šta sme, a šta ne sme da uradi sa njim.
Kada je mašina stanja jasna, ekran je samo prikaz onoga gde se trenutno taj dokument nalazi. Programer može da napiše ekran za jedan dan; nemogući prelaz u procesu može da košta mesec.
Zatvoriti rubne slučajeve dok su jeftini
Treća stvar koju radimo pre koda: vraćamo sve nazad klijentu i pitamo "šta smo izostavili?"
Otkrivanje obično otkriva 80% procesa. Preostalih 20% su rubni slučajevi — šta ako kupac vrati pola robe? Šta ako se isti dokument greškom kreira dvaput? Šta ako komercijalista u terenu izgubi telefon sa neposlatim dokumentima? Šta ako kurs promeni za vreme dok je faktura otvorena?
Klijent obično zna sve ove stvari. Samo ih nije svesno povezao sa novim sistemom, jer dosad ih je rešavala neka osoba — Marija iz knjigovodstva koja zna kako se rešava taj problem. Sistem ne zna. Sistem mora da bude eksplicitno naučen šta da radi.
Kada se rubni slučajevi postave pre koda, oni se zatvaraju za sat-dva razgovora. Kada se otkriju posle isporuke, košta jedan ciklus razvoja, ponovo testiranje, ponovo deployment, i — najgore — period u kojem produkcijski sistem radi pogrešno.
Primer iz prakse
Najveći projekat na kome smo ovaj pristup primenili je operativni sistem za Rudex. Pre prve linije koda proveli smo sedmice na sastancima u njihovim pogonima. Sedeli smo sa proizvodnjom, magacinom, otpremom, knjigovodstvom — svaka uloga dobila je par sati vremena.
Iz tih sati izašao je model koji je opisivao kako firma stvarno funkcioniše, sa svim rubnim slučajevima koje smo zajedno otkrili. Klijent je validovao model pre nego što smo počeli sa razvojem. Posle je razvoj išao bez velikih izmena u modelu, jer je model bio tačan.
Slično smo radili i za Sushi XO. Pre nego što smo započeli integraciju njihovog POS-a, sedeli smo sa kuhinjom i šankom da razumemo gde tačno POS prestaje da bude koristan i gde počinje sledeći problem. POS dobro radi unutar svog domena — naručivanje, štampanje, plaćanje. Ali ne podržava program lojalnosti, ne obrađuje SMS autentifikaciju, ne razume da je isti kupac koji je juče naručio danas ponovo na sajtu. Sistem koji smo napravili nije "zamenio" POS; on je popunio prazninu koja je već bila tu.
Pet verzija Rudex sistema kasnije, isti pristup je svaki put kičma za naredno proširenje. Sistem se ne menja zato što je bio loše napravljen — menja se zato što firma raste i dobija nove tokove. Stari tokovi i dalje rade jer su bili tačno modelovani na početku.
Šta ovo znači za Vas
Ako razmišljate o softverskom projektu, pitanje koje treba postaviti pre nego što potpišete bilo šta nije "koliko će koštati i kada će biti gotovo." Pitanje je "koliko vremena ćemo provesti razumevajući naš stvarni proces pre nego što počnemo da pišemo kod?"
Odgovor "praktično ništa, mi već znamo šta nam treba" je crvena zastava. To znači da će se otkrivanje raditi tokom razvoja, najskuplje moguće mesto za njega.
Mi taj rad pravimo eksplicitno deo svakog projekta. Često je to najvrednija faza — ne zato što vodi do koda, već zato što firma sama bolje upozna sopstveni proces. Često klijenti otkriju stvari za koje nisu znali da rade.
A kada počne razvoj, kod je jednostavan deo. Sistem zna gde ide jer model zna gde ide. To je razlika između softvera koji firma koristi i softvera koji firma kupi pa zaboravi.