Tervetuloa kurssille T-106.1240 Ohjelmoinnin jatkokurssi T1 & T-106.1243 Ohjelmoinnin jatkokurssi L1 Luennoitsija: Otto Seppälä Kurssin WWW: http://www.cs.hut.fi/opinnot/t-106.1240/s2007
Foreign Students All lectures are in Finnish Supplementary material (links, literature pointers will be listed on the english website) http://www.cs.hut.fi/studies/t-106.1240/s2007 Foreign students should join the mailing list. Instructions on the website Exercises and the course project can be done using only english All instructions will be on the website on 14.9 noon. For now it is essential to sign up using wwwtopi and sign on the foreign student mailing list The first mail you receive will have all the relevant information for now.
Ilmoittautuminen Kurssille T-106.1240/1243 ilmoittaudutaan WWWTopin kautta Kursseilla on erilliset ilmoittautumissivut Ilmoittautuminen on pakollista Vain ilmoittautumalla ajoissa saa tarvittavat WebCAT-tunnukset WebCAT-tunnuksen salasana lähetetään TOPI-tietojen mukaiseen sähköpostiosoitteeseen tämän viikon loppupuolella. Pidä siis TOPI-tietosi ajan tasalla. Ilmoittautuminen sulkeutuu 21.9!
Päällekkäisyydet Kurssi on päällekkäinen seuraavien kurssien kanssa ts. Jonkin seuraavista jo suorittaneet eivät voi sisällyttää tätä kurssia opintoihinsa T-106.213/216/217 T-106.235 T-106.1240/1243 Ohjelmoinnin peruskurssit L1/Y1/ruotsink. Ohjelmoinnin jatkokurssi T1 Kurssi itse Jos olet jo suorittanut jonkin ohjelmoinnin peruskurssin javalla jossa oli ohjelmointiprojekti, tule luennon jälkeen kertomaan mikä se oli. T-osaston webisivuilla on lähes ajantasalla oleva korvaavuuskaavio ohjelmoinnin peruskursseille.
Esitiedot Kurssilla on kaksi esitietokurssia Ohjelmointikurssi T-106.1200/1203/1206/1207 tai T-93.211 (Java-versio) Puuttuvan ohjelmointikurssin tapauksessa pääsystä kurssille tulee neuvotella opettajan kanssa Kurssin suorittaminen esitietokurssin kanssa samanaikaisesti EI ole hyväksyttävää Tietorakenteet ja Algoritmit Tietorakennekurssin tuntemus selkiyttää asioita. Koska koko TRAK:in aluetta ei käsitellä, voivat vanhan tutkintorakenteen mukaankin suorittavat selvittää projektissa vaadittavat asiat itseopiskeluna.
Suorittaminen Kurssilla on kaksi pakollista osasuoritusta: Harjoitustehtävät (30% arvosanasta) 2 harjoituskierrosta Pääasiallinen tarkoitus on palauttaa koodausrutiini ennen projektin aloittamista Kurssilla on 6 harjoitusryhmää joissa voi vapaasti käydä hakemassa neuvoja harjoitusten avuksi. Toisella opetuskaudella vastaavasti ohjeistusta projektityöhön Projektityö (70% arvosanasta) Projektisuunnitelma Projektidokumentti Projektityön ohjelmakoodi
Suorittaminen Kaikki kurssin suoritukset ovat yksilösuorituksia! Plagiointi johtaa kurssilta poistamiseen ja jatkotoimenpiteisiin Luonnollisesti projektissa saa käyttää lähteitä (esim jokin tunnettu algoritmitoteutus) kunhan merkitsee ne oikein Olennaista on tietää minkä osan juuri SINÄ olet tehnyt.
Harjoitusryhmät Harjoitusryhmät aloittavat 17.9 Ma 8-10 Maari-C Ma 16-18 Maari-A Ti 12-14 Maari-C Ti 16-18 Maari-C To 14-16 Maari-A Pe 14-16 Maari-A Ryhmät ovat tauolla koeviikolla Viimeinen harjoitusryhmäviikko on marraskuun lopulla
Tiedotus Kurssilla on kotisivu http://www.cs.hut.fi/opinnot/t-106.1240/s2007 Sivulla on nyt kurssiesite Muu informaatio tulee sivulle pian. Topissa ilmoittautuneet saavat mailin kun kurssisivusto siirtyy esitetilasta kurssitilaan Kurssilla on myös uutisryhmä opinnot.tik.jatko-1 Kurssitiedotuksia, vapaata keskustelua, kysymyksiä aj vastauksia Ei aktiivista päivystystä kuten L-kurssilla IRC-kanava #ohj-jatko
Projekti
Projekti Projektin aikataulu karkeasti Aihevalinta avautuu 25.9 Suunnitelmat palautetaan 6.10 Yleissuunnitelma 12.10 Tekninen suunnitelma Suunnitelmademot 15.10 19.10 Aikaa koodata... Projektidemot Marras-joulukuun vaihde (todenn. Joulukuun puolella)
Projektityön suunnitelma Suunnitelma palautetaan kahdessa erässä 6.10 Yleistason suunnitelma Ohjelman sisältämät toiminnot Käyttöliittymän ulkoasu ja toiminnallisuus Ulkoisiin tiedostoihin tallennettu data ja näiden tiedostojen formaatti Järjestelmätestaussuunnitelma 12.10 Tekninen suunnitelma Ohjelman käyttämät algoritmit ja tietorakenteet Kuvaus ohjelmaan tulevista luokista ja haluttaessa myös luokkakaavio Työsuunnitelma, erityisesti etenemisjärjestys Yksikkötestaussuunnitelma
Projektityön suunnitelma Keskeisimmät suunnitelmassa tarvittavat asiat käsitellään ensimmäisellä kolmella luennolla Projektiaiheiden valinta avautuu kolmannen luennon jälkeen. Aiheen saa valita kun ensimmäisen kierroksen minimipisteet ovat kasassa Mahdolliset omat aiheet hyväksytetään luennoitsijalla Luennolla 24.9 annetaan tarkat ohjeet suunnitelman kirjoitukseen Julkaistaan myös WWW:ssä
Projektityön suunnitelma Suunnitelma (sisältäen molemmat osat) esitellään assistentille suunnitelmademossa (15-20min.) Assistentti on tutustunut suunnitelmaan ennalta ja antanut sille alustavan arvosanan. Suunnitelmademossa opiskelija esittää suullisesti suunnitelmansa pääkohdat assistentille Assistentti antaa ohjeita mahdollisista puutteista tai ongelmista suunnitelmassa Kysymyksiä voi (ja ehkä kannattaakin) esittää Liian huono tai puuttuva suunnitelma voi johtaa työn hylkäämiseen Hyvin tehty suunnitelma on itsessään hyvä projektidokumentin pohja Suunnitelmademot pidetään välillä 15.10...19.10.
Projektityön dokumentti Dokumentti sisältää seuraavat osat Ohjelman käyttöohjeet Lista ohjelman sisältämistä ominaisuuksista Lista ohjelman tunnetuista bugeista / puutteista Luokkakaavio tms. Kuvaus ohjelman rakenteesta Tiedostoformaattien kuvaukset Toteutunut työjärjestys ja aikataulu Testit Itsearviointi 1-3 Mielestäni onnistuneinta osaa ohjelman rakenteessa/koodissa 1-3 Mielestäni heikointa osaa ohjelman rakenteessa/koodissa (parannusehdotukset)
Arvosteluperusteet Koodin dokumentointi Ohjelman rakenne ja laatu Jako luokkiin Jako metodeihin Laajennettavuus Uudelleenkäytettävyys Yleinen ratkaisu > Erikoistapaus Valitut algoritmit, tietorakenteet ja perustelut Toteutettujen piirteiden laatu ja vaikeus Bugilistan kattavuus Tiedostetut puutteet eivät ole yhtä pahoja kuin tiedostamattomat
Harjoitukset
Harjoitukset Kurssilla on kaksi harjoituskierrosta Molemmat ensimmäisellä opetuskaudella Molemmilla kierroksilla on minimipistemäärä Ensimmäinen harjoituskierros julkaistaan loppuviikosta Kierros on auki n. 2,5 viikkoa
WebCAT Kurssin kaikki tehtävät palautetaan WebCAT järjestelmään Linkki järjestelmään tulee kotisivulle kun tehtäväkierros 1 avataan. WebCAT Automaattinen tehtäväpalautusten arvostelujärjestelmä Kehittäjä Stephen Edwards, Virginia Tech Toimintamalli Opiskelija palauttaa tehtävään sekä ratkaisun annettuun tehtävään, että testit jotka kattavasti testaavat ratkaisun sisältämän koodin Koodin testaamiseen käytetään JUnit testauskirjastoa
Arvostelukriteerit Code correctness (oikeellisuus) Palautuksen arvostelu opiskelijan itse luomia testejä vastaan Kuinka suuri osa opiskelijan testeistä menee läpi Test completeness (kattavuus) Kuinka suuri osa palautetun ohjelman koodista käydään läpi opiskelijan omissa testeissä Test validity Testaavatko opiskelijan testit oikeita asioita Käytännössä opiskelijan ohjelman testaaminen opettajan määrittelemällä testisetillä Staattinen koodianalyysi Etsii koodaus-, kommentointi- yms. virheitä
Arvostelukriteerit Arvostelukaava oikeellisuus*kattavuus*validiteetti + staattinen testaus Staattisen testauksen painoarvo vaihtelee tehtävittäin Kurssilla voi olla tehtäviä joissa opiskelijan ei tarvitse palauttaa testejä. Näistä on erillinen maininta tehtävänannossa. Palautustapa Jos palautettavia tiedostoja on vain yksi, se palautetaan sellaisenaan. Jos tiedostoja on monta, palautetaan JAR-paketti jar cvf paketti.jar tiedosto1.java tiedosto2.java...jne!! Älä unohda paketin nimeä paketti.jar!! Muuten jar ylikirjoittaa tiedosto1.java:n Demo luennon loppupuolella
Testaus "Program testing can be used to show the presence of bugs, but never to show their absence!" Edsger Dijkstra
Testaus Testaus vertaa ohjelman toimintaa sen oletettuun toimintaan (spesifikaatio) Poikkeamaa spesifikaatiosta kutsutaan virheeksi Spesifikaatio ei aina ole täydellinen Speksin tulkinnat on hyvä merkitä testin yhteyteen Testaus pyrkii osoittamaan virheiden olemassaolon Mutta ei voi todistaa virheettömyyttä Paitsi jos kaikki mahdolliset tilat ja syötteet käydään läpi jolloin kyseessä onkin jo mallintarkistus Hyvä testi pystyy näyttämään aiemmin tuntemattoman virheen olemassaolon Testaus pyrkii testaamaan ohjelmaa tai sen osaa tietoisesti sekä perustapauksilla, että spesifikaation rajoilla ja erikoistapauksissa
Testaus Testijoukon tulisi olla kattava Testaus ei ole helppoa Olion sisäinen tila riippuu suoritushistoriasta, yksittäinen testi voi mennä läpi, mutta seuraava epäonnistua Rinnakkaisohjelmoinnissa suoritushistorian rooli korostuu vielä enemmän Tietyn virheen tuottavan suoritushistorian luominen voi olla hyvinkin hankalaa
Helpompaa testausta Määrittele luokkien väliset rajapinnat yksinkertaisiksi ja selkeiksi Monimutkaiseen rajapintaan on vaikea kirjoittaa tynkäluokkia Enkapsulaatio Mitä vähemmän olion sisäinen tila riippuu muusta maailmasta, sitä helpompaa sitä on testata Lisäksi virheitäkin tulee todennäköisesti vähemmän Metodien ja luokkien jako pienempiin, hallittavampiin osiin Pieniä luokkia on helpompi testata Kaikki mainitut ovat muutenkin hyvän koodin tunnusmerkkejä
Testauksen tasoja Järjestelmätestaus (System testing) (suoritetaan viimeiseksi) Koko järjestelmän testaaminen järjestelmän spesifikaatiota vastaan Integraatiotestaus (Integration testing) Ohjelman osien testaaminen yhdessä Erityisesti ohjelman osien välinen tiedonvaihto Yksikkötestaus (Unit testing) (tästä aloitetaan) Yksikkötestauksessa ohjelmasta testataan pientä osaa, usein yksittäistä metodia tai luokkaa Verrataan tekniseen spesifikaatioon Testaus pyritään yleensä suorittamaan riippumattomasti muista ohjelman osista
Yksikkötestaus Yksikkötestaus (Unit testing) Yksikkötestauksessa ohjelmasta testataan pientä osaa Verrataan tekniseen spesifikaatioon Testaus pyritään yleensä suorittamaan riippumattomasti Monesti joudutaan toteuttamaan ns. Testipeti Simuloi muita ohjelman osia Sisältää usein tynkäluokkia, oikeiden luokkien sijaan Helpottaa testausta Muut luokat saadaan toimimaan tarkalleen speksin mukaan ennenkuin niitä on olemassakaan Erikoistapaukset on monesti helpompi generoida näin, kuin käyttämällä muita luokkia normaalisti Muista luokista voidaan kaivaa tietoja jotka eivät muuten olisi saatavilla
Yksikkötesti Yksikkötestin kuvaus sisältää Sanallisen kuvauksen siitä mitä testi testaa Ohjelmalle testissä annettavat syötteet, tai miten ne muodostetaan Esim tiettyjen metodien kutsuminen tietyssä järjestyksessä, esim: Add(0), Add(1), Delete(0) Ohjelman (olioiden) tila ennen testiä Odotetut tulosteet (ja olioiden tila) joihin verrataan Yksikkötesti Yrittää varmistaa että jokin koodin osa toimii niin kuin kehittäjä luulee sen toimivan.
Testausvinkkejä Testaa aina: Sallituilla äärirajoilla Esim. Poista puusta alkio kun siellä on vain yksi alkio. Laittomilla äärirajoilla Esim. Katso tuleeko koodilta speksin mukainen poikkeus Normaaliarvoilla Esim. Hae puusta jossa on kymmenen alkiota alkiota joka ei ole puussa ja katso että paluuarvo on false. Jos käytät satunnaisuutta, alusta satunnaislukugeneraattori itse vakioarvolla Virhetilanteet voi tällöin toistaa ja debugata Tai tallenna käyttämäsi siemenluku, jotta voit toistaa testit
Testikattavuuden mittoja Testeille on olemassa joitakin kattavuusmittoja, esimerkkejä kontrollivuon kattavuusmitoista: Rivikattavuus, lausekattavuus (WebCAT) tutkivat kuinka suuri osa riveistä suoritetaan vähintään kerran testauksen aikana Ehtokattavuus Ehtolauseissa kaikkien ehtolauseiden ehtojen tulee saada kaikki arvonsa Polkukattavuus Ohjelman suoritus haarautuu ehtolauseissa. Polkukattavuus pyrkii mahdollisimman monen eri polun suorittamiseen. Jopa täydellinen rivikattavuus voi olla vaikea saavuttaa
Regressiotestaus Regressiotestaus tarkistaa että järjestelmään tehdyt muutokset eivät ole rikkoneet aiempaa toiminnallisuutta Jos yksikkötestit on rakennettu jollakin automatisoidulla testaustyökalulla, on regressiotestaus hoidettavissa kivuttomasti
Testaus ja Extreme Programming Test-first toteutusjärjestys Ohjelmointi aloitetaan testien suunnittelulla ja toteuttamisella Kun uusia ominaisuuksia toteutetaan, ne voidaan heti testata Jos ohjelma toimii väärin, kirjoitetaan ensin testi joka osoittaa virheen olemassaolon ja vasta sitten ryhdytään korjaamaan virhettä
Formaali verifiointi Ohjelman virheettömyyttä ei voi todistaa testaamalla Jos ohjelman on välttämätöntä olla virheetön, sen toiminnallisuus todistetaan formaalilla verifioinnilla Formaali verifiointi Formaali verifiointi pyrkii todistamaan ohjelman oikeellisuuden, joko : Tutkimalla kaikki ohjelman tilat : mallintarkistus Matemaattisella todistuksella : invariantit, temporaalilogiikka,jne. Käytännössä tämä on raskasta ja tehtävissä vain rajallisen kokoisille ohjelmille Esim: tiedonsiirtoprotokollat, hardware Ei käsitellä tällä kurssilla
JUnit Junit on helppokäyttöinen yksikkötestaustyökalu Vastaavat asiat saisi kyllä aikaan ilmankin JUnitia, etu tulee lähinnä tuesta eri IDE:issä (mm. Eclipse) ja standardista Testit kirjoitetaan omaksi luokakseen, sisältäen : Koodin joka pystyttää testitilanteen Esim luo tarvittavat oliot, avaa tiedostot jne. @Before public void doallnecessarythings() Koodin joka ajaa testit ja todentaa tulokset @Test public void issavingfilesworking() Koodin joka purkaa testitilanteen : sulkee tiedostot... @After public void cleanup()
JUnit Perustesti (JUnit versio 4) Ota JUnit-kirjaston nimistö käyttöön importeilla Päätä luokkasi nimi sanaan Test (Webcat) Testimetodien eteen annotaatio @Test Testattavat asiat tarkistetaan assertnnn komennoilla import org.junit.before; import static org.junit.assert.assertequals; public class BasicTest { } @Test public void addzero() { MyInteger value = new MyInteger(123); MyInteger zero = new MyInteger(0); } MyInteger expectedresult = new MyInteger(123); MyInteger result = value.add(zero); assertequals(expectedresult, result);
JUnit Perustesti (JUnit versio 3) Ota JUnit-kirjaston nimistö käyttöön importilla Periytä luokkasi luokasta TestCase Testimetodien nimet alkavat aina test... Testattavat asiat tarkistetaan assertnnn komennoilla import junit.framework.*; public class BasicTest extends TestCase{ } public void testaddzero(){ MyInteger value = new MyInteger(123); MyInteger zero = new MyInteger(0); } MyInteger expectedresult = new MyInteger(123); MyInteger result = value.add(zero); assertequals(expectedresult, result);
@Test, @Before, @After @Test-annotaatiolla merkitään metodit jotka sisältävät testejä. JUnit suorittaa ne kaikki. Vaikkapa metodi joka kutsuu binäärisen hakupuun lisäysmetodia ja sitten hakee sen puusta contains-metodilla. Assert-metodilla vaaditaan että contains:in tulee palauttaa true. @Before-annotaatiolla merkitään metodit jotka suoritetaan ennen jokaista testiä. Kaikille testeille yhteisten muuttujien alustaminen, etteivät testit vaikuta toisiinsa jne... @After-annotaatiolla merkitään metodit jotka suoritetaan jokaisen testin jälkeen. Esim @Beforessa avattujen tiedostojen sulkeminen tms.
JUnit - Assert assertnnn-metodeilla jokin ehto jonka tulee olla totta. Jos ehto ei ole totta, testin kohta ei mene läpi. Assert-luokassa on paljon erilaisia assert-metodeja asserttrue(string message, boolean condition) Parametrin pitää olla true assertfalse(string message, boolean condition) Parametrin pitää olla false assertequals(string message, String a, String b) Parametrien pitää olla samat assertnull, assertnotnull jne.. käytännössä kaikki muut variaatiot voi kuitenkin rakentaa käyttämällä metodia asserttrue Koko lista löytyy API:sta http://junit.sourceforge.net/javadoc/junit/framework/assert.html
Junit ja Web-CAT...Kertaus on opintojen äiti... Web-CAT hyväksyy Minkä tahansa Junit3 testin Minkä tahansa Junit4 testin (luokan nimen pitää päättyä..test) Web-CAT suorittaa määrittelemäsi Junit-testit. Web-CAT laskee kuinka suuri osa testeistä läpäistään Web-CAT laskee testien rivi- tai lausekattavuuden Saadaksesi testin ja koodaamasi tehtävän palautettua Sinun pitää pakata kaikki koodit yhteen jar-ohjelmalla jar cvf paketinnimi.jar tiedosto.java toinen.java kolmas.java Tämän jälkeen palautat tekemäsi paketin
Esimerkkejä Junit-esimerkki Eclipsellä Koodataan luokka ja testataan se käyttäen JUnit:ia Esimerkin koodit ja ohjeet tulevat kurssin sivuille Palautetaan esimerkki Web-CAT:iin Katsotaan video..
Tulevia luentoja (alustava) 17.9 Rajapinnat, Generics, Design Patterns I Olioiden tyypeistä: Luokat, interfacet, geneeristen luokkien kirjoittaminen. Rajapinnat Java APIssa. Mikä on suunnittelumalli? Muutama suunnittelumalli. 24.9 Projektiohjeistusta Ohjeita projektin aihevalintaan ja suunnitelman kirjoitukseen. Projektin jakaminen hallittaviin ja testattaviin kokonaisuuksiin. Toteutusjärjestys. Tiedostoformaattien suunnitteluperiaatteita. 1.10. Design for re-use, Design Patterns II, kirjastot Ohjelmien rakentaminen tulevia muutoksia ajatellen, defensive programming, muunneltavuutta edistävät suunnittelumallit. Katsaus joihinkin Java API:n kirjastoihin ja ideoihin niiden suunnittelussa.
Tulevia luentoja (alustava) 8.10 Graafiset käyttöliittymät, Versionhallinta Tapahtumat ja tapahtumankäsittely, GUI:n perustoiminnallisuus, Grafiikan piirtäminen. Versionhallinta. 15.10 Rinnakkaisohjelmoinnin alkeet Javan rinnakkaisuusprimitiivit, Luokka Thread, Runnablerajapinta, Perus Producer-Consumer esimerkkitoteutus, blocking, potentiaaliset ongelmat kuten deadlock. Graafiset käyttöliittymät ja rinnakkaisuus 22.10 Vaihtelevia aiheita Esim. Ohjelmien profilointi ja profiilien tulkinta, asiaa koodin optimoinnista, Lisää kirjastoja, yleiskatsaus palautettuihin suunnitelmiin ja ohjeistusta projektiin.