Prisiminimai apie Jaunųjų programuotojų mokyklą

Dr. Gintautas Grigas – Vilniaus universiteto Matematikos ir informatikos instituto afilijuotasis vyresnysis mokslo darbuotojas. Informatikų bendruomenėje žinomas kaip pirmojo lietuviško kompiuterio „Rūta“ projekto vadovas, vienas iš Jaunųjų programuotojų mokyklos įkūrėjų, daugelio programavimo knygų autorius, Lietuvos kompiuterininkų sąjungos tarybos narys. 2013 m. Gintautui Grigui įteikta Kalbos premija už visavertį taisyklingos lietuvių kalbos taikymą visose kompiuterinėse priemonėse ir plačiausiai naudojamų kompiuterinių programų lietuvinimą.

Prieš 30 metų – 1986-aisiais – visose Lietuvos mokyklose buvo pradėta mokyti informatikos. Mums tai buvo ne naujiena – jau penkerius metus veikė nuotolinė Jaunųjų programuotojų mokykla (JPM), kurioje praktinių programavimo žinių galėjo (bet neprivalėjo) įgyti kiekvienas Lietuvos mokinys. Mokslas truko dvejus metus. Pirmąjį pusmetį programavimo pamokos buvo skelbiamos dienraštyje „Komjaunimo tiesa“, vėliau – išsiunčiamos paprastu paštu. Tada dar nebuvo nei elektroninio pašto, nei interneto. Tačiau entuziazmo netrūko. Pirmaisiais metais turėjome 1067 klausytojus. Mokėsi ne vien mokiniai. Buvo ir studentų, ir baigusiųjų mokslus, ypač mokytojų.

Jaunųjų programuotojų mokykla atsirado ne iš karto. Apie ją Matematikos ir informatikos institute (tada vadintame Matematikos ir kibernetikos institutu) buvo pradėta mąstyti apie 1977 metus. Idėja kilo prof. Laimučiui Telksniui. Jis, grįžęs iš susitikimo su profesinės mokyklos mokiniais, pasakojo, kad ten matęs daug šaunių vyrų, kurie, užuot šnapsą gėrę, galėtų laiką skirti rimtesniems dalykams, pavyzdžiui, spręsti kibernetikos uždavinius. Ir tokius, kuriems prireiktų kompiuterio. Na, o jeigu reikia kompiuterio, tai reikia mokėti programuoti. Tais laikais nebuvo tokios programų įvairovės, kokią turime dabar. Jei nori pasinaudoti kompiuteriu, uždavinį turi suprogramuoti pats.

Tada populiarumo viršūnę buvo pasiekusi programavimo kalba PL/1. Jos transliatorius turėjo komunistinių šalių bloke sparčiai plintančios ES tipo skaičiavimo mašinos. Daugeliui nekilo abejonių dėl jos pasirinkimo. Ji ir man nebuvo svetima – buvau ką tik parašęs knygą apie ją, dėsčiau studentams. Pradėjau rašyti programavimo pamokas su ja. Parašau vieną, antrą, trečią… Kai vėliau kas nors paklausdavo, kurią tuo metu rašau, tekdavo grįžti atgal ir vėl minėti antrą arba net pirmą. Mat susidurdavau su nesklandžiomis kalbos konstrukcijomis ir bandydavau tų konstrukcijų išvengti arba bent užglaistyti jų nesklandumus. Bet vis tiek kas nors užkliūdavo. Gal grįžti prie Algolo? Bet jo populiarumas po truputį menko, nes mažesniems kompiuteriams buvo per sunkus.

Atkreipiau dėmesį į Paskalio kalbą. Tada ši kalba Lietuvoje dar nebuvo žinoma, nebuvo ir transliatoriaus, kuris veiktų su mūsų turimais kompiuteriais, tada vadintais elektroninėmis skaičiavimo mašinomis. Kalbą panagrinėjau ir pamačiau, kad ji paprasta, gerai atspindinti programavimo sąvokas. Kaip tik tokia, kokios mums reikia. Beje, ji ir buvo kuriama tokia, kad tiktų mokymui ir veiksmingumu (sparta bei atminties ekonomija) nenusileistų paprastumu pasižyminčiam Fortranui. Bet neturėjome transliatoriaus. Na, jei nėra, tai galima padaryti.

Transliatorius – viena sudėtingiausių programų. Juos kurdavo patyrusių programuotojų komandos. Pasitarę su Vladu Tumasoniu, nusprendėme imtis šio darbo. Abu dėstėme būsimiems programuotojams – Vilniaus universiteto studentams, vadovavome jų diplominiams darbams. Taigi galime turėti gerų pagalbininkų ir tiems pagalbininkams padėti pasiekti profesinių aukštumų.

Nusprendėme daryti interpretuojantį transliatorių. Jį sudarytų dvi dalys: 1) vadinama tiesiog transliatoriumi, kuri verčia Paskalio kalba parašytą programą į tarpinę kalbą ir 2) interpretatorius, kuris vykdo tarpinės kalbos komandas. Interpretuojama programa veikia kelis, o gal ir keliolika kartų lėčiau, negu ji būtų sukompiliuota į kompiuterio komandas. Taigi interpretatorių reikia daryti kuo spartesnį. Didžiausią spartumą galima pasiekti, kai programuojama asemblerio kalba. Todėl sutarėme interpretatorių rašyti asemblerio kalba, o transliatorių galima rašyti ir PL/1 kalba. Vladas buvo asemblerio žinovas, parašęs knygą apie jį ir dėstantis šį kursą. Todėl jis ėmėsi interpretatoriaus, o aš – transliatoriaus. Vladas temą (interpretatorių asemblerio kalba) davė diplomantui Remigijui Petrauskui, o aš transliatorių perskyriau į dvi dalis: sintaksės ir semantikos blokus. Sintaksę atidaviau Valentinai Dagienei, kuri tada buvo Piekaitė, o semantiką – Almai Baliūnaitei, kuri vėliau susituokė su Remigijumi ir tapo Petrauskiene – bendras darbas nenuėjo veltui…

Buvo įvairūs ES skaičiavimo mašinų modeliai, besiskiriantys operatyviosios atminties dydžiu. Orientavomės į mažiausią ES1020, nes jį jau buvo įsigijusios ir mažesnės įmonės. Didesniuose modeliuose buvo operacinė sistema OS, mažesniuose – DOS (bet ne ta, kuri buvo vėliau atsiradusiuose asmeniniuose kompiuteriuose). Orientuojamės į sistemą DOS. Joje esantis PL/1 kalbos poaibis ir tansliatorius neturi rekursijos. O mums jos labai reikia. Ką daryti? Nusprendžiame rekursiją pasidaryti patys – ją modeliuoti. Alma parašė modeliavimo procedūrą. Nelabai patogu, nes vietoj tiesioginio rekursinio kreipimosi į funkciją arba procedūrą x reikia kreiptis į modeliavimo procedūrą su papildomu parametru – tikrosios funkcijos ar procedūros vardu x. Bet visgi išeitis.

Bandant Almos parengtą procedūrą, kilo mintis pažiūrėti, ką gi transliatorius darys, kai rekursyviai kreipsiuosi tiesiogiai, ne per Almos procedūrą. Pabandau rekursiškai apskaičiuoti faktorialą. Mano nuostabai – veikia. Pabandau sudėtingesnį uždavinį – Hanojaus bokštus. Irgi veikia. Gyvenimas palengvėjo! Tai buvo 1979 m. sausio 12 d. Tą datą gerai įsiminiau, nes tai buvo mano gimimo diena, o kolegos pokštavo, kad PL/1 transliatorius ta proga man padovanojo rekursiją. Vėliau išsiaiškinome, kad rekursija sistemos DOS transliatoriuje iš tiesų yra, tik ji neveikia tuo atveju, kai programa išskaidyta į kelias dalis, laikomas išorinėje atmintyje, o kreipinys ir funkcija (procedūra), į kurią kreipiamasi, yra skirtingose dalyse. Mūsų transliatoriaus sintaksės blokas, kuriame naudojama rekursija, nėra toks didelis, kad reikėtų jį skaldyti į kelis, todėl šis ribojimas netrukdė naudoti rekursiją. Kategoriškas teiginys, kad nėra rekursijos, galbūt atsirado dėl to, kad transliatoriaus dokumentacijos rengėjai ne viską suprato ir apsidrausdami parašė trumpai – rekursijos nėra.

Mūsų studentai, atlikdami diplominius darbus, iš tiesų išmoko daryti tik atskirus transliatoriaus blokus, tarpusavy jų nederindami. To pakako, kad jų darbai būtų labai gerai įvertinti. Tikrasis darbas prasidėjo 1978 m. rudenį, kai Alma ir Valentina pradėjo dirbti Matematikos ir kibernetikos institute. Problemų kilo dėl interpretatoriaus. Jį daręs Remigijus buvo paskirtas į Vilniaus universitetą. Ten gavo kitokias užduotis ir mums talkininkauti galėjo tik laisvalaikiu. Laikas nelaukia. Nusprendėme laikinai interpretatorių suprogramuoti PL/1 kalba. Tai galima padaryti kelis kartus greičiau, negu programuojant asembleriu, bet ir veiks kelis kartus lėčiau. Pagalvojome, kad bandymams bus gerai, o vėliau galėsime suprogramuoti asembleriu. Taip ir padarėme. Bet keisti nereikėjo. Baigus darbus pasirodė, kad mūsų transliatorius mokinių programas apdoroja, t. y. transliuoja ir įvykdo keletą kartų sparčiau, negu tame pačiame kompiuteryje veikiantis PL/1 transliatorius.

Transliatorius turėjo išskirtinių savybių, padedančių mokiniui geriau suvokti programos vykdymo eigą.

  • Savitosios lietuvių kalbos abėcėlės raidės gaunamos į tą pačią vietą spausdinant raidę be diakritinio ženklo ir ženklą, panašų į diakritinį (apostrofą arba kablelį).
  • Vienoje užduotyje kompiuteriui gali būti pateiktas neribotas programų skaičius.
  • Spausdinamos antraštėlės, kad mokinys, pirmą kartą pamatęs programos spaudinį, žinotų, kur kas išspausdinta.
  • Spausdinami ne tik galutiniai duomenys (rezultatai), bet ir pradiniai, kad mokinys, ieškodamas klaidų, matytų, iš kokių pradinių duomenų gauti rezultatai.
  • Transliatorius praneša apie aptiktą klaidą, ją ištaiso ir ieško naujų klaidų.
  • Po pirmos aptiktos klaidos spausdinamos tuo metu buvusios kintamųjų reikšmės; tai gali padėti rasti klaidos priežastį.
  • Transliatorius informuoja, kad klaida galėjo būti ištaisyta neteisingai ir dėl to galėjo atsirasti antrinių klaidų.
  • Randamos neapibrėžtos kintamųjų reikšmės (šios klaidos neranda dauguma šiuolaikinių pramoninių transliatorių).

Mūsų transliatoriumi susidomėjo Kazachstano pedagoginis universitetas ir paprašė jo generuojamus pranešimus išversti į rusų kalbą. Tą mes ir padarėme. Tai buvo mūsų lietuviškos programos lokalizacija į kitą kalbą.

Pradėti mokyti programavimo visos Lietuvos mastu ne taip paprasta. Todėl pradžioje nutarėme parengtą medžiagą išbandyti dešimtyje mokyklų. Jas parinkome iš įvairių rajonų. Užduotis išsiuntinėjome paprastu paštu, nes elektroninio dar nebuvo. Į mūsų kvietimą atsiliepė 9 mokyklos.

Atsižvelgdami į tai, kaip mokiniams sekėsi sudaryti programas, pradėjome rengti programavimo pamokas. 1981 m. laikraštyje skelbiamas pamokas rengiau aš, pasitardamas su kolegomis. Pamokų buvo dvylika. Pagrindinę jų dalį sudarė uždavinių ir jų programų pavyzdžiai. Programavimo kalbos atskirai nemokėme. Kai prireikia kokios nors naujos programavimo kalbos konstrukcijos, tada ją ir paaiškiname.

Laikraštis kas savaitę spausdino pamokas. Maždaug kas tris savaites pateikdavome kontrolines užduotis. Sprendimus mokiniai turėdavo atsiųsti paštu. Su laikraščio redakcija sutarėme, kad prie užduočių pateiktų mūsų instituto adresą – būtų operatyviau ir nereikėtų mums vaikščioti į redakciją jų pasiimti. Užduotis paskirstydavome į pamokas taip, kad mokinys, prieš išsiųsdamas naują užduotį, jau būtų gavęs ankstesnės užduoties sprendimą ir taip galėtų pasimokyti iš savo klaidų. Mums reikėjo sparčiai suktis – juk klausytojų buvo per tūkstantį. Mūsų laimei, nesklandumų nekildavo. Mat tūkstantį prognozavome ir tokiam skaičiui buvome pasirengę – iš jaunų mokslininkų sudarę tikrintojų komandą. Atsakymus mokiniams siųsdavome įdėtus į firminį instituto voką arba su instituto spaudu. Tai buvo solidžiau, palyginti su kitų panašių mokyklų reikalavimu, kad mokinys kartu su sprendimu atsiųstų ir sau adresuotą voką su priklijuotu pašto ženklu.

Kai informavome redakciją, kad jau gavome du šimtus laiškų, jos darbuotojai buvo maloniai nustebinti. Sakė, galvojome, kad parašys keletas, daugiausia dešimt, ir tuo viskas pasibaigs. Dar labiau nustebo, kai po kelių dienų gautų laiškų skaičius peržengė septynis šimtus – tiek buvo pirmosios užduoties sprendėjų. Vėliau prisijungė naujų – ir šis skaičius peršoko tūkstantį. Taip durys į laikraštį mums ilgam atsivėrė ir tuo dar du kartus pasinaudojome.

1983 ir 1985 m. pamokų skyrelį tvarkė Valentina Dagienė, pasinaudodama ankstesnių metų pamokomis, kai ką pakoreguodama, papildydama. 1986 m., jau prasidėjus visuotiniam informatikos mokymui, ji pamokas sudėjo į atskirą knygutę [1].

Mokymasis iš laikraštinių pamokų užtruko pusmetį. Jų klausytojai išmoko sudaryti nesudėtingas programas, kuriose operuojama sveikaisiais skaičiais, naudojami priskyrimo, sąlyginis ir ciklo sakiniai. Dar pusantrų metų mokymas tęsėsi susirašinėjant paprastu paštu. Buvo nagrinėjamos sudėtingesnės temos, susijusios su įvairiais duomenų tipais, funkcijomis, procedūromis. Joms reikia daugiau mokomosios medžiagos, programų pavyzdžiai tapo ilgesni. Ta medžiaga kaupėsi. Jos pagrindu buvo rengiamos knygelės. Per penkerius metus išleidome šešias mokiniams skirtas knygeles [2–7]. Jos buvo siunčiamos JPM mokiniams. Vėliau, prasidėjus visuotiniam informatikos mokymui, ši medžiaga buvo naudinga rengiant informatikos mokymo ir metodinę literatūrą.

Mūsų patirtimi pasinaudojo ir kiti. Maskvos leidykla „Prosveščenije“ į rusų kalbą išvertė „Programavimo pradmenis“ [4] ir 1987 m. išleido 257 000 egz. tiražu.

Norisi paminėti keletą būdingų Jaunųjų programuotojų mokyklos bruožų.

  • Mokymą pradėjome nuo veiksmų su sveikaisiais skaičiais. Per pirmąjį pusmetį naudojome tik šį vieną duomenų tipą.
  • Daugiausia dėmesio skyrėme kuo įvairesnių ir įdomesnių uždavinių sprendimui.
  • Mokėme programavimo, o ne programavimo kalbų. Visą laiką naudojome tik vieną kalbą ir tik tas jos konstrukcijas, kurios būtinos pateikiamiems uždaviniams spręsti.
  • Programavimo rezultatu laikėme programos tekstą, o ne kompiuterio apskaičiuotus rezultatus.
  • Vertinome programos tekstą. Jis turėjo būti struktūrizuotas, aiškus, lengvai suprantamas. Neaiškias vietas reikėjo komentuoti.
  • Mokėme programavimo kultūros.
  • Mokėme programas ne tik rašyti, bet ir skaityti.

Gerai besimokančius mokinius kviesdavome į vasaros stovyklas. Čia jie toliau gilindavo programavimo žinias, turėdavo progos praktiškai pasinaudoti kompiuteriu, o svarbiausia – susipažinti su bendraminčiais. Užsimezgusi draugystė išlikdavo ilgam, kartais visam gyvenimui – kai kas stovykloje susipažino su būsimu vyru ar būsima žmona.

Vasaros stovykloms vadovavo Viktoras Dagys. Būdamas kraštotyrininkas, mokiniams papasakodavo ir parodydavo daug įdomių dalykų, suorganizuodavo žygių į gamtą.

Mokyklose atsiradus informatikos kursui, nebebuvo aktualu JPM pamokas skelbti laikraštyje. Todėl perėjome vien prie susirašinėjimo. Mokymas pakilo į aukštesnį lygį, nes pradines žinias mokiniai jau gaudavo mokykloje. Užtat JPM tapo patraukli informatikos olimpiadininkams.

Literatūra

  1. V. Dagienė. Programavimo pamokos ir uždaviniai. Matematikos ir kibernetikos institutas, 1986, 64 p.
  2. A. Petrauskienė, V. Dagienė, G. Grigas. Programavimo kalba PASCAL. Matematikos ir kibernetikos institutas, 1980, 125 p.
  3. G. Grigas. Funkcijos ir procedūros. Matematikos ir kibernetikos institutas, 1981, 48 p.
  4. G. Grigas. Programavimo pradmenys. Mokslas, 1982, 116 p.
  5. K. Augutis, V. Dagienė, G. Grigas. Duomenų tipų uždavinynas. Matematikos ir kibernetikos institutas, 1983, 84 p.
  6. V. Dagienė, A. Petrauskienė, G. Grigas. Paskalio programavimo kalba. Mokslas, 1983, 112 p.
  7. V. Dagienė, G. Grigas. Programavimo pradmenų uždavinynas. Matematikos ir kibernetikos institutas, 1983, 43 p.