Traktát o vzdělání programátorově

Po sadě technických článků bych rád napsal zase jeden trošku filozofického charakteru. Rád bych se v něm zamyslel nad způsoby, které používám pro své vlastní vzdělávání a faktory, které osobně vnímám jako pozitivní. Snad každému je jasné, že ten kdo na sobě dál nepracuje může v našem oboru těžko dlouhodobě něco dokázat (a být lépe placen ;-)) a proto se zamyšlení nad tím, jak se vzdělávat co nejefektivněji, určitě hodí každému.

Článek je zcela subjektivní - co funguje pro mně nemusí nutně fungovat stejně ve vašem případě, nicméně řekl bych, že základní linka je obecně přenositelná. Způsobů jak se vzdělávat je několik, každý z nich nás obohacuje jiným způsobem a všechny dohromady působí v synergii. Myslím, že pokud člověk libovolný ze jmenovaných způsobů nepoužívá, zbytečně se o mnoho připravuje.

Čtení (články, blogy, knihy, dokumentace)

Tento odstavec asi nikoho nepřekvapí, protože to je asi nejběžnější způsob jak se v dnešní době vývojáři vzdělávají. Psaná dokumentace, tutorialy a další podobné zdroje jsou typicky základním zdrojem pro učení nových technologií, knihoven a nástrojů. RSS čtečky plné zajímavých kanálů, twitter, sledování kvalitních portálů, čtení blogů - to vše je asi rutinní součástí většiny vývojářů, kteří to myslí se svojí prací vážně. Tento způsob získávání informací nám také asi nejčastěji pomůže k řešení problémů, na které ve své praxi narazíme. Svět je totiž plný vývojářů, kteří často něco podobného jako vy už řešili a někteří z nich řešení i zdokumentovali.

Získávání nových poznatků čtením má ale i řadu svých negativ. Psaných informací je nepřeberné množství - to je na jednu stranu velká výhoda, protože máme rozumnou šanci v této kupě najít i velmi specifické informace, které se hodí přesně pro námi řešený problém. Na stranu druhou ale není často jednoduché tyto informace najít a stojí to často moře času. Po X letech hledání informací na internetu člověk získá cit pro vyhledávání, ale i přesto musíme často projít hodně materiálu, než najdeme to co nás zajímá. Také pravidelné sledování oblíbených informačních kanálů stojí hodně energie a vytrvalosti. V posledních letech se mezi mé oblíbené kanály dostal Twitter, který míchá zábavné informace s užitečnými a které jsou navíc již převybrané lidmi, které já sám vnímám jako zajímavé - tj. ty informace, které se tímto způsobem ke mně dostanou, jsou typicky daleko hodnotnější než ty, které mi končí v RSS čtečkách (a to v daleko lepším poměru než se děje, myslím, na Facebooku).

Osobně musím přiznat, že v poslední době přestávám mít na systematické sledování všech "tištěných" kanálů příliš málo času. Většinu z nich jen letmo prohlédnu a pokud mne něco nezaujme, jdu dál. Systematicky hledám jen v případě řešení nějakého konkrétního problému.

Shrnutí:

  • bývají velmi konkrétní
  • zásadní v hledání řešení konkrétních problémů
  • vytěžení informací z těchto zdrojů stojí často hodně času
  • obrovská nabídka různě kvalitních zdrojů

Mé oblíbené zdroje:

Poslouchání (přednášky, konference, podcasty)

Tímto způsobem lze načerpat úplně jiný druh informací, než v případě čtení. V newscastech se s předstihem můžete dostat k novinkám, které hýbou zahraniční scénou, ale k nám ještě nedorazily. Na přednáškách, konferencích a v podcastech se často dozvíte o věcech, které jsou aktuálně mimo doménu, ve které se pohybujete, ale zajímavě vám rozšiřují váš pohled na vývoj jako takový (jako Javista si asi článek o .NETu nepřečtete, ale v podcastu vám informace o něm vadit nebudou).

Mluvené (i video) materiály obvykle nejdou příliš do hloubky, ale za to vám mohou skutečně výrazně rozšířit obzory. Mnohokrát se mi také stalo, že právě tento zdroj mi jako první nabídl informaci, která mne nakopla pídit se po dalších detailech, což mi ve výsledku přineslo hodně prospěchu. Pro Čecha je také velmi užitečné poslouchání cizojazyčnýh materiálů, protože krom vlastních informací se také učíte rozumět a, paradoxně, i lépe v daném jazyce mluvit. Vstřebávání znalostí tímto způsobem také není tak problematické z hlediska volného času - posloucháním audio záznamu můžete efektivně zaplnit jinak nevyužitý čas, který každý den věnujete třeba dojíždění, nakupování, sportování atd.

Shrnutí:

  • z mnoha oborů (jazyků)
  • skvělé na novinky
  • získávání obecného povědomí (ze zkušeností ostatních)
  • rozumně omezená nabídka kvalitních zdrojů
  • povrchni - bez konkrétních detailů
  • řadu věcí brzy zapomínáme pokud je nepoužijeme

Mé oblíbené zdroje:

Komunikací

Aktivní způsoby učení mají daleko větší význam pro výsledné praktické dovednosti. Nicméně kvalitní "živou zkušenost" není tak jednoduché získat a je velmi odvislá od toho v jaké komunitě se nacházíme a jakou roli v ní zastáváme. Do této kategorie bych řadil pair-programming, workshopy, hands-on-laby, komunikaci v rámci nějaké komunitní konference (diskuse nad issues v trackeru a návrh patchů) atd.

Přínos bude pro vás tím lepší, čím lepší a kvalitnější budou lidé okolo vás. Naopak pokud patříte vy mezi seniory, těch výhod zase tolik čekat nemůžete. Hodně také záleží na zvyklostech komunity - v některých komunikace mezi členy jen kvete, odpovědi na vaše dotazy jsou kvalitní a slušné, v jiných se dočkáte jen RTFM. Pokud se však dostanete ke kvalitním lidem, můžete se poměrně rychle naučit některé zásadní praktiky a dovednosti, které dokážete rychle přetavit do vaší denodenní práce. Najít takovou komunitu nemusí být vždy tak jednoduché.

Jak jsem již uvedl - pro zkušené vývojáře nemá tento způsob rozvoje takovou hodnotu, jako pro začátečníky (pokud nenajdete další lidi na své úrovni). Na druhou stranu každý z nás někdy začínal a určitě si vzpomenete na dobu, kdy jste sami podobné impulsy potřebovali. O to víc si cením kolegů, kteří neúnavně odpovídají na dotazy na různých mailing listech a diskusích (např. na Java.cz mailing listu), přestože oni sami málokdy dotaz potřebují položit.

Samostatnou kapitolu tvoří komunikace na různých konferencích. Tam se můžete, kromě jednostranného příjmu informací z přednášek, osobně dostat k diskusi se zajímavými lidmi a navázat tak cenné kontakty, které se vám budou v budoucnu velmi hodit. Mít kvalitní síť kontaktů totiž není zásadní jen pro manažery a obchodníky, ale hodí se každému z nás.

Shrnutí:

  • získané znalosti mohou být jak velmi detailní, tak velmi obecné
  • asi nejrychlejší cesta ke znalostem
  • záleží na kvalitě komunity

Studiem a prototypováním cizího kódu

Tento způsob získávání znalostí patří mezi mé oblíbené. Již poměrně po krátké době člověk dokáže rozlišit kvalitní kód od špatného - a také dokáže ocenit kód, který je výrazně lepší než jeho vlastní. Takovým kódem je potom radost se probírat a zkoumat jak funguje. Typicky se cizím kódem toulám ve chvíli, kdy něco nepracuje tak, jak bych podle prvního dojmu očekával, ale často se mi stává, že po cestě ze zvědavosti zabloudím úplně do jiných míst, než mě zpočátku zajímaly (tímto způsobem jsem například ve Springu objevil plno zajímavých věcí, o kterých jsem už mnohokrát psal). Navíc tak odhalíte principy fungování dané knihovny, které velmi často ani zdokumentované nejsou. Celý modulární systém našeho produktu je například postavený na vlastnostech dědičnosti aplikačních kontextů, které nejsou popsány v základní dokumentaci. Myslím, že jako Javisti máme oproti jiným jazykům obrovskou výhodu - valná většina kódu, který ke své práci používáme je open-source, a tak si myslím, že by byla velká škoda, kdybychom toho nevyužili ke svému prospěchu.

Co se mi však kromě vlastního čtení cizích rukopisů velmi osvědčilo je prototypování proti nim. Pouhým čtením kódu se vám může stát, že výslednou funkcionalitu neodhantete úplně správně. Nasbíráte si ovšem hypotézy, které lze potom jednoduchými jUnitovými testy ověřit. Teprve napsáním kódu, který daný kus API využívá dochází ke správnému pochopení a zafixování znalostí (krom vlastních funkčních prototypů, které vám už zůstanou). Tímto způsobem jsem třeba dospěl k pochopení, jak funguje class reloading v Groovy a navrhnul integrační vrstvu do našich produktů. Tím, že jsem měl napsané prototypy, jsem měl poměrně velkou jistotu, že jsem celý princip pochopil správně - za pravdu mi potom dal i článek od společnosti jRebel stojící za skvělým nástrojem, který tuto vlastnost (refresh class a dalších zdrojů za běhu aplikace) poskytuje i pro standardní Javu.

Obdobné prototypování jsem použil i pro článek o closures v JavaScriptu a teprve po jejich napsání jsem dospěl k jejich rozumnému pochopení. Skutečně si myslím, že prototypování je pro získání zkušenosti velmi důležité. V podstatě se jedná o takový věděcký přístup v malém - procházíte v něm základními fázemi: sběr informací, stanovení hypotéz, sestavení testů pro ověření hypotéz, sestavení testů pro rozbití hypotéz a výsledné ustanovení závěrů (které ve vědeckých kruzích ústí ve formulaci teorie). Tento pseudovědecký přístup k učení navíc (alespoň pro mne) přináší novou úroveň zábavy a naplnění z výsledku. Navíc se takto často dostanete sami k poznání, které byste na internetu těžko hledali.

Shrnutí:

  • možnost získat kvalitní návyky a vzory z kvalitních knihoven
  • v Javě typicky přehršel příležitostí ke studiu (většina kódu je open-source)
  • jde až k samotnému jádru problému (niž to už nejde)
  • náročné na čas
  • výtěžnost informací je odvislá od úrovně čtenáře

Publikováním

Správný zavěr vzdělávacího procesu by měl být zakončen tím, že se o nabyté vědomosti dělíme dál - ať už prostřednictvím nějaké publikační činnosti (blogy, články, psaní OSS), přednášením nebo školením ostatních. I to je součástí dalšího vzdělávání, protože při něm získáváme zkušenosti jiného charakteru - zvykáme si na vystupování na veřejnosti, učíme se vyjadřování, pracujeme formě a obsahu, aby byl výsledek srozumitelný, posluchače obohatil a byl pro ně něčím zajímavý. Krom těchto věcí nás tato úroveň "vzdělávání" nutí k daleko hlubšímu porozumnění domény, kterou se snažíme vykládat. Povrchní znalosti jednoduše nestačí, protože by nás každý druhý dotaz vyvedl z konceptu a dost pravděpodobně bychom časem i sami sebe přivedli do úzkých, když bychom se neobratným přednášením / vystupováním dostali do míst, kde nemáme pevnou půdu pod nohama.

Už při sestavování přednášky / článku člověka napadají dotazy, které by mohly posluchače / čtenáře napadnout a často se mi také stane, že v danou chvíli nevím jak bych na ně odpověděl. To potom člověka žene do dalšího hledání informací a zkoumání, dokud nedospěje k uspokojivé odpovědi na hypotetickou otázku (paradoxně ovšem při přednáškách většinou stejně padají otázky, které vás při přípravě nenapadnou :-) ). Pravidelně se mi také stává, že teprve ve chvíli, kdy se snažím konkrétní věc vysvětlit někomu dalšímu, mě docházejí další souvislosti, které mne před tím nenapadly.

Pokud jste tedy odborníky v nějaké oblasti vývoje, je přednášení / publikování skutečně další úroveň kam se můžete ještě dostat a vytěžit z daného faktu ještě víc. Tento způsob sebevzdělávání je navíc prospěšný i komunitě okolo vás, takže zcela jistě říkám: pokud máte co říct, nebojte se a řekněte to. Dá se začít velmi pozvolně třeba tak, že uspořádáte seminář u vás ve firmě nebo pro své nejbližší kolegy - nemusíte hned organizovat přednášky před širokým publikem nebo rozesílat nabídky na veřejné konference. Nebudu zastírat, že to stojí hodně času na přípravu, ale ta zkušenost stojí za to.

Shrnutí:

  • vyžaduje velkou šíři i hloubku znalostí dané domény
  • velmi náročné na čas
  • vyžaduje jistou míru sebedůvěry (není pro každého)

Prací

Poslední, ale ne nejméně významný způsob vzdělávání, je práce. Použití znalostí v praxi je totiž prubířským kamenem všeho a v jisté formě dál vaše znalosti rozvíjí. V našem oboru máme to štěstí, že naše práce je obvykle poměrně různorodá a pravidelně se dostáváme k novým věcem a technologiím (alespoň pokud pracujete v té správné společnosti ;-) ). I při vlastní práci se tedy chca nechca musíte vyrovnat s plno novinkami a technologiemi, které jsou prostě pro realizaci placeného projektu nezbytné. Je dobré, pokud člověk tyto nároky bere jako prostředek ke svému dalšímu vzdělání a není mu to na obtíž.

Právě tato část bohužel často chybí v našem vysokém (středním) školství a proto se mi zdá, že plno informací, které se do studentů hustí, často jen proplují a zase se ztratí. Reálné použití na konkrétních projektech teprve znalosti fixuje a přetváří je ve zkušenost a dovednosti.

Shrnutí:

  • praktické použití znalostí teprve završuje proces učení
  • dostáváte za ni zaplaceno
  • někdy může být jednotvárné, bez novinek a změn

Závěrem

Doufám, že tento článek nevyzní příliš zaníceně. Šlo mi pouze o to, vyznat se z toho, co mě samotnému došlo teprve před pár lety. Došlo mi, že dokončením školy vzdělávání nekončí, že vzdělávání neznamená jen biflování skript a že vzdělávání nevede jen k vyplněné kolonce se zkouškou nebo zápočtem v indexu. Správné (sebe)vzdělávání vede k vaší větší hodnotě na trhu práce a má přímý dopad nejen na váš plat, ale taky na náplň práce, kterou děláte. Je rozhodně zajímavější práci rozdávat, než ji dostávat, je rozhodně zajímavější řešení vymýšlet a rozhodovat o použitých technologiích, než tato rozhodnutí pasivně akceptovat.

Moje způsoby sebevzdělávání už znáte, možná ale já nevím o způsobech, které používáte vy. Možná máte na zmíněné oblasti vlastní názor a zkušenosti. V každém případě budu velmi rád, když se o ně podělíte v komentářích pod článkem. Zvažoval jsem například uvedenení dalšího bodu s názvem "Certifikace", nicméně s tím osobně žádné velké zkušenosti zatím nemám (a tady právě mně možná něco uniká) a proto jsem nakonec tento bod z článku vyloučil.