Revizorul

Posted in Regula 0 on September 21st, 2011 by Mihnea

Greetings, my friend. We are all interested in the future, for that is where you and I are going to spend the rest of our lives. And remember my friend, future events such as these will affect you in the future. You are interested in the unknown… the mysterious. The unexplainable. That is why you are here. And now, for the first time, we are bringing to you, the full story of what happened on that fateful day. We are bringing you all the evidence, based only on the secret testimony, of the miserable souls, who survived this terrifying ordeal. The incidents, the places. My friend, we cannot keep this a secret any longer. Let us punish the guilty. Let us reward the innocent. My friend, can your heart stand the shocking facts of…

 

Tags: , , , , , , , , ,

Arta Inaltarii Monitoarelor

Posted in Regula 0 on September 9th, 2011 by Mihnea

Astazi va supunem atentiei un instantaneu surprins in birourile Bitdefender Timisoara inainte de pasul cel mare facut in primavara de catre cel mai miner dintre paminteni. Observam cum primele doua volume din ópusul lui Knuth formeaza un fundament solid pentru demersul creator al lui Silviu. Monitorul s-ar prabusi pur si simplu sub greutatea atitudinilor si descoperirilor cioplite in el daca ar fi sprijinit pe un postament mai putin monumental. Volumul 3, ala despre sortare si cautare este probabil folosit pe post de tirnacop pad.

PS: ortacul si-a actualizat in sfirsit linkedin-ul. Aparent a facut level up de la expert la “Advanced Software Developer”, fiind acum parte dintr-o echipa de servicii profesionale care ofera suporti pentru echipa de servicii profesionale:

Member of Professional Services team, a team that offers outsourcing supports for Ricoh Infoprint Professional Services team.

 

Tags: , , , , , , , , ,

Stare avansata de Tutorialism.

Posted in Codare cu premeditare, Premiul n00bel on March 30th, 2011 by jos8cal

El este Marian Pop si este intr-o relatie stabila cu un Mac OS X de peste 6 ani. Cind intr-o relatie anii devin unitatea de masura a tolerantei, este evident ca secretia de feromoni a crescut proportional cu durata relatiei.

Unii dintre voi or sa spuna ca o relatie sta in picioare datorita fundamentului de cunostinte comune cu care ne-am impaunat reciproc de la primele intilniri. Ei bine, nu! Relatia daca ar fi sa o reprezentam 2D ar fi o linie pe orizontala, nu pe verticala, deoarece “fundamentul de cunostinte comune” se transforma in Obicei, iar acesta stim cu totii ca e neplacut iar neplacerea se reprezinta pe orizontala. Este o enumerare. De ce credeti ca puscariasii isi numara zilele tragind linii verticale, ca mai apoi sa le taie cu una orizontala? Pentru a exemplifica moartea sperantei si nasterea Obiceiului.

Bun. Acum ca avem clar stabilite bazele vietii in doi, sa trecem sa mulam aceasta schema metafizica pe viata familiei Marian Pop OS X.

Marian se considera un geek datorita pasiunii lui pentru computere dusa la limite extreme. Dupa cum vom vedea mai jos, computerul nu pare insa sa-si aduca aminte de unde-l stie pe Marian.

El s-a decis sa programeze in C/C++, PHP si MySQL, deci este evident ca are nevoie de un Mac, ca PC-ul e pentru jocuri. S-a oprit la primul bordel Apple si a platit pentru un Mac OS X, toate serviciile incluse. G4. MILF. XCode.

Dupa cum am vazut, daca vrei doar sex de la un Mac, vei avea parte de un gay porn numit XCode. Cind esti in schimb intr-o relatie cu Mac-ul, secretia mare de feromoni emisa de dinsul va face ca experienta cu XCode sa-ti para o sansa unica in viata.

Odata ajuns applosexual, Marian a inceput sa-si filmeze orgiile cu XXXCode si sa le puna online sub forma unui Decalog speram noi.

Primul Film. Introducere in C++.

Aici se poate observa cum folosirea cuvintelor “variabile” si “using namespace std” l-ar face pe orice incepator sa se urce pe pereti de placere, neintelegind nimic dar incercind sa simta apasarea tastelor care nu se apasa pe tastatura de Mac.

Al doilea film. Structuri conditionale in C

Vizibil stresat din cauza unui algoritm, Marian isi face totusi timp sa readuca in atentia publicului recurenta tema a variabilelor. Aflam astfel ca variabilele sint niste cutii in care stocam date. Acum mai ramine sa aflam ce sint alea date. Climaxul acestui film incepe la minutul 6, cind Pauza devine subiect principal pentru 35 de secunde. Mai aflam ca

for (int a=0; a>0; a++)

il incrementeaza pe a cu a.

Daca Gaddafi si-ar fi luat gindul pentru o secunda de la lumea modei si ar fi deschis XCode, ar fi propus (te pup Silviu) ca si Marian urmatoare alternativa la scris numere pe ecran:

int a;
cin >> a;
for (int i=a; i > 2; i++){
	cout << i;
	break;
}

sau

while (a == 2){
	cout << a;
	break;
}

Al treilea film. Functii in C++.

Sau cum sa nu faci cout << 40;

int fun(int n){
	n = n + 20;
	return n;
}

int main(){
	int n=20;
	int i;
	for (i=n; i>0; i++){
		cout << fun(i);
		break;
	}
	return 0;
}

Al patrulea film.

Aici aflam ca pointerii sint ca niste muschi si trebuie sa facem zilnic exercitii pentru a-i mentine in forma. Si aici Pauza primeste un rol in scena in care Marian cauta punctul si virgula pe tastatura lui Apple.
Mai aflam ca putem scrie cod oriunde vedem loc liber in pagina, asa ca pe ciorna, si mai tirziu il copiem unde trebuie. Cind te trece creativitatea trebuie sa ai un loc liber sa o depui in cel mai scurt timp.

Disclamer: Nu a fost ranita nici o masina in timpul efectuarii cercetarilor pentru acest material. In schimb se pare ca alti oameni au fost raniti in timpul orgiilor familiei Pop OS XXX.

PS. In caz ca doriti autografe, codexpert.ro il are invitat permanent in platou.

PS2. Si da, ca si pe Silviu Ardelean sistemul de invatamint romanesc l-a avut la cirma si pe Marian Pop.

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

Stiri pe scurt

Posted in Regula 0 on March 21st, 2011 by Mihnea

Un cititor binevoitor ne-a semnalat ca referer.us e mai breaz decit anonym.to sau alte servicii similare si scoate de tot referrer-ul, asa ca am upgradat JS-ul care proceseaza link-urile spre abataj si ograda expertilor sa treaca pe la aia in caz ca nefericitul cititor nu foloseste Chrome. Cu ocazia asta m-am pus la curent cu haosul care domneste prin ce zic browserele la user agent si mi-am intarit convingerea ca web-ul trebuie sters si facut din nou.

Gardianul Ovidiu a simtit ca pozitia lui de postac al intrebarilor de interviu este amenintata de activitatea lui 0ptr si a trecut in modul smartass. Sintem convinsi ca daca chiar ar fi la un interviu si cineva l-ar pune sa implementeze atoi(), ar cere intii specificatiile complete ale functiei in 3 exemplare semnate si parafate de director si de ofiterul politic. Obisnuit din vechiul regim sa puna intrebari si sa raspunda singur la ele, el a declarat:

Cum gandesc? Gandesc pragmatic. Daca nici tu nu sti exact ce vrei, nu te astepta sa obtii de la mine exact ce vrei!

Sau, cum ar zice mai rimat protejatul sau, “noi muncim, noi nu gindim”. E demn de mentionat ca daca Ovidiu punea intrebarea si 0ptr facea pe desteptul, s-ar fi facut urgent apel la Pravila 0 si probabil la butonul de ban.

Si ca tot veni vorba de miner, iata ce a inteles el din faptul ca am facut misto de pChar += sizeof(char):

Atat amar sa fie… unii au fantezi si se gandesc sa migreze atoi() la wide-char… ca doar atoi() nu vine de la ASCII si de _wtoi() nu s-a auzit.

Lasind la o parte razboiul contra i-urilor pe care-l duc minerul si militianul pe codexpert, propun sa meditam cu totii 5 minute la uimitoarele capacitati de intelegere de care da dovada Silviu prin afirmatia asta. Srsly, the fuck.

Un prieten care a absolvit Bitdefender Bucuresti mi-a comunicat o veste soc: Silviu a parasit multinationala emblematica in decursul saptaminii ce a trecut. Aparent a gasit o firma unde departamentul de HR n-are acces la Google si a zis ca e o oportunitate pe care nu trebuie s-o rateze.

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

Haters gonna hate

Posted in Premiul n00bel, Regula 0 on March 19th, 2011 by Mihnea

 

 

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

Internetul, memoria si Ardeleanul

Posted in Premiul n00bel, Regula 0 on March 7th, 2011 by Mihnea

Azi e o zi importanta pentru Silviu Virgula Ardelean: in sfirsit a gasit un articol care explica pe intelesul sau ce-i cu pointerii si cu memoria. Surescitat de descoperirea sa, expertul ce duce-n spate nu mai putin de 9 ani de tras la saiba C++-ului si-a aruncat tirnacopul in zare, sa stie toata lumea:

A nice and simple tutorial of “C/C++ Memory Corruption and Memory Leaks”: http://bit.ly/jWwEd

Vreau sa subliniez “pe intelesul sau”. Articolul nu e in nici un caz pe intelesul oricui, ci doar al lui Silviu, asa cum discutiile intre doi boschetari beti nu-s pe intelesul oamenilor de rind. Sa spicuim:

char *oldString = "Old String";
char newStrig = strdup(oldString);
if(newString == ENOMEM) ... // Fail!!!!

...

free(newString);

Nu-i asa ca aveti un deja-vu? Cod care nu se compileaza, pentru ca “omul nu are un compilator in cap”, si pentru ca “tutorialele nu-s facute sa iei cu copy/paste din ele”? Bifat. Autor care e asa de prost incit crede ca malloc() returneaza ENOMEM cind nu mai are de unde da, dar posteaza totusi tutoriale pe net? Bifat. Utilizarea limbii lui Shakespeares pentru a ne asigura ca mesajul de pace si incompetenta este inteles si de oamenii din “India, Africa de Sud, Columbia, Rusia, etc”?

Memory allocated by copy constructors for pointer duplication. Check in destructor and delete if necessary. Memory allocated in passing class by value which invokes copy constructor.

Bifat.

Numarul de ineptii din articolul respectiv este aproximativ egal cu numarul de propozitii (doar daca socotim drept propozitii si enunturile alea fara predicat, altfel ineptiile cistiga), dar n-o sa stau acum sa fac analiza pe text. Mai interesant ar fi de aflat cum si de ce a ajuns minerul sa-si gaseasca sufletul-pereche in persoana acestui Greg Ippolito. “Cum” e simplu: a scris in google free memory tutorial si a dat pe primul link. “De ce” are legatura cu site-ul asta si cu utilizatorii sai.

Acum ceva vreme, minerul a postat un articol in care ataca spinoasa problema a convertirii numerelor in string-uri. La momentul creatiei l-am sarit pentru ca nu ni s-a parut ca ar avea suficient potential umoristic, dar un cititor fidel ne-a urecheat ca n-am semnalat faptul ca Silviu punea destructori virtuali in niste clase goale, ca un automaton constiincios ce este. Sigur pe textele invatate pe de rost de prin surse dubioase, Silviu (care, tineti minte, nu se ascunde dupa nick-uri pentru ca are singe in instalatie) a venit deghizat in Coco si a lasat urmatorul comentariu veninos:

Coco Says:
January 26th, 2011 at 4:32 pm
@thefatredguy: prima data trebuie sa scrie un FAQ special pentru tine despre destructori virtuali.

Dupa risetele ce au urmat, el si-a inmuiat intrucitva pozitia:

Coco Says:
January 26th, 2011 at 4:58 pm
Discutia cu destructor virtual / nevirtual e cu dus-intors oricum ai intoarce-o. Voie buna!

Vazind totusi ca voia buna nu inceteaza, a dat fuga la articol si a scos destructorii aia virtuali, ca nu se stie. A ramas totusi cu un ghimpe, ca n-a inteles de ce i-a scos, asa cum n-a inteles nici de ce i-a pus. Neintelegind ca e atit de prost incit nu va intelege niciodata, el a continuat sa caute raspunsuri sub forma de tutoriale si asa a dat peste Greg.

Un om de calibrul lui Silviu, care isi recunoaste greselile, nu putea dormi noaptea fara a scorni o justificare pentru faptul ca orice spune se dovedeste a fi gresit. El e un suflet nobil si mare, care vede dincolo de corecturi. Atita timp cit Adevarul iese la iveala, pe Silviu nu-l intereseaza cum se ajunge la asta. Cum ne-a obisnuit, minerul iar da cu tirnacopul in peretele gresit, crezind ca noi ne luam de el pentru ca isi corecteaza post-urile, asa ca ma voi preface ca incerc sa-l indrept pe calea cea buna, inainte sa-si darime abatajul in cap.

Nu, draga Silviule. Noi nu ridem de tine pentru ca iti corectezi scrierile, ci pentru ca trebuie s-o faci. Tot ce scrii este gresit si tu nu vrei sa vezi in asta un semn al incompetentei colosale care-ti caracterizeaza existenta. Post-urile tale ar trebui sa-i avertizeze pe cititori sa nu ia nimic de bun pina nu apare articolul corespunzator la noi pe site. Daca vrei, facem noi plug-in-uri de wordpress si phpbb care afiseaza un disclaimer in ce postezi si adauga automat link-ul catre noi in momentul in care publicam corecturile. Visez la ziua in care vei putea imprumuta de la cineva un sfert de creier si vei putea vedea ironia faptului ca ai invatat despre pointeri, constructori si destructori de la un idiot ca tine, care nu stie despre ce vorbeste, dar totusi vorbeste. Tu, in prostia ta, ai preluat prostia lui si o dai mai departe altora. Daca Fibonacci ar fi trait azi, i-ar fi dat pulii de iepuri si ar fi studiat pe tine rata de crestere a prostiei pe internet.

Sigur, incercarile acestea de a-l face pe Silviu un ortac mai bun sint nascute moarte. Un intelept ne-a lasat mai demult pe failbook urmatorul mesaj, ce ilustreaza cu mare concizie si absoluta precizie imposibilitatea comunicarii cu minerul-programator:

Cand Silviu-Marius Ardelean greseste si incerci sa ii spui, sunt trei variante:

1. Faci misto si nu se prinde;
2. Ii spui discret si nu intelege;
3. Ii spui direct si nu te crede.

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

Purely Fabricated Interview Expert Pattern

Posted in Slagare internationale, Stand-up philosophy on February 21st, 2011 by Mihnea

Am aflat de la Andrei Ignat ca Scott Hanselman a publicat o noua lista de intrebari de interviu pentru programatori. Cred ca Hanselman asta e un fel de Ovidiu Cucu international, ca vad ca tot publica liste d-astea. Ca orice programator care se respecta, si eu sint constient ca pot deveni somer peste noapte, deci fac eforturi mari sa ma tin la curent cu ultimele evolutii in domeniul intrebarilor de interviu. Atasez mai jos raspunsurile mele la intrebarile lui, pentru cei 3 cititori din totalul nostru de 5 care nu sint membri pe programare.org. Scuzati limba lu’ Shakespeares, am zis sa nu break character.

What is SOLID?

YABA.

Why are patterns important?

Patterns are important because people who cannot program must be able to project importance by wielding pompous words.

Who are the Gang of Four? Why should you care?

The Gang of Four, also known as The Alpha Wankers, are four non-programmers who understood what power words are and applied the concept to programming. I care because Aurelian Popa told me that today it is more important to be “social” than to know how to program, and using pretentious jargon like “singleton” instead of “global variable” is a guaranteed way of improving one’s social status. They are not to be confused with the Wang-Zhang-Jiang-Yao group, whose name they borrowed in a spectacularly ill-advised stab at self-irony.

Explain the concept of Separation of Concerns and it’s pros and cons.

Separation of Concerns means that when you concern yourself too much with design patterns, you can stop being concerned about grammar. No man can understand the singleton pattern AND remember the basic rules of languages with immensely complex grammars such as English, so once you embrace the teachings of the Gang of Four, grammar becomes Somebody Else’s Concern. The first sign of this transcendence is putting an apostrophe in the possessive pronoun “its”.

Discuss the concept of YAGNI and explain something you did recently that adhered to this practice.

YAGNI is something YAGN, as it’s related to XP.

Are you still writing code? Do you love it?

No, I’m too busy calling my global variables singletons and speaking at conferences about it.

What do you do to stay abreast of the latest technologies and tools?

Hahaha you said breast!

How do you react to people criticizing your code/documents?

I punch them, fire them and/or write inflammatory posts about them on forums or blogs.

Whose blogs or podcasts do you follow? Do you blog or podcast?

Are blogs and podcasts design patterns? Never heard of them. Anyway, I like the color fuchsia, I am an open-minded person focused on self-improvement and my hobbies include hiking, music, reading and taxidermy. I hope this helps you determine if I’m a good programmer or not.

What is the last programming book you read?

I only ever read one, “Design Patterns”. I memorized every word. I don’t need to know anything else.

What’s so great about <cool web technology of the day>?

<generic answer>

How can you stop your DBA from making off with a list of your users’ passwords?

I didn’t know such sexual deviationism is so common among DBAs and anyway, why is that my problem instead of HR’s? Oh wait, you said “making off”, not “making out”. My bad.

What do you do when you get stuck with a problem you can’t solve?

The Design Patterns book is a complete list of solutions which are just waiting for problems. Unenlightened people approach programming the wrong way: they see problems and look for solutions. I use the sure-fire method of picking solutions from The Book and inventing problems for them. That way, I’m never stuck. Any feature or system which cannot be implemented in this way is ill-defined and not worth my concern in the first place. See also the “Separation of Concern” principle.

What’s the difference between a web server, web farm and web garden?

Wait, what? Web garden?

When do you know your code is ready for production?

When I have at least 157 design patterns in it.

What’s YAGNI? Is this list of questions an example?

Didn’t you ask this already?

Noile mele cuvinte favorite: Information Expert (a nu se confunda cu Code Expert), Pure Fabrication, Protected Variations.

LE (adica Later Edit, Ovidiu): hahahaha am aflat ce-i ala web garden. Redefinirea cuvintelor limbii engleze, in pula mea.

LLE: GoF au incercat sa si cinte la un moment dat. Punk, pentru ca si la muzica se pricep la fel de bine ca la programare. Iata-i aici prezentind pattern-ul “Old Grey Whistle Test”:

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

Dezamagire

Posted in Regula 0 on February 1st, 2011 by Mihnea

Din pacate teoria conspirationista despre disparitia FAQ-urilor lui mesajflaviu pe care o expusesem in PS-ul post-ului anterior (adica post scriptum-ul, Ovidiu) s-a dovedit a fi nefondata. Probabil contributia lui mesajflaviu era intr-un fel de purgatoriu al ograzii cu experti, caci unul din cele 2 link-uri suspecte tocmai s-a schimbat la fata si a inceput sa mearga. Si mai atroce decit nedreapta acuzatie de cenzura este faptul ca aparent nu e nimic amuzant in ce-a zis mesajflaviu. Voi incerca sa compensez dezamagirea pe care v-am produs-o cu urmatoarea fila din cartea “Kōan-uri Ilustrate”:

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

A patra corectura

Posted in Codare cu premeditare, Premiul n00bel, Regula 0, Stand-up philosophy on November 27th, 2010 by Mihnea

Truda afunda continua in galeria sapata de Silviu Ardelean. Cu ajutorul cititorilor nostri a reusit sa-si corecteze si “micile scapari” legate de character set, a aflat de FindFirstFile() si chiar a incercat sa trateze path-urile care contin wildcard-uri, lucru care nu prea i-a iesit. In momentul de fata, codul pentru cazul in care nu vrei sa folosesti WinAPI este:

long long GetFileSizeFast(const TCHAR *szFilePath)
{
    if (!szFilePath || !szFilePath[0] ||
        !PathFileExists(szFilePath))
        return -1;

    long long nSize = -1;
    struct __stat64 buf;
    nSize  = (_tstat64( szFilePath, &buf ) == 0) ?
        buf.st_size : -1;
    if (S_ISDIR(buf.st_mode)) nSize = -1;

    return nSize;
}

Sigur, ne-am putea intreba de unde frica asta de WinAPI, avind in vedere ca _tstat64() e o functie care exista doar pe Windows, deci oricum poti sa te bazezi ca ai WinAPI la dispozitie. De asemenea, ne-am putea intreba cum eviti folosirea lui WinAPI, cit timp chemi PathFileExists(), o functie WinAPI. Cei mai circotasi ar putea comenta chiar despre inutilitatea apelului la PathFileExists(), avind in vedere ca functia _tstat64() trateaza singura caile cu wildcard-uri prin ele. Eu va spun doar atit: “mici scapari”.

In cazul in care nu tinem sa scriem cod portabil cu functii care exista doar pe Windows, miinile negre ne intind si o varianta cu WinAPI:

long long GetFileSizeFastest(const TCHAR* szFilePath)
{
    if (!szFilePath || !szFilePath[0] ||
        !PathFileExists(szFilePath))
        return -1;

    WIN32_FIND_DATA sFileData;
    HANDLE hFind = FindFirstFile(szFilePath, &sFileData);
    if (hFind == INVALID_HANDLE_VALUE)
        return -1;

    FindClose(hFind);

    return  (sFileData.nFileSizeHigh * (MAXDWORD+1LL)) +
        sFileData.nFileSizeLow;
}

Din nou clevetitorii ar putea sa se intrebe cum e functia asta “Fastest”, daca ea interogheaza filesystemu’ de 2 ori despre fisier. In cei 9 ani care l-au facut expert in C++, Silviu n-a invatat inca sa compare string-uri; vorba aia, abia a aflat despre fisiere, sa avem un pic de rabdare cu el. Inca o data: “mici scapari”.

Intr-unul din comentariile pe care probabil le va sterge in curind, minerul a marturisit ca lucreaza la o aplicatie care valideaza numele de fisiere folosind expresii regulate. Stie ca se poate si fara, dar nu e “profesional”. Chestia asta suna intr-un asemenea hal, incit ma tem ca ar putea sa fie o tentativa de sarcasm din partea lui, poate chiar prima in cei 30 de ani de cind e expert in Atitudine. Daca e pe bune, e doar o noua “mica scapare”, nimic grav.

Problema e ca se cam aduna “micile scapari” si ca numarul lor creste dupa fiecare corectura, in loc sa scada. Cam de cite “mici scapari” o fi avind nevoie pentru a realiza ca de fapt are de-a face cu o “mare scapare” in ceea ce priveste programarea?

Retorica aceasta este flasca, evident. Puroiul are o intreaga pleiada de justificari pentru faptul ca de 9 ani si 4 zile nu reuseste sa scrie o functie care sa afle dimensiunea unui fisier. In primul rind, in mintea lui (pardon, a unui “prieten”) e acceptabil sa publici cod care nu se compileaza, pentru ca ala care-l ia trebuie sa mai munceasca si el, futu-l in gura de oportunist. Cu alte cuvinte, cind unu’ e asa de incepator incit cauta pe net cum se afla dimensiunea unui fisier, in mod cert este calificat sa recunoasca cazurile limita care pot aparea si sa le trateze singur (sau sa stie cum sta treaba cu WIN32). Silviu i-a aratat ce era mai important, si anume numele unei functii. Mai departe se descurca incepatorul ala, desi Silviu nu s-a descurcat, cu toti cei 9 ani de dat la tirnacop cu care se lauda. Cred ca asta insemna “and staff” ala de dupa pleonasmul cu “CRT run-time library”.

Un suflet mare a incercat sa-i explice ca lumea are tendinta sa te creada prost daca publici prostii, aratind chiar cu degetul in directia lui Bullschildt, dar Silviu nu e un om care sa faca legaturi (desi ocazional il mai paleste cite un moment Poirot). Putem doar specula motivul pentru care Silviu n-a sters acel comentariu eretic si speram ca-i implicat un anumit tip de morcov, dar oricum, a explicat pe blog-ul de atitudine de ce are el dreptul sa faca pe Domnul Trandafir:

În cariera mea am întâlnit mulţi oameni talentaţi, foarte buni profesionişti, dar la toţi am văzut slăbiciuni tehnice. Cu siguranţă şi Mihnea are, la fel cum am şi eu.

Trebuie sa recunosc ca asta m-a enervat un pic. Acest Pitic Porno al forumurilor romanesti de programare, care nu stie sa caute intr-un map sau sa afle dimensiunea unui fisier, poate vedea “slabiciuni tehnice” la altii, pisa-l-as in inima. Mai mult, lacunele mele le scuza pe ale lui, chiar daca ale lui sint in subiecte care i s-ar parea banale unui elev de liceu, iar pe ale mele poate doar sa le conjectureze in baza filosofiei “nimeni nu-i perfect”. Desi i-am mai explicat de vreo doua ori, el continua sa ignore faptul ca eu nu scriu tutoriale, deci nu conteaza cit de incompetent sint. Cind scrii ceva, nu te raportezi la ceilalti gaozari care scriu timpenii pe codeguru sau pe blogurile lor “tehnice”, bai pula. Te raportezi la rezultate, ca programarea e o stiinta exacta, nu e expresionism abstract. Daca postezi cacaturi care nu merg si pe care nici tu nu le intelegi, puti demonstrabil a prost si faptul ca mai sint si altii ca tine nu e o scuza.

Tot in ultima lui luare de pozitie, ortacul revine la o tema mai veche, cea a Adversarului Colectiv. In urma cu ceva vreme el era convins ca jos8cal si cu mine sintem aceeasi persoana pentru ca ne luam de timpeniile lui, desi acum neaga ca ar fi zis asa ceva. Acum ma face pe mine raspunzator de faptul ca cineva a pus niste cod gresit intr-un comentariu la el pe blog. Aparent eu trebuia sa ma iau si de ala, dar n-am facut-o pentru ca si eu gresesc, sau ceva; n-am inteles, logica subterana imi scapa uneori. Minerul n-a priceput inca faptul ca tintele predilecte ale acestui blog sint oamenii care persista in prostie chiar si dupa ce li se spune ca ar fi mai bine sa stea in banca lor si sa se rezume la pus intrebari, iar el primeste atit de multa atentie pentru ca e cel mai penal reprezentat al acestei subspecii.

In finalul justificarii si-asa destul de dezlinate, Silviu recurge la o manevra des intilnita la imbecilii ramasi fara argumente: expresia “m-am plictisit”. Laolalta cu acuza “f(r)ustratule”, sau eventual dupa ce aceasta se dovedeste ineficienta, aruncarea lui “m-am plictisit” intr-o discutie se face in speranta ca il vei inchide pe interlocutor cind realitatea iti e potrivnica, dar vrei totusi sa cazi in picioare. Pentru a completa starea de spirit in care era el cind facea apel la respect (din pacate a sters apelul intre timp), ma vad fortat sa reiau un pasaj liric citat de colegu’ jos8cal intr-un post mai vechi despre felul in care societatea si Internetul il dezamagesc zilnic pe Silviu:

Când plini de praf cu paşi trudiţi,
Ieşim din mina obosiţi,
Ne doare ca-n lumina sa
Pământul ţine-o lume rea.

Deoarece un bou nu poate supravietui niciodata singur, Ovidiu “MVP” Cucu a tinut sa-si arate in mod subtil solidaritatea cu cauza mineriadei. Cititorii nostri fideli sigur n-au nimic mai bun de facut decit sa tina minte cum speculam acum citeva post-uri ca Ovidiu este cel care-l ajuta pe Silviu sa-si spele trecutul fara sa lase urme. Atasatul politic pe linga uzina Codexpert a decis sa-si dea jos masca, semnind citet ultima editare a periplului codexpertic al lui Silviu prin lumea fisierelor. Motivul trecut de MVP in condica este “Few cosmetics“. Asta e noul eufemism aprobat in Sedinta Extraordinara de catre AXTI pentru “facut sa mearga dupa un an”. Cosmetica e ce le va trebui lor daca Mos Craciun imi aduce anul asta aruncatorul ala de flacari de care-i tot zic.

PS: avem doua pagini noi la care se poate ajunge din coltu’ rusinii, adica din dreapta-sus: Idei in Monolog, cu citate din viata si opera personalitatilor din programarea romaneasca, si Intreaba-l pe Capitanul Kirk unde invitatul nostru semi-permanent Iacob Tiberu ia interviuri acelorasi personalitati.

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