Kako postati Junior Full Stack programer za najviše dve i po godine

Tekst Marka Mitranića, Junior Full Stack developera u kompaniji Catena Media o tome kako se razviti kao full stack programer.

Marko Mitranić - 25. April, 2017.

Ovaj naslov je clickbait. Nemam nikakvu magičnu formulu po kojoj je to olakšano. Čak je i sam navedeni vremenski period u stvari oksimoron, jer dve i po godine nije ni malo, a ni puno — neko će smatrati da je 6 meseci dovoljno, drugi će tvrditi da vam treba 10 godina iskustva, a treći će reći “pih, junior može biti svako”.

Mene je, ipak, Vukašin iz Startita zamolio da prenesem svoje kratko i skromno programersko iskustvo na veoma sirov i iskren način, bez pretenzija da odgovorim na ovakva filozofska pitanja. Našim novim kolegama koji sada počinju, a kojima je ovaj tekst namenjen, je potrebna podrška i razumevanje, potrebno im je da čitaju što više različitih mišljenja i iskustava. Potrebno im je dosta materijala za čitanje i linkova kojih ću se potruditi da priložim. Potrebno im je da vide i napišu i dobar i loš kod, kako bi na osnovu iskustva i oni stekli svoje kritičko mišljenje, unapredili proces i naučili nas nečemu novom.

Iskoristiću priliku da vam ispričam svoju priču, a kroz tu priču, izdvojim neke od saveta, koje sam pronašao korisnim, a dobio od starijih kolega ili pročitao. Na momente ću u svom entuzijazmu zvučati kao da opisujem nekakav MMORPG. Izvinite na tome.

Kratak odgovor

Uz mnogo rada, truda i razumevanja za druge.

Dugačak odgovor

Biti developer nije lako, okružuju vas razne mitske priče i urbane legende o ljudima koji su naučili da programiraju za kratko vreme, napravili nekakvu igricu ili sajt i zaradili basnoslovne svote novca, kao i reklame za brze (i naravno jeftine) kurseve na kojima “možete naučiti da programirate i zarađujete 1000+ eur za samo 12–9–7–6–5–4–… meseci”.

Ovo je postulat ranih 2000-tih, kada smo svi mi bili “komšijin mali što je dobar s kompjuterima”, i uživali u toj tituli ne znajući šta će nam to napraviti za 15 godina. Ovu nezdravu atmosferu osećate najviše kada počinjete svoju karijeru — kao da materijal kojim moramo vladati nije dovoljno obiman i kompleksan sam po sebi, junior koji počinje svoj profesionalni razvoj u atmosferi u kojoj svi uključujući i njegovu porodicu žive u laži da se programiranje eto tako usputno uči za par meseci, će se osećati praktično nesposobno kada se prvi put nađe oči u oči sa činjenicom da Junior Front-end nije samo HTML, CSS i “nešto malo JS-a”, te da će mu trebati daleko duže od obećanog da bi imao pravu produkcionu vrednost za poslodavca.

Za ljude van naše profesije, ovi naslovi čine još jedan paradoks u atmosferi koja nas okružuje — stiče se utisak da ti to nešto naučiš, malo se iscimaš da nađeš gorepomenuti posao, i zatim, kao radnik u opštini iz nekog lošeg domaćeg sitkoma, doživotno ubireš plodove svog jednogodišnjeg truda. Ne.

Jeffrey Way ima jedan u potpunosti istinit isečak u govoru sa Laracona 2015 koji ukazuje na to da je naša borba za znanje večna tema među programerima:

jeffrey way writing software is hard

Sreća u nesreći je, rekao bih, izgleda da nas je u Srbiji malo. Ako obratite pažnju na uvek aktivne support grupe videćete jako simpatične scene u kojima mlade kolege pitaju za savete ili predstave svoj nivo znanja i (možda najbitnije) svoju želju za usavršavanjem/radom, a kao odgovor dobiju ponude za neplaćeni, plaćeni internship ili čak juniorske pozicije. Možda nismo svesni toga, ali ovakva scena je izuzetno retka u drugim industrijama. Evo nekih korisnih linkova. Svestan sam da sam možda izostavio neke bitne, ali očekujem da me kolege dopune u komentarima:

Moj prvi savet je čist common sense: pratite konverzacije i članke na ovim grupama i naučićete puno, uključite se koliko umete, šerujte i svoje znanje i otkrića i pokažite drugima svoj entuzijazam i želju za radom. Negde sam čitao da je Martin svog prvog mentora opisao kao “User manual za dečiji kompjuter Digi-Comp-I”. Dakle budite otvoreni, smatrajte svaki svoj kontakt sa kodom i drugim programerima kao priliku za “mini-mentorstvo”, jer ćete tako navići sebe da uvek učite od drugih, čak i kada je to pasivno. U našoj profesiji je mentorstvo izuzetno bitan deo kulture u svim uzrastima, nemojte to zaboraviti.

What do doctors do? Do you think hospitals hire medical graduates and throw them into operating rooms to do heart surgery on their first day on the job? Of course not.

~ “Mentoring, Apprenticeship and Craftsmanship”, Martin

Da biste uspeli da primenite ovaj model u praksi, morate se rešiti straha od kolega, straha od materije, straha od neznanja. Tako dolazimo do prve teme.

Rešite se straha

Kada počinješ, ni u okviru profesije nije ništa bolje. Ako je javno mnjenje van profesije, da je naš posao lakši nego što jeste — te se uči za 6 meseci — atmosfera koja vlada među juniorima je (kao odgovor na to?) u potpunom kontrastu.

Pre 4–5 godina, kada sam bojažljivo pravio svoje prve korake u programiranju, upoznao sam blisko par ljudi sa ETFa kroz par projekata, i to je momenat kada sam prvi put čuo izraze “Full Stack” i “Code Monkey” iskorišćene u svrhu da kolegu izdignu ili spuste. U narednim godinama sam uvideo da je ovaj način gradacije, prikladan desetogodišnjaku, u stvari jako štetan za našu profesiju — forsira u startu jedan nezdrav i relativistički način razmišljanja po kome su drugi uvek bolji ili lošiji od tebe, a tvoja vrednost se neprestano ocenjuje u odnosu na lestvicu onih programera koji te okružuju. Osnovni efekat ovoga je da te u startu zaplaši težinom zadatka koji stavljaš pred sebe. Ova kompetitivna atmosfera je naročito opasna za one, poput mene, koji tek počinju. Da nisam tada naišao na takav zid, dodatno zaplašen urbanim legendama o ETF-u, možda bih se ranije odvažio da nazovem sebe programerom.

Ipak, jedna dobra stvar je proizišla iz toga —primetio sam da se svi plašimo programiranja, svako iz svojih razloga, hteli to da priznamo ili ne. I da u tom liminalnom periodu razvoja, kao i u svakoj drugoj profesiji, treba da dokažemo sami sebi da je taj strah neosnovan i da proističe iz nesigurnosti, a ne iz neznanja.

Kako bih preskočio stav koji mi je tada delovao kao zid arogantnosti kod kolega, i zatim shvatio da je u pitanju sušta samoodbrana, od kakve ću se i ja par godina kasnije odvikavati, morao sam naučiti da se ne plašim zadataka koji se nađu ispred mene. I još bitnije, da se ne plašim toga da drugi saznaju da ne umem da rešim neki zadatak.

Da, neki će biti laki dok druge neću ni moći da razumem, ali ukoliko problemu uvek pristupim sistematično i hladne glave, uložim sav trud koji mogu, i na kraju krajeva pitam nekoga za pomoć ili savet, nema razloga za brigu.

Šta je za mene Full Stack?

Kako sam u startu (pogrešno) naučen da titule služe da bi pokazale da je neko bolji ili bitniji u timu od drugih, te da iskažu gradaciju, trebalo mi je vremena i iskustva rada u timu da bih uvideo da je situacija potpuno drugačija. Naša industrija nije lestvica, već veoma razgranato stablo. Svako od nas je tu jer voli programiranje, i svako od nas ima svoj način da voli programiranje. Kao u medicini, titule su tu da iskažu specijalizaciju — iskustvo je tu da ukaže na gradaciju nivoa znanja.

Full Stack nije, dakle, ništa drugo do titule koja označava programera koji nema specijalizaciju. Iz moje perspektive, to je programer koji želi da u svakom momentu ima osećaj da može svojim rukama da napravi i povrh svega da razume skoro svaki segment rada proizvoda. Onaj koji ima želju da poseduje napredno razumevanje nad svim aspektima proizvoda. Smatram da je prikladniji naziv za to — Generalista.

Stekao sam utisak da se ovaj put učenja sakrio u našoj profesiji, te je stidljiv i kontraverzan jer se može tumačiti na razne načine. Samo onaj ko još uvek veruje u lestvicu opisanu gore, će vas prepoznati kao prepotentnog ili da se veštački predstavljate kvalitetnijim nego što jeste, drugi će vas u startu zavoleti jer imaju razumevanja za vaš “Gesamtkunstwerk” pristup, sličan onome koji gaje zanatlije, doktori, antropolozi ili arhitekte, još od dana Bauhausa:

Gropius contended that artists and architects should also be craftsmen, that they should have experience working with different materials and artistic mediums, including industrial design, clothes design and theatre and music. However, Gropius did not necessarily see a building and every aspect of its design as being the work of a single hand.

~ Gesamtkunstwerk, Wikipedia

Vrlo brzo ćete naučiti da vaše nije da se dokazujete bilo kome. Na kojoj god poziciji bili, ne verujte u onu infantilnu “lestvica” podelu — vaš jedini zadatak i vaše jedino merilo kvaliteta je da pokažete da ste koristan član tima, koliko i svi ostali. Ako uspešno ispunite tu misiju, i kolege će se tako ponašati prema vama. A ovo, mi programeri, postižemo samo učenjem i radom.

The ideal developer should be willing to have a go at learning anything, but also acknowledge when they need help from a specialist in the team.

~ Full-Stack Developers, Andy Shora

Deo ste globalnog kolegijuma

Kolege i timovi, su jako bitan faktor. U našoj industriji vlada jedan vid zahvalnosti jednih drugima na koji često zaboravljamo. Da nije drugih, sa kojima možemo učiti, takmičiti se, i pitati za pomoć kada se osetimo slabi, ne bi postojala ni industrija kao takva.

Nekada smo učili programiranje iz knjiga. 2006 sam imao debelo belo izdanje Mikro knjige o osnovama PHPa. Zapamtio sam veliku količinu statičkih informacija, ali nisam umeo da ih primenim na praktičnom projektu kada sam se susreo sa istim. Razmišljati o tome sada mi deluje apstraktno poput onog večitog pitanja o Veneovoj zbirci zadataka koje srednjoškolci postavljaju jedni drugima “Šta će ovo meni, gde je ovde praktična primena”. Ipak, posle nekoliko nedelja u kojima mi nije delovalo kao da ću ikada uspeti uopšte da se konektujem na MySQL, imao sam gotovu stranicu sa formom za unos podataka koja ih je upisivala u databazu i stranicu za ispis. Sav ponosan sam paradirao po kraju i nazvao to forumom iako ću ubrzo otkriti da postoji phpBB i da je stvar daleko komplikovanija nego što ja to mogu da zamislim. Ipak, uspeo sam u tome. Kako sam uspeo da podignem lokalni server bez trunke dokumentacije (u pitanju su nedelje isprobavanja) i da napišem te stranice pomoću one knjige, nikada mi neće biti jasno. Kako smo uspevali da pronađemo odgovor na bilo koje pitanje u takvim knjigama mi takođe nikada neće biti jasno. Naviknuti na StackOverflow danas, ta tema mi deluje udaljeno kao da se desila u nekom prošlom životu.

Dakle sve što ste ikada “na gotovs” naučili, naučili ste zahvaljujući tuđem trudu. Nečijem odgovoru na S/O iz 2009, nečijem blogu na kome ste jedan od 20 čitalaca, ili čak Bernersovim pismima iz CERN-a. Svaki tekst koji pročitamo, svaki segment koda u kome doživimo “aha!” momenat treba smatrati “mini-mentorstvom”. Čak i naizgled nevezane teme mogu vam biti inspiracija i podstaći vas na učenje. Mene ova atmosfera tera da budem zahvalan drugima na svemu ovome, stvara osećaj učešća u jednom kolegijumu većem od mene, i stvara želju da uzvratim svojim skromnim doprinosom. Dok sam na fakultetu imao slobodnog vremena, odgovarao sam ljudima na S/O pitanja. Kada sam želeo da utvrdim svoje znanje iz WordPress Codexa, držao sam jednom nedeljno konsultacije kolegama koje je ta tema interesovala, u zamenu za to da mi ispričaju na čemu trenutno rade i šta ih muči. Skoro sam započeo anonimni dev blog, gde zapisujem zanimljivosti koje naučim ili teme koje obradim, kako bih drugima iza sebe olakšao taj isti put. Osećaj učešća u ovakvom društvu je oslobađajuć.

Skupovi i Konferencije

Iako ću u nastavku teksta napisati da nećete imati vremena da idete na skupove i konferencije, to je samo figurativno kako bih naglasio manjak vremena u kome ćete se naći. U realnosti, trudite se da idete na meetupe, konferencije, predavanja. Svaki kontakt sa kodom je koristan kontakt.

Svi profesionalci treniraju, pa i profesionalni programeri. Meetupi, konferencije, fakultetske vežbe i testovi, kata, code dojo, code pairing sa kolegama, sve su to samo različite vrste vežbi u koje ćete se upuštati. Sve su to mesta gde možete naučiti nešto novo.

Martin veruje da je output profesionalnog programera ekvivalentan kreativnom inputu koji sebi dozvoljavamo, dakle kao što su nas bake učile, hranite se zdravo…

Pratite Startit dešavanja, pronađite support (meetup) grupu za sebe, raspitujte se redovno o dešavanjima i radionicama van svog domena. Najbolje ideje i rešenja se nalaze tamo gde ih najmanje očekujemo. Ponekad valja rizikovati i posetiti dešavanje poput radionica i predavanja na Resonate.io ili UX predavanja i kurseva koje organizuje Nova Iskra koje izlazi iz direktne zone (komfora) programiranja kojom se bavite.

U jednom momentu su svi imali pretplate na Mikro, Svet Kompjutera, MacUser, Gsm&Com, Računari, Galaksiju i bezbroj virtuelnih lokacija poput DizajnZone, Benchmark, Internet Ogledala, Netokracije ili EliteSecurity kako bi osigurali sebi ovakvu vrstu kritičkog kreativnog inputa. Nemojte misliti da ne postoje kritički probrani kanali specijalizovani za programere iz vašeg domena, koji izdvajaju ili generišu prvoklasan sadržaj. Iako smo navikli da su newsletteri većinom spam, dobrih ipak ima više nego što mogu nabrojati, izdvajam mali broj iskrenih preporuka:

Učiti, Učiti i samo Učiti

Pomirite se na vreme sa time da ćete zauvek morati da učite i da se nikada nećete osećati kao za znate sve. U jednoj od svojih legendarnih knjiga Robert Martin izlaže tezu da vaše obrazovanje nije posao vašeg fakulteta ili poslodavca, već vas samih. Te očekuje od profesionalca da pored svojih 8 časova svakodnevnog rada izdvaja još dva sata svakog dana, u kojima će se usavršavati. Nekada će to biti u vidu čitanja pred spavanje, nekada u vidu freelance projekta, nekada u vidu rada iz čistog zadovoljstva.

Igrao sam se sa raznim jezicima praktično ceo život, a stekao sam dovoljno hrabrosti da svoje (ne)znanje počnem da prodajem negde oko 2011. U pitanju su bili veoma mali i amaterski sajtovi, a taj period su obeležili najnekvalitetniji kod koji sam ikada napisao, i fundamentalno nerazumevanje mehanizama koji web zapravo pokreću. Svi smo se našli u ovoj poziciji u nekom momentu, znaš dovoljno da izmeniš i prilagodiš tuđi rad, ali ne vladaš razumevanjem osnova programiranja dovoljno da sam možeš da napišeš isto to. Amaterski rad. Kada u ovom momentu svog razvoja gledaš stranicu koda, postoje veliki segmenti preko kojih možeš samo da napišeš znak pitanja, i da se potrudiš da to ne utiče na tvoje razumevanje celine. Nakon svega toga, nakon započetih studija antropologije, i nakon 7 godina rada raznih poslova u ITu, odlučio sam da je vreme da batalim sve i posvetim se u potpunosti programiranju.

Do or do not, there is no try.

~ Yoda

Kvantno stanje

Oglasi u našoj industriji su radi jednostavnosti podeljeni na Front i Back, ili na osnovu tehnologije, što zahteva da donesemo odluku o svom obrazovanju i razvoju, pre nego što zapravo imamo dovoljno razumevanja o opcijama između kojih biramo. Našao sam se u istoj poziciji kao mačka Ervina Šredingera, a sudeći po komentarima na Startit Facebook grupi, i mnogo vas drugih…

“Šta upisati, odakle početi, koji jezik forsirati? Front ili Back? PHP ili Py? Možda mi je kasno da upisujem SI, ipak moram i da radim paralelno. A i to je teško pitanje da li bih završio ikad. RAF ili SAE? ITA — no way! Možda kvalitetan kurs, iOS Akademija i Macola su imali neke kratke kurseve…”

Odakle učiti?

Na Resonate festivalu 2016. u Beogradu sam prisustvovao predavanju Gael Huga, koji je izneo tezu o tome kada je konstruktivno, a kada ne, postaviti sebi ograničenja. Naime on svoje studente UX dizajna uči da pri istraživanju i pripremi za rad posmatraju samo široku sliku i da se ne plaše da menjaju smer u svakom momentu. Ali kada se odluče za projekat, pred sam početak postave sebi 3–4 ograničenja koja on zove “constraints”. App mora biti pisan u Cobolu, mora biti monohroman, input moze biti samo single tap based itd.

Dakle u toku istraživanja i pripremi projekta, cilj je kao sunđer upiti što više informacija, do trenutka da više ne znaš šta si pročitao. A zatim, u trenutku same kreacije dizajna ili izvršenja, tretirati proces kao igricu, te otežati sebi pomeranje sa staze, postaviti sebi striktna ograničenja i pravila kroz koja moraš da se izboriš da završiš projekat. U toku predavanja setio sam se svoje odluke pri upisu fakulteta:

Odlučio sam da ni jedan realističan fakultet koji se bavi programiranjem neće učiti Front-end ili Back-end — već algoritme, dizajn paterne, arhitekture sistema, vektore, osnove UX istraživanja, različite platforme i programske jezike, inicirati kreativne studentske projekte sa novim tehnologijama, “podsećati na ono što se radi negde tamo preko”. Dakle odlučio sam da ne pristanem da se ograničim terminima poput Front ili Back, ili određenim jezikom.

Što bi naše bake rekle “Ne ženiš se, pa da toliko biraš.”

Shvatiti ovo je bio ključan momenat za mene, jer nikada više nisam posmatrao programiranje na isti način.

Od tada su mi smešni dijagrami i podele koje pokušavaju da analitički razlože celine u našoj industriji, jer celina nema. Postoje samo specijalizacije, ali specijalizacije, kao i u medicini, mogu doći tek nakon što si savladao osnove.

Budite spremni da učite nove jezike

It’s no coincidence that a great programmer does not write “Java Developer” or “_____ Developer” in his or her résumé. Always be open and prepared to learn and play with new technologies.

~ José Campaña

U ovom smislu, imao sam jako interesantan studentski period. Ispostavilo se da je za mene SAE bio odličan izbor. S jedne strane imao sam skoro tri godine mentorstvo odličnih profesora i prilike za gomilu užasno zabavnih studentskih projekata sa kolegama. Učio sam JS, PHP, C#, ObjC, Laravel, UX, TDD. Radio na nekoliko dobrotvornih i studentskih projekata, išao redovno na Resonate i WWVršac, nalazio freelance posliće sebi i drugima, pisao project proposale. Pred kraj ovog perioda, na mene i moj kod je dosta uticala Martinova ranija knjiga Clean Code, koju preporučujem svim srcem.

No, da ne bude reklama, postoji jako dobar razlog zašto spominjem SAE. Susreo sam se sa problemom o kome često čitamo po internetu, ali kada su u pitanju studenti u Americi ili Engleskoj. Odjednom, imao sam obavezu da pored sredstava za kiriju i život, mesečno stvorim još 400 eur.

Raditi, Raditi i samo Raditi

To znači da (u teoriji) nemaš vremena da šetaš po konferencijama i da nađeš neki slatki neplaćeni internship (sa obećanjem da ćeš puno naučiti), to efektivno znači da ideš ujutro na faks, popodne na posao, a onda kad stigneš kući radiš freelance. Dve godine tog tempa je bilo jako naporno sprovesti u delo. Kao neko sa lošim radnim navikama, primorao sam sam sebi da promenim ličnost i ponašanje u jako kratkom vremenskom periodu.

U toku prve godine sam se mučio da nađem čak i neke basic freelance WordPress posliće, i mučio se da rezultat mog rada liči na nešto. Srećom ovo je i period u kome toliko brzo učiš tako da ni ne primetiš razliku u znanju. Na primer, neposredno pre ove promene i polaska na faultet, dao sam rok za posao responsive optimizacije jednog sajta na dve nedelje. Kada sam počeo da ga radim, par meseci kasnije, potpuno nesvesno sam završio ceo posao za jedno popodne. Nivo mog vokabulara u CSSu je bio potpuno isti kao i ranije, jedina razlika je bila u tome što sam sada zapravo razumeo šta radim, zašto to radim, i kako će to uticati na sajt. Po prvi put sam “slepo” u glavi imao isplaniran proces.

Throwing extra technology on top of an undisciplined person will just make a bigger mess.

~ Master the basics, Steve Pavlina

Freelance

Priča koju sam slušao mnogo puta od strane poznatih freelancera i predavača na raznim konferencijama mi se razvila. Odjednom, kad ljudi skapiraju da uvek pričaš kako ne umeš da radiš ovaj jezik ili onaj jezik, ali da im ipak završiš posao na vreme, krenulo je više ponuda nego što sam mogao da ispunim. Jedan klijent te preporuči drugome. Odjednom su krenule ponude za mobilne aplikacije za sva tri stora, održavanje sajtova, WordPress, sređivanje tuđih napuštenih custom CMS sistema, server hardening, pisanje dokumentacije, Laravel, SSO plugin za dve velike open source platforme. Radio bih sve čega sam mogao da se domognem, često ono što drugi ne žele da pipnu. Doživeo sam mnogo onih “Da mi je neko pre mesec dana rekao da ću ovo raditi, ne bih mu verovao” momenata. U tom periodu je bilo jako malo spavanja.

Ovakvo nije samo moje iskustvo, i nisam specijalan niti usamljen primer u ovome. Velika većina nas se u jednom momentu nađe u poziciji da jedan mesec nisi siguran da li će biti para za kiriju, a sledeći mesec ne spavaš od previše posla. Ispostavilo se da klijente na tom nivou ne interesuje preterano održivost sistema, unit testing ili kvalitet koda, čak su im i rokovi često nebitni. Jedino što ostaje za tobom je dobar glas da si posao obavio, to te prodaje dalje.

Kada treba da se popravlja nečija Cordova aplikacija za 3 noći, ti si čovek koga zovu. Kada treba da se napravi sajt za nedelju dana, tebe zovu. Custom made page builder za WordPress, optimizacija Gifova, gotovi i nikada upotrebljeni JS plagini za REST nad kolačićima i još mnogo toga. Na žalost kao i uvek, bilo je propalih poslova — poput rada na jednoj potencijalnoj socijalnoj mreži ili rada na sajtu za jednog francuskog vajara. Poslova gde se zapetljaš toliko da u jednom momentu priznaš poraz i odlučiš da prepustiš štafetu drugima. Ovo sam uvek pripisivao manjku iskustva i profesionalizma, što programerskog, tako i poslovnog u radu sa klijentima. To nije nešto čega se treba stideti, već nešto čega treba biti svestan i koristiti svaku priliku da ne napraviš iste greške. Ipak, za utehu, iako sam na ovakvim propalim projektima izgubio dosta vremena, nisam izašao praznih ruku. Naučio sam neviđeno mnogo o organizaciji timova, standardizaciji APIja, autentifikaciji. Ovo su stvari koje se ni ne mogu naučiti na drugačiji način sem radom na konkretnom projektu. Odavde su mi ostali neki segmenti koda, koje ću kasnije često koristiti da se pokažem kao jednako koristan član tima, među svojim budućim kolegama, čak i kada raspolažem manjim aktivnim znanjem od njih.

Ne budite zadovoljni svojim radom

Dosta kasnije sam gledajući sve što sam radio u ovom (veoma produktivnom) periodu shvatio da sam razvio jednu veoma zdravu osobinu — samokritičnost. Verovanje u to da je moj kod uvek loš, i da sve što sam napisao uvek može da se napiše bolje. Poslušao sam starije kolege, i uveo sebi pravilo da kada god otvorim stariji projekat radi čupanja parčeta nekog koda, ili sitne prepravke, uvek ostavim kod urednijim nego što sam ga našao.

Ako je istina da je naš napredak i učenje uvek prisutan, onda ću imati šta da prepravim. Ako ne vidim liniju koda na koju me uhvati grč u stomaku i koju želim da ispravim, to je znak da nisam napredovao.

Ako izvlačim parče korisnog koda kako bih ga iskoristio u novom projektu, zašto ga ne bih pretvorio u modul ili plagin, zašto da neki segment ne zamenim abstract factory-jem, zašto ne bih refaktorisao imena varijabli? Učio sam u međuvremenu dosta o garbage collectionu u drugom jeziku, zašto ne obratim pažnju kako se moj modul sada kotira, u skladu sa mojim novim znanjem? Uvek ima materijala za popravku, napravite od toga sebi igru.

Budite spremni na negativnu kritiku

Pokazujte kod drugima, ne stidite ga se. Code review je jedna magična stvar.

Dakle u svakom scenariju, izvući ćete korist od toga. Svaka od ove tri putanje vodi ka jednom trenu “mini-mentorstva”. Povrh svega, što više to radite, lakše će vam biti da drugima pokazujete svoj kod u budućnosti, i sigurniji ćete biti u sebe dok ga kucate.

Ovo će vam pomoći i da izbegnete užasno nezdravu naviku građenja zida oko svog koda. Zapamtite, kvalitetno napisan kod je kao pesmica, može svako da razume, nezavisno od svog nivoa znanja. Ako krijete kod od kolega, činite sebi magareću uslugu, jer je vaša odgovornost da ceo tim bude upućen u vaše dizajnerske odluke, isto kao što biste vi želeli da budete upućeni u njihove.

U poslednje vreme od kako radim u timu, razvio sam sebi zdravu naviku da prilikom pull-a novog koda od kolega, posvetim jedan Tomato (25min) da pročitam kod i sve komentare koji su išli uz njega na Code Review-u. Čak iako neke delove neću razumeti u detalje, razumeću logiku rada, što će me dovesti korak bliže fundamentalnom razumevanju svih aspekata aplikacije na kojoj radimo.

Ipak ovo ne znači da bi trebalo sebi dozvoliti neprofesionalnost. Morate imati obrazloženje za svaku liniju koda koja završi na Gitu, i morate dati sve od sebe da kod bude očišćen, pregledan, funkcionalan i čitak. Uvek testirajte sve pre commita, setite se Martinove mantre:

QA should find nothing!

Naš kod je naš potpis, po njemu nas kolege upoznaju i prepoznaju, te ima smisla utrošiti koji minut više kako bi se napisao kvalitetan commit message, ili pročistio kod od komentara ili dopisala koja reč u dokumentaciji. Ponekad čak i običan rename varijable može učiniti kod razumljivijim. Da ne pričam o tome da svi testovi moraju prolaziti pre nego što kod pošaljete dalje. Ovime ćete olakšati posao svojim kolegama, ali i sebi kada sledeći put naiđete na isti taj kod.

Intervjui za posao

Kao što sam već napisao, nisam bio u poziciji da tražim internship, a smatrao sam da ne poznajem ni jednu temu dovoljno da bih radio kao junior. Bilo je nekoliko intervjua, neki mi se nikada nisu javili, a neki jesu, ali sam ja odustao, ipak sam imao svoj balans stvorem tokom godinu i po dana frilensa i nisam želeo (niti imao računa) da radim tek bilo gde i po svaku cenu.

Intervjui za posao su bili nešto potpuno novo za mene i nisam znao šta da očekujem. Manje me je plašio HR faktor, a više mogućnost da se osramotim na tehničkom delu (što se apsolutno dešavalo). Setio sam se svoje pripreme za prijemni ispit TOI na Filozofskom Fakultetu. TOI i TOK su specifični po tome da ne znaš šta da očekuješ, testiraju tvoje znanje u rasponu od prepoznavanja Pikasovih slika, do informacija koliko je Novak imao pobeda 2010 godine, ili koliko kockica ima u čokoladi Najlepše Želje. Dakle ne testiraju tvoje sušto znanje već tvoju sposobnost rasuđivanja. I spremaju se tako što uzmeš “1000 Zašto 1000 Zato”, Politikin zabavnik i sve dnevne novine, i čitaš nasumično.

Rešio sam da je to smer u kome treba ići, i započeo sam sa prijateljima i kolegama iz struke Gist na kome skupljamo razna pitanja sa raznih intervjua iz raznih domaćih i stranih firmi. Vrlo brzo, počeli su da se javljaju i stranci, i imali smo pitanja od Facebooka do male firme iz kraja. Što šire to bolje. Ne sa ciljem da se na testovima vara, već sa ciljem da unapredimo svoj sistem pripreme za intervjue i sami sebi umanjimo tremu. Gist objavljujem prvi put javno u okviru ovog teksta, Naravno svi ste pozvani da priložite svoja iskustva, primedbe i pitanja na koja ste nailazili. Ni autori ni firme neće nikada biti objavljivane, jer bi se time izgubila poenta Gista.

Bilo je raznih iskustava, i savetujem vam da pročitate ovaj Gist kada god se spremate za intervju. Makar i da sve znate, ne može da škodi. Intervjua ima raznih koliko i firmi, očekujte neočekivano. Kolegu su u jednoj Slovenačkoj firmi umesto tehničkog intervjua zamolili da im pokaže “parče koda na koje je ponosan”. S druge strane doživeo sam na intervju za junior JS poziciju u jednom domaćem startapu, na kome su me tri sata cedili sa najsitnijim tehničkim detaljima vezanim za CORS. Često ćete umesto intervjua dobiti praktičan zadatak.

Kada razmišljate o tome šta neka firma želi da čuje od vas na intervjuu, stavite se u poziciju firme, oni imaju par sati na raspolaganju da procene vas ne samo kao programera, već i kao osobu i budućeg člana tima.

Full time generalista

U jednom momentu, sasvim slučajno (po preporuci), dobio sam intervju i počeo da radim u maloj a naprednoj domaćoj firmi Digital Mind koja se bavi kreativnom upotrebom novih tehnologija. VR, AR, Mobile, Hologrami, umetničke instalacije, Mocap, Interaktivne aktivacije… Stvari na kojima nisam sanjao da ću imati priliku da radim. “Da mi je neko pre mesec dana rekao…”

Trebao im je junior da radi Unity i Node, a ja nisam znao ni jedno ni drugo. Umesto tehničkog testa, zanimalo ih je da im opišem čime sam se sve bavio do sada, da li razumem kako radi HTC Vive Lighthouse i koliko brzo mogu da naučim Node. Prelep intervju. Imao sam test period dve nedelje da naučim osnove Unity-ja i rada sa NGUI, domain Node server i možda najbitnije, dobio sam konkretan produkcioni zadatak i odgovornost. Određeni segment programa je trebao biti gotov do kraja termina. Pa ovaj proces je bio tačno ono u čemu sam se ja specijalizovao poslednjih dve godine. Kod je bio očajan (godinu dana kasnije sam umirao od sramote dok sam radio refactoring pred kolegom), ali sam uspeo da završim posao u zadatom roku. I pored redovnog faksa, i pored freelance poslića koje sam još uvek vukao “u drugom threadu”.

Tih godinu dana kod Vite je bilo fenomenalno iskustvo, utvrdio sam svoju poziciju kao generalista, ubio strah od rada sa potpuno raznolikim setom tehnologija i jezika i naučio sam da radim sa Node, Unity, svim velikim VR platformama, Hololens, C#, Python, Open CV, Blockchain, Bufferima, Mrežama… Bukvalno na svakih par nedelja bismo dobijali novu “igračku” i zadatak da smislimo kako da je implementiramo na kreativan način.

Sledeće poglavlje

Ipak, sve više i više sam osećao pritisak i breme koje 2 godine ovako intenzivnog rada nose sa sobom. Ono što mi je stvarno falilo je mir. Želeo sam da prestanem sa ovim tempom, da prestanem sa freelance poslovima koji su mi jeli previše vremena i da se dovedem u jednu novu rutinu, a da novonastalo slobodno vreme ponovo posvetim učenju i kreativnim projektima. Trebao mi je senior iz mog domena. Nedostajalo mi je da radim na web based projektima, želeo sam da podignem nivo svog rada na webu. Želeo sam da radim sa kvalitetnim kodom, sa agilno isplaniranom arhitekturom, sa velikim sistemom. Da ponovo osetim onaj osećaj razumevanja svih delova jednog velikog sistema, da pređem na TDD, da imam kolege od kojih mogu da učim…

Ipak, našao sam se u nezgodnoj poziciji da nemam svoju specijalizaciju. Full Stack zvuči jako lepo u teoriji, ali u praksi su ljudi (sa pravom) veoma sumnjičavi prema svakome ko se deklariše kao da ume da radi sve i svašta. Povrh svega, sa takvim ljudima nikada nisi siguran šta znaju a šta ne, a postoji i dodatan rizik da će biti dignutog nosa ili toksični za tim. Iz ovog razloga, batalio sam gledanje Full Stack oglasa delovali su mi seniorski i nedostižno. Backend oglasi su mi takođe delovali zastrašujuće (svima nam poznati “treba nam junior sa 30 godina iskustva” problem), i imao dovoljno kumulativnog specijalizovanog iskustva samo u Frontendu, tako da sam posmatrao samo te oglase na Startitu. Ovaj način razmišljanja je pogrešan, i to ću shvatiti tek kasnije kada je naišao oglas za Junior Full Stack poziciju, nešto što po svom nazivu deluje kao oksimoron. Javio sam se, i posle nekoliko krugova intervjua bio sam siguran da tu želim da radim. Prosto nešto što osetiš u razgovoru sa budućim kolegama.

Trenutno sam zaposlen u Catena Media na poziciji Junior Full Stack Developer, i opet me je zadesio “Da mi je neko pre mesec dana rekao…” momenat. Sačekalo me je tačno ono što sam želeo da vidim, pa i više od toga. Cenimo čist kod, TDD, BEM, imamo fenomenalan QA, proizvod je daleko kompleksniji i veći nego što sam očekivao, a ja sam se nenadano našao u zadatku koji sam priželjkivao, u timu koji radi na restruktuiranju arhitekture API-ja.

Naša profesija se zasniva na neprekidnom učenju, te većinu stvari koje sam u ovom tekstu napisao a koje se tiču rada u timu i odnosa sa kolegama, sam primenjivao i ranije, ali razumeo tek skoro, radom u svom novom timu u Cateni.

Zaključak

Drug, senior Full Stack mi je pre par meseci rekao da nikada više ne želi da radi u startapu, jer oni nikad ne znaju šta rade, ali i da ne želi da radi u firmi koja ima proizvod stariji od godinu dana, jer to znači da radiš sa starim tehnologijama. Meni moje iskustvo govori da je to daleko od istine. Gde god da radiš imaćeš priliku da se unapređuješ i da radiš na novim tehnologijama i mogućnostima. Ta prilika zavisi od tvog entuzijazma, sposobnosti komunikacije i volje tima i kompanije da te sasluša i razume poteincijal. U obe firme koje sam u današnjoj priči naveo sam imao priliku i resurse da učim i predlažem nove pristupe, te priliku da me kolege saslušaju i konsultuju, pa makar im izneo loš plan.

Hvala vam kolege. Da nije bilo vas, “ne bi ovo slatko danas bilo na mom stolu.”