Profi, mégis szar
Az áldást sodika küldte 2009. május 11., hétfő - 21:31-korCímkék: php programozas szamitogep
23 komment
Programozásról lesz szó.
Ha ez téged nem érdekel, ugord át a bejegyzést. :)
Egyik haverom éppen mostanában fáradozik egy bizonyos vállalkozási célra megvásárolt PHP alapú rendszer beüzemelésével, azonban szomorúan volt kénytelen konstatálni, hogy a drága pénzen beszerzett cucc bár a várakozásait túlszárnyalva valósítja meg az általa igényelt funkciókat, akad benne néhány zavaró hiba.
Anélkül, hogy a Magyarországon úttörőnek számító megoldásról idő előtt kényes részleteket árulnék el, annyit elmondhatok, hogy az adott AJAX alapú cucc a látogatókat versenyezteti bizonyos szempontok szerint, majd pedig a gyorsaságuk alapján rendezi őket sorba.
A rendszer a képernyő egy külön területén jelzi ki, hogy melyik felhasználó vezet, valamint egy másik területen, hogy korábban miként alakult a sorrend. Ez a két képernyőterület (a lista és az azt vezető felhasználó kiírása) az esetek többségében tökéletes szinkronban van, azonban ha egyszerre többen is kattintanak, akkor néha elcsúsznak egymáshoz képest az adatok, és az egész cucc egy olyan hibás állapotba ragad be, mely kijelentkezés után is megmarad.
Haverom engem kért meg, hogy járjak utána, mi lehet a gond, mert ő nem ért hozzá.
Oké, mondom, nézzünk rá. Van egy gomb, meghív egy JavaScript függvényt. Rendben, hol van az a függvény? Négy különböző .js fájlt is behív a fejléc. Nézzük csak meg, melyikben definiálják a kérdéses függvényt. Ez is megvan, öröm, boldogság. Függvényünk létrehoz egy AJAX (XMLHttpRequest) objektumot, amit ráereszt egy bizonyos PHP-ra. Na, itt kezdtem el jegyzetelni, hogy ne zavarodjak bele a hierarchiába. :) Szóval van az Ajax objektum által meghívott PHP rengeteg egymásba ágyazott feltételfüggő (if {}) résszel. Ha egyszerre hatszáz dolog összeáll, akkor ez lefuttat egymás után egy csomó frissítő meg hozzáfűző MySQL lekérdezést.
Na, itt kezdtem el vakarni a fejem.
Vajon mi a ványadt fenéért írja be a cucc egyszerre ugyanazt több táblába is? Mi értelme van külön tárolni a listát vezető felhasználó adatait és magát a listát? Van-e valami konkrét funkció, ami indokolja ezt a redundanciát? Végül arra jutottam, hogy nincs itt semmi mélyebb megfontolás, egyszerűen egy koncepciótlan láma a fejlesztő.
A koncepció hiánya már abban is világosan megmutatkozott, hogy látva az egymás alatt sorban meghívott lekérdezéseket még nekem is az volt a legelső kérdésem, hogy mindez szép és jó, de vajon mi történik, ha egyszerre többen kattintanak a folyamatot elindító gombra a weblapon, vagyis ezáltal egy időben többen is lefuttatják az azt kiszolgáló PHP kódot? Ebben az esetben nyilván az történik, hogy az egyes meghívásokban szereplő SQL utasítások jó eséllyel összekeverednek. Az első fele az első felhasználó adataival hajtódik végre, a második fele a második felhasználóéval, végeredményként pedig megkapjuk a hibát: nem lesz szinkronban a lista és az azt vezető felhasználót tároló adatrekord.
Innentől a jelenség kijavítása természetesen egyszerű ujjgyakorlat. A szóban forgó lekérdezésekkel érintett táblákat átalakítottam MyISAM formátumból tranzakció-biztos InnoDb formátumba, a különálló SQL utasításokat pedig egységbe foglaltam, vagyis BEGIN WORK és COMMIT utasítások közé helyeztem őket.
Láss csodát: volt hiba, nincs hiba.
Hogy miért írok erről külön bejegyzést?
Azért, mert ezzel most érdekes felfedezésre jutottam. A szóban forgó rendszer ugyanis a maga több ezer soros kódjával bár kétség kívül egy szorgos munkával összerakott projekt, amely egy darab felhasználóval tesztelve a professzionális kivitelezés látszatát kelti, de ennek ellenére olyan, a fentiekhez hasonló szarvashibáktól hemzseg, melyeket magam azért nem követnék el soha az életben, mert már a kezdetekben alapvető evidenciaként tanultam meg, hogy ügyelni kell ezekre a részletekre, ha nagyobb tömeget is ki akarunk szolgálni.
Akárki is készítette ezt a rendszert, legfeljebb kódolni tanult, de programozni soha.
Hasonló ez ahhoz a szituációhoz, mint amikor egy bizonyos, a webfejlesztés alapelveivel a jelek szerint szintén csak a saját tévhite szerint tisztában lévő kopasz blogger több felhasználói visszajelzés alapján eredetileg olyan blogrendszert fejlesztett a közössége számára, mely a bejelentkezett felhasználók jelszavait mindenféle titkosítás nélkül rakta ki sütibe (cookie). Már az is kiröhögni való megoldás, ha valaki teljességgel mellőzi a jelszavak hash-elését, de hogy ezt oda-vissza küldözgesse a felhasználó között, és még sütibe is írja, már tényleg a technikai kabaré netovábbja.
Mégis, a most általam kijavított PHP alapú rendszer fejlesztője akár több hónap kitartó munkájával összehozott valamit, melyhez nekem nem biztos, hogy lenne megfelelő türelmem, és ügyes üzleti érzékkel sikeresen áruba is bocsátotta.
Ami igazán meglepő számomra, hogy én, aki mindig is következetesen tartózkodtam attól, hogy úgymond informatikusnak nevezzem magam (csupán azt írtam le, hogy több megszerzett végzettségem elnevezésében benne van ez a szó, valamint hogy a folyamatban lévő egyetemi szakjaim többségének nevében úgyszintén szerepel) rendszeresen olyan megoldásokkal és megnyilvánulásokkal találkozom magukat magabiztosan informatikusnak és szoftverfejlesztőnek tituláló, de a valóságban szakmailag a nyomomba se érő emberek részéről, melyeket én soha nem követnék el, illetve amelyek láttán csak a fejemet fogom kínomban.
A lelkes amatőrök magabiztossága ennyit számítana az érvényesülés szempontjából? Mert ha igen, akár én magam is felhagyhatnék az eddigi tudatosan sugárzott szerénységgel, és istencsászárként pozícionálhatnám magam. xD
Mér' is ne, baszáj? Ennyi erővel. ;P
By SoDI





Eddig 23 komment érkezett (
)
2009. 05. 11. 21:51
1. Igazad van, láma volt a kódoló.
2. Aki nem dolgozik, az nem is hibázik.
2009. 05. 11. 22:06
Ha annyi külsős által készített sz@rt kéne gatyába ráznod állandóan, mint nekem, akkor ilyeneken meg se lepődnél :)
2009. 05. 11. 22:08
Az se mindegy, az ember kitől vásárol szoftvert.
Normális helyeken pl. garancia is jár. Nálunk például egy évre.
2009. 05. 11. 22:08
De vazz, a csávó ezt a rendszert több száz dollárért árulja :))
2009. 05. 11. 22:11
Hát, nem is lesz neki túl jó ajánlólevél ... :)
2009. 05. 11. 22:25
"tudatosan sugárzott szerénység"
Sodi, te a büdös életben nem voltál szerény.... :D
2009. 05. 11. 22:33
Ha konkretan megmutatod a tablak felepitest, megmondom miert olyan az adatabzis, amilyen. Az amit eddig leirtal abban nincs eleg informacio, csak sok ondicseret, hogy milyen okos vagy.
"Vajon mi a ványadt fenéért írja be a cucc egyszerre ugyanazt több táblába is? "
Attol fugg, mi az az ugyanaz. Lehet, hogy a tablak 3NF-ben (3-as normalforma) vagy esetleg BCNF-ben (Boyce-Codd normalforma) vannak, ami adott esetben novelheti a rendundanciat a tablakban, viszont csokkentheti a tablak meretet, ami nagyon fontos hatekonysag novelo lehet pl. join muveletnel vagy tablaszorzasnal, vagy barmilyen mas muveletnel.
2009. 05. 11. 22:37
"esetleg BCNF-ben"
Ez tényleg lehet egy lehetséges magyarázat.
Ennyire nem ástam bele magam a rendszerbe. :)
2009. 05. 11. 22:40
Az sem igaz, hogy utasitasok egy halmazat mindenkeppen tranzakcioba kell tenni, hogy az adatbazis konziszens maradjon.
2009. 05. 11. 22:53
sodika: milyen rendszer ez? link plz
2009. 05. 11. 23:03
9-es. Ja, lehet utólagos ellenőrzést is beilleszteni.
Csak az még egy plusz lekérdezés.
k0zi: Á, amíg nem indul el a weblap, üzleti titok, hogy pontosan miről van szó. :)
2009. 05. 11. 23:07
Milyen SQL szerverre írták? (hivatalos req)
2009. 05. 11. 23:11
Lehet, hogy négyesre írták, és csak az ötösben van tranzakciókezelés? Hmmm. Szerintem van a négyesben is. Vagy nincs?
2009. 05. 11. 23:17
sodika: olyanra gondoltam hogy ha req az oracle, abban van autocommit on kapcsoló és lehet azzal nem jönnek elő ezek a hibák :)
2009. 05. 11. 23:19
"9-es. Ja, lehet utólagos ellenőrzést is beilleszteni.
Csak az még egy plusz lekérdezés."
Meg az sem kell a legtobbszor, irj egy peldat, amikor szerinted elromlik az adatbazis attol, hogy felvaltva hajtodnak vegre utasitasok. Olyat, hogy eppen jon az aramszunet most ne irj.
"Az első fele az első felhasználó adataival hajtódik végre, a második fele a második felhasználóéval, végeredményként pedig megkapjuk a hibát: nem lesz szinkronban a lista és az azt vezető felhasználót tároló adatrekord."
Tehat erre mondj egy peldat vagy esetleg ird le, abban a programban, amit neztel, ez hogyan mukodik.
2009. 05. 11. 23:23
k0zi: MySQL-re írták.
15-ös: Ezt már leírtam. Úgy "működik" a hiba, hogy rendben frissül a lista, de mást jelez ki ennek vezetőjeként a másik képernyőterületen, mint aki valójában vezeti, holott ennek a két dolognak szinkronban kellene lennie egymással.
2009. 05. 11. 23:27
Ne arcoskodjál öcsém még programozót sem láttál életedben nemhogy programot. Nehogymár előadd magad itt ajax-al meg php-vel me mysql-el mert felruglak mit paraszt a lószart. Hülyegyerekek szórakoznak evvel a hányással. Na most kiállítottad a szegénységi bizonyítványod. Fasszom idióta.
2009. 05. 11. 23:34
Szerintem nincs ebben semmi extra. Sajnos a legtöbb kollega semmilyen formában nem figyel oda a tranzakciókezelésre, én is rengeteg kódot láttam már ami gány. Nekem csak az az érdekes, hogy ez miért érdemel egy ekkora bejegyzést? Sztem 5 sorba le bírtad volna írni, így meg született megint egy önajnározó cikk.
2009. 05. 11. 23:46
Hülye ez a gyerek vazze. Az adatbáziskezelő rendszer sorba rendezi a processzeket ezek átlag 3 ezred másodperc alatt lefutnak. Mi a faszom befolyással lenne a tranzakcióba fogás bármire? Miért vissza kell görgetni a tranzakciót? Izolációs szintek kellettek hogy lefusson a kérés? Mer az gyorsabb? Na fiam te se laszel már hülyébb.
2009. 05. 11. 23:50
A belenyúlás megoldotta a problémát? :)
2009. 05. 12. 0:36
19-es: Ne legyél okosabb a tapasztalatnál. :)))))
Én LÁTOM, hogy ez megoldotta a problémát.
2009. 05. 12. 1:00
Na jó, egészen pontosan fogalmazva:
Közöltem haverral, hogy szerintem meg van oldva a probléma, azóta tesztelgeti, és nem jelezte vissza, hogy még mindig hibás lenne a cucc. :)
2009. 05. 12. 9:16
19: Ha így lenne, akkor a LOCK-ot szerinted minek találták fel?
Mondj valamit
Nem regisztrált felhasználóknak hozzászólni csak rendes e-mail cím megadásával lehet.
A szövegben nem lehet HTML-t használni, a linkeket pedig automatikusan aláhúzzuk. Az email cím megadása kötelezõ, de az oldalon nem jelenik meg. Ha van freeblogos felhasználóneved, itt bejelentkezhetsz.