Hogyan legyél nagyszerű programozó

by Amy M Haddad

Mi különbözteti meg az igazán nagyszerű programozókat?

Photo by David Rangel on Unsplash

Mint tudjuk, a nagyszerű programozók csodálatos funkciókat, webhelyeket, alkalmazásokat és hasonlókat építenek. De mi a közös bennük?

A kutatásom szerint nem csak arról van szó, hogy nagyon jól tudnak egy nyelvet, vagy van egy bizonyos iskolai végzettségük. Hanem az, hogy az igazán tehetséges programozók elsajátították az alapokat. Ez az alapozás teszi őket képessé arra, hogy nagyszerű dolgokat építsenek és áttörő ötletekkel álljanak elő.

Gondoljunk csak egy piramisra. Nagy az alapja, de a csúcs felé haladva fokozatosan kisebb és vékonyabb lesz. A programozás alapjainak elsajátítása képezi ezt az alapot. Onnan indul el minden.

Hát mik azok az alapok? Tapasztalataim és azok a programozók, akiknek a hátterét kutattam, alapján úgy látom, hogy a programozás alapjai két részből állnak.

Problem Solver Extraordinaire

Először is, hatékony problémamegoldónak kell lenned. Ez egy fontos kiindulópont, hiszen a programozás problémamegoldás.

Bár egy probléma megoldásának sokféle módja van, a folyamatnak van néhány olyan része, amely számomra kiemelkedik. Azok a programozók, akik egyben nagyszerű problémamegoldók is, a lényegre desztillálják a problémát, hogy meghatározzák az átfogó céljukat, és céllal kezdjenek neki egy problémának. Ezután minden problémát apró, kezelhető részekre bontanak – sorra megtámadják az egyes részeket, és néha vizuálisan, egy kép megrajzolásával, hogy a “való világ” legyen.”

A folyamat nehezebb, mint amilyennek hangzik. Amikor elkezdtem programozni, falba ütköztem: mint sokan mások, én sem tanultam meg problémamegoldást az iskolában; ez egy olyan készség, amit nem könnyen tanítanak. Matekórán kaptam egy feladatsort, és egyszerűen belevetettem magam, és én is ezt tettem, amikor elkezdtem programozni. Nem meglepő módon feleslegesen pörgettem a kerekeimet, és a legegyszerűbb problémáknál is akadályokba ütköztem.

A dolgok akkor kezdtek megváltozni, amikor elkezdtem tanulni a problémamegoldás folyamatáról, és arról, hogyan kell hatékonyan problémamegoldást végezni. Most már szándékosan kezdek hozzá egy problémához. Ezt a tanácsot George Polya How to Solve It című könyvének köszönhetem.

Polya néhány gondolatát a programozásra adaptáltam, például a probléma megértését. “A problémát meg kell érteni” – írja Polya. Ez magában foglalja, hogy “rá kell tudni mutatni a probléma fő részeire, az ismeretlenre, az adatokra és a feltételre”. Minden egyes problémához előveszek egy papírlapot, és felírom a válaszokat ezekre a kérdésekre: Mit oldok meg, vagy mit próbálok megtalálni? (ismeretlen); mi az, ami adott? (adatok); és milyen megkötésekkel vagy részletekkel kell tisztában lennem? (feltétel).

A probléma megértése nyilvánvalónak tűnhet, de a nyilvánvalót könnyen figyelmen kívül lehet hagyni. Nem egyszer előfordult már, hogy órákat öltem egy problémába, csak hogy jóval később rájöjjek, hogy kihagytam egy apró, de kritikus részletet a problémafelvetésben. A probléma részleteinek leírása mentálisan lelassít, és segít átgondolni, hogy pontosan mit kell tennem, ami a csata fele.

Ezek után tervet készítek, ami Polya másik javaslata. Ennek van értelme. Írok egy vázlatot, mielőtt megírnék egy cikket. Egy művész vázlatot készít a festményről, mielőtt magán a festményen dolgozna. Egy építész rajzokat és tervrajzokat használ, hogy felépítsen egy házat. A programozással sincs ez másképp. Ahelyett, hogy elsietném a cselekvést, azzal kell kezdenem, hogy átgondolom, mire vállalkozom, és elkészítem a támadási tervet.

Ezt többféleképpen is megtehetjük. Néha számsorrendben vázolom fel a lépéseket, amelyeket meg kell tennem: először csináld ezt, másodszor csináld azt. Máskor vizualizálom a problémát. Amikor a for-hurkokat tanultam, elővettem egy marék mandulát, és fizikailag végigjártam a kupacot. Ez egy buta példa, de segített átgondolni a problémát.

Képeket vagy diagramokat is rajzolok. Egy rekurzív probléma esetén rajzolok egy diagramot arról, hogy mi történik minden egyes rekurzív hívásnál, amíg el nem érem az alapesetet. Szinte mindig találok azonban módot arra, hogy leegyszerűsítsem a problémát, hogy kezelhetőbbé tegyem, és hogy segítsek felismerni egy mintát. Mindenekelőtt az a célom, hogy céllal lépjek be egy problémába, és ezt a céltudatosságot mindvégig fenntartsam.

A legjobb tervek ellenére a problémák még mindig nehezek, és még mindig elakadok. A nagyszerű problémamegoldóvá válás időbe telik; ez egy olyan készség, amin még mindig dolgozom, de mindenképpen megéri az erőfeszítést. A különbség látható.

Amikor egy nagyszerű problémamegoldó által írt kódot olvasok, az tiszta és könnyen érthető. A változók jól el vannak nevezve. A függvények rövidek és élesek. Minden egyes kódsornak konkrét célja van; a bolyhos dolgokat eltávolították. A kód tisztasága a programozó gondolatmenetét tükrözi: A programot tetőtől talpig el tudom olvasni, és pontosan tudom, hogy mi történik. Ez nagyszerű problémamegoldás, és én erre törekszem.

Mi van a számítógépeddel?

A számítástechnika megtanulása a második programozási alapvetés. Nemrég kezdtem el tanulni az informatikát, és szeretem, mert a felszíni szinten túlmutatóan haladok. Elmegyek “a színfalak mögé”, hogy megtanuljam, mi történik, amikor például egy beépített függvényt használok. A memóriáról és a futási időről is tanulok, sok más téma mellett. Röviden, megtanulom, hogy a számítógép miért csinálja azokat a dolgokat, amiket csinál.

A “miért” ismerete növeli a kontextuális tudásomat, és tájékozottabb programozóvá tesz. Ennek eredményeképpen átgondoltabbá válik a kód, amit írok. Most, hogy már tudok egy kicsit a futási időről, például úgy döntök, hogy bináris keresést használok ahelyett, hogy egy lista minden egyes elemén iterálnék.

Az alapvető programozási fogalmak működésének megértését is gazdagítja. Például egy rekurzív problémán dolgoztam, és nem azt a megoldást kaptam, amire számítottam. Alapos vizsgálat után megtudtam, hogy miért: a hívási verem végrehajtásához volt köze, egy olyan gondolat, amely néhány hónappal ezelőtt még elkerülte volna a figyelmemet.

Vagy vegyünk órákat. A leghosszabb ideig mérhetetlenül küzdöttem az osztályokkal, és rettegtem attól, hogy használjak egyet. Tudtam, hogyan kell osztályt írni, de nem voltam biztos benne, hogy mikor és miért használok egyet. Ez akkor változott meg, amikor megtanultam, hogy valójában mi történik a számítógépemben, amikor példányokat hozok létre és metódusokat hívok. Végre kattant a dolog, amikor már volt némi kontextusom. Mind a rekurzió, mind az osztályok esetében az informatika áthidalta a tudásomban lévő hiányosságokat.

Az alapok túl gyakran háttérbe szorulnak. A fejlődés lassú lehet, és az emberek hajlamosak a “szórakoztatóbb” dolgokat választani, amikor lehetőségük van rá. Ez nagy kár. Azok a programozók, akik elsajátítják az alapokat, úgy tűnik, magabiztosan kódolnak: tudják a programozási döntéseik “hogyanját” és “miértjét”, ami javítja a munkájukat, és növeli a hitelességüket mások előtt.

Az alapok szilárd ismerete ráadásul megkönnyíti az új nyelvek és technológiák tanulását. Ha például időt szánunk arra, hogy valóban megértsük az olyan alapvető fogalmakat, mint az iteráció, a rekurzió és az absztrakció egy nyelv esetében, az segít egy másik nyelv elsajátításakor. Egyszerűen fogalmazva, sokat nyerhetünk és keveset veszíthetünk az alapok elsajátításával.

Író vagyok (amymhaddad.com), és kezdő programozó.

Szólj hozzá!