.st0{fill:#FFFFFF;}

IT õppimine – 5. semester 

 January 17, 2024

By  Marko Rillo

Lasin Dalle-l genereerida pildi: “Eesti keskealine mees koodi kirjutamas”. Pilt ees – järjekordne semester TalTech IT Kolledžis IT süsteemide arenduses möödas. Varasemad kokkuvõtted on siin: 1. semester2. semester3. semester, 4. semester ja akadeemilise puhkuse periood.

5. semestril võtsin õppeainetest:

  • Oracle: programmeerimiskeeled SQL ja PL/SQL (ICA0016) – Toomas Lepikult
  • Automaattestimine (ICD0004) – German Mumma
  • Programmeerimine C# keeles (ICD0008) – Andres Käver
  • Veebirakendused Java baasil (ICD0011) – Märt Kalmo
  • Diskreetne matemaatika (IAX0010) – Harry Lensen

Selle semestri saagiks tuli 18 EAP-d. Õppekavast 138 olemas, 42 tulemas. Õppekava link on siin ja moodulite kaupa õppekava täitmise pilt kohe all. Semester oli kõva koormusega ja töötamise kõrvalt süvenemiseks oleks võinud pigem vähem aineid võtta – nii C#, java veebirakendused kui ka diskreetne matemaatika olid ka eraldiseisvalt mahukad ained, mis nõudsid kõvasti panustamist. Keda huvitab selle teekonna jälgimine – detailid allpool.

Oracle: programmeerimiskeeled SQL ja PL/SQL (ICA0016)

Tegemist oli sel semestril mu lemmikainega. Kursuse vältel tuli läbi teha 15 praktilist ülesannet alates lihtsamatest SQL käsklustest kuni keerulisemateni. Kursusel teisel poolel keskendusime juba skriptimisele PL/SQL keele abiga.

See aine oli väga rakenduslik. Sisuliselt kõigil infosüsteemidega tegelejatel on tarvis oskusi andmebaasipäringute koostamise osas. Minu teadmised piirdusid seni baasteadmistega: CREATE DATABASE, INSERT INTO, SELECT FROM, WHERE, GROUP BY, JOIN, UPDATE, DELETE, DROP

Kui seni ehitasin oma infosüsteeme üles üsna rumalalt, et tegin lihtsalt ühe suure päringu andmebaasi, tõmbasin suure hulga infot oma süsteemi ja siis süsteemi sees tegelesin filtreerimise ja arvutamisega, siis see õppeaine andis kätte heas mõttes “kirurgi” tööriistad, kuidas juba SQL päringu sisusse väga nutikaid filtreid ja sõltuvusi luua, et hiljem andmeanalüüsis ressurssi kokku hoida.

Ühe huvitava tööriistana õppisime andmebaaside optimeerimist eri liiki vahetabelite abil. Käivitad päringu suure andmemassiivi peale, selle väljundi kirjutad sama andmebaasi vahetabelisse, mida saad omakorda töödelda uute päringute kosotamiseks.

Samuti avas minu jaoks täiesti uue maailma SELECT funktsiooni sisse alam-SELECT funktsioonide mestimine (nested query).

Lõpuks – PL/SQL rakendused on küll pigem gurmee-tööriistad, mida enamasti kasutatakse Statistikaametis või mõnes suures pangas. Samas – päris huvitav oli katsetada, et kuidas kirjutada selle abil valmis skripte, mis aitavad andmebaasidega tööd automatiseerida ühe täiendava vahekihina, mis asetseb back-end rakenduse ja lõpp-kasutajale suunatud ilusa frondi vahel. See oskus andis täiesti uue ja paindliku töövahendi, mida suurte andmemassiividega edaspidi hea kasutada.

SQL Developer

Oluline uus avastus tööriista osas samuti. Kui seni olin oma tööd andmebaasides teinud peaasjalikult DataGrip või DBeaveri abil, või lihtsamaid asju vastavalt Postico või phpMyAdmin abil, siis selles kursuses oli peamiseks töövahendiks Oracle’i SQL Developer. Kui ta alguses tundus pisut puine – just serveri ühenduste ja ligipääsude häälestamine võttis mõnevõrra aega, siis nii päringute kui ka skriptide jooksutamisel toimis ta sümpaatsemalt. Huvilistele panen alla juhendi, et kuidas üle tulemüüri seda häälestada. Kirjeldan antud juhul IT kolledži sätete abil:

Ava SQLDeveloper View menüü -> SSH -> SSH Hosts -> New SSH Host:
Name: vabalt valitud SSH host nimi
Host: enos.itcollege.ee
Port: 22
Username: ...
[x] Add a local port forward
Name: vabalt valitud
Host: doris.itcollege.ee
Port: 1521
Ava SQLDeveloper Connections -> New Connection -> New Database Connection:
Name: vabalt valitud ühenduse nimi
Username: ...
Password: ...
Connection type: SSH
Port forward: doris.itcollege.ee
Service name: testdataXDB.itcollege.intra
Ühenda käsklusega Connect.

Niisiis – seda kursust kindlasti soovitan!

Automaattestimine (ICD0004)

Teine lemmik oli automaattestimise aine, kus avanes esimest korda võimalus kogu stuudiumi vätlel Git-iga teha midagi enamat kui tavapärast põhilist käsku: Add-Commit-Push-Pull-Tag. Õppejõud German Mumma nügis meid oma koodist harusid looma, oma repot üles ehitama ja enne iga kodutöö lõppu esitama talle Merge Requesti, mille heakskiitmise või kommenteerimise või tagasi lükkamise kaudu õnnestus meil jäljendada tarkvaraarenduse tiimi tööd.

Olen ka varasemate aastate käigus kurtnud, et TalTechis it õppimise üks suuremaid puudujääke on tiimitöö vähesus. Individuaalselt igaüks oma nurgas oma koodi kallal nokitsemisel jääb oluline osa õppimisest toimumata. Nimelt omavahelised mõttevahetused – kes mingit probleemi sinuga võrreldes hoopis teistmoodi näeb või lahendab.

Automaattestimise lähenemine oli selles mõttes sümpaatne, et siin toimus seeläbi vähemalt aktiivne dialoog õppejõuga, kes tudengite suhtes võttis “vanemarendaja” rolli, kes mentorina nügis igaühte oma koodi või koodikirjutamise praktikat paremaks muutma.

Samuti olid vaikimisi avalikud kaastudengite tööd, mistõttu soovi korral said vaadata, et kuidas mõni kolleeg sama probleemi oli lahendanud. Mõni teine õppejõud tõstaks selle peale lamenti ja väidaks, et kuidas nii saab – see tähendab, et siin õppeaines on lubatud “spikerdada”? Ma ise vaidlen vastu. Tihti ei suuda õppejõud mõista, et milliseid teadmisi õpilasel on vajaka. Oluline osa õppimisest toimub tasemega inimestel omavahel, kelle “lähima arengu tsoon” on suhteliselt lähemal üksteisele kui õppejõule (vt Lev Võgotski zone of proximal development).

Õppeaine ise oli nõuete mõttes pigem lihtne – tuli koostada kokku neli hindelist tööd.

  1. Testimisnõuete kirjeldamine. Esimene oli Gherkini süntaksi abil nõuete kirjeldamiseks. Ülesanne oli lihtsalt kirjutada järjest Scenario outline, Given …, When …, Then … mudeli põhjal nii väga konkreetseid testimis-ülesandeid kui ka abstraktseid või automaatseid nõuete kirjeldusi.
  2. Lihtne automaattestimine. Teine oli sama süntaksi põhjal testimisjuhtumi ja testide kirjeldamine testimis-keskse arendusprotsessi läbi viimiseks. Selleks võtsime kõige lihtsamad tööriistad – Jupiter ja Assertj ning omandasime Arrange-Act-Assert mustri sammud sellisel moel, et nad meile automaatseks muutuksid.
  3. Api testimine. Kolmas oli API testimise ülesanne, kus kõigepealt tuli lihtsaid API suitsuteste (Smoke Test) meisterdada ilma ühegi välise raamistiku abita. Seejärel tuli võtta appi mõned lihtsad abiraamistikud – nt Lombok klasside automatiseerimiseks, Java Faker andmete genereerimiseks ning Jackson Databind klasside ja JSON päringute lihtsustamiseks ning kõige lõpuks katsetada API pöördumisi võimalikult automatiseeritud kujul.
  4. UI testimine. Kursuse viimaseks ülesandeks oli võtta ette Codeborne’i arendaja Andrei Soltnsevi poolt valmistatud Selenide teek ja selle abil testida ühe valitud veebipoe kasutajaliidest – sisse logimist õige ja vale kasutajanimega, kaupade sirvimist ja lisamist ostukorvi, ostukäru muudatuste tegemist, kliendi detailide lisamist ja ostu lõpuleviimist. Ka selle ülesande lahendamisel – alustasime lihtsamatest testidest ja lõpuks jõudsime selleni, et kogu kliendi kasutajakogemus veebirakenduses algusest kuni lõpuni automaattestidega ära katta.

Kokkuvõtteks – seda ainet kindlasti soovitan.

Programmeerimine C# keeles (ICD0008)

Kolmandal semestril ma juba kirjutasin sellest ainest, mistõttu tookord öeldut ei korda. Kui aasta tagasi jäi õppeaine seoses selle liigse koormusega tegemata, siis nüüd jõudsin ühele poole.

Andres Käver annab oma kursustel tudengitele vabad käed. Ta ütleb ette, et mida teha. See kuidas ja mil viisil keegi tulemuseni jõuab on igaühe enda otsustada. Teisisõnu – ta aitab kujundada osalejate õppimisvõimet. Mõne jaoks on see ilmselt keerulisem, kui keegi neil tähtaegade piitsaga järel ei käi. Teise jaoks taas palju lihtsam – lubab omaenda tempos asjadega toime tulla. Käver armastab esimest C# kogemust jätkuvalt anda erinevate mängude koostamise käigus. Erinevatel aastatel on ülesandeks olnud “4 ritta”, “laevade pommitamise” või “kabe” meisterdamine.

Sel aastal oli ülesandeks teostada nii konsoolirakendusena kui ka veebirakendusena kaardimäng “Uno”. Seejuures tuli võimaldada mängu salvestamist ja laadimist nii andmebaasi kui ka faili. Konsoolimängu meisterdamine oli justkui ekskursioon 80ndatesse aastatesse – kuidas luua kasutajaliides, mis mahuks 80×25 ekraanireale ja oleks seejuure ka mõistetav. Kaader minu katsetusest siin.

Kuna valmis tuli mõelda kogu süsteem ja mängu sisemine loogika – sh valmis kirjutada ka arvuti-poolsete käikude algoritmid, siis oli see töö päris töö- ja ajamahukas, kus tuli sisuliselt mitmel korral otsast alustada. Näiteks selgus, et nii faili kui andmebaasi salvestamisel tuleks andmemudelid teistsuguseks kujundada. Seejärel – peale konsoolirakenduse kasutajaliidese valmimist selgus, et veebirakenduses ei õnnestu sama loogikaga visuaali Razor Pages abiga rakendada, mistõttu tuli ka konsoolirakenduse visuaal ja mängu käikude järgnevuste loogika mõnevõrra ümber kujundada. Kui kodune töö tehtud, siis tuli see kaitsta. Pidid näitama, et oma koodist aru saad ja oskad seal erinevaid muudatusi teha.

Eksamina oli kõigepealt lühike test C# teemal – 40 valikvastustega küsimust. Seejärel anti terve tööpäev – 8 tundi, et teostada algusest lõpuni lihtne 2-3 olemiga C# Razor veebirakendus – nt kokaraamat (retseptid ja koostisosad), raamatukogu (raamatud ja autorid), rallisõit (sõitjad ja tulemused), tööde haldus (töötajad, ülesanded), õppeinfosüsteem (ained, õppejõud), pizzeria (pizzad, kliendid), quiz (küsimused, vastused).

Iga veebirakenduse puhul oli eksami baasnõudeks, et on olemas enda valitud andmebaas, klientrakenduses võimalik uute elementide süsteemi lisamine, nende loetlemine, muutmine ja kustutamine. Ühtlasi pidi olema kogu andmebaasi kirjutatu sõna või selle osa põhjal otsitav. Kui tahtsid lisapunkte saada, siis filtreeritav mingite ette antud väärtuste põhjal. Eksamit võis soovi korral teha kas üksi või siis grupis. Mitmekesi koostamise korral pidid lihtsalt mõlemad oskama oma koostatud koodi kirjeldada ja seal muudatusi teha. Minu eksamitööks sattus retseptide ja koostisosade töö Razori abil. Lahendasin selle lihtsalt kolme olemi abil:

public class Recipe : BaseEntity
{
[MaxLength(127)]
public string Name { get; set; } = default!;
[MaxLength(127)]
public string Category { get; set; } = default!;
public int TimeNeeded { get; set; }
public int Servings { get; set; }
public ICollection<RecipeIngredient>? RecipeIngredients { get; set; }
}
public class Ingredient : BaseEntity
{
[MaxLength(127)]
public string Name { get; set; } = default!;
[MaxLength(127)]
public string Category { get; set; } = default!;
[MaxLength(127)]
public string Location { get; set; } = default!;
public double Amount { get; set; }
}
public class RecipeIngredient
{
[Key]
public Guid RecipeIngredientId { get; set; }
public Guid RecipeId { get; set; }
public Recipe? Recipe { get; set; }
public Guid IngredientId { get; set; }
public Ingredient? Ingredient { get; set; }
public double AmountNeeded { get; set; }
}

Ja lisasin kõikidele olemitele CRUD (Create, Read, Update, Delete, Index) ekraanivaated ning avaleheküljele veel filtreerimise ja otsimise võimekuse. Erilist visuaali polnud aega luua – avaekraan all …

Kuigi vaid C# sissejuhatus – oli see aine mahukas. C# ja .NET raamistiku õppimisega saab jätkata kevadsemestril õppeainega ICD0024 – Veebirakendused C# baasil, kus süveneda C# Razor veebirakenduste asemel juba ASP.NET core’i abil tööstusliku taseme .NET veebirakendust loomisele. Kolmandaks tasemeks on omakorda sinna lisada ICD0025 hajussüsteemide õppeaine, kus õppida mikroteenuseid, pilverakendusi ja konteinereid.

Veebirakendused Java baasil (ICD0011)

Selle kursuse nimetus on ebatäpne. Kursuse tulemusena ei sünni kasutatavat terviklikku veebirakendust nagu Kalmo varasemas ICD0007 PHP veebirakenduste kursusel, millest 1. kursuse lõpus kirjutasin. “Veebirakendus” siin kursusel on tagarakenduse API. Klientrakendusega sidumisest oli juttu vaid paaris loengus ja lühidalt ühes videoseminaris.

Tegemist oli samuti mahuka kursusega. Alguses võtsime Gradle ja Maven abil teemaks Java rakenduste loomise, ehitamise ja testimise oma kohalikus masinas või serveris. Siis – mil viisil JSONit töödelda käsitsi, ja kuidas appi võtta ObjectMapper. Järgmiseks: kuidas toimivad servletid ja kuidas servlette connection pool’i kimpu panna. Seejärel – mil moel luua JDBC abil seos erinevat tüüpi andmebaasidega (nt. PostgreSQL, HSQL) ning kuidas vähese vaevaga andmebaasiühendusi välja vahetada. Järgmiseks tuli fookusesse Spring Core’i raamistik. Seejärel automatiseerisime üha edasi: mis on Spring MVC ja kuidas JSR303 standardi abil hallata Java metadatat, filtreid ja luua olemitele piiranguid. Siis lisasime Spring Boot’i ja Spring Security rakenduse turvalisuse ja veakindluse suurendamiseks. Päris kursuse lõpuks jõudsime põgusalt vaadata ka Kotlini programmeerimiskeelt ja saime teada, et IntelliJ IDEA funktsionaalsus peidab funktsiooni, mille abil Java ja Kotlini vahel konvertida.

Kursuse tarvis oli Kalmol koostatud rida harjutustundide videosid, kus ta erinevaid kontseptsioone samm-sammult läbi selgitas . Nendes tehtud näidete alusel tuli koostada 8+2+5 töömahukat kodutööd, mis pidid läbima automaattestid. 3 kodutöö puhul oli võimalus kommenteerida kaastudengite koodi ja saada enda koodile kommentaare. Kes teema vastu huvi tunneb, siis YouTube’is on Märt Kalmo salvestanud paari aasta eest java veebirakenduste kohta mõned harjutustundide näidisvideod.

Päris lõpus tuli eksam, kus vastata lühikestele teooriaküsimustele ja teha kaks ülesannet, millest üks käsitles sisendi töötlemist ObjectMapperi abil ja teise ülesande puhul tuli Spring Security raamistiku abil lisada veebirakendusele juurdepääsufiltrid. Õppejõud lülitab kooli arvutites eksami ajaks interneti kinni. Niisiis tuleb ülesannete lahendamiseks koodi kirjutada peast. Ainsa abimaterjalina said kasutada kursuse jooksul ise koostatud kodutöid. Ehk aine läbimise eelduseks on Java süntaksi nii hea tundmine, et olla suuteline koodi kirjutama sisuliselt “valge paberilehe ja pliiatsi abil” või siis olid kodutööde koostamisel erinevad alternatiivid nii hästi läbi mõelnud, et suutsid oma esialgset koodi asetada sarnasesse konteksti. See tulemus jäi sedapuhku saamata.

Diskreetne matemaatika (IAX0010)

Jätsin magustoidu stuudiumi lõpupoole. 🙂 Diskmat on õppekavas muidu esimese kursuse esimese semestri aine, et anda sissejuhatus arvutimaailma formaalsesse loogikasse.

Õppeaine on iseenesest lihtne – aluseks on õpik, toimuvad mõned harjutustunnid, kus õppejõud selgitab olulisemaid kontseptsioone. Moodle’is tuleb läbida kümmekond automaatset testi – teemaks lausearvutus, loogikaalgebra, loogikafunktsioonid, hulgad, vastavused ja loogikaelemendid digitaalskeemides. Tuleb kirjutada üks individuaalne kodutöö, kus näitad, et oskad koostada tõeväärtustabeleid, joonistada Karnaugh’ kaarti, arvutada DNK-d ja KNK-d, teha erinevate loogikatehete vahelisi teisendusi. Kõik õppeainega seotud materjalid on tasuta ja avalikult kättesaadavad õppejõu DiskMat-pealkirjaga koduleheküljel.

Õppeaine lõpetab umbes tunniajaline Moodle’is läbi viidav valikvastustega eksam, kus oma teadmisi demonstreerida. Eksamiks ettevalmistamisel on mõistlik peamine fookus panna erinevate loogikafunktsioonide läbi arvutamisele – enamik küsimusi keskendub nt Reed-Muller polünoomi lahendamisele, funktsioonide teisendamisele, asendusseoste abil lahenduste leidmisele, graafide lahendamisele, Venni diagrammi abil funktsioonide kirjeldamisele ja erinevate digitaalskeemide komponentide tõlkimisele loogikaavaldisteks. Ühtlasi oli päris mitu teisendusülesannet 2ndsüsteemi, 8ndsüsteemi ja 16ndsüsteemi vahel.

Diskreetse matemaatika aitabki formaalset loogikat abstrahheerida. Teine oluline aspekt on veel – kui süveneda riistvarasse, siis arvutustehnikas on hiljem loogikaskeemide joonistamise juures loogikaalgebra elemente tarvis. Teisest küljest – mina tegin näiteks õppeaine “arvutid” ära enne diskmatti – selgus, et tõeväärtustabelite või loogikafunktsioonide koostamine on piisavalt intuitiivne, et saab ka ilma ettevalmistuseta hakkama.

Mõttemustrite tekitamiseks ja süsteemse mõtlemise harjutamiseks oli see kursus igal juhul vahva kogemus. Tore oli ka aru saada, et kuidas keerulisemaid loogikafunktsioone saab lihtsustada – ehk kuidas kümmekond eriliigilist tõeväärtust mõnes algoritmilises infosüsteemis on võimalik matemaatiliselt optimeerida. Jällegi – mul oli varasemalt juba läbitud õppeaine “algoritmid ja andmestruktuurid“, kus näiteks graafide teemas viidati diskreetse matemaatika alustele. Taas oli tegemist pigem üsna intuitiivsete kontseptsioonidega, et tuli toime ka põhialusteta.

Niisiis – komplekssemate infosüsteemide ehitamisel on diskreetse matemaatika põhialuseid hea meelde tuletada. Aine on küll töömahukas, aga lihtsalt haaratav ja loogiline.

Autorist ...

Marko Rillo on juhtimiskonsultant, koolitaja ja executive coach. Temaga saab ühendust siit

Blogipostitused:

Leave a Reply:

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

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}