Ohjelmistokehityksen sovellusprojekti (monimuoto ryhmät)
Oikopolut eri viikoille
Ohjaajien kommentteja ja vinkkejä
Projektista
- Minimikomponentit:
- Tietokanta (MySQL)
- Node.js-rajapinta (API) MySQL-tietokantaan
- Käyttöliittymä (Qt-työpöytäsovellus C++:lla)
- 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
Opiskelijan arviointi perustuu:
- Aikataulussa pysyminen. Työtä pitää tehdä järjestelmällisesti. Viikkoraportointi vaaditaan!
- Ryhmän tuottaman sovellukseen tasoon (kts. Sovelluksen arviointi)
- 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:
- Arvosanaan 5 vaaditaan lisäominaisuuksia (arvosanaa korottavat lisätehtävät on määritelty tarkemmin kohdassa “Yleisohje ja arviointi”). Katso Yleisohje ja arviointi
Extratehtäviä (erityisesti monimuoto-opiskelijat, joilla on jo Linux-kurssi käytynä). Nämä eivät korota arvosanaa:
- 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)
- 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ä
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.
Sovelluksen 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 PIN-koodinkyselykä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 avautuu pääkäyttöliittymä, väärällä uudelleenkysely
- Saldo tarkastelu
- Rahan nosto: 20, 40, 50 tai 100 €
- Näytetään 10 viimeisintä tilitapahtumaa
Vähimmäisvaatimukset (arvosana 2)
- PIN-koodin syöttöraja 10 sekuntia (jos koodia ei anneta 10 sekunnin aikana palataan aloituskäyttöliittymään)
- REST API:in toteutettu kaikkien tietokanta-taulujen CRUD-operaatiot (vaikkei niitä tarvita pankkiautomaatissa)
Hyvän arvosanan vaatimukset (arvosana 3)
- Kortti voi olla joko debit tai credit
- Credit-kortilla nosto luottorajan puitteissa
- Vapaavalintaisen summan nosto (automaatissa 20 ja 50 € seteleitä)
- 3 väärää PIN-koodia lukitsee kortin (ei vaadita tallennetamista tietokantaan)
Hyvän arvosanan vaatimukset (arvosana 4)
- Korttilukitus tallennetaan tietokantaan (eli lukitus säilyy vaikka sovellus käynnistetään uudelleen)
- 30 sekunnin inaktiivisuus palauttaa alkutilaan (jos käyttäjä ei tee mitään 30 sekunnin aikana, palataan aloituskäyttöliittymään ja kaikki muut ikkunat suljetaan)
- Tilitapahtumien selaus (eteen/taakse, 10 kerrallaan)
Kiitettävän arvosanan vaatimukset (arvosana 5)
- Kaksoiskortit (debit + credit samassa kortissa)
- Kirjautuessa valinta: debit vai credit (vain jos kyseessä kaksoiskortti)
- Tilakaavio luotu
- Lisäominaisuus sovittava ohjaajan kanssa
(Huom! Kaksoiskortti on kytketty kahteen eri tiliin, joista toinen on debit-tili ja toinen credit-tili)
Tiivistelmä arvosanoille
| |
1 |
2 |
3 |
4 |
5 |
| Debit kortti |
x |
x |
x |
x |
x |
| Credit kortti |
|
|
x |
x |
x |
| Kaksoiskortti |
|
|
|
|
x |
| Kortinlukija toimii |
x |
x |
x |
x |
x |
| Kirjautuminen PIN-koodilla |
x |
x |
x |
x |
x |
| Saldon näyttö |
x |
x |
x |
x |
x |
| Rahan nosto (20,40,50,100) |
x |
x |
x |
x |
x |
| Rahan nosto (muu summa) |
|
|
x |
x |
x |
| Tilitapahtumien näyttö |
x |
x |
x |
x |
x |
| PIN-koodille 10 s timer |
|
x |
x |
x |
x |
| Kaikki CRUD-operaatiot |
|
x |
x |
x |
x |
| PIN-lukitus istunnolle |
|
|
x |
x |
x |
| PIN-lukitus tietokantaan |
|
|
|
x |
x |
| 30 s timerit |
|
|
|
x |
x |
| Tilitapahtumien selaus |
|
|
|
x |
x |
| Tilakaavio |
|
|
|
x |
x |
| Lisäominaisuus |
|
|
|
|
x |
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 (credit-korteille ei tarvita erillistä taulua, jos debit-korteille laitetaan luottorajaksi nolla)
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 (vaikutus arvosanaan 1)
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
- Lisätään sovellukseen swagger-sivu (vaikutus arvosanaan 1)
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 (vaikutus arvosanaan 1).
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
CI/CD
- Jonkinlainen yksinkertainen CI/CD tai ainakin CD (esim. käännetyn tuotoksen “releasen” automatisointi Githubiin tai toiselle palvelimelle ladattavaksi vaikka Github actioneilla)
(vaikutus arvosanaan 1)
Verkkopankin toteuttaminen
- Verkkopankin toteuttaminen (vaikutus arvosanaan 1)
Ylimääräinen Qt-sovellus
- Qt-sovellus pankin henkilökunnalle. Sovelluksella voidaan esimerkiksi luoda uusia asiakkaita, tilejä ja kortteja jne.
Viikko 1
- Aloitusinfo
- Luodaan ja numeroidaan neljän opiskelijan ryhmät
- Jokainen opiskelija luo tunnuksen itselleen sivustolla
https://peatutor.com/project_app/register/tvt25kmo.
(Luotuasi tunnuksen, saat sähköpostin, jossa on tunnuksesi ja salasanasi. Pidä ne tallessa.)
- 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 ja Pekka Alaluukas
- 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) 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
- Laadi vastaava taulukko kuin kohdassa Tiivistelmä arvosanoille ja rastita siihen oman toteutuksen suoritetut tehtävät
- 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):
Projektin alustaminen
📺 Voit katsoa ohjevideon osoitteesta:
https://www.youtube.com/watch?v=_lfn6vsrOJY
1. Repositoryn alustaminen
Yksi ryhmän opiskelijoista alustaa GitHub-repositoryn seuraavasti:
# Kloonaa repon omalle koneelleen
git clone <repository-url>
cd groupx # jossa groupx on kloonattu kansio ja x oman ryhmän numero
git checkout -b initialize
2. Backendin alustaminen
Anna groupx kansiossa seuraavat komennot
mkdir backend
cd backend
npx express-generator --no-view
npm install
3. Qt-sovelluksen alustaminen
- Käynnistä Qt Creator
- Luo Qt Widget -tyyppinen sovellus, jonka nimeksi
bank-automat
- Tallenna sovellus kansioon
groupx
- Käännä sovellus
- Tarkista, että
bank-automat-kansion alle ilmestyi build-kansio
- Jos
build-kansiota ei ilmesty:
4. .gitignore-tiedoston luominen
Luo tiedosto projektikansion groupx juureen ja kirjoita siihen seuraavat rivit:
backend/node_modules/
bank-automat/build/
bank-automat/*.user
.qtcreator/
5. Muutosten lisääminen ja pushaaminen
Suorita komennot kansion groupx juuressa:
git add .
git commit -m "projekti alustettu"
git push origin initialize
6. Tarkistukset GitHubissa
Varmista, että GitHubissa näkyy seuraavat kansiot:
✅ backend
✅ bank-automat
Ja että seuraavat eivät ole GitHubissa:
❌ backend/node_modules
❌ frontend/build
❌ frontend/xxx.user
7. Pull Request
- Jos kaikki edellä meni oikein, tee Pull Request
- Pyydä jotain muuta ryhmän jäsentä hyväksymään PR ja yhdistämään
initialize branchin mainiin
8. Branchin yhdistämisen jälkeen
Henkilö, joka teki alustusvaiheet
git checkout main
git pull origin main
- ja tämän jälkeen hän luo oman branchin
Muut ryhmän jäsenet
- kloonaavat repositoryn
- luovat oman branchin