Portretul expertului la 30 de ani

Dupa ce a excavat problemele incrementarii si interschimbarii variabilelor, Silviu “Virgula” Ardelean a tras o flegma strasnica in palma, a pus mina pe tirnacop si a lovit din nou in programare. Gaura ce s-a cascat cind virful uneltei a interactionat cu realitatea i-a aratat o lume cu totul noua, pe care n-o mai intilnise pina atunci in cariera sa: lumea fisierelor.

La capatul a 9 ani de succese si progres continuu, Silviu a fost nevoit pentru prima data sa afle dimensiunea unui fisier. Un perfectionist ca el are datoria morala de a utiliza numai solutii optime, dar sa nu credeti ca atunci cind le descopera, le tine doar pentru el. Nu. Silviu este in primul rind un Invatator, o persoana care nu s-ar da inapoi de la nimic pentru a se asigura ca si ceilalti programatori care au nevoie sa incrementeze variabile sau sa afle cit de mari sint fisierele stiu cum se face asta optim. Si cine stie, poate intr-o zi, daca scrie suficiente articole d-astea de indrumare, va primi si el o diploma d-aia de Invatator Microsoft cum au prietenii lui (link-ul duce la Wikipedia deoarece momentan pagina oficiala a Invatatorilor nu merge, probabil intr-un gest de solidaritate cu Ronua, care fiind site-ul unora care fac site-uri, merge cam 2 zile pe saptamina).

Pilda de azi poarta titlul File size fast detection si a fost inscrisa in ceaslovul tehnic al marelui formator de programatori. In textul sau se vorbeste despre multitudinea de optiuni prin care un programator putin naiv (naiv pentru lumea in care traim), asa cum a fost si Silviu odata, ar putea sa-i puna calculatorului intrebari despre “una din cele mai importante proprietati” ale unui fisier: dimensiunea sa. Inarmat cu legendara sa inteligenta, Silviu isi croieste drum prin acest adevarat hatis de functii, si ajunge la urmatorul cod:

long GetFileSize(const TCHAR *szFilePath)
{
   long nSize = -1;

#ifdef WIN32
   struct _stat buf;
   nSize  =  (_wstat( szFilePath, &buf ) == 0) ?
      buf.st_size : -1;
   if (S_ISDIR(buf.st_mode)) nSize = -1;
#else
   struct __stat64 buf;
   nSize  = (_wstat64( szFilePath, &buf ) == 0) ?
      buf.st_size : -1;
   if (S_ISDIR(buf.st_mode)) nSize = -1;
#endif

   return nSize;
}

Haideti sa incercam sa deslusim impreuna vorbele duhovnicului-ortac, ca si cum am fi la un codecamp. In primul rind, el ne spune ca:

there are a lot of API that allows finding this property, but major needs additional file operations: open file, find file size and close file.

Asa ceva nu-i acceptabil. Daca maiorul are nevoie sa deschida fisierul, minerul va cauta o alternativa. Si tot cautind el, a dat peste _wstat(), care nu are aceleasi nevoi ca perversul maior, deci e “fast”. Dat fiind gradul avansat de analfabetism pe care-l manifesta indrumatorul nostru, e greu de spus la ce s-a referit exact cind a spus “fast”. Probabil se gindea la timpul de executie, un subiect drag inimii lui, caz in care ma declar profund dezamagit de faptul ca tocmai el, un cititor autoproclamat al surselor STL-ului (in care e expert de 9 ani, sa fie clar), n-a citit sursele CRT-ului, acest Vechi Testament al programarii. Ca si in adevaratul Vechi Testament, unde Doamne-Doamne bea in fiecare dimineata laptic plus dupa care isi scoate evreii la un meci de ultra-violenta cu restul Creatiei, CRT-ul ne dezvaluie ororile lui _wstat(), care isi petrece o buna bucata din zi extragind si procesind date care n-au nici o legatura cu dimensiunea fisierului. Fast indeed.

Sigur, dupa cum ne-am invatat deja, Silviu nu greseste niciodata, motiv pentru care ii este si foarte usor sa-si recunoasca greselile cind e cazul. Riposta lui la defaimarea din paragraful anterior va fi ca prin “fast” vroia sa spuna “putin de scris”, deci e “fast” de dezvoltat aceasta functie de o importanta capitala, pe care trebuie s-o dezvolti de sute de ori pe zi cind ai 9 ani de experienta in C++. O solutie care sa foloseasca FindFirstFile() ar incetini dramatic viteza cu care Silviu zboara prin cod la multinationale, pentru ca ar avea o intreaga linie in plus pentru inchisul handle-ului.

Totusi, partea cu adevarat savuroasa din codul asta nu e cit de “fast” sau “nefast” e apelul la _wstat(), ci #ifdef-ul ala cu WIN32. Uitati-va bine la el, caci cu greu se poate gasi un exemplu mai concis al incompetentei minerului. In primul rind, e vorba de incompetenta la nivel practic: Silviu habar n-are ca macro-ul ala e definit implicit prin setarile proiectului si in configuratiile de 64 de biti, deci partea a doua n-o sa se compileze niciodata (eventual doar pe platforme diferite de Windows, care din pacate n-au _wstat64() deloc). El se va apara spunind ca “n-are un compilator in cap”, cum a mai facut-o. Intr-adevar, este un efort supraomenesc ca inainte sa postezi niste gunoi pe internet, sa incerci sa-l compilezi ca sa vezi daca merge, sau sa te uiti in MSDN la cum se diferentiaza build-urile de 64 de biti de alea de 32.

Si mai misto decit necunoasterea acestor lucruri practice de catre un expert cu 9 ani de multinationalism in spate este logica gresita care a stat la baza testului aluia cu #ifdef. In capul minerului, functia _wstat64() este inseparabila de un OS pe 64 de biti. Daca ai OS pe 32 de biti, dimensiunea fisierelor se tine pe 32 de biti. Daca e pe 64, se tine pe 64. Este imposibil, inuman si imoral sa ai un fisier mai mare de 2 GB pe un OS de 32 de biti (macar daca returna un tip unsigned, sa aiba limita la 4 GB, dar nu s-a putut). Un asemenea fisier i-ar provoca lehamite lui Silviu si l-ar determina sa scrie un post despre el pe blog-ul de atitudine, sub tag-ul “demagogie“.

Minerul e abonat la blog-ul nostru si timpul sau de reactie este de ordinul minutelor. Deindata ce va citi ce-am scris aici, expertul isi va folosi cunostintele acumulate cu sirg in aia 9 ani pentru a intreba in stinga si-n dreapta cum sa corecteze timpenia pe care a scris-o. Dupa ce va repara codul de pe blog (uitind sa mentioneze cine i-a pus iar vagonetul deraiat inapoi pe sina, cum a mai facut), va corecta si in softul la care lucreaza pentru Bitdefender, unde probabil ca tocmai a scris abominatia aia. Imediat dupa aia o sa dam mail la Bitdefender sa le cerem bani pentru training-ul pe care il facem de citeva luni bune cu programatorul lor “senior”, expert in C++, STL, CRT si Visual Studio si – speram cu totii – viitor MVP.

Advertisements

5 Responses to “Portretul expertului la 30 de ani”

  1. comentariu pe blogul lui silviu: Ok, but because of long type limit, your file must be smaller then 2GB.

    Silviu: Absolutely. Nobody stops you to replace long with long long or unsigned long long.

    epic

  2. thefatredguy Says:

    Citez : ” the CRT run-time library’s function _wstat64() and staff”. And staff ? WTF is that ? Maiorul si staful sau ?

  3. jos8cal i-a sugerat deja sa foloseasca goagal translate in loc sa isi bata el capul, dar vezi ca nu vrea sa ne asculte. Tocmai am bagat articolul original de pe codexpert in goagal si a iesit mai bine decit ce-a produs el.

    Din pacate vad ca a disparut maioru’. Probabil in curind va disparea si staff-ul lui, din cauza ca l-ai mentionat. Dar e important de luat aminte ca in continuare recordul lui de 0 greseli se mentine neintinat.

  4. @thefatredguy: oare nu “stuff” a vrut sa scrie? :))

  5. Eu i-am zis de google translate dar el a inteles ca eu folosesc tool-uri automate. Citez: “Voi, frustraţilor, folosiţi tool-uri automate al căror rezultate le luaţi de bune”. Once a retard, always a retard.

    Si la rata cu care-si modifica codul dupa cum cintam noi o sa ajunga la vorba unui amic: “la o adica o sa zica ca traindinromania nu e a lui, e un site facut de haters ca sa-l scoata nebun”

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: