O noua propunere

Posted in Premiul n00bel on March 20th, 2011 by Mihnea

Zarva mare in comunitatea expertilor, caci 0ptr iar e pus pe sotii. Dupa ce s-a lamurit cu Regula 0 a codului portabil, a revenit cu o intrebare parca special facuta pentru a-l activa pe Silviu Virgula Ardelean: cum ati implementa atoi()?

Intrebarea asta e pentru miner ca un laser pointer pentru o pisica: irezistibila. Silviu traieste pentru momentele astea, cind cineva pune o intrebare banala si el crede ca stie raspunsul, pentru ca ii permit sa-si afirme si sa-si confirme statutul de connaisseur. Cu serotonina refulind prin nas si urechi, el a atins duios tastatura si a scris cuvintele ce-i sint atit de dragi: Eu propun urmatoarea implementare.

Propunerea nu dezamageste. Prin truda afunda, ortacul scoate din abataj o noua floare de mina desavirsita, un memento al zbuciumului ce-i cuprinde fiinta de fiecare data cind se vede pus in fata unei masini de scris automate. Dat fiind ca el n-are un compilator in cap, o sa fac eu pe compilatorul si voi incerca sa descifrez linie cu linie ce se petrece in mintea greu incercata a unui miner cu 9 ani de experienta in C++.

bool isNegative = (*pChar == '-') ? true : false;

Ostilitatile incep in forta. Silviu nu are incredere in compilatoare si alte “tool-uri automate”, asa ca foloseste operatorul ? pentru a converti true la true si false la false. Asta e doar pasul 1 din planul lui. Cind va implini 10 ani de experienta in C++, isi va autoimpune sa transeze definitiv problema bool-ului prin urmatoarele tipuri de constructii:

bool a = true ? true : false;
bool b = false ? true : false;
if( ((true == a ? true : false) || (false == b ? true : false)) ? true : false)
    a = b ? true : false;

Urmeaza o prima trecere prin string, cu scopul de a verifica daca instructiunile de branch ale procesorului functioneaza corect sub stres:

while (*pChar != '\0')
{
   if ((isNegative && length == 1 && (*pChar != '-') && (*pChar < '0' || *pChar > '9')) ||
      (length > 0 && (*pChar < '0' || *pChar > '9')))
         break;

   length++;
      pChar += sizeof(char);
}

If-ul asta e reprezentativ pentru miner. In opinia lui, “loop-ul ala e un ‘strlen()’ mai special”. Da, special ca aia care baga cubul in gaura rotunda. Pe Silviu nu l-a dus capul sa incrementeze pointerul ala nenorocit daca string-ul incepe cu minus, dar el e puternic, asa ca a impins cit a putut de tare cubul si pina la urma a intrat in gaura. De asemenea, observam citeva reguli de stil bine conturate: ultima linie din bucla se indenteaza suplimentar, si se pun paranteze doar in jurul expresiilor care implica operatorul !=. length == 1 nu are nevoie de paranteze, dar *pChar != ‘-‘ are.

E important de observat si cum aduna Silviu sizeof(char) la pointer. Minerul a facut asta crezind ca e “best practice” sa fii explicit, ca nu stii cind treci la Unicode si trebuie sa aduni sizeof(wchar_t). Da, el habar n-are ce-i ala pointer arithmetic si chiar crede ca daca pChar era pointer la wchar_t, acolo trebuia sa adune mai mult de 1.

Ajungem, insa, la partea cu adevarat epica din cod, pe care o reproduc integral:

while (length > 0)
{
  decimal = 1;
  if (isNegative)
  {
     if (!isFirst)
     {
        length--;
        if (0 == length)
           break;
     }

     isFirst = true;
  }

  for (int i = 1; i < length; i++)
     decimal *= 10;

  ret_val +=   decimal * (int(*(pChar - length) - '0') % 10);
  length--;
}

Stiti cind ziceam ca ifdef-ul ala cu WIN32 e chintesenta incompetentei lui Silviu? Ei bine, bucla asta nu e la fel de concisa, dar tot e un imn al prostiei de o frumusete rar intilnita. Te astepti de la Silviu sa nu fie in stare sa faca atoi() intr-o singura trecere prin string, dar nici in cele mai umede vise nu speram sa ne ofere un asemenea festin al retardarii. Intii si intii, observam revenirea unui design pattern intilnit si in prima bucla: si asta verifica la fiecare iteratie daca a inceput. Ortacul nu e in stare sa scoata muia aia cu semnul in afara buclei, asa ca tot verifica daca bucla lui face ce fac buclele, si anume daca a reusit sa treaca la a doua iteratie.

Partea misto incepe insa dupa confirmarea abilitatii procesorului de a incrementa numere. Minerul a reusit sa faca atoi() in timp patratic. Dupa cum a mai demonstrat, el e un om simplu, deci prin definitie nu se preocupa de complexitate, dar ma surprinde iar in mod nespus de placut calculind exponentul ala in fiecare ciclu. Incercati sa va imaginati cum ar trebui sa decurga procesul deductiv prin care ajungi sa faci asa ceva. Eu n-am reusit. Voi va dati seama ca asta asa programeaza zilnic, la job? Si ca cineva ii da bani pentru ca sa scrie cod d-asta?

Ca sa incheie apoteotic, intii si-ntii mai arunca o sfidare in ochii compilatorului punind un cast explicit la int, spunindu-i parca “uite ba, iar fac eu treaba ta pentru tine”, dupa care baga un mod ca un chef care pune delicat cireasa in virful celui mai frumos tort pe care l-a facut pina acum. Pai de ce sa beneficieze doar partea booleana de verificari cu operatoru’ intrebare, si aia aritmetica nu? Ortacii programeaza defensiv, ca nu stii cind 9 se face brusc mai mare ca 10 si trebuie sa iei atitudine. De acum incolo, codul lui Silviu va fi de 3 ori mai sigur si mai conform cu standardele MISRA (despre care minerul a auzit linga automatul de cafea cind lucra la xerox la Siemens), caci aritmetica se va face in felul urmator:

pChar += sizeof(char) % 2;
int bytes = mb * (1024 % 1025);
int bits = bytes * (8 % 10);
int doi = 2 % 3;
int unu = 1 % doi;
for(int i = 0; i < size % (size + 1); ++i)

Ortacul si-a pregatit deja apararea: “nu are nimeni pretentia variantei perfecte”. Sa inceapa corecturile, deci.

LE: minerul a si dat prima replica: si-a editat al doilea post din thread si a scris ca patrujdoi sint eu, intr-o noua iesire de Poirot. Simt ca toata munca de reeducare pe care am dus-o aici tocmai s-a dus pe pula. A ajuns din nou sa creada ca eu sint jos8cal, 0ptr, patrujdoi si toti ceilalti care i-au aratat vreodata ca-i prost. Silviu se simte ca-n Matrix, el singur incojurat de o armata de eu. Pentru a doua oara intr-o singura zi s-a inundat de serotonina cind a putut face niste corecturi in codul lui patrujdoi, crezind ca ma corecteaza pe mine. Va dati seama ca a avut orgasm crezind ca m-a prins in sfirsit cu o greseala.

 

Tags: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Curatenie de toamna

Posted in Regula 0 on September 20th, 2010 by Mihnea

Ca orice om care recunoaste ca-si recunoaste greselile, Silviu Virgula Ardelean a fost foarte ocupat in ultimele zile sa-si spele pe furis imaginea online, care in momentul de fata e un pic sifonata. Dupa ofensiva raportata intr-un post anterior, in care un brainstorming al AXTI l-a ajutat sa-si corecteze micile scapari legate de map-uri plus alte citeva detalii d-astea care nu stirbesc cu nimic maiestatea lui de lucrator la cea mai emblematica multinationala, Silviu si-a indreptat subtilul tirnacop spre alte doua intimplari din trecut.

Intii si-ntii si-a editat “optimizarea” pe care o pomeneam aici. In codul original ii scapase degetul aiurea si copia memoria doar daca nu era nimic de copiat. Acum a corectat comparatiile alea care erau gresite doar din neatentie, dar a lasat aberatia principala, aia cu sizeof. Intr-unul din multele paradoxuri ce asezoneaza comunitatea expertilor, desi programa deja de ceva vreme staturi de plata emblematice la multinationala, expertul nostru in masini de scris automate si recunoasterea greselilor avea o dilema de incepator. Din pacate el nu a putut sa-si falsificerecunoasca si greseala mai mare, deoarece se discuta mai departe despre ea in thread-ul ala. Observam ca post-ul nu apare ca editat, cum se intimpla daca un muritor de rind incearca sa pacaleasca trecutul, semn ca Silviu a apelat la Luminatorii AXTI pentru a-si spala pacatul.

Proaspat posesor al unui tecut cu 0.47% mai curat, Silviu a decis sa mai cizeleze un pic si post-ul ala despre a carui evolutie am vorbit pe larg mai demult. Dupa ce a fost de neclintit in decizia lui ca jos8cal si cu mine sintem aceeasi persoana, aducind ca argument faptul ca nu crede ca are fata de prost, el tocmai a trecut la a 5-a varianta de titlu pentru mult iubitul post, de data asta la plural: Mitocanilor. Acum a schimbat si URL-ul (inainte uitase si lasase mai-jegule.html desi ajunsese cu titlul la “Mitocanule”), asa ca voi mistifica si eu trecutul reparind link-urile din post-urile de aici, ca sa nu se piarda saga. In noul text el vorbeste degajat despre doi agresori, de parca n-ar fi sustinut energic de multiple ori la tribuna codexpert faptul ca noi doi sintem unul singur, cu multe conturi menite sa-l bage pe el in ceata. El n-are fata de prost, daca va amintiti. El a stiut dintotdeauna ca sintem doi, deducind chestia asta din faptul ca avem useri diferiti, iar textul a fost asa de la inceput (mentiunea “last edit” e acolo dinainte de ultima editare). Faptul ca unele verbe sint la singular inca (“Încăpăţânându-vă să vă bagi în seamă“, “Voi, frustratilor, foloseşti tool-uri“) nu e IN NICI UN CAZ un semn ca s-a petrecut ceva si oricum se va rectifica deindata ce va citi aici despre asta. Si ca tot avea casca-n cap si vagonetul aproape, a sters si ultimul comentariu din seria aia in care se pisa lumea pe el, iar el isi deschidea sufletul in fata jetului, crezind ca-s cuvinte de apreciere. Noroc ca am salvat tirada.

Daca ar fi sa ne dam cu parerea cine-l ajuta pe Silviu sa-si ia din pila trecutul fara a lasa urme, n-am putea ignora faptul ca Ovidiu “MVP” Cucu si-a sters si el de ceva vreme bancul IT pe care-l semnala publicatia noastra la inceputurile ei. Sa nu uitam ca Ovidiu si-a primit aleasa educatie de atasat politic pe linga uzina in vremuri in care alinierea istoriei la idealurile partidului era o slujba cu norma intreaga pentru unii, de unde si reflexul de a-ti cere buletinul cind ii arati ca a gresit ceva. Probabil Ovidiu isi doreste acum sa deporteze toate thread-urile in care a scris Silviu timpenii, dar asta ar insemna sa-si stearga tot forumul.

PS: Ultima postare pe blog-ul lui Marius Bancila se intituleaza Remnants of the Golden Age of Communism. Mi se pare foarte nimerit.

Tags: , , , , , , , , , , , , , , ,