Hogyan legyél programozóként is profi?

Rendszeresen hangoztatom különböző oldalaimon, hogy elég, ha csak addig eljutsz, hogy felvegyenek programozónak, és a cégnél értékes munkát tudj végezni, utána már megy minden, mint a karikacsapás.

De tulajdonképpen hogy is van ez miután felvettek?

Nagyobb vagy tőkeerősebb cégek esetében a felvett junior programozó először a cég belső tanfolyamán találja magát, ahol egyrészt egy közös szintre hozzák az újakat, illetve meg is ismertetik őket a vállalat sajátosságaival (pl. konkrét eset, hogy ha egy csomagküldő szolgáltató informatikai részlegére mész dolgozni, akkor a csomag kézbesítésekor használatos kis terminálról is oktatnak), a cégen belüli folyamatokkal. Felkészülhetsz arra, hogy ilyen esetben 1-2 hónapig, vagy akár 3-4-ig is a cég azért fizet, hogy tanuljál. Nem meglepő ebben az esetben – végtére is az oktatás egy elég drága és értékes mulatság – tanulmányi szerződést kötnek veled. Az oktatásodért cserébe elvárnak 1-2 év szerződést, amikor te nem mehetsz el, csak ők tehetnek ki. Ez teljesen normális. Ha már kiképeznek, legyen meg a hasznuk.

Kisebb cégek a felvétel utáni képzést általában nem engedhetik meg maguknak, már csak azért sem, mert egyszerre nem vesznek fel annyi embert, hogy a külön oktató megfizetése megérné. Ilyen esetben általában egy rövidebb és kevésbé formális betanulás után jöhet az éles munka – és az aközbeni tanulás. (Attól még, hogy nincs formális oktatás, nem kell leírni egy céget: sokszor érdekesebb munkák vannak, a fejlesztési ciklus hamarabbi szakaszába kapcsolódhatsz bele, így igazán sajátodnak érezheted azt a projektet, amin dolgozni fogsz. Ráadásul könnyebben meg lehet beszélni és oldani helyzeteket, ha a “nagyfőnök” szinte folyamatosan az üzletmenet része).

Ha olyan cégnél találod magad, ahol nincs formális képzés (amire várhatóan on-the-job betanulásként hivatkoznak), akkor kapsz egy feladatot, és oldd meg, és közben rájössz a mikéntjére.

Hogy mindezt hogyan?

  • Ha a mi tanítványunk voltál, akkor átnézel egy-két kapcsolódó anyagrészt, hátha találkozol legalább koncepcionálisan hasonló részekkel, amit át tudsz vinni az új feladatra
  • Elkezdesz neten utánanézni a dolognak, ami persze azért több idő, mert kezdőként nem biztos, hogy el tudod dönteni, mi való neked, és mi lesz mélyvíz.
  • Tutorialokat nézegetsz (ez szintén időigényes)
  • Befizetsz egy tanfolyamra te magad (ha kellően proaktív vagy, ki tudod járni a cégnél, hogy részben vagy egészben ki is fizesse. Nekik ez költségként elszámolható)
  • Elolvasol egy-két könyvet (valószínűleg a veled foglalkozó senior fog egyet-kettőt javasolni)
  • … és csinálod!

Mire profi programozó leszel, addig ennek a mikéntjét is kitanulod. Kezdőként viszont az a nehéz, hogy a struktúráját, lényegét, belső összefüggéseit megértsd egy eszköznek (mi erre helyezzük a hangsúlyt).

Ami még fontos, hogy a programozást azért nehéz megtanulni, mert egy csomó új gondolati struktúrával találkozik az ember. A jó hír az, hogy ezek a struktúrák ismétlődnek: ha egy elvet megértesz, akkor a következő hasonló megértése nem lesz nehéz. Mondok egy példát, amit feltételezésem szerint te is ismersz: a névtér fogalmát (na biztos nem így! :-)). Gondolj a könyvtárrendszerre: Van a C: meghajtó, azon belül könyvtárak (mappák), a könyvtárakon belül más könyvtárak és fájlok. Létezhet ugyanolyan nevű fájl két különböző könyvtárban (pl. C:\TEMP és C:\WINDOWS). De ugyanígy vagyunk a webcímeket alkotó somain nevekkel is: van a .hu, mint legmagasabb szint, alatta a programozas-oktatas vagy a studicore, és mindkettő alatt lehet mondjuk www vagy online. Olyan, mintha egy fájlrendszert látnánk, csak fordítva írjuk és másra használjuk. De az elv ugyanaz! És az informatika tele van ismétlődő elvekkel… de ezeket egyszer azért meg kell tanulnunk!

A lényeg, hogy minél tovább vagy informatikus/programozó, annál kevesebb új van a nap alatt számodra a szakmádban.

És akkor álljon itt a csinálás mellett még három eszköz, ami hosszú távon is használható egy programozó önfejlesztése esetében:

  • könyvolvasás: lehet, hogy elektronikusan, vagy ebookolvasóról, de érdemes könyveket is olvasni a programozás egyes, saját szak- vagy érdeklődési területedbe vágó témában, viszonylag rendszeresen
  • cikkek olvasása, szakértők nyomon követése: olyan szakmában dolgozunk, amiben a nagy klasszikusok, szakmánk “alapító” atyjai még velünk élnek: Bill Gates, Linus Torvalds, Tim Berners-Lee vagy éppen James Gosling. Már egyre kevesebben vannak aktív korban, de aki igen, azokat érdemes követni
  • kódolvasás, azaz más programjai forrákódjának olvasása: ez lehet, hogy meglepő, de nagyon sokat lehet tanulni abból, hogy ha egy jól összerakott, kellően komplex program részeit próbálod meg megérteni és adott esetben akár kiegészíteni. Még abból is tanul az ember, ha nem a legjobban van összerakva, vagy az idők során összekutyulódott (szokása a programoknak), hiszen akkor friss és külső szemmel ránézve a hibáit, gyengeségeit is meg tudod találni

De ezek már a haladó eszközök, kezdőnek semmiképpen nem ajánlom, mert inkább pótcselekvés és időhúzás, mint hatékony célelérés, szóval először inkább tanulj meg programozni, és ha az alapok megvannak, és bekerültél egy céghez, akkor utána még mindig ráérsz ezeket elkezdeni. (Ha sosem bringáztál még, akkor nem azzal fogod elkezdeni az edzést, hogy leborotválod a szőrt a lábadról, hogy kisebb legyen a légellenállás… Pedig egy bizonyos ponton annak is megvan a létjogosultsága)

 

Melyik nyelvet válasszam?

Ha az ember programozó szeretne lenni, számos irány (ún. platform vagy világ) közül választhat. C, C++, C#, Java, PHP, Javascript (azok különféle keretrendszerei, pl. Angular, jQuery…), Python,…

Mégis melyik irányt érdemes választani? (Arról, hogy szerintem egyet érdemes választani, arról előző héten írtam).

C: A ma legnépszerűbb nyelvek ősatyja, a Java, a C++, a C#, a PHP és a Javascript is ebből a nyelvből fejlődött ki, az alapvető utasítások nagyon-nagyon hasonlóak – ha nem azonosak. Viszonylag kevés utasítást és lehetőséget tartalmaz, így elég könnyű megtanulni, viszont nem túl barátságos a programozóval: időnk és energiánk nagy része a gép specialitásaival való törődéssel megy el (memóriakezelés és -felszabadítás, pointerek nyomon követése, cím szerinti paraméterátadás kapcsán való gondolkodás – ha ez nem mond semmit, nem baj. A lényeg, hogy egy magasabb szintű nyelvnél ezekkel nem neked kell törődnöd).
És hogy hol használják manapság? Nagyon egyszerű beágyazott rendszerek vezérlésénél, pl. amilyen egy automata öntözőberendezés. De pl. a Raspberry Pi (ára tízezer Ft körüli) sem csak C-ben programozható, így a jelentősége egyre csökken. Ha érdekelnek a beágyazott rendszerek, válaszd ezt, és készülj fel, hogy a hardvert kell majd masszíroznod, hogy menjen a programod. Ez nagy odafigyelést, alapos elméleti tudást igényel. Tudásod csak egy speciális környezetben alkalmazható. Szóval nem ajánlom. (Egy beszúrás: Programozni megtanulni kívánóktól számtalanszor hallottam, hogy “Először megtanulom az alapokat, a C-t, majd utána rátérek a magasabb szintű nyelvekre”. Khm… Miért tanulnál meg lovagolni azelőtt, hogy autót vezetni tanulnál? Mert az autó feltalálása előtt lovagoltak az emberek? A lovaglás jó sport, de semmi szükség rá az autózáshoz).

C++: Objektum-orientált (=menő) programozási nyelv, de valahogy megörökölte a C-nek azt a tulajdonságát, hogy bal kézzel masszírozni kell a nyelvet, hogy működjön a program. Rengeteg lehetőség van benne, kevés kivétellel mindent meg lehet csinálni benne, ráadásul elég gyors is lesz a program. Ideális, ugye? Hátulütője, hogy sokszor tovább tart rendesen megtanulni, mint mondjuk a Javát. Kis túlzással azt szoktam mondani, hogy a Java és a C++ úgy viszonyul egymáshoz, hogy Javában a C++-ban megírható programok azt a 20%-át lehet kivitelezni, ami a problémák 80%-át megoldja. Ha a maradék 80%-ot is akarod programozni, akkor cserébe tanulhatsz 5-szörannyit. Állásszerzés szempontjából nem ideális, mert 5-ször tovább tart megtanulni olyan szinten, hogy állást találj, mint a Javát. Ha menő 3D-s számítógépes játékot akarsz programozni, telekommunikációs alapszoftvert, operációs rendszert, vagy más, sebességkritikus rendszert, akkor ez a te pályád. Mivel túl rögös és hosszú az út benne a programozóállásig, nem javaslom.

Java: Viszonylag gyorsan, könnyen megtanulható, mert elég jól leegyszerűsített és letisztított nyelv, keveset kell (és lehet) a számítógép lelkivilágával törődni, jobban lehet a feladatra koncentrálni, kellően kényelmes. Ráadásul a legjobban fizetett programozók a Java programozók. Egyrészt a Java beette magát a nagyvállalati környezetbe, számos banki és egyéb rendszer Javában van írva. Ezen kívül az Android programok millióit is Javában írták meg. Annyira nagy tömegű program van Javában írva, hogy az tuti nem fog egyik napról a másikra megváltozni. Több millió programot senki nem fog máról holnapra sem kidobni a szemétbe, sem átírni egy másik platformra. EZ TUTI. Ráadásul a nagyvállalatok ilyen szempontból nem a gyorsaságukról híresek… néha még a Java verziót sem váltják, nemhogy mindent újraírjanak egy menő új nyelvben. Szóval aki a Javát választja, annak egy meglehetősen kényelmes, meglehetősen gyors utat kell végigjárnia, míg bele nem csüccsen a jól fizető állásába.

C#: A Java után jött ki, ezért valamivel fejlettebb nyelv annál, de a Windows platformmal van legjobb barátságban. A legkönnyebb áttérés Javáról talán a C#-ra van, az alap nyelvi készletben csak néhány különbséget lehet felfedezni, annyira hasonló. A .NET-tel szokták együtt emlegetni, ami a Windows platform programozói környezete. Nem egy rossz választás.

PHP: Azok számára, akik egyszerűbb webes szoftvereket akarnak programozni, ez (és a Javascript) a jó választás. A PHP rengeteget küzd a menővé válással (objektum-orientált programozás bevezetése), és igazán nem is érzem túl sikeresnek. Könnyen tanulható, széles körben támogatott nyelv, de nagyon gyorsan lesz gátja egy weboldal fejlődésének.

Javascript: Ha valaki webes programot akar valaha írni, nem tudja kikerülni a Javascriptet, ugyanis jószerivel ez (és utódai, pl. Typescript) az, amit egy böngésző futtatni tud. Javascript és pont. A PHP-hoz hasonlóan a Javascript is küzd az objektum-orientálttá válással, tehát megalapozott programozási tudásra akarsz szert tenni, akkor nem biztos, hogy a legjobb, ha a Javascripttel kezded.

Python: sokak szerint ideális kezdő nyelv lenne a programozás megtanulásához, és szintén sokak szerint nem elég komoly nagy rendszerek írásához. Mivel nem követi a C-alapú nyelvek nyelvtanát, mi értelme lenne egy kezdő nyelvet megtanulni, utána átváltani egy komoly nyelvre? A programozási alapokat Javában is meg lehet tanulni, és akkor legalább a később használt nyelvtant (szintaxist) gyakorolja az ember.

Nem véletlenül oktatunk Javát, azt gondolom, ezzel tud a tanuló leggyorsabban legnagyobb eredményt elérni tudás és fizetés tekintetében.

Annyira jó programozó leszel, ahány nyelvet tudsz?

Sokan jönnek azzal, hogy ők megtanulják a Javát, megtanulják a C#-ot, de a C++ és a PHP is érdekli őket, aztán bárhova is veti őket a sors, megállják a helyüket.

Igen is, meg nem is.

Ha analógiát keresünk erre, akkor a sportokat és a természetes nyelveket is fel tudom hozni.

Ha egyszerre kezdesz el portugálul és olaszul tanulni, mi lesz a végén belőle? Kis valószínűséggel a két nyelv tökéletesen szétválasztott ismerete és kezelése. Nagy valószínűséggel viszont egy nagy katyvasz.

De nem csak ez a gond, hanem két nyelv megtanulására kétszerannyi idő kell (mily meglepő :-)), viszont ha azt a kétszerannyi idődet az egyik nyelvre szenteled, sokkal minőségibb szintre tudsz eljutni.

Lefordítva: vagy mindkét nyelvet megtanulod úgy, hogy egy étteremben tudsz rendelni, és külföldön útbaigazítást tudsz kérni, vagy megtanulod az egyiket úgy, hogy akár egy szépirodalmi szöveget is meg tudj érteni, vagy előadást tudj az adott nyelven tartani. Az első is lehet cél, de pénzt keresni inkább a második opcióval tudsz.

Vagy a sportok analógiája: ha triatlonista vagy (úszás-kerékpár-futás), akkor az egy-egy sportot űzőkhöz képest rosszabb kerékpáros, rosszabb futó és rosszabb úszó leszel – egyszerre mindent nem lehet.

Tehát én azt javaslom, ha esetleg sok nyelv megtanulását forgatod a fejedben: Ne tedd! Válassz ki egyet a lehetőségek közül (én a Javát ajánlom!), és kötelezd el magad mellette (legalább az első időre), aztán ha az élet úgy hozza, még mindig lehet váltani. Egy teljesen elsajátított környezet sokkal többet ér (pénzben is), mint két félig, vagy három harmadáig kontrollált terület.

És hidd el, egyetlen környezetben elmélyülni is eltart jó pár hónapig. Ha minél hamarabb állást akarsz vállalni, fókuszálj egyre!

Mit kell tudnia egy Java programozónak?

Az ITHub egyik cikkjében összeállított egy elemzést arról, hogy egy IT szakembertől milyen szakmai képességeket várnak el, és a felvett munkavállalók milyen tudással rendelkeznek. Minden területen 10 kulcskompetenciát vizsgálnak. A kimásolt ábra a Java területtel foglalkozik; a Java fejlesztőtől elvált képességek: Java, J2EE, Java EE, JPA, Spring, JSP, Oracle, SQL, XML, Hibernate.

Az első dolog, amiben megerősített ez az ábra, hogy bátran szakíthatunk a magyar oktatás egyik rákfenéjével, a tökéletességre való törekvéssel. Mint láthatjuk (pontos számokat az eredeti cikkben olvashatunk), a Java fejlesztő legfontosabb kompetenciájában, a Java nyelvben sem 100%, amit elvárnak a munkavállalótól, de még csak nem is 90%, hanem valahol 25% környékén. Ami még érdekesebb, hogy a felvett programozók még ezt sem érik el, valahol 15 és 20% között van a teljesítményük.

Ebből két dolog következik:

  • a cégek hajlandóak és kénytelenek szakmájukhoz nem annyira értő munkavállalókat alkalmazni
  • ha van egy jó alap Java tudásod (mert pl. végigcsináltad a Java SE modult a Java távoktatásban), akkor bátran nekiindulhatsz a felvételi procedúrának. Ez utóbbit eddig végzett tanulóim tapasztalatai is megerősítik: sokszor pusztán erős Java tudással ma sokan már programozóként dolgoznak.

Egy másik dolog a Java EE és a J2EE kérdése: A Java EE a J2EE egy későbbi verziója, nagyvállalati rendszerek létrehozására alkalmas csomagról beszélünk. Hogy miért szerepel akkor mindkettő? (Most egy pillanatra megfeledkezünk arról az eshetőségről, hogy esetleg ugyanarról beszélnek a cégek, csak két különböző névvel illetik)

Én egyetlen dologra tudok gondolni: nem szalad annyira a technológia alkalmazása, mint amennyire a technológia és a szakemberek tudása. És ez valahol érthető is: ha egy cég egy bizonyos Java EE (J2EE) verzió segítségével kifejlesztett magának egy rendszert (sokmillióért), akkor nem fogja “csak úgy” lecserélni egy újabb verzión futóra, befektetve megint csak sok millió forintot. Az ok pedig, hogy bár elvileg nagyrészt a régi programokat tudja futtatni az új Java EE, de csak elvileg és nagyrészt. Ez a két szó pedig újabb sok millió lehet egy cég számára.

Ugyanakkor egy adott verzióra kifejlesztett rendszert is karban kell tartani: hibákat kell javítani benne, esetleg új funkciókat megvalósítani, amihez pedig kell a régi technológiához értő szakember.

A Java EE első verziója 2006. májusában jelent meg (10 éve!), és váltotta le a J2EE-t. Nagyon úgy néz ki, hogy vannak cégek, akik ilyen régi technológiával készült szoftverrendszereket használnak, tartanak karban, és szívesen alkalmaznának hozzáértő szakembereket. Azaz:

  • a régi technológia nem feltétlenül felejtendő el
  • ha most megtanulsz valami aktuálisat, az nem fog hipp-hopp elavulni, pláne nem Java területen, ahol jelentős a nagy cégek jelenléte, akiknél minden egy kicsit megfontoltabban zajlik

Forrás: http://ithub.hu/blog/post/Mit_varnak_el_egy_egy_adott_IT_pozicio_betoltesehez_es_mi_ezzel_szemben_a_valosag/

Szerencsés vagy…

Azt gondolom, hogy a legtöbb olyan ember, aki már valamit letett az asztalra, találkozott azzal a helyzettel, amikor egy az eredményeire irigykedő embertársa hasonló kezdetű mondattal igyekezett vigasztalni saját magát, egyben tőrt döfni a másikba:

  • “Szerencsés vagy, hogy Téged az informatika érdekel!”
  • “Bill Gates milyen szerencsés volt, hogy pont őt kereste meg az IBM, hogy készítsen operációs rendszert a PC-hez!”
  • “Pusztán a szerencsének köszönheti, hogy most 22 évesen évi 10 millió dollárt keres sportolóként!”
  • “Szerencsés vagy, hogy pont megtanultál programozni, mire kirúgtak!”

… és így tovább.

Darrell Royal szerint viszont “A szerencse nem más, mint a felkészültség találkozása a lehetőséggel.”

Én azért szeretem ezt a mondatot, mert elismeri az “szerencsésnek” mondott ember erőfeszítéseit, előrelátását, felkészültségét:

  • Aki azért “szerencsés”, mert pont az informatika érdekli, és ezzel jó állást kap, az vette a fáradságot, hogy hosszú heteken, hónapokon keresztül órákon át gyakoroljon, olvasson utána, kérdezzen és gondolkodjon. A folyamat eredményeként a neki felajánlott állás (lehetőség) megjelenésekor ő felkészült volt annak betöltésére.
  • Bill Gates diákkorában beszökött éjjelente az iskola számítógéptermébe, hogy tanulmányozza a mikroszámítógépeket, és mikor az IBM operációs rendszert keresett a PC-knek, már létezett a Microsoft, számos programot árultak, és hajlandóak voltak szűk határidővel elkészíteni az operációs rendszert is.
  • Az évi 10 millió dolláros szerződést aláíró sportoló gyakran gyerekkorától edz napi 5-6 órát, és mikor a lehetőség megtalálja, ő már készen áll.
  • Manapság lépten-nyomon előfordul, hogy cégek szűnnek meg, embereket bocsátanak el, lehet, hogy a Te cégednél is ez a helyzet, csak még nem tudsz róla. De az is lehet, hogy Te fáradtál bele abba, hogy újra és újra ugyanazokat a köröket fusd meg, és már sem kedved, sem energiád nincs ahhoz, hogy tovább dolgozz a jelenlegi helyen; inkább váltanál.
    Ha nem akut a probléma, most még eldöntheted, hogy az elkövetkezendő hónapjaidat programozóvá válással töltöd, vagy hagyod elúszni.
    Ha programozóvá szeretnél válni (én ezt ajánlom ebben a helyzetben: Java Távoktatás tanfolyam), akkor mire eljön az adott munka vége (lehetőség az újra), Te már felkészülten tudod azt mondani a főnöködnek: “Köszönöm, hogy eddig itt dolgozhattam, most elmegyek programozónak!”… Az irigykedők meg hadd szajkózzák: “Ó, de szerencsés!” Mi pedig tudjuk: “A szerencse nem más, mint a felkészültség találkozása a lehetőséggel.” Kezdd el még ma a felkészülést!