Ablak-zsiráf.cpp

2008.06.24. 15:00

Avagy tanuljunk meg programozni, első rész.

 

A programozás vajon mi?


Mielőtt megpróbálnánk megválaszolni ezt a kérdés, kérdezzük meg a nálunk okosabbakat.

Például a magyar wikipedia-t:
Számítógép-programozás (vagy egyszerűen programozás) egy vagy több absztrakt algoritmus megvalósítását jelenti egy bizonyos programozási nyelven. A programozásban megtaláljuk a művészet, a tudomány, a matematika és a mérnöki tudomány elemeit.

Absztrakt algoritmus? Mi?? Művészet?! Már azzal kapcsolatban is vérremenő viták vannak, hogy mi a művészet. A programozás, mint művészet? Néhány év futószalagfejlesztés után kijelenthetem, hogy annyi művészet van a programozásban, ahány fotómodell a női rögbicsapatban. Ez a meghatározás teljesen használhatatlan, mehet a levesbe.



Angol wikipedia:
Computer programming (often shortened to programming or coding) is the process of writing, testing, debugging/troubleshooting, and maintaining the source code of computer programs.

Igen, ez lényegében helytálló, de úgy érzem, hogy pont a lényeg marad ki. És egyébként is túl száraz, kukába vele. Nézzünk valami érdekesebbet.



ROYAL PRECISION, Electronic Computer PROGRAMMING MANUAL:
Programming is planning how to solve a problem. No matter what method is used -- pencil and paper, slide rule, adding machine, or computer -problem solving requires programming.

Ott a pont. Ez a kézikönyv már több mint ötven éve, 1957-ben készült. Ezek a fickók már akkor megmondták a frankót. A programozás egy jól behatárolható probléma (az "unatkozom, mit csináljak?" nem az) megoldásának tervezése, függetlenül attól, hogy ezt milyen eszközzel végezzük. Programozni nem csak számítógépet lehet (bár célszerű azt), hanem lehet szövegszerkesztőt, számológépet, gyári gépsort, sőt még mosógépet is. Az agykontrollosok szerint akár embert is, de szerintem ők meg vannak húzatva.
Persze ennek az elgondolásnak nem az a lényege, hogy legyen OKJ vizsgánk abakuszra is. Mindegy hány nyelvet ismerünk, és milyen szinten, ettől még nem leszünk jó szakemberek. Természetesen a rutin, a magunk mögött hagyott sikeres projektet száma is fontos, de sokkal lényegesebb, hogy kifejlesszük magunkban azokat a készségeket, amiktől jó szakemberré válhatunk.

De hagyjuk az rizsát; a végső szót egykori munkatársam mondta ki anno:
A programozás egy roppant buta gép tanítása egyszerű feladatokra.

Miért egyszerű programozni?

Vajon mik lehetnek a programozás műveléséhez szükséges titokzatos készségek. Elgörbíteni a teret? Nem, azt csak a szcientológusok tudják. Meginni száz korsó sört 4 perc alatt? Nem, csak a schönherzesek gondolják, hogy ez programozás. Meghajlítani egy kanalat? Nem, nem, az meg a Geller. Megszökni a Nemzetközi Űrállomásról? Nem, az Michael Scofield. Akkor?

Nos, a szükséges készségek ezeknél sokkal hétköznapibbak.

  • Tudnunk kell általánosítani dolgokat. Hm, ez könnyű. A szőke nők okosak. Majdnem. Nem ennyire egyszerű, de első nekifutásra nem is túl bonyolult. Arról van szó, hogy fel tudjuk ismerni, és ki tudjuk emelni a közös tulajdonságokat különböző fogalmakból. Például, ha megvizsgálunk egy csomó állatot, akkor észrevehetjük, hogy vannak olyan közös tulajdonságaik, amik alapján csoportokba oszthatjuk őket. Vannak például elevenszülő állatok és vannak tojással szaporodó állatok. De egy más aspektusból vizsgálva elkülöníthetjük az állatokat úgy is, hogy vannak szőrös, tollas vagy csupasz állatok (például az egyiptomi kopasz macska, a szfinx). A gyakorlatban macskákkal és tojásokkal nem lesz sok dolgunk, viszont nagyon fontos, hogy egy adott feladat és egy hozzá hasonló másik között felismerjük a párhuzamot és lekezelve a különbségeket, egyetlen feladatot gyúrjunk a kettőből.
  • A megkülönböztetés az általánosítás fordítva lejátszva. Van egy tág csoport, például az emberek. Mindannyian képesek azokra a feladatokra, amelyeket az összes ember meg tud tenni (fülvakarás, orrpiszkálás, tüsszentés), de van három ember, aki ezeken felül képes megjavítani az órákat. Ők az órások, akik emberek (vakarnak fület), de képesek olyasmire is, amire a többi ember nem (órát buzerálni).
  • Dekompozíció. Ez tényleg egyszerűbb, mint ahogy hangzik. Arról van szó, hogy tudnunk kell komplex problémákat feladatokat, könnyebben megoldható feladatokra bontani. Például ha az a misszió, hogy "utazzunk Kínában", akkor ezt a feladatot felbonthatjuk a "útlevélvadászat", "vízum kikönyörgése a követségen", "szállodai szoba stipi-stopi", "röpülőjegy megvásárlása" problémákra. Természetesen ezeket aztán újabb, még egyszerűbb feladatokra bonthatjuk, és ezt addig csináljuk, amíg eljutunk nagyon egyszerű feladatokhoz jutunk, amit aztán egyszerű lesz algoritmizálni is.
  • Nem árt némi intuíció, különösen akkor, amikor megpróbáljuk kitalálni, hogy mi lehetett a kedves kolléga fejében, amikor megszületett az a fantasztikus alkotás, amit éppen megpróbálunk kijavítani (ugyanez fordítva is igaz - szerk.).
  • Természetesen az sem árt, ha valamennyire tisztában vagyunk azzal, hogy hogyan működik egy számítógép. Ez azért nagyon fontos, mert a számítógépek és a szoftverek a legkomplexebb ember alkotta szerkezetek, amiből adódik, hogy a legtöbb hibalehetőség is itt van. És ugye tudjuk, ami el tud romlani, az el is fog.
  • Ha élesben is hasznát akarjuk venni a tudásunknak, akkor szükségünk lesz arra, hogy legyen rutinunk, ahogy bármely más szakma esetében is. Bármit meg lehet oldani programozással, de egyáltalán nem mindegy, hogy mennyi idő alatt. Ezt azért érdemes fejben tartani, mert van olyan eset, amikor nem szabad ész nélkül nekiugrani valaminek, és olyan is, amikor belekezdeni sem érdemes.

Persze a felsorolás nem teljes, de első körben én ezeket szerettem volna kiemelni.

Miért bonyolult programozni?

Ha elolvastuk az előző fejezetet, akkor úgy gondolhatjuk, hogy pofonegyszerű lesz belevágni a bitkukta bizniszbe. Sajnos a valóságban tényleg sokan így gondolják, ezért is van olyan sok kontár. Azonban van egy-két dolog, ami miatt mégsem lesz minden wannabeből jó fejlesztő.

  • Az előző fejezetben néhány egyszerű példával dobálóztam: állatok, emberek. Ezekkel tényleg nagyon könnyű dolgozni, hiszen ezek egyértelmű fogalmak, amiket nagyon egyszerű kategorizálni. Azonban a gyakorlatban nem ilyen egyszerű a dolog. Amikor fejlesztünk egy rendszert, akkor rengeteg mesterséges fogalmat alkotunk, amelyeknek nincs túl sok köze a valósághoz.
    Nézzünk egy példát (aki nem ismeri az objektumorientált programozás alapjait, ki is hagyhatja ezt a részt egyelőre). Létrehozunk egy mailsender nevű osztályt, amivel egy levél küldőjét akarjuk reprezentálni.  Itt máris felmerülnek kérdések. A valós világból modellezett rendszerben logikusnak tűnne, hogy a levelet ez az osztály küldje el, tehát ennek a felelősége, aminek az eredménye az lenne, hogy lesz egy "send" nevű metódusa. Azonban a legtöbb esetben ez csak egy adattároló osztály, ami nem csinál semmit, vagy ha igen, akkor sem ez vezérli a levél küldését. Ha saját magunk készítettük az osztályhierarchiát, akkor viszonylag könnyű értelmezni saját agymenéseinket, de ha más is beszáll a projektbe (ami ugye a gyakoribb eset), akkor könnyen bajba kerülhetünk...
  • A valóságban végbemenő üzleti (vagy akármilyen) folyamatok nem egyértelműek és a hozzájuk tartozó fogalmak nem hierarchikusak. Minden fejlesztő azt szeretné, ha a valóság logikus lenne, sőt, szögletes, tökéletes derékszögekkel, minden szépen szimmetrikusan elrendezve. De a környezet inkább a "folyamatosan változó káosz" kategóriába tartozik, és az nem fekszik kettes számrendszernek.
  • Az informatika önmagában értelmetlen, minden megoldható problémának valamilyen más területen végbemenő folyamathoz van köze (természetesen informatikai problémákat is oldunk meg informatikai eszközökkel, de ez most nem lényeges). Emiatt a fejlesztőknek mindenhez kell érteni egy kicsit, valamelyest ismernie kell azt a területet, amelynek dolgozik. Például, ha egy fejlesztőnek fogalma sincs arról, hogy mi történik egy raktárban (a "dolgokat tárolnak ott" az kevés), akkor nem fog használható rendszert készíteni egy raktárosnak soha. Sajnos sok programozó nem érzi magáénak ezt a gondolatot, nem tartják fontosnak, hogy megismerjék azt a folyamatot, amelyet informatikai környezetbe ültetnek. Átadás után meg persze kezdődik a hülyézés, a felhasználók szerint az átadott termék gagyi, a fejlesztők szerint meg az összes felhasználó hülye.
  • Szerintem kevés olyan rendezetlen káoszszakma van, mint az IT. Szabványból annyi van, mint égen a csillag. Legyen választék, az a fontos. A sikeres projektet aránya 10% körül van. Mindenre létezik keretrendszer, nem is egy, hanem ötszáz, és egyik se mondható tökéletesnek. Persze ettől még használhatóak, de általában elég nehéz eldönteni, hogy a keretrendszer nyűgjeinek kiismerése, vagy saját megoldás kifejlesztése visz el több időt.

Programozó-e leszek?

A válasz nem nehéz: igen, programozó leszel, ha akarsz, mert ez nem rocketscience. Azonban nem mindegy, hogy milyen. Sok ember vallja magát annak, miután rájött hogyan kell html-ben linkelni, és írt három sort phpben. De ez nem elég. Sokféle módja van annak, hogy rendes fejlesztő legyen belőled, de egyik sem gyaloggalopp. Szóval, harcra fel.
És még valami: ha van egyetemes jó tanács ebben a kérdésben, akkor az ez: mindig a felhasználó szemével nézd a programod. Egyébként szar lesz.

Folyt. köv.

Források:
Számítógép-programozás
Computer Programming
ROYAL PRECISION Electronic Computer PROGRAMMING MANUAL

Könyvajánlat:
Angster Erzsébet - Objektumorientált Tervezés és Programozás JAVA I. kötet

 




A bejegyzés trackback címe:

https://zsir.blog.hu/api/trackback/id/tr27500546

Trackbackek, pingbackek:

Trackback: Propeller 2008.06.24. 19:23:54

zsír - Ablak-zsiráf.cppAnnyi művészet van a programozásban, ahány fotómodell a női rögbicsapatban.

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

ultimA 2008.06.25. 13:18:22

Sztem pár dolgoról érdekes elképzeléseid vannak, kezdjük rögtön a "programozás" fogalmának meghatározásával. Az általad eltaláltnak ítélt leírás max. az algoritmizálásra igaz, ami bár része a programozásnak, de közel sem ugyan az. Az angol Wikipedia közelebb áll, de onnan meg tényleg kimaradt a "tervezés" fontos kulcsszava a felsorolásból.

Az sem tiszta, milyen fényben akarod feltüntetni a programozást? A programozás önmagában valóban nem rocketscience, de mellette egyes területeken rocketscience ismeretekre van szükséged. Mély elméleti és gyakorlati ismereteket kíván egy szimulációs program írása, egy mikrokontroller felprogramozása, vagy egy mesterséges "intelligencia" megvalósítása.

Egy pár pontodban lefektetett elmélet meg, mondjuk úgy, vitatható. Objektumorientált kódban a "mailsender"osztály ne küldjön levelet? Akkor nem csak a névválasztás rossz az osztály számára (ami rossz tervezésre utal), hanem ha egyszerű adattároló, akkor mi ebben az objektumorientált?

Aztán szerinted a programozásnál azért szükséges a gép működésének ismerete, mert az gyakran hibázik/elromlik? No komment. Te milyen területen programozol, hogy más okod nincs a gép működésének ismeretére?

Az "egyetemes" jótanácsod, "fejlessz a felhasználó szemével", meg csak akkor egyetemes ha alkalmi megrendelésekre készítesz végfelhasználói célprogramokat. Az én tanácsom: gyakorolj, gyakorolj és gyakorolj.

Raszputyin · http://zsir.blog.hu 2008.06.25. 14:00:58

Eltér a véleményünk néhány dologban.

Az algoritmizálás valóban jobb szó a kiválasztott definícióra, de az algoritmizálás után már csak az marad hátra, hogy megfogalmazd az algoritmusodat egy tetszőleges programnyelven, ami - ha jó az algoritmusod - akkor elég mechanikus munka. Persze tesztelned és debugolnod is kell, de az már gyakorlati kérdés inkább, ez egy elméleti definíció. A lényeg, hogy nem Hello World-del, vagy a bekapcsoló gomb megnyomásával, és még csak nem is a strukturált és objektum orientál kifejezések megértésével kezdjük a tanulást, hanem néhány alapvető fogalom megtanulásával.

A második pontban igazad van, csak nem értem ez hol mond ellent az általam leírtaknak. Pusztán a programozáshoz némi általános iskolai szintű matematikai tudásra és egy nyelv és a hozzá tartozó függvénykönyvtár ismeretére van szükség. Ez nem rocketscience, atombombarobbanást szimulálni már az.

A mailsender csak egy példa (bár nem a legjobb) volt egy gyakori problémára. Hogy a tervezés rossz vagy az osztály elnevezése az, ez már tyúk-tojás probléma.

Nyilván nem csak azért szükséges a gép működésének ismerete, hogy könnyebb legyen a hibakeresés, azonban a gyakorlatban ezen a területen van a szükséged legjobban erre a tudásra. Ha egy magas szintű nyelvet használsz, mi szükséged van arra, hogy tudod, hogy a mov utasítással lehet adatot pakolni a regiszterekbe, vagy hogy hogyan működik a hardveres megszakítás? Viszont ha látsz egy olyan hibát, hogy stack overflow, akkor már nem árt, ha tudod, mi az a stack.

Az utolsó felvetésed számomra abszolút fals. Nem csak az egyéni megrendelések esetén kell figyelembe venned az ergonómiai kérdéseket, hanem minden egyes szoftver készítésekor, hiszen azért születnek szoftverek, hogy valaki használja őket. Én úgy látom, hogy általánosságban az ergonómiai gondok a legtipikusabbak manapság. Persze a te tanácsoddal is nagyon egyetértek, minél több kardot kovácsolok, annál jobb lesz a következő.

Geri_lgfx · http://sfgsfg.sfgsfg.hu 2008.06.28. 00:26:57

Ja, hogy a programozás nem művészet? Hát akkor a demoscene mi?

Raszputyin · http://zsir.blog.hu 2008.06.28. 15:40:45

:) Attól, hogy bútorokat lehet művész igényességgel készíteni, attól az asztalosok nem művészek. A demoscene a programozás művészi módon űzve

Szibarita 2008.06.29. 12:29:49

Az asztalosok kozul az igazan jok pont ugy muveszek, mint a programozok kozul az igazan jok. Muveszet, tanithatatlan.

Valaki vagy jo programozonak szuletik, vagy mindig maximum kozepszeru marad.

Tibor 2008.07.01. 15:12:25

Erre reagálnék: "Például, ha egy informatikusnak fogalma sincs arról, hogy mi történik egy raktárban (a "dolgokat tárolnak ott" az kevés), akkor nem fog használható rendszert készíteni egy raktárosnak soha. Sajnos sok fejlesztő nem érzi magáénak ezt a gondolatot, nem tartják fontosnak, hogy megismerjék azt a folyamatot, amelyet informatikai környezetbe ültetnek."
Ez így nagyon általánosítva van, ezért nem állja meg a helyét.
Az informatikus rettentően általános fogalom, és sok informatikusra (pl. fejlesztő) nem kell igaz legyen az állításod, ugyanis ők már egy másik informatikus (pl. rendszertervező) által jól megfogalmazott informatikai feladatot kell megoldjanak (pl. raktárkészlet kiszámítása).
Egy ideális környezetben a megfelelő informatikai szakemberek a raktárosokkal közösen megtervezik a rendszert. Ez a terv a felhasználói igényekre épül és koncentrál.
Ezt a tervet további informatikusok egy sokkal konkrétabb technikai tervre fordítják le. Ez a terv már a technikai részletekre és megoldásokra koncentrál.
Ezen terv alapján újabb informatikusok fogják elkészíteni a végterméket, ám ennek a kivitelezése során már nem létfontosságú a raktári folyamatok ismerete, hiszen a legtöbb fejlesztő csak a folyamat egy kis részével találkozik, és max. a sajátjával közvetlenül összefüggő modulokat kell ismerje (pl. ha valaki egy webszervizt fejleszt akkor nem kell ismerje az összes klienst, bőven elég az interfész definícióját ismerni, és fordítva is igaz, aki egy weboldalt épít egy webszervizre, annak nem kell ismernie a webszerviz belső felépítését).
További informatikusok a tesztelők, akik szintén a legelső, magasszintű terv alapján dolgoznak, abból készül a tesztterv. Nekik is nagyon fontos ismerni a felhasználókat és a folyamatokat, hiszen minél életszerűbb a tesztelés annál jobban megtalálják a hibákat.
Pl. aki jól ért a képfeldolgozáshoz az nem kell tudja, hogy a kódját orvosi vagy csillagászati szoftverben használják, elég annyi, hogy mit kell csináljon a kódja. Sok esetben az is előfordul, hogy ugyanaz a kód sok, egymástól nagyon eltérő alkalmazásban van használva.
Dióhéjban ennyi, érdemes lenne bővebben és értelmesebben kifejteni ezt a témát (is).

Raszputyin · http://zsir.blog.hu 2008.07.01. 15:25:46

Tibor

Abban igazad van, hogy az informatikus túl általános, ki is fogom javítani a szövegben fejlesztőre. Amit leírtál az jó, de csak lenne, mert ez csak elméletileg, a gyakorlatban (általában) nem egészen ilyen kifinomult a folyamat. Én igenis beültetném a fejlesztőket egy-két napra abba a munkakörbe, amihez szoftver készít, mert egyrészt a specifikációk, amiket a megrendelők, vagy a nem fejlesztő informatikusok készítenek rosszak és pontatlanok, másrészt akármit is csinál a szoftveren látnia kell, hogy mi az értelme az egésznek, mi a business goal. És azt is látnia kell milyen felhasználói lesznek, azok mit használtak idáig (papír, régi szoftver) és hogyan.
Később persze minden ki lesz fejtve részletesen, ez csak a bevezető volt :)

 

 

 

süti beállítások módosítása