Blog infoarena

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

Intrebare de interviu pe Wall Street

Cosmin
Cosmin Negruseri
22 februarie 2012

O furnica sta la punctul 1 pe axa numerelor reale. La punctul 0 se afla o prapastie. In fiecare moment de timp furnica se deplaseaza cu o unitate in stanga cu probabilitate 1/3 si o unitate in dreapta cu probabilitatea 2/3. Sa se determine probabilitatea ca furnica sa nu cada in prapastie (la infinit).

Discutati in comentarii. Daca ati vazut-o inainte va rog nu comentati.

Puteti generaliza pentru (p, 1 - p).

 Comentarii (56)

Categorii:

Reteta de succes pentru olimpiada judeteana

Cosmin
Cosmin Negruseri
08 februarie 2012

OK, mai sunt doar 3 saptamani pana la olimpiada judeteana de informatica. Ai lucrat cam putin in timpul anului dar vrei sa ajungi la olimpiada nationala. Cum folosesti timpul acesta eficient pentru un rezultat maxim?

Intri in cantonament!

Am patru observatii:

  • Majoritatea elevilor sunt inceti la partea de coding si fac greseli care ii costa calificarea.
  • Aproape tot timpul va fi o problema de programare dinamica pentru elevii in clasele 10-12.
  • Parcurgeri in graf si drumuri minime sunt relativ frecvente pentru clasele 10-12.
  • Geometrie nu prea apare in subiecte.

Recomand urmatoarele regimuri de antrenament pe TopCoder:

Clasa a 9-a:
- 20 de concursuri de divizia 2 in practice room.

Clasele 10-12:
- 50 de probleme de programare dinamica din divizia 2 in practice rooms.
- 50 de probleme de grafuri din divizia 2 in practice rooms.

Problemele trebuie facute in interval scurt de timp, vreo 5 probleme pe zi. Daca nu te prinzi de o problema, mai gandeste-te inca 30 de minute, iar apoi poti citi solutia. Dupa ce ai rezolvat o problema si trece de teste uita-te cum au rezolvat-o cei mai tari din concursul real in limbajul tau. Gandeste-te daca poti sa o codezi mai eficient. Tine minte ce gen de greseali ai facut, eventual noteaza-le.

Dupa atatea probleme de nivel apropiat celor de la OJI facute in practice rooms vei simti cum ti s-a marit viteza de coding si vei face semnificativ mai putine buguri.

In concurs, fiind ceva mai rapid, ai timp sa implementezi solutii care iau puncte pentru fiecare problema.

Daca faci ce am zis mai sus te vei califica la ONI aproape sigur. Bafta!

 Comentarii (31)

Categorii:

Viata de dupa olimpiade (III) - Startup

domino
Mircea Pasoi
06 februarie 2012

Acesta este al 3-lea post (si ultimul) din seria “Viata de dupa olimpiade?”. Citeste si partea 1 si partea 2.

Startup

Despre ce e vorba?

Startup-ul este optiunea a 3-a despre care n-am stiut ca exista pana cand n-am citit eseele lui Paul Graham si pentru care n-am gasit nici un exemplu in mediul olimpiadelor romanesti... Exista startupuri de succes si in Romania, dar nu stiu nici unul care sa fi pornit din acest mediu.

Personal, cred ca sa ai propriul startup o provocare total diferita fata de optiunile #1 sau #2. Multa lume crede ca e vorba de bani, dar ai probabilitate mult mai mare sa faci bani in industrie ca angajat. E vorba de libertate si de a schimba lumea in bine:

“We’re here to put a dent in the universe. Otherwise why else even be here?” - Steve Jobs

Suna bine, dar e mai usor de zis decat de facut. Este de departe cel mai greu lucru pe care l-am facut vreodata in viata. Sa iei o medalie la IOI? Un fleac comparat cu a avea propria companie:

“People say you need a lot of passion for what you’re doing, and it’s totally true, and the reason is .. is, because it’s so hard, that if you don’t, that any rational person would give up”. It’s so hard to be successful, and it needs to be sustained over such a long period, that if you don’t love it – you’re going to give up. Any sane person would.” - Steve Jobs

Este greu fiindca totul se misca foarte repede, este haos continuu, trebuie sa lucrezi aproape non-stop, iar fluctuatiile emotionale sunt ca un “roller-coaster” - intr-o zi crezi ca esti “the next Google”, in a doua zi ai impresia ca o sa dai faliment. Intr-o perioada foarte scurta trebuie sa inveti foarte multe, sa evoluezi personal si profesional si sa-ti impingi limitele cum nu ai mai facut-o vreodata - supravietuirea companiei tale depinde de tine!

In acelasi timp, a fost si cea mai satisfacatoare experienta din viata de pana acum:

“They may be very good engineers, or sales people, or marketing, or execs. But they ain’t entrepreneurs. They’re just resume gardening and they’re really no different from everyone else.
I don’t care if you’re a billionaire. If you haven’t started a company, really gambled your resume and your money and maybe even your marriage to just go crazy and try something on your own, you’re no pirate and you aren’t in the club.
That thrill of your first hire, when you’ve convinced some other crazy soul to join you in your almost certainly doomed project. The high from raising venture capital and starting to see your name mentioned in the press. The excitement of launch and…gulp…customers! and the feeling of truly learning something useful, you’re just not sure what it is, when the company almost inevitably crashes and burns.” - Michael Arrington

Cum ajung acolo?

Nu te-am speriat destul? Foarte bine, pentru ca asa cum ziceam in partea #2, suntem intr-un moment unic in istorie, inceputul industriei tehnologice, iar orice domeniu care nu a fost inca revolutionat de tehnologie, o sa fie in anii ce urmeaza. Sunt oportunitati la tot pasul, este sansa generatiei noastre!

O lectie pe care o inveti repede este ca ideea nu conteaza, totul este despre executie. Ca sa executi cat mai bine, trebuie sa fii intr-un mediu cu oameni care au mult mai multa experienta ca tine. Un mediu bun este critic pentru startup - un antreprenor mediocru intr-un mediu bun va avea rezultate mai bune decat unul mult mai capabil, dar care sta in Romania.

Cand vine vorba de startup-uri, cel mai bun mediu este de departe Silicon Valley (sau cat mai aproape de el). Totusi, ca roman, incepi cu un mare handicap (pe langa bariera de cultura): nu poti sa lucrezi in US la compania ta si trebuie sa muncesti si mai tare ca sa gasesti solutii pentru viza.

Daca chiar vrei sa faci asta, iti ofer 2 planuri:

Plan A (rational)

  • Te angajezi la o companie in Silicon Valley (vezi partea #2) cat mai repede, nu mai face master sau PhD
  • Stai 3-4 ani si iti iei green card, pui si niste bani in banca
  • Abia dupa asta, cu green card si niste bani, poti sa faci un startup
  • Ideal te bagi intr-un incubator cat mai bun din Silicon Valley

Plan B (nebun)

  • Gasesti acum un incubator care accepta oameni din toata lumea (inclusiv Romania)
  • Te muti de tot din Romania in tara in care e incubatorul si lasi totul in urma. Speri ca totul se va rezolva, cumva (antreprenorii sunt mereu optimisti!)
  • Gasesti solutii creative pentru a lucra acolo si a evita sa fii dat afara din tara

Dupa incubator, aventura abia incepe, dar povestea aia o las pentru alta data. Desi noi am facut planul B, nu pot sa recomand asta tuturor, pentru ca a fost extrem de riscant si am avut foarte mult noroc ca am reusit in final :)

Cu cine sa mai vorbesc?

Daca ai intrebari, eu si wickedmanCristian Strat wickedman o sa incercam sa raspundem in comentarii.

 Comentarii (12)

Categorii:
Vezi pagina: 12345... 789101112 1314151617... 3637383940 (394 rezultate)