Pereiti prie turinio

Uzduotys is informatiku olipiados ir siaip pamastymai


Rekomenduojami pranešimai

Sveiki, siandien benarsydamas internete sugalvojau pasiziureti ka sprendzia IT olipiadu dalyviai. http://www.lmio.mii....lympsearchtasks . Paimkim uzduoti "Žalioji ateivių planeta" . Su uzduotimi + - viskas ok. Juk reikia kazkaip atrinkti geriausius kandidatus ir galiausiai laimetojus. Bet pagalvojus apie realias uzduotis gyvenime man kazkas ce nesueina. Argi nebutu geriau tarkim tokia sistema: Butu duota nepersudetingiausia parasyta programa. Dalyviams butu duota laiko susipazinti su source code na ir tarkim butu uzduotis tokios kaip "Parasyti generic error'u handlinimo sistema" ar kazka panasaus. Tarkim optimaliausius variantus pateike dalyviai pereitu i kita etapa. Nes stipriai abejoju ar realiame gyvenime buna tokio tipo uzduotys kaip mano sukritikuotoji. Butu nauda ir dalyviams nes galbut butu naudojamos tokios ir tokios bibliotekos, tokie ir tokie design patternai. Vieni is kitu galetu pasimokyti. O dabar tiesiog prasuki kelis ciklus ir viskas. O kaip atrodo jums?

 

EDIT: Uzduotis "Kalbos" jau daugmaz mano manymu i reikiama puse.

Redagavo highontrance
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pradėkim nuo to, kad apskritai retas dvyliktokas kažką apie programavimą apart mokyklinio kurso žino. Dar pridėkim tai, kad realiam gyvenime niekas c++ praktiškai nebenaudoja (nu, ok naudoja, bet abejoju ar šiandienos jaunuoliui c++ yra ta kalba, su kuria jis norėtų pradėti rimtą pažintį su programavimu), yra labai didelė įvairovė programavimo kalbų, dėl šitos priežasties reikia kažkaip visas šitas užduotis pritempti prie pascalio/c++, kadangi šias kalbas kažkiek yra įsisavinęs kiekvienas olimpiados dalyvis.

 

Dėl ko ir užduotys yra labiau nei programavimo, bet, kaip Povilas išsireikė, algoritmavimo žinias įrodančios.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

"Parasyti generic error'u handlinimo sistema" ar kazka panasaus.

 

1. Tokių dalykų mokykloje nemoko;

2. Nemanau, kad olimpiados skirtos ruošti specialistus. Mano nuomone, pradedant mokytis programuoti, algoritmai yra vienas iš esminių dalykų;

3. Užduotys ten rašomos lietuvių kalba.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Manau, kad neteisingai įsivaizduoji, kas yra programuotojas. Programuotoją apsprendžia ne kodo rašymas. Programuotojas yra tas, kuris sugeba spręsti problemas automatizuotai naudojantis kompiuterio pagalba (todėl ir angliškuose konkursuose užduotys būna įvardijamos „Problem A“, „Problem B“ ir t. t.).

 

Taip pat negalima teigti, kad programavimo konkursuose naudojamos užduotys neturi atitikmenų realiame gyvenime. Oi, dar ir kaip turi. Visi žinomi algoritmai buvo sukurti ne tam, kad tiesiog kažkas galėtų padaryti uždavinį, o tam, kad būtų galima kažką efektyviai apskaičiuoti. Ir kad ir kokia kvaila pasakėlė būtų aprašyta uždavinio salygoje, vis tiek galėtum rasti reikiamam algoritmui pritaikyma realiame gyvenime.

 

Be to, realiame gyvenime susiduriama su dar sudėtingesnėmis užduotimis, negu pateikiamos konkursuose. Vien užtenka pagalvoti apie vaizdo ar garso apdorojimą…

 

Minėjo „generic error'u handlinimo sistemą“. Žinoma, kuriant programinę įrangą prireikia ir kitokių gabumų be algoritmavimo, kaip antai tvarkingas kodo rašymas, geri testai, geras API ir pnš. Tačiau visa tai yra ne esminis komponentas, o pagalbinis. Jei iškils kokia problema, visiškai nepagelbės tai, kad moki gražų kodą rašyti, jeigu nesugebi sugalvoti algoritmo. Priešingai, jei žinai algoritmą, kad ir kokį baisų kodą parašyti, kad ir su 0 testų, bet rezultatas bus – problema bus išspręsta.

 

Būtent programavimo konkursai ir tikrina tavo sugebėjimus spręsti problemas, nes tai ir yra esminis programuotojo sugebėjimas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pirmiausia į pačią temą. Ar autorius bent įsivaizduoja 10-12 klasės mokinius (kurie nesidomi papildomai programavimu), atliekant tokius dalykus. Toliau, ar įsivaizduoja mokytojus, tokius dalykus išmokant? Dabar ir taip didelė dalis informatikos mokytojų yra atsilikę 20-40 metų nuo dabartinių technologijų, tai ką kalbėti apie tokių dalykų mokymą?

 

Pradėkim nuo to, kad apskritai retas dvyliktokas kažką apie programavimą apart mokyklinio kurso žino. Dar pridėkim tai, kad realiam gyvenime niekas c++ praktiškai nebenaudoja (nu, ok naudoja, bet abejoju ar šiandienos jaunuoliui c++ yra ta kalba, su kuria jis norėtų pradėti rimtą pažintį su programavimu), yra labai didelė įvairovė programavimo kalbų, dėl šitos priežasties reikia kažkaip visas šitas užduotis pritempti prie pascalio/c++, kadangi šias kalbas kažkiek yra įsisavinęs kiekvienas olimpiados dalyvis.

 

Dėl ko ir užduotys yra labiau nei programavimo, bet, kaip Povilas išsireikė, algoritmavimo žinias įrodančios.

 

Paryškinta vieta neturi logikos, pasirink vieną teiginį, kaip pasirinski, tada galėsim plačiau padiskutuoti. Taip pat atsakysiu iš asmeninės patirties: taip c++ man yra ta kalba, kuri mane "užkabino", bet nesu nieko prieš mokymą, kokia python ar c# kalba mokyklose. Toliau kitas dalykas uždaviniai tikrai nėra taikomi prie kalbų.

 

Kitas dalykas apie kalbas, problema nėra pačioje c++ kalboje problema yra 2 vietose:

 

1. Mokytojai, dėstytojai, kurie nemoko naujovių. Didžioji dalis nežino nei vieno naujesnio (c++11, c++14) feature. Taip pat dažnai "moko" c++, bet vos ne puse kodo yra c kalbos. Per pastaruosius metus, kiek mačiau studentų darbų šiame forume, nei pas vieną nemačiau naudojamų smart point'erių ar kokio range based loop'o.

 

2. Mokiniai kurie nenori mokytis. Čia nepadės jokio kalba.

 

Realiai juk kalba tėra priemonė pasiekti rezultatą. :)

Redagavo Pattio
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Manau, kad neteisingai įsivaizduoji, kas yra programuotojas. Programuotoją apsprendžia ne kodo rašymas. Programuotojas yra tas, kuris sugeba spręsti problemas automatizuotai naudojantis kompiuterio pagalba (todėl ir angliškuose konkursuose užduotys būna įvardijamos „Problem A", „Problem B" ir t. t.).

Tai savaime aisku, kad automatizuotai, Juk programuojama ir yra tam, kad kompiuteris atliktu tam tikrus veiksmus problemai isspresti. Nelabai suprantu ka tu ce norejai pasakyti situom teiginiu..

 

 

Be to, realiame gyvenime susiduriama su dar sudėtingesnėmis užduotimis, negu pateikiamos konkursuose. Vien užtenka pagalvoti apie vaizdo ar garso apdorojimą…

Uzduociu sudetingumas priklauso nuo daugybes faktoriu, kreivai parasytos salygos yra vienas is ju (ce apie olipiados uzduoti is pirmo posto).

 

Minėjo „generic error'u handlinimo sistemą". Žinoma, kuriant programinę įrangą prireikia ir kitokių gabumų be algoritmavimo, kaip antai tvarkingas kodo rašymas, geri testai, geras API ir pnš. Tačiau visa tai yra ne esminis komponentas, o pagalbinis. Jei iškils kokia problema, visiškai nepagelbės tai, kad moki gražų kodą rašyti, jeigu nesugebi sugalvoti algoritmo. Priešingai, jei žinai algoritmą, kad ir kokį baisų kodą parašyti, kad ir su 0 testų, bet rezultatas bus – problema bus išspręsta.

Ce buvo kaip pavizdys to ko as tikeciausi is uzduoties. Ta prasme, kad sprendinys butu labiau pritaikomas realiame gyvenime sprendziant panasias problemas. Ir nereikia ce tik saves kelti i virsu sakant jog kiti nemoka parasyti optimaliu algoritmu ispresti tam tikrai problemai. Visi su tuo susiduriame, ir visi issprendziame. Beto daug kas labai priklauso nuo problemos, kaikurioms kuri kazka savo, kaikurioms pasitelki i pagalba jau esamas bibliotekas.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Tai savaime aisku, kad automatizuotai, Juk programuojama ir yra tam, kad kompiuteris atliktu tam tikrus veiksmus problemai isspresti. Nelabai suprantu ka tu ce norejai pasakyti situom teiginiu..

 

Pavartojau žodį automatizuotas dėl to, nes gali atsidaryt kalkuliatorių ir rankomis suskaičiuoti bei gauti rezultatą. Tačiau jau tai nebus automatizuota. O teiginio esmė yra „problemų sprendimas“. Bet ne tokių problemų, kurias sukelia pats kodo rašymas, o tokių, kurios atsiranda iš išorės (kaip sako, kompiuteris padeda išspręsti tūkstančius problemų, kurių nebuvo prieš atsirandant kompiuteriams).

 

Ce buvo kaip pavizdys to ko as tikeciausi is uzduoties. Ta prasme, kad sprendinys butu labiau pritaikomas realiame gyvenime sprendziant panasias problemas. Ir nereikia ce tik saves kelti i virsu sakant jog kiti nemoka parasyti optimaliu algoritmu ispresti tam tikrai problemai. Visi su tuo susiduriame, ir visi issprendziame. Beto daug kas labai priklauso nuo problemos, kaikurioms kuri kazka savo, kaikurioms pasitelki i pagalba jau esamas bibliotekas.

 

Tikrai ne visi su tuo susiduria ir nevisi tai išsprendžia (bent jau per protingą laiko tarpą). Jei taip būtų, tai Google'as be atrankos žmones priiminėtu. Akivaizdžiai per mažai esi sprendęs konkursinių uždavinių, kad taip šneki.

 

Ne viskam yra parašytos bibliotekos. Ne visi algoritmai tinka tiesiog nukopijuoti iš interneto, kartais reikia ir juos pamodifikuoti. Ne visada aišku, kaip reikia spręsti, net jei supranti sąlygą ir pačią problemą.

 

Programavimo esmė – paimi pradinius duomenis ir išvedi rezultatus. Problema yra tas tarpas tarp duomenų ir rezultatų, o algoritmas yra tas problemos sprendimas. Ir visiškai nesvarbu, kaip tu tą kodą parašysi, jei pradiniams duomenims bus duoti teisingi rezultatai, tai problema bus išspręsta.

 

Visos kitos su programavimu susijusios užduotys kyla dėl ilgos programinės įrangos kūrimo trukmės, didelios jos apimties, poreikio dirbti komandomis ir PĮ palaikymo po jos išleidimo. Bet visi su tuo susiję darbai yra tik pagalbiniai. Esmė lieka vis tiek iš pradinių duomenų gauti rezultatus.

 

Pagal tave taip išeina, kad olimmpiados metu turėtum įdiegti Wordpress temą, gražiai aprašyti klasių ir kintamųjų pavadinimus, gražią vartotojo sąsają sukurti ar dar kažką. Bet kad ir kaip gerai tai mokėtum padaryti, vis tiek būsi niekam tikęs, jei nesugebėsi nei vidurkio suskaičiuoti, masyve paieškos atlikti ar elementų surikiuoti.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš ir turiu programavimą mokykloje, man tai atrodo nereikalingas dalykas, nes nesiruošiu su IT nieko bendro turėti, bet kalbant apie gyvenimiškus programavimo uždavinius, galima pasakyti tik tai, kad šių uždavinių pagalba yra lengviausia įsisavinti algoritmus. Ar jums nebūna, kad per kokią pamoką (arba paskaitą jei studijuojate) mokytojas, kalbėdamas apie kažkokį sunkesnį dalyką, remiasi gyvenimiškais pavyzdžiais? Tokia gyvenimiškų uždavinių programavimo esmė, kaip įmanoma paprasčiau suvokti algoritmavimą. Kas būtų, jei visus mokykloje mokytų aukšto lygio softo kūrimo? Turbūt beveik niekas nesuprastų kas, kaip ir kodėl, o jei suprastų, tai kaip kažkas sakė, švietimas google darbuotojus gamintų. Todėl pagrindus reikia įsisavinti paprastai. Ir šiaip nepasakyčiau, kad visi uždaviniai tokie "nūbiški", pavyzdžiui mes sprendžiam olimpiadinius uždavinius, kur reikia kokioje šaškių lentoje spėjimus numatyti. Tai puikus intro į tą patį AI bei žaidimų kūrimą. Galiausiai niekas autoriui netrukdo nespręsti tų uždavinių, o daryti tai, ką jis nori. Tie uždaviniai nėra prievolė kažkokia, o tik atrama mokantis.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Pavartojau žodį automatizuotas dėl to, nes gali atsidaryt kalkuliatorių ir rankomis suskaičiuoti bei gauti rezultatą. Tačiau jau tai nebus automatizuota. O teiginio esmė yra „problemų sprendimas". Bet ne tokių problemų, kurias sukelia pats kodo rašymas, o tokių, kurios atsiranda iš išorės (kaip sako, kompiuteris padeda išspręsti tūkstančius problemų, kurių nebuvo prieš atsirandant kompiuteriams).

 

 

 

Tikrai ne visi su tuo susiduria ir nevisi tai išsprendžia (bent jau per protingą laiko tarpą). Jei taip būtų, tai Google'as be atrankos žmones priiminėtu. Akivaizdžiai per mažai esi sprendęs konkursinių uždavinių, kad taip šneki.

 

Ne viskam yra parašytos bibliotekos. Ne visi algoritmai tinka tiesiog nukopijuoti iš interneto, kartais reikia ir juos pamodifikuoti. Ne visada aišku, kaip reikia spręsti, net jei supranti sąlygą ir pačią problemą.

 

Programavimo esmė – paimi pradinius duomenis ir išvedi rezultatus. Problema yra tas tarpas tarp duomenų ir rezultatų, o algoritmas yra tas problemos sprendimas. Ir visiškai nesvarbu, kaip tu tą kodą parašysi, jei pradiniams duomenims bus duoti teisingi rezultatai, tai problema bus išspręsta.

 

Visos kitos su programavimu susijusios užduotys kyla dėl ilgos programinės įrangos kūrimo trukmės, didelios jos apimties, poreikio dirbti komandomis ir PĮ palaikymo po jos išleidimo. Bet visi su tuo susiję darbai yra tik pagalbiniai. Esmė lieka vis tiek iš pradinių duomenų gauti rezultatus.

 

Pagal tave taip išeina, kad olimmpiados metu turėtum įdiegti Wordpress temą, gražiai aprašyti klasių ir kintamųjų pavadinimus, gražią vartotojo sąsają sukurti ar dar kažką. Bet kad ir kaip gerai tai mokėtum padaryti, vis tiek būsi niekam tikęs, jei nesugebėsi nei vidurkio suskaičiuoti, masyve paieškos atlikti ar elementų surikiuoti.

 

Siaip pagalvojus yra tavo zodziuose teisybes. Man kai su matematika sunkiau sekasi gal ir per grieztai as ce uzvaziavau :) Prie tokiu dalyku kaip WP net nelendu nes nematau tame pasitenkinimo, programuoju WPF (xaml) su C#.

Redagavo highontrance
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Universitete nieko naudingo - nė normalios debuginimo praktikos - neišmoko, o jūs jau mokyklas reformuojat. lolo

Programavimo esmė – paimi pradinius duomenis ir išvedi rezultatus. Problema yra tas tarpas tarp duomenų ir rezultatų, o algoritmas yra tas problemos sprendimas. Ir visiškai nesvarbu, kaip tu tą kodą parašysi, jei pradiniams duomenims bus duoti teisingi rezultatai, tai problema bus išspręsta.

 

Visos kitos su programavimu susijusios užduotys kyla dėl ilgos programinės įrangos kūrimo trukmės, didelios jos apimties, poreikio dirbti komandomis ir PĮ palaikymo po jos išleidimo. Bet visi su tuo susiję darbai yra tik pagalbiniai. Esmė lieka vis tiek iš pradinių duomenų gauti rezultatus.

 

Programavimo esmė - infrastruktūros aplink duomenis kūrimas. Duomenų apsaugojimas (ne tik bazinė autorizacija, bet ir infrastruktūros kanalų sauga), duomenų saugojimas (išsaugojimo greitis, saugumas, scalability), duomenų perdavimas kitiems šaltiniams (galbūt transformavimas, vėlgi - saugumas, greitis), infrastruktūros kūrimas, kad būtų lengva plėsti, modularizavimas, vėlgi - scalability, galimybės trečioms šalims ir t.t. ir pan. Dokumentavimas ir testai. Trims algoritmo eilutėms parašoma kiek? 10k kodo sistemai, kuri tą algoritmą iškvies?

 

Teip kad nesutinku.

 

Čia iš enterprise pusės, kur daugiausia programavimo ir vyksta. Ir apie ką šitas forumas teoriškai turėtų būti. Beabejo, yra akademikų su savo numpy ir pythonais, kurie vien algoritmais gyvena. Bet gauti .py failai skaičiuoti molekules ir ląsteles ar fizikinius reiškinius tikrai nėra programos plačiąja to žodžio prasme.

Redagavo Deviltry
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gal ir praeitame teiginyje nepaminėjau visko, ką reikėjo paminėti, bet reikalingiausią paminėjau.

 

Labai paprasta nustatyti, kas yra programavimo esmė. Tiesiog reikia įvardinti prioritetus tokiems punktams:

  • funkcionalumas (programa gražina reikiamus rezultatus pradiniams duomenims);
  • efektyvumas (programa įvykdo skaičiavimus per protingą laiko tarpą ir su protingu atminties kiekiu);
  • saugumas, patikimumas (čia galima įskaityti ir testus);
  • kodo kokybė (gerai dokumentuotas, lengvai palaikomas kodas su geru API);
  • aparatinės įrangos išnaudojimas (čia jau galima paminėti ir scalability);

 

Sakyčiau, įprastinei programinei įrangai prioritetai būtų sudėlioti tokia tvarka, kokia ir paminėjau (nesigilinant į kraštutinumus). Žinoma, gal būtų keisti parametrus vietomis, bet čia jau turėtų būti labai specializuotą programinė įranga, kad funkcionalumas ir efektyvumas būtų ne sąrašo viršuje (ir tai matyt būtų įmanoma tik saugumui).

 

Ir čia jau joks scalability, joks moduliškumas, jokie testai, joks duomenų saugojimas nepagelbės, jei nesugebėsi parašyti algoritmo, kuris spręstų užduotį.

 

O iš ko susidaro tas „scalability“? Iš gražiai pavadintų klasių, ar yra kažkokie algoritmai ir duomenų struktūros, kurie leidžia protingai manipuliuoti duomenimis tarp kelių prietaisų? O duomenų apsauga iš kur: gražiai užvadintų kintamųjų, ar iš tam tikro algoritmo, kuris užtikrina specifinį manipuliavimą duomenimis, dėl kurio informacija nebūtų atskleista trečiosioms šalims? O bibliotekos iš kur gimsta: iš geros dokumentacijos ar iš algoritmų ir duomenų struktūrų implementacijos? O iš kur greitis atsiranda: implementuoji bet kokį algortimą ir pasimeldi C#'pui, kad greitai veiktų, ar implementuoji laiko atžvilgiu efektyviausią algoritmą?

 

Visa kompiuterija pastatyta ant algoritmų. Giliai giliai procesoriuose implementuota tik maža dalis funkcionalumo ir duomenų struktūrų (pavyzdžiui, matematinės operacijos, paprastieji duomenų tipai). Ir su kiekvienu abstrakcijos sluoksniu iš paprastų operacijų, duomenų struktūrų ir algorimų sudaromos sudėtingesnės operacijos, duomenų struktūros ir algoritmai.

 


 

ACM ICPC pasaulio finalas (kas nežino, tai panašiai kaip mokyklinės olimpiados, tik daugiau ir sudėtingesni uždaviniai bei dirbama komandomis po tris). Apdovanojama pirmos 12 vietų. Priedo prie užkabintų medalių IBM atstovas kiekvienam duoda po voką. Voke – pakvietimas dirbti į IBM. Pastebėsit, kad niekas nei vieno iš nugalėtojų nepaklausė, kaip gražiai jie užvadina klases, kokiomis kalbomis programuoja, kokias bibliotekas žino bei kokias UML diagramas moka nubraižyti. Užteko išmanyti ir sugebėti implementuoti tam tikrą kiekį algoritmų bei duomenų struktūrų ir tai atlikti greičiau už kitus, kad IBM juos įvertintų daugiau nepaklausę nė vieno klausimo.

Nuoroda į pranešimą
Dalintis kituose puslapiuose

Gal ir praeitame teiginyje nepaminėjau visko, ką reikėjo paminėti, bet reikalingiausią paminėjau.

 

Labai paprasta nustatyti, kas yra programavimo esmė. Tiesiog reikia įvardinti prioritetus tokiems punktams:

  • funkcionalumas (programa gražina reikiamus rezultatus pradiniams duomenims);
  • efektyvumas (programa įvykdo skaičiavimus per protingą laiko tarpą ir su protingu atminties kiekiu);
  • saugumas, patikimumas (čia galima įskaityti ir testus);
  • kodo kokybė (gerai dokumentuotas, lengvai palaikomas kodas su geru API);
  • aparatinės įrangos išnaudojimas (čia jau galima paminėti ir scalability);

 

Sakyčiau, įprastinei programinei įrangai prioritetai būtų sudėlioti tokia tvarka, kokia ir paminėjau (nesigilinant į kraštutinumus). Žinoma, gal būtų keisti parametrus vietomis, bet čia jau turėtų būti labai specializuotą programinė įranga, kad funkcionalumas ir efektyvumas būtų ne sąrašo viršuje (ir tai matyt būtų įmanoma tik saugumui).

 

Ir čia jau joks scalability, joks moduliškumas, jokie testai, joks duomenų saugojimas nepagelbės, jei nesugebėsi parašyti algoritmo, kuris spręstų užduotį.

 

O iš ko susidaro tas „scalability“? Iš gražiai pavadintų klasių, ar yra kažkokie algoritmai ir duomenų struktūros, kurie leidžia protingai manipuliuoti duomenimis tarp kelių prietaisų? O duomenų apsauga iš kur: gražiai užvadintų kintamųjų, ar iš tam tikro algoritmo, kuris užtikrina specifinį manipuliavimą duomenimis, dėl kurio informacija nebūtų atskleista trečiosioms šalims? O bibliotekos iš kur gimsta: iš geros dokumentacijos ar iš algoritmų ir duomenų struktūrų implementacijos? O iš kur greitis atsiranda: implementuoji bet kokį algortimą ir pasimeldi C#'pui, kad greitai veiktų, ar implementuoji laiko atžvilgiu efektyviausią algoritmą?

 

Visa kompiuterija pastatyta ant algoritmų. Giliai giliai procesoriuose implementuota tik maža dalis funkcionalumo ir duomenų struktūrų (pavyzdžiui, matematinės operacijos, paprastieji duomenų tipai). Ir su kiekvienu abstrakcijos sluoksniu iš paprastų operacijų, duomenų struktūrų ir algorimų sudaromos sudėtingesnės operacijos, duomenų struktūros ir algoritmai.

 


 

ACM ICPC pasaulio finalas (kas nežino, tai panašiai kaip mokyklinės olimpiados, tik daugiau ir sudėtingesni uždaviniai bei dirbama komandomis po tris). Apdovanojama pirmos 12 vietų. Priedo prie užkabintų medalių IBM atstovas kiekvienam duoda po voką. Voke – pakvietimas dirbti į IBM. Pastebėsit, kad niekas nei vieno iš nugalėtojų nepaklausė, kaip gražiai jie užvadina klases, kokiomis kalbomis programuoja, kokias bibliotekas žino bei kokias UML diagramas moka nubraižyti. Užteko išmanyti ir sugebėti implementuoti tam tikrą kiekį algoritmų bei duomenų struktūrų ir tai atlikti greičiau už kitus, kad IBM juos įvertintų daugiau nepaklausę nė vieno klausimo.

So wrong.

 

Saugumas tau - trečioje vietoje? Galėčiau čia ir nustoti. Tikiuosi su tokiu požiūriu žmonės nedirba kokiam SEB'e. Praradai metų santaupas? Heh, whatever, žiūrėk koks mūsų internetinis bankas funkcionalus - braižo grafikus and stuff. Sėdai į kalėjimą už fraudą, kurį realiai įvykdė kenkėjas? Heh, whatever, konkurentų internetiniai bankai užsikrauna per 150 ms, mūsų - per 20 ms. Totally ######ing worth it.

 

Kodo kokybė - ketvirtoje vietoje? Beabejo, po 2 metų su tokiu prioritetu kiekvieną pakeitimą darant reikės knaisiotis po šiukšles, perrašyti daug ką, impact visai sistemai nerealus - puikus būdas tapti nebekonkurencingu ir naują versiją perrašyti iš naujo. Naujų programuotojų įvedimas? Kam rūpi, po metų daugmaž suvoks, kas per chujnia kodo bazė.

 

Eiii, dėl duomenų struktūrų mes labai greitai veikiame ant vieno serverio ar net ant vieno branduolio. Šaunuoliai mes! Tikėkimės, neteks scalinti toliau elementaraus load balancerio, nes tuomet reikėtų perrašyti 100k eilučių, kadangi kam rūpi sistemos architektūra? Algoritmai, algoritmai, algoritmai. Eiiii, turim geras duomenų struktūras, apgailėtina dokumentacija šimtu procentu pritrauks daugybę trečiųjų šalių. Eiiii, šitas algoritmas toks super optimizuotas, kad be barzdoto senio Jono jo niekas nesugebės ateity papildyti (Jonui laikrodukas tiksi, o sistemą tai teks prižiūrėti, kuomet Jonas susitiks su Šv. Petru), BET KAM ###### RŪPI - mūsų sistema dėl šito unmaintanable (nei dokumentacijos, nei kodo readability) rezultatus in big picture grąžina ne po 50 ms, o po 49,95 ms. Totally ######ing worth it. Išradinėti ratą, jį pertestuoti - nėra nieko smagesnio gyvenime.

 

Ir išvis - koks tamstelė susireikšminęs. Interceptini kokią užklausą, patikrini validumą - holy ###### koks aš algoritmuotojas proto bokštelis. Taip, tikrąja to žodžio prasme tai yra algoritmas. Kaip ir kvėpavimas labai sudėtingas reikalas - kiek dachuja raumenų veikia, dar smegenų siunčiami signalai. Bet come on, proto bokšteli, nei kvėpavimas sudėtingas, nei dauguma rašomo kodo yra algoritmai. It's ######ing natural. Algoritmų galvojimas - kuomet visa įmonė sėdi ant vienos specifinės užduoties ir tobuliną kelis algoritmus. Paprasčiausias pavyzdys - transporto įmonė sumoka 85k eurų už kelio planavimo algoritmą, kur gauta algoritmo bibliotekėlė mažutė, o tuomet parašo nesveikai daug kodo web api servisams, planšetinei programai, backend servisams, integracijoms su apskaita ir t.t. Tai tipo planšetinės programulkos patikrinimas, ar turi internetą ir jei turi - nusiunčia kelionės ir užsakymų duomenus, jau yra algoritmas? Ne, yra vienas algoritmas - kelio planavimo ir aplink jį pastatyta milžiniška infrastruktūra. Ir tie faini pfafėsoviai su savo tikrai labai geru algoritmu nesugebėtų suprojektuoti tokios sistemos. Akademikai parašė algoritmą, programuotojai užsiėmė programavimu. And that's what software developing is about.

 

Jėj IBM'ui svarbiausia algoritmai ir achujieniškiausios duomenų struktūros. Požiūris 1980 metų, kuomet pasaulyje buvo 20k IBM kompiuterių, o dabar milijonų milijonai kompiuterių, tačiau IBM'o vis dar 20k.

 

Laukiu nesulaukiu nišinio atsakymo, kuomet duomenų struktūros ir algoritmai labai svarbūs Maximos automatinių durų resources restrained mikrokontroleriams. Nes nišiniai pavyzdžiai generalizuojant - puikus diskusijos varikliukas.

 

Ir šiaip - kalbi kaip koks neapsiplunksnavęs studentas, kurį universitetas temoko rašyti programas su duomenų struktūromis ir algoritmais, o apie palaikymą, taisymą, plėtimą, testavimą visiškai nieko. Pasaulis taip nevažiuoja. Dėstytojai žiauriai žiauriai žiauuuuriai atitrūkę nuo realybės. Tu jų neklausyk taip, antraip gausi kultūrinį šoką atėjęs į pirmą darbą.

Redagavo Deviltry
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Aš nenoriu daugiau ginčytis, bet dar duosiu kelis argumentus:

  • Trečioj pastraipoj aptariau nišinę programinę įrangą, kuriai reikalingas aukščiausias saugumo laipsnis (ar tai banko sistema, ar medicinos programinė įranga, ar programa, kuri atneša didžiulius nuostolius klaidos atveju). Paprasta programinė įranga, daugų daugiausiai apsiriboja dviejų žingsnių autentifikacija (tik nereikia sakyti, kad jau kiekviena programa – bankinė sistema). Be to, apie saugumo iškėlimą aukščiau visko taip pat paminėjau.
  • Niekur nesakiau, kad kodo kokybė ar dokumentacija yra visiškai nesvarbi. Tiesiog tai iškelti aukščiau programos funkcionalumo būtų neprotinga (išskyrus saugumą; saugumas tam tikrais atvejais būna pirmoje vietoje). Galų galiausiai, galutinis vartotojais nemato nei dokumentacijos, nei kodo kokybės, ir po vartotojo sąsajos jam rūpi tik tai, kad programa veiktų teisingai ir veiktų greitai.
  • Testavimas be algoritmo suvokimo yra nieko vertas. Turi suvokti, kurie duomenys yra probleminiai tavo parašytam kodui. Kitaip išeis, kad tiesiog random duomenis padavinėji.
  • Niekur nesakiau, kad vietoj to, kad panaudotum kažkieno kito biblioteką, geriau pasirašyti savo algortimą. Tik va, dar neradau jokios bibliotekos, kuri išspręstų visas iškilusias problemas... Turbūt teks pačiam pasirašyti...
  • Paimkim, tarkim, max flow problemą. Vikipedijos straipsnyje paminėta vienuolika šios problemos sprendimo algoritmų su įvairiais laiko sudėtingumais. Sakyčiau visai be reikalo, jei tokiam menką reikšmę turinčiam dalykui reikėjo skirti tiek daug pastangų... Užtektų bruteforce sprendimą parašyti ir toliau eiti refactor'int kodo bei rašyt dokumentacijos...
  • Latency matters. Amazon found every 100ms of latency cost them 1% in sales. Google found an extra .5 seconds in search page generation time dropped traffic by 20%. A broker could lose $4 million in revenues per millisecond if their electronic trading platform is 5 milliseconds behind the competition.
     
    http://blog.gigaspaces.com/amazon-found-every-100ms-of-latency-cost-them-1-in-sales/
    Kiek paskutinį kartą bandžiau optimizuoti dokumentaciją, programos sparta visai nepadidėjo...
  • An algorithm, design, networking protocol, program, or other system is said to scale if it is suitably efficient and practical when applied to large situations (e.g. a large input data set, a large number of outputs or users, or a large number of participating nodes in the case of a distributed system).
     
    http://en.wikipedia.org/wiki/Scalability
    Turbūt žodis algorithm čia per klaidą pavartotas, nes pagal kai kuriuos žmones, algoritmai ir scalability nieko bendro neturi.
  • The eleventh annual [Google] Code Jam Finals wrapped up in Los Angeles, CA on August 15, 2014. It was an intense battle and the 26 contestants fought through four grueling hours of competition. In the end, only one could come out out on top. Congratulations to Belarus's Gennady.Korotkevich who claimed the title of Code Jam 2014 Champion, a prize of $15,000 and automatic qualification in the 2015 Code Jam Finals to defend his position!
    Google'as matyt irgi neturi kur pinigų dėti.
  • Labai geras pavyzdys su ta transporto sistema. O kas atsitiktų, jei puft ir pradingsta ta maža bibliotekėlė su visu algoritmu, bet palieka tik visi WEB API, visi apps'ai tabletams ir visas gražus jų kodas? Būtų daug kodo, kuris nedaro nieko naudingo...
  • Google pakeičia savo paieškos algoritmą ir tinklapių savininkai susiima už galvos, kaip dabar susigrąžinti buvusias pozicijas paieškos sistemoje...
  • Duomenų struktūrų suvokimas gali duoti didelę reikšmę net kai nereikia pačiam jų implementuoti. Vien pasirinkimas tarp sąrašo, masyvo ar set'o gali paveikti tavo kodo fragmentą taip, kad jis bus vykdomas tūkstančiais kartų lėčiau.

 

TL;DR: Jeigu didžiąją laiko dalį darbe užima ne patys algorimai, o pagalbiniai darbai, tai dar nereiškia, kad algoritmai nėra svarbu. Aš, pavyzdžiui, per dieną miegu 9 val. ir tai didžiausią procentą mano dienos laiko užimanti veikla. Bet aš nesakau, kad gyvenimo prasmė yra miegoti...

 

Daugiau šioje temoje nebekomentuosiu.

Redagavo wi_lius
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...