Analfabetia de miercuri dimineata

Posted in 112 on March 28th, 2012 by Mihnea

Ca oricarui militian, lui Ovidiu Cucu ii place sa intocmeasca liste: liste cu norme, liste cu abateri de la norme, liste cu sanctiuni de aplicat pentru abateri de la norme, liste cu sanctionati si sanctionabili etc. De asemenea, e ferm convins ca odata intocmita, o lista trebuie lasata asa cum e; orice manipulare de lista il scoate din ale lui. Astazi el s-a decis sa redacteze o lista cu fruntasi in ale programarii si s-o posteze la avizierul ograzii, ca material de studiu pentru membrii Uniunii Tineretului Codexpert.

Ce e insa cu adevarat interesant e modul in care a luat nastere aceasta pornire. Ovidiu marturiseste ca ideea rabojului i-a venit citind o lista asemanatoare pe site-ul lec-academy.ro, un colt de internet unde niste tutorialisti intreprinzatori isi propun sa ne lumineze zilnic cu vorbe sau imagini din programare sau Microsoft Office. Sa spicuim, dara, din lista celor mai importanti 20 de programatori ai tuturor timpurilor in viziunea extrem de relevanta a acestor antrenori de secretare:

Pe primul loc este Tim Berners-Lee, care “a fost clasat pe locul ntai […] in lista Telegraph a celor 100 de marii genii.”

Ne bucura nespus sa-l vedem pe 2 pe marele programator Matt Mullenweg. Cum, nu stiti cine e Matt? E ala care a facut WordPress.

Urmeaza Larry Page care e “top 27 cei mai bogat miliardari”, precum si colegul sau Sergey, care este “top 28 cei mai bogat miliardari”.

Despre Linus Torvalds aflam ca “exista mii de variante / distributiile de servere de web Linux si multe ruleaza pe el“. Deci Linux ruleaza pe el Linux, sau pe el Linus?

Dennis Ritchie este “creatocul limbajului C si un mare dezvoltator a sistemului de operare UNIX”.

Brian Kernighan este “autorul a mai multe programe UNIX”. Sigur, orice student de la orice facultate de calculatoare este autorul “a mai multe” programe UNIX, ca doar e cursul ala de SO unde te chinuie cu asa ceva, deci locul asta ar trebui impartit de Brian cu toti studentii din toate timpurile. Cel putin eu asta inteleg din epifatul tutorialistilor.

Ken Thompson este “un pionier american in informatica, si a ajutat la crearea limbaj de programare B”. Redactorul a fost si el un mare pionier, motiv pentru care a petrecut mai mult timp la muncile patriotice decit in clasa. Asa se explica de ce nu stie cum se declina “limbaj”.

Rasmus Lerdorf “a autorizat primele 2 versiuni de PHP, si apoi a contribuit la dezvoltarea celor mai recente ale PHP. Astazi, PHP ruleaza peste 34% dintre site-urile online“. Sint curios ce cuvint era in original in engleza, de a tradus Google “autorizat”. De asemenea, daca s-ar fi pus si site-urile offline pe care ruleaza “cele mai recente PHP”, cred ca procentul ala ar fi depasit 100%.

Ca sa nu se simta singur Matt Mullenweg in lista (ala care a scris WordPress, in caz ca ati uitat deja cine e), il avem ceva mai jos si pe celebrul programator Jason Fried, a carui contributie la propasirea omenirii este un site ce “contine unele aplicatii web uimitoare“.

Alan Cooper “este numit parintele Visual Basic, deai mare parte din munca pentru Visual Basic a fost realizata de grupul intern de la Microsoft”. Chiar daca n-a muncit, aparent a fost facut parinte pentru ca “a contribuit la interfata grafica pentru sistemul API“. In caz ca nu stiti, interfata grafica pentru sistemul API este folosita pentru a realiza interfete GUI de urmarit IP-uri.

Larry Wall este S.A. Societate pe actiuni? Silviu Ardelean?

John Resig completeaza constelatia frecatorilor de text din care mai fac parte Matt Mullenweg (ala cu WordPress) si Jason Fried (ala cu site-ul de site-uri). Asta a facut jQuery, dar nu s-a multumit cu atit: el este si blogger.

Guido van Rossum este “autorul limbajul de programare Python”.

Daca vreti sa invatati programare de la oamenii care au intocmit aceasta lista, ii puteti contacta la office@leconline.ro sau direct la sediul din Strada Frumoasa. Frumoasa, da’ proasta.

PS: in ochii albastri ai lui Ovidiu, lista comite o mare nedreptate istorica omitind s-o includa pe Grace Hopper, un fel de Amelia Earhart a programarii. Chestia asta zdruncina tot fundamentul moral pe care este cladit demersul tutorialistic, deci ar fi bine sa nu-i dati crezare si sa folositi in schimb Lista lui Ovidiu cind simtiti nevoia sa va inchinati si nu stiti cui.

 

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

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: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Ma-nvirt in cerc, nu te gasesc

Posted in Codare cu premeditare, Regula 0, Stand-up philosophy on January 31st, 2011 by Mihnea

Cind unul dintre experti intra in contact cu o aberatie, aceasta se propaga in staulul lor mai ceva ca herpesul in puscarie, ajungind in timp record sa-si infiga adinc tentaculele in etosul autoproclamatei comunitati de programatori C++. Dupa aia, aberatia foloseste site-ul lor drept un vector infectios pentru a corupe mintile ratacitilor care, orbecaind prin bezna inceputurilor, esueaza printre Raspundaci. Tratamentul nu-i usor, caci chiar daca-l determini pe unul din experti sa-si corecteze pe furis aberatia, un altul ii va lua locul si o va scoate la iveala pe blog, intr-un FAQ sau intr-un alt astfel de vas Petri.

Bunaoara, nici n-am terminat bine instructia cu minerul in problema dimensiunii fisierelor, ca si apare Marius Bancila cu un articol despre cum sa deschizi un dropdown in configuration manager in Visual Studio. In indispensabilul articol ni se enumera si unele din avantajele compilarii pentru 64 de biti:

Printre avantaje se numara accesul la mai multa memorie, accesul la fisiere mai mari de 4GB, sau accesul la functii specifice sistemului pe 64-biti.

Deci da. Inca un expert care crede ca din 32 de biti n-ai cum sa citesti fisiere mai mari de 4 GB.

Si ca tot am ajuns la spinosul subiect al dublarii numarului de biti, Gardianul Ovidiu are si el un sfat pentru noi:

O problema am avut-o si am pierdut ceva timp din cauza ei, in momentul in care am vrut sa fac build din linie de comanda (devenv.exe… ).
Recomandare: pune cele doua configuratii (pt Win23 si x64) in solutii (sln-uri) diferite.

Din pacate dinsul n-a vrut sa ofere detalii suplimentare despre problema pe care o intimpinase, desi minerul s-a aratat interesat. Noi presupunem ca scria numele configuratiei in command line fara sa puna “|win32” sau “|x64” in coada, asa ca devenv incalca iar Regula 0 si-i compila tot timpul configuratia de 32 de biti. Daca cititorii nostri au alte presupuneri creative, le asteptam in comentarii.

Cum codexpert a ramas in urma comunitatilor-surori din AXTI si nu si-a facut inca televiziune online, ne-am decis sa-i ajutam noi, asa ca pe linga RONUA TV, de azi exista si CODEXPERT TV. In continuare va prezentam filmul artistic Raspundacii, care dramatizeaza zbuciumul interior al expertului in incercarea acestuia de a scapa din ghearele aberatiei:

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