Miks õppida programmeerimiskeeli

Roland Tepp, tarkvaraarhitekt

Olen mitmel puhul (ka Proeksperdi siseselt) kuulnud arvamusavaldusi nagu professionaalsel tarkvara inseneril ei oleks vaja õppida enam kui kahte programmeerimiskeelt. Üks neist keeltest peaks olema tõsisem töö tegemise keel nagu C++, Java või C#; ning teine keel võiks olla mõni dünaamiliste tüüpidega skriptide kirjutamise keel nagu Ruby või Python.

Samuti olen kohanud suhtumist et programmeerimiskeele õppimine oleks just nagu väärtusliku aja ja ressursi raiskamine – miks õppida uusi või vähetuntud programmeerimiskeeli, kui nende osas puudub kliendi tellimus, kui neil puudub kogukonna tugi ja jääb vajaka oskusteabega töökäsi.

Ütlen otsekohe välja, et ma ei jaga neid seisukohti. Miks?

Sest programmeerimiskeeled on minu ameti tööriistad. Ma tahan käia ajaga kaasas ja lubada endale valida ainult parimaid tööriistu. Iga uus tööriist õpetab mulle uusi töövõtteid, laiendab minu silmaringi ja parandab minu konkurentisvõimet.

Pidevalt kasvav tööriistakast

Usun, et ei ole suur üllatav, kui ütlen et mulle meeldivad programmeerimiskeeled. Paljud, kellega suhelnud olen, on ilmselt kuulnud minu huvist Ceylon keele vastu — olen seda huvi kahel korral ka kolleegidega jagada püüdnud ning ka ise oma käe projektile külge pannud.

Samas minu programmeerimiskeelte huvi ei piirdu vaid ühe keelega. Läbi oma karjääri olen enamal või vähemal määral kokku puutunud paljude erinevate programmeerimis- ja dokumendikeeltega:Basic, Pascal, Perl, C, C++, VisualBasic, Python, JavaScript, Java, C#, Bash, PowerShell, SQL, Octave, Standard ML, Racket, Ruby, Erlang, Ceylon, Smalltalk, jne… Ja need on ainult programmeerimiskeeled — lisaks võib siia hulka lisada ka HTML, XML, CSS, LaTeX ja mitmed teised dokumendi- ja domeenispetsiifilised keeled.

Niiviisi ühes reas üles loetletuna tundub nimekiri kohutavalt pikk — tagantjärgi sellele pilku peale visates üllatab nimekirja pikkus mind ennastki — aga kui mõelda sellele, mis moel või millistel põhjustel ma neid keeli olen kasutama pidanud, siis pole tegelikult midagi imestada, suuremat osa neist keeltest on mul läinud vaja ühe või teise töö tegemiseks.

Väga vähesed keeled selles nimekirjas on õpitud ainult uue programmeerimiskeele õppimise rõõmu pärast. Enamasti on õppimise ajendiks olnud reaalne vajadus midagi ära teha.

Programmeerimiskeeled on enne kõike ikkagi peamised tööriistad. Uue programmeerimiskeele õppimine on nagu uue tööriista hankimine — sa ostad omale uue tööriista sellepärast, et sul on seda mingil hetkel vaja. Ikka üks tööriist korraga. Ja enne, kui sa märgatagi oskad, on sul neid kogunenud juba nii palju, et sellega täidab ära juba päris aukartustäratava tööriistakasti.

Ma ei pruugi kõiki tööriistu meistriosavusega käsitleda. Enamik programmeerimiskeeli minu “tööriistakastis” on näinud viimast kasutust aastaid tagasi ja tõenäoliselt võtaks mul täna paljude nendega mingi arvestatava produktiivsuseni jõudmine pea samapalju aega kui kunagi selle keele õppimine, aga mingil hetkel oli mulle neid vaja ja ma omandasin vajaliku teadmise piisaval tasemel, et “ohtlik olla”.

Käia ajaga kaasas

Isegi kui on õnn (või õnnetus) pikema aja vältel püsida sama programmeerimiskeele ja -keskkonna juures (C++ Windows development või Java EE või LAMP stack), siis ka need keskkonnad ei seisa kunagi paigal.

Nii C++, Java kui C# on läbi viimase paari aastakümne läbi elanud tohutuid muutusi. Pikad suhteliselt stabiilse platvormi perioodid on vaheldunud ajuti päris radikaalsete muudatustega nii keele kui arenduskeskkonna osas.

Java suureks murranguks oli 2004, kui saabus Java 5, koos generic’ute ja annotatsioonidega, mis muutsid tundmatuseni seda, kuidas kirjutada ja kasutada teeke ja raamistikke – Java EE pärast Java 5 erineb radikaalselt J2EEst mei oli enne seda.

Pärast kümneaastast pausi, kahte vahepealset Java versiooni, tuli eelmisel aastal välja Java 8, tuues keelde sisse funktsionaalse programmeerimise elemendid — lambdaavaldised. Nende mõju sellele, milline näeb välja uus Java kood, võib märgata juba praegu…

Samas ei saa jääda puhkama oma loorberitele ja loota, et sellega kõik piirdubki — Java 9 koos keelde sisse ehitatud moodulite toega ei ole kaugel silmapiiri taga ning selle muutuse mõjusid arendusele on väga lihtne alahinnata, kui puudub varasem kokkupuude modulaarse runtime’ga.

Kuigi ma ei ole enam aastaid aktiivselt C või C++ arendusega tegelenud, on siiski silma hakanud viimase aja C++ standardi kiirem areng. Ka JavaScript (või ECMAScript) on viimasel ajal hakanud näitama oluliselt kiiremat arengutempot tuues sisse suuremaid muudatusi keele süntaksi ja semantika osas.

Kiired ja ajuti ka üsna radikaalsed muutused muidu nii stabiilsete keelte juures ei ole juhuslikud. Need muutused on ajendatud peamiselt uute ja elujõuliste programmeerimiskeelte pealetungist — Java liidripositsiooni enterprise süsteemide arenduses on juba pikka aega noolinud C#, kuid ei saa alahinnata ka mõnevõrra uuemate tulijate nagu Scala, Groovy, Kotlini, Dart’i, Clojure, Ceylon ja Go keelte kuuma hingeõhku Java kuklas.

C++ käest püüavad vahelduva eduga püüda väänata turuosa D, Rust, Go, Nim, C#, Julia.

JavaScripti mitmeid veidrusi on siluda püüdnud nii CoffeScript, Dart, ClojureScript, Ceylon, ActionScript, Scala.js, ja paljud muud keeled.

Lisaks on hakanud akadeemikute tolmustelt riiulitelt pead tõstma ka mitmed funktsionaalsed keeled nagu Haskell, F#, OCaml, Erlang, Elixir, Racket.

Põhjalikuma suurpuhastuse on läbi teinud ka Perl, Python, PHP ja teised…

Kõik need keeled täidavad mingi lünga meie võimalikus tööriistakastis — igaühel neil on oma nišš, milles just see keel eriliselt särama lööb, võimaldades saavutada meie eesmärke kiiremini, kergema vaevaga, tehes koodi kompaktsemaks, paremini loetavaks ja/või pakkudes paremat turvavõrku tüüpiliste veaolukordade vältimiseks või olulisemat valupunktide leevendamiseks.

Püsida laineharjal

Parafraseerides tuntud vanasõna: “Kui su tööriistakastis on ainult haamer, siis valid sa oma tööpinna ja -materjali alati selliselt, et töö saaks ainult naelte ja haamriga tehtud.” Ka siis kui mõnikord piisaks liimist või akutrelli ja kruvidega saaks paremini, kiiremini ja kindlamalt.

Sa võid oma ainsat tööriista kasutada erakordse meiserlikkusega, teada täpselt, kui kõvasti millist naela millise pinna sisse lüüa, mis naelad sobivad millistesse materjalidesse ning osata 42 erinevat haamrilööki, kuid suvaline noor nolk, kes tuleb objektile oma naelapüssi ja akutrelliga, võtab sult töö käest, sest tema tööriistakast on rikkalikum ning võimaldab sama tulemuse saavutada kordades kiiremini ja kui mitte alati kvaliteetsemalt, siis vähemalt ühtlase ja piisavalt hea kvaliteediga.

Sama lugu on ka programmeerimiskeeltega. Jäädes pidama vaid ühe kindla (ja kahtlemata mugava) töövahendi juurde, piirame me oma konkurentisvõimet ja jääme mingil hetkel paratamatult ka ajale jalgu.

Mina eelistan hoida ennast kursis uute töövahendite ja töövõtetega. See tähendab lisaks teemakohaste artiklite ja raamatute lugemisele, podcastide kuulamisele (ja võimalusel konverentsidel käimisele) ka silma peal hoidmist uutel programmeerimiskeeltel.

Aegajalt kerkib teemakohasest meediast üles mingi uus teek, raamistik või programmeerimiskeel, mis lubab me elu koheselt teha kümme korda ilusamaks, lahendada maailma näljahädad ja teha lõpp sõdadega. Ei maksa palju kulutada, tund või paar selle uue asjapulgaga tutvumisele — lugeda dokumentatsiooni, uurida koodinäiteid ja vaadelda arhitektuurijooniseid. Mitte kõik ei ole kuld, mis sädeleb, aga esmase tutvuse tegemine annab piisavalt infot, et uuele tehnoloogiale mingi mõtteline koht oma tööriistakastis reserveerida.

Varem või hiljem saabub olukord, kus teadmise kogumisele investeeritud aeg kuhjaga tagasi võidetakse. Siis, kui vaja, meenub sulle töövahend või töövõte või programmeerimiskeel, mis lubab esimesed 80% lahendusest saavutada 20% vaevaga võrreldes tööga, mis oleks kulunud, et kõik algusest lõpuni ise teha, samas koodi loetavust kümnekordselt parandades.

Kui ma ei ole isegi teadlik parema töövahendi olemasolust, ei ole vähimatki võimalust seda ka rakendada.

Samuti ei tohiks unustada et ka tänased näiliselt kõigutamatu positsiooniga C++ ja Java olid millalgi uued ja tundmatud, eksootilised programmeerimiskeeled. Nende asemel laiutasid C, COBOL, Smalltalk ja Pascal.

Miks sörkida ammuste trendide sisse tallatud jalajälgedes, kui saame võtta liidripositsiooni ning aidata neid trende ise kujundada.

Õppida midagi uut

Nii nagu iga uue tööriista kasutusele võtmine paneb omandama uusi töövõtteid, nii õpetab ka iga uus programmeerimiskeel midagi uut.

Basic ja VisualBasic andsid ilmselt tugeva aluspõhja ja õpetasid, kuidas midagi lihtsalt “ära teha”. Pascal andis esmase arusaama sellest, mis vahe on interface’il ja implementatsioonil. C ja vähesel määral ka kunagine ammune ASM’i kogemus andsid mulle arusaamise sellest, kuidas kasutab mu programm arvuti ressurssi, kuhu kaob mälu ja kust tekib soojus. Java õpetas objektorienteeritud mõtlemist ja OO disaini põhitõdesid. Perl õpetas hindama loetava koodi väärtust. Python andis esmase kogemuse funktsionaalse programmeerimise elementidega ja õpetas usaldust koodi vastu ning näitas kuidas dünaamiliste keeltega saab lihtsate vahenditega ja vähese tseremooniaga saavutada suuri tulemusi.

Erlang andis esimese õppetunni sellest misasi on pattern matching ning kuidas kasutada rekursiooni. Scala ja Standard ML õpetasid mis asjad on kõrgemat järku funktsioonid ja kuidas nende abil lihtsaid ja kergesti hallatavaid funktioone kombineerides jõuda võrdlemisi keeruka funktsionaalsuseni.

Tänu Scalale tegin endale selgeks (mingil määral), mis on monaadid ja kuidas neid kasutada (ning sain ka selgeks, miks Java keeles need seni nii vähest kasutust on leidnud).

Ceylon ja Scala õpetasid kasutama staatiliste tüübi infot enamaks kui vaid tühipaljaks andmete konteineriks või sarnaste funktsioonide grupeerimiseks – staatiliste keelte tüübisüsteem võib olla sihipärase ja teadliku kasutaja käes väga terav tööriist veavabama ja kergesti loetava koodi kirjutamisel.

Erlang, Scala ja Clojure näitasid, kuidas immutable andmestruktuurid võimaldavad muuta triviaalseks paralleeltöötluse ja asünkroonsete protsesside haldamise. Ja läbi selle andsid aimu hoopis uuest arhitektuursest lähenemisest skaleeruvate süsteemide ehitamisel.

Iga keel, millega mul on olnud au kokku puutuda, on mõjutanud seda, kuidas ma pärast oma koodi kirjutan, kuidas ma oma esialgse ülesandepüstituse tükkideks lammutan ja mis moel ma lahenduse kokku kombineerin.

Usun et iga üks neist on teinud minust parema inseneri.

Leave a Reply

Your email address will not be published. Required fields are marked *