2012. március 21., szerda

Programozó szakkör 1

(Kísérletezem egy "házi programozó szakkör" indításával, és ha már foglalkozom vele, miért ne naplóznám a történetet itt is?)

Kiből lehet programozó?
Ami nélkül nem érdemes elkezdeni sem: angol nyelvtudás, vagy megszerzésének komoly szándéka. Minden szakirodalom, fórum, blog, leírás, ... angolul készül, megértésének hiánya behozhatatlan hátrányt jelent a legtehetségesebb jelölt számára is. Botfüllel is szép az élet, de zenésznek nem érdemes tanulni.

A legfontosabb képesség saját hülyeségünk elviselése - sőt az, hogy képesek legyünk örülni annak, amikor végre lehülyézhetjük magunkat. Programozás közben, mint egyébként bármikor, hibákat követünk el. Ezek a hibák azonban nem tűnnek el, nem felejtjük el, nem válik megszokottá, hanem "beleragad" a programba, és addig keseríti az életünket (vagy másokét), amíg meg nem találjuk és ki nem javítjuk. Elengedhetetlen tehát az a képesség, sőt vágy, hogy megtaláljuk a saját hibáinkat, szembenézzünk velük és kijavítsuk őket akkor is, ha a hiba elismerése nehéz, megtalálása hosszú és fárasztó, bosszantó tevékenység.

Alapvető a felelősségvállalás. Programozóként bonyolult rendszerekkel dolgozunk: programozási nyelvek, operációs rendszer, fejlesztő és futtató környezet, külső eszközök. Igen nagy a csábítás, hogy ha a programunk nem azt csinálja, amit szerettünk volna tőle, akkor ezekben a külső rendszerekben keressük a hibát. A valóság viszont az, hogy (az állandó toldozgatás alatt álló, ma legnépszerűbb "keretrendszerek" kivételével) annak valószínűsége, hogy a külső rendszer hibájába ütköztünk, elenyészően kicsi, összevetve annak esélyével, hogy mi rontottunk el valamit. Még a legrosszabb minőségű keretrendszernél is küzdeni kell azért, hogy olyan ritkán járt útvonalat válasszunk, ahol kipróbálatlan, hibás működést kapunk. Valójában sokkal jobb nekünk, ha mi hibáztunk, mert egy külső hibát sokkal nehezebb megkerülni, mint a sajátunkat kijavítani... Ha mégis tőlünk független hibába botlottunk, akkor viszont nagy esély van arra, hogy nem mi vagyunk az elsők, és fórumokon, blogokon találunk járható kerülő utakat. Bármelyik is lenne: a mi és csakis a mi dolgunk a hiba megtalálása és javítása.

A megértés képessége és szándéka. Egyáltalán azért létezik a programozó szakma, hogy mások, jellemzően nem programozók munkáját programjainkkal könnyebbé, átláthatóbbá, hatékonyabbá tegyük. Tudásunk és munkánk egyetlen értelme, hogy másokat, a felhasználókat szolgáljuk vele. Értelmetlen dolog informatikai szaktudást, belátást elvárni tőlük, vagy ennek hiánya esetén felsőbbrendűnek tekinteni magunkat.Olyan abszurd dolog ezt egyáltalán leírni, mégis sok helyen találkoztam már ezzel az érzéssel, ami már induláskor értelmetlenné képes tenni egy kapcsolatot, amelynek célja egy közös megelégedést kiváltó rendszer létrehozása lenne.

Egyértelműség. Ez első feladat a kérdés tisztázása, mielőtt válaszolni kezdenénk. Közhelynek hangzik, mégis olyan ritka, amikor a feladat megoldásának elkezdése előtt elkészül egy olyan terv, amelyet minden fél a sajátjának és teljesnek tekint. E terv elkészítése a programozó/tervező, és nem a felhasználó feladata. A programozónak kell beleélnie magát a felhasználó igényeibe, látnia a leendő rendszert, ahogy a jelenlegi folyamatokba illeszkedik, feltenni azokat a kérdéseket, amelyeket a felhasználó nem tud feltenni, mert nincs meg hozzá a szaktudása, illetve a jelenlegi tevékenységéből indul ki. Sok esetben logikusabb lenne máshogyan, a megszokásoktól eltérő, vagy az új eszközök által lehetővé váló új módon végezni a feladatot - de ezt külső szem gyakran könnyebben észreveszi.

Előrelátás. Amikor elkészül a rendszer, sok mindent megváltoztat maga körül. Számos dolog lesz, amit máshogy képzelt, vagy új módon fog látni a felhasználó. Új ötletei lesznek, meg szeretné változtatni azt, ami elkészült. Ilyenkor a legkönnyebb haragudni rá és lenézni a megváltozó igények miatt - pedig a hibát ismét a program tervezője követte el. Ő az, aki jobban bele tudja élni magát abba a helyzetbe, amibe a felhasználó a kész rendszer használata során kerül. Neki kellett korábban feltenni azokat a kérdéseket, amelyek nem a rendszer első változatának kialakításához kellettek, hanem ahhoz, hogy a továbbfejlesztéshez, az új ötletek befogadásához a lehető leghajlékonyabb szerkezetet alakítson ki a komponensek tervezése során. Az ő feladata úgy tekinteni a rendszer első változatára, mint egy kísérletre, amely a lehető legtöbb tapasztalatot kell eredményezze, és a lehető legjobb alapot kell szolgáltassa a későbbi, már sokkal jobb megoldások számára - túl azon, hogy természetesen az első változat terveinek pontosan megfelel.

Mit szeretnél programozni?
Természetesen játékot... mindenki így kezdi, de nagyon kevesen lesznek végül játék programozók.
Én ma már nem szeretnék játékot írni, és örülök, hogy kezdeti álmaim ellenére soha nem kerültem ebbe a helyzetbe.
Nincs ugyanis annál jobb érzés, mint amikor tudom, hogy a programjaim mögött valódi emberek, valóságos tárgyak, folyamatok vannak; ők nem tudják, de én igen, hogy valahol egy fel sem tűnő tevékenység mögött az általam írt programsorok szolgáltatják az adatot, engedélyezik a hozzáférést, jelenítik meg az adatokat. Igen, nagy felelősség, és nagyon rossz érzés, amikor valami "elkavarodik". Mégis, erre jobb érzés büszkének lenni, mint arra, hogy jobb sorsra érdemes emberek az általam írt játékkal pazarolják el életük értékes, és annyi minden jobb dologra használható óráit, napjait...

Mi a programozás?
Programozási nyelvek? Honlapok, portálok, játékok?
Nem. A programozás a gondolkodás képessége, megismerni, megérteni, részekre bontani egy feladatot, a komponenseket megvalósítani, majd megépíteni belőlük az elképzelt alkalmazást. Ha jól sikerül az elemzés, a kialakított komponensek önálló életre kelnek és új feladatok megoldásában fognak segíteni.
A programozás a legközvetlenebb formája az állandó tanulásnak, mert minden hibát láthatóvá tesz. Minden megoldott feladat kicsit változtat a gondolkodásmódunkon, mire befejezzük a feladat megoldását, már másként látunk sok mindent, máshogy kezdenénk neki. Itt is sokat számít, hogy mennyire tagolt az elkészült rendszer. Ha egyetlen gombócba gyúrtam mindent, csak annyit tudok megállapítani a végén, hogy most már máshogy kezdenék neki. Ha viszont önálló komponenseket készítettem, azokat utólag tovább alakíthatom, fejleszthetem, képességeiket átcsoportosíthatom, bonthatom, összevonhatom őket. Vagyis módomban áll tovább alakítani, még többet kihozni ugyanabból a feladatból.
Szóval: elemzés, megértés, tervezés. Az alkalmazott nyelv és eszközkészlet csak a végén következik. Igen, kell a tapasztalat és programozói rutin, de csak miután az előbbiek rendben vannak.

Házi feladat
Válassz egy feladatot, amit szeretnél futó programként látni. Fontos, hogy olyan legyen, amit tényleg nagyon szeretnél megcsinálni, mert a vele való küzdelem nem lesz könnyű, nem beszélve az unalmas hibakeresésről.
Gondold végig, milyen önálló elemekből épül fel, ezek milyen kapcsolatban állnak egymással. Rajzold le az elemeket, készíts listát a tulajdonságaikról, és hogy mit csinálnak.

Segítség
0: Legegyszerűbb, ha vesztek egy füzetet ehhez a "szakkörhöz", és abba rajzoltok, írtok. Tollal! Ne radírozzatok, csak tegyétek zárójelbe, ami nem jó, és írjátok mellé, hogy miért nem jó.

1: Kezdjétek el ma, és foglalkozzatok vele minden nap egy kicsit. Nem az a kérdés, hogy ki tudtok-e találni "valamit" az utolsó pillanatban, hanem az, hogy mennyire lesztek elégedettek azzal, amit el tudtok mondani a legközelebbi alkalommal. Így egyébként még az is belefér, hogy két nap után megváltoztatjátok a témát, ha nem elég érdekes... ha ez történne, azért hozzátok el a kidobott cuccokat is, mert az is fontos.

2: Képzeljétek el úgy a feladatot, mintha lenne néhány kis manótok. Ezek a manók olyanok, mint mi: okosak, meg lehet tanítani őket sok mindenre - viszont legjobban azt szeretik, ha egy feladatot kapnak, amihez viszont nagyon jól fognak érteni.
Ezért nem szerencsés egyetlen manónak elmagyarázni az egész programot, hanem ki kell találni egy manó csapatot, akik egy-egy részfeladatot végeznek el, és majd belőlük állítjuk össze a programot. Ezek a manók nem szeretnek sokat beszélni, világos utasításokat várnak tőlünk és egymástól. Nem szeretik, ha kívülről folyton beleszólnak a dolgukba, belepiszkálnak a szerszámaik közé. Megkapják tőlünk vagy egymástól a feladatot, megkalapálják és továbbadják az eredményt - ennyi.
Szóval, találjátok ki azokat a manókat, akik a választott feladatot megoldják. Gondolkodjatok el azon, hogy később mire lehetne még felhasználni ugyanezeket a manókat, vagy hogy mit tanulhatnának még meg a saját feladatkörükben.

Gyerekesen hangzik? Az objektum orientált programozás alapelveit magyarázom éppen, csak mivel még nem ismeritek a szakmai fogalmakat, egyszerűbb morcos manókról beszélni, mint osztályokról, függvényinterfészről meg zártságról ;-) A lényeg viszont ugyanaz!

Hogy tudom a programot manókra osztani? Ez a rész nem olyan világos...

Persze hogy nem! Ennek ellenére nem segítek többet, mert akkor meg kéne oldanom a feladatot, ti pedig gondolkodásnak neveznétek azt, ahogy megpróbáljátok megérteni és lemásolni az én megközelítésemet - de nem ez a cél.

Az "agyizmok használata", a gondolkodás két részből áll: van a tárgyi tudás, és van a tudás használatának képessége, az ismeretek összerakása, új elképzelések kialakítása. Persze, a programozásnál is van tárgyi tudás, de azt összeszedjük hamar, mert ha értitek, hogy az eszközök miért vannak és miért úgy néznek ki, akkor "átláttok rajtuk": értitek azokat a feladatokat, amiket megoldanak. Az átlátás hiányában viszont a tárgyi tudás csak értelmetlen magolás lenne, ami itt nem cél, annak ellenére, hogy a tudás megléte alapfeltétel az eredményes munkához.

Hetedik osztályos "kiskamaszok" vagytok. Az általános iskolában olyan környezetben vagytok, ahol alapvetően tárgyi tudást (szabályok, tények, fogalmak, idegen szavak) igyekeznek a fejetekbe tölteni - ti pedig életkorotok és vérmérsékletetek szintjén lázadoztok ez ellen, hogy "majd ti azt jobban tudjátok", meg "úgysem kell"... Nos, itt fel van festve a pálya: mutasd meg, hogy jobban tudod! És ha szeretnél programozással foglalkozni, akkor igenis kell! ... és lehet ismerkedni az "én ehhez tök hülye vagyok" érzéssel is, amit kezelni lehet és kell, mert ha programozók lesztek, együtt kell élnetek vele: hibákat kell elkövetni, kijavítani és tanulni belőlük.

Tudom, hogy ez elég szokatlan megközelítés, hirtelen sok elvárásnak tűnik. Én azonban emlékszem arra, hogy ilyen koromban, egyetlen könyv segítségével már programoztam, és pont erre a segítségre, hozzáállásra lett volna szükségem - én pedig mást nem tudok adni. Majd meglátjuk, mi lesz belőle.