Netokracija

Isti se softver ne piše dvaput

"Težak je život programera", umeo je šaljivo da kaže jedan moj prijatelj. I jeste težak. Naša profesija napreduje veoma brzo. Tehnologije i prakse, koje danas koristimo za razvoj softvera, već sutra postaće naš tehnički dug. Često imamo ambivalentan odnos prema svom poslu: konstantno smo oduševljeni novim, a ogorčeni nasleđem. Nije retkost da poželimo da otvorimo praznu datoteku i počnemo iz početka.

“Težak je život programera”, umeo je šaljivo da kaže jedan moj prijatelj. I jeste težak. Naša profesija napreduje veoma brzo. Tehnologije i prakse, koje danas koristimo za razvoj softvera, već sutra postaće naš tehnički dug. Često imamo ambivalentan odnos prema svom poslu: konstantno smo oduševljeni novim, a ogorčeni nasleđem. Nije retkost da poželimo da otvorimo praznu datoteku i počnemo iz početka.

Promena je jedina konstanta

Sigurno ste već čuli izreku da “dobar softver nikada nije završen”. Svako ko je na tržište poslao bar jednu komercijalnu aplikaciju, zna da razvoj softvera nije precizno isplaniran, vremenski ograničen projekat. Mene više podseća na dečiju igru Lego kockama, gde nam se na početku čini da imamo jasnu ideju šta želimo da napravimo, a onda se ciljevi često menjaju. U igru odjednom uleću i neki autići i kartonska kutija, a neretko shvatimo i da nam fale neke kocke. Igra zapravo nikada ne dolazi do nekog logičnog kraja. Uglavnom se završava kad nas prekine mama. Ili žena.

Promene su u prirodi razvoja softvera. Na njega utiče toliko nepoznatih stvari, da je svako dugoročnije planiranje potpuno besmisleno. Pod našom su kontrolom samo vizija i proces. Sve ostalo je reakcija na tržište i korisnike. Programer, koji nakon mnogih godina razvoja nekog softvera želi da ga napiše iz početka, zaboravlja na tu promenljivu prirodu svog posla. On gleda unazad i jasno vidi pogrešne odluke, koje su uzrok za tehnički dug. Međutim, često ne može da razume pod kakvim su okolnostima takve odluke donete i pogrešno pretpostavlja da će ovog puta, poučen iskustvom, moći bolje da planira i izbegne nove greške. Iskustvo jeste važno ali novo vreme donosi nove nepoznate, koje imaju neki novi, nepredvidljiv uticaj na razoj. Najbolje što možemo da uradimo nije da srušimo i počnemo iz početka, već da prilagodimo naš proces, nadajući se da će za par godina nekog novog programera glava boleti manje nego nas.

Loša ideja

Smatram da u praksi ili:

  1. refaktorišemo, popravljamo, odnosno nadgrađujemo postojeći softver ili
  2. pišemo novi, koji treba da prati neku novu viziju i odgovori nekom novom tržištu.

Trećeg nema. Napisati postojeći softver iz početka ima smisla koliko i ponovo napraviti isti avion od Lego kocaka. Ko ima decu, razumeće.

Koliko je ponovno pisanje postojećeg softvera loša ideja, najbolje je opisao Joel Spolsky u svom članku: “Stvari koje nikad ne bi smeli da radite, prvi deo”. U njemu opisuje slučaj kompanije Netscape, na koju je odluka da iz početka napiše svoj web browser imala katastrofalne poslovne posledice. Mlađi čitaoci možda neće znati za Netscape, ali možda je i to jedna od tih posledica. Ako ikada poželite da napišete neki softver iz početka, predlažem da prvo pročitate Joelov članak.

Opasna terminologija

Uprkos svemu, programeri i danas često koriste termin “napisati iz početka”. Sve i da smo vas do sad Joel i moja malenkost ubedili u besmislenost toga, ponekad je i sama terminologija opasna. Ali to bih želeo da vam objasnim na primeru iz sopstvenog iskustva.

Klijent za koga trenutno radim je jedno veselo, nemačko softversko preduzeće. Već 8 godina razvijaju softver, čiji su korisnici uglavnom pravnici, koji cene sigurnost. Prodaja ide dobro, pa je direktor uglavnom zadovoljan. Zadovoljna je i operativa. Zadovoljna je čak i recepcija. Jedini, koji nisu toliko zadovoljni, su programeri. Tokom svih tih godina, u njihovom se softveru nagomilao tehnički dug. Tištio je taj tehnički dug vođu razvoja, pa je s vremena na vreme preklinjao svog šefa, da ga pusti da softver “refaktoriše buldožerom”. Iskusni direktor se nije dao prevariti, pa je zahteve da se počne iz početka dugo odbijao. Sve do prošle godine. Tada je, na veliko veselje svojih programera, dao zeleno svetlo za razvoj nove verzije – iz nule. Šta li se promenilo?

Slušajući programere, dok su mi pričali šta sve žele da urade u novoj verziji, odzvanjala su uglavnom moderna tehnička rešenja: te Angular, te Node, te Redis, te Bootstrap, itd. A onda sam upoznao direktora. Njegova očekivanja nisu bila toliko tehnička. Pričao mi je oduševljeno o tome kako advokati budućnosti žele da rade na telefonima i tabletima. Objašnjavao je kako su se promenili poslovni modeli jer su se i konzervativniji klijenti navikli na SaaS, kako postoje nove prilike na drugim tržištima, gde sigurnost, posebno nakon poslednjih NSA skandala, ima sve veću cenu, itd. Stekao sam utisak da razgovaram s vizionarom, koji zapravo ne želi toliko novu verziju postojećeg softvera, koliko neki nov proizvod, koji će odgovoriti nekim novim izazovima. Motiv je poslovni, a ne tehnički. Izašao sam oduševljen. Zasukali smo rukave i razvoj je počeo.

Nešto, što sam na početku ignorisao, a što mi je tek kasnije upalo u uši, je da ceo tim razvoj nove verzije naziva “pisanje iz početka”. “Pišemo iz početka”, govorili su drugim kolegama. “Gradimo je iz nule”, čuo sam kako neko objašnjava preko telefona. Nekako sam neoprezno i sam prihvatio tu terminologiju ali sam ubrzo počeo da shvatam njen negativan uticaj. Obzirom da mi “pišemo iz početka” postojeći softver, onda ga koristimo kao da je specifikacija za novi. Produktna ekipa je pokušavala da osmisli novi korisnički interfejs, sve vreme gledajući u stari i pretpostavljajući da će korisnici nove verzije biti identični postojećim. Programeri su pokušavali da reše iste tehničke probleme na novi način, ne pitajući se da li te probleme ovog puta uopšte treba rešavati. Postalo mi je jasno da “pisanje iz početka” nije samo bezazlena terminologija, već pristup, koji ima opasan uticaj na naš razvojni proces.

Korisnik pre tehnologije

Kada razvoj softvera počne iz početka, u glavama treba imati viziju, a ne tehnologiju. Motiv treba da bude poslovni, a ne tehnološki. Ako su nam prioriteti poređani tako, da nam je glavni cilj otplatiti tehnički dug, a ne rešiti nove probleme ili napasti novo tržište, da li ćemo dovoljno vremena utrošiti na inovaciju? Bojim se da ne.

“Težak je život programera”, umeo je šaljivo da kaže moj prijatelj. Imao je pravo. Ali život prvo moramo da olakšamo korisniku, pa tek onda sebi.