KÄ es ieguvu 3 no 4 zelta medaļÄm skaitļoÅ”anas olimpiÄdÄ
Gatavojos Google HashCode World Championship Finals 2017. Å Ä«s ir lielÄkÄs Google organizÄtÄs sacensÄ«bas ar algoritmiskÄm problÄmÄm.
Es sÄku mÄcÄ«ties C++ no nulles devÄ«tajÄ klasÄ. Es neko nezinÄju par programmÄÅ”anu, algoritmiem vai datu struktÅ«rÄm. KÄdÄ brÄ«dÄ« es uzrakstÄ«ju savu pirmo koda rindiÅu. SeptiÅus mÄneÅ”us vÄlÄk pie apvÄrÅ”Åa parÄdÄ«jÄs programmÄÅ”anas konkurss. Es gribÄju redzÄt, cik labi darbojas mans programmÄÅ”anas stils. TÄ bija ideÄla iespÄja.
PÄc divu dienu sacensÄ«bÄm nÄca rezultÄti: izcÄ«nÄ«ju zelta medaļu.
ES biju Å”okÄts. Es biju priekÅ”Ä konkurentiem ar 5 gadu pieredzi. ZinÄju, ka esmu smagi strÄdÄjis, taÄu Å”is sasniegums pÄrsniedza visas manas cerÄ«bas. Es sapratu, ka sporta programmÄÅ”ana ir mana tÄma, un iegrimu tajÄ.
Es zinu, kas mani noveda pie panÄkumiem, un vÄlos tajÄ dalÄ«ties ar jums.
C++ ā ļoti iesaku! ViÅÅ” ir ļoti Ätrs. STL dÄļ algoritmu ievieÅ”ana aizÅem maz laika. C++ tiek pieÅemts visos konkursos. Es uzrakstÄ«ju savu pirmo koda rindiÅu C++ valodÄ.
C ā apgÅ«stiet C++ STL dÄļ. Ja zini C, vari programmÄt arÄ« C++ valodÄ.
Java ir lÄna programmÄÅ”anas valoda. Tam ir Big Integer klase, taÄu tas jums daudz nepalÄ«dzÄs. Ja konkursam ir laika ierobežojums, ar Java jÅ«s to noteikti pÄrsniegsit. Java netiek pieÅemta visos konkursos.
PirmkÄrt, jums ir jÄuzlabo savas zinÄÅ”anas par pamatiem
Kad esat pieradis pie valodas sintakses, jums ir jÄpÄrvar dažas problÄmas. SÄciet ar vienkÄrÅ”Äm problÄmÄm, kurÄm nepiecieÅ”ama prakse. Å ajÄ posmÄ galvenais ir noteikt savu programmÄÅ”anas stilu. VarbÅ«t jums patÄ«k rakstÄ«t kodu ar lielu atstarpi, varbÅ«t jums nepatÄ«k. JÅ«s, iespÄjams, ievietojat iekavas tajÄ paÅ”Ä rindÄ ar ājaā, vai arÄ« ievietojat tÄs atseviŔķÄs rindÄs.
Jums ir jÄatrod savs programmÄÅ”anas stils, jo tas ir TAVS stils.
MeklÄjot to, atcerieties divus pamatprincipus:
JÅ«su kodam jÄbÅ«t viegli ievieÅ”amam. Jums vajadzÄtu justies Ärti, Ä«stenojot piedÄvÄto risinÄjumu. KÄpÄc? Jo sacensÄ«bu laikÄ pÄdÄjais, ko vÄlaties, ir pazust savÄ kodÄ. VienmÄr ir labÄk pavadÄ«t papildu 5 minÅ«tes, domÄjot par to, kÄ vienkÄrÅ”ot koda ievieÅ”anu, nekÄ pavadÄ«t 10 minÅ«tes, mÄÄ£inot to izdomÄt.
JÅ«su kodam jÄbÅ«t viegli lasÄmam. Ja kodu ir viegli lasÄ«t, to ir viegli atkļūdot. AtzÄ«simies ā kļūdas notiek visu laiku. JÅ«s zinÄt to sajÅ«tu, kad jums ir atlikuÅ”as 10 minÅ«tes un jÅ«s nevarat atrast sasodÄ«to kļūdu? Protams, tu dari. Lai izvairÄ«tos no Å”Ädas situÄcijas, ierakstiet salasÄmu kodu. Kad sÄksit to atkļūdot, kods ŔķitÄ«s dabisks un viegli saprotams.
Prakse, prakse un vÄl prakse. Es iesaku jums izskatÄ«t pirmÄs 250 visvairÄk atrisinÄmÄs problÄmas SPOJ. Atrisiniet tos secÄ«bÄ. Pavadiet vismaz stundu, domÄjot par risinÄjumu katram no tiem.
Nesakiet: "Å Ä« problÄma man ir pÄrÄk grÅ«ta, es mÄÄ£inÄÅ”u atrisinÄt nÄkamo." TÄ domÄ zaudÄtÄji.
PaÅemiet papÄ«ra lapu un zÄ«muli. PadomÄ par to. VarbÅ«t jÅ«s varat atrast risinÄjumu, varbÅ«t nÄ. JÅ«s attÄ«stÄ«sit vismaz algoritmisko domÄÅ”anu. Ja nevarat atrast risinÄjumu stundas laikÄ, meklÄjiet gatavu risinÄjumu forumÄ vai rakstos.
Ko jÅ«s sasniegsiet ar Å”o pieeju? IemÄcieties Ätri Ä«stenot savas idejas, izmantojot kodu. Un studÄjiet klasiskÄs problÄmas un algoritmus.
OtrkÄrt, jums ir jÄapgÅ«st algoritmi un datu struktÅ«ras
IevÄrojiet hierarhisku pieeju. Vai sÄkÄt skriet, nezinot, kÄ staigÄt? NÄ. Vai jÅ«s varat uzbÅ«vÄt debesskrÄpi bez stabila pamata? Ne atkal.
JÅ«s nevarat ignorÄt soļus mÄcÄ«bu ceļÄ. Ja jÅ«s tos ignorÄsit, jums paliks zinÄÅ”anu nepilnÄ«bas. Laika gaitÄ tie tikai pasliktinÄsies.
SÄciet ar pamata algoritmiem un datu struktÅ«rÄm
Ir grÅ«ti sÄkt. VarbÅ«t tÄpÄc, ka nezinÄt, ko vispirms studÄt. TÄpÄc Izveidoju video kursu āAlgoritmi un datu struktÅ«rasā. Veidojot Å”o kursu, ÅÄmu vÄrÄ to, kÄ es vÄlÄtos, lai mani mÄca. Reakcija bija neticama! PirmajÄ mÄnesÄ« kursiem reÄ£istrÄjÄs vairÄk nekÄ 3000 studentu no vairÄk nekÄ 100 valstÄ«m.
Ja strÄdÄjat pie vieglu problÄmu risinÄÅ”anas, jÅ«s nekad neuzlabosit.
VisefektÄ«vÄkais veids, kÄ saprast to, ko nezinÄt, ir piedzÄ«vot to praksÄ. TÄ es iemÄcÄ«jos. IzvÄloties izaicinoÅ”u uzdevumu, es apguvu daudzas jaunas tehnikas, par kurÄm iepriekÅ” nebiju dzirdÄjis.
Katrai treÅ”ajai problÄmai, pie kuras strÄdÄjat, vajadzÄtu iemÄcÄ«t jums kaut ko jaunu. Esiet uzmanÄ«gÄks, izvÄloties problÄmas. IzvÄlieties grÅ«tÄkas problÄmas!
Kad bÅ«siet aizpildÄ«jis Ŕīs 250 SPOJ problÄmas, jums bÅ«s pamata izpratne par sporta programmÄÅ”anas galvenajÄm tÄmÄm. Ar dziļu izpratni par pamatalgoritmu loÄ£iku augsta lÄ«meÅa algoritmi ŔķitÄ«s mazÄk sarežģīti. TÄdÄ veidÄ jÅ«s varat maksimÄli izmantot savas zinÄÅ”anas.
Iedziļinieties katrÄ no galvenajÄm tÄmÄm
Å eit ir vÄrtÄ«gs resurss ar daudz informÄcijas. Tur jÅ«s atradÄ«siet 10 populÄrÄkos algoritmus un datu struktÅ«ras katrai tÄmai. PÄc 250 problÄmÄm no SPOJ jÅ«s daudz uzzinÄsit no Ŕī saraksta. Bet jÅ«s arÄ« paklupsiet uz daudzÄm lietÄm, par kurÄm jÅ«s nekad iepriekÅ” neesat dzirdÄjis. TÄpÄc sÄciet pÄtÄ«t Ŕīs tÄmas augoÅ”Ä secÄ«bÄ.
Ja pÄc kaut kÄ jauna apguves nenostiprinÄsi savas zinÄÅ”anas, Ätri visu aizmirsÄ«si.
Iesaku pÄc jauna algoritma apguves to izmantot praksÄ. Veiciet 2-3 uzdevumus. MeklÄjiet algoritma tagu vietnÄ SPOJ. Tur jÅ«s atradÄ«siet problÄmas, kuru risinÄÅ”anai nepiecieÅ”ams Å”is algoritms. Vispirms risiniet Ŕīs problÄmas.
Izprotiet dinamisko programmÄÅ”anu, jo tÄ jÅ«s novedÄ«s pie uzvaras
PÄc manas pieredzes, katrÄ konkursÄ ir vismaz viena problÄma dinamiskÄ programmÄÅ”ana. Daudziem cilvÄkiem rodas galvassÄpes, dzirdot frÄzi ādinamiskÄ programmÄÅ”anaā, jo viÅi to nemaz nesaprot.
Un tas ir labi. Jo, ja tu saproti dinamisko programmÄÅ”anu, tad uzvarÄsi.
Man patÄ«k dinamiskÄ programmÄÅ”ana, tÄ ir mana mīļÄkÄ tÄma. DinamiskÄs programmÄÅ”anas noslÄpums ir izdarÄ«t globÄli optimÄlas izvÄles, nevis tikai lokÄlas. ProblÄma ir jÄsadala vienkÄrÅ”Äkos apakÅ”problÄmÄs. Atrisiniet katru no Ŕīm apakÅ”problÄmÄm tikai vienu reizi. PÄc tam izveidojiet risinÄjumu, kas apvieno atrisinÄtÄs apakÅ”problÄmas. MantkÄrÄ«gs algoritms - pretstats dinamiskajai programmÄÅ”anai. Tas prasa lokÄli optimÄlas izvÄles katrÄ posmÄ. Un lokÄli optimÄla izvÄle var novest pie slikta globÄla risinÄjuma.
Vai esat kÄdreiz dzirdÄjuÅ”i par sportistiem, kuri uzvar olimpiskajÄs spÄlÄs bez gadiem ilgas prakses? Es nÄ.
Katru gadu gatavoÅ”anÄs datoru olimpiÄdei sÄkÄs septembrÄ« un noslÄdzÄs aprÄ«lÄ«.
Katru dienu Å”os 8 mÄneÅ”us es trenÄjos 5 stundas.
Un jÄ, Ŕīs 5 stundas es pavadÄ«ju tikai algoritmisku uzdevumu risinÄÅ”anai. Atceros tos laikus, kad trenÄjos 8 un pat 10 stundas. KÄpÄc? Jo man patika. Katru dienu, kad atgriezos mÄjÄs no skolas, es devos tieÅ”i uz guļamistabu, apsÄdos pie datora un sÄku analizÄt jaunu problÄmu. Vai arÄ« es mÄcÄ«jos jaunu algoritmu, kas man bija jÄzina, lai atrisinÄtu Å”o problÄmu.
Ja vÄlaties uzvarÄt, jums ir jÄdara tas pats. IzvÄlieties problÄmu un pieturieties pie tÄs. PadomÄjiet par to, ejot uz lielveikalu vai braucot ar automaŔīnu.
Vai zinÄjÄt, ka guļot jÅ«su smadzenes defragmentÄ tajÄ dienÄ savÄkto informÄciju? Å Ä·iet, ka viÅÅ” grÄmatu plauktÄ sakrauj grÄmatas alfabÄta secÄ«bÄ. BÅ«tÄ«bÄ jÅ«su smadzenes domÄ par dažÄdÄm problÄmÄm, ar kurÄm jÅ«s saskaraties.
To var prasmÄ«gi izmantot. Pirms gulÄtieÅ”anas izlasiet sarežģītu problÄmu un atcerieties, kas nepiecieÅ”ams, lai to atrisinÄtu. Å ajÄ posmÄ jums nav jÄmeklÄ pats risinÄjums. Ej gulÄt. JÅ«su smadzenes sÄks apstrÄdÄt Å”o problÄmu. Pamostoties, jÅ«s bÅ«siet pÄrsteigts, saprotot, ka atradÄt risinÄjumu, kamÄr bijÄt miegÄ.
IzmÄÄ£iniet to pats. Tas ir kÄ maÄ£ija.
Es izveidoju video emuÄru
Å Ä« Ä«sÄ rindkopa nav saistÄ«ta ar sporta programmÄm. Ja jums ir divdesmit un vÄlaties uzzinÄt, kÄ es redzu pasauli, jÅ«s varÄtu vÄlÄties pÄrbaudÄ«t mans video emuÄrs vietnÄ Youtube. Es tajÄ runÄju par pasauli, dzÄ«vi un datorzinÄtnÄm.
StrÄdÄjiet gudri
Tas ir veiksmes noslÄpums. Jums ir vajadzÄ«gi mÄrÄ·i.
MÄs esam cilvÄki un mums tas patÄ«k atlikt. MÄs vienmÄr vÄlamies atlikt to, kas jÄdara tieÅ”i tagad. Netflix skatÄ«Å”anÄs vienmÄr ir patÄ«kamÄka nekÄ dinamiskas programmÄÅ”anas problÄmu risinÄÅ”ana. JÅ«s to zinÄt, un jums tas ir jÄizlabo.
KÄ uzveikt vilcinÄÅ”anos
Izvirziet sev mÄrÄ·us. JÅ«s vienmÄr atradÄ«sit interesantas problÄmas, no kurÄm varat uzzinÄt kaut ko jaunu (apskatiet iepriekÅ” minÄtos resursus). TaÄu Ŕīs problÄmas ir jÄrisina, nevis tikai jÄlasa.
TÄtad, lÅ«k, kÄ es pÄrvarÄju vilcinÄÅ”anos. Es sÄku papÄ«ra kalendÄru un katru dienu piepildÄ«ju ar problÄmÄm, kuras vÄlÄjos atrisinÄt. Es vienmÄr aizpildÄ«ju problÄmas divas dienas iepriekÅ”. TÄpÄc es zinÄju, kÄ pÄrvaldÄ«t savu laiku nÄkamajÄs dienÄs.
TÄpÄc es vienmÄr biju motivÄts. Man vajadzÄja atrisinÄt dažas problÄmas un atrast jaunas, ar kurÄm aizpildÄ«t nÄkamÄs dienas kalendÄrÄ. AtrisinÄto problÄmu pÄrsvÄ«troÅ”ana jÅ«tas lieliski. Es zinu, ka tev arÄ« patÄ«k.
IegÅ«stiet savu papÄ«ra kalendÄru. Neveidojiet savÄ tÄlrunÄ« citu uzdevumu sarakstu, par kuru rÄ«t aizmirsÄ«sit.
KÄ efektÄ«vi atkļūdot
Vai vÄlaties kļūt par profesionÄli? Ja jÄ, jums tas ir "jÄatkļūdo savÄ prÄtÄ".
Å Ä« ir visefektÄ«vÄkÄ atkļūdoÅ”anas tehnika, ko zinu, jo tai vispÄr nav nepiecieÅ”ams atkļūdotÄjs. JÅ«su smadzenes pÄrbauda vairÄkas koda zarus vienlaikus un sniedz jums daudz plaÅ”Äku koda pÄrskatu, salÄ«dzinot ar klasiskais atkļūdotÄjs.
JÅ«s varat salÄ«dzinÄt sevi ar lielmeistaru, kurÅ” spÄlÄ Å”ahu un domÄ 3 gÄjienus uz priekÅ”u.
Es izmantoju Å”o paÅÄmienu tikai kÄ savu sÄkotnÄjo aizsardzÄ«bas lÄ«niju. Tad es izmantoju Ä«stu atkļūdotÄju.
Lai iemÄcÄ«tos atkļūdot savÄ galvÄ, jums ir jÄtrenÄjas. Kad validÄjat problÄmas risinÄjumu un saÅemat ānepareizu atbildiā, nepÄrejiet tieÅ”i uz atkļūdotÄja pogu. AtkÄrtoti izlasiet kodu un padomÄjiet: āKas notiek Å”ajÄ rindÄ?ā, āKÄ ājaā Å”eit ietekmÄ programmu?ā, āKad izejam no cilpas, kÄda ir iteratora vÄrtÄ«ba?ā
TÄdÄ veidÄ jÅ«s domÄjat par sevi. Laika gaitÄ jÅ«s iemÄcÄ«sities rakstÄ«t kodu un atkļūdot to lidojuma laikÄ.
Par Autors
Andrejs Margeloiu ir dedzÄ«gs programmÄtÄjs, kurÅ” interesÄjas par uzÅÄmÄjdarbÄ«bu, jaunizveidotiem uzÅÄmumiem un brÄ«vÄ dabÄ. JÅ«s varat sazinÄties ar viÅu vietnÄ LinkedIn.