C-ohjelmointi : Kurssipalautteesta

C-kurssin tulokset olivat yllättävän hyviä. En odottanut, että monikaan saisi salauksen toimimaan, mutta lähes kaikki, jotka jatkoivat loppuun asti, onnistuivat siinä. Osoittautui myös, että pakolliset tehtävät ratkaisseet ratkaisivat myös kaikki muutkin tehtävät saaden kurssista täydet pisteet.   Kuitenkin muutamia negatiivisia piirteitä oli havaittavissa.

Ensinnäkin osalla opiskelijoista ohjelmointi- ja tietorakennetaidot olivat todella vähäisiä. Virheiden etsiminen ja korjaaminen näytti olevan yllättävän hankalaa, ei osattu paikallistaa virheitä. Kurssilla toteutettiin yksinkertaisimpia tietorakenteita, listoja. Olisi odottanut, että Tietorakenne-kurssin jälkeen näiden ohjelmointi sujuisi helposti, mutta näin ei ollut tilanne kaikkien kohdalla. Oli myös paljon erittäin kömpelöitä ja tehottomia ratkaisuja.

Kryptografia on hyvin oleellisessa asemassa esimerkiksi uusien internet-protokollien sunnittelussa. Siten on varsin luonnollista, että C-kurssilla ohjelmoidaan näitä asioita varsinkin kun C on pakollinen hajautettujen järjelmien linjalla.  Nykyinen kryptografia käyttää voimakkaita matemaattisia menetelmiä. Tehtävissä yritettiin yhdistää kaksi asiaa, tietorakenteiden ohjelmointi ja salaus. Tässä ei täysin onnistuttu. Salauksessa tarvittavat polynomioperaatiot olisi voinut toteuttaa myös puhtaasti bittioperaatioina. Tällöin tosin ymmärrys operaatioiden luonteesta olisi jäänyt varsin vähäiseksi. Nyt salauksessa käytettiin polynomeja symbolisessa muodossa listana, mikä ratkaisu ei tietenkään tule kysymykseen salauksen käytännön toteutuksessa. Toisaalta nyt oli mahdollista toteuttaa myös muita polynomialgoritmeja.

Polynomialgoritmit perustuivat koulumatematiikkaan. Matemaattisten taitojen rappio näkyi selvästi, koska monet eivät muistaneet tai osanneet enää polynomioperaatiota. Aika uskomatonta matemaattisessa tiedekunnassa! Algoritmeina nuo operaatiot ovat melko triviaaleja. Ainoa vaikeampi asia oli polynomien jakolasku moduloaritmetiikassa, joka olisi vaatinut hieman syventymistä asiaan. Tällainen syventyminen ja asioiden pohtiminen ei näytä soveltuvan kaikille, mikä ei kuitenkaan tarkoita, etteikö opetuksessa voisi yrittää saada opiskelijoita ajattelemaan. Kohtalaisen monet selvisivät kuitenkin tehtävästä ainakin tyydyttävästi.   

Kritiikkiä sai myös tehtävien ketjuttaminen. Minusta on parempi, että tekijä korjaa tehtäviään kuin että saisi malliratkaisut, joita käyttää sitten taas seuraavien epätäydellisten ratkaisujen tekemiseen.  Pajatehtävät korvaavat entisen harjoitustyön, mitä jotkut eivät ehkä sisäistäneet. Aikaisemmat harjoitustyöt vaikuttivat lisäksi turhan helpoilta ottaen huomioon, että esitietoina vaaditaan Java-ohjelmointitaito ja Tietorakenteet.  Ylipäätään minusta on melko turhaa opiskella uusia kieliä, jos ei osaa ensimmäistäkään kunnolla tai jos ei osaa algoritmista ajattelua.  Lisäksi uusien kielten yhteydessä  on hyödyllistä tuoda mukaan jokin relevantti sovellusalue.

C-kurssia kehitetään jatkuvasti. Tämä oli toinen kerta pajassa ja ensimmäinen kerta, jolloin harjoitustyö yhdistettiin pajatyöskentelyyn. Siten on luonnollista, että tehtävien muotoilussa ja käytännön järjestelyissä oli joitakin puutteita. Toivottavasti ensi syksynä on käytössä palautusautomaatti niin kuin on Java-kurssilla. Tällöin myös malliratkaisut ovat saatavissa, mikä ei välttämättä ole pelkästään hyvä asia (vrt. edellinen kappale). Nyt ei osattu alussa varautua suureen opiskelijamäärään, vaan assistentteja on alussa liian vähän. Puolessa välissä saatiin kaksi assistenttia lisää. Toisaalta muutamat opiskelijat tarvitsivat puuttuvien pohjatietojen johdosta erittäin paljon ohjausaikaa, mikä aika oli poissa vähäisempien virheiden kanssa painiskelevilta. Toivottavasti palautusautomaatti sujuvoittaa ainakin parhaimpien ohjelmoijien ajankäyttöä.

Sisällön kehittämisessä tulee jatkossa ottaa huomioon testaus paremmin. Erityisesti alussa tulee perehtyä testausmahdollisuuksiin ja -ympäristöihin.  Kritiikkiä sai myös se, ettei muistinhallintaan, erityisesti muistin vapauttamiseen, kiinnitetty riittävästi huomiota tehtävissä. Muistin vapauttaminen ei ole erityisen vaikeaa, ja se jätettiin tehtävistä osittain sen takia ja osittain siksi, ettei tehtävien koodimäärää kasva. Sen sijaan muistinhallinta esimerkiksi valgrind-työkalulla olisi ollut  oleellista ja jatkossa tämä otetaan paremmin huomioon.