Osaan nyt ohjelmoida kohtalaisen hyvin mutta en viellä ole oikein hahmottanut miten ohjelmaa tulisi lähestyä. Otetaan esimerkki. Olen tekemässä blackjack peliä. Aluksi suunnittelisin paperille mitä ohjelman tulee toteuttaa. Sitten siirtäisin touteutuksia luokkiin. Kaiikki siis paperilla. Nyt rupeaisin kehittämään ohjelmaa. Teen ohjelman valmiiksi mutta huomaan että rajapinnat prantaisi koodin lukevuutta. Lisään ne jälkeenpäin. Mitä siis sanotte eli kannattaako ohjelma suuunnitella todella tarkasti ennen toteutusta vai tehdä pohja jota muokkaa sitä mukaa kun ideoita tulee?
Taisin kuulostaa vähän sekavalta. Mutta siis kysymyksenä oli miten lähestyt ohjelman ohjelmointia?
Jos on vähääkään monimutkaisempi ohjelma/ohjelmisto teen ainakin ER-mallin kyseisestä ohjelmasta.
Niihin lisään sitten rajapinnat/tietokannan. Sen jälkeen yleensä ongelman ratkaisu onkin koodaamista vaille valmis.
Taitaa oma lähestymistapani olla hivenen vanhahtava ?
Pyrin saamaan mahdollisimman nopeasti aikaiseksi yksinkertaisen ohjelman, jonka voi suorittaa. Jos käytän itselleni vierasta kieltä, ensimmäinen vaihe on luonnollisesti Hello World ja ehkä triviaali yksikkötesti. Tutun kielen kanssa minulla on tähän valmis runko, jonka kloonaan gitillä.
Blackjack-peliä voisi kehittää ominaisuus kerrallaan esimerkiksi näin:
1. Hello World
2. Tulostetaan kaksi satunnaista korttia ja niiden summa.
3. Nostetaan kortit samasta pakasta, joten 9-9 on epätodennäköisempi kuin 9-10.
4. Toteutetaan sääntöjen mukaan pelaava jakaja ja tulostetaan yhden jaon tulos.
5. Lisätään "ihimispelaaja", jolle jaetaan 2 korttia. Niiden summaa verrataan jakajan tulokseen.
6. Lisätään ihmispelaajalle mahdollisuus pyytää uusi kortti tai lopettaa.
7. Jaon jälkeen kysytään, haluaako käyttäjä pelata lisää (samasta pakasta) vai lopettaa ohjelman. Jos pakassa on liian vähän kortteja jäljellä, aloitetaan uusi pakka.
Seuraavaksi voisi lisätä panokset, splittauksen ja muita sääntöjä, useamman ihmispelaajan, tekoälyvastustajan, GUI:n jne.
Koodin ei tarvitse olla erityisen siistiä tai pitkälle suunniteltua. Aluksi kortti voi olla pelkkä kokonaisluku ja käsi lista kokonaislukuja, mutta näille voi lisätä omat luokat siinä vaiheessa kun se helpottaa koodausta. Kaikki koodi voi olla aluksi yhdessä tiedostossa. Isojakin refaktorointeja pitää olla valmis tekemään, kun huomaa että on tehnyt huonoja valintoja. Koodin uudelleenkirjoittaminen muutamaan kertaan opettaa paljon, ja voi hyvin johtaa parempaan tulokseen lyhyemmässä ajassa kuin valtavat etukäteen tehdyt suunnitelmat.
Liiallinen suunnittelu johtaa omissa projekteissani hyvin usein siihen, etten koskaan pääse edes alkuun. Pienien iteraatioiden toteuttaminen on kivaa ja motivoivaa, koska tuloksen näkee heti. TDD:n tai normaalin yksikkötestauksen lisääminen kehitysprosessiin on myös luontevaa, jos sellaisesta tykkää.
Harrastusprojekteja voi olla käynnissä vaikka kuinka monta. Useimmat ovat yleensä tauolla odottamassa oikeanlaista innostusta. Jos projektin jättää aina tilanteeseen, jossa koodi toimii mutta README:ssä on lista puuttuvista ominaisuuksista, siihen on todella helppo palata ja kehittää eteenpäin kun siltä tuntuu. Mutta jos projekti ei ole koskaan ollut mitään muuta kuin kasa hienoja suunnitelmia, parin vuoden tauon jälkeen niillä tuskin tekee mitään.
jlaire toi sun lähestymis tapa vaikutti hyvältä. Itsellä kun on saman laisia ongelmia että kyllästyy varsinkin jos mitään ei aikaiseksi saa. Tässä tavassa saa onnistumisen tunteita kokoajan kun suorittaa pieniä tehtäviä.
Varmaankin Blackjackiin löytyy avoimen koodin projekteja, joista voi ottaa toimivia koodinpätkiä omaan ohjelmaan.
Jaska kirjoitti:
(07.04.2016 20:26:53): Varmaankin Blackjackiin löytyy avoimen koodin...
Ja menettää löytämisen sekä onnistumisen ilo ja muuttua kopypastekoodariksi muiden joukossa :P
Blackjackista on niin mahdottoman monta erilaista toteutusta olemassa, että jos sellaista lähtee tekemään jostain muusta syystä kuin puhtaasti oppimisen ilosta, ja mielestään oman pelin kantava idea on muita paremmassa käyttöliittymässä, niin en tuhlaisi silloin aikaa pelilogiikan tekemiseen. Joskus tekemistä tärkeämpää on saada projekti valmiiksi ja mielellään säällisessä ajassa. Kun lataa pelilogiikan valmiina kirjastona, niin silloin oppii myös hyviä koodaamiskäytäntöjä, kun työstää käyttöliittymää erillään varsinaisesta pelimoottorista eikä sotke näiden kahden koodia yhteen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.