Egy nap a munkahelyen – egy Junior fejlesztő szemszögéből

By 2015.05.28featured, Story

Reggel 8:15, csörög az ébresztőm. Három hónap után már-már lassan vekker nélkül is felkelek ilyenkor – az öt év egyetem után furcsa dolog újra kimondani, hogy egyáltalán létezik bioritmusom :) Összekészülök, és indulok a “Munkába”.
9:00 beérek az irodába. Ha nagyon akarnék, jöhetnék 10:00 órára is, de szeretek beérni olyankor, amikor kicsit csend van még, és nem érkezett meg mindenki. A mai napi teendőimen elmélkedem, mikor belépek az ajtón.

IrodaAz irodában open office jelleggel egy nagy közös teremben, széles, hosszú asztalok mentén ülök le – oda, ahol éppen a csapat ül. Érdekes, de nincs konkrét helyem. Azért a gyakorlatban természetesen már kinézte mindenki magának a kedvenc monitorját, de projektenként változik, ki mikor melyik csapatban van benne.

Én is ledobom magam az egyik székbe. Gyorsan összedugdosom a céges laptopot, monitor bekapcsol,  gép felizzik, hálózat csatlakozva: “Bent vagyok”   :)

Ekkor eszembe jut, hogy egy igen fontos rituáléját a napnak kihagytam. Gyorsan orvosolandó, fel is állok, és mielőtt belevágnék teendőimbe, kisétálok a konyhába.

Ott éppen Vilmos és Feri beszélgetnek kávézás közben. Mikor belépek, egyből utat nyitnak a kávégépig “- Jóreggeltkávé? Jóreggeltkávé.” Miközben a gyümölcsöstálból egy szem epret elmajszolok, beszélgetünk kicsit a csütörtöki sörözésről.

De nincs idő lazsálni, a gőzölgő itallal átsétálok vissza a gépemhez, és nekilátok a mai munkának.

A rövid hírolvasás után az első dolgom, hogy felnézek a Redmine-ra (közös projektmenedzsment eszközünk), hogy megnézzem, az aktuális projekt hogy áll. Mivel most agilis módszertanban dolgozunk, így kéthetes Sprintekre felosztott projektünkben tisztán látszik, hogy az aktuális szakasz végéig még meddig kell eljutnunk. A hátralévő alfeladatokat ticketek formájában vezetjük: egy-egy ticket egy jól megfogható, egységnyi feladat, amely tipikusan egy új funkciót, konkrét bug javítását, stb. valósítja meg. Mivel ebből sorakozik még jó pár, így kiválasztok egyet, és bejelölöm, hogy mostantól ezen én dolgozom.

Táblák, ticketekMajd még mindig kávéval a kezemben átsétálok a Kanban táblánkhoz, amit már láthattatok a korábbi bejegyzésekben. A Sprint Backlog részből a ticket fizikai megfelelőjét áthelyezem a saját “In progress” mezőmbe. Így az egész csapat, amint belép az ajtón, láthatja, hogy hogy áll a projekt, ki min dolgozik. De ez csak a mi megoldásunk, ahány ház, annyi szokás.

Visszafelé a kapott feladaton morfondírozok. Egy olyan osztályt kell megírnom, ami ellenőrzi, hogy kölönböző beviteli mezők megfelelnek-e az adott kritériumoknak regisztrálásnál. Egyik mezőnek email-címnek kell lennie, két jelszó mezőnek egyeznie kell egymással, illetve a felhasználónévnek egyedinek kell lennie az egész adatbázisban. Annyira nem hangzik vészesen, bár az adatbázishoz való hozzáférést még át kell ismételnem, mert azt nem én csináltam – ettől függetlenül úgy érzem világos a feladatom, legalábbis egy ideig.

A nagybetűs KÓD-on való közös munkát a már megismert Git segítségével végezzük. Szépen be is pötyögöm a saját munka könyvtáramban a konzolba: $git checkout develop. Ezzel átváltottam a develop branchre, majd : $git pull origin develop, hogy a közös repository-nk jelenlegi állapota átmásolódjon a gépemre is. A feladathoz új branchet hozok létre: $git checkout -b features/input_field_validators és indulhat a móka!

A fejlesztéshez egy ideig Eclipse-t használtam, de a többiek tanácsára kipróbáltam az InteliJ IDEA-t, és a tapasztalatok alapján átváltottam rá. Számomra sokkal letisztultabb, jobb funkcionalitású, és bugmentesebbnek bizonyult.

Elszüttyögök az osztály létrehozásával. Mikor kitaláltam, hogy pontosan hova, és milyen módon fogom beilleszteni a programstruktúrába, elkészítem hozzá egyből a tesztelő osztályt is. Mivel TDD-ben fejlesztünk, így gyorsan meg is írom az első pár tesztet. Az egyik során például egy tetszőleges mezőbe beírok egy rosszul formázott email címet – A JUnit teszt elvárja, hogy az osztályom még nem létező metódusa térjen vissza hamis értékkel kiértékeléskor. Látva, hogy a tesztelés során milyen funkcionalitást is kell, hogy megvalósítson a leendő osztály, könnyedén írom meg a konkrét metódusait.

Elbabrálok a programmal körülbelül 10:45-ig. Ekkor csipog a Calendar: itt a napi Scrum Stand-Up ideje :) A srácok ekkorra már mind megérkeztek, együtt álljuk körbe a táblát. Mindenki elmeséli, hogy a tegnapi stand up óta mit csinált, mire jutott, van-e bármi, ami miatt nem tud haladni. A 7 fős csapat 10 perc alatt végez az állva tartott meetingen.

Nade miért pont 10:45-kor tartjuk a meetinget? Mivel körben a többi cégnél délben kezdődik az ebédidő, mi szeretünk egy órával korábban lemenni ebédelni, elkerülve a tömeget :) A stand up után szedelőzködünk, sétálunk lefelé. Az irodából többen csapódnak hozzánk, az egyik szokásos kifőzdénkbe megyünk át.

Ebédidő alatt a munkán kívül sokmindenről beszélgetünk :) A csapat hozzám hasonló junior tagjai mind egyetemisták, de a “régi motorosokkal” is megtaláljuk a közös hangot. Ebéd után a kajakómára még megiszunk egy kávét, majd tovább folyik a munka.

Sajnos elérkezik az a pont, amikor nem tudok tovább haladni: elképzelésem sincs, hogy az adatbázisban való ellenőrzést hogyan kellene megoldani. Szerencsére semmi gond, Gyuri, a csapat “fiatal tapasztaltja” pont itt ül velem szemben az asztalnál. Óvatosan ráírok chaten, hogy zavarhatnám-e egy picit, ő készségesen egyből átsétál a gépemhez, és megkérdezi hogy na, mi is a gond.

Miután “kisírtam” magam neki, gyorsan megmutatja, hogy mely DAO-kat kell meghívni. Ő implementálta a keresést is a regisztrált felhasználónevek között, szóval csak fel kell használnom a függvényeit – óh így már igazán könnyű! Megköszönöm a segítséget, és folytatom a munkát. Az ilyen jellegű “légyszi segíts már kicsit” kérdések folyamatosak a csapaton belül, egy percre sem ül tökéletes csend az irodára. Egyszer az kérdez valamit, aki teszteli a kódot, máskor pedig rövid tervezésről szól a diskurálás. Néha-néha egy-egy poén is eldördül, jó hangulatban telik a munka. Az ökölszabály a következő: ha elakadsz, próbáld meg alaposan körüljárni a problémát, de ha sokáig húzod az idődet vele, kérj segítséget.

Időközben végeztem az implementálással. Végre! A tesztek mind zöldek. Itt az ideje leforgatni a projektet! Ennek kezelését a Maven segítségével csináljuk, a blog korábbi posztjaiból kikövetkeztethetően :) $mvn clean install, minden modul SUCCESS, remek! Fel is pusholhatom a kódot.

Visszaváltok a git-ben a develop branchre, gyorsan lehúzom az idő közben eltelt változásokat, majd $git merge parancs segítségével ráillesztem a saját munkámat az aktuális ágra. Nincs ütközés, minden remek: itt az ideje feltölteni a közös repositoryba. $git push origin develop.

Elégedetten dőlök hátra a székemben: még csak délután egy óra van, de már végeztem a ticketemmel, tudok csinálni másikat. Miközben a lehetséges új feladatokat bújom, emailem érkezik a Jenkinstől.

Hoppá. A Jenkins egy felügyeleti eszköz (erről bővebben a 14 hetesben olvashatsz ;-) ): közös reponkat figyeli, és folyamatosan újrafordítja a kódot, nézve annak helyességét. Mikor legutoljára feltöltöttem a kódot, elkezdte lefordítani a legfrissebb verziót, és hibát talált. Minden átvált pirosra, bekapcsolnak a jelzőfények, az egész csapat kapja az emailt: “törve lett” a build.

Ilyenkor az a policy, hogy minden mást abbahagyok, és lehetőleg 10 perc alatt kijavítom a hibát: ha nem megy, akkor az egész csapat beáll segíteni, és az azért tud pár morcos tekintetet szülni :) A hibaüzenetből látom, hogy a Jenkins egyik integrációs tesztje nem futott le.

Hát persze! A saját adatbázisomat használtam fel a felhasználók kikeresésére, és így írtam meg a tesztet egy konkrét példára. Azonban ez nem szerepel a közös adatbázisban! Gyorsan javítom a megfelelő fájlokat, hogy oda is belekerüljenek. Gyorsan újra feltöltöm a projektet, most már kézzel indítom el a Jenkins tesztjét: mindenki megnyugodhat, a projekt “kizöldült”!

A nagy ijedségre iszok egy teát a konyhában.

Péter, akivel egy másik projekten dolgozom, szintén kint ül épp. “De jó hogy jössz! Le kellene ülnünk egy meetingre a másik projekttel kapcsolatban”. Az időzítés kiváló, egy fél almával a kezemben sétálunk át a tárgyalóba.

Sprint planning meetingA meetingen egy másik megrendelés kapcsán éppen tervezési fázisban vagyunk. Péter vázolja az általa elképzelt adatbázis szerkezetet. Közben kérdezünk, illetve élőben adjuk a tanácsokat a módosításokhoz. Jellemzően fontos, hogy értsem a program struktúráját, hiszen lehet, hogy valamelyik ticket kapcsán pont ezzel kell majd foglalkoznom. A gyűlés gyors, és folyamatosan dolgozunk, együtt ötletelünk a kialakításon.

Amint az adatbázisról alkotott elképzeléseink megfelelő mértékben korrelálnak egymáshoz, áttérünk a Sprint plannigre.

Teljesen megszokott dolog, hogy egyszerre több feladaton is dolgozunk. Természetesen ez azt jelenti, hogy megfelelő módon kell gazdálkodni az időnkkel; ezt pont az ilyen Sprint planningeken szoktuk beosztani. Ezen gyűlés célja, hogy megnézzük, milyen nagyobb milestone következik a projekt életében, a következő 1-2-3 hétben mivel kell elkészülnünk. Ha ez világos, akkor az addig elvégzendő részfeladatokról beszélgetünk kicsit, igény szerint módosítjuk (ezekkel már előre készül a projektmenedzser), de első sorban mindegyikre tippelünk egyet, hogy mennyire nehéz 1-10 között megvalósítani, mennyi időt fog elvenni. Ezek alapján kapunk egy összsúlyt, ami egy jó viszonyítási szám. Ha nagyságrendekben eltér az előző sprint összsúlyától, akkor jó eséllyel közeledik egy újabb demo előtti éjszaka :P

A meetingen száll az idő. Nem csak megfigyelő szerepben ücsörgök, aktívan ki van kérve a véleményem, a kérdéseimet örömmel fogadják. A gyűlés végeztével visszasétálok a helyemre. Átgondolom, hogy a vállalt feladat fényében kb. mikor, és mennyit kellene dolgoznom ahhoz, hogy teljesíteni tudjuk a határidőt. Ezt tipikusan tanulás során nem szoktam így csinálni, pedig kellene :) Sokkal kényelmesebb két héttel korábban átlátni, hogy mi a feladat, mint hogy 2 nappal a demo előtt realizáljuk, nem kakaós az a palacsinta. :P

DolgozikA délután további része nyugiban telik. Az egyik bug-ticketet gyorsan megoldottam (a regisztráláskor a születési dátum naptár angolul jelenik meg) majd egy másik egyszerűbb tickettel foglalatoskodok. (felhasználó adatok módosítása oldal – ezt a regisztráció alapján könnyű lesz.)

Nem tudom tovább halogatni, mivel új oldalt kell létrehoznom, az éppen aktuális UI generáló technológiát is meg kell ismernem: eddig mással foglalkoztam. Ez most nálunk az apache-wicket: egy olyan web-app framework, aminek a segítségével dinamikusan tudunk weboldalakat generálni Java-ban. “A munkaköri leírás része”, hogy ilyenkor a neten kutatva dolgozom fel a technológiát, a többiek által megírt kódot példaként figyelve tanulom el annak használatát, és ha elakadok, akkor mindig van épp egy kolléga aki szívesen segít nekem.

Este 17:00. Lejár a munkaidő, de én nem veszem észre: éppen azzal a fránya adatmódosítással szöszmötölök még mindig. Zsófi szólít meg, a flow-ból hirtelen kiemelkedve nézek rá: azt kérdezi, hogy jövök-e az esti oktatásra.

Munkaidő után gyakran szoktunk közös programokat szervezni. Fontos, hogy csapatként működjünk, és úgy is érezzük magunkat. Gyakran járunk el közös csapatépülésekre, sörözni, grillezni, stb. Most éppen Tamás fog tartani egy “szabadon választható” adatbázis hangolás tréninget az érdeklődőknek.

Naná, hogy érdekel, hiszen kíváncsi vagyok az adatbázis adminisztrátori feladatokra is. Elmentem a munkámat mára: feltöltöm a közös repository-ba az aktuális branch-et (git push origin features/input_field_validators).

Átbattyogok az oktatótermünkbe. A többiek már csak rám várnak: ráhangolódásképp rendelünk pizzát. Az oktatás alatt főleg lassú, nehézkesen működős adatbázisokról esik szó, és hogy mik azok a tipikus hibák, amik ezt okozzák. Látjuk, hogy hogyan lehet okos trükkökkel, beállításokkal nagyságrendekkel gyorsabb lekérdezéseket varázsolni; kis betekintést ad az adatbázis adminisztrátorok életének eme szegletébe az előadás.

A nap végén kellemes érzéssel zárom le a gépemet: ma is hasznosan töltöttem a napomat. Aki érzett már ilyet, az tudja miről beszélek: nem csak hogy megdolgoztam a betevő falatért, de hasznos új ismeretekkel gyarapodott a tudásom is. Minden nap külön kihívás, és sosem tudhatja az ember (legalábbis nálunk) hogy holnap milyen új feladatok elé fog nézni.

Nos így néz ki egy áltagos, mozgalmas nap, amit munkával töltök. Általában egy héten három napot szoktam dolgozni, attól függ, mikor hogyan állok az egyetemmel. Fel voltam rá készülve lelkileg, hogy előre meg fogom majd kapni a beosztásomat, de ez nem így alakult. Én mondhatom meg, hogy mely napokon szeretnék bemenni, de nem is a bent töltött idő az igazán fontos, hanem a vállalások tejesítése. Amikor sok a számonkérés, előre szólok, hogy tudja a csapat, most nem támaszkodhatnak rám. Amikor azonban nincs más dolgom, tudok akár többet is dolgozni, pótolandó a hiányzást :) Ha van mozgásterem, próbálom összehangolni a csapattal az időbeosztásomat. Külön meglepett, hogy akármikor a tanulást említem, hogy miért kell például korábban elmennem, abszolút támogatnak, és örülnek neki hogy az egyetemmel is aktívan foglalkozok. Ez igazából természetes, hiszen a cégen belüli munkámon is kamatoztatom a megszerzett tudást, gazdagítom a cég szellemi tőkéjét :)

Összességében elmondhatom, hogy nagyon pozitívan csalódtam a munka világában.

Természetesen csak egy kis szeletét ismerem még ennek a környezetnek, és egy kifejezetten dinamikus, modern és bár nem multi, de komoly cégnél. Az előítéleteim jó részét az egyetemen látott, és a többi szakmáról hallott dolgokra alapoztam; úgy gondolom hogy nagyon változatos a különböző munkahelyek egyéni világa, sok múlik azon, hogy az ember hol is kezd. Azt hiszem, hogy a mi igen csak fiatal szakmánk már csak ezért is különleges, mert a fejlesztői munka alkotói, problémamegoldói feladat, kutatással, folyamatos tanulással fűszerezve; ennek megfelelően próbáltam olyan helyre menni, ahol nem “veszik el” az ember a multi hatalmas, de lassan őrlő malmai között, de azért nem is kell a startupok számomra nem túl szimpatikus világában helytállni. Nagyon örülök neki, hogy ezt választottam :)