Projektisuunnitelma
Rubyric
Palauta yleis- tai tekninen suunnitelma tästä:.
(Käytä samaa sama linkkiä kummassakin palautuksessa.)
Ennen projektityön varsinaisen ohjelmoinnin aloittamista laaditaan projektisuunnitelma, jossa projektin toteutus pääpiirteissään esitetään. Suunnitelma on alustava, eli sitä ei tarvitse orjallisesti noudattaa ohjelmaa toteuttaessaan. Tämä ei kuitenkaan tarkoita, etteikö suunnitelmaan olisi syytä suhtautua vakavasti. Kun asiat on mietitty huolella etukäteen, kulkee toteutus huomattavasti sujuvammin, eikä joudu havaitsemaan lennosta improvisoitua ratkaisuyritystään kelvottomaksi. Suuria ohjelmia laadittaessa ei voi suoraan ryhtyä kirjoittamaan ohjelmakoodia sen enempää miettimättä, vaan kokonaisuuden hallittavuuden vuoksi täytyy pysähtyä pohtimaan mitä on tekemässä. Suunnitelman tekeminen on pakollista.
Hyvin tehty suunnitelma vähentää projektin työmäärää.
Sisältö
Suunnitelma palautetaan kahdessa osassa, joiden tulee esittää seuraavat asiat:
Yleissuunnitelma
Palautetaan ma 22.02.2016 (23:59) mennessä
Henkilötiedot
Otsikko; tekijän nimi, opiskelijanumero, koulutusohjelma, vuosikurssi sekä päiväys.
Yleiskuvaus
Yleinen kuvaus siitä, mitä olette tekemässä. Tämän osion voi monissa tapauksissa pitkälti lainata tehtävänantotiedostosta. Täsmentäkää tarvittaessa tehtävänantoa niiltä osin kuin katsotte tarpeelliseksi. Jos aihe on mahdollista toteuttaa usealla eri vaikeusasteella, ilmaise myös minkä tasoisena olet ajatellut työn toteuttaa.
Käyttöliittymän luonnos
Miten ohjelma kommunikoi käyttäjän kanssa? Missä muodossa ja mistä ohjelma saa syötteensä, ja miten/mihin se tulostaa viestinsä? Mitä komentoja ohjelma tuntee ja miten ne annetaan? Jos ohjelman käyttöliittymä on graafinen, liittäkää mukaan jonkinmoinen kuva tärkeimmistä ikkunoista tai ainakin kuvailkaa sanallisesti, mitä ohjelmaruudulla näkyy. Kaikkia pikku yksityiskohtia ei tule tässä selittää.
Tiedostot ja tiedostoformaatit
Suurin osa projektiaiheista vaatii tietojen tallentamista ja lataamista tiedostoista, ja usein myös pidemmät tekstit, kuvat jne. joita käyttöliittymissä tarvitaan on parempi säilyttää tiedostoissa kuin kirjoittaa kiinteästi koodiin. Selostakaa tässä osiossa millaisia tiedostoja ohjelmanne käsittelee, jos mitään. Esim. ovatko ne tekstitiedostoja vai binääritiedostoja, ja miten tieto on niissä esitetty? Kuvatkaa jo nyt tiedostoformaatit joita ohjelmanne käyttää. Vaikka formaatti voisi muuttua myöhemmin, sen pohtiminen auttaa välttämään mahdollisia ongelmia projektin toteutusvaiheessa.
Järjestelmätestaussuunnitelma
Projektin testausta järjestelmän tasolla voi ryhtyä suunnittelemaan saman tien kun toteutuksen ääriviivat on pohdittu. Pohjautuen täydentämäänne yleiskuvaukseen, käyttöliittymän kuvaukseen ja mahdollisiin tiedostoihin, kuvatkaa yleisluontoisesti, kuinka lopullisen ohjelman toimintaa kannattaisi testata. Menemättä liikaa toteutuksen yksityiskohtiin, pohtikaa mitä asioita ohjelman tulee pystyä tekemään ja millä tavoin näitä voisi testata. Mitä asiota ohjelman ei tule sallia? Kuinka tätä voisi testata?
Esimerkki testattavasta ominaisuudesta on tekstinkäsittelyohjelman find-komento. Komennon tulisi löytää kaikki annetun tekstin esiintymät kursorin nykyisestä paikasta eteenpäin. Toimintoa tulisi lopullisessa ohjelmassa testata ainakin tapauksilla joissa kursorin nykyisen paikan jälkeen tulee useampia esiintymiä, yksi esiintymä tai ei yhtään. Erikoistapauksina kannattaa kokeilla etsittävän asian sijainti koko tekstin lopussa tai juuri kursorin kohdalla. Myös kursoria edeltäviä tapauksia tulee kokeilla.
Koska ohjelma ei ole vielä täysin muotoutunut, ei tässä kannata liioitella. Testitapauksia kannattaa suunnitella vain sen verran, että ohjelman keskeisimmät toiminnot tulee ainakin ajateltua läpi. Kun on pohtinut mitä ohjelmaltaan vaatii ei toteuttaessa tule ehkä niin paljon yllätyksiä.
Tekninen suunnitelma
Palautetaan pe 26.02.2016 (23:59) mennessä.
Ohjelman rakennesuunnitelma
Suunnitelman tärkein osuus. Ohjelman erottelu tärkeimpiin osakokonaisuuksiinsa, suunnitellun luokkajaon esittely. Minkälaisilla luokilla kuvaat ohjelman ongelma-aluetta? Mitä ongelman osaa kukin luokka mallintaa? Mitkä ovat luokkien väliset suhteet? Entä millaisia luokkia tarvitaan ohjelman käyttöliittymän kuvaamiseen? Miettikää mahdollisia muita ratkaisumalleja ja perustele valittu ratkaisu. Jos suinkin mahdollista, liittäkää mukaan jonkinlainen graafinen luokkakaavio (voitte käyttää esim. UML-luokkakaavionotaatiota, mutta se ei ole millään muotoa pakollista). Esittele luokkien keskeiset metodit. Huom. oleellista on vain se, mitä metodeilla tehdään, ei se, miten ne sisäisesti toimivat.
Käyttötapauskuvaus
Esittäkää ainakin yksi realistinen ohjelman käyttötapaus, eli kuvaus tilanteesta, jossa käyttäjä käynnistää ohjelman ja tekee sillä joitakin ohjelmalle tyypillisiä asioita. Kertokaa sekä se, mitä toimenpiteitä käyttäjän on suoritettava päämääriensä saavuttamiseksi (eli minkä käyttöliittymän osien kanssa tämä on tekemisissä ja miten), että se, mitkä ohjelmanne osat aktivoituvat kussakin vaiheessa "kulissien takana" ja suorittavat tarvittavat tehtävät. Koodiyksityiskohdat eivät ole tässä kiinnostavia, vaan korkeamman tason työnjako.
Algoritmit
Sanallinen kuvaus käyttämistänne algoritmeista, eli siitä miten ohjelma suorittaa tarvittavat tehtävät. Esim. miten tarvittava matemaattinen laskenta tapahtuu (kaavat mukaan)? Miten algoritminne löytää lyhimmän tiereitin kahden kaupungin välille? Miten toteuttamanne pelin tekoäly toimii? Kaavioita tms. voi käyttää apuna tarpeen mukaan. Mitä muita ratkaisuvaihtoehtoja olisi ollut? Perustelkaa valintanne!
Tässä kohdassa on siis tarkoitus selostaa ne periaatteet, joilla ongelmat voidaan ratkaista, ei sitä, miten algoritmit koodataan. Siis ei luokkien tai metodien kuvauksia tai muitakaan Pythoniin tai ohjelmakoodiin liittyviä seikkoja tänne! (Vielä rautalangasta: älkää mainitko tässä mitään siitä, millaisilla metodeilla algoritmi saadaan toimimaan, millaisia silmukkarakenteita tarvitsee kirjoittaa, tms. Nämä ovat toteutusteknisiä yksityiskohtia, jotka eivät ole tämän osion, eivätkä oikeastaan koko projektisuunnitelman kannalta kiinnostavia.) Jos ohjelmassa on tarkoitus käyttää joitakin yleisesti tunnettuja algoritmeja kannattaa toki mainita algoritmit nimeltä.
Tietorakenteet
Minkälaiset kokoelmatyypit/tietorakenteet soveltuvat parhaiten ohjelmassa tarvittavan tiedon varastoimiseen ja käsittelyyn? Miksi? Mitä muita valintamahdollisuuksia olisi ollut? Tarvitsetteko dynaamisia rakenteita (so. muuttuvan kokoisia, esim. listat) vai riittävätkö esim. taulukot? Kun käytätte Pythonin valmiita tietorakenteita, ei niiden tarkkaa määrittelyä tarvitse esittää, kunhan perustelee miksi minkäkin rakenteen on valinnut. Jos taas ohjelmoitte itse jonkin tietorakenteen, on myös sen toimintatapa selostettava.
Aikataulu
Yrittäkää hahmotella itsellenne aikataulu ja karkea arvio eri vaiheissa kuluvista työtunneista. Se on vaikeaa, mutta opettavaista, kun aikataulua vertaa käytännössä eri vaiheisiin kuluvaan todelliseen aikaan. Älkää heittäkö suunnitelmaan mitä tahansa ensiksi mieleen tulevia lukuja vaan yrittäkää arvioida tilannetta realistisesti.
Kuvatkaa myös suunniteltu etenemisjärjestys, eli missä järjestyksessä ohjelmanne aiotte toteuttaa. Tässä kannattaa jo miettiä ohjelman testausta, ja sitä, mitkä osat muusta koodista käyttävät muita osia. Yleensä ohjelmassa on keskeisiä ominaisuuksia joista kannattaa aloittaa, sekä ominaisuuksia, joiden toteutus ei ole heti olennaista. Muista että kehitettäessä jotkin asiat voidaan korvata tynkäluokilla tai tynkämetodeilla, jotta ohjelma saadaan kääntymään, ja jotta toteutettua koodia voi testata. Kokonaisia luokkia ei myöskään tarvitse toteuttaa alusta loppuun vaan tarkentaa toteutusta aste asteelta, kun työ etenee.
Yksikkötestaussuunnitelma
Kuvatkaa tässä osiossa kuinka aiotte testata ohjelman keskeisimpiä osia toteutuksen edetessä. Koko ohjelman kaikkia ominaisuuksia ei ole tarkoitus käydä läpi, vaan keskittyä tässä ehkä ohjelman "ydinmetodeihin", jotka tekevät sen keskeisimmän työn. Kuvatkaa jälleen yleisluontoisesti, kuinka aiotte metodeja (valitkaa muutama) niiden valmistuttua kokeilla. Jälleen voi esittää keskeisiä syötteitä joilla ohjelman tulee toimia, mitä metodin tulee tällöin palauttaa ja mikä sen vaikutus ohjelman olioihin tulee olla. Vastaavasti voi pohtia sitä, kuinka metodeja voisi testata helposti ilman että tarvitsee toteuttaa valtavia apurakennelmia. (valitettavasti näiltä ei voi aina välttyä) Yksikkötestausta kannattaa sitten projektia toteuttaessa tehdä sopivassa määrin, jotta ei turhaan joudu etsimään bugia uusista koodiriveistä, kun virhe onkin jossain joka tehtiin aikaa sitten.
Kirjallisuusviitteet ja linkit
Suunnitteluvaiheessa on syytä selvittää, millaista aiheeseenne liittyvää materiaalia on tarjolla. Kirjastot ja nettihakukoneet ovat resursseja, joita kannattaa hyödyntää. Kertokaa tässä, mitä kirjoja, nettisivuja tai muuta materiaalia olette jo käyttäneet tai suunnitelleet myöhemmin käyttävänne. Kaikki lähteet tulee ilmoittaa, vaikka niihin kuuluisivat jokin käyttämäsi oppikirja ja Pythonin perusluokkakirjastojen API-kuvaus.
Liitteet
Lisäksi suunnitelmassa saa olla liitteitä, aiheesta riippuen.
Toteutus
Palauta suunnitelma PDF-muotoisena dokumenttina. Jos oman koneesi tekstinkäsittelyohjelma ei tuota PDF:ää, niin koulun koneilla olevat varmasti osaavat.
Palautus
Rubyric
Palauta yleis- tai tekninen suunnitelma tästä:.
Käytä samaa linkkiä kummassakin palautuksessa.
Suunnitelma palautetaan kahdessa osassa lähettämällä palautusjärjestelmään ja esittelemällä se projektiaiheen vastuuassistentille lyhyesti suunnitelmademossa. Esittelytilaisuudessa, joka kestää n. 15 minuuttia, opiskelija esittelee suunnitelmansa, erityisesti ohjelman rakennesuunnitelmaosuuden, pääpiirteittään assarille ja vastailee assarin kysymyksiin. Mitään esitelmää ei tarvitse valmistella - tilaisuus on lyhyehkö, epämuodollinen ja interaktiivinen. Riittää, kun ymmärrätte, mitä olette suunnitelmaan kirjoittanut. Tässä voi myös esittää kysymyksiä jos jokin aiheeseen liittyvä asia on jäänyt epäselväksi, tai jos haluaa vahvistusta omille ideoille toteutuksen suhteen.
Suunnitelmademot ovat ma 29.2. - ma 7.3.2016 ja ajanvaraus niihin on mahdollista pian aihevalinnan sulkeutumisen jälkeen kun aihekohtaiset assistentit ovat tiedossa. Suunnitelman tulee olla valmis ja palautettu palautusjärjestelmään aikataulun mukaisesti, jotta assistentti ehtii tutustua suunnitelmaan alustavasti etukäteen.
Esittelytilaisuudessa assistentti esittää kysymyksiä opiskelijalle, jonka on osattava vastata suunnitelmaansa liittyviin kysymyksiin.
Arvostelu
Hyväksytyt suunnitelmat arvostellaan asteikolla -, 0 tai +. Suunnitelman arvosana vaikuttaa projektityön lopulliseen arvosanaan: plussa suunnitelmasta huomioidaan positiivisena ja miinus negatiivisena osatekijänä kokonaisarvostelua tehtäessä. Suunnitelma on pakollinen osa projektityötä, ja se kannattaa tehdä hyvin myös arvosanaa silmällä pitäen. Myöhästyneestä suunnitelmasta annetaan arvosanaksi korkeintaan miinus tai sitten se hylätään kokonaan (mikäli se on hyvin heikko tai sen arvostelu jälkikäteen ei sovi assistentin aikatauluun).
Palautteet suunnitelmista tulevat Rubyriciin. Lisäksi assistentit voivat antaa suunnitelmiin liittyen palautetta tai vinkkejä esittelytilaisuuksissa, sikäli kun aikaa riittää. Assistentti saattaa esimerkiksi antaa vinkkejä ohjelman luokkajaon parantamiseksi.
Hylätyn suunnitelman laatineiden opiskelijoiden on palautettava uusittu suunnitelma assistentille parin päivän sisällä hylkäysilmoituksesta voidakseen läpäistä kurssin. Myöhässä palautetut tai todella heikot suunnitelmat voidaan hylätä kokonaan, ilman uusintapalautusmahdollisuutta.