Ohjelmistokehityksen sovellusprojekti
Oikopolut eri viikoille
Ohjaajien kommentteja ja vinkkejä
Projektista
- Minimikomponentit:
- Käyttöliittymä (Qt-työpöytäsovellus C++:lla)
- Node.js API
- Tietokanta (MySQL)
- Node.js-rajapinta (API) MySQL-tietokantaan
- 4 hengen ryhmät
- Versionhallinta (Git + Github)
- Projektidokumentti
- Tekninen määrittelydokumentti
- Readme.md Github-repositorylle
- MS Teams viestintään
- Viikkopalaverit
- Loppuesitykset videona ja englanninkielinen posteri
Avainsanoja: UML/määrittelyt, Qt, API, MySQL, UI/UX
Oppimistavoitteet
- Opiskelija tunnistaa ja ymmärtää ohjelmistokehityksen vaihejakomallin perusvaiheet. Hän tietää eri vaiheiden merkitykset, vaihetuotteet ja vaiheiden erot
- Itsenäisen ja ryhmätyöskentelyn avulla opiskelija oppii suunnittelemaan ja toteuttamaan vaatimusmäärittelyn mukaisen järjestelmän käyttäen moderneja kehitystyökaluja
- Opiskelija ymmärtää ryhmätyöskentelyn merkityksen ohjelmistokehitystyössä
- Opiskelija osaa käyttää oliopohjaista mallinnuskieltä kehitystyön (UML) eri vaiheissa ja osaa kirjoittaa kaavioiden pohjalta ohjelmakoodia
- Opiskelija osaa suunnitella ja toteuttaa oliopohjaisen sovelluksen luokkakirjaston mukaisesti
- Opiskelija osaa suunnitella ja toteuttaa sovellukseen tietokanta-arkkitehtuurin
- Opiskelija osaa laatia ohjelmistoprojektin dokumentaation ja pystyy viestimään suullisesti ja kirjallisesti, myös englanniksi
Arviointi
Arviointi perustuu:
- Aikataulussa pysyminen. Työtä pitää tehdä järjestelmällisesti. Viikkoraportointi vaaditaan!
- Ryhmän tuottaman sovellukseen tasoon
- Loppuesitykseen
- Ohjaajan arvioon (tämä perustuu palavereissa saatuihin kokemuksiin ja GitHubin näkymiin)
- Toveriarvioon, joka tehdään web-sovelluksella (vertaisarviointi)
- Itsearvioon, joka tehdään web-sovelluksella (itsearviointi)
- Projektidokumentointi ja tekninen määrittelydokumentti (heikko dokumentointi voi alentaa arvosanaa)
- Englanninkielinen posteri (hyväksytty/hylätty, pitää päästä läpi)
- Arvosanaa ei voi korottaa myöhemmin
Lisätehtäviä parempaan arvosanaan:
Extratehtäviä (erityisesti monimuoto-opiskelijat, joilla on jo Linux-kurssi käytynä). Nämä eivät korota arvosanaa:
- Kanban-taulu käytössä projektille (erillinen Github-projekti ja sille Kanban)
- API laitetaan reverse proxyn taakse. Esimerkiksi Apache, Nginx, Caddy tai frp
- Koko backend VPS-linuxilla (pilvipalvelusta kuten Digital Ocean tms. se VPS) tai jossain PaaS-alustassa suoraan tai konttina (Render.com, Fly.io, Vercel tms)
- Jonkinlainen yksinkertainen CI/CD tai ainakin CD (esim. käännetyn tuotoksen “releasen” automatisointi Githubiin tai toiselle palvelimelle ladattavaksi vaikka Github actioneilla)
- Web-palvelin käännettyjen softien lataamiseen (releaset automaattisesti tänne?)
Qt/Express-materiaalit (Pekka Alaluukas)
Ohjelmistokehityksen perusteet ja UML-mallinnus videot Yujassa (Teemu Leppänen)
Kaaviot dokumentointiin
Esimerkiksi näillä työkaluilla:
Katso näistä Teams-kanavan dokumenteista mallia teknisen määrittelydokumentin kaavioihin:
Softalisensseistä
Noin 15 min viikkopalavereiden yleinen agenda
Viikkopalaverit pidetään ryhmän alikanavalla MS Teamssilla, niin ei tarvitse tehdä erillisiä kutsuja vaan voi liittyä suoraan siellä.
- Pääsääntöisesti kaikkien pitää olla paikalla
- Yleistä keskustelua, että miten projekti on edennyt
- Yleistä keskustelua, että miten kukin opiskelija on osallistunut
- Versiohallinnan esittely (ja .gitignore käytössä)
- Muutoksia arvosanatavoitteeseen tai tavoitteisiin ylipäätänsä
- Vilkaistaan projektidokumenttia ja teknistä määrittelyä
Viikko 1
- Aloitusinfo
- Luodaan ja numeroidaan neljän opiskelijan ryhmät
- Jokainen opiskelija luo tunnuksen itselleen sivustolla
https://peatutor.com/project_app/register/tvt24spl
TAI
https://peatutor.com/project_app/register/tvt24spo
- Tutustukaa arviointikriteereihin ja päättäkää mihin arvosanaan pyritään
- Tarkista että olet kurssin Teams-kanavalla (pyydä opettajalta pääsy jos et ole). Käytä students.oamk.fi-sähköpostiosoitetta kun kirjaudut Teamssiin
- Jokaisesta ryhmästä yksi luo kurssin Teams-kanavan ALAISUUTEEN (ei siis kokonaan uutta Teams-kanavaa) uuden YKSITYISEN alikanavan nimeltä:
- Kun ryhmän yksityinen Teams-kanava on luotu, lisää kanavalle ryhmän muut jäsenet. Lisää myös ohjaavat opettajat kanavan omistajaksi: Teemu Korpela, Pekka Alaluukas, Jukka Jauhiainen, Kari Jyrkkä, Teemu Leppänen ja Ville Majava
- Github käyttöön (Pekan tekemän organisaation alle): Pekan ohje
- Ryhmän jäsenet sopii alustavasti kuka tekee mitäkin toiminnallisuuksia (mutta ei niin, että vain yksi tekee koko Qt-työpöytäsovelluksen, että vain yksi tekee koko tietokannan jne.)
- Aloittakaa tekemään projektidokumenttia (pitää tehdä yhdessä). Pohja löytyy Teamsista. Tallentakaa oma versio ryhmän github-repositoryyn documents-hakemistoon.
- Aloittakaa tekemään teknistä määrittelydokumenttia (pitää tehdä yhdessä). Pohja löytyy Teamsista. Tallentakaa oma versio ryhmän github-repositoryyn documents-hakemistoon.
- Katsokaa yhdessä valmiiksi viikon 2+ tavoitteet
- Viikon luennot:
- Aloitusinfo kurssin tekemiseksi
- Asiaa Qt:stä, MySQL:stä ja C++:sta
- Ohjelmistotuotanto ja UML-mallinnus osa 1: Järjestelmäarkkitehtuuri, Käyttötapaukset, Tietosisältö
- Tämän viikon aikana pitää olla tehtynä:
- Projektisuunnitelma alulle
- Tekninen määrittely-dokumentti alulle
- Github repository käyttöön
- Yksityinen Teams-kanava luotu kurssin Teams-kanavan alle. Ryhmän jäsenet ja opettajat lisätty privaattikanavan omistajiksi
- Priorisoikaa backend (tietokanta ja API), jotta käyttöliittymän voi tehdä toimimaan suoraan sitä vasten
- Tietokannan ER-kaavio pitää olla ohjeiden mukaisesti tehtynä ja ohjaajan (Pekka tai Jukka) hyväksymä. Kevät 2025: ER-kaavio viedään GitHubiin docs-kansioon
- Tietokannan, rajapinnan ja käyttöliittymän suunnittelua ja tekemistä
- Qt-sovellus alulle
Täysin extraa, ei vaikuta arviointiin: Huom! tvt24spl ja tvt24spo: ei tarvitse Kanbania
- Githubissa Kanban käyttöön ja Kanban-taulu linkitettynä ryhmän oman Teams-alikanavan omaksi välilehdeksi
- Pilkkokaa tekemisiä ja toiminnallisuuksia Kanban-tauluun (ja muistakaa lisätä/päivittää taulua jatkuvasti)
Viikko 2
- Viikkopalaveri opettajan kanssa
- Esitelkää mitä dokumentteihin (projektisuunnitelma, tekninen määrittely) on kirjattu tähän mennessä
- Luento:
- Sovelluksen tekemistä
- Tämän viikon aikana pitää olla tehtynä:
- Ohjelmistokehityksen perusteet ja UML-mallinnus videot katsottuna: Soittolista luentotallenteista
- Projektisuunnitelma valmis.
- Tekninen määrittely osin tehtynä: Järjestelmäarkkitehtuuri, Käyttötapaukset, Tietosisältö
- CRUD-operaatioista demo
Viikko 3
- Viikkopalaveri
- Projektisuunnitelma kokonaan valmis
- Tekninen määrittely: Järjestelmäarkkitehtuuri, Käyttötapaukset, Tietosisältö valmiina
- Esitellään dokumentit
- Versiohallinnan esittely
- Luento:
- Kirjoita Github-projektille kuvaus markdownilla (readme.md-tiedosto). Github osaa prosessoida markdown-kieltä suoraan readme.md:stä HTML:ksi
- Sovelluksen tekemistä
- Tämän viikon aikana pitää olla tehtynä:
- Readme.md:n ensimmäinen versio repositorylle Githubissa
- Sovelluksen tekemistä
- Postmanilla API:n testaus jos API jo tehtynä
Viikko 4
- Viikkopalaveri
- Katso hetki joitakin livenä koodaavia striimaajia Twitchistä ja koita selvittää:
- Mikä/mitkä kielet käytössä? Jotain tiettyjä frameworkeja?
- Mikä IDE/editori?
- Näkyykö videolla jokin versionhallinta, projektityökalu jne. käytössä?
- Sovelluksen tekemistä
- Teknisen määrittelydokumentin tekemistä
- Tämän viikon aikana pitää olla tehtynä:
- Twitch-striimien vilkaisu
- Tekninen määrittelydokumentti eteenpäin
- Sovelluksen tekemistä
Viikko 5
- Viikkopalaveri
- Sovelluksen tekemistä
- Tämän viikon aikana pitää olla tehtynä:
- Tekninen määrittelydokumentti kokonaan valmiiksi
- Sovelluksen tekemistä
Viikko 6
- Viikkopalaveri
- Esitellään valmis tekninen määrittelydokumentti
- Versiohallinnan esittely
- Sovelluksen tekemistä
- Tämän viikon aikana pitää olla tehtynä:
- Projektille kirjoitettu markdown-muotoinen Readme-tiedosto Githubiin
- Sovelluksen tekemistä
Viikko 7
- Viikkopalaveri
- Sovelluksen tekemistä
- Demovideon valmistelu
- Ryhmä tekee yhdessä posterin englanniksi. Posteripohja löytyy Teamssista
- Ota posterista hyvälaatuinen kuvaruutukaappaus, lisää se kuvana Github-repositoryyn ja linkitä näkyväksi readme.md tiedostossa repositoryn etusivulla
- Tämän viikon aikana pitää olla tehtynä:
- Posteri valmiiksi ja Teamssiin
- Posteri Githubissa kuvana ja linkitetty readme.md:ssä repositoryn etusivulle
- Sovelluksen tekemistä
Viikko 8
- Demovideo projektista:
- Videon pituuden tulisi olla noin 5 minuuttia, missä ehtii yleensä näyttämään keskeiset osat applikaatiosta ja posterista.
- Videon on oltava julkisesti saatavilla ilman kirjautumista
- YouTubeen unlisted-videoksi (myös students.oamk.fi -tunnukset toimivat myös Youtubeen)
- Älä aseta videon lupaa “YouTube-sisältö lapsille”, koska se ei salli videon tallentamista YouTube-soittolistaan
- Linkkaa videon URL ryhmän Teams-kanavalle
- Luo 3-4 sivun PowerPoint- tai PDF-dokumentti tukemaan videon esitystä. Dokumentissa tulisi olla vähintään:
- Mitkä olivat projektin tavoitteet
- Ketkä osallistuivat projektiin ja mitä he tekivät (suunnilleen)
- Mikä oli hyvää, mikä oli huonoa
- Esitä dokumentin sisältö videon alussa
- Kaikkien ei välttämättä tarvitse puhua videolla (mutta toki saa)
- Esittele mahdollinen Kanban
- Näytä posteri videon lopuksi
- Lisää PowerPoint- tai PDF-dokumentti Github-repositoryyn
- Esittele pankkiautomaattiprojekti
- Loppuesitykset koko luokalle (osallistumispakko)
- Ohjelman demonstrointi ja vapaata keskustelua
- Posterin esittely
Tee tunnus O'Reillyn verkkokirjastoon students.oamk.fi:n sähköpostilla: https://libguides.oulu.fi/oreilly ja valitse institution not listed. Tuo on kaupallinen palvelu, mihin Oamkin kirjasto on ostanut pääsyn. Kannattaa käydä selailemassa tuota online-kirjastoa muutenkin.
Aika tunnettuja ja arvostettuja ohjelmistotekniikan kirjoja. Enemmistö näistä kirjoista suoraan tästä tweetistä:
Qt-aiheiset (ei tiedoa laadusta):
Node.js (ei tieto laadusta):
Linux-aiheiset (ei tieto laadusta):
UML (ei tietoa laadusta):
API (ei tietoa laadusta):
MySQL (ei tietoa laadusta):
Projektityön kuvaus
Työn aihe on pankkiautomaatti
Ohjelmiston rakenne on seuraava

Työ sisältää
- Tietokannan (MySQL/MariaDB)
- REST APIn (Node.js/Express.js)
- Pankkiautomaattisovelluksen (Qt työpöytäsovellus, jossa käytetään Qt Network moduulia)
Huom! Edellä mainitut kuuluvat kurssin sisältöön ja arviointi perustuu niiden osaamiseen, joten millään muilla tekniikoilla noita ei saa korvata.
Sovelluksen toiminta
- Qt-sovellus kommunikoi REST APIn kanssa http-protokollan avulla.
- REST API hoitaa kommunikoinnin tietokannan kanssa.
ARVIOINTI
Arviointi perustuu tähän dokumenttiin. Mikäli ristiriitaista tietoa esiintyy, niin tämä dokumentti on se, jota noudatetaan.
Huom! Monimuotoryhmissä ei käytetä kortinlukijaa, vaan aloitusikkunasta avataan Tunnuksen syöttökäyttöliittymä painiketta painamalla, jossa annetaan PIN-koodin lisäksi kortin-id.
Vähimmäisvaatimukset sovellukselle (arvosana 1)
- Debit kortti toteutettava (ei luottoa, saldo ei saa mennä miinukselle)
- Qt-sovelluksen aloituskäyttöliittymä
- Kortinlukijan käyttö ja PIN-koodin syöttö
- Oikealla PIN-koodilla pääkäyttöliittymä, väärällä uudelleenkysely
- Saldo tarkastelu
- Rahan nosto: 20, 40, 50 tai 100 €
Vähimmäisvaatimukset (arvosana 2)
- PIN-koodin syöttöraja 10 sekuntia
- REST API kattaa kaikki automaatin toiminnot
Hyvän arvosanan vaatimukset (arvosana 3)
- Kortti voi olla joko debit tai credit
- Credit-kortilla nosto luottorajan puitteissa
- Vapaavalintaisen summan nosto
- 10 viimeisintä tapahtumaa nähtävillä
- 3 väärää PIN-koodia lukitsee kortin (ei tallenneta tietokantaan)
Hyvän arvosanan vaatimukset (arvosana 4)
- Korttilukitus tallennetaan tietokantaan
- 30 sekunnin inaktiivisuus palauttaa alkutilaan
- Tilitapahtumien selaus (eteen/taakse, 10 kerrallaan)
Kiitettävän arvosanan vaatimukset (arvosana 5)
- Kaksoiskortit (debit + credit samassa)
- Kirjautuessa valinta: debit vai credit (vain jos molemmat ovat käytössä)
- Tilakaavio luotu
- Lisäominaisuus sovittava ohjaajan kanssa
Arvosanaa alentavia seikkoja
- Dokumentoinnin puutteet
- MVC-mallin noudattamatta jättäminen backendissä
Vaatimukset tietokannalle
Ilman credit-kortti ominaisuutta
- Useita tilejä asiakkaalla
- Yhdellä tilillä yksi omistaja
- Asiakkaalla voi olla tili ilman korttia
- Useita kortteja asiakkaalla, mutta yksi kortti → yksi tili
- Asiakastiedoissa: etunimi, sukunimi, osoite
- PIN-koodi hashattuna (bcrypt)
Kun toteutetaan credit-kortti ominaisuus
- Credit-korteilla pitää olla luottoraja
Kun toteutetaan kaksoiskortti
- Kortilla pääsy useaan tiliin (debit ja credit)
Lisäominaisuuksia tietokannalle
- Asiakkaalla käyttöoikeus toisen omistajan tilille
Opiskelijan arviointi
- Sovelluksen arvosana
- Vertais- ja itsearviointi
- Ohjaajien näkemys
- Githubin informaatio
Arvioinnin kohteet
- Ryhmätyöskentely
- Itsenäinen työ
- Projektisitoutuminen
- Qt-ohjelmointi
- REST API -ohjelmointi
- Tehtävien vaikeustaso
- Gitin käyttö
Lisäominaisuusideoita
Kuvan lataus ja näyttäminen
- Kuvan lataaminen backendiin ja näyttäminen Qt-sovelluksessa. Tämä on kokonaisen arvosanan arvoinen.
Idean esittelyvideo: https://www.youtube.com/watch?v=DlKRlZTNYl8
Toimintaperiaate:
- Tietokanta taulussa on tekstikenttä, johon tulee kuvan nimi (esim.
aku.jpg).
- Kuva ladataan REST APIn kansioon (yleensä
public-kansioon).
- Kuva kansioon pitää päästä esim. selaimella.
- Qt-sovelluksessa kuva näytetään
Label-komponentissa.
REST APIssa voi käyttää Multer-moduulia.
Swagger dokumentointi
Tämä on kokonaisen arvosanan arvoinen.
Idean esittelyvideo: https://www.youtube.com/watch?v=M6Fj5Y2K24w
https://www.npmjs.com/package/swagger-ui-express
Logitus
- Tapahtumien logittaminen backendissä ja niiden näyttäminen jollakin tavalla (
morgan-moduuli). Pelkkä logitus on aika helppo, joten sen vaikutus n. 0,5. Mutta jos keksitte siihen jotain lisää, niin sitten isompi vaikutus.
WebSocket
Toteutetaan WebSocketeilla jokin toiminto sovellukseen.
Idean esittely: https://youtu.be/QGnv7s0JIIo
Docker
Sovelluksen ajaminen Dockerissa. (vaikutus arvosanaan 1)
Testien lisääminen backendiin
Esimerkiksi jest ja supertest (vaikutus arvosanaan 1)
Esittelyvideo: https://youtu.be/HEZufcp2umI