oktoober 30, 2016

Hõbekuuli püüdlemas












Kes teab, hõbekuul on koodinikerdajate maailmas vihje Fred Brooksile.
Enne sellesse maailma sukeldumist, töötupõlves lugesin seda ja peaksin uuesti üle vaatama, nüüd on sellel kõigel rohkem mõtet.
Tõsi, tollal ma arvasin enesekindlalt, et noh, ühe suure andmebaasiprogrammi (ega see nii väga suur ei olnudki tagasi vaadates) olen valmis teinud (dbf formaadis), et oskan küll.
Ega ikka nii väga ei osanud küll ja ei oska praegu ka.
Millegipärast olin (ja vahel olen ikka veel) arvamisel, et kusagil on olemas mingit sorti eliksiir või siis hõbekuul, mille omandamisel hakkab koodinikerdamine palju, palju kiiremini kulgema.
Millegipärast oma andmebaasiprogrammiga see ei õnnestunud, aga noh, teise töö kõrvalt (arvutiadministraatorina) nii veerandkoha koormusega aretades ehk ei pidanudki oskama.
Üllatusega avastan, et kolleegid ei paista ka hõbekuuli olevat leidnud, kuigi nende tegemised kulgevad siiski palju, palju efektiivsemalt. Aga mitte vahest järk efektiivsemalt, vaid lihtsalt noh, ütleme 2 korda kiiremini. Võib-olla ka kolm, kui mingi asi väga käpas on. Spetsialiseerumine ei ole küll hõbekuul, aga kui teed mingit asja, mida oled juba hästi teinud, saab lõpuks päris osavaks.
Kui probleem on uus, siis võib olla vähem, aga siiski kogemus siin ka loeb - ka uue probleemiga tegelemise kogemus on kogemus.
Brooksi jutt täpselt sellele osundaski. Kooditegemise käigus on olemuslikke asju, mida ei saa väga palju kiiremini teha, kuigi saab muutuda päris osavaks.
Võrdleksin oma hobi - ujumisega. Saan uhkelt harrastusujujatest mööda põrutada, aga ka minu võimetel on piirid. Mina ujun100 meetrit, juhuharrastaja 50. Ja treeningupoiss ujub selle aja sees 150 meetrit.
Ujun tavalist konnastiili ja olen päris uhke, et saan maha 50 meetriga tempos 1 minut ja 10 sekundit, nüüd hetkel koguni 8 sekundit. Aga millist pingutamist see 2 sekundit tähendab, ja mitu korda rohkem pean nädalas ujumas käima, et saada kätte näiteks 1 minut ja 5 sekundit?
Kuigi jah, Phelps muigaks selle peale ja meie Tartu poiss Zirk ka muigaks. Ma ei tea tema treeningutempot, vahest 45 sekundit 50 meetri peale, või koguni 40 (konna stiili harrastades?).
Aga ikkagi üle 2 korra kiiremini ta minust ei uju.
Ka inimese vaimsetel võimetel on omad piirid, vähemalt kiiruslikus mõttes.
Ja kuhu meil siis ikkagi nii kiire on?
Suurema projekti puhul on vaja lihtsalt rohkem inimesi tööle panna ja nende tööd paremini organiseerida.
Siit aga selle valdkonna võlu ja valu algabki.
Projektid on tavaliselt suured, mitte väikesed. Mitte 100 rida, vaid 10000 ja 100000.
Üksiküritaja võib pika aja sees saada oma 100000 realise monstrumi kätte üksinda tehes, firmas peab sellega tegelema meeskond.
Teise inimese koodi peab oskama lahti võtta. See ei ole alati ainult programmeerimiskeele küsimus, igaühel kujunevad välja mingid harjumused. Mõned võivad olla ka halvad, mõni aga on maitse asi ja selliste asjade üle käib alati halastamatu andmine.
Kuhu ikkagi panna see loogeline sulg { ?
Kõike ei jõua parimagi tahtmise korral dokumenteerida. Kui palju ikkagi kommenteerida?
Kuidas koodi nii kirja panna, et teine inimene ka sellest aru saab?
Kuidas koodi nii kirja panna, et seda annaks modifitseerida.
Millal hakata vorpima UML-e ja kõikvõimalikke muid skeeme.
Pidage meeles, et igal projektil on alati mingi ajaline piir, eks?
Kõikide nende asjade üle käib netis alati mingi “flame war” (milline võiks olla eestikeelne oskussõna?), mis annab tunnistust vaid sellest, et siin hõbekuule ei ole leitud.
Pakun siin välja oma esialgsed mõtted, mis võivad muutuda.
1. Kui mul on valida 2 programmi vahel, millest üks on hästi kirjutatud, aga milles pole ridagi kommentaare, ja programmi vahel, mis ehk ei ole nii hästi kirjutatud, aga milles on jutt juures, mida miski asi teeb, ma valin edasiarendamiseks teise programmi.
Isedokumenteeruv programm on üks suur müüt ja mida kiiremini sellest müüdist vabaneda, seda parem.
Uurisin netist - avatud koodi projektides peetakse heaks tooniks 10% -20% kommentaare.
Enamasti võib muu dokumentatsiooni tegemiseks siiski aega mitte jätkuda, kommenteerimiseks võiks aega kulutada küll.
2. Jeffrey Snower (PowerShelli looja) ütles kunagi XP programmerimise kohta, et see on nagu püksi pissimine - algul on soe, aga pärast ...
XP kohta mul puudub praegu sügav kogemus, kuigi vist kaldun selle poole, et vanad ja vastikud koskmeetodi harjumused kaevatakse tasapisi igal pool välja, sest ollakse jõudnud püksi pissimise teise faasi - iga firma arhiivides leidub meetrite viisi koodi, mida oleks vaja edasi aretada ja nüüd on küll vaja juttu selle koodi juurde ka teada saada.
On vaid teada, et kood tekkis nii, et 2 programmeerijat tegelesid sellega XP-d harrastades, aga praguseks on nad firmast läinud ja ühesõnaga, ei teata sellest midagi peale legendide.
...
3. Ja samas see asi, mida ma ei oska ja peaksin hakkama oskama - tundmatu koodi desifreerimine.
Sest tegelikult ei ole võimalik kõike dokumenteerida, iga projekti puhul ollakse tavaliselt ajahädas, surve asi ära teha on tohutu ja isegi selle surve puudumisel on oma koodi efekt väga tugev - väga lihtsaid asju ju ei viitsi kirja panna. Kuna inimesed liiguvad, siis koodi autor on juba ehk kusagil mujal, ja kui ka siinsamas oma kontoris tegutseb, on tal hetkel tavaliselt mingi muu pingeline asi käsil ja tal ei ole aega (ja ka meeles ei ole äkki) tundide kaupa vestelda. Ühesõnaga, see tasakaalu küsimus, palju koodist pidada iseenesestmõistetavaks ja mida siiski ära märkida, see on probleem.
4. Aga iga firma peaks arvestama, et inimesed liiguvad ja see sama püksi pissimise probleem avaldub alles näiteks 5 aasta möödudes. Et oli kodeerija K, kes kirjutas (väga head) koodi.
Aga juttu väga palju ei ole juurde kirjutatud. Ja nüüd on äkki probleem.
Ja tööle maabub mitte alati see kõige, kõige oskajam, vaid näiteks allest ülikoolist tulnud, kes väga hästi teab kiirsortimise algoritmi, aga paljusid muid asju ei tea.
Ja selle kõige juures on keskkonnad ikka väga erinevad. Mingi Foxpro taustaga tegelane näeb algul üsna kurja vaeva C keelega (mida ta ammu ammu kusagil füüsika insituudi laboris oli ka näppinud).
5. Ja puhtalt kodeerijate kõrval on palju teisi tegelasi firmas, kes ei peagi teadma kõiki nüansse.
Nii et kuigi kodeerimise maailmas käis läbi kunagi Prantsuse revolutsooniga võrreldav XP programmeerimise vool, loksub kõik jälle vanasse sängi tagasi.
Bürokraatia ja dokumenteerimine omandab jälle mõtte.
6. Kahjuks tuleb igal kodeerijal oma elus tegelda paljude keskkondadega. Ometi ei ole väga hea mõtte neid spetsiaalselt juurde koguda.

Tegelikult võidaks aega kõvasti, kui C, C++, C#, Java ökosüsteemi, Delphi, PHP, Javascripti paabeli asemel oleks näiteks see vana (ja kohutav) C. Või C++. Või Java ökosüsteem, mis jälle ise on üks paabel.
Eriti õppimisel kuluks see ära. Hiljem, mingite vilumuste ja reflekside tekkimisel ehk ei ole see sein nii järsk, mingi uus keskkond hakkab palju kiiremini külge.
See jälle sõltub, aga sain teada ... et TEGELIKULT ma ei ole kiire õppija.
Minu näide on vahest hästi õpetlik:
Firmas tegelen C-ga ja oleks päris tore olnud, kui nüüd õpitavad Algoritmide ja andmestruktuuride kursusel ka kirjutaksin C harjutusi ja ei peaks vaevlema mulle täiesti tundmatu Javaga.
Füüsiku ülbusega aga arvasin, et see on selline “köki möki” asi. Ei olnud midagi.
Seetõttu valisin AA kõrvale midagi veel vingemat (et oleks ülimalt huvitav). Valisin
funktsionaalse programmeerimise (vinge!!).
See kursus ei ole KINDLASTI mitte algajatele mõeldud.
Ma kaldun arvama, et kursuse tegijad ei ole ka päris hästi läbi mõelnud, mida nad peaksid seal õpetama. Kas tegelda grupi fanaatikutega, kes juba palju teavad ja tahavad lihtsalt täiustuda Haskelli ja Scala maailmas? Või eeldada proosaliselt, et kursusele maabuvad üsna erineva tasemega inimesed, kellest enamik siiski FP-st midagi ei tea.
Idee õpetada ÜHEL semestril nii Haskelli kui Scalat kindlasti ei ole hea.
8 loengut ja hops - Haskell selge. Minevik, üks kontrolltöö ümbertegemine veel,
sain 50st võimalikust kätte 28, 3 tegin ära ja kahe ülesandeni puht füüsiliselt ei jõudnud (vanus ka loeb). Ma ei usu, et rohkem üldse saan. Aega ei ole. 50 -se aju tiksub hoopis aeglasemalt, kui noore IT tudengi oma. See kahjuks selgus selle kontrolltöö käigus näiteks.
Ja nüüd vaevlen Scala rüpes. Ja mitte lihtsalt Scala, vaid Odersky enda põhiteksti, Scala by example abiga üritan seda selgeks saada.
Kõige selle käigus sai AA õppimine kõvasti kannatada ja siin ma nüüd kaeblen.
AA on nagu üldfüüsika kursus, see võiks ka ulatuda üle 2 semestri kindlasti, aga ok, Tartus tehakse kõiki suuri asju ühe semestri sees.
Kardan, et FP tuleb mul lihtsalt ohverdada, eksternina siis mahavisatud raha.
Ei saa õppida korraga Javat, AA-d, Haskelli, nüüd siis Scalat ja teha täiskohaga põhitööd ka.
Selle kõige eest saab 12 punkti, kui nüüd sedagi saab (kui 6-gi AA eest kätte saab, on ka hea).
Võimalik, et ma vingerdan öötööde ja puuduvate puhkepäevade arvelt välja, võimalik, et ei vingerda ja FP-st jäävad edaspidiseks vaid halvad mälestused. Vähemalt kindel teadmine, et sellist asja ei omanda ÜHE SEMESTRIGA ja eriti stiilis 8 loengut Haskelli ja 8 loengut Scalat.
Noorus saab sellega ehk hakkama ja TÜ raamistikus see kõik on OK.
IMHO siiski ei ole.
Õppimise aluskeskkond võiks ülikoolis olla Java. Java ja ainult javapõhine võiks olla kogu bakalaureuseõpe. (FP siiski vist ei olnudki bakaõppe osa, aga ka siin alustusena sobiks see idee).
FP-d saaks õpetada AINULT Scala baasil. Ei mingit Haskelli, kui küsimuse all on 1 semestri lühikursus 16 loenguga.
Scala seetõttu, et üliõpilased Javat juba tunnevad.
Minu huvidega see kokku ei käinud, ma ei tea Javast mõhkugi.
Variant B oleks AINULT Haskell.
Formaalselt saab mahutada 16 loengu raamidesse ükskõik mida, reaalselt seda teha ei saa.
Saab ainult nii, et reaalselt üliõpilane tõesti planeerib ettenähtud 150 tunni asemel FP-le semestris tunduvalt rohkem aega kulutada. Näiteks 200-300 tundi või on seda juba varem teinud. Mina seda lõbustust endale lubada ei saa ja järelikult FP jääb mingil hetkel VIST ära.
Sellist asja nimetatakse fokuseerumiseks ja fokuseerida arvutiõppes on vaja. Peamine ei ole mingisugune multikulturaalne paljusus, mida üliõpilane IT-st peaks saama, vaid mingi ühe ökosüsteemi (näiteks JAVA) pulkadeni omandamine koos lisanditega. Näiteks SCALA.
Võimalik, et magistriõppesse võiks tulla juurde paljusus, aga alustuseks ei saa ei ann see midagi. Paabel on programeerimise keskkondadesse küll sisse kirjutatud, aga mina pean seda meie valdkonna nuhtluseks, mitte eeliseks.
MA EI NÄE SIIN MINGIT HÕBEKUULI.
IT-s tuleks teha ühte asja, ja teha seda hästi.
See printsiip on Unix-st, mille kohta olen hakanud ka kriitilisemaks muutuma.
See kriitilisuse faas muuseas kuulub asja juurde, nagu ilmselt ka mingi ühe või teise stiili entusiastiks saamine lõppude lõpuks. Praeguses seisus on FP vaimustus minus kõvasti, väga kõvasti lahjenenud.
Aga mine sa isahane tea, see võib veel üle minna.
Nii palju siis mulle kingitud tunni raames (täna öösel keerati kellale jälle taha. hm. voorimehe, s.t. it mehe kombed on siginenud...) hõbekuuli leidmisest, kust paistan olevat veel kaugemal, kui töötupõlves, s.t. 2 aastat tagasi...