Programozó szeretnék lenni, menjek-e egyetemre?

Ez a poszt, a címéből is következik, egy könnyedebb témával foglalkozik. Manapság különböző fórumokon jön elő a kérdés, hogy érdemes-e egyetemre mennie annak, aki programozó szeretne lenni. Most itt próbálom részletesen összefoglalni, hogy később tudjak hivatkozni rá.

Hasonló cikkeim a Miért ne fejlesszünk saját keretrendszert?, Ki is az a Java architect? vagy a Java források tanuláshoz.

Következő posztomban a manapság egyre jobban terjedő fejlesztőképzésről fogok írni.

Disclaimer: Mivel a Debreceni Egyetemen végeztem 2001-ben, főleg erről van tapasztalatom. Azóta Java fejlesztőként, architektként dolgoztam, és rengeteg embert, köztük végzős egyetemistát is interjúztattam, és rengeteget oktattam. Jelenleg a junior fejlesztőképzéssel foglalkozó Yellowroad egyik mentora vagyok. Az itt közölt poszt csak a saját személyes véleményemet tükrözi. Fenntartom a jogot, hogy a posztot folyamatosan bővítgessem, javítgassam.

Most végeztél szakközépiskolában vagy gimnáziumban, programozó akarsz lenni, és az érdekel, javaslom-e, hogy egyetemre menj?

A rövid válasz az, hogy igen. Ki is fejtsem? Az egyetem olyan élményeket ad, melyeket későbbi életed során bőségesen tudsz kamatoztatni. Tehát ad az egyetem annyi szakmai tudást, amellyel el lehet helyezkedni, és be tudsz állni a napi munkába? A válaszom erre sajnos az, hogy nem. Akkor miért is érdemes oda járni?

Az egyetem megtanít tanulni. Ez a szakmai életfogytig való tanulás. Sajnos gyakran látom, hogy sokan nem képesek az új tudást megérteni, feldolgozni, napi munkájuk során hasznosítani. Ráadásul az új tudás különböző forrásokból jöhet, frontális előadásból, száraz szakmai cikkekből, rövid, az Interneten talált, egymásnak ellentmondó, szakmailag megkérdőjelezhető forrásokból, valamint manapság videós anyagokból. Az egyetemen megtanulod a különböző forrásokat megfelelően használni, kiszűrni a lényeget, beépíteni. Valamint segítséggel előbb-utóbb rájössz, hogy mi alapján tudod eldönteni, hogy az adott forrás számodra megfelelő-e, kellő mélységű, és szakmailag helyes-e. Igen, az emberek különbözőféleképpen tanulnak. Vannak, akiknek az írott szó segít, és addig nem tudnak tovább haladni, míg alaposan meg nem értik. Van, akik gyakorlat során sajátítják el a tudást. Mások nagyon vizuálisak. Sokan a jelenlegi oktatási rendszer által preferált és belénk nevelt frontális oktatást tartják csak hatékonynak. Ez így van, azonban az élet nem mindig úgy oktat, ahogy neked a legmegfelelőbb, és az egyetem során mindegyik módszertan szerinti tanulást gyakorolnod kell. És ne is beszéljünk arról, hogy a különböző oktatók különböző oktatási módszereket alkalmaznak, melyekhez idomulnod kell. Az egyetem során megismerheted magad, és rájöhetsz, hogy számodra melyik a legmegfelelőbb módszer, és hogyan tudod a legkevesebb időből a legtöbbet kihozni.

Az egyetemen megtanulsz jegyzetelni. Gyakran látom, hogy az emberek nem jegyzetelnek, sőt, a kézzel írást már konkrétan szándékosan mellőzik, telefonnal, tablettel, notebookkal készítenek feljegyzéseket. Rosszabb esetben, abban bíznak, hogy mindent megjegyeznek (, ez általában oda vezet, hogy nem készül el valami határidőre, vagy hiányos). A kézi jegyzetelés szerintem elengedhetetlen, és nem csak a kézírás fontossága miatt. Sokan arra hivatkoznak, hogy kézzel lassabban írnak. Meg vagyok győződve arról, hogy a papíron való jegyzetelés kis energiabefektetéssel sokkal hatékonyabb tud lenni. Egy kézzel készített jegyzet rengeteg plusz metainformációt is hordoz, melyet az előbb említett eszközökön nehezebb/lassabb használni. Gondolok itt arra, hogy a különböző szövegek mérete, egymáshoz való helyzete, nyilak, apró ábrák, netalántán színek sokat segíthetnek. Ha később mégis digitalizálni kell, akkor még egyszer átgondolom, strukturálom. (Ha eldobható, csak lefényképezem.) Sőt ez később abban is segít, ha a gondolataidat szeretnéd a többiekkel megosztani, azt akár egy papír felett, vagy egy táblánál rajzolva, sokkal hatékonyabban átadhatod. (Erre különböző technikák vannak, hogyan tudj akár rajzkészség nélkül is ízléses, informatív ábrákat készíteni, melyek nagyon hasznosak akár prezentációk, akár oktatás során.)

De ezek csak apróságok. Az egyetemet meg kell tanulnod kihasználni. Olyanokra nyílik alkalmad, melyekre az élet során talán soha többet. Ismerkedj meg minél több emberrel, alakítsd ki, bővítsd a kapcsolati hálód, később sosem tudsz ilyen könnyedén ennyi hasonló érdeklődési körű emberrel megismerkedni. Járj el belső előadásokra, szakkörökre, meetupokra, konferenciákra, programozási versenyekre, TDK-ra, cégek által szervezett rendezvényekre, állásbörzékre, legyél szakkollégiumi tag. Adj elő! A prezentációs készség nem csak akkor fontos, ha előadó, tanár akarsz lenni. Szinte naponta alkalmazhatod a tapasztalatodat standup meetingek, brainstormingok, meetingek, stb. közben. Tudd, ki miben a legjobb, milyen kérdéssel kihez lehet fordulni. Lehetőleg legyél kollégista, hogy közel legyél a tűzhöz. Vagy tarts nagyon szoros kapcsolatot, ne szigetelődj el egy albérletben.

Menj ki ösztöndíjjal külföldre! Ha adódik lehetőséget, egy félévre, évre. De ha csak nyáron mész ki, már azzal is jól jársz. Tanulj nyelvet. Angol nélkül ezt a szakmát nem lehet művelni.

Természetesen ne csak a szakmai életedre koncentrálj. Járj bulizni, járj el kirándulásokra, vegyél részt a közösségi életben. (Legjobb túráim közé tartozik, mikor geológusokkal és biológusokkal, sőt bölcsészekkel mentem el túrázni.) Bár még nem tudod mekkora érték ez, de diákigazolvánnyal és idővel rendelkezel. Sportolj, amennyit bírsz. Később már az problémát fog okozni, hogy összeszedj egy focicsapatra való embert, vagy időt szakíts arra, hogy rendszeresen eljárj. Az, hogy az egyetemi klubban megtanulsz tűrhető szinten pingpongozni, csocsózni, később nagyban meg fogja könnyíteni a beilleszkedésed bármilyen céghez. Legyen hobbid, biztos találsz hozzá társakat - igen, a legextrémebbhez is. Segíts másoknak. Olvass, ne csak szakmai tartalmat.

Legyen hobbi projekted, amiben kiélheted a szakmaiságod. Bármi. Ha másodikos korodra nem tudsz ilyent kitalálni, gondolkodj el rajta, hogy ez a szakma neked való-e. Találkoztam olyannal, aki ugyan értett a programozáshoz, ismerte a programnyelvet, de nem volt semmi, amit be tudott volna mutatni, amire büszke lett volna. Nem tudott egy új projektet nulláról létrehozni a fejlesztőeszközben. El nem tudta képzelni, hogy kéne egy felhasználói felületet összerakni. Akkor jársz jó úton, ha annyi van, hogy nem tudod őket megvalósítani. Nem baj, ez ne feszélyezzen. Próbálgass, gyakorolj, folyamatosan tökéletesítgess. Próbálj meg másokat is bevonni, közösen együtt dolgozni. Kövesd a híreket, vegyél részt open source projekt fejlesztésében, olvass szakmai könyveket (a cikk végén ajánlok párat), hallgass podcastokat. Szerencsés esetben ezeket még az órákon is hasznosítani vagy elszámolni tudod.

Tudsz-e gyakorlati tudást szerezni az egyetemen? Persze! Keress olyan oktatókat, olyan közösségeket, melyek kapcsolatban vannak cégekkel, szervezetekkel, esetleg konkrét projekteken dolgoznak. Jelenleg annyira erős a munkaerőhiány, hogy a cégek nem tudnak az utcáról, vagy a végzősek közül elegendő embert felvenni, ezért egyre inkább az egyetemek felé (sőt, több nagyobb cég már a középiskolák felé is) nyit. Így akár jövedelemre is tehetsz szert. Én az utolsó két évemben már folyamatosan egy cégnek dolgoztam, és ahogy a diplomám megkaptam, azonnal náluk folytathattam a munkát, anélkül, hogy egy percet is keresgélnem kellett volna.

Fogsz-e olyan minőségű és mennyiségű szakmai képzést kapni, amiért megéri oda járni? Nem, nem kapsz. Sajnos az egyetemen sok olyan dolgot tanítanak, ami teljesen felesleges a való életben, és nagyon sok dolgot nem tanítanak, melyre viszont nagyon nagy szükséged lenne. Neked kell kiválogatnod, hogy mire van szükséged, mi az amit később is hasznosítani tudsz. Kérj segítséget, a felsősök, valamint már az iparban dolgozó haverjaid is segíteni fognak, hogy mire figyelj oda. A poszt végén megemlítek néhány dolgot, melyet hasznosnak találtam. Sőt megemlítek pár dolgot, amivel nem fogsz kellő szinten, megfelelő mélységben találkozni, vagy túl elméleti, de nagy szükséged lesz rá a későbbiekben. Ami iránt érdemes magad utánanézned, fejlődnöd. Vagy ha mégis van, nagyon odafigyelned.

Sokan úgy gondolják, hogy az elméleti képzésre nincs szükség, elegendő a gyakorlati tapasztalat. Ezzel nem tudok azonosulni. Ahhoz, hogy jól tudj programozni, igen is ismerned kell a programozási nyelv lehetőségeit, sőt azt is, hogy miért így alakították ki azt. Látnod kell más, alternatív lehetőségeket is. Egy szakmai meetingen nagyon idegesítő tud lenni, ha valaki össze-vissza használja a fogalmakat, ugyanarra a dologra több különböző értelmű szót használ, pongyola. Valamint előbb-utóbb te is leszel senor, aki junior programozókat fog tanítani, és akkor nem mindegy, hogy milyen alapokkal rendelkezel. Hidd el, ők igazán tudnak zavarba ejtő kérdéseket feltenni.

Hol fogsz kellő mennyiségű és minőségű gyakorlati tapasztalatot összegyűjteni? Ha szerencséd van, a munkád során. Vezető és senior fejlesztőktől. A megnézett videókból, vagy az online kurzusokból, manapság oly divatos MOOC-kból. Ha a cégednek fontos vagy, elküld továbbképzésekre, konferenciákra. Itthon és külföldön. Ezt ne várd a hagyományos egyetemi kurzusoktól.

Ezt tudva megéri-e ennyi időt rászánni az életedből? Gyakori, hogy azzal érvelnek, hogy rengeteget keresnél ennyi idő alatt, ahelyett hogy az iskolapadban ülsz. Valamint a diplomások és nem diplomások közötti keresetkülönbség minimális a szakmában, amit egyetemen elvesztegettél, kb. nyugdíjas korodra egyenlítődik ki.

Rá fogsz jönni, hogy a pénz nem minden. Programozóként előreláthatóan sosem fogsz szűkölködni, magasan az átlag felett fogsz keresni, amit kívánsz, elérheted. Azokat az élményeket, amiket kihagysz, viszont nem lehet megvásárolni. Azt hiszed, elvesztegetsz öt évet az életedből? Ha nem próbálod ki, akkor a fiatalságodból dobtál el ugyanennyit.

Lehet az egyetemet rosszul csinálni? Igen, nagyon könnyen! Mind a két véglet hibás. Ha ellinkeskeded, épp csak átmész a vizsgákon, nem jársz be órákra, egész nap a gép előtt ülsz, vagy folyamatosan bulizol, akkor tényleg elvesztegetett idő. Ha kedden mész, és csütörtökön hazautazol, úgy nincs értelme. Kitűnő vagy végig, csak a kollégiumi szobában vagy az albérletben tanulsz, csak órákra jársz? Kihagysz minden szociális alkalmat, vizsgaidőszakban hazautazol, és otthon hozzád sem lehet szólni? Rosszul csinálod. Senki nem kérdezi, milyen lett a diplomád, melyik tárgyból milyen jegyet szereztél. Tanulj a fontos vizsgákra, de ott is csak azokat a részeket, melyekre később szükséged lehet. Értsd meg őket, tudd alkalmazni. Tételeket, bizonyításokat, biflázz be. Előbb utóbb minden tantárgy eljut arra a szintre, hogy túl elméleti, már nem érdemes bele túl sok energiát tölteni. Vannak tölteléktárgyak? Csússz át. És hidd el, a tanárok úgy is meg lesznek veled elégedve. Ha látják, hogy képes vagy megtanulni azt, amiben komolyan hiszel, amire energiát fordítasz. Ha tudsz józanul válogatni. Ha meg tudod találni az arany középutat. Használd ki a kreditrendszer adta előnyöket, ezért találták ki.

Mindenkinek jó az egyetem? Nem, de bármikor abba tudod hagyni. Egy próbát megér. Mindenki alkalmas erre a szakmára? Nem. Légy reális, figyeld önmagad, figyelj a visszajelzésekre. Vagy jól, vagy sehogy.

Így csináltam? Nem mindent. De örültem volna, ha valaki elmondja. Én ezt fogom mondani a fiamnak is.

Ahogy ígértem, hadd említsek meg pár dolgot, amire mindenképp érdemes odafigyelned (ezek lehet, hogy az én időm óta névben változtak): matematikai alapok, valószínűségszámítás, kombinatorika, geometria. Nem, természetesen nem fog olyan mélységben kelleni, mint ahogy tanítják. Számomra a leghasznosabb az adatszerkezetek és algoritmusok, programozás. Igen, azon programozási nyelvek megismerése is, amelyeket aztán sosem használtam. Amire később jöttem rá, hogy mennyire hasznos lett volna, ha odafigyelek, a fordítóprogramok és automaták. Sokáig nem volt olyan év, hogy ne vettem volna elő a mesterséges intelligencia jegyzetemet (állapottér reprezentáció, kereső algoritmusok). Számítógépes grafika, mely segített egy csomó módszerrel, hogy az analóg és a digitális világ közötti szakadékot megértsem, és át tudjam hidalni. Hálózatok (OSI-modell, Ethernet, TCP/IP). Adatbázisok, ne hidd, hogy nem fogsz kapcsolatba kerülni vele, és megúszod az SQL nyelvet. Operációs rendszerek. Logika és számításelmélet (Turing-gépek, P, NP osztályok, NP-teljesség). A funkcionális programozás egyre nagyobb szerepet kap. Webes alkalmazások. Elosztott rendszerek.

Álljanak itt azok, melyeket tapasztalatom alapján nem sikerül az egyetemen kellő mértékben elsajátítani. Mivel én Javaban dolgozom, főleg ilyen eszközöket fogok felsorolni, de más platformon is megvan ezeknek a párja. Iparban használatos eszközök, mint build rendszerek (Maven, Gradle), Continuous Integration, Continuous Delivery. Fejlesztőeszközök mélyebb szintű ismerete (Eclipse, NetBeans, IntelliJ IDEA). Magasabb szintű nagyvállalati technológiák, mint Java EE, Spring Framework, Spring Boot. Az ezek mögött húzódó elméleti háttér, mint dependency injection, vagy inversion of control. Verziókezelő mélyebb szintű használata (Git, GitLab). Teszt vezérelt fejlesztés, tesztelési technikák, automatizált unit tesztelés, mockolás (JUnit, Mockito). Performancia hangolás. Tervezési minták, refactoring, Clean Code, Effective Java. Olyan nagyon gyakorlati ismeretek, mint dátum kezelés (időzónák), fájl írás-/olvasás, XML, JSON állományok kezelése, naplózás, audit naplózás. ORM eszközök. Webes technológiák, webes architektúrák (http, http(s), HTML, CSS, JavaScript), alkalmazás architektúrák, modularizáció. Middleware-ek. Webszolgáltatások, manapság már RESTful API-k. Webes biztonság. Többszálú alkalmazásfejlesztés.

És akkor pár könyv, amit mindenképp érdemes elolvasnod, még munkába állás előtt:

  • Test Driven: TDD and Acceptance TDD for Java Developers - Lasse Koskela
  • Design Patterns: Elements of Reusable Object-Oriented Software - Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides
  • Head First Design Patterns - Bert Bates, Kathy Sierra, Eric Freeman, Elisabeth Robson
  • Refactoring: Improving the Design of Existing Code - Martin Fowler
  • Clean Code: A Handbook of Agile Software Craftsmanship - Robert C. Martin
  • The Clean Coder: A Code of Conduct for Professional Programmers - Robert C. Martin
  • Effective Java - Joshua Bloch
  • UML Distilled - Martin Fowler, Kendall Scott
  • Working Effectively with Legacy Code - Michael Feathers
  • Code Complete: A Practical Handbook of Software Construction - Steve McConnell
  • The Pragmatic Programmer: From Journeyman to Master - Andrew Hunt, David Thomas