Kako da razmišljate kao programer? (2.)

U prvom delu teksta koji je izašao na IT Čitalištu, bilo je reči o tome kako je obrazovanje, pogotovo solidna osnova u matematici, suštinski važno da bi se postalo odličan programer. U ovom, drugom delu teksta, obradićemo neke stvari koje su veoma bitne za lični razvoj svakog programera.

Najkorisnije iskustvo broj jedan u mom procesu učenja je EdScheme. Nikad čuli za to? Zvuči nekako poznato? Pa, možda zvuči poznato zbog reči “Scheme”, jezik iz familije Lisp. Verovatno nikad niste čuli za to jer je manje više beskorisno. To je cela svrha jezika EdScheme. Jezik EdScheme sadrži samo nekoliko ugrađenih funkcija (manje od dvadeset, ako se dobro sećam), a nema uopšte biblioteke koliko mi je poznato. Kad radite sa EdScheme knjigama, vi polako gradite jedan mnogo bogatiji jezik pomoću oskudnih alata koji su vam dati. U tom procesu, vi mnogo naučite o stvarima kao što su rekurzija i efikasnost, i počnete da shvatate da obično postoji više puteva u raj. Jedan primer koji mi se zadržao u sećanju bila je izrada jednostavne funkcije za preokretanje stringa. Sećam se toga kao kroz maglu, ali mi se čini da prvo čak nismo uopšte imali stringove; samo tipove array, char, integer i floating point. Tokom tog kursa, gradili smo na osnovu svojih prethodnih projekata. Problemi i neefikasnosti koje nismo otkrili na početku ubrzo bi se otkrili kako smo napredovali u kursu.

To iskustvo me je naučilo kako da svedem problem na njegov najjednostavniji oblik, Okamova (Ockham) oštrica programskog razmišljanja. Od tada, imao sam mnogo više uspeha u analizi problema i uvek se pitam: “koji je najjednostavniji način da se ovo postigne?” Veoma često, programeri biraju rešenja neverovatno neelegantna, samo zbog toga što koriste metode i alate na koje su već navikli. Programeri ne bi trebalo da pišu samo da bude što više redova koda, ne plaćaju ih po broju pomoćnih rutina kao Čarlsa Dikensa. Plaćaju ih da prave rešenja koja zadovoljavaju potrebe njihovih korisnika. Sve preko toga je prosto oholost. Programeri nisu vlastiti klijenti. Iskustvo sa jezikom EdScheme mi je dokazalo da je najvažnije da se postignu upotrebljiva, održiva i izvrsna rešenja; ponositi se sklepanim nemogućim rešenjima od neadekvatnih delova ne dolazi u obzir.

Još jedno iskustvo koje mi je pomoglo da proširim svoju svest o tome šta je dobro programiranje bio je jezik Perl. Perl je najelegantniji jezik koji sam ikad koristio. Veliko je zadovoljstvo kad se napiše jedan red koda koji obavi ono za šta bi u nekom drugom jeziku bilo potrebno pet, ili čak deset redova. Pre izvesnog vremena, preradio sam modul SoundEx CPAN iz Perla u jednu VB.Net klasu. Razlike u načinu pisanja koda su bile zapanjujuće. Nije samo to što Perl ima regex-e ugrađene kao string operator, a za VB.Net je potreban regex objekat. Bio je to celokupan stav ta dva jezika. Kad pišete VB.Net to je kao da se obraćate detetu od četiri godine; programiranje u Perlu je kao razgovor sa odraslim. Tačno je, kôd u Perlu može brzo da pređe u nečitak nered, pogotovo ako se preterano koriste implicitni operatori. Takođe je tačno da Perl sadrži priličan broj kontradikcija i nedoslednosti. Ali Perl je jezik tako neverovatno poučan i moćan. Negde oko 2000. sam pisao neki softver za trgovačku korpu (engl. shopping cart). U 1.609 redova koda (uključujući prazne redove, komentare, itd.) uspeo sam da upakujem sistem baze podataka sa ravnim fajlovima (to je bilo pre nego što je svaki računar na Vebu imao MySQL), potpun sistem šablona koji smatram boljim i moćnijim od PHP-ovog (to je bilo pre nego što je svaki računar na Vebu imao PHP), sam sistem trgovačke korpe, rutine za sesiju (niste mogli da računate da je instaliran CGI modul), evidentiranje grešaka, sve kompletno. Čak je postojao sistem modula za brzu izradu dodatnih modula. Priznajem, nedostajao mu je sistem onlajn administriranja; takođe verujem da je bio dovoljno jednostavan da mu taj sistem nije ni bio potreban. Kao i za EdScheme, pisao sam vlastite, prilagođene verzije koda za stvari koje većina programera uzima zdravo za gotovo, zato što je jedan od projektnih zahteva bio da se sme zahtevati jedino FTP pristup i Perl 5.

Za dublje razumevanje dobro napisanog koda, toplo vam preporučujem da pronađete projekat sa otvorenim kodom koji ne pripada “velikim zverkama” i pokušate da ga menjate i prilagodite svojim potrebama. Nedavno sam radio za ZenCart. Takav kakav jeste, sam softver je u redu. Ali moj klijent je imao izuzetne potrebe, pa “takav kakav jeste” nije nikako bio dovoljan. Morao sam da se udubim u kôd, do te mere da čak promenim osnovno funkcionisanje. Užasnuo sam se. Kôd je ličio na najgore primere iz lekcija Computer Science 101. Tu su bile ugnežđene petlje sa iteratorima kao što su “m”, “n” i “o”. Tu nije bilo doslednosti u imenima promenljivih. I tako dalje i tako dalje. Sam kôd je bio u redu, što se tiče funkcionisanja. Ali je bio tako nečitak da je ponekad čak i za minimalnu promenu bilo potrebno više sati samo da bi se pronašlo pravo mesto gde da se izvrši izmena. To me je učvrstilo u uverenju da treba razviti stil programiranja i držati ga se čvrsto. Ja imam poseban stil za svaki jezik koji koristim. Ali ostajem dosledan u okviru tog jezika, toliko da mogu da kopiram i prenesem kôd iz jednog projekta u drugi uz vrlo male (obično nikakve) izmene. Sitnice su veoma značajne, na primer da se iteratori uvek isto zovu. Kad neko vidi šta konkretna promenljiva znači u jednoj funkciji, odmah zna šta će da radi u sasvim odvojenoj funkciji u drugom delu koda, čak i u drugom programu koji sam ja pisao. Posebno je važno da timovi programera razviju zajednički stil i drže ga se.

Konačno, preporučujem da se prihvatite niza različitih jezika i pokušate da napišete isti mali projekat u svakom od njih. Brzo ćete naučiti šta se može a šta se ne može, za svaki jezik. Većina programa, na kraju, je u suštini CRUD (Create, Read, Update, Delete – napravi, čitaj, ažuriraj, briši) mehanizam; uzeti podatke od nekud, prikazati ih negde, dozvoliti da se nešto promeni i vratiti promene u izvor podataka. Neki jezici su u tome bolji od drugih. Na primer, .Net jezici su izuzetno podesni za neposredne funkcije baza podataka-na ekran-i nazad. Ali pokušajte da te podatke programski obradite pa će se pokazati ozbiljne mane jezika Visual Basic i C#. To su slabi jezici, nesposobni da bog zna šta urade bez džinovskog okvira .Net Framework iza sebe. Java je približno ista. Perl je neverovatno snažan jezik za obrade, pogotovo za tekst, ali njegovi sistemi kojima se podaci nude korisniku i uzimaju od njega su ispod poželjnog standarda. On je nastao kao proceduralni jezik i zato nije zabavno na njemu razvijati korisnički interfejs na kraju. I tako dalje. Dok budete učili razne jezike, imaćete takođe priliku da vidite kako stvari mogu da se urade. Što budete imali više alatki u svojoj kutiji, veća je verovatnoća da ćete upotrebiti pravu alatku za konkretan zadatak.

Znam da na ovaj spisak ima još mnogo toga da se doda. U suštini, želeo sam da bude jasno ovo: uvek širite svoje granice, nikad nemojte prestati da učite, i nemojte previše da se vežete za jedan jezik ili jednu metodologiju. Naučite šta u kojoj situaciji pomaže, pa ćete biti u stanju da odgovorite na svaki izazov.

2052-kako-da-razmisljate-kao-programer-2