Programmering olympiader - hjelper de i virkelig arbeid? Pyotr Mitrichev - Legend of Sports Programming Å komme opp med slike problemer er en spesiell ferdighet.

"Vi vil ikke gå til Facebook og Google": Hvorfor noen av de beste programmererne i verden bor og jobber i Jekaterinburg

Et interessant intervju med vinnerne av verdensmesterskapet i programmering fra Ural Federal University.

Jeg har alltid vært interessert i å forstå hvorfor programmeringskonkurranser er så populære i Russland (mer presist, i det post-sovjetiske rommet generelt) (sannsynligvis passer begrepet som brukes i denne artikkelen: "sportsprogrammering"), til tross for at at i det råtnende Vesten snakker jeg om dem I lang tid visste jeg ikke engang, og da jeg visste det, følte jeg meg av en eller annen grunn ikke tiltrukket av det i det hele tatt. Det er som en helt egen verden. I mange år deltok jeg aktivt i forskjellige nettbaserte programmeringsfellesskap, for eksempel hang jeg på e-postlistene til forskjellige åpen kildekode-prosjekter, møtte noen ganger folk i det virkelige liv, men det var aldri noe snakk om TopCoder, si. Det faktum at TopCoder eksisterer, fant jeg ut av en russisk LJ, etter min mening (og etter å ha lært om det, dro jeg ikke umiddelbart og raskt dit, opprettet en konto og deltok ikke.) Det er på en eller annen måte veldig morsomt og interessant å forstå hvorfor.

En del av denne populariteten er forklart av noen kommentarer fra dette intervjuet, etter min mening:

"Hvorfor viste UrFU det beste resultatet denne gangen? Står stjernene på linje?"

Mikhail Rubinchik: Vi har et fantastisk team. Oleg, Lesha og alle de andre er veldig sterke gutter. Oleg er nå på sitt sjette år, han begynte å studere på det andre, men på det tredje hadde han allerede et anstendig nivå.[...]

"Hvilken er nærmest deg? En startup? Eller et stort selskap?"

Oleg Merkuryev: Jeg har ikke jobbet noe sted i det hele tatt. Og jeg kommer ikke til å jobbe noe sted de neste seks månedene. Jeg skal gå på forskerskolen, jeg trenger å studere litt naturfag, ellers brukte jeg generelt all min tid på sportsprogrammering.

De. det føles virkelig som en sport først og fremst. Inkludert noen ville restriksjoner som er typiske for sportskonkurranser:

"La oss snakke litt om selve mesterskapet. Tre personer på laget. Én datamaskin. Hvorfor én? Hvorfor ikke tre?"

Mikhail Rubinchik: Juryen bestemte det en gang. Dette var for tretti år siden.

Oleg Merkuryev: Da var det kanskje flere grunner som ikke eksisterer nå. Og da var til og med én datamaskin per lag mye, men ikke mye per person.

[...]Du kan bruke en skriver i verdenscupen. Den første personen satte seg ned, skrev en løsning, den fungerte ikke. Han må finne feilen. Å lese fra en datamaskin er dyrt, men vi har bare én ressurs. Derfor skriver de det ut på en printer og leser det på et papir.

Vel, jeg forstår ikke hvordan det kan være så attraktivt. Programmering er en kreativ aktivitet. Det var ikke noe program, og nå er det et. Du kunne ikke gjøre noe med en datamaskin, men nå kan du det. Spiller det noen rolle om det tok 20 minutter eller 40 minutter? Det er bare et uinteressant aspekt.

Nei, jeg kan forestille meg restriksjonene som gir sportsspenning - men på nivå med flere dager og virkelig vanskelige, interessante oppgaver. Som Ludum Dare-konkurransen – skriv et spill på to dager. Eller ICFP-programmeringskonkurransen, de gir tre dager, og forholdene er vanligvis utrolige. Sammenlign dette med oppgavene til VM i sportsprogrammering. Hvis du konkurrerer i minutter og sekunder (også med en datamaskin mellom tre), kommer oppgavene slik ut - den utspekulerte bruken av flere standardalgoritmer med en vanskelig "twist".

Generelt er dette en merkelig verden. Ikke skyld på meg, de som er redde for ham. Men jeg forsto ikke og forstår ikke.

Dette er allerede en veldig gammel holivar: er sportsprogrammerere egnet for tøff anvendt utvikling, eller er de slike vakre hvite fugler som svever i matematisk-algoritmiske skyer og går til grunne under mer verdslige forhold? Det er en vanlig myte som sier at alle sportsprogrammerere går til Google eller i det minste til Yandex, hvor de jobber med inspirasjon på søkealgoritmer og lignende. Enkel hviterussisk outsourcing er ikke for dem. Kanskje, om ikke en slutt, så kan i det minste et skilletegn i denne meningskampen settes av fakta. Vi samlet informasjon om alle sportsprogrammerere i landet vårt og basert på tre kriterier:

  • deltatt i ACM ICPC-finalen;
  • talte på vegne av det hviterussiske universitetet;
  • har allerede fullført studiene ved universitetet;

gjort et valg. Resultatet var en liste over tjueen ACM ICPC-finalister fra Hviterussland. Vi var i stand til å kontakte de fleste av dem og stille tre enkle spørsmål:

  1. Hva er din nåværende arbeidsplass og hva er stillingen/essensen av det utførte arbeidet?
  2. Hvorfor denne bedriften/yrket?
  3. Hva er dine planer for fremtiden, hvordan ser du på det selv? Hvor vil du reise?

Noen av dem valgte en lederkarriere, noen forble trofaste mot sportsprogrammering, og hvem som faktisk utvikler søkealgoritmer, vil du finne ut av "direkte tale"Hviterussiske finalister av ACM ICPC.

Ivan Mikhnevich (ACM ICPC 2000)

  1. Wargaming Public Company Limited, direktør.
  2. Dette er et resultat av vekst i konsernet helt fra begynnelsen av min arbeidskarriere.
  3. I virkeligheten er jeg allerede lei av alt dette, og det er på tide å starte en ny karriere, på et nytt sted, i et nytt felt (mest sannsynlig ikke IT).

Sergey Stepantsov (ACM ICPC 2000)

  1. Jeg jobber for tiden som Vice President Business Development hos Intetics Co.
  2. Det meste av karrieren min er knyttet til dette selskapet, hvor jeg klarte å prøve meg i en rekke roller: Jeg begynte som testspesialist, og jobbet også som programmerer, prosjektleder og leder for en produksjonsavdeling. Og etter hvert kom jeg til å spesialisere meg i forretningsutvikling.
  3. Jeg føler meg fortsatt ikke gammel nok til å slutte å utvikle meg selv :). Jeg tror at fremtiden til forretningsdelen av livet mitt fortsatt vil glede meg med mange spennende svinger.

Vladimir Tankovich (ACM ICPC 2000, 2003)

  1. For tiden hos Microsoft jobber jeg med Computer Vision-algoritmer for Kinecta. Før det var jeg i søkerelevans.
  2. Jeg har vært i dette selskapet siden 2005. De hentet meg fra republikken Hviterussland, og det var ingen vits i å flytte ennå. Jeg ble med i dette teamet fordi det lar meg gjøre vitenskapelig arbeid, som ikke går inn i en artikkelsamling, men til et ferdig produkt.
  3. Det er ingen konkrete planer for fremtiden. Innen IT er ikke penger et problem, både i Minsk og her. Så langt er jeg veldig interessert i å forstå Machine Learning og AI. Det viser seg at jeg gjør hva jeg vil nesten hele tiden, og jeg får også godt betalt for det. Det vil si, de neste 1-2 årene skal jeg gjøre det samme, og så får vi se. Jeg får mye erfaring, og hvis jeg har en idé om hvordan jeg kan bruke den på en pålitelig måte, vil jeg prøve en oppstart.

Alexey Kirkovsky (ACM ICPC 2002, 2005)

  1. NT LLC "LuxSoft", programvareingeniør i 2. kategori.
  2. Jeg ønsket virkelig å gå til den berømte Moskva karosseributikken LuxSoft, siden jeg siden barndommen drømte om å automatisere luker, men jeg la ikke merke til en bokstav og endte opp i den hviterussiske LuxSoft. Der signerte jeg noen papirer uten å se, og nå jobber jeg under en 20-årskontrakt for en fast lønn i hviterussiske rubler, som bare er nok for bensin.
  3. Jeg planlegger å møte standarden for antall linjer per minutt og bli en programvareingeniør i 1. kategori. Skaff deg da et CMS i programmering, som jeg får tildelt her dersom det ikke er en eneste forsinkelse med å jobbe i hele kontraktens varighet.

Alexey Danchenko (ACM ICPC 2002, 2005)

  1. NT LLC "LuxSoft" Programvare ingeniør. Nylig har jeg utviklet et domenespesifikt programmeringsspråk for produktet vårt.
  2. En mulighet til å jobbe med venner for å implementere en interessant idé.
  3. Fortsett å nyte livet.

Evgeniy Gonchar (ACM ICPC 2003)

  1. Google Sveits (Zürich), senior programvareingeniør. Jeg jobber med et av nettsøkinfrastrukturprosjektene.
  2. Siden barndommen har jeg elsket programmering.
  3. Jeg vil gjerne komme videre i å spille elektrisk gitar og dra til New Zealand igjen.

Ivan Metelsky (ACM ICPC 2003, 2004)

  1. TopCoder, Inc., Marathon/Algorithm Problem Coordinator. Lansering av maraton- og algoritmekonkurranser på TopCoder.
  2. På en måte ble det bare sånn. Mer seriøst, god inntekt, relativt interessant arbeid, det er vanskelig å finne et bedre alternativ.
  3. Planer for fremtiden - det spiller ingen rolle hvor, men et sted i retning av noe mindre travelhet og mer handlefrihet. Kanskje en slags virksomhet, ikke nødvendigvis innen IT.

Victoria Lebed (ACM ICPC 2004)

  1. Jeg var og forblir matematiker. Hun var den eneste personen på laget som ikke rørte datamaskinen :) Hun gjorde alt "sidearbeidet". Jeg bor og jobber i Paris. Nå har jeg et vikariat ved University of Paris 7 – forskning og undervisning. Fikk nylig doktorgraden min.
  2. Denne aktiviteten er fordi den gir en sjelden mulighet til å opprettholde personlig og kreativ frihet.
  3. Jeg prøver å ikke legge noen planer for fremtiden. Igjen, for ikke å begrense deg til noenda innenfor rammene og ikke utsett deg personlig for byrden av forventninger, forhåpninger og andre ting. jeg har det braJeg ser for meg å fortsette reisen jeg har begynt i universitets- og vitenskapsmiljøet, men jeg lukker ikke døren for andre alternativer.

Maxim Osipov (ACM ICPC 2004)

  1. VironIT, direktør. Virksomhetsstyring (hovedsakelig ikke operativ, men rettet mot å endre salgsprosesser, utvikling, kvalitet på arbeidet, etc.)
  2. VironIT-selskap, fordi det er mitt selskap, er jeg eieren. Dette er en klasse (ikke-operativ ledelse) fordi det er det mest interessante for meg å finne ut hvordan man kan vokse en virksomhet.
  3. Utvikle din bedrift, bytt blant annet til en produktmodell, stift familie og barn. Jeg ser på fremtiden som interessant, vanskelig, men definitivt positiv.

Pavel Irzhavsky (ACM ICPC 2007, 2008)

  1. Lærer ved BSU, matematiker-programmerer ved Orientsoft, lærer ved ShAD, hovedfagsstudent (formelt er dette studie, men faktisk er det nærmere jobb).
  2. Hver aktivitet har noe interessant og nyttig (foruten at de alle genererer inntekter :)), enkle som lar meg slappe av litt, og komplekse som lar meg utvikle meg. Jeg tror jeg blir generelt mindre effektiv når jeg begynner å gjøre det samme i, grovt sett, 8 timer om dagen, og å endre aktiviteter daglig gjør at jeg kan være på topp.
  3. Det er ingen vesentlige endringer i planene for fremtiden :)

Vladimir Kerus (ACM ICPC 2007, 2008)

  1. EPAM. Ledende programvareingeniør for mobilutviklingsavdelingen. Jeg utvikler applikasjoner for Android.
  2. Jeg elsker å lære nye ting, og i mitt nåværende selskap kan jeg enkelt endre profilen min og finne de rette lærerne.
  3. Jeg har allerede plantet et tre, jeg sparer for å bygge et hus, jeg planlegger å få barn (ideelt sett mitt eget Barcelona-lag).

Sergey Tikhon (ACM ICPC 2009)

  1. EPAM Systems, ledende programvareingeniør. Arkitekt/spesiell prosjektutvikler.
  2. Hyggelig, sterkt team, interessante oppgaver, gode muligheter for faglig vekst.
  3. Arbeid innen IT, men på grensen til vitenskap, arbeid med implementering av Data Science i reelle applikasjoner og tjenester (maskinlæring, naturlig språkbehandling, søketeknologi, modellering). Propaganda, formidling og implementering av funksjonell programmering (jeg driver blogg på F#).

Alexey Lobanov (ACM ICPC 2010)

  1. Yandex-selskap, utvikler av Yandex.Maps. Parallelt med dette studerer jeg på forskerskolen til BSU og jobber som assistent ved Institutt for DMA FPMI (jeg underviser i praktiske timer i kurset "Algorithms and Data Structures").
  2. Hvorfor Yandex: det er interessante oppgaver (inkludert komplekse, kunnskapsintensive, algoritmiske), komfortable arbeidsforhold og et utmerket team. Hvorfor FPMI BSU: Jeg tror det er viktig å videreformidle kunnskapen min til neste generasjoner studenter.
  3. Planer for fremtiden: fullfør forskerskolen og prøv å forsvare en Ph.D.

Alexey Tolstikov (ACM ICPC 2010)

  1. BSU, assistent ved Institutt for beregningsmatematikk, ble uteksaminert fra forskerskolen, undervise i kurset« Parallell og distribuert databehandling» (øve på). Yandex,kurator for akademiske programmer, leder for Minsk-avdelingen til School of Data Analysis (+ lærer der), søkeutvikler.
  2. Jeg kan ikke gjøre det i én setning, men fordi: "Jeg liker det!"
  3. Ikke mye å si. Jeg beveger meg i alle disse retningene.

Alt er veldig komplisert og samtidig enkelt. Hvorfor eksisterer sportsprogrammering i det hele tatt? Ikke "hvorfor bry seg med det", men nettopp "hvorfor eksisterer det som et fenomen." Hvorfor trengs det sport i det hele tatt, enten det er intellektuelt eller fysisk. Noen vil si det for helse, utvikling, alt det der? Ja, det er så mange skader i profesjonell idrett at ingen helse er nok. For penger? Ja, alle der blir millionærer på et år. Den sanne grunnen er én: ønsket om å vinne, å være annerledes enn andre, å være bedre, mer perfekt, mer betydningsfull. Gjør noe bra for folket ditt. Alt annet er en konsekvens. Hvis det ikke var for dette ønsket, som gir opphav til konkurranse som sådan, ville ikke alt annet eksistert. Det er det samme her.

Hva tiltrekker folk i begynnelsen. En slags interesse, nyhet, en slags "wow"-effekt. Men det går over. For at bærekraftig motivasjon skal oppstå, kreves det dypere mekanismer. Ellers, hvis det er noe igjen, vil det bare være nok til "for moro"-aktiviteter.

Derfor er det første og viktigste du kan gjøre for å motivere en nybegynner muligheten til å bli best innen ditt felt! Ikke bare en koder, som tusenvis av tusen, men en mester. Tross alt drømmer hver person om noe stort og meningsfylt. Kanskje den gutten som barn drømte om å score mål i Champions League, og denne jenta drømte om å synge sanger i Eurovision. Han gikk på en idrettsskole, og hun gikk på en musikkskole, men det gikk ikke. Men matematikk gikk alltid med et smell, men hva er kult med å være en nerdnerd, løse grove problemer som er interessante for deg alene? Og til en utmerket student som drømte om å bli astronaut, trommede foreldrene hans, som ikke brydde seg om drømmen hans, inn i ham at en astronaut i det minste burde vite hvilke fysiske lover raketter flyr, så han begynte å løse fysikk, alle mer så gikk han med et smell. Og nå har de alle gått inn på universitetet og et sted inne begynner tanken allerede å ringe alarmerende: "Hva så? Kommer jeg virkelig ikke til å gjøre noe enestående her i livet?" Tross alt, stort sett, kan enhver utdannet programmerer erstattes på jobben. Og her er sjansen din: å konkurrere for byen din, for universitetet ditt, for hele Russland, å vinne, å nå semifinalen, finalen, å gjøre noe som hvis du ikke gjør det, så vil ingen andre gjør det.

Da vi først begynte å programmere, i 11. klasse, ble vi fortalt om og om igjen hvordan det hele begynte. For første gang gikk lagene våre til semifinalen. Hvordan klarte du den første oppgaven? Hvordan de kom til finalen for første gang. Hvordan vi reiste til utlandet. Hvordan vi kjempet på like vilkår med de beste hodene på planeten! Og hjertet mitt sank av ønsket om å bli i det minste litt som dem. Vi så på finalebordene og navnene blinket foran øynene våre: MIT, Harvard, Stanford! Drømmer alle om å studere der? Men her er det som er mye kulere: riv alle de anerkjente utenlandske lagene til helvete! Hvordan Tarasovs lag, i den aller første kampen i superserien, raserte laget til de største hockeyproffene fra Canada 7:3. Her er det, våre livs utfordring! Og dette er alt mulig! Dette er virkeligheten! Og det er dette som gjør livet virkelig verdt å leve. Og kanskje en dag på vårt eget universitet vil de samme historiene bli fortalt til rekrutter om oss. Og alle vil drømme om å bli som oss. Det er akkurat slik nykommere ser på OL.

Du vet, vi er alle vant til disse setningene: «semifinalist i verdensmesterskapet», «prisvinner av Nordøst-Europamesterskapet», etc. Dette burde ikke overraske oss. Men for en tilfeldig person på gaten er slike prestasjoner bare plass! Og nykommerne er folkene fra gaten. Så hvorfor ikke bruke det? Tross alt er det å komme til semifinalen i NEERC verdensmesterskap for mange deltakere for resten av livet den høyeste toppen de har oppnådd, den høyeste tittelen de har vunnet. Dette var ingen spøk nå.

Du har ti tusen studenter, og her er muligheten til å bli en av de tre elitestudentene som skal representere universitetet og byen på verdens viktigste studentkonkurranse. Hver av dem er allerede, som de sier, "one of a kind i mange tusen"! Elitedivisjonen til universitetet ditt.

Ja, da blir det timer med hardt arbeid, men hvem sa at det er lett å bli verdensmester? Å jobbe hardt vil skje av seg selv når en person vet at han beveger seg mot et verdig mål. Ingen vil løpe et maraton eller bestige Everest uten forberedelse. Alle forstår dette. Men hvis du går gjennom dette, vil du ha noe du kan respektere deg selv for. Det er det samme her. Ikke mindre.

Men ingen drar til fjells bare for strabasens skyld, eller på maraton bare for å ikke stå opp av senga på en uke. Ingen går inn i bokseringen for kjærligheten til å bli slått i hodet. Det er få masochister. Alle disse menneskene er drevet av noe annet. Akkurat som sportsprogrammerere. Nemlig: mål!

Så hvis du er en gitarlærer, bør du ikke fortelle elevene hvordan fingrene deres vil gjøre vondt og la dem prøve å umiddelbart ta barren ("ja, du kan ikke? Det blir vanskelig!"). Men du kan fortelle hvor kult det er å være livet til festen på en fest rundt bålet og med hvilke øyne jentene vil se på deg. Hvis du er SAF-instruktørpilot, så skal du ikke umiddelbart snakke om hvordan du vurderer for eksempel været. Prøv å formidle følelsen av flukt og romantikk.

Det er det samme her. Hvis du forklarer balanserte trær og på slutten av forelesningen sier: «En olympiadestudent kan skrive dette», vil ingen forstå deg. Hvis du bruker fem timer på å konkurrere og analysere, vil de kjede seg og dra og lete etter barndomsdrømmen andre steder. Noen blir igjen, men uten entusiasme. Så å løse problemer er fortsatt mer interessant enn å løse noen kryssord eller henge rundt på sosiale nettverk i apper. Hvis du tviler på nytten din, suksessen din, vil tvilen din gå videre til rekruttene. Hvis du selv er overbevist om at ICPC er kulere, større, mer betydningsfull enn alle vitenskapelige studentkonferanser og fora til sammen, at det er mulig å vinne, at det allerede har fungert (eller ikke har fungert, men alle venter på det) - de vil også tro deg. Det viktigste er å tro på alt dette selv.

Det er faktisk veldig bra når det er konkurranse. Det er enda bedre når universitetet allerede har finalister, og det er unge og grønne. Ungdommene skal sove og se den første konkurransen, hvor de endelig, i hvert fall i fem minutter, skal slå de gamle! For nybegynnere er det lykke å bare være i monitoren over dem i et minutt.

Dette er det grunnleggende om motivasjon. Dette er algoritmiske problemer som ingen vet hvordan de skal løse, når du klokken tre om morgenen hopper ut av sengen, slår på datamaskinen for å fullføre koden, endelig består denne fordømte 80-testen og blir akseptert, og så føler du litt som Mendeleev, som hadde åpenbaringen i en drøm. Dette er et år med forberedelser, bare fem timer det var alt for, og en avgjørende oppgave levert i siste liten. Det er en ære å representere byen og landet ditt i det du er best på. Vel, da finner de ut av det selv. Det er usannsynlig at du trenger noen som søkte bare for å få en grad og få en vanlig jobb. Alle andre, og som Mirzayanov skrev, matematikere og spillere kommer, hvis de elsker prosessen, hvis de finner ekko av en barndomsdrøm, hvis de ikke er redde for vanskeligheter, hvis de er klare til å spille, velkommen.

Vi blir ofte spurt om sportsprogrammering. Hva er poenget med OL? Hvor viktige er de når du jobber med et virkelig prosjekt? Hvis de er viktige, er det for sent for en 11.-klassing å begynne å studere dette området? Vi henviste selvsagt spørsmålene til ekspertene.

Deltakelse i olympiader utvikler ferdigheter til å jobbe i stressende situasjoner, og det legger mye stress på hjernen. Generelt, under forberedelsene til konkurransen, studerte jeg et ganske stort antall algoritmer og tilnærminger til å løse problemer. I industriell utvikling trenger du sjelden å forholde deg til standardalgoritmer; i det minste trenger du nesten aldri å implementere dem selv. Men å vite hva som er under panseret til en bestemt algoritme, lar deg noen ganger komme opp med en ikke-standard tilnærming for å løse et spesifikt industriproblem. Uansett er det verdt å ta del i olympiadene uansett om disse ferdighetene er viktige eller ikke, det er bare interessant :)

Det er ikke for sent å begynne å studere i 11. klasse. Et fantastisk eksempel er personen som vi spilte ACM ICPC-finalen med i fjor. Han begynte aktivt å delta i Olympiads i sitt 2. (!) år og oppnådde meget gode resultater.

Fremme Degrader

Mye avhenger av hva slags prosjekt. Flertallet (95%) av prosjektene er relatert til automatisering av forretningsprosesser, grafikk osv. I slike prosjekter spiller olympiadeferdigheter praktisk talt ingen rolle.

Men det er prosjekter der det er nødvendig å løse et komplekst nytt problem – og her er erfaringen med å delta i Olympiads nyttig.

Så alt avhenger av hva slags prosjekter du skal ha. De aller fleste programmerere slipper å forholde seg til slike prosjekter.

Fremme Degrader

OL er en del av en verden av sportsprogrammering. Som i alle andre idretter er poenget med OL, etter min mening, å teste sin styrke, forbedre seg selv og få moralsk tilfredsstillelse. Jeg er sikker på at opplevelsen av OL er nyttig i jobben, fordi konstant trening gjør hjernen mer fleksibel og mottakelig for nye oppgaver.

Det er ikke for sent for en ellevteklassing å begynne å delta i programmeringskonkurranser. Jeg har mange venner som bare tok opp sportsprogrammering på universitetet og oppnådde betydelig suksess. Jeg deltok selv i den første olympiaden på slutten av mitt første år, og jeg tror ikke det var for sent. Hvis dette hadde skjedd det siste året mitt, så hadde jeg angret.

Fremme Degrader

, teknologievangelist for Microsoft, førsteamanuensis ved MIPT, MAI, lærer ved JUNIO-R barneleiren

Programmering Olympiads lar deg mestre teoretisk kunnskap innen datavitenskap, og de hjelper deg ofte med å komme inn på et universitet. Men i praksis er det ikke alle oppgaver som krever ferdighetene som er tilegnet ved olympiadene.

Det er noe slikt som overkvalifisering. Hvis du har for mye teoretisk kunnskap om informatikk, vil du bli lei av å løse hverdagslige problemer, og du vil fullt ut kunne realisere potensialet ditt bare i store selskaper, som Yandex, Mail.ru eller samme Microsoft. Derfor vil kretsen av arbeidsgivere du er interessert i være noe smalere, men oppgavene som løses blir mye mer interessante og mer globale.

For å få reelle ferdigheter i å jobbe med prosjekter, er konkurranser som Imagine Cup bedre egnet. I denne konkurransen må du ha mer av et gründertalent for å velge et interessant problem å løse, lage en prototype av et programvareprodukt og demonstrere det i konkurransen. På lang sikt er deltakelse i slike konkurranser bra for å utvikle ferdigheter i teamarbeid og reelt arbeid på prosjekter, og kan også føre deg til en gründerkarrierevei og til din egen startup.

11. klasse er litt sent ute, fordi det er for mye å gjøre for å komme inn på et universitet, og det blir vanskelig å vie nok tid til OL. Men bedre sent enn aldri!

Fremme Degrader

OL, som enhver idrett, er ekstremt viktig for å trene viljestyrke, fokus og andre verdifulle egenskaper. Sportsprogrammering har ingenting med anvendt programmering å gjøre, men det lar deg trene i et virkelig konkurransemiljø, som senere vil være nyttig hvor som helst. Det er aldri for sent å begynne.

Fremme Degrader

Et utdrag fra vårt, svarer Stanislav på spørsmålet "er det sant at suksess ved programmering (matematikk) konkurranser korrelerer negativt med arbeid i en bedrift? Har du mange OL-utøvere på laget ditt?»

OL vil ikke hjelpe direkte. Akkurat som kunnskap om matematisk analyse ikke vil hjelpe en person med å skrive programmer i Java eller Python. Men olympiadeprogrammering, hvis du vil, er som sportssambo. Det garanterer ikke suksess i gatekamper; dessuten er det mange eksempler på at sambo-atleter ble brutalt lemlestet i gatekamper, fordi det ikke er noen regler: de kan slå med kniv og tre av dem angriper en. Men en sambo-atlet blir en fighter mye raskere ved å begynne å studere kampsambo (eller annen hånd-til-hånd kampsport) enn en person som ser på skjermen med popcorn. Derfor må du behandle det akkurat slik: Olympiadeprogrammering er en god måte å forbedre nivået ditt på. Det vil være lettere for en person som gjør dette å mestre et nytt område innen informatikk eller en metode for programmering. Dette er en gunstig aktivitet og bør ikke unngås. Hvis en person jobber profesjonelt i en bedrift og lager produkter som selges mye, blir det som en hobby. En person som jobber for et selskap som produserer backup-produkter blir trolig en profesjonell i verdensklasse på dette feltet i løpet av få år. Og olympiadeprogrammering, hvis han begynner å delta i det, vil neppe hjelpe ham mye for å få ham til å stå hode og skuldre over kollegene. Men dette er en nyttig hobby som utvikler de nødvendige ferdighetene.

Generelt er det utrolig hvordan folk nekter å lære. Da jeg var ung, var propagandaen veldig kraftig: du må studere, det er nyttig, kunnskap er makt, uvitenhet er mørke. Jeg forstår ikke hvorfor gutta dine har slike spørsmål. Kunnskap er aldri overflødig. Til syvende og sist er livet strukturert på en slik måte at hvis en person forstår noe veldig, veldig dypt, er det lettere for ham å se hvordan et helt, tilsynelatende ikke-relatert område fungerer. Alt vi gjør ender opp med å bli likt. Så jeg var under en illusjon om byggherrer før jeg begynte å gjøre min første oppussing. Først og sist. Jeg oppdaget at arbeidet til bygningsarbeidere i en leilighet er veldig likt arbeidet til et team av programmerere. Og ikke bare det, alle problemene vi står overfor står utbyggere overfor i full kraft. Og det er enda verre der. Fordi gjennomsnittsnivået til en byggherre er lavere enn gjennomsnittsnivået til en programmerer, når det gjelder utdanning og generell intelligens. De gjør også feil, de har feil, det finnes både gode og dårlige prosjektledere. Hvis det er dårlig, kan de i overført betydning skru toalettet i taket, og deretter late som om det var slik. Derfor er det ikke nødvendig å unngå kunnskap. Kanskje denne spesielle kunnskapen aldri vil være nyttig for meg, men hvis jeg forstår noe, forstå hvorfor det er slik og ikke på annen måte, vil det være nyttig for meg i det minste i form av en analogi.

Fremme Degrader

De sier at da han ble født, kom Donald Knuth selv for å se ham. De sier at da han ble invitert til å jobbe hos Google, skrev han om hele søkealgoritmen 16 ganger på 15 minutter. De sier at han ser på fremdriften til kvanteberegning med et smil, fordi når han ser det, faktoriserer tallene seg selv av frykt. Men en ting vet vi sikkert: Peter er en ekte gud for sportsprogrammering.

Data

  • En vinner av en rekke mesterskap, Peter vant to ganger TopCoder og to ganger tok han andreplassen i ACM ICPC.
  • På fritiden skriver Peter en blogg om vanlige konkurranser "Algorithmic Problems for Dummies": petr-mitrichev.blogspot.ru.
  • Mitrichev jobber for tiden i Google, hvor han jobber med søkekvalitet. Peter hjelper også til med å forberede Google Code Jam-konkurranser.

Mange tror at sportsprogrammerere er kule gutter, ekte nerder som forstår algoritmer og løser komplekse problemer. Men de sier også at det er veldig vanskelig for dem å søke seg et sted senere. Dette er sant?

Sportsprogrammering, og generelt det vi driver med i OL, er virkelig ikke noe du kan leve av. På den annen side er programmering, som enhver annen sport, utvikling for en person. Takket være det blir en person smartere, en bedre programmerer og bedre til å finne feil i programmer. Etter en slik forberedelse er det lettere å jobbe og gjøre andre interessante ting.

Algoritmer er definitivt anvendelige i praksisen til en programmerer, selv om jeg på jobb også har møtt algoritmer som er mer komplekse enn de som finnes i Olympiads. Men på olympiadene er vi begrenset til algoritmer som grovt sett kan skrives på en halvtime til en time. Derfor bruker oppgaver der et veldig spesifikt, begrenset sett med algoritmer. I det virkelige liv er ting bare mer ... ekspansivt.

Hvilket språk skrev du løsninger på problemer på?

I Java. På skolen skrev jeg i Pascal fordi jeg ikke visste noe annet på den tiden. Og så, da det var nødvendig å velge hva man skulle bytte til, viste Java seg å være nærmere Pascal.

I et konkurranseutsatt miljø må du skrive et program på 20–30 minutter, og det skal fungere riktig med en gang. Derfor er det veldig viktig at språket ikke tillater å plante insekter. C++, som de fleste bruker, er annerledes ved at det er ganske enkelt å skrive feil program. Du kan ved et uhell glemme noe, tilordne feil type til en variabel, men alt dette vil på en eller annen måte kompilere og på en eller annen måte fungere. Mest sannsynlig ikke på den måten du forventer.

I Java, hvis du gjør en feil eller skrivefeil, vil programmet mest sannsynlig rett og slett ikke kompilere. Alt er strengere her, som i tilfellet med Pascal. Dette virket mer passende for meg. Den andre siden av medaljen er at Java-programmer ofte kjører halvannen gang langsommere enn C++-programmer. Noen ganger er ikke disse en og en halv gangene nok til at programmet passer inn i forholdene for problemet.

Alle kan velge sitt eget programmeringsspråk, ikke sant?

Det er restriksjoner. Selvfølgelig er det forskjellige konkurranser... la oss ta Google Code Jam, for eksempel. Da vi bestemte oss for hvordan vi best skulle lage det, kom vi på ideen om at vi kunne jobbe på alle språk. Du laster ned inndatafilen med oppgavedata til datamaskinen, kjører programmet på datamaskinen, og sender deretter resultatet til serveren. Uansett hvilken kompilator/tolk du har på datamaskinen din, det er det du kan bruke. Ulempen med dette systemet er at folk har forskjellige datamaskiner. Noen mennesker har en datamaskin som er ti ganger kraftigere enn andre. Derfor må vi lage problemer der feil løsning avviker fra riktig løsning i hastighet med minst hundre ganger. Slik at hvis en person har en datamaskin ti ganger tregere, vil den riktige løsningen fungere for ham, eller på en datamaskin ti ganger raskere, vil feil løsning fortsatt ikke fungere. Derfor trenger vi problemer med et stort gap mellom riktig og feil løsning med tanke på hastighet.

Topcoder, Codeforces og ACM bruker et standard system hvor du sender kildekoden og de kjører den på serveren sin. Her er du begrenset av hva de har på serveren. De fleste av deltakerne, 70–80 % bruker C++, ytterligere 20 % bruker Java, og svært få andre språk. Dette virker for meg som en syklus – nye mennesker som kommer på konkurranser begynner å kommunisere med andre, eldre deltakere, som lærer nykommerne hva de selv kan. Som et resultat begynner også nye mennesker å bruke de samme språkene. Så det er ikke det at disse to språkene er spesielt egnet for konkurranser, det er bare slik det skjedde historisk.

Så, gjelder alt dette i livet? Tross alt er det nok vanskelig å finne en jobb hvor denne kunnskapen vil være nyttig. Ja, du kan gå til Google eller Yandex, men er det vanskeligere å komme til en hvilken som helst bank?

Det virker for meg som om dette er en veldig nyttig del av ferdigheten, den delen som er ansvarlig for muligheten til å skrive et program første gang, uten feil, eller å finne en feil i en venns program. Jeg har ikke jobbet i en bank selv, men det ser ut til at slike ferdigheter vil være nyttige der også. Selv om selvfølgelig ikke algoritmene i seg selv brukes i alle jobber. Men personlig hjelper denne bakgrunnen meg mye.

Du hadde sannsynligvis en spesiell historie om hvordan du kom inn på Google?

Ja, det er ingen historie, alt var det samme som andre. Nå gjør jeg søket (den generelle delen av det, som ikke avhenger av land og språk), men jeg kan dessverre ikke fortelle noe om det, siden dette er en veldig konfidensiell del.

Sportsprogrammering: fordeler og ulemper

La meg prøve å stille deg et dumt spørsmål :). Hvorfor mener du at sportsprogrammering bør gjøres?

Alt her er veldig enkelt og ligner på enhver annen sport. Du må gjøre det hvis du liker det, hvis du får glede av det. Dette bør ikke være et mål i seg selv. Du må tenke på sportsprogrammering som en måte å ha det bra, møte interessante mennesker og så videre.

Hva om du prøver å finne en grunn til hvorfor du ikke bør kaste bort tid på sportsprogrammering?

Jeg tror du må være klar over at dette ikke er hovedsaken i livet. Ha noen andre mål enn dette. Hvis noe begynner å ta opp absolutt hele livet ditt, er dette sannsynligvis en grunn til å tenke på i det minste å ta en pause.

Men hva sier praksis?Er det for eksempel mulig å bygge en karriere rundt sportsprogrammering?

Det er flere personer i Russland som er profesjonelt involvert i opplæring av nye sportsprogrammerere – trenere. Andrey Stankevich, Misha Mirzayanov og andre. Alle underviser ved universiteter, men de bruker en betydelig del av arbeidstiden på å forberede studenter og skoleelever til programmeringskonkurranser. For dem er dette virkelig en jobb og, kan man si, en karriere.

Har du noen gang tenkt på dette selv? Deltar du noen gang i en jury eller som problemskribent?

Jeg prøvde å undervise skoleelever på skole nr. 57, hvor jeg selv studerte. Jeg prøvde å forberede lag til OL. Nå i Moskva er dette emnet veldig aktivt - det er team ved Moscow State University, Physics and Technology, og Higher School of Economics. Men på en eller annen måte fungerte ikke undervisningen for meg.

Når det gjelder konkurransene, hjelper jeg først og fremst med å lage problemer for Google Code Jam, for konkurrentene våre. Pluss at jeg hjelper til med ACM-semifinalene, som finner sted i St. Petersburg. Dette er et utvalg blant russiske lag og lag fra det tidligere USSR for finalen.

Er det mulig å tjene penger på konkurranser? Tross alt gir de pengepremier for å vinne.

Sannsynligheten er for lav. Én premie for ti tusen deltakere?.. Jeg vil ikke kalle det inntjening. Regner med dette som hovedinntektskilden... for meg virker det som om det ikke er noen sjanse.

Men det er som sagt mange forskjellige konkurranser. Den samme Topcoderen holder programutviklingskonkurranser. La oss si at du må utvikle en komponent for et program som gjør dette. Basert på resultatene vurderer de hvem som har fått hva, og det beste brukes – kunden kjøper denne løsningen og betaler penger til den som tok denne avgjørelsen. Folk som gjør dette på heltid, slik jeg forstår det, tjener ganske anstendige penger.

Konkurranser i dag

Fortell oss mer detaljert, hva slags konkurranser er det nå, hvordan skjer det hele?

I dag er det to typer konkurranser. Det er ukentlige, vanlige konkurranser. De er utført av to hovedsider - TopCoder og Codeforces. Hver konkurranse tar en og en halv til to timer. Der får deltakerne flere problemer å løse og sende programmet til serveren. Arrangørene sjekker om programmet fungerer.

TopCoder er den eldste og mest kjente siden med ukentlige konkurranser. De har følgende regler. En time og femten minutter er avsatt til å løse tre oppgaver.

Oppgaver er vanligvis delt inn i svært enkle, middels og vanskelige. Arrangørene prøver å velge dem slik at for eksempel fem personer løser alle problemene, hundre mennesker løser to, og alle andre løser minst én. Dessuten er det viktig for hver oppgave når du sender den inn - jo senere, jo færre poeng får du. Slik deles de menneskene som løste like mange problemer. Deretter summeres poengene. En vanlig oppgave er verdt 250 poeng. Gjennomsnitt 500. Vanskelig 1000. I snitt får folk på førsteplass tusen-noe poeng per konkurranse.

Så tar de en pause i fem minutter og ytterligere femten minutter går med til å lete etter feil hos andre. Du kan åpne løsningen til enhver person, for ethvert problem i "rommet". Et "rom" er hvor personer som deltar i en konkurranse blir tilfeldig delt inn i grupper på tjue. De er delt inn i "rom". Du kan åpne hvilken som helst løsning for enhver person fra "rommet". Hvis løsningen virker feil for deg, kan du legge inn inndataene som den vil være feil på. Og hvis det faktisk gir feil svar, får du ytterligere 50 poeng for det. Dette er selvfølgelig mindre enn kostnaden for oppgaven. Men dette er igjen gjort for å splitte folk. Hovedpoengene gis fortsatt for å løse problemer, og ikke for å finne feil.

Etter alt dette testes oppgavene på prøver utarbeidet av juryen. Dersom oppgaven ikke fungerer, får personen 0 poeng.

Det er også et annet nettsted, Russian, Codeforces. Reglene deres er litt forskjellige, men formatet er omtrent det samme - to timer og flere oppgaver. Hvis du vil, kan dette formatet kalles underholdende, i motsetning til studentkonkurranser, som varer i fem timer.

Men er det fortsatt store, årlige konkurranser?

Ja, i tillegg til de to beskrevne konkurransene som går ukentlig, er det mange flere årlige konkurranser. Vanligvis er de strukturert slik: et visst stort selskap (Google, Yandex, TopСoder, IBM) holder en konkurranse med flere valgstadier. De første stadiene foregår online. Og den siste etappen er allerede holdt på et bestemt sted, hvor alle finalistene er tatt. Det er bare fem til ti slike konkurranser, men de er lange, så en av dem skjer hele tiden.

Er alle disse konkurransene individuelle?

De fleste konkurranser er nå individuelle. Lagkonkurranser er hovedsakelig studentkonkurranser, den viktigste er ACM ICPC. Og andre studentkonkurranser gjøres også vanligvis til lagkonkurranser, fordi de grovt sett har et lag fra før. Dette gjør det lettere å interessere folk. Veterankonkurranser er vanligvis personlige.

Ukentlige konkurranser har en vurdering, som sjakk, som oppdateres etter hver konkurranse. De som presterte bedre får pluss, de som presterte dårligere får minus. Hvis du ikke deltok i det hele tatt, endres ikke vurderingen. Systemet er bygget på en slik måte at det utjevner folk som besøker ofte og sjelden. Det er ikke noe press for å "må delta hele tiden." Det er mange mennesker som er mye eldre enn meg, de dukker opp veldig sjelden - en gang annenhver måned - og fortsatt har de en god vurdering fordi de fortsetter å løse problemer godt.

Ja, på første plass er Gena Korotkevich, en veldig smart student fra Gomel, nå studerer han ved ITMO. Resultatene mine på Codeforces har vært dårligere i det siste; nå er jeg sjette eller femte. Også der kommer Gena først.

Sannsynligvis er det en helt annen følelse og opplevelse å spille online og offline?

Sikkert. Det virker for meg som en veldig viktig positiv side ved sportsprogrammering er at alle konkurranser avsluttes med en runde på stedet, hvor alle de beste kommer sammen. Takket være dette møtte jeg mange kule mennesker fra hele verden. Generelt ser det ut til at hovedpremien i slike konkurranser er nettopp å møte mennesker. Du tilbringer tid med dem, kommuniserer, lærer noe nytt. Det er veldig morsomt at folk fra andre land, som ofte snakker dårlig engelsk, likevel er veldig enkle å forstå fordi de har veldig like interesser.

I slike konkurranser – med kåringer – er det som regel flere som deltar enn i vanlige. Hvis en person aldri har deltatt noe sted, kan ukentlige konkurranser være et problem. Det er slike problemer at en person kanskje ikke løser noe og blir opprørt. I konkurranser med kvalifisering er alt som regel enklere, i hvert fall i de første trinnene. Hovedideen deres er at alle skal ha det gøy. Igjen er det en håndgripelig premie på slutten - pengepremier for førsteplassen. I tillegg er en tur et sted, for eksempel til Google-kontoret, også litt av en premie.

Skjer det at bedrifter da prøver å bruke i livet utviklingen fra løsningene konkurrentene har sendt inn?

Ganske sjelden. Hovedmålet til selskaper som holder slike konkurranser er ganske enkelt å popularisere programmering. Det andre målet er å finne nye medarbeidere. Men den andre er ikke engang så viktig. Vanligvis arrangerer en bedrift en konkurranse nettopp for å få flere til å interessere seg for programmering, og vi snakker ikke engang om de som direkte deltok i konkurransen. Det er derfor slike konkurranser vanligvis holdes av store selskaper.

Endrer konkurranser seg over tid? Blir de vanskeligere eller omvendt lettere?

De blir mer komplekse. Flere og flere algoritmer regnes som noe fra kategorien "alle burde kunne gjøre dette", "alle vet dette". Du må tenke like mye som du gjorde for ti år siden. Antall trinn som kreves for å bygge en løsning er det samme, men de grunnleggende blokkene som utgjør løsningen er blitt mer komplekse. Folk har lært flere algoritmer. Ta for eksempel suffiksetreet: da det dukket opp, var jeg på skolen, og det virket som om dette var en veldig kul algoritme, alle som visste det var veldig smarte, og det var generelt en revolusjon. Nå løses de samme problemene ved hjelp av en suffiksautomat, og dette er en veldig enkel algoritme som tar ti linjer. Det vil si at de har lært å forenkle standard ting i stor grad. Derfor blir mer komplekse problemer nå løst.

Om oppgaver og deres forberedelse

Hvordan er oppgaver til konkurranser satt sammen? Finnes det kompilatorer, folk som allerede vet hvordan man gjør dette, eller er dette en slags crowdsourcing hvor alle kan tilby noe eget?

I de nevnte ukentlige konkurransene er dette akkurat tilfelle: alle kan foreslå sin egen oppgave. Men det er krav om at en person tidligere har deltatt i tilstrekkelig antall konkurranser. En slags sjekk for å se om en person forstår hva oppgavene skal handle om. Etterpå kan du levere oppgavene dine, og juryen vil svare på om de kan brukes og om de egner seg. Hvis problemene egner seg, blir de så gitt på konkurranser, og forfatteren får betalt penger for det - ikke veldig mye, men likevel.

Å komme opp med slike problemer er en spesiell ferdighet, er det ikke?

Å ja. Du kan komme med problemer basert på løsninger. La oss si at du leser en artikkel i et vitenskapelig tidsskrift om en interessant algoritme. Eller jeg fant bare en viss algoritme og husket at jeg hadde møtt den før, men nylig har jeg ikke sett den på lenge. Du kan komme opp med en oppgave som krever bruk.

Den andre måten: når et bestemt problem oppstår i jobben eller i livet, og du skjønner at det kan brukes på en kul måte. Du må kanskje komplisere ting eller endre restriksjonene, men da vil det vise seg å være et interessant problem for konkurrentene.

Det er konkurranser av ulik grad av nærhet til livet. Vanligvis er oppgaven i konkurranser ikke gitt i noen formelle termer, som "gitt: løs en slik og en slik ligning." Vanligvis gis en viss bakgrunn eller historie. Som i lærebøker i matematikk på skolen: «Ti liter vann renner i minuttet gjennom ett rør.» Derfor må du først på en eller annen måte formalisere denne historien, finne et matematisk problem i den, og først deretter løse den.

Det er andre konkurranser. TopCoder kaller det Marathon Match, og andre selskaper holder også lignende konkurranser. De er utformet litt annerledes. Dette er ikke lenger en konkurranse i algoritmer, men i å løse omtrentlige problemer. Når det ikke er noen eksakt løsning og du må finne det beste alternativet som er mulig. Slike konkurranser varer vanligvis i to uker eller en måned. Du kan sende forskjellige løsninger og se at, ja, nå er løsningen min 20 % bedre enn de andre.

Betyr "bedre" raskere, bruker mindre minne osv.?

Ja. For eksempel må du komme opp med en ordning for fordeling av busstrafikk på kartet over Moskva for å bruke så få busser som mulig. Det vil si at i problemformuleringen er det en viss parameter som må optimaliseres, men det er ingen enkelt "riktig løsning", bare noen omtrentlige algoritmer.

Den samme Topcoderen holdt konkurranser sammen med NASA, og de forteller at løsningene de ble tilbudt da faktisk ble tilpasset og brukt på ISS. Der løste de et spesifikt problem, det virker som hvordan man roterer et solcellebatteri slik at det får mer energi.

Hvor du skal begynne

Fra synspunktet om å forberede en god algoritmisk programmerer og deltaker i forskjellige konkurranser - hvordan forberede deg på dette? Hvis du ser for deg selv i stedet for en videregående elev eller førsteårsstudenter?

Det virker for meg som om den mest standard måten er å prøve. Alle konkurranser har et arkiv med tidligere avholdte konkurranser tilgjengelig; det er tusenvis av problemer som kan løses når som helst.

Hva om jeg tar på meg en oppgave og ikke en gang vet hvilken vei jeg skal gripe den an?

Så ta det enklere. De er forskjellige. Det er problemer som annenhver uteksaminert skole kan løse. Det er helt forskjellige vanskelighetsgrader. Det skal være ganske enkelt å engasjere seg. Det er ingen annen måte, virker det for meg. I tillegg vil du umiddelbart forstå om du liker denne aktiviteten eller ikke.

Hva må gjøres for å få en algoritmisk base? Det er knapt nødvendig å skynde seg å lese Knuth umiddelbart.

Det ser ut til at vi må begynne med oppgaver. Først senere, når du innser at du ikke kan løse noen spesifikke av dem, har hver av disse konkurransene en analyse. Du kan lese løsningen hvis du ikke kan klare deg selv. For eksempel indikerer analysen at en bestemt algoritme brukes for å løse problemet. Du kan lese hva denne algoritmen er og hvor den brukes ellers. Dette er bedre enn å lese fra listen "ja, jeg har en algoritme som jeg må studere i løpet av sommeren." Det er bedre å starte fra et spesifikt problem som du ikke kunne løse fordi du ikke kjenner en spesifikk algoritme. Dette er mer riktig. Du husker bedre, motivasjonen din er sterkere. Denne metoden for å lære algoritmer tar sannsynligvis lengre tid enn listen, men den fører til bedre resultater.

Hvis du vil "pumpe opp" deg selv ved hjelp av algoritmer, finnes det litteratur eller lærebøker?

Den mest standard læreboken er Cormen, Leiserson, Rivest med et esel på omslaget. "Algorithms: Construction and Analysis" kalles. Jeg vet ikke, jeg har ikke studert på lenge, nå er det sikkert nye lærebøker som kan være bedre. Men i min tid brukte de Cormen. Knut er snarere en slags oppslagsbok. Hvis du trenger å finne noe og det ikke er noe sted, er sjansen stor for at det vil være der. Men å lese Knuth på rad... det er en ganske trist opplevelse.