Programavimo kalbos

arba kaip pasistatyti nuosavą Babelio bokštą

Intro
=====

Neseniai išreiškiau [kontroversišką nuomonę](./learningc.html) apie C ir C++ kalbų mokymąsi. Kaip ir reikėjo tikėtis, sulaukiau daug nevienareikšmiškų komentarų. Kai kas puolė ginti šias kalbas, kai kas koneveikti mane už tokią nuomonę. Susilaukiau ir komentarų, kurie pavertė paprastą "patarimą naujokui" rimtais apmąstymais.

Vienas iš tokių iškeltų klausimų buvo "o kuo gi iš tiesų, pradedant mokytis, viena kalba skiriasi nuo kitos?". Atsakymas, bent jau man, neatrodo paprastas. Tiesą pasakius, negaliu duoti atsakymo į tokį klausimą. O kadangi atsakyti norėtųsi, rašau šiuos savo pamąstymus, gal iš jų kas nors išryškės.

Šioje esė išdėstau kelis aspektus, į kuriuos derėtų atkreipti dėmesį renkantis savo pirmąją kalbą. Čia nerasite atsakymo į klausimą kurią kalbą rinktis, šis pasirinkimas jūsų ir tik jūsų. Vietoj to pateikiu rečiau akcentuojamus, pamirštamus ar tiesiog praktikos padiktuotus kalbos priimtinumo "mato vienetus".

Kriterijai
==========

Pradžioje norėčiau išskirti du kriterijus, kurie man atrodo svarbiausi pradedant programuoti: pradinės pastangos ir pirmasis prizas.

Pradinės pastangos (entry threshold) yra kaina, kurią tenka sumokėti tam, kad pajustum, jog "jau" programuoji. Tarkime, kad tam reikia sugebėti parašyti "hello, world" bei pramokti keletą programavimo pradžiamokslio pamokų, pajusti, kad išties gali priversti kompiuterį daryti tai, ką tu ir tik tu turi savo vaizduotėje.

Pirmasis prizas (first reward) yra tai, kas traukia pradinuką prie programavimo, kas jį stimuliuoja ir skatina mokytis. Tai yra daugiau (gal netgi gerokai daugiau), nei tas pirmasis (visada klaidingas) jausmas, kad "jau" programuoji. Tai yra "tas kitas" žingsnis, kai sukūręs kažką, kas atrodo gražu ar galbūt netgi naudinga, nepasakai "va, padariau", o pašoki nuo kėdės, skambini draugams, parodai tėvams, iš to džiaugsmo negali nutupėti prie teliko, žiūrėdamas eilinę mėgstamojo Dragon Ball Z seriją, ir galų gale iš didelio noro žengti dar bent mažytį žingsnelį į priekį, prasėdi pusę nakties prie kompo. TAI yra pirmasis prizas.

Pradinės pastangos
==================

Taip įsijaučiau, kad beveik pamiršau apie ką rašau. Programavimo kalbos. Kalbos yra skirtingos, jos skirtos įvairiems tikslams, vienos universalios, kitos orientuotos į tam tikrą nišą, trečios šiaip prastos, o ketvirtos išvis geros. Bet pradedantysis viso to nežino ir žinoti negali. O patyręs programuotojas jau pamiršo, kad mokslo šaknys karčios, ir klausia "O kokiam tikslui tau reikia programavimo kalbos?". Paprastam tikslui: išmokti programuoti [1].

Štai keletas padrikų minimalių kodo fragmentų, su kuriais bus priverstas susipažinti bet kuris ta kalba pradedantis programuoti naujokas:

Python:     def main ():
Pascal:     program Foo;
C:          int main (int argc, char *argv[])
Lisp:       (defun do-nothing ())
Java:       public static void main (String[] args)
Assembly:   [censored: N-14 ;-)]
COBOL:
        IDENTIFICATION DIVISION.
                 Program-Id. Hello-World.
              *
               ENVIRONMENT DIVISION.
              *
               DATA DIVISION.
              *
               PROCEDURE DIVISION.
               Para1.
                   DISPLAY "Hello, world.".
              *
                   Stop Run.

Vienas paprastesnių būdų pasirinkti yra pažiūrėti į šiuos bei kitus -- labiau reprezentatyvius -- kodo fragmentus ir išsirinkti kalbą, kuri tiesiog estetiškai priimtiniausia.

Tarkime, išsirinkome Java. Manykim, dėl to, kad šiame fragmente daugiausiai paprastų anglų kalbos žodžių ir mažiausiai nesuprantamų simbolių. Ko reikia norint programuoti Java? Reikia atsisiųsti JDK (Java Development Kit), jį suinstaliuoti, pramokti (jeigu dar nemoki) dirbti su komandine eilute, užkurti mėgstamą (arba ne) teksto redagavimo programą ir galima pradėti. O, taip! Dar reikia nepamiršti 'javac pradedam.java' ir 'java pradedam'. Ir tikrai ne 'java pradedam.class'! Tai tikrai svarbu. Be šito toli nenuvažiuos nei naujokas, nei profesionalas. Žodžiu -- kertinis kalbos aspektas.

Dabar pabandykim Python. Iš www.python.org atsisiunčiam instaliacinį failą, suinstaliuojam, paleidžiam Python interpretatorių ir galim rašyti. Jeigu užrašom be klaidų, tai netgi veikia.

Štai jums ir pradinės pastangos. Norint vienomis kalbomis užrašyti "hello, world" reikia įdėti daugiau pastangų, kitomis mažiau. Kai kurios kalbos priverčia išmokti (ar bent jau įsiminti) debesį bereikalingo šlamšto vien todėl, kad... O iš tikrųjų, kodėl? Tuo tarpu kitomis gali tiesiog taip: imkite mane ir programuokite.

Bet pradinės pastangos tuo nesibaigia. Kartais galima paplušėti ir su ta Java, jeigu paplušėjus ji apdovanos savo paprastumu, efektyvia mokymosi kreive ar, kad ir saldainiais.

Apdovanojimai ir nuobaudos
==========================

Nenagrinėsiu kiekvienos kalbos atskirai. Ir kalbų per daug, ir poreikiai kiekvieno skirtingi. Vietoj to pabandysiu aprašyti keletą apdovanojimų ir nuobaudų, kurių kalba gali nepagailėti pradedančiajam.

Pradėsiu nuo "baltų dėmių". Tai yra tokie kalbos aspektai, su kuriais esi priverstas susidurti jau labai anksti, bet dar negali (o dažnai ir neturėtum) suprasti ir žinoti ką jie reiškia ir kam jie skirti. Tokioms dėmėms galima priskirti Paskalio "program Foo;", C funkcijos main parametrų sąrašą ("int argc, char *argv[]"), Javos "public static void main". Dažniausiai literatūra ar labiau patyrę draugai tokius dalykus pristato kaip aksiomas: "Ai, nekreipk dėmesio. Įsimink ir tiek, o kada nors, kai prireiks, išmoksi kur nors kitur". "Baltos dėmės" lyg ir nėra labai blogas dalykas (o žingeidiems gal netgi geras), tačiau visgi tai periferija. Atitraukia dėmesį nuo esmės, blaško, verčia nepamiršti kaskart užrašyti nesuprantamą, bet mintinai iškaltą litaniją, pakiša koją jeigu ką pamiršti. Kuo mažiau kalboje tokių dėmių, tuo ji tinkamesnė pradinukui.

Kitas labai svarbus aspektas -- įvedimo ir išvedimo operacijų paprastumas. Kitaip tariant, kiek žinių ir pastangų kainuoja išmokti perskaityti informaciją iš klaviatūros, užrašyti kažką ekrane, skaityti ar rašyti failą. Šis žingsnis yra būtinas bet kuriam besimokančiam programuoti ir jis jokiu būdu neturi pakišti kojos. Kas jeigu jau nuo pirmų valandų trukdo nesupratimas kaip veikia skaitymas ar rašymas arba pradeda kažkas-neveikti-juk-vakar-veikė?

Kas išvis yra programavimas? Korifėjai sako, kad tai algoritmai plius duomenų struktūros, Unix hakeriai sako, kad tai KISS [2], o sekretorės ir bobutės sako, kad yra toks daiktas HTML. Pradedantysis dažniausiai pirmą kartą pajunta, kad programuoja, užrašęs pirmąsias savo alternatyvas ir iteracijas (šnekamojoje kalboje vadinamus "ifais" ir "forais"). Tad labai svarbu, kad programavimo kalba čia netrukdytų. Keista, bet yra kalbų, kurios sugeba šioje vietoje išsišokti. Ypač prašosi paminimi du atvejai: Paskalio ciklas reapeat-until "čerez žopu" (apversta sąlyga) ir ganėtinai sudėtingos Lisp ciklo konstrukcijos. Pastarosios pradedančiajam gali sukelti isteriją.

Kitas žingsnis besimokant programuoti yra platesnių vandenų įsisavinimas naudojant abstrakcijų irklus. Į kairę ranką imam duomenų struktūras, į dešinę funkcijas ir irkluojam. Drąsesni gali sėsti į baidarę ir čiupti dvipusį irklą -- klases. Tik atsargiai! Baidarę labai lengva apversti.

Visos kalbos, kurias man teko matyti, beveik vienodai gerai dorojasi su duomenų struktūromis ir funkcijomis (žinoma, kalbu apie kalbas, kurios apskritai moka operuoti tokiomis sąvokomis). Išskirčiau turbūt tik du povandeninius akmenis, ant kurių galima užplaukti.

Jeigu kažkuri kalba nemoka elegantiškai dirbti su teksto eilutėmis, pasidomėkit kita, kurioje operacijos su teksto eilutėmis yra paprastos. Tai svarbu. Nėra jokio reikalo valandų valandas gaišti, perprantant kaip autoriai nusprendė operuoti eilutėmis -- jūsų laukia daug įdomesni ir svarbesni dalykai.

Jeigu, norint efektyviai išnaudoti funkcijas, reikia susipažinti su nebūtinais, pašaliniais dalykais (pavyzdžiui, pointeriais), pakentėkit ir kol kas nesimokykit tos kalbos. Išmokit kitą, kur niekas netrukdys įvaldyti vieną seniausių ir patikimiausių programuotojų ginklų.

Community
=========

Ką daryti kai nuobaudų pasipila tiek, kad skauda? Kai kalba programuotoją už nusižengimus "pastato į kampą" tokiam ilgam laikui, kad nieko gero nenuveiki, tik stovi įspraustas tame kampe? Kad ir kaip patyrusius programuotojus erzintų pradedančiųjų klausimai, deja, tenka konstatuoti, kad tokiais atvejais reikia kreiptis į guru. Atidžiai perskaitykite įvairius patarimus [AskingQ] kaip reikia paklausti, kad klausimai mažiau užknistų, kad sulauktumėte atsakymo, o jeigu pasiseks, kad guru būtų netgi įdomu atsakinėti.

Šis aspektas turi įtakos ir kalbos pasirinkimui. Jeigu pasirinksite, tarkim, Ada, Algol, ML, Modula-3 ar Simula [3], kas jums padės išspręsti problemas? Kur rasite literatūros? Nesirinkite visiškai nežinomų kalbų, kuriomis mūsų planetoje niekas neprogramuoja.

Deja, šis geras kriterijus reikalauja išmanymo. Kai kurios kalbos yra per mažai žinomos Lietuvoj. Kitos žinomos tik tam tikruose sluoksniuose ir kitų programuotojų klaidingai vertinamos kaip "tik tam ir tetinkančios". Nesileiskite įtraukiami į paskalų ir prietarų liūną. Išsiaiškinkite patys kas tai per kalba, kam ji skirta, kas ja programuoja ir kodėl. Besiaiškindami vieno dalyko saugokitės kaip maro [4]: jeigu kalba buvo sukurta siekiant "išspręsti visas pasaulio problemas", bėkite nuo jos neatsigręždami!

Jei nebėgsite, rizikuojate pakliūti į pinkles, vadinamas "hype". "Visi programuoja Java", "pradėti būtina nuo Paskalio", "C++ -- optimali greičio ir elegancijos kombinacija", "C# -- better than sex!" ir t.t. Žinoma, prisiklausius tokių šnekų norisi programuoti "tikrų vyrų" kalba, iškart šokti į industrijos traukinį. Tačiau reikia suprasti, kad "tikri vyrai" tomis kalbomis programuoja ne iš gero gyvenimo. Industrija kelia industrinius reikalavimus: programos turi veikti greitai, programuoti reikia taip, kad tau išėjus iš darbo būtų lengva rasti kitą programuotoją, kuris supras tavo parašytą kodą ir t.t. Išnaudokite progą programuoti "laisvai", be visų šių apribojimų. Neskubėkite mokytis industrinės kalbos kol nereikia; mokėdami dvi-tris, tą ketvirtą išmoksite per kelias savaites.

Svajonės ir realybė
===================

Kiekvienas pradeda kažko mokytis todėl, kad nori su tuo kažkuo nuveikti ką nors naudingo arba nelabai naudingo. Taip pat yra ir su programavimu. Yra žmonių, kurie susižavi žaidimais ir nori išmokti patys programuoti žaidimus. Yra žmonių, kuriems atsibosta lūžtančios programos ir norisi parašyti nelūžtančią. Kažką galbūt sužavi idėja sukurti naują operacinę sistemą ar parašyti patį gražiausią GUI iš visų kada nors sukurtų. Ne visada šios svajonės ar tikslai atsiranda prieš pramokstant programuoti. Kartais tiesiog pamatai per petį, kad TAI yra įmanoma, pabandai ir patinka. Bet anksčiau ar vėliau atsiranda vienoks ar kitoks pomėgis, tikslas, viliojanti niša.

Nesirinkite pirmosios savo kalbos pagal savo svajonių nišą! Visų pirma, jūs dar nežinote kuo ta niša pavirs po mėnesio. Antra, jūs dar per mažai žinote, kad nuspręstumėte, kas tinkama tam, ko jūs siekiate. Trečia, tai, kas kažkieno nuomone nėra tinkama jūsų svajonei, iš tiesų yra tinkama. Mirtinai norite parašyti operacinę sistemą? Mokykitės Lisp! Norite kurti trimačius žaidimus? Go Python! Vilioja gražūs GUI? Junkite Paskalį (ne Delphi!).

Paklauskite bet kurio patyrusio programuotojo, ir jis iš įpročio jums pasakys: kiekviena mano paminėta kombinacija yra kalambūras, nė viena kalba netinka nė vienam iš šių tikslų. Tačiau jis pamirš pagalvoti apie tai, kad jokia kita kombinacija jums taip pat netinka.

Kodėl operacinei sistemai rašyti netinka C kalba ir asembleris? Juk visos rimtos OS parašytos su C! Ogi todėl, kad jūsų OS niekada nebus baigta, jai niekada niekas nerašys softo, ji neturi būti greita, ji neturi būti lengvai keliama į kitas platformas, ji išvis neturi būti jokia. Jūs tiesiog mokotės programuoti turėdami gyvenimišką pavyzdį prieš akis.

Kodėl siūlau kurti trimatį žaidimą su Python? Juk ji lėčiausia man žinoma kalba! Dėl tos pačios priežasties: jūsų žaidimas niekada nebus išvystytas tiek, kad susidurtumėte su kalbos greičio problemomis. Užtat susidursite su daugybe kitų, kurias reikės spręsti.

Paskalis ir GUI? Taip! Užkurkite priešistorinį Borland Paskalį, įsijunkite grafinį režimą ir paišykite nuostabius 16os spalvų mygtukus. Niekur kitur nepasiklosite patikimesnių pagrindų GUI programavimui, kaip tik patys sukūrę GUI toolkitą. Ir nepamirškite: pirmajam jūsų GUI toolkitui niekas nerašys programų, niekas net nežinos apie jo egzistavimą ir, jeigu nenumirs kietasis diskas ir spėsite iškepti CD, jis dulkės lentynoje tol, kol po daugelio metų netyčia jį rasite ir smagiai praleisite laiką skaitydami savo prieštvaninį kodą.

Nepamanykite, kad noriu sugriauti jūsų viltis. Jokiu būdu. Tiesiog jūs net nenumanote, kas sudaro OS širdį, nenutuokiate kokių iššūkių jums pateiks trimačiai žaidimai ir GUI. Net labai patyrę programuotojai turi klaidingų iliuzijų kol patys savęs neišbando naujoje srityje. Ir jūs išbandykite save toje naujoje srityje, neapleiskite savo norų. Tiesiog nesirinkite kalbos pagal tai, kad kažkas kitas su panašiais norais kažkada ją išsirinko. Patikėkit, jis gailisi arba savo pasirinkimo, arba aplinkybių, kurios nepaliko jam teisės rinktis. Rinkitės kalbą pagal jos ekspresyvumą, pagal tai, ar nutuokiate, ką daro nepažįstamo kodo gabalas, pagal tai, kiek ji atrodo priimtina šiek tiek su ja pažaidus.

Miscellaneous
=============

Štai dar keletas kriterijų. Apie daugumą iš jų smulkiau nerašiau, nes neturiu ką daugiau pasakyti arba nenoriu nukrypti į šalį. Nesiūlau jais vadovautis, nes tai arba pavojinga (pvz., nepatyrusiam žmogui rėksnys didele gerkle gali pasirodyti panašus į korifėjų), arba pats tam nepritariu (bet nenoriu čia plėstis argumentuodamas). Tačiau žinoti, manau, verta.

  • Ką sako korifėjai (Nicklaus Wirth, Edsger Dijkstra, Eric Raymond, Paul Graham, Brian Kernighan ir kiti).
  • Kiek kalbai metų (Algolas ir Fortranas mirė, Lisp ir C išgyveno; jūsų teisė rinktis).
  • Ar yra kalbos Open Source realizacija (jau netgi .NET kalboms yra!).
  • Saugokitės kalbų, kurias "stumia" kuri nors viena korporacija! Java -- Sun Microsystems, PL/1 -- IBM. Java dar gyva, PL/1 jau nebe...
  • Interactive environment (t.y. interpretatorius) is good. Pavyzdžiui, Python, Lisp, Scheme ir kt.
Outro
=====

Išmokti programuoti nėra lengva [Learn10]. Tai pareikalaus daug pastangų nepriklausomai nuo kalbos, kurią pasirinksite. Galų gale yra keletas kalbų, kurias privalu mokėti ar bent jau būti susipažinus, jei nori vadintis programuotoju. Tad pirmosios kalbos pasirinkimas daro įtaką tik tam, ar mokymosi procesas bus labai sunkus, ar visai sunkus.

Tikiuosi ši mano rašliava suteikė jums naudingos informacijos ir parodė, kad programavimo pasaulis yra platus ir jame yra iš ko rinktis, bei kaip būtų galima pagrįsti pasirinkimą. Drąsiai čiupkite vieną kalbą po kitos, nagrinėkite jas ir tada spręskite, ar kalba bus pakankamai gera jūsų, naujai iškepto programuotojo, kuratorė.

Sėkmės!

Rašykite savo atsiliepimus ir nuomones: vytas@rtfb.lt.

Skaitiniai
==========

Teach Yourself Programming in Ten Years, by Peter Norvig
[http://www.norvig.com/21-days.html]
[Learn10]

How To Ask Questions The Smart Way, by Eric Steven Raymond
[http://www.catb.org/~esr/faqs/smart-questions.html]
[AskingQ]

How To Become A Hacker, by Eric Steven Raymond
[http://www.catb.org/~esr/faqs/hacker-howto.html]
[HTBAH]

Nuostabūs Paul'o Graham'o straipsniai:
The Word "Hacker"
[http://www.paulgraham.com/gba.html]

Hackers and Painters
[http://www.paulgraham.com/hp.html]

Great Hackers
[http://www.paulgraham.com/gh.html]

Ir dar daugiau čia: http://www.paulgraham.com/articles.html

Why Pascal is Not My Favorite Programming Language, by Brian W. Kernighan
[http://cm.bell-labs.com/cm/cs/cstr/100.ps.gz]
[html mirror here: http://www.cs.virginia.edu/~evans/cs655-S00/readings/bwk-on-pascal.html]
[BWKOnPascal]

The Art of Unix Programming, by Eric Steven Raymond
[http://www.catb.org/~esr/writings/taoup/]
[TAOUP]

Išnašos
=======

[1] Išmokti programuoti šiaip jau nėra "paprastas" tikslas. Jeigu tai būtų paprasta, nereikėtų man laužyti pirštų rašant straipsnius, o pradedantiesiems nereikėtų varvinti akių juos skaitant. "Paprastas" šiame kontekste reiškia "paprastai apibrėžiamas".

[2] KISS principas: Keep It Simple, Stupid.

[3] Nesakau, kad šios kalbos blogos. Aš jų netgi nemoku. Bet taip pat aš nepažįstu nei vieno žmogaus, kuris bent vieną iš jų mokėtų, todėl jas čia ir išvardinau.

[4] Šiais laikais, žinoma, populiariau gąsdinti juodlige ar paukščių gripu, bet aš senamadiškas :-)

Thankses
========

For draft reviews:
Ignas Mikalajūnas,
Vaiva Šiaučiulytė,
Rūta Šiaučiulytė,
Ričardas Sabaliauskas, a.k.a. jago,
Aras Pranckevičius, a.k.a. NeARAZ,
Juozas Kontvainis, a.k.a. IBM,
Tomas Jakubauskas, a.k.a. Maverick,
Justas Dapkūnas, a.k.a. Chemiker,
Vilma Tarasevičiūtė

For proofreading:
Rūta Šiaučiulytė

That's it, folks. Thanks for your time with me!
Vytautas Šaltenis, a.k.a. rtfb
Vilnius, Feb/Apr 2006

Valid HTML 4.01 Strict