Demo-ohjaajien ja -tarkastajien havaintoja kevään 2015 kurssista.
Yleistä:
Ohjauksia hyödynsi varsin pieni osuus kurssilaisista. Demotehtäviä on kyllä yritettykin kehittää suuntaan, jossa kaikki olisi opiskeltavissa ja tehtävissä täysin etänä. Vaikutti kuitenkin selvältä, että ohjauksista oli hyötyä läsnäolijoille, ja siksi niitä nyt pidettiin.
Tulevilla kurssikerroilla voisi olla tarkoituksenmukaisempaa järjestää mikroluokkasessioiden sijasta vaikka henkilökohtaisia puolen tunnin tukiopetustuokioita tuntiopettajien päivystystilassa. Ehkä niihin valmistuttaisiin valmiiden kysymysten kanssa paremmin, niin aikakin voisi olla tehokkaammin käytössä.
Suosittelemme kehittämään omatoimisen yrittämisen halua ja taitoa, koska sitä tarvitaan tällä alalla. Yliopisto on siirtymävaihe perusopetuksen ja lukion doktrinoidusta "tässä on kaikki ja muuta ei ole" -tyyppisestä opetuksesta ammattilaisen asenteeseen, jossa etsitään tietoa, jos sitä ei juuri nyt tässä ole. Tässä on onneksi näkyvissä luonnollinen ero ensimmäisen vuoden ja viimeisen vuoden opiskelijan välillä. Tämän kohdan tarkoitus on kannustaa kaikkia jatkossa.
Ohjauksissa oli jonkin verran sellaista, että ohjauksiin tultiin ilman ennakkoon mietittyjä kysymyksiä tai asioiden omatoimista miettimistä. Silloin on vaikea auttaa ongelmakohdissa, kun ei tiedetä, missä niihin törmättäisiin.
Ohjauksissa yritettiinkin viimeiseen asti kannustaa omatoimiseen tiedon löytämiseen sen sijaan että olisi annettu suoria vastauksia. Syvällisemmällä tasolla kyseinen taito onkin paljon tärkeämpi kuin jokin C-kielen syntaksi tai mikään muu irrallinen yksityiskohta.
Helpommat demot onnistuivat hyvin. Pikkuvikoja:
Demo 1:ssä oli kaikki uutta, joten melko tyypillistä oli yrittää tarpeettoman monimutkaisia (ja siten vääriä) komentoja, kuten:
echo `ps -f`
Tarkoituksena oli demon aikana tai sen jälkeen reflektoimalla ymmärtää, että yllä oleva komentorivi suorittaa ensin komennon ps -f ja sijoittaa tulosteen merkki merkiltä komentoriville hipsukkalausekkeen tilalle. Sen jälkeen vasta komentorivi suorittaa komennon echo joka tulostaa nyt aiemman tulosteen sanat yksitellen, mikä ei tässä nyt ollut haluttu toimenpide.
Demo 2:ssa puuttui lopusta skriptin itsensä tulostaminen, joka oli ohjeessa annettu merkistä merkkiin valmiina:
cat $0
Muun muassa tämä on vahvaa evidenssiä siitä, että tehtävänantoja ei ole luettu huolellisesti loppuun asti. Tässä vaiheessa koulutusta ei haittaa. Oikeassa elämässä tällainen peli ei sitten vetele - vaatimusmäärittely tai standardi on luettava tasan tarkkaan ja toteutettava se, mitä siinä edellytetään.
Demo 2:ssa olivat jo harvemmassa väärät echo `ps -f` > tuloste -tyyppiset "luovat ratkaisut", mikä oli tietysti tarkoituskin. Ja kurssin lopussahan asia on kaikille tullut päivänselväksi, kuten osaamistavoite oli :)
Demo 3 oli vielä pakollisen palautuksen osalta kohtuuhelppo, kuten demot 1-2. Toivottavasti sen sisällön muutkin pääkohdat kuitenkin käytiin läpi ja ymmärrettiin. Tarkoitus oli aloittaa lukemaan ja yrittämään ymmärtää C-ohjelmia. Paljon töitä tehtiin sen asian parissa, että aluksi ei ymmärretty komentoriviargumentin siirtymistä ohjelman käyttöön käynnistyksen yhteydessä vaan koetettiin esim. sisällyttää argumentteja ohjelman lähdekoodin sisälle. Tavoitteena olikin osaltaan kehittää ymmärrystä argumenteista ja ympäristömuuttujista. Toivottavasti niin tapahtui.
Tässä vaiheessa oli vielä ongelmia ääkkösten kanssa, kun ei oltu huomattu laittaa omasta pääteohjelmasta merkistökoodausta samaksi kuin palvelimella eli UTF-8:ksi. Mielenkiintoista on, että tämä asia tunnuttiin ikään kuin hyväksyttävän "ilmiönä, joka vain tapahtuu", eikä apuja meinattu kysyä mitään kanavaa pitkin. Joku rohkea sitten laittoi demo3:n "fiiliksenä" tästä jonkinlaisen hätähuudon, niin tajuttiin ohjeistaa tarkemmin. Suositeltavaa opetella kysymään, ennen kuin ongelmat alkaa ahdistaa.
Haastavampia:
Demo 4 ("Sormet syvemmälle C:hen") oli varmasti hieman haastavampi, erityisesti jos demosta 3 oli tehty ylimalkaisesti vain palautettava osuus ilman kummempaa ajattelutyötä.
Yllätyksiä aiempiin vuosiin ei tullut siinä, että Ohjelmointi 1:n perusasiat eivät olleet kaikilla vielä käsitteen tasolla ymmäretty. Esimerkiksi for -silmukan toiminta tai taulukko yleisesti ottaen tietorakenteena, jonka alkioihin viitataan indeksillä.
Yllätyksenä ei tullut myöskään, että alkuvaiheessa yritetään ohjelmoida uudella kielellä samalla tavoin kuin jollain aiemmalla. Esimerkiksi merkkijono.Length() -- jollaista ei nyt tietenkään ollut käytössä.
Tehtävänantoja ja ohjeita ei ilmeisesti ole jaksettu lukea tarkasti tai ainakaan toteuttaa loppuun saakka. Tämä havaittiin erityisesti demossa 4:
Muita havaintoja:
Pahimman näköistä olivat palautetut koodit, jotka eivät edes käänny!! Tämä on indikaatio yleisesti väärästä työtavasta, joka tulee korjata välittömästi. Ohjelma täytyy aina pitää vähintään syntaktisesti oikeana, jotta sitä on mahdollista kääntää ja testata. Eli muutokset tehtävä oman osaamisen mukaisina pieninä pätkinä, joiden jälkeen aina kääntö ja ajaminen.
Toiseksi pahimman näköistä oli tietysti sellaiset palautukset, joista puuttui jopa olennainen toimenpide eli merkin poisto. Selvästi ei oltu haluttu tutkia pääohjelman tulosteita, joista olisi selvinnyt, ettei mitään tapahdu. Olikohan tässäkään oikeasti käännetty ja ajettu ohjelmaa?
Positiivinen havainto: Jotkut olivat ehtineet jopa kommentoida ohjelmansa, vaikkei sitä vaaditukaan. Tämä teki tarkastajan työn miellyttäväksi (ja usein korreloi myös muutoinkin loppuun asti mietityn ja oikeellisen vastauksen kanssa)
Ihmetyttävä seikka: Jotkut olivat jättäneet alkuperäiset kommentit, vaikka toiminnallisuus oli muutettu. Esimerkiksi:
return -2; /* Palauttaa toistaiseksi aina nollan. */
Niin että mitähän tuon koodirivin sitten pitäisi oikeasti tehdä? Palauttaa -2 vai 0? Yleensä kommenttien tulisi vastata nykyistä todellisuutta, jos niitä ylipäätään ohjelmaan laitetaan. Muuten lukija voi olettaa, että koodissa on tuossa kohtaa virhe.
Demo5:
Vastauksissa oli "off-by-one" -virheitä, joihin voi olla erilaisia syitä. Arveluja:
Tällaiset "yhdellä ohi" eli "off-by-one" -tyyppiset loogiset virheet ovat yleisiä ohjelmoinnissa, ja tilanteesta riippuen todella pahoja (esimerkiksi "sammuta kaikki rakettimoottorit viimeistä myöten" saisi sammuttaa myös sen aivan viimeisen moottorin). Näiltä ei oikein voi välttyä muuten kuin ajattelemalla asian vielä kertaalleen läpi ja tekemällä vaikka paperille esimerkin asiasta:
Taulukon osoitteet: |1 2 | 3 4 | 2-tavuset sisällöt: 1234 5678 indeksit: 0 1 Taulukon koko: 2 alkiota Varattu tila: 4 tavua Viimeinen varattu osoite: 4 Ensimmäinen varattu osoite: 1 Viimeinen osoite - ensimmäinen = 4 - 1 = 3 ERI kuin varattu tila! Oikea kaava olisi esim. (4-1) + 1.
Tuollainen on syytä tehdä mielessään tai mieluummin paperilla, ennen kuin kirjoittaa kaavan vaikka jonkun tilanvaraustarpeen laskemiseksi :). Periaate pätee muuhunkin ongelmanratkaisuun: yksinkertainen esimerkki auttaa saamaan kuntoon kaavan, joka toimii missä tahansa tilanteessa.
Muita havaintoja:
Demo 6:
Alustavat havainnot:
Taas ei oo ohjetta luettu. Piti lisätä kaksi itse keksittyä sanaa tai sanarunkoa poistettavaksi. Ei toimi oikeissa töissä jne.. "minä nyt vaan puolet tästä toteutin..."
Ihan liian monimutkaisesti lähtee monella toteutus rönsyilemään, mikä on tässä vaiheessa koulutusta normaalia, kun ei vielä aivan ymmärretä syntaksejakaan, eikä ole kokemusta tyypillisestä ongelmanratkaisusta niiden keinojen avulla, joita ohjelmointikielissä on tarjolla.
Tulevaisuutta kohti tämä pitäisi saada vähenemään asteittain. Kovin montaa if, for tai case rakennetta tehtävän ratkaiseminen ei varmasti vaadi :). Mitä se vaatii, on (1) pysähtyä miettimään ja ymmärtämään, miten esimerkki toimii, ja (2) soveltaa tätä ymmärrystä lähestulkoon copy-pasten keinoin ratkaisemaan annettu tehtävä.
Yleishuomioita:
Tässä vaiheessa koulutusta tuntuu vielä olevan (edelleenkään ei yllättäen) ilmassa käsitystä, että tietokone tekisi jotenkin "maagisesti" asioita, joita sitä ei suoraan käsketä tekemään. Esimerkiksi ohjelmassa voi olla kaikki jo muuten OK, mutta ihmettelyä aiheuttaa, miksi se ei tulosta mitään... No siksi, että ohjelmassa ei ole vielä yhtään tulostuskäskyä. Ei se tee mitään, mitä ohjelmoija ei ole erikseen käskenyt.
Sitä varten tässä nämä pari vuotta opiskellaan, että mm. tällaiset perusasiat juurtuvat kurssi kerrallaan, kun niihin palataan aina uudelleen eri yhteyksissä.