Blog infoarena

Doua fire, patru variabile

rgrig
Radu Grigore
26 martie 2012

Toate prezentările legate de modele de memorie încep cu următorul exemplu:

{ X = Y = 0 }
  parallel
    Y := 1
    a := X
  and
    X := 1
    b := Y

Literele mari X şi Y sunt variabile globale; literele mici a şi b sunt variabile locale.
Explicaţi de ce e posibil ca la final a = b = 0.

 Comentarii (8)

Categorii:

Cum sa scrii programe la concursuri si nu numai

Cosmin
Cosmin Negruseri
23 martie 2012

Continuam seria sfaturilor inainte de ONI. Acum despre coding.

Citeste atent problema
Se intampla frecvent, sub presiunea concursului, sa intelegi problema gresit. Citeste-o atent si uita-te la exemple ca sa nu ai surprize neplacute.

Gandeste-te bine la solutie inainte sa scrii cod
Incepatorii se arunca sa implementeze prima idee. Apoi dupa timp bun de codare si depanare au surpriza ca algoritmul lor e gresit. Incearca ideea ta pe cateva exemple sa te convingi ca merge inainte sa scrii cod.

Fa teste si brute force-uri
Un set initial de teste bune ajuta foarte mult la implementarea unei solutii bune. Cateva exemple mici care testeaza cazul normal de functionare si doua teste extreme (n = 1 si n = MAX).
E foarte util sa ai si o solutie naiva de care te poti convinge usor ca e corecta. Ajuta la implementarea solutiei eficiente, si in caz ca nu iti vine in minte o solutie eficienta prinzi oricum cam 40 de puncte pe problema.

Cunoaste bine particularitatile limbajului de programare
Trebuiei sa stii cum se face citirea (cu buffer sau fara, parsezi datele sau nu si afisarea (numere reale, stringuri …).
In C++ STL e important, uita-te la sort, map, hash_map, set, pair, vector ca sa le poti folosi fara sa cauti documentatie prin librarii.

Conventii de coding
Concurentii la concursuri de programare folosesc frecvent variabile de genul ii, iii, x1, xx1, y0. Iti sugerez sa folosesti nume bune si in general conventii de coding . (e mai greu sa incurci intre ele sum si prod decat a si b)

Scrie cod incremental
In liceu, scriam tot codul ce rezolva o problema, apoi ma apucam de depanat. Am vazut mai tarziu ca, scriind cod bucata cu bucata si testand bucatile intermediare, ajung mult mai repede la o solutie functionala. Gandeste-te bine cum poti sa imparti solutia in pasi intermediari si sa verifici usor ca fiecare pas e corect.

La antrenamente fa mai multe solutii pentru o problema
Codul scurt si clar e usor de depanat si probabilitatea sa aiba buguri e mica. Astfel la antrenamente rescrie un program de mai multe ori pana ajungi la o solutie scurta si curata. Uita-te pe siteuri ca infoarena sau topcoder cum fac cei mai buni si incearca sa intelegi de ce au solutii mai scurte sau mai clare.

Partea misto e ca ideile de mai sus se aplica foarte bine si in contextul muncii in industrie.

Voi ce sfaturi aveti legate de implementare?

 Comentarii (2)

Categorii:

Idei proaste :)

wickedman
Cristian Strat
20 martie 2012

A hacker who has learned what to make, and not just how to make, is extraordinarily powerful. [ Paul Graham ]

În timpul liceului mi-a plăcut foarte tare să particip la InfoEducaţie. (Pentru cine nu ştie, la InfoEducaţie vin elevi de liceu din toată ţara să-şi prezinte proiectele software personale - în general aplicaţii web, software utilitar sau educaţional.) Mi se părea extraordinar să pornesc de la o idee şi să construiesc ceva “complet” - adică să funcţioneze dar să şi arate bine, să fie uşor de utilizat dar şi suficient de complex, documentaţie, identitate vizuală, etc. În plus era foarte incitant (şi înfricoşător!) să prezinţi un demo în faţa juriului şi a altor 50-100 de concurenţi gata să te îngroape cu întrebări răutăcioase şi feedback negativ. :)

Ca participant cred că am văzut peste 100 astfel de prezentări şi la multe încă îmi aduc aminte cum arătau şi ce făceau.

După liceu am continuat să merg la InfoEducaţie, însă ca membru al juriului. Am fost invitat şi la alte concursuri similare - InfoMatrix şi Unirea - şi de fiecare dată am participat cu plăcere. De partea juriului am mai văzut încă vreo 250 de lucrări şi am început să observ nişte patterns.

Sunt câteva idei de proiecte neinspirate care se repetă an de an la aceste concursuri. Am scris blog post-ul acesta ca să te conving să le eviţi cu orice cost, să nu cumva să te atingi de ele! :)

Indiferent de ce idee de proiect îţi alegi va fi la fel de greu să o scoţi la capăt. Dacă tot trebuie să munceşti la fel de mult şi să pui suflet la fel de tare, de ce să nu lucrezi la ceva inspirat?

1) Site-ul liceului

De la site-uri statice şi până la admin panel pentru actualizarea listei de directori care au condus instituţia de învăţământ, site-ul liceului este o idee foarte populară. Uneori site-ul ajunge să înlocuiască versiunea oficială (construită de un elev mai mare, tot pentru un concurs), însă din păcate nimănui nu-i pasă. Când ai intrat ultima oară pe site-ul liceului tău?

2) Catalogul virtual

Web-based sau cross-platform desktop app, notificări prin SMS, rapoarte PDF, criptografie şi nivele de acces, catalogul virtual îţi permite variaţiuni nelimitate şi un pretext să implementezi orice îţi trece prin cap.

Sincer nu înţeleg de unde izvorăşte atât interes pentru cataloage. :) Mie mi se făcea rău când le vedeam.

3) Pădura spânzuraţilor, Arbori binari, Planul înclinat, etc.

În categoria aceasta intră toate proiecte software care îşi propun să prezinte un subiect din programa şcolară într-un mod interactiv. E un fel de referat, dar software. Problema lor este că au o aplicabilitate foarte limitată – suplimentează nişte pagini de manual peste care treci la clasă într-o săptămână.

4) Music Player

Inspirat de Winamp, facilitatea principală oferită de această aplicaţie este schimbarea skin-ului. Pe locul doi: actualizarea automată a status-ului de Messenger. Ideea îţi permite să-ţi etalezi gusturile muzicale în faţa juriului atunci când faci demo. (Dar asta e cu două tăişuri. :P)

Problema la Music Player este că nu convinge pe nimeni, nici măcar pe autor, că e o alternativă mai bună.

5) Blog

Foarte clar ce-i de făcut, ideea de blog engine este populară şi de fiecare dată abordată la fel. Pentru că autorul nu este la rândul lui blogger, cea mai unusable secţiune este de obicei cea în care trebuie să redactezi post-uri.

Acest notepad.exe al aplicaţiilor web nu-ţi permite să te diferenţiezi decât prin câte features din lista standard ai apucat să implementezi.

6) CMS, Site Builder, 3D Game Engine

În această categorie intră “platformele”, sau chestiile care încearcă să rezolve o problemă generală precum construirea unui site sau a unui joc. De obicei acestea sunt lucrări foarte “grele”, adică autorii au investit extrem de mult timp în ele şi au dat dovadă de multă pricepere tehnică. Efortul este impresionant şi de lăudat.

Să faci o platformă nu e o idee rea în sine, însă orice platformă de succes are la bază o killer application. O platformă este bună în măsura în care aplicaţiile pe care le permite sunt bune. Aici cele mai multe proiecte lasă de dorit. Site-ul contruit de site builder este foarte limitat, sau din multitudinea de jocuri pe care game engine-ul tău o permite nu poţi demonstra nici unul.

Problema mea cu ideile de mai sus este că sunt pur didactice, pur exerciţiu, că nu au aplicabilitate, că nu îşi propun să convingă oameni reali să le utilizeze. De multe ori elevii nici nu se gândesc serios la ce să lucreze. Pur şi simplu aleg o idee “default” şi încep să codeze.

Atunci când începi un proiect personal ai ocazia să faci un exerciţiu foarte profund - să cântăreşti greutatea unei idei, cât de ambiţioasă e, cum se diferenţiază, cui i-ar păsa, ce audienţă are, cum inovezi, de ce îţi pasă ţie, şamd. Întrebările acestea sunt foarte grele iar la multe nu vei avea răspunsuri, însă numai exerciţiul de gândire te va face să priveşti altfel lucrurile. Există idei care îţi merită întreaga atenţie, care te pasionează şi pentru care eşti dispus să depui efort şi suflet. Găseşte-le.

Voi aţi participat vreodată la concursuri de proiecte? Ce aţi prezentat?

 Comentarii (18)

Categorii:

Buguri la concursurile de programare si nu numai

Cosmin
Cosmin Negruseri
18 martie 2012

Se apropie ONI si cred ca e utila o lista cu buguri frecvente. So here it goes:

  • Probleme in timpul implementarii:
    • greseli la copy paste.
    • inversarea indicilor la iterarea unei matrici (a[j][i]).
    • punct si virgula la final de linie dupa un for.
      for(i = 0; i < n; i++);
       ceva cod care se va executa doar o data
    • refolosirea unui index in interiorul unor foruri imbricate
      for (i = 0; i < n; i++)
       for (i = 0; i < m; i++) // i in loc de j
    • folosirea lui = in locul lui ==
    • comparare de stringuri cu == in loc de strcmp
    • functia % nu functioneaza ca functia modulo din matematica. Astfel daca scazi numere modulo X poti ajunge la resturi negative.
      Sunt gasite de obicei la depanare.
  • Probleme cu memoria:
    • variabile neinitializate.
    • array-uri de dimensiune de prea mica.
    • off by one errors. Datele pornesc de la 0 sau 1?
      Sunt de greu de gasit.
  • Probleme cu tipuri de date:
    • folosire de tipuri prea mici (ex. int in loc de long long sau float in loc de double).
    • probleme cu tipurile intermediare.
      gresit: int a, b; long long c = a * b; // c va avea valoarea unui int
      corect: long long c = ((long long) a) * b;
      gresit: double half = 1 / 2;
      corect: double half = 1.0 / 2;
      Foarte frustrante. Pierzi toate punctele pentru un algoritm aproape de forma corecta.
  • Intrare/Iesire:
    • fisier de intrare sau iesire gresit ca urmare a depanarii intermediare.
    • formatarea gresita (cate un spatiu in loc de virgula, sau uiti ca trebuie sa returnezi rezultatul modulo X)
      Le faci cand problema merge aproape perfect si te-ai grabit sa trimiti solutia.
  • Greseli la algoritm:
    • incepatorii se arunca sa implementeze prima idee, inainte sa se asigure ca e corecta.
    • probleme pe cazuri extreme, mici: gen n = 1, 2 sau mari unde iesi din memorie.
    • strlen(s) are complexitate O(n) nu O(1).
    • rezultatul are nevoie de numere mai mari decat poate reprezenta limbajul de programare.
    • graful nu e neaparat conex si toate exemplele au fost grafuri conexe.

Faceti o lista cu bugurile cu care v-ati intalnit ca sa va dati seama care sunt cele mai frecvente pentru voi. In concursurile online e foarte utila o asemenea lista.
Voua ce buguri v-au dat dureri de cap?

 Comentarii (37)

Categorii:

Weird List

Cosmin
Cosmin Negruseri
16 martie 2012

O problema misto via Marius Andrei:

Se da o structura de date asemanatoare unei liste inlantuite. Fiecare nod al structurii are doi pointeri, primul spre urmatorul element din structura si al doilea spre un element oarecare.
Gasiti un algoritm liniar care poate clona aceasta structura folosind memorie suplimentara constanta.

Puteti discuta solutia in sectiunea de comentarii.

Edit Solutia lui Marginean Ninu Ciprian

Vrem sa cream replica listei P:p1->p2->...->pn, in Q:q1->q2->...->qn.
Intai cream lista p1->q1->p2->q2->...->pn->qn, apoi completam campurile
din Q care pointeaza spre un nod oarecare, iar in final extragem lista Q,
refacand si lista P.

 Comentarii (10)

Categorii:

Programare concurenta

rgrig
Radu Grigore
13 martie 2012

Olimpiadele ar trebui să aibă probleme de programare concurentă. Argumentul pe scurt este următorul. Programatorii trebuie să utilizeze primitive simple pentru a micşora numărul defectelor software. Primitivele oferite de hard nu sunt simple, pentru a fi eficiente. Puntea dintre ce oferă hardul şi ce văd programatorii este în biblioteci şi în compilatore. Ideea este că numai un număr mic de programatori, cei foarte buni, trebuie să scrie codul complicat. Şi ghici unde se pregătesc viitorii super-programatori. :)

Dar s-o luăm pe-ndelete.

Programarea concurentă este importantă. Timp de ~30 de ani, cumpărarea un procesor nou garanta că programele vor merge mai repede. Însă în 2003 frecvenţa procesoarelor a încetat să crească. Acum cumperi un procesor nou pentru nişte core-uri în plus. Programele care folosesc un singur core vor merge la fel de repede; doar că vei putea rula mai multe în paralel. Pentru mai multe detalii vă recomand eseul „The Free Lunch is Over” al lui Herb Sutter.

Este încă relativ neplăcut să scrii programe concurente, dar lucrurile evoluează rapid înspre bine.

Iată câteva exemple de primitive concurente de nivel înalt care câştigă teren: memorie tranzacţională, futures, MapReduce. Toate trei merită învăţate. Alternativa, să foloseşti chestii de genul „synchronized” în Java sau pthreads în C, e ca şi când ai programa în limbaj de asamblare deşi a apărut deja Pascal. În mare, scopul primitivelor concurente de nivel înalt este să permită programatorilor să pretindă că anumite bucăţi de cod se execută secvenţial, fără interferenţe.

Implementarea acestor primitive este dificilă. De exemplu, futures sunt implementate în biblioteca „java.util.concurrent”, dar semantica firelor de execuţie în Java nu e clară. Pentru o vreme programatorii se aşteptau ca o execuţie pe câteva core-uri să fie echivalentă cu o intercalare a instrucţiunilor pe un singur core. Erau apoi surprinşi cum un program „concurent” care mergea perfect pe un core brusc începea să aibă defecte când era rulat pe mai multe core-uri. Motivul este că maşina virtuală şi compilatoarele fac tot felul de optimizări în cadrul fiecărui fir, ca şi când ar fi un program secvenţial. OK, dar dacă nu te poţi gândi la un program concurent ca şi când firele de execuţie pot fi intercalate, atunci cum? Evident, nu vrei să iei în considerare toate posibilele optimizări. Trebuie să există o altă descriere concisă a ceea ce e permis şi ceea ce nu e permis. Într-adevăr există: e o teză de doctorat ... în care au fost găsite probleme, care au fost corectate, apoi au fost găsite alte probleme şi tot aşa.

În concluzie, am văzut două motive pentru care ar fi bine ca olimpiadele să aibă probleme de programare concurentă. Pe de o parte participanţii vor fi mai pregătiţi pentru cum se va programa în viitor. Pe de altă parte există probleme de dificultate ridicată.

Totuşi, sunt multe întrebări la care habar nu am care e răspunsul. Putem proiecta probleme a căror soluţie să fie verificată automat? E bine să fie verificate automat ca la informatică sau ar fi mai bine pe hârtie ca la matematică? Nu cumva problemele interesante sunt prea grele şi nu se pot rezolva în timp util? Putem să inventăm probleme suficient de variate cât să fie interesante?

 Comentarii (8)

Categorii:

Master - in tara, in afara sau deloc

trebedea
Traian Rebedea
10 martie 2012

L-am invitat pe Traian Rebedea sa scrie un guest post. El este doctorand pe Natural Langauge Processing la Politehnica Bucuresti unde preda cursurile de algorithm design si statistical machine learning.

Pe masura ce granitele si orizonturile noastre s-au deschis, avem din ce in ce mai multe variante de a ne continua traseul profesional si educational. Iar daca ai ramas in tara sa faci o facultate, la finalul ei vei avea de ales daca:

1. Faci un master in tara
In cazul acesta, am observat ca exista 2 tendinte: cei care opteaza pentru un master intr-un alt domeniu (de obicei, in management sau ceva similar) sau cei care continua studiile de aprofundare intr-un subdomeniu al computer science. Intrucat nu sunt un expert in programele de masterat din afara domeniului, pot sa spun doar ca este bine sa va asigurati ca veti ramane cu ceva util si ca este un master recunoscut in afara tarii sau de catre o companie mai seriosa. In plus, un MBA bun costa destul de mult si in Romania, asa ca oricine va "vinde" un program ce contine termeni precum "management", "business administration" sau "MBA" pentru mai putin de 10 000 Euro/an nu cred ca este foarte serios.

Ajungem astfel la masterul urmat cel mai frecvent de absolventii de computer science (indiferent daca termina Info la Universitate sau A&C la Politehnica): cel de aprofundare. Din punctul meu de vedere, acesta are avantaje si dezavantaje, in special comparandu-l cu alternativa sa din afara. Printre principalele avantaje, ar fi:

  • sunt foarte multe locuri de la buget, asa ca este gratuit;
  • sunt si programe de masterat bune, comparabile cu cele din Europa;
  • programul de la master nu este foarte incarcat, asa ca studentii pot sa si lucreze in acelasi timp;
  • studentii care nu lucreaza au ocazia sa se implice in proiecte ce folosesc tehnologii destul de noi pentru materiile din facultate sau in proiecte de cercetare;
  • ai ocazia sa inveti lucruri noi care sa-ti ofere avantaje pe viitor si pe care de multe ori nu le intalnesti la primul loc de munca.

Desigur, ca exista si dezavantaje, cand comparam un master din Romania cu unul din afara:

  • universitatile noastre sunt clasate foarte prost si cateodata acest aspect conteaza (de multe ori insa, locul in aceste clasamente nu este chiar relevant si sunt si departamente de informatica, calculatoare, etc. cu un renume foarte bun in strainatate);
  • multe programe de master de la noi sunt "tinere", cu materii noi care vor ajunge la maturitate in 2-3 ani;
  • din cauza faptului ca foarte multi colegi sunt angajati full-time, nu ai ocazia sa cresti intr-un grup, sa discutati probleme mai dificile impreuna si sa evoluati in acelasi timp.

Personal, un master in tara este util daca il alegi corect si poti sa muncesti part-time astfel incat sa imbini facultatea cu experienta profesionala, pentru ca la finalul lui sa poti decide daca ramai in tara pe o pozitie mai buna, te duci sa lucrezi la o companie in strainatate sau continui cu un doctorat.

2. Faci un master in afara
Cred ca aici conteaza foarte mult universitatea unde vrei sa te duci la master, motivele si personalitatea fiecaruia. In primul rand, daca ai fost acceptat la o universitate de top in computer science (pentru asta se poate folosi foarte bine Microsoft Academic [1]) sau, mai bine, in subdomeniul masterului tau (pentru un exemplu vezi [2], intrucat clasamentele sunt destul de diferite fata de [1]), ar fi o prostie sa nu urmezi masterul respectiv. Chiar daca ai o oferta de la o companie de top, tot ar trebui sa te gandesti bine daca nu cumva merita sa te duci la masterat sau doctorat intai, datorita perspectivelor pe care ti le va deschide in viitor.

Insa, dupa cum probabil ati observat daca ati urmat [1] sau [2], sunt destul de putine universitati din Europa care sa fie in top 100. In aceasta situatie, cel mai probabil ati ales o universitate din Europa, care nu este chiar de top 100, dar care poate fi buna. Voi incerca sa generalizez avantajele unui master in aceasta situatie:

  • programele de master sunt mai bune decat cele din tara in majoritatea situatiilor, cu teme serioase ca si in timpul facultatii la noi;
  • universitatile sunt mult mai bine dotate si mai primitoare cu studentii, facandu-ti placere sa lucrezi in facultate la teme si proiecte si gasind sali unde sa faci acest lucru;
  • colegii de master vor fi si ei implicati destul de mult, putand discuta impreuna aspectele mai dificile ale cursurilor;
  • experienta unui mod de viata intr-un oras nou, cu tot ce implica acest lucru.

Printre dezavantajele unei astfel de alegeri ar putea fi:

  • desi studiile in sine nu costa foarte mult in majoritatea tarilor Europene (in jur de 2000 Euro / semestru), este necesar sa ai cel putin 1000 Euro / luna pentru costul vietii (cazare+mancare+o iesire in oras din cand in cand, etc.);
  • de obicei, nu vei putea munci in timpul facultatii, dar asta nu te opreste sa iti gasesti internship-uri in timpul vacantelor;
  • in functie de personalitatea fiecaruia, integrarea in noul colectiv poate fi mai usoara sau un pic mai dificila.

Totusi, eu cred ca un master in afara, la o universitate in afara top-ului 100, este o experienta buna mai ales daca reusesti sa te implici in proiecte de cercetare si/sau sa participi la internship-uri in timpul vacantei. Mai mult, daca vrei sa te reintorci in tara dupa terminarea masterului, s-ar putea sa fii supracalificat pentru jobul pe care il vei gasi in Romania, deci ideal ar fi sa iti doresti sa ramai in afara dupa terminarea unui astfel de master, ca sa exploatezi la maxim cunostintele acumulate.

3. Te angajezi
Daca ai primit o oferta de la o companie de top la terminarea facultatii, atunci sunt sanse mari ca un master sa fie inutil pentru tine, cu exceptia unui master/doctorat la o universitate top-tier. S-ar putea ca ceea ce inveti la masterat sa fie ori inutil la locul de munca, ori sa inveti aspectele practice chiar la job. Daca nu ai gasit o oferta de munca care sa te satisfaca si stii ca poti mai mult, atunci ar fi bine sa iei in considerare una din optiunile 1 sau 2.

4. Iti infiintezi un start-up
Nu imi propun sa scriu prea multe la acest punct, insa voiam sa fie pe lista intrucat il consider destul de important. Desi nu este adresat tuturor, stiu multi absolventi de calculatoare care au pornit pe aceasta cale dupa terminarea facultatii, unii cu mai mult succes, altii cu mai putin. Voiam doar sa punctez ca un start-up de succes porneste mai greu sau deloc in Romania, asa ca daca ai o idee foarte buna, ar trebui sa te relochezi (vezi Summify, Brainient, UberVU). Totusi, daca nu ai planuri atat de marete, si piata din Romania poate fi interesanta intrucat este in continua dezvoltare si daca iti gasesti pozitionarea, produsele/serviciile corecte si o strategie buna, poti avea o crestere frumoasa.

In final, mi se pare normal sa specific ca acest articol reprezinta o opinie personala si ca nu incerc sa ofer sfaturi de viata intr-un mod atat de general, mai ales unor oameni atat de inteligenti. Fiecare situatie individuala trebuie judecata in particular, tinand cont de situatia personala si, de ce nu, de intuitie si ceea ce credeti ca va place mai mult. Pana la urma, daca esti bun in computer science si faci ceea ce iti place, vei avea intotdeauna posibilitati de alegere si o cariera frumoasa si multumitoare.

1 - Microsoft Academic - Top organizations in computer science
2 - Microsoft Academic - Top organizations in NLP and speech

 Comentarii (21)

Categorii:

Sunt un programator mediocru, dar un dezvoltator excelent

vivi
Octavian Costache
05 martie 2012

Acest mesaj este cross-posted pe vivi.ro/blog

Pentru că cineva povestea într-un comentariu despre anumite tehnologii şi cum sunt bune la una sau alta, am simţit nevoia să scriu un articol despre cât de util este să fii expert în anumite tehnologii.

Eu de exemplu consider că sunt 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?

 Comentarii (16)

Categorii:

Despre hackeri vs. teoreticieni

vivi
Octavian Costache
28 februarie 2012

Context
Vorbeam cu Cosmin zilele astea despre cum ai putea să îţi dai seama că un olimpic are stofă de antreprenor sau nu.

Cu toţii ştim că oamenii de la olimpiade sunt foarte inteligenţi, foarte capabili, programatori excelenţi. Cu toate astea mulţi dintre ei nu sunt deloc potriviţi pentru a fi antreprenori. De ce? Există vreun semn după care ai putea să îi identifici?

O mică generalizare :-)
Concluzia la care am ajuns este că olimpicii se împart în două categorii.

Prima, oameni care au ajuns la olimpiadă pentru provocările intelectuale pe care concursul le oferă. Rezolvă probleme, dovedesc că sunt inteligenţi, le place competiţia. Codează, dar numai pentru a rezolva probleme şi pentru a se pregăti pentru olimpiadă. Pentru ei concursul este un scop, nu doar un mijloc. Fac informatică pentru că sunt inteligenţi, le plac concursurile şi provocările intelectuale.

A doua categorie sunt cei care codează şi în afara pregătirilor pentru olimpiadă. Le place informatica nu doar pentru că rezolvă probleme, ci pentru că le permite să îşi construiască propriile jucării pe calculator. Oameni care se folosesc de faptul că sunt calculatorişti ca să îşi atingă alte scopuri, să facă bani din freelancing, să construiască tool-uri, să facă pagina liceului, whatever.

Sunt oameni care descoperă eventual că este foarte satisfăcător să faci calculatorul să facă ce vrei tu şi care realizează că extrem de rar în viaţa reală rezolvi probleme de flux-maxim.

Nişte exemple
Eu am început să învăţ BASIC ca să pot desena o maşină pe HC-91-ul pe care îl aveam. Am ajuns la olimpiadă pentru că mi-era lene să învăţ teorii la fizică. În paralel îmi plăcea mult să fac pagini web (şi făceam şi nişte bani ca să mă duc la munte :-) ). Participam la concursuri pentru că era interesant, dar recunosc că nu mă intrigă puzzle-urile.

Doizece există doar pentru că, spre deosebire de ceilalţi trei oameni care au făcut acelaşi proiect de “jocuri online multiplayer” la cursul de Ingineria Programării, eu am fost singurul care chiar l-am lansat public şi am continuat să lucrez la el pentru că îmi plăcea să fac asta.

Infoarena există pentru că deşi Cristi l-a construit pentru Infoeducaţie, a decis că ar fi cool să îl folosească şi alţii, şi în timpul liber făcea tot felul de alte proiecte ca freelancer.

O amică de-a mea a făcut un tool pentru ca amicii ei să poată alege şi să poată vota playlist-ul pentru petrecerea de ziua ei. O pierdere de timp? Poate. Dar o lecţie foarte utilă în care a învăţat cum e să lansezi ceva în public, cum e să ai utilizatori care să nu înţeleagă butoane, cum e să încerci să faci un UI, cum e să programezi şi altceva decât biologie computaţională.

Încearcaţi şi voi să construiţi nişte chestii. Orice crezi tu că ar trebui să existe în lume. Orice simţi tu că ai nevoie, cât de stupid ar fi şi oricât de greu de folosit crezi că e.

Concluzie
Pentru un olimpic programarea este de multe ori un scop în sine.

Pentru un antreprenor însă programarea este doar o unealtă pe care o foloseşte în alte scopuri, să construiască chestii, să facă bani, să îşi construiască jucării.

Tu pentru ce foloseşti programarea?

 Comentarii (22)

Categorii:

Surse libere pentru problemele rezolvate din arhive

wefgef
Andrei Grigorean
23 februarie 2012

După cum bine ştiţi, infoarena şi-a pus de mult timp problema accesului liber la toate sursele trimise de concurenţi, atît cele din timpul rundelor de concurs cît şi cele din arhivă. Există argumente atît pro cît şi contra, iar o decizie în această direcţie nu a putut fi luată pînă acum.

În urmă cu trei luni am decis în timpul unei şedinţe să cerem părerea comunităţii. Am creat un poll pe forum, iar rezultatele le puteţi vedea aici. Discuţia pe marginea acestui subiect a devenit foarte interesantă şi a atras multe păreri. Rezultatul sondajului a fost indecis, scorul final fiind 29 - 29 :).

Luînd în considerare toate argumentele aduse şi discutînd cu mai mulţi membri ai comunităţii am decis că cea mai bună soluţie este să facem sursele libere doar pentru acei concurenţi care au rezolvat deja problema integral. Împreună cu bogdan2412Bogdan-Cristian Tataroiu bogdan2412 am lucrat aceste zile la această schimbare, iar acum puteţi vedea toate soluţiile trimise pentru problemele pe care le-aţi rezolvat deja. Această măsură se aplică doar pentru arhiva de probleme şi pentru arhiva monthly.

Spor la treabă în continuare!

 Comentarii (8)

Categorii: Features infoarena
Vezi pagina: 12345... 789101112 1314151617... 3637383940 (397 rezultate)