Razotkrivanje mitova natjecateljskog programiranja - to ne trebate naučiti

Sad kad imam vašu pažnju s naslovom posta, dopustite mi da detaljno proučim svoje stavove o natjecateljskom programiranju.

Što je natjecateljsko programiranje?

Natjecateljsko programiranje je sport. Morate riješiti problem s kodom koji je brz, troši minimalnu količinu memorije i često je praktično nečitljiv.

Super je popularan među studentima i onima koji pokušavaju ući u velike tvrtke, prvenstveno jer im pomaže da se plasiraju u te tvrtke. Nažalost, milijuni ljudi su zaposleni zbog nekog znanja koje nikada ne bi koristili na svom poslu.

Sustav je pokvaren

Evo još jednog primjera od Hen-Wen:

Postoji mnoštvo primjera kojih se mogu sjetiti.

Stvoritelj homebrewa - upravitelja paketa koji koriste gotovo svi koji koriste macOS? Odbijen. Tvorac WhatsAppa? Odbili Facebook i Twitter.

Pa, što se ovdje događa? Nisu li ti ljudi dovoljno kvalificirani za rad u tim MNC-ima?

Ne, odgovor je da ti momci mogu razviti korisne alate i napisati sjajan softver s vrhunskom kvalitetom koda, ali vjerojatno ne uspijevaju (pre) izmisliti algoritam za invertiranje binarnog stabla u vremenskom ograničenju od 30 minuta.

Neki od najboljih napisanih koda nisu napisani u 30 minuta. Neki od najboljih algoritama napisanih u jezgri Linuxa koji se koriste i danas Linus nije napisao za 30 minuta. Neki od najboljih korisničkih sučelja poput Stripea nisu dizajnirani za 30 minuta.

Pa kako neka slučajna HR osoba u nekoj slučajnoj tvrtki može odlučiti koliko vrijedi za 30 minuta?

Na ovaj način tvrtke procjenjuju vašu "izvedivost" - tako što vide mogu li riješiti problem s igračkama potpuno nevezano za bilo koji posao koji ste možda radili u prošlosti ili biste mogli raditi u budućnosti.

Može li se to popraviti?

Ne znam. Mogu se žaliti i vikati sve što želim, ali iskreno ne znam kako tvrtke mogu brzo i ispravno procijeniti osobu koja se prijavljuje za posao.

Ako želite brzo, izgubit ćete puno dobrih kandidata poput gore spomenutih. Ako ne želite izgubiti nijednog dobrog kandidata, razgovor bi mogao trajati predugo - puno duže nego što si tvrtka može priuštiti.

Natjecateljsko programiranje! == Programiranje u stvarnom svijetu

Intervjui za tvrtke više su ispit na kojem morate pamtiti i učiti o stvarima koje nećete koristiti nakon što dobijete posao.

Mislite da biste možda trebali naučiti Dijkstrin algoritam za rad na Google kartama, ali ozbiljno, mislite li da će Google jedan od svojih osnovnih proizvoda predati nekom novom u tvrtki? Mislite li da nećete dobiti nikakvu pomoć od svojih vršnjaka?

Vjerojatno ćete raditi na sučelju za proizvod ili distribuiranim sustavima, umjesto da radite na nekom od Googleovih cor algoritama. To znači da od vašeg znanja o "natjecateljskom programiranju" nema koristi.

U stvarnom svijetu gotovo nećete imati koristi od natjecateljskog programiranja. Nijedan algoritam pokrenut na proizvodnim Microsoftovim poslužiteljima nije napisan u nečitljivom kodu, s kratkim i besmislenim imenima varijabli, nedokumentiranim i optimiziranim samo za brzinu, a ne za čitljivost ili održavanje.

Minificiranje i poboljšanje performansi dolazi kasnije, s automatiziranim alatima puno vremena. Šanse su da ste, ako ste konkurentni programer, stekli lošu naviku pisanja ružnog koda.

Svatko može napisati kod za strojeve. Pitanje je, možete li napisati kod za ljude?

Ali ima nade

Sjediti na ovakvim intervjuima i nadati se da možete riješiti pitanje igračke koje ste pripremali 3-5 mjeseci učeći samo DSA i natjecateljsko programiranje jedan je od načina.

Postoji još jedan način - surađivat će s manje tvrtki i ljudi, ali uživat ćete u tome i usput naučiti puno stvarnih stvari. Također ćete biti korisniji od onih ljudi koji samo za to uče "konkurentno kodiranje".

Izgradi nešto. Bilo što. A onda gradite više na tome. Imajte jak portfelj. Imati cjelovit skup vještina koji je koristan za tvrtke. Ovladajte tehnološkim stogom - posjedujte ga. Neka projekti, blogovi i iskustvo pokažu da ste ono što je u vašem životopisu. Izgradite veze, umrežite se s ljudima, tražite njihove preporuke.

Na puno mjesta konkurentno kodiranje nije jedini način da se očisti intervju - postoje sve vrste ljudi koji vode sve vrste tvrtki. Osoba koja se slaže s mojim PoV-om i vodi tvrtku ne bi zapošljavala ljude samo na osnovu njihovog "konkurentnog" znanja.

Vaš posao može vas odvesti na mjesta koja niste mogli zamisliti. Najlakši je način uvijek pratiti svjetinu. Ali ništa dobro ne dolazi lako, barem ako ste dovoljno ambiciozni. Miješanje samo prave količine ambicije i hrabrosti može učiniti čuda.

Svijetu su potrebni sjajni programeri za napredak, za pomicanje čovječanstva naprijed, a ne za ljude koji se mogu zaposliti.

Ne brkajte DSA s natjecateljskim programiranjem

U početku nisam želio napisati ovaj odjeljak, ali znao sam da će previše ljudi to zbuniti. DSA - Strukture podataka i algoritmi nešto su drugačije. Hrpa, karte, nizovi, vektori, povezani popisi, itd., Sve su to od velike pomoći i u stvarnom programiranju.

Zabavan je dio što to razumijevanje možete razviti i iskustvom. Nikad nisam izričito naučio o "hrpi" koristeći neki veliki 50-satni DSA tečaj. A ako učite programirati, ne treba vam jako duboko razumijevanje ni toga.

Dubinski DSA potreban je kada želite učiti informatiku, a ne programiranje. Shvatite razliku, informatika je teorija - programiranje je praktično.

Budite svjesni stvari koje postoje, algoritama koji postoje i struktura podataka koje postoje. Ne trebate ih sve učiti ili pamtiti. Zvuči mi ludo glupo pamtiti ili naučiti nešto što se rijetko koristi kada to mogu dobiti uz malo pomoći kolega i interneta.

Moja priča

Ja sam ne natjecateljski koder, vjerojatno jedini CS preddiplomske u mom sveučilištu koji nikada dotaknuo konkurentna kodiranje u koledž .

Zašto? Jer sam to probao prije 4-5 godina i mrzio. Zašto? Jer sam mogao vidjeti kako trošim 3-5 sati svog dana, svaki dan, rješavajući probleme koji mi nisu donijeli ništa. Znao sam još nešto ili dvije o pristupu sljedećem pitanju, ali je li to bilo dovoljno za utjecaj? Je li to bilo dovoljno da se istakne iz mase?

Što sam dobro radio? Činilo mi se kao da gubim vrijeme na već riješena pitanja. Moglo bi biti drugačije za sve, ali sretan sam kad vidim da drugi ljudi koriste stvari koje sam programirao (dotad sam započeo kao web programer).

Jednostavno nisam mogao podnijeti gubljenje vremena učeći nešto što nikada ne bih koristio u stvarnom svijetu. Nekada sam sudjelovao u Googleovom Code Jamu i Facebook Hacker Cupu. Ali ubrzo mi je dosadilo i frustrirao sam se, zbog nedostatka bolje riječi, i nikad joj se zapravo nisam vratio. Posao ili praksa me se nisu ticali, nikad.

Jednom sam sjeo za Googleove intervjue u kampusu. Imali su nastavak kruga užeg izbora kao prvi krug, za razliku od svih ostalih tvrtki u kojima je bio prvi krug, pričekajte, konkurentski kodiranje. Pa, prošlo je 7 godina web razvoja i iskustva sa sustavima.

Svejedno, za Google sam bila jedina osoba koja je ušla u uži izbor s prosjekom prosjeka 7,5 (najveći prosjek prosjeka 10 u Indiji). Ostatak od 10-15 ljudi bilo je iznad 8,5 ili 9.

Nisam ponovno prošao natjecateljski krug, ali to me naučilo da je moguće probiti se u prvi krug tvrtke poput Googlea samo vašim životopisom. Stoga je važno raditi na tome.

Zaključak

TL; DR - Da biste uspjeli u životu, ne morate naučiti kompetitivno kodiranje. Morate naučiti nešto što vam se toliko sviđa da biste to savladali i nenadmašni ste u svom polju. To je sve.

Imate stavove i mišljenja? Povežite se sa mnom na Twitteru i Instagramu i razgovarajmo!