Archive for March, 2012

Sunt un programator mediocru, dar un dezvoltator excelent

Tuesday, March 6th, 2012

Acest mesaj este cross-posted pe infoarena.ro

Discutat cu cineva despre anumite tehnologii și cum sunt bune la una sau alta și am simțit nevoia să scriu un articol despre cât de util este să fii expert în anumite tehnologii.

Eu mă consider mediocru în cunoștințele mele de limbaje de programare și cu toate astea mă consider foarte bun la ceea ce fac, ba chiar aș spune că sunt un world-class developer.

De ce spun că sunt mediocru?

Știu să programez în Java, C++, Python, Ruby, Javascript, Actionscript, PHP, ObjectiveC și am produs cod de calitate de pus în producție(*) în aproape fiecare din limbajele astea.

(*) A pune ceva în producție înseamnă că ce cod am scris eu a fost lansat către utilizatori. La Google asta înseamnă multe milioane de utilizatori care trec prin codul scris de tine.

Cu toate astea, știu probabil fiecare dintre ele cam la 70-80% din potențial și nu sunt guru în nici unul dintre ele (poate cu excepția Actionscript-ului).

Nu cunosc cele mai eficiente unelte pe care le oferă, nu cunosc tips and tricks magice, nu știu să aplic cel mai genial și recent feature al limbajului. Înțeleg lucrurile fundamentale pe care le-am învățat în facultate (closures, pointers, memory, threads, oop, etc) dar nu înțeleg implicațiile subtile are template-urilor din C++ sau alte feature-uri care sunt convins că sunt absolut magice.

Si atunci de ce spun că sunt world-class developer?

Pentru mine world-class developer înseamnă cineva care poate să producă cod de calitate de producție atunci când este nevoie, cod ușor de citit, extins, înțeles, ușor de adaptat și mai ales cod care face ceea ce este nevoie.

Un world-class developer este cineva care este capabil să învețe repede o tehnologie nouă, să își cunoască defectele și limitele, să ceară părerea altora și să accepte când nu are dreptate, să lucreze bine într-o echipă, să poată abstractiza ușor sisteme complexe, să le poată analiza și înțelege, să ofere soluții ingenioase la problemele care apar.

Rareori soluțiile sunt răspunsuri particulare unei anumite tehnologii.

La ce mi-ar folosi să fiu guru într-un limbaj?

Îmi imaginez două răspunsuri: poți obține performanță mai bună sau, prin artificii de limbaj, poți avea flexibilitate mai mare ca să scrii cod mai puțin, mai șmecher și mai magic.

Când vine vorba de perfomanță, pentru felul de sisteme la care lucrez eu (large internet-based products), de obicei cea mai mare limitare este timpul de acces la disc, timpii de comunicare prin rețea sau cât RAM ai la dispoziție. Faptul că binarul tău în C++ folosește niște cicluri de procesor în plus sau în minus nu contează.

Când vine vorba de artificii ezoterice care te ajută să scrii cod mai puțin, mai flexibil, mai magic, de multe ori sunt greu de înțeles dacă nu ești și tu expert și sunt foarte ușor de abuzat atunci când nu știi ce faci. Cum foarte puțini programatori sunt mega experți în anumite limbaje, când lucrezi într-o echipă ambele caracteristici de mai sus sunt importante.

De exemplu, am cunoscut mulți oameni mult mai deștepți decât mine care cred că inheritance este ceva evil. Dacă ai o clasă care moștenește altă clasă este greu de înțeles exact cum funcționează codul, e greu de înțeles ce metode sunt suprascrise și de ce, e greu de făcut debug, e ușor de stricat dacă clasa părinte se schimbă. Dacă inheritance este evil, imaginați-vă cum sunt privite alte construcții mai “puternice”. :-)

Concluzia?

Cred că un programator are două opțiuni generale în carieră: devine guru într-o anumită tehnologie, sau încearcă să fie generalist.

În general cei care se hiper specializează tind să devină blocați într-o industrie, nu pot învăța ușor alte limbaje, se adaptează greu.

Pe de altă parte cei care sunt generaliști ca și mine nu vor putea niciodată să se angajeze pentru optimizare hardcore de compilatoare sau scriere de codec-uri video pentru transmisii live.

În ambele situații, cel mai important este să faci ce simți că îți place. Dacă ești pasionat de ideea de a dezasambla kernel-ul linuxului, fă-o. Dacă vrei să faci web, fă-o. A face ce îți place este mai important decât orice altceva.

Tu ce fel de persoană crezi că ești sau ți-ai dori să fii?