<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	>

<channel>
	<title>portfoliokysymykset &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/portfoliokysymykset/</link>
	<description>Feed of posts on WordPress.com tagged "portfoliokysymykset"</description>
	<pubDate>Sun, 12 Oct 2008 10:34:01 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Ohjelmoinnin logiikkaa]]></title>
<link>http://studiovompatti.wordpress.com/?p=97</link>
<pubDate>Thu, 21 Feb 2008 09:42:29 +0000</pubDate>
<dc:creator>streg</dc:creator>
<guid>http://studiovompatti.fi.wordpress.com/2008/02/21/ohjelmoinnin-logiikkaa/</guid>
<description><![CDATA[Ohjelmointia voi opiskella monella tapaa. Itsenäisesti, opastetusti, kirjoista, netistä, kokeilema]]></description>
<content:encoded><![CDATA[<p class="MsoNormal">Ohjelmointia voi opiskella monella tapaa. Itsenäisesti, opastetusti, kirjoista, netistä, kokeilemalla, arvailemalla tai vaikka kaverilta kysymällä. Tapoja oppia ohjelmointia on monia, mutta tärkein niistä on mielestäni kuitenkin itse tekeminen ja kokeileminen. Kirjoista<span>  </span>voi nimittäin oppia syntaksin ja apinamaisesti tapoja ratkaista yleisimpiä ongelmia joita voi ohjelmoidessa tulla vastaan, mutta paraskaan kirja ei voi opettaa sitä tapaa ajatella joka vaaditaan ohjemoinnin ymmärtämiseen. Tämä toimintatapa ja ajatusmaailma ongelmien ratkaisemiseen tietokoneiden avulla syntyy vain niiden mahdollisuuksia kokeilemalla kun pyrkii itsenäisesti ratkaisemaan eteen tulleita ongelmia.</p>
<p class="MsoNormal">Ohjelmoinnissa syntaksit ja esimerkiksi metodien nimien mistaminen on siis vain erittäin pieni osa kokonaisuutta, vaikka jotkut varmasti kuvittelevatkin ohelmoimisen olevan juuri ohjelmakoodin kirjoittamisen osaamista. Syksyn aikana oli hauska seurata kuinka tietokoneiden ja ohjelmoinnin karu logiikka kuritti välillä pahaa-aavistamattomia fukseja. Itse ”luonnonmenetelmällä” kasvaneena nörttinä ei aina muista kuinka erilainen rakennuspalikkoina<span> </span>ykkösiä ja nollia käyttävä looginen kokonaisuus oikeastaan onkaan. Ainoa mikä voi oikeastaan valmistaa koodin kurimukseen on ehkä matematiikka, sillä ohjelmointi on pohjimmiltaan erilaisten ongelmien ratkomista juuri matematiikan ja logiikan keinoin.</p>
<p class="MsoNormal">Mielenkiintoisa ohjelmoinnista tekee sen erittäin yksinkertainen säännöstö. Ohjelmoidessa voi periaatteessa vain<span>  </span>tallentaa numeroita erilaisiin muuttujiin ja taulukoihin, viitata muisitissa olevaan tietoon ja suorittaa erilaisia tätä tietoa manipuolivia komentoja sarjassa ja erilaisissa loopeissa. Ohjelmoinnin onnistuessa näkee työnsä tulkoset, eli ajatustoimintansa tulokset puhtaana lopputuloksena ilman kehon fyysisiä rajoitteita. Ohjelmat tekevät juuri sitä mitä haluat niiden tekevän, tai sitten jotain aivan muuta.  Karnaveneet taas eivät lopulta useinkaan vastaa alkuperäistä mielikuvaa. Lisäksi on kierolla tavalla kiehtovaa saada ratkoa erilaisia ongelmia mahdollisimman elegantilla tavalla. Vaikka kukaan ei näe tekeekö ohjelmasi 10 vai 1000 looppia jonkun ongelman ratkaisemiseksi, tulee täydellisestä ratkaisusta silti hyvä mieli. Tavoitelähtöisys tulisi mielestäni kuitenkin aina pitää mielesä. Joillain ihmisillä ohjelmoinnista tulee nimittäin <span> </span>itse tarkoitus ja he haluavat tehdä kaiken itse, vaikka vastaava tai parempikin ratkaisu olisikin jo olemassa.</p>
<p>Ohjelmoinnin logiikka on mielestäni samoilla linjoilla niinsanotun ”insinöörilogiikan” kanssa. Ja kuten insinöörimäisyyskin, ohjelmoinnin logiikka tarttuvaa. Siihen jää koukkuun.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Minkä tyylinen oppija olen? Minkälainen tapa oppia ohjelmointia sopii itselleni?]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/21/minka-tyylinen-oppija-olen-minkalainen-tapa-oppia-ohjelmointia-sopii-itselleni/</link>
<pubDate>Mon, 21 Jan 2008 14:55:47 +0000</pubDate>
<dc:creator>Henri Heinola</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/21/minka-tyylinen-oppija-olen-minkalainen-tapa-oppia-ohjelmointia-sopii-itselleni/</guid>
<description><![CDATA[Toinen kymmenen tärkeyspisteen otsikko yllä. Varsinkin ensimmäinen kysymys on jokaiselle opiskeli]]></description>
<content:encoded><![CDATA[<p>Toinen kymmenen tärkeyspisteen otsikko yllä. Varsinkin ensimmäinen kysymys on jokaiselle opiskelijalle ja jopa ihmiselle tärkeä asia, jonka keksimiseen voi mennä kauankin aikaa. Jälkimmäinen kysymys tarkentaa ensimmäistä, joten rajaan tämän kirjoituksen aiheen ohjelmoinnin opiskeluun.</p>
<p>Olen aina ollut hirveän laiska opiskelemaan mitään itselleni vähänkään tylsää tai vastenmielistä. Ohjelmointi lukeutuu molempiin kategorioihin. Siksi kurssilla olevat  teoriatehtävät ovat olleet tuskallisia tehdä, vaikka niistä läpi selvisinkin. Itse ohjelmointi menee ihan hyvin, ja koen oppivani sitä nopeimmin kokeilemalla. Kurssikirjaa en ostanut, vaan lainasin kirjastosta, mutta se maksoi minulle 11 euroa, koska kaksi kertaa unohdin uusia lainan ja sainpa tilille hetkeksi lainauskiellonkin. :)</p>
<p>Itse asioista selvää ottaminen on raskasta ja aikaavievää. Varsinkin graafisiin käyttöliittymiin liittyvät asiat ovat tämän vuoksi olleet minulle raskaita. Sadat valmiit luokat ja niiden tuhannet metodit ja niistä sopivimpien etsiminen ja löytäminen ovat varmasti alkukynnyksen ylittymisen jälkeen käteviä käyttää, mutta minulle opettelun henkinen muuri on liian korkea ylitettäväksi - tai ainakin on ollut tähän asti.</p>
<p>Pidän vihjeiden perusteella tekemisestä, ja siksi olenkin aina nauttinut Studio1-kurssin ohjelmointiosan tehtäväkierroksista, joissa kerrotaan, missä järjestyksessä asiat kannattaa tehdä ja miltä niiden tulee näyttää. Jopa käytännön toteutukseen saa vähän apua, tai ainakin on kerrottu, mistä aiheeseen liittyvää teoriaa kannattaa opiskella. Varsinkin tänä vuonna vihjeet olivat tehtävänantojen välittömässä yhteydessä, mikä auttoi omaa keskittymistä ja opiskelua paljon. Minulle yhdessä tekeminen on aina ollut mieluisaa, mutta Studio1-kurssin suuresta yhteisöllisyydestä huolimatta ohjelmoimisesta on jäänyt vähän negatiivinen kuva "yksinäisen puuhasteluna".  Ehkä siksikään ohjelmointi ei ole minun lempitekemistäni, etten usko koskaan haluavani tehdä tai suunnitella ohjelmia käytännön tasolla.</p>
<p>OLOsessioissa on hyvä idea, pienryhmäoppiminen ja asioiden pureskelu yhdessä, mutta sen toteutus on mielestäni itselleni sopimaton. Olisi hyvä, jos tilaisuudessa olisi puheenjohtajana asioista eniten tietävä, jolta olisi helppo kysyä mitä tahansa  mieleen tulevaa ongelmaa. Tällä hetkellä OLOsessiot ovat ryhmäläisten yhteistä pohtimista asioista, joista assistentit jo valmiiksi tietävät erittäin paljon mutta ovat taka-alalla.  Itselleni voisi sopia paremmin suorempi "tässä aihe, lähdetään purkamaan tällä tavalla" -lähestyminen kuin Post-it -laput, tussit ja seitsemän tuskaista askelta. Myös se, että tapaamisen puheenjohtajaksi joutuu joku tehtävään sopimaton tai sitä haluamaton henkilö, on mielestäni aivan turhaa. Jos tapaamisen perusideassa on mielestäni joku virhe, asioiden omaksuminen ja niistä keskusteleminen vaikeutuvat minulle henkilökohtaisesti aika paljon. Itselleni sopisi ehkä parhaiten, että asiat käytäisiin läpi yhdessä ja pienryhmätasolla mistä tahansa asiasta voisi herättää keskustelua, jos ei ymmärrä tai haluaa lisäselvitystä. Keskusteluun voisivat osallistua kaikki, mutta sitä johtaisivat assistentit käytännönläheisin esimerkein. Tähän suuntaan ollaan ymmärtääkseni oltu muutama viime vuosi siirtymässäkin.</p>
<p>Tentissä huomasin, että ensimmäisten kahden osan teoriat eivät olleet ollenkaan tarvittavalla tavalla hallussa, mutta se oli odotettavaakin laiskasta lukemisesta johtuen. Tämä kaikki heijastui myös ohjelmointitehtäviin, joissa kesti aina aikansa opiskella tulevaa teoriaa ennen kuin pääsi kunnolla vauhtiin. Tekemällä teoriatehtävät kunnolla olisi ehkä säästänyt joissain ohjelmointiharjoitusten asioissa, mutta oppinut ehkä paljon sellaistakin, jota ohjelmointiharjoituksissa ei suoranaisesti tarvinnut. Minulle hieman vastenmielisen aihepiirin asiat eivät motivoineet tarpeeksi opettelemaan kaikkia asioita kunnolla.</p>
<p>Itselleni siis ohjelmoinnin opiskeluun sopivat parhaiten yhdessä tekeminen ja avoin keskustelu asioista enemmän tietävien kanssa, sekä käytännön kokeileminen ja itse tekeminen. Asioiden opettelu ennakkoon oppikirjoista tai nettiartikkeleista ei välttämättä ole se omin juttu, vaikka se varmasti paljon olisi oppimista helpottanutkin.</p>
<p>-Henri</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Miten kurssia voisi parantaa?]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/21/miten-kurssia-voisi-parantaa-2/</link>
<pubDate>Mon, 21 Jan 2008 14:54:53 +0000</pubDate>
<dc:creator>Henri Heinola</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/21/miten-kurssia-voisi-parantaa-2/</guid>
<description><![CDATA[Aah.. The mother of all questions. Not.  Mutta kuitenkin tärkeä asia.
Koska uusien opiskelijoiden ]]></description>
<content:encoded><![CDATA[<p>Aah.. The mother of all questions. Not.  Mutta kuitenkin tärkeä asia.</p>
<p>Koska uusien opiskelijoiden ensimmäinen syksy perinteisesti kuluu lähes kokonaisuudessaan tietokoneen äärellä ohjelmointia opetellessa, opetusajan maksimaalinen hyödyntäminen on mielestäni erittäin oleellinen asia. Olin itse Studio1-kurssilla ensimmäistä kertaa jo kaksi vuotta sitten. Kurssi on mielestäni muuttunut aika paljonkin silloisesta. Me emme tehneet ollenkaan tenttiä, blogin paikalla oli jokaisen henkilökohtainen portfolio, ohjelmointitehtäviä oli nykyisen kuuden sijasta viisi, bottiturnausta ei ollut, kumpaakaan turnausta ei arvosteltu, OLOsessioiden opetuksen taso oli heikompaa ja ainakaan muistaakseni projektityölle ei oltu varattu ohjattua opetusta joululoman aikana.</p>
<p>Lähes kaikki uudistukset ovat mielestäni parannuksia menneeseen, mutta käytännön pikkuasioita voisi viilata. Jos ohjelmointitehtävien keskiarvo on melkein neljä, mutta tentistä jaetaan sääliykkösiä, pitää mielestäni miettiä. Ovatko vaatimukset linjassa ohjelmointitehtävien vaatimusten kanssa, vai onko ohjelmointitehtäviä tehty yhteistyössä niiden muutamien asiat oikeasti parhaiten hallinneiden kanssa? Jos ohjelmointi- ja teoriatehtävien keskiarvot kohoavat lähelle nelosta, mutta tenteissä on havaittavissa selkeä kahtiajako osaajiin ja osaamattomiin, on joku pielessä.</p>
<p>Mielestäni tentin osuutta kurssin arvostelusta kannattaisi nostaa korkeammaksi, ja vaikeammin arvosteltavissa olevien asioiden, kuten näiden blogikirjoitusten sekä robo- ja bottiturnauksen arvostelun osuutta pienentää tai poistaa kokonaan. Tentin arvosanan tulisi mielestäni olla suoremmin linjassa koko kurssin arvosanan kanssa, koska samaa menetelmää käytetään muutenkin yleisesti koulumme kursseilla. Toisaalta ennen kurssia arvottujen ryhmien töiden oikeudenmukainen arvosteleminen on ongelmallista, koska riittää, että ryhmässä on yksi ohjelmointimestari, joka tekee tehtävän valmiiksi ja muut hoitavat dokumentointiosuuden. Jos ryhmään ei ohjelmointimestaria satu, on se huonompi juttu.</p>
<p>Kun mietin, kumpi oli parempi idea, tehdä portfolio vai kirjoittaa yhteistä blogia, en päässyt selvään lopputulokseen. Portfoliota tehdessä kenenkään ei tarvitsisi vaivata päätään sillä, miten muiden ryhmäläisten panos vaikuttaa omaan kurssiarvosanaan, mutta toisaalta olen ymmärtänyt, että ohjelmointi suuremmassa mittakaavassa yleensä on ryhmätyötä, jossa ryhmällä on yhteisiä tavoitteita ja vastuita.  Toisaalta portfoliota tehdessä saa harjoitusta html:n käytöstä, saa itse päättää, minkälainen toteutuksesta tulee ja pääsee ehkä enemmän toteuttamaan itseään muuten kuin verbaalisesti. Blogissa on helppo seurata, minkälaisissa tunnelmissa muut ryhmäläiset kurssia suorittavat, ja kertoa omia mielipiteitään muille. Yhteisessä vastuussa on taas arvosteluongelmansa, vaikka blogi arvioidaan osaksi henkilökohtaisestikin. Tässä ryhmädynamiikkaa testataan toki eri tavalla kuin robo- ja bottiturnauksissa, sillä ei riitä, että yksi kirjoittajamestari hoitaa homman, kun muut katselevat vieressä, vaan ainakin melkein koko ryhmän panosta tarvitaan blogin onnistumiseen. Tämän vuoksi blogi sopii ryhmässä arvosteltavaksi kokonaisuudeksi mielestäni huomattavasti robo- ja bottiturnausta paremmin.</p>
<p>Ohjelmointitehtävien lisääminen yhdellä ei uskoakseni vaikuttanut kovin oleellisesti kurssin kokonaistyöläyteen, mutta graafisten käyttöliittymien osuuden lisääminen yhdestä viidesosasta yhteen kolmasosaan kurssin ohjelmointitehtävien sisällöstä on mielestäni huippu-uudistus! Vieläkin koen itselleni henkiseksi esteeksi graafisten käyttöliittymien tekemisen, sillä hyppäys valmiiden luokkien hyödyntämisen maailmaan tuntuu liian suurelta.</p>
<p>OLOsessiot, nuo ainaiset henkilökohtaiset riippakiveni, ovat minun nähdäkseni edelleen kurssin "löysin" osa.  Jos nuo kymmenisen kaksoistuntia vaihdettaisiin vaikka yhdessä ohjelmoimiseksi niin, että edelleen pienryhmissä yksi assari kerrallaan tekisi konkreettisia mallitehtäviä yhdessä ryhmän kanssa, luulen, että saavutettava hyöty olisi moninkertainen verrattuna nykyiseen. Saataisiin kaksinkertainen määrä opetusta ja konkreettisia esimerkkejä siitä, miten kannattaa tehdä ja miten ei, kun nykyään sessioissa istutaan tuppisuina ja kirjoitellaan post-it -lapuille mielestäni aivan turhanpäiväisiä asioita, kun konkreettinen oppiminen jää todella vähäiseksi.</p>
<p>Kokonaisuudessaan kurssi on mainio paketti, ja varsinkin ohjelmointitehtävät ovat erittäin mielenkiintoisia. Edellä pohdiskelemillani asioilla voisi ehkä viilata toimivamman ja tehokkaamman ratkaisun, mutta varmasti käytännön muutoksia tarvitsisi miettiä tarkkaan ennen toteuttamista.</p>
<p>-Henri</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Miksi eri näkyvyysmääreitä tarvitaan?]]></title>
<link>http://stud13.wordpress.com/2008/01/20/miksi-eri-nakyvyysmaareita-tarvitaan/</link>
<pubDate>Sun, 20 Jan 2008 21:58:04 +0000</pubDate>
<dc:creator>Moona</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/miksi-eri-nakyvyysmaareita-tarvitaan/</guid>
<description><![CDATA[Eri näkyvyysmääreitä käytetään eri tilanteissa: Määre public näkyy kaikille. Private näky]]></description>
<content:encoded><![CDATA[<blockquote>Eri näkyvyysmääreitä käytetään eri tilanteissa: Määre public näkyy kaikille. Private näkyy vain sen luokan sisällä, missä sitä on käytetty. Protected näkyy luokassa ja sen jälkeläisissä. Lisäksi on oletusmääre, joka on voimassa, jos mitään muuta määrettä ei anneta. Oletus näkyy saman pakkauksen luokissa sekä luokan jälkeläisissä.</p></blockquote>
<blockquote><p>Jos kaikki olisi määritelty oletuksella, niin luokan jälkeläisissä ja sen kanssa samassa paukkauksessa olivissa luokissa voisi muuttaa esimerkiksi jonkin tärkeän vakion arvoa. Esimerkiksi piin arvoa ei voisi muuttaa, koska se on määritelty final-määreellä, mutta jos käyttää jotain tärkeää arvoa, joka voi kuitenkin muuttua, mutta vain jos ohjelmoija niin haluaa tai vain tämän tietyn luokan toiminnot niin päättävät. Tässä tilanteessa, kuitenkin, joku saattaa luoda tälle tärkeän muuttujan sisältämälle luokalle aliluokan ja muuttaa siellä tämän muuttujan arvoa. Tai jokin samaan luokkapakkaukseen kuuluva saattaa muuttaa tätä arvoa, vahingossa tai tarkoituksella. Tämän takia private-määre on tarpeellinen.</p></blockquote>
<blockquote><p>Toinen tapaus taas on se, ettei jokin luokka ole samassa pakkauksessa kuin jokin tärkeä tai monimutkainen metodi, eikä tätä luokkaa voi laittaa myöskään perimään tätä metodin sisältävää luokkaa. Tällöin taas tarvitaan public-määrettä.</p></blockquote>
<blockquote><p>Samoista syistä kaikki muuttujat eivät voisi olla tyypiltään vain privatea – miten silloin voitaisiin kutsua muissa luokissa olevia metodeja? – eikä myöskään vain publicia – miten tällöin suojataan esimerkiksi suojausta tarvitsevat attribuutit?</p></blockquote>
<blockquote><p>Protected-määrettä voidaan näin ollen käyttää kun muuttuja tarvitsee suojaa muita paitsi jälkiläisiään vastaan.</p></blockquote>
<blockquote><p>Kaikista eri näkyvyysmääreistä on siis hyötyä.</p></blockquote>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Miten toimin opiskellessani ohjelmointia?]]></title>
<link>http://javasoturit.wordpress.com/2008/01/20/miten-toimin-opiskellessani-ohjelmointia-2/</link>
<pubDate>Sun, 20 Jan 2008 21:52:33 +0000</pubDate>
<dc:creator>Antti</dc:creator>
<guid>http://javasoturit.fi.wordpress.com/2008/01/20/miten-toimin-opiskellessani-ohjelmointia-2/</guid>
<description><![CDATA[Ohjelmoinnin oppimiseen on varmasti yhtä monta tyyliä kuin on oppijoitakin. Itselleni tehokkaimmak]]></description>
<content:encoded><![CDATA[<p>Ohjelmoinnin oppimiseen on varmasti yhtä monta tyyliä kuin on oppijoitakin. Itselleni tehokkaimmaksi tavaksi opetella ohjelmointia on osoittautunut koodin kirjoittaminen sitä mukaa kun asioita opettelee. Itse asiassa useimmiten asetelma on ollut niin päin, että asian opettelee silloin kun se tarvitsisi kirjoittaa koodiin</p>
<p>Parhaimmaksi oppimateriaaliksi on osoittautunut määrätietoinen <i>Googlettaminen </i>ja Java-APIn lukeminen. Lähes kurssin alusta lähtien minulla on aina koodateesani ollut vierekkäin koodi ja nettiselain joko eri näytöillä tai jaetulla ruudulla. Luen ohjetta ja tai googlettamaani esimerkkiä ja krijoitan samalla omaa koodiani. Firefoxin Java-API-hakukone-liitännäinen on osoittautunut korvaamattomaksi työkaluksi. Olen huomannut että itseasiassa opin kaikkein tehokkaimmin lukemalla valmista koodia ja esimerkkejä.</p>
<p>Syksyn alussa yritin opiskella asioita kirjasta lukemalla, mutta pian totesin ettei se ollut lainkaan tehokasta. Loppujen lopuksi Kalakirja on nyt useamman kuukauden päässyt pölyttymään hyllyssä. Hakuteoksena Google ja sen löytämät miljoonat sivut vain ovat huomattavasti näppärämpiä.</p>
<p>Haluan päästä heti kokeilemaan opettelemiani asioita, ja esimerkiksi ohjelmointiprojektin aikana syntyi iso kansiollinen testiluokkia. Jokaista uutta asiaa piti päästä heti testaamaan ja soveltamaan itse. Kommentoin runsaasti koodin sekaan ja kirjoitan itselleni auki mitä missäkin kohdassa tehdään, jolloin opin sen samalla. Testaan koodia hyvin tiheästi, jolloin virheet ja bugit huomaa nopeasti ja pystyy reagoimaan niihin. Pidän myös kirjaa siitä mitä on tekemättä ja mitä pitäisi parantaa, jolloin pystyn helposti palaamaan niihin kohtiin ja etsimään tietoa ratkaistakseni kohdat.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Miksi tarvitaan metodeja? Eikö riittäisi, että on yksi luokka ja siinä main-metodi? ]]></title>
<link>http://stud13.wordpress.com/2008/01/20/miksi-tarvitaan-metodeja-eiko-riittaisi-etta-on-yksi-luokka-ja-siina-main-metodi-2/</link>
<pubDate>Sun, 20 Jan 2008 21:47:30 +0000</pubDate>
<dc:creator>Moona</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/miksi-tarvitaan-metodeja-eiko-riittaisi-etta-on-yksi-luokka-ja-siina-main-metodi-2/</guid>
<description><![CDATA[ Metodeja tarvitaan ensinnäkin selkeyttämään koodia. Jos olisi yksi metodi, niin olisi vaikeaa t]]></description>
<content:encoded><![CDATA[<blockquote> <span>Metodeja tarvitaan ensinnäkin selkeyttämään koodia. Jos olisi yksi metodi, niin olisi vaikeaa tietää, missä kohtaa sitä mikäkin asia hoidetaan. Asian helpottuminen monimetodisessa koodissa</span> edellyttää sitä, että antaa metodeille kuvaavat nimet. Näiden nimien avulla on paljon helpompi pysyä kärryillä siitä, mitä missäkin tehdään.</p></blockquote>
<blockquote><p> <span>	Voisihan sitä ajatella, että kun se on kerran kirjoitettu, niin ei sillä sitten ole enää mitään väliä, että onko esimerkiksi aloita alusta -kuuntelija nyt tämän parin tuhannen rivin koodin alku vai loppu puolella.</span> Mutta mitä sitten tehdään kun ohjelma ei toimikaan; lähdetään selaamaan pari riviä kerrallaan koko koodia läpi vai? Tässä on yksi syy metodien käyttöön.</p></blockquote>
<blockquote><p> 	Toinen hyvä syy käyttää metodeja on toiston väheneminen. Entä jos ohjelmassa on vaikka tuollainen edellä mainittu aloita alusta -toiminto tai vielä parempaa: aloita uusi</p></blockquote>
<blockquote><p> -toiminto? Kirjoitetaanko silloin tuon kuuntelijan sisälle kaikki se, mitä uuden ohjelman aloittamisessa tarvitaan – uudestaan? Sillä luultavasti ohjelman aloittaminen täytyy koodata tapahtumaan muutoinkin kuin uuden ohjelman aloittamiseen tarkoitettua nappia painamalla. Tai voisi tuota nappia tässä tapauksessa ehkä vaatia painamaan, mutta kaikissa ohjelmissa tämä ei onnistu ja toistoa tulee varmasti.</p></blockquote>
<blockquote><p><span>	Kolmas hyvä syy käyttää metodeja on se, että niitä voi käyttää erikseen luokan ulkopuolelta. Toisaalta, jos tekee vain yhden luokan, niin eihän</span><b> </b><span>näitä metodeja tultaisi käyttämään sen ulkopuolelta, mutta koska päädyimme jo siihen, että se oli hyvin epäselvää ja bugien ja muiden virheiden korjaamiseen ja ymmärtämiseen menisi luultavasti hirvittävästi aikaa, niin oletetaan, että luokkia olisi monta, metodeja jokaisessa se yksi. Luokkia olisi silloin vaikea lukea samalla, joutuisi kokoajan vaihtamaan ikkunaa. Lisäksi pitäisi aina luoda uusi luokka, määritellä se ja sitten tehdä vielä kuitenkin se metodi. Mieluummin siis toisin päin: yksi luokka, monta metodia.   </span><b> </b></p></blockquote>
<blockquote><p><b>	</b><span>Selkeintä ja toistoa vähentävintä olisi kuitenkin käyttää tarvittavan montaa luokkaa, jotka voi laittaa perimään eri muita luokkia ja tehdä niihin useampia metodeja, jotka käsittelisivät kukin yhtä asiaa, löytyisivät helposti, ja joita voitaisiin kutsua näistä toisista luokista sekä vain silloin, kun se on tarpeellista. </span></p></blockquote>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Kannattaako logiikka ja käyttöliittymä eriyttää?]]></title>
<link>http://javasoturit.wordpress.com/2008/01/20/kannattaako-logiikka-ja-kayttoliittyma-eriyttaa/</link>
<pubDate>Sun, 20 Jan 2008 21:27:21 +0000</pubDate>
<dc:creator>Antti</dc:creator>
<guid>http://javasoturit.fi.wordpress.com/2008/01/20/kannattaako-logiikka-ja-kayttoliittyma-eriyttaa/</guid>
<description><![CDATA[Koodatessamme syksyn viidennessä Java-tehtävässä erillisen Peliruudukko-luokan huolehtimaan peli]]></description>
<content:encoded><![CDATA[<p>Koodatessamme syksyn viidennessä Java-tehtävässä erillisen Peliruudukko-luokan huolehtimaan pelin logiikasta, emme sen kummemmin miettineet mikä merkitys logiikan erottamisella käyttöliittymästä on. Vaikka ensi alkuun saattaakin tuntua että se on <i>ihan sama </i>mihin luokkaan mitkäkin ohjelman ominaisuudet toteuttaa, niin ohjelman rakenteen järkevä miettiminen ei suinkaan ole ihan huuhaata.</p>
<p>Etuja logiikan ja käyttöliittymän eriyttämisestä on useita. Ohjelmalogiikalle voidaan vaikka tehdä useita erilaisia käyttöliittymiä, jolloin samaan tietoon ja ominaisuuksiin pääsee käsiksi monella eri tavalla. Käyttöliittymissä on myös usein monia järjestelmäspesifejä asioita, jolloin eriyttäminen helpottaa erilaisen käyttöliittymien kehittämistä eri järjestelmille. Logiikan toteuttamisessa ei tällöin tarvitse välittää näistä järjestelmäkohtaisista asioista.</p>
<p>Kun ohjelman logiikka toteutetaan erillään käyttöliittymästä, niin myös ohjelman kehittämistä voidaan tehdä huomattavasti joustavammin.  Kun sovitaan tarkasti miten ohjelman eri osat kommunikoivat keskenään, niin ohjelmaa voi olla vaikka kehittämässä useita henkilöitä samanaikaisesti. Ohjelmaa myöskään harvoin suunnitellaan kerralla valmiiksi, jolloin mahdollisuus kehittää eri osia erikseen helpottaa huomattavasti ohjelman jatkokehitystä.</p>
<p>Varjopuolena logiikan ja käyttöliittymän erottamisessa on joissain tilanteissa ohjelman rakenteen turha hajoaminen, kun toisiinsa liittyviä asioita toteutetaan erillään. Lisäksi logiikan ja käyttöliittymän eriyttäminen johtaa väistämättä siihen, että eri luokkien välillä täytyy siirtää entistä enemmän tietoa. Käyttöliittymän täytyy välittää kaikki asiaan liittyvät parametrit mallille, ja joissain tilanteissa niitä saattaa olla aikamoinen määrä. Vaarana on myös epäkonsistentti tila logiikan ja käyttöliittymän välillä, jos tieto ei ole vaihtunut niiden välillä niin kuin pitäisi.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[]]></title>
<link>http://stud13.wordpress.com/2008/01/20/miksi-tarvitaan-metodeja-eiko-riittaisi-etta-on-yksi-luokka-ja-siina-main-metodi/</link>
<pubDate>Sun, 20 Jan 2008 21:15:22 +0000</pubDate>
<dc:creator>Moona</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/miksi-tarvitaan-metodeja-eiko-riittaisi-etta-on-yksi-luokka-ja-siina-main-metodi/</guid>
<description><![CDATA[

]]></description>
<content:encoded><![CDATA[<blockquote><b></b></p></blockquote>
<blockquote></blockquote>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mitä hyötyä on siitä, että metodeilla on argumentteja?]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/20/mita-hyotya-on-siita-etta-metodeilla-on-argumentteja/</link>
<pubDate>Sun, 20 Jan 2008 20:47:39 +0000</pubDate>
<dc:creator>Olli Saksa</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/20/mita-hyotya-on-siita-etta-metodeilla-on-argumentteja/</guid>
<description><![CDATA[Metodien argumentit, tuttavallisemmin (ainakin minulle) parametrit, esiintyivät ohjelmointitehtävi]]></description>
<content:encoded><![CDATA[<p>Metodien argumentit, tuttavallisemmin (ainakin minulle) parametrit, esiintyivät ohjelmointitehtävissämme alusta alkaen. Kesti hetken aikaa ennen kuin ymmärsin niiden syvällisemmän merkityksen. Tehtävissä sanottiin, että laita tämä metodi ottamaan parametrinaan kokonaislukumuuttuja ja helppoahan se oli sokeasti totella ohjeita. Ensimmäisen harkan aikana opin jo ymmärtämään, että parametreilla pystytään vaikuttamaan metodin palatusarvoon, mutta sen syvällisemmin en asiaa pohtinut.</p>
<p>Tässä vaiheessa minulle oli vielä täysin hämäränpeitossa, mitä pääohjelmametodin <i>String[] args</i> oikein tarkoittaa. Olin aina vain kirjoittanut sen sulkujen sisälle kiltisti vailla sen kummempaa ymmärrystä sen tarkoitusperistä. Neljännessä Javatehtävässä vihdoinkin käsiteltiin sitä. Kyse onkin komentoriviparametrista. Omassa ohjelmassamme komentoriviparametreiksi määritettiin nimi ja nopeus. Käynnistettäessä ohjelma kysyi näitä määritettyjä arvoja ja tallensi ne muistiin. Näin ohjelman käyttäjä sai määritellä aluksi oman nimensä ajaessaan ohjelmaa.</p>
<p>Main-metodi on kuitenkin poikkeustapaus. Kurssin edetessä oppia kertyi ja metodien parametritkin tulivat tutummaksi ja tutummaksi.  Ne muodostuivat itsestäänselvyyksiksi. Suuri askel oli kun osasi itse määrittää metodille tilanteeseen sopivat parametrit. Varsinkin lopputehtävissä tuli pelailtua konstruktorien parametrien kanssa, kun monen luokan piti tuntea moni muu luokka ja parametrejä kertyi lukuisia tehtävän edetessä.</p>
<p>Parametreilla voi siis vaikuttaa metodin palautusarvoon. Kuvitellaan, että metodi ottaa parametrinaan boolean-muuttujan ja metodin sisällä määritellään erilaiset palautusarvot sekä true-arvolle, että false-arvolle. Nyt metodi palauttaa arvon, joka riippuu annetun parametrin totuusarvosta. Tässä tulee juuri ilmi parametrien eli argumenttien hyödyllisuus - ei tarvitse tehdä jokaiselle tilanteelle omaa metodiansa.</p>
<p>-Olli</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Miten ajatukseni ohjelmoinnista on muuttunut kurssin aikana?]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/20/miten-ajatukseni-ohjelmoinnista-on-muuttunut-kurssin-aikana-3/</link>
<pubDate>Sun, 20 Jan 2008 20:06:22 +0000</pubDate>
<dc:creator>meri</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/20/miten-ajatukseni-ohjelmoinnista-on-muuttunut-kurssin-aikana-3/</guid>
<description><![CDATA[Iki-ihana kurssimme (näin pystyn jo melkein ajattelemaan näin kurssin viimemetreillä) Studio1 sta]]></description>
<content:encoded><![CDATA[<p style="margin-bottom:0;">Iki-ihana kurssimme (näin pystyn jo melkein ajattelemaan näin kurssin viimemetreillä) Studio1 starttasi syyskuun puolivälin tienoilla. Elokuun lopussa saimme kotiin kirjeen mukana esitteen, jonka tarkoitus oli antaa hieman esimakua tulevasta syksystä ja Java-ohjelmoinnista. Minulle tämä ei kuitenkaan sanonut yhtään mitään. Ajatus koko hommasta oli vain että "TÄH, koodausta, no okei sitten..". Pahaa-aavistamattomat phuksit kerääntyivät TUAS-talon luentosaliin aloitusluennolle. Tällöin kuulimme myös ensikertaa Kalakirjasta ja tajusimme, mitä koko syksymme tulee tästedes olemaan.</p>
<p style="margin-bottom:0;">Ensimmäinen harjoitus sujui vielä hyvin tietämättömänä mitään itse koodauksesta tai siitä, mihin kaikkeen sitä voi hyödyntää. Yhteys Java-peleihin oli erittäin häilyvänä mielessä. Jotenkin Java ei ohjelmointikielenä, tai ylipäänsä ohjelmointi, sanonut minulle mitään! Mielestäni oli kummallista kirjoittaa kymmenen riviä tekstiä, jotta saisi tulostettua tekstin "Hello World!" Miksei saman tien vain kirjoittaisi kyseistä lausetta?</p>
<p style="margin-bottom:0;">En lähtenyt tähän hommaan riittävän hyvällä asenteella. En ajatellut ohjelmointia mitenkään helppona hommana, mutten toisaalta sellaisenakaan, mitä haluaisin tai ylipäänsä voisin vielä joskus osata. Kurssin alkuvaiheessa näin pari kurssilla toteutettua projektia, nämä olivat pelejä, enkä ikimaailmassa osannut kuvitellakaan itse tekeväni mitään senkaltaistakaan. Tuossa vaiheessa opetteluni oli lähinnä ohjeen sokeana seuraamista ja assareilta saamien neuvojen mukaan koodin kirjoittamista. Eli sisäistetty asia jäi ehkä kymmeneen prosenttiin tavoitteesta. Jotenkin suljin Javan kokonaan pois kaiken muun tieltä. En ymmärtänyt, miksi jotain tällaista pitää opetella.</p>
<p style="margin-bottom:0;">Koodaus alkoi synkän harmaalla Emacs-editorilla. En koskaan oppinut käyttämään kaikkia sen ominaisuuksia, sillä hajosin jo copy-pasten aiheuttamaan jumitustilaan. Eclipse helpotti elämääni sekä fyysisesti että henkisesti. Jotkut tuntevat nostalgiaa nyt myöhemmässä vaiheessa käyttäessään Emacsia. Jotenkin en itse koskaan oikein ihastunut Emacsin käyttöön. Eclipsen avulla opin paljon lisää ja paljon hyödyllistä, muunmuassa parametreista ja valmiiden luokkien tarjonnasta. Aloin oikeasti, ehkä jollain tuntemattomalla tasolla, välillä jopa pitämään koodaamisesta.</p>
<p style="margin-bottom:0;">Vihdoin, kaikista kolmesta ensimmäisestä tehtävästä selvinneenä, neljäs tehtävä toi mukanaan jo jotain ihan konkreettista näkuviin ikuisen puurtamisen jälkeen. Pääsi jo seuraamaan omaa tuotostaan ja pelaamaan "itse tehtyä" peliä. Sikobanin myötä pääsin luomaan oman graafisen käyttöliittymän. Mielenkiinto lisääntyi koko ajan, kun halusi saada lisää toiminnallisuutta, vielä enemmän juttuja näkyviin!</p>
<p style="margin-bottom:0;">Omaa aikaa ei ollut käytettävissä koodille, eikä se alkuvaiheessa vielä haitannutkaan. Kuitenkin algoritmit olivat monimutkaisia jo alkuvaiheessa ja näin tuntuivat hyvin hyvin hankalilta vielä myöhemminkin. Jälkeenpäin harmittaa kuinka paljon enemmän olisin voinut alkuvaiheessa perusasioista opetella, ja kuinka paljon enemmän nyt osaisin, kuinka hienon projektin olisinkaan voinut saada aikaiseksi.</p>
<p style="margin-bottom:0;">Projektin voisin sanoa muuttaneen käsitystäni ohjelmoinnista varmasti eniten. Kun ei ollut käytettävissä assareita, joiden hihasta olisi voinut nykäistä epävarmassa tilanteessa, oli vain pakko uskaltaa kokeilla! Omat ratkaisut eivät aluksi tuottaneet onnistunutta lopputulosta läheskään aina, mutta pienetkin onnistumiset kohottivat itsetuntoa ja auttoivat eteenpäin! Projektiini olen lopulta tyytyväinen . Opin yhteensä varmasti enemmän kuin koko kurssin aikana. Opin itse perehtymään virheisiini ja niiden aiheuttajiin sekä ratkaisuihin. Nyt tiesin jo hieman etukäteen jotain siitä, mitä tulee tapahtumaan ohjelmaa ajettaessa. Projektissani käytin tietenkin tuttuja (Javan valmiita)luokkia ja looppeja. For-lauseesta tuli suosikkini ja ArrayList oli esiintynyt jo niin monta kertaa, että ne olivat selvät valinnat, kun mietin eri silmukka- ja kokoelmavaihtoehtoja.</p>
<p style="margin-bottom:0;">Nyt kun sain projektinikin tehtyä ja sen myötä huomattua, kuinka paljon loppujen lopuksi itseasiassa osaa koodata, (paljon olisi tietysti opeteltavissa vielä, jos haluaisi) on käsitys koko kurssia kohtaan hieman muuttunut. Projektin aikana koodin kirjoittaminen ei tuntunut hirvittävän  ylivoimaiselta paria poikkeusta lukuunottamatta. Luulenpa, että asiaan vaikutti eniten juuri se näkyvän tuloksen aikaansaaminen. Helpompi ajatella, keksiä uusia ideoita ja korjata virheitä, kun lopputulos on nähtävissä. Itseluottamus oli myös kova tekijä tässä, oli paljon mukavampi tehdä jotain, kun tiesi, että siinä voi myös onnistua!</p>
<p>Kyllä näin lopuksi on pakko sanoa, että on se kivaa kun sen osaa :). Kaverit ja sukulaiset ovat innoissaan pienistäkin ohjelmista, mitä on saanut aikaiseksi. Monta tilausta olen saanut koodattavaksi, mutta katsotaan nyt, avaanko Eclipseä enää tänä vuonna, niin mukava kaveri kun siitä onkaan tullut.</p>
<p style="margin-bottom:0;">
-Meri</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Koodieditorit ohjelmoinnin apuna]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/20/koodieditorit-ohjelmoinnin-apuna/</link>
<pubDate>Sun, 20 Jan 2008 20:05:33 +0000</pubDate>
<dc:creator>Teemu P.</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/20/koodieditorit-ohjelmoinnin-apuna/</guid>
<description><![CDATA[Tuntuu vähin nurinkuriselta kirjoittaa vielä päätöspuheenvuoron jälkeen, mutta täältä tulee]]></description>
<content:encoded><![CDATA[<p>Tuntuu vähin nurinkuriselta kirjoittaa vielä päätöspuheenvuoron jälkeen, mutta täältä tulee nyt vielä se toinen portfolioessee.</p>
<p style="margin-bottom:0;">Kurssin aikana tuli käytettyä monenlaisia ohjelmia. Aivan uutta olivat <i>koodieditorit</i>, tai jos nyt vähän hienostuneemmasta ohjelmasta puhutaan, <i>kehitysympäristöt.</i> Ensimmäiset ohjelmointitehtävät tuli paahdettua läpi <i>Xemacsia</i> käyttäen. Xemacs tuntui todella näppärältä ohjelmalta, se pystyi jopa korostamaan tekstiä tuoden suuren avun koodausarkeen.</p>
<p><img src="http://users.tkk.fi/~tpoikela/k%e4sseeblog/Xemacs.jpg" align="right" height="213" width="250" /></p>
<p style="margin-bottom:0;">Liikkui kuitenkin huhuja vielä hurjemmasta sovelluksesta. <i>Eclipse</i> pystyisi näyttämään suoraan virheitä reaaliaikaisesti kääntävällä virtuaalikoneella. Se sisältäisi myös sisäänrakennetun API-hakemiston, jolloin varsinaista Sunin API-sivustoa ei tarvitsisi aivan jatkuvalla syötöllä selailla.</p>
<p style="margin-bottom:0;">Kokeillessani Eclipseä ensimmäisen kerran olin jonkun verran epäluuloinen: se tuntui vähän monimutkaiselta kaikkine pikkuikkunoineen ja pikanäppäimineen. Epäluulot haihtuivat kuitenkin nopeasti: Eclipse nopeutti ja helpotti koodausurakkaa suuresti. Ei tarvinnut enää leikkiä komentorivin kanssa vaan Eclipse laittoi classit huutamaan hoosiannaa yhdellä hiirenklikkauksella.</p>
<p style="margin-bottom:0;">Projektin jälkeen Eclipsestä oli tullut jo niin kiinteä osa koodausprosessia, että ihan helpolla en sitä vaihtaisi takaisin XEmacsiin. Toisaalta saattoi olla ihan hyvä asia, että ensimmäiset Java-kotitehtävät tuli tehtyä Xemacsilla. Se pakotti miettimään todella oikeaoppista Java-syntaksia  - näin ainakin assareiden mielestä.</p>
<p style="margin-bottom:0;">Sun Microsystemsillä on myös oma vastineensa Eclipselle: <i>NetIde Javabeans</i>. Tätä ohjelmaa ei tullut koskaan käytettyä (ei ollut varmaan tarpeenkaan).</p>
<p style="margin-bottom:0;">Käsitekarttojen teossa tuli tutustuttua myös uuteen ohjelmaan –<i> CmapToolsiin. </i><span style="font-style:normal;">Se oli kaikenkaikkiaan positiivinen yllätys. Käyttöliittymä oli yksinkertainen ja ohjelma teki nättiä, antialiasoitua jälkeä. </span>Tutustuimme myös dialogikarttaohjelmaan, joka jäi vaisuksi tähdenlennoksi Sitä käytettiin ainoastaan yhdessä OLO-sessiossa.</p>
<p><img src="http://users.tkk.fi/~tpoikela/k%e4sseeblog/Eclipse.jpg" align="left" height="192" width="250" /></p>
<p style="margin-bottom:0;">Käytin myös omia grafiikkaohjelmia blogikirjoituksissa ja teoriatehtävien viimeistelyssä. Parhaan lopputuloksen sai usean eri ohjelman parhaita puolia hyödyntämällä.</p>
<p style="margin-bottom:0;">Syksyn aikana tuli vietettyä (liian) paljon aikaa tietokoneen ääressä. Myös IRC:n käyttö juurtui selkäytimeen. En nyt tiedä onko se kovin hyvä asia...  Laadukkaat ohjelmat auttoivat huomattavasti syksyn urakkaa. Eclipse saa nyt kuitenkin levähtää jossakin syvällä kiintolevyn uumenissa – ainakin hetken.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">- Teemu</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mitä hyötyä on perinnästä?]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/20/mita-hyotya-on-perinnasta/</link>
<pubDate>Sun, 20 Jan 2008 19:49:34 +0000</pubDate>
<dc:creator>meri</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/20/mita-hyotya-on-perinnasta/</guid>
<description><![CDATA[Ensimmäisissä ohjelmointitehtävissä tehdyt luokat kuten Esine ja sen aliluokat Arkku ja Kolikkok]]></description>
<content:encoded><![CDATA[<p>Ensimmäisissä ohjelmointitehtävissä tehdyt luokat kuten Esine ja sen aliluokat Arkku ja Kolikkokasa ym. eivät mitenkään kertoneet minulle perimän tarkoituksesta - mitä hyötyä tästä oikein on? Mitä mieleeni ensimmäisenä tuli oli, että onpas hauska kun kytketään jokin luokka toiseen periyttämällä se toisesta luokasta. Onhan se nyt selvää, että kolikkokasa ja arkku voidaan laskea esineiksi. Mitä pidemmälle kurssi eteni, sitä useammin luokan nimen perään kirjoitettiin sana extends ja jokin toinen luokka. Tämä oli mielestäni vain hauskaa ja loi luokkien välille jonkinlaista yhteenkuuluvuuden tunnetta.</p>
<p style="margin-bottom:0;">Perinnän tarkoituksesta selvisi minulle eniten viidennessä Java-tehtänässä, jossa luotiin Sikoban luokka, joka siis peri JFramen ja sai näin käyttöönsä kaikki JFramen ominaisuudet ja metodit. Koin elämyksen kun joku assareista harjoituksen aikana neuvoi käyttämään this-sanaa JFramen metodeja kutsuttaessa. Ensin näitä päästiin tietysti etsimään JavaAPIsta ja "How to use" -kohta oli äärettömän valaiseva. Tässä vaiheessa tajusin, että tämähän itseasiassa tarkoittaakin sitä, että Sikoban-luokka on JFrame ja olisi sama kuin jos Sikoban-luokka pitäisi sisällään kaikki JFramen metodit. Ja taas tunnelmia: oli vain mahtava fiilis kun ikkuna aukeutui näytölle, ja tällä kertaa ihan itse aiheutettuna!</p>
<p style="margin-bottom:0;">Jos minun nyt pitäisi selittää tärkeimmät asiat perinnästä, sen hyödyt ja käyttötarkoitukset sun muut siitä mitään tietämättömälle puhuisin varmasti ja luottavaisesti, en epäröisi asiassani. Aloittaisin kertomaan luokista ja niiden aliluokista, jotka "periytetään" näistä yliluokista, ja siitä kuinka aliluokat saavat yliluokkiensa ominaisuudet. Luokalla voi siis olla vain yksi yliluokka, kuten ihmiselläkin vain yksi äiti (isää ei nyt saa ottaa mukaan), mutta monta aliluokkaa, kuten äidillä lapsia. Koetilanteessa joutuisin kuitenkin miettimään sana- ja lausevalintojani, niin selvää perintä kokonaisuudessaan ei minulle vielä ole.</p>
<p style="margin-bottom:0;">Selittäisin varmasti eläimistä, kissoista ja koirista, ja näiden ilmentymistä eli Mirristä ja Turresta. Luodaan siis luokat Eläin, Kissa ja Koira. Luokat Kissa ja Koira laitetaan perimään luokka Eläin. Eläin-luokan ilmentymät saavat luomisvaiheessa nimen ja painon. Näin on täten myös Kissa ja Koira -luokkien kohdalla. Näille voi kuitenkin antaa nyt jotain uusia ominaisuuksia ja määritellä metodeja, jotka tekevät näiden kahden ilmentymistä eläintä tarkempia ja toisistaan eroavaisia. Koira-luokan ilmentymät voisivat nyt nimen ja painon lisäksi saada ominaisuuden "uskollisuus" ja metodin "hauku". Kissat taas omiaisuuden "hännän pituus" ja metodin "kehrää". (Tämähän alkaa kuulostaa jo ensimmäisissä OLO-sessioissa käydyltä keskustelulta tai lähinnä assarin selitykseltä suu auki ja silmät pyöreinä katsoville phukseille).</p>
<p style="margin-bottom:0;"> Mielesstäni perinnän suurin hyöty tulee esille siinä, kun halutaan pitää samantyyliset, mutta kuitenkin erilliset asiat/ilmentymät/jotainihanmuuta(?) erillään, mutta silti kytkettyinä toisiinsa. Luokkien kokoa voidaan pienentää, kun jokaiseen ei tarvitse erikseen kirjoittaa samoja ominaisuuksia ja metodeja. Samalla hahmottuu kokonaisuus paremmin, kun nähdään, mitkä luokista kuuluvat yhteen. Peli-ikkunaakaan luodessani minun ei tarvitse kirjoittaa luokan sisälle viittäkymmentä metodia, erikseen koon asettamiselle, värin vaihdolle jne. vaan voin käyttää valmiita JFramen metodeja tähän.</p>
<p style="margin-bottom:0;">Kurssin aikana olen oppinut paljon, ja niinkin yksinkertainen asia kuin tämä perintä oli käsitteenä ja kaikkine ominaisuuksineen suhteellisen vajaa. Näkyvyysmääreen protected tarkoitus selvisi minulle käytännössä koodatessa, ja osoittautuikin varsin näppäräksi ratkaisuksi. Toisaalta käytännössäkään en sisäistänyt super.:n käyttöä tai lähinnä sen eroa this.:seen. This:iä käytetään kun kutsutaan jotain luokan metodia ja superia kun kyseessä on yliluokan metodi. Kuitenkin yliluokankin metodeja voi käyttää suoraan this. Tämä hämmensi täysin.</p>
<p style="margin-bottom:0;">Projektissakin, nyt innostuneena tästä perinnästä loin ensin uokalle Esine viisi alaluokkaa, ja nämä toteuttamaan samat metodit. Sittemmin muutin luokan Esine abstraktiksi ja ylikirjoitin sen metodit jokaisessa sen aliluokassa. Huomasin kuitenkin kaikkien luokkien olevan niin identtisiä, että viisi luokkaa yhden enumeraation sijaan olisi ehkä sittenkin aika huono vaihtoehto. Muuten en perintää sitten hyödyntänytkään "omilla" luokilla. Sen sijaan periytin luokkia Javan valmiista luokista kuten JFrame, JPanel ja Thread.</p>
<p style="margin-bottom:0;">-Meri</p>
<p style="margin-bottom:0;">&#160;</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Mikä ohjelmoinnin oppimisessa on vaikeinta? Miten tätä asiaa voisi helpottaa?]]></title>
<link>http://stud13.wordpress.com/2008/01/20/mika-ohjelmoinnin-oppimisessa-on-vaikeinta-miten-tata-asiaa-voisi-helpottaa/</link>
<pubDate>Sun, 20 Jan 2008 19:32:02 +0000</pubDate>
<dc:creator>sanna</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/mika-ohjelmoinnin-oppimisessa-on-vaikeinta-miten-tata-asiaa-voisi-helpottaa/</guid>
<description><![CDATA[Kahdentoista edellisen kouluvuoteni aikana tarvittavat tiedot aseteltiin tarjottimella eteen oppitun]]></description>
<content:encoded><![CDATA[<p>Kahdentoista edellisen kouluvuoteni aikana tarvittavat tiedot aseteltiin tarjottimella eteen oppituntien aikana, ja kotitehtäviä sekä projekteja tehdessä näitä tarjottimen antimia piti vain osata hyödyntää. Harvinaisen helppoa. Tämän opiskelutavan omaksuneena yliopistomaailma tarjosi jos nyt ei kylmää niin ainakin viileää kyytiä.</p>
<p>Studio1:n periaatteena on: jos et osaa, opettele ja jos et tiedä, hanki tietoa. Kukaan ei tarjoa luentoa aiheesta "miten saada aikaan eeppinen taistelu" eikä edes aiheesta "miten listaan tallennetaan tietoa, ja mihin sitä voi hyödyntää". Alussa tiedon haaliminenkin oli varsin hankalaa, kun kyse oli aiheesta, josta minulla ei tosiaan ollut mitään käsitystä. Tuntui, ettei kirjaa voi lukea, kun en tiedä mistä siinä puhutaan ja toisaalta tuntui, ettei koodia voi kirjoittaa, kun ei ole lukenut kirjaa.</p>
<p>Vaikeinta aluksi olikin oppia ymmärtämään, mitä ohjelmointi on. Olisin kaivannut jonkinlaista alkuinfoa, jossa olisi kerrottu, että on olemassa erilaisia valmiiksi luotuja ohjelmointikieliä, joita tarvitsee vain hyödyntää, ja että java, tämän kurssin aihe, on yksi tällainen kieli muiden joukossa. Sen jälkeen olisi voitu esittää, miten jokin helppo asia toimii eri koodikielillä kirjoitettuna. Näiden opasteiden jälkeen olisin ollut paremmin valmis vastaanottamaan tietoa return-käskyistä ja konstruktoreista. Nyt kurssin alku meni itseltäni hieman ohi, kun en todellisuudessa ymmärtänyt, mitä minun haluttiin oppivan.</p>
<p>Ymmärrettyäni kielikysymyksen vastassa oli edelleen tiedon hankkimisen vaikeus. API vaikutti melko hämärältä miljoonine luokkineen, ja kaikki englanninkieliset tutoriaalitkin  kannustivat lähinnä vain koodinpätkien kopioimiseen. Kalakirjakaan ei houkutellut ainakaan ulkoasullaan. Tässä vaiheessa olo-sessiot  ja porukalla pohtiminen tuntuivat loistavalta vaihtoehdolta.</p>
<p>Ensimmäinen olo-sessio meni kuitenkin samaan kastiin aloitusluennon kanssa. Oli ihan kivaa pohtia vompatin syvintä olemusta, mutta se ei juurikaan auttanut alkuun javan oppimisessa. Olenkin sitä mieltä, että aluksi olisi voitu opettaa raa'asti vain javan perustoiminta, ja vasta myöhemmin laittaa opiskelijat pohtimaan, mistä tässä juuri opitussa asiassa on kyse. Myöhemmissä olosessioissa käsiteltävät asiat kuitenkin konkretisoituivat, ja tapaamisista alkoi oikeasti olla hyötyä oppimisessa. Ollisin tosin kaivannut oloiluihin vielä "kyselyvartti"-osiota, jossa olisi vapaasti voitu pohtia ohjelmoinnissa eteen tulleita ongelmia. Nyt sessioiden rakenne oli kuitenkin melko rajattu valmiiksi annetun virikkeen ja purun ympärille.</p>
<p>Kokonaisuudessaan voin sanoa, että vaikeinta ohjelmoinnissa on uuden kielen opettelu. Osatehtävät olivat suuria kokonaisuuksia ja niiden aikataulu oli varsin tiukka. Kertaukseen ei juurikaan ollut aikaa, mikä ei millään lailla parantanut tilannetta. Itseäni olisi helpottanut, jos olisi ollut mahdollisuus suorittaa jonkinlaisia pieniä osatehtäviä, jotka olisivat toistaneet oletetusti edellisessä tehtävässä opittua asiaa ja näin vahvistaneet oppimisjälkeä.</p>
<p>Kovin laajaa kokemusta ohjelmoinnin oppimisesta minulla ei ole, joten kaikki tilittämäni mielipiteet perustuvat täysin yhden kurssin antimiin. On sekin kurssi asiansa kuitenkin hoitanut, kun kykenen jonkinlaista koodia itsenäisesti tuottamaan.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Kuinka kurssia voisi parantaa]]></title>
<link>http://stud13.wordpress.com/2008/01/20/kuinka-kurssia-voisi-parantaa-2/</link>
<pubDate>Sun, 20 Jan 2008 19:28:22 +0000</pubDate>
<dc:creator>Olli</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/kuinka-kurssia-voisi-parantaa-2/</guid>
<description><![CDATA[Neljäntoista opintopisteen suuruisena Studio1 on todella merkittävä kurssi kenelle tahansa, ohjel]]></description>
<content:encoded><![CDATA[<p>Neljäntoista opintopisteen suuruisena Studio1 on todella merkittävä kurssi kenelle tahansa, ohjelmointia jo hiukan taitaville että myös niille jotka tutustuvat siihen ensimmäistä kertaa fuksisyksynään. Niinpä kurssista on varmaankin hyvin vaikea saada yksinkertainen toimiva paketti, joten parantamisen varaa varmasti löytyy.</p>
<p>Kokonaisuutena kurssi on järjestelyineen yltänyt kiitettävälle tasolle ja näin jälkeenpäin ajateltuna opetusmenetelmät tuntuvat suorastaan nerokkailta vietettyäni kaksi viikkoa firman palveluksessa tutustuen kohtalaisen alkukantaiseen opetus- ja koulutusjärjestelmään..</p>
<p>Mielestäni eniten parantamisen (tai vähintäänkin uuden arvoinnin tekemisen) varaa on kurssin aloituksessa. Oppimiskynnys oli mielestäni hyvin jyrkkä. Pari luentoa eivät avanneet kovinkaan paljon ovea Java-ohjelmoinnin mystiseen maailmaan. Toisaalta olen huomannut syksyn aikana, että Java-ohjelmointi vaati mielettömän määrä "alkutietoa" ennen kuin voi edes pienen oman ohjelman toteutusta. Jo pelkästään Javan main-metodin (<b> public static void main</b>(String args[]) )</p>
<p>ymmärtäminen määreineen vaati itseltäni useamman ohjelmointikierroksen verran työtä. Niinpä mielestäni kurssin alussa tulisi olla joko hieman enemmän luentoja aivan Javan perusteista, tai sitten yksi tai kaksi lapio-harkkoihin verrattavaa tietokoneharjoitusta, jossa jokainen opiskelija yksinkertaisesti tekee saman kuin harjoituksen vetäjä (tämän näyttö näkyy projektorista).</p>
<p>Toinen asia, joka minua myös hiukan ihmetyttää on kurssin arvosanan muodostuminen. Lähinnä blogin yllättävän suuri painoarvo ja esseiden suhteellisen pieni painoarvo tuntuvat nurinkuriselta. Myöskin blogin arvosanan muodostuminen tuntuu näin etukäteen myös hiukan epäselvältä, kun yhtään ennakkotapausta ei toistaiseksi ole olemassa.</p>
<p>Viimeinen pieni käytännön asia, jossa on parantamisen varaa, joka tulee näin nopeasti mieleen on ohjelmointiharjoitusten palautus. Etenkin kurssin alussa oli välillä erittäin vaikeaa metsästää omaa koodiaan kun ei tiennyt kenellä assarilla se oli. Onneksi tähän ongelmaan tuli helpotusta kurssin loppupuolella. Esimerkiksi yhden pakollisen "opetuskerran" lisääminen viikko-ohjelmaan, jossa assarit palauttavat koodin ja käyvät sen läpi saattaisi olla hyvä idea.</p>
<p>Kaiken kaikkiaan kurssi oli kuitenkin toteutettu vähintäänkin kiitettävästi. Toki kurssi oli työläs ja välillä tuskainenkin, niin apua ei ollut koskaan kaukana; pahimmillaan irssi-screenin päässä :)</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Portfoliokysymys: Miten ajatukseni ohjelmoinnista on muuttunut kurssin aikana? ]]></title>
<link>http://studiovompatti.wordpress.com/2008/01/20/miten-ajatukseni-ohjelmoinnista-on-muuttunut-kurssin-aikana/</link>
<pubDate>Sun, 20 Jan 2008 18:39:46 +0000</pubDate>
<dc:creator>pontusjuntunen</dc:creator>
<guid>http://studiovompatti.fi.wordpress.com/2008/01/20/miten-ajatukseni-ohjelmoinnista-on-muuttunut-kurssin-aikana/</guid>
<description><![CDATA[On hauska muistella ajatuksiani ohjelmoinnista kurssia edeltäviltä ajoilta. Täytyy sanoa että it]]></description>
<content:encoded><![CDATA[<p style="margin-bottom:0;">On hauska muistella ajatuksiani ohjelmoinnista kurssia edeltäviltä ajoilta. Täytyy sanoa että itse ohjelmoinnista ei ollut edes oikeastaan minkäänlaista käsitystä. Olin aina kuvitellut että ohjelmointikieli on jotain erittäin sekavaa numeroiden ja kirjainten sekoitusta, jota vain harvat osaavat, koska se on niin vaikeaa. Mietin aina että onkohan niillä ihmisillä, jotka ohjelmoivat erilaisia ohjelmia, sellaiset valmiit työkalut ja softat, joilla ohjelmointi olisi lähinnä ”drag and drop” meininkiä. Vain kaikista parhaimmat olisivat ohjelmoineet nämä työkaluohjelmat.</p>
<p style="margin-bottom:0;">Täytyy sanoa että liike-elämän ohjelmoinnista enemmän tai vähemmän kaupallisiin tarkoituksiin, ei ole vieläkään selkeää kuvaa. En oikein vieläkään ole täysin varman millaista työtä esim. jonkinlainen Java-developer tekee. Onko se sitten puhdasta java-koodia eclipsellä, vai onko siinä jotain muitakin työkaluja. Lähinnä käsitykseni itse ohjelmakoodista on ”hieman” parantunut.</p>
<p style="margin-bottom:0;">Tajusin kuinka loogista ja loppujenlopuksi jopa tietyllä tavalla helppoa ohjelmointi voi parhaimmillaan olla. Ymmärrän myös sen että ohjelmointi vaatii erittäin hyvää loogista päättelykykyä ja kokonaisuuden hallintaa, jos ohjelmakoodit ovat yhtään kompleksisempia. Tavallaan kunnioitukseni perus nörttiä kohtaan on kasvanut. Pitäisihän 99% ikätovereistani minua nörttinä, jos kertoisin mitä olen koko syksyn tehnyt.</p>
<p style="margin-bottom:0;">Tajusin myös, ettei se koodin syntaksi mitään täysin älytöntä matrix-sekamelskaa ole. Onhan koodi loppujenlopuksi täysin ihmisten kehittämä asia. Tämä tekee siitä erittäin rationaalisen ja loogisen. Tietenkin puhun tässä nyt pelkästään javaa ohjelmoineen äänellä. Minulla ei ole käsitystäkään kaikista abstrakteimmista kone-ihminen-kielistä. Edelleen on siis joitakin asioita hämärän peitossa kun alkaa miettiä, että mitenköhän se tietokone nyt lopulta toimiikaan. Uskon kuitenkin että edes yhden ohjelmointikielen opettelu oli erittäin hyvä asia. Avarsi se ainakin minun maailmaani ja käsitystä ohjelmien toiminnallisuudesta huomattavalla tavalla.</p>
<p style="margin-bottom:0;">Projektia tehdessä tajusin kuinka rajattomat mahdollisuudet ohjelmoijalla voi olla. Lähes kaikki mitä haluat ohjelmaasi liittyen tehdä on toteutettavissa. Uskoisin ohjelmoinnilla olevan varsinkin taiteen saralla vielä erittäin paljon annettavaa. Ihmiset jotka haluavat toteuttaa itseään kaikilla mahdollisilla keinoilla, saisivat ohjelmoinnista lähes rajattomia mahdollisuuksia tarjoavan työkalun, jota voisi hyödyntää täysin uudella tavalla. Nyt sinne TAIK:iin vaan pakolliset ohjelmointikurssit huippuyliopiston myötä, jotta saadaan innovatiivista taidetta!</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Javan oppiminen]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/20/javan-oppiminen/</link>
<pubDate>Sun, 20 Jan 2008 18:33:59 +0000</pubDate>
<dc:creator>Ville Ilmonen</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/20/javan-oppiminen/</guid>
<description><![CDATA[
Aloitin Studio1:n ensimmäisen kerran jo vuoden 2006 syksynä. Kuukauden myöhässä ja tarkoitukse]]></description>
<content:encoded><![CDATA[<p><span style="font-size:12pt;line-height:115%;font-family:'Calibri','sans-serif';"></p>
<p style="margin:0 0 10pt;" class="MsoNormal">Aloitin Studio1:n ensimmäisen kerran jo vuoden 2006 syksynä. Kuukauden myöhässä ja tarkoituksena lukea muut kiinni. Sitä riemua kesti viikon verran, jonka aikana ehdin muodostaa vahvan ennakkoluulon koodaamisen epäsopivuudesta minulle. Tämä ennakkoluulo kummiteli koko vuoden hartioillani ja oli vielä jossain määrin seuranani viime syyskuussa Studio1:n aloitusluennolla. Nyt kun kuitenkin pääsin aloittamaan puhtaalta pöydältä. Ja ehkä tuon vuoden aikana jotain tietoa ohjelmoinnista oli tihkunut myös suojakuoreni läpi, sillä alusta asti kaikki tuntui melko luontevalta ja jos ei nyt helpolta, niin ainakin luontevalta. Erityisesti alkuluennoilla (jotka siis viimevuonna missasin) asiat selvitettiin tarpeeksi yksinkertaisesti, että tajusin ettei homma ollutkaan niin vaikeaa.</p>
<p style="margin:0 0 10pt;" class="MsoNormal">Usein minulla onkin tapana uusia asioita opetellessani antaa ennakkoluulojeni vaikuttaa liikaa opiskelumotivaatiooni. Sitten kun oikeasti tarun härkää sarvista ja rupean töihin, niin yleensä huomaan ennakkoluulojeni olleen täysin tuulesta temmattuja. Niin kävi siis nytkin. Luulen myös, että kurssin rakenne, jossa ensin tehdään itse, sen jälkeen tehdään itse, sitten kysytään jokin pieni vinkki ja lopuksi taas tehdään itse, sopi minulle kuin pipo hattuun. Varsinkin kun tehtävänannot olivat melko mielenkiintoisia. Myös tarkat takarajat ja niiden rikkomista seuraavat sanktiot toimivat sopivina ruoskina työmotivaation ylläpitämiseksi.</p>
<p style="margin:0 0 10pt;" class="MsoNormal">Vaikka äsken mainitsin, että opin parhaiten tekamällä, niin sekään ei ole mielekästä, mikäli asiasta ei tiedä yhtään mitään etukäteen. Mielestäni essee-tehtävät olivat mainio tapa antaa aikaa perehtyä vaikeisiinkin asioihin ennen varsinaista aiheen käsittelyä harjoitustehtävässä. Itselläni on paha(?) tapa ryhtyä suin päin tekemään kaikkea ennen kuin otan selvää mitä ja miten pitäisi tehdä.<span>  </span>Voisin väittää, että ilman esseiden kirjoitusta olisin ollut paljon pahemmin hukassa harjoitustehtävissä ja aikaa niihin olisi kulunut vähintään yhtä paljon enemmän kuin mitä esseiden kirjoittamiseen meni. Vaikka lopullinen oppiminen tapahtuukin vasta itse tekemällä, niin useamman tunnin etukäteisperehtyminen helpottaa tätä oppimisprosessia huomattavasti.</p>
<p style="margin:0 0 10pt;" class="MsoNormal">Vastaavasti OLO-sessiot eivät tarjonneet välttämättä samanlaista hyötyä ohjelminnilleni. Syitä siihen on varmasti useita. Päällimmäisin syy on varmasti laiskuus. En rehellisesti sanoen panostanut yhteenkään oppimistavoitteeseen kahtakymmentäminuuttia enempää. Mutta tämä kahdenkymmenen minuutin satsaus riitti, eli pystyin selittämään jotain kummallista purkusessioissa niin että homma meni täydestä. Ehkä jonkinnäköinen kirjallisena vaadittava tuotos oppimistavoitteista olisi saattanu toimia pienenä boostina. Toisaalta olin myös ehtinyt turhautumaan koko OLO-menetelmään edelliskevään Studio2-kurssilla. Jotenkin melko usein tuntuu, että silmittömällä lappujen roiskimisella taululle ei saavutettu mitään muta kuin sekaannusta.<span>  </span>Tästä on taas muodostumassa yhdenlainen ”perusennakkoluulo”, joista olisi syytä päästä varmaankin eroon (kun nyt näitä OLO-kursseja nyt vielä sattuu olemaan jäljellä).</p>
<p><span style="font-size:12pt;line-height:115%;font-family:'Calibri','sans-serif';">Myös tämä blogiinkirjoittaminen ei oikein tuntunut täysin luonnistuvan. Kyseinen toimitus oli aina helppo heittää priorisoinnissa viimeiselle sijalle, koska ei ollut mitään ns. ”pakollisia” kirjoituksia, eli kirjottaa sai aina kun ehti. Ehkä omaa oppimistani leimaa jonkinnäköinen ruoskan tarve. Tarvitaan joku taho, joka ravistelee tietyin uhkavaatimuksin tekemään hommia ajallaan.</span></p>
<p><span style="font-size:12pt;line-height:115%;font-family:'Calibri','sans-serif';">-Ville</span></p>
<p></span></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Rekursio – ja taas mennään!]]></title>
<link>http://stud13.wordpress.com/2008/01/20/rekursio-%e2%80%93-ja-taas-mennaan/</link>
<pubDate>Sun, 20 Jan 2008 18:19:29 +0000</pubDate>
<dc:creator>Marianne</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/rekursio-%e2%80%93-ja-taas-mennaan/</guid>
<description><![CDATA[Rekursiivinen metodi tarkoittaa metodia, jonka sisältä kutsutaan toistamiseen metodia itseään. P]]></description>
<content:encoded><![CDATA[<p class="MsoNormal">Rekursiivinen metodi tarkoittaa metodia, jonka sisältä kutsutaan toistamiseen metodia itseään. Perinteisillä tehtäväkierroksilla opimme rekursion käyttöä, mutta itselleni asia valkeni hehkeämmäksi vasta projektia koodatessa. Pelilogiikkani ongelma oli se, että tarvitsin metodia, joka tarkistaa ruudukon tietyn ruudun jokaisen naapurin, ja mikäli naapuri on samanlainen kuin alkuperäinen tietty ruutu, tarkistetaan kyseisenkin ruudun naapurit samanlaisia kuvioita etsien. Assistentti sekä viisas kurssitoverini ehdottivat kauan kammoksumaani sanaa – rekursio. Päätin ottaa aasia hännästä ja katsoa, mitä tapahtuu, kun minä ja rekursio katsomme toisiamme silmiin. Seuraavassa tekemäni metodin rekursio-idea hiukan lyhennettynä, mutta kuitenkin niin, että rekursio tullee selväksi.<span>  </span></p>
<p class="MsoNormal"><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">public</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">boolean</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> </span><span style="background:yellow none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">loytyykoSamaNaapuri</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">int</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> x, </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">int</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> y, Kuva kuva){<span>  </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">boolean</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> loytyy1 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">false</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">boolean</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> loytyy2 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">false</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">boolean</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> loytyy3 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">false</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">boolean</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> loytyy4 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">false</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(x - 1 &#62;= 0){</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">ruudukko</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">[x - 1][y] == kuva){<br />
<span>                </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(!</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.contains(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x-1, y))){<span>              </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                    </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.add(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x-1, y));</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">                                                                                 </span><span style="background:yellow none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">loytyykoSamaNaapuri</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(x-1, y, kuva);</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                         </span><span></span>loytyy1 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">true</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                    </span>}<span>   </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
}<span>  </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span>}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(x + 1 &#60; </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.annaLeveys()){</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">ruudukko</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">[x+1][y] == kuva){</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(!</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.contains(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x+ 1, y))){<span>   </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><span><br />
</span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.add(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x+1, y));</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                    </span></span><span style="background:yellow none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">loytyykoSamaNaapuri</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(x+1, y, kuva);</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><span><br />
</span>loytyy2 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">true</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                     </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">}<span>  </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                </span>}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span>}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(y - 1 &#62;= 0){</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">ruudukko</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">[x][y - 1] == kuva){ </span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>              </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(!</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.contains(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x, y-1)){<span>   </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                    </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.add(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x, y - 1));</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                    </span></span><span style="background:yellow none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">loytyykoSamaNaapuri</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(x, y-1, kuva);</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><span><br />
</span>loytyy3 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">true</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                    </span></span><span style="font-size:10pt;font-family:'Courier New';color:black;">}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                </span>}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span>}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>        </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(y + 1 &#60; </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.annaKorkeus()){</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">ruudukko</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">[x][y + 1] == kuva){ </span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">if</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(!</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.contains(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x, y+1))){</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>         </span><span>       </span></span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">this</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:#0000c0;">koord</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">.add(</span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">new</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"> Point(x, y +1));</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><span><br />
</span></span><span style="background:yellow none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">loytyykoSamaNaapuri</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">(x, y+1, kuva);</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><span><br />
</span>loytyy4 = </span><b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:red;">true</span></b><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">;</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><span><br />
</span>} </span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>                </span>}</span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;"><br />
<span>            </span></span><span style="background:white none repeat scroll 0 50%;font-size:10pt;font-family:'Courier New';color:black;">}</span><span style="font-size:10pt;font-family:'Courier New';"></span></p>
<p class="MsoNormal">Yllä siis tarkastellaan tietyn x,y-ruudun jokaista suuntaa, tutkitaan löytyykö vierestä sama kuva kuin kyseinen ruutu on. Mikäli sama kuva löytyy esimerkiksi ruudun vasemmalta puolelta, lisätään tämän ruudun koordinaatit this.koord-listaan ja tehdään rekursiivinen tutkimus näillä uusilla koordinaateilla, eli kutsutaan sama metodi tarkistamaan myös uuden koordinaatin viereiset ruudut. Tämän metodin kautta itselleni selvisi lopulta rekursion järkevyys, olin välillä jopa niin epätoivon partaalla, että meinasin toteuttaa kyseisen metodin vähintään niillä 25 if-lauseella, jotka olisivatkin olleet sitä ohjelmointityyliä tyylikkäimmillään.</p>
<p class="MsoNormal">Kuten yllä nähdään, ei rekursio lopulta ole kovin monimutkainen asia. Javalla sen toteuttaminen on suhteellisen helppoa, on vain oltava varovainen ja tarkka, että logiikka on rekursiossa oikein. Vaarana voi olla se, että rekursio jää ikuisesti toistamaan itseään, ja siksi esimerkiksi yllä on neljä boolean-apumuuttujaa, jotka määritellään ensin falseksi. Mikäli samoja kuvia löytyy vierestä ja rekursiota lähdetään pyörittämään, vaihtuu apumetodi trueksi. Omassa koodissani metodin suorittaminen loppuu silloin, kun kaikki apumuuttujat pysyvät falseina, eli mistään ei ole löytynyt kuvatun ruudun kanssa samantyylistä kuvaa. Näin siis varmistetaan, että metodin suorittaminen loppuu joskus.</p>
<p class="MsoNormal">Kurssilla on yleisesti opittu, jo ennen rekursiota, se, että yhden metodin A sisältä voidaan kutsua myös muita metodeja, ja käyttää näiden metodien palautusarvoa metodin A edetessä. Esimerkiksi kun metodi A kutsuu sisältään metodia B, metodi A jää odottamaan metodin B edesottamuksia, ja toiminta jatkuu vasta sitten, kun metodi B on valmis ja antanut tuomionsa. Rekursiivisessa metodissa tämä toimii samalla tavalla, on vain otettava huomioon, että samasta metodista voi lähteä useita sisäkkäisiä aktivaatioita eli kutsukertoja samanaikaisesti.</p>
<p class="MsoNormal">Rekursio on näppärä apu ja järkevä käyttää, kun halutaan siisti vaihtoehto esimerkiksi iteratiiviselle, toistoon perustuvalle silmukkaratkaisulle. Esimerkiksi projektini kyseiseen metodiin olen erittäin tyytyväinen, mielestäni sen logiikka pelaa ja ratkaisu on siisti. Kannatti siis tutustua lähemmin rekursioon, se ei ollutkaan pahin viholliseni.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[public class Sieni extends Esine {]]></title>
<link>http://javasoturit.wordpress.com/2008/01/20/public-class-sieni-extends-esine/</link>
<pubDate>Sun, 20 Jan 2008 17:55:23 +0000</pubDate>
<dc:creator>Maiju</dc:creator>
<guid>http://javasoturit.fi.wordpress.com/2008/01/20/public-class-sieni-extends-esine/</guid>
<description><![CDATA[Javassa löytyy mahtavan yllättävä ja tarpeellinen ominaisuus. Se on luokkien periytyminen. Luoka]]></description>
<content:encoded><![CDATA[<p style="margin-bottom:0;">Javassa löytyy mahtavan yllättävä ja tarpeellinen ominaisuus. Se on luokkien periytyminen. Luokalla voi siis olla yliluokka, jonka käyttäytymistä se perii. Jännittävää on myöskin, että luokalla voi olla monia aliluokkia. Luokat järjestyvätkin näin eräänlaiseen puumuodostelmaan. Periyttäminen on myökin näppärä tapa niputtaa saman tyylisiä luokkia. Esimerkiksi luokasta Koira on helppo tehdä aliluokkia erilaisille koirille ilman, että koodi vaatii paljon muutoksia. Jos meillä vaikka on Koira-luokan aliluokat Mäyräkoira ja Saksanpaimenkoira, ja silti huomaamme, että tarvitsemme vielä luokan Labradorinnoutaja, voimme vain tehdä siitä uuden aliluokan Koiralle. Jos kaikki olisi samassa luokassa, muutoksia tarvittaisiin useisiin paikkoihin tai sitten erilliseen Labradorinnoutaja-luokkaan joutuisi tekemään lähes identtistä koodia kuin muihinkin koiraluokkiin.</p>
<p style="margin-bottom:0;">Periyttäminen avaa aivan uusia mahdollisuuksia koodaajalle. Periyttämällä jonkun oman luokan jostain valmiista (tai toisesta omasta luokasta) saa käyttöönsä luokan julkiset metodit ja attribuutit. Myös protected-määre avaa ovet metodien käyttämiseksi aliluokassa. Itsekin huomasin tämän koodatessani omaa pallopeliäni. Periytin palloni luokasta Ellipse2D.Double, ja sain käyttööni sen julkiset metodit. Niistä hyödyllisin oli ehdottomasti getBounds2D()-metodi, jonka avulla sain pallon ja kursorin törmäyksen helposti selvitettyä.</p>
<p style="margin-bottom:0;">Java tarjoaa myös uskomattoman kokoelman pakkauksia ja niissä valtavan määrän luokkia, joista ohjelmoijat voivat mielensä mukaan periyttää omia luokkiaan. Tämä säästää jokaista ohjelmoijaa itseään erittäin paljon, sillä ellei olisi mahdollisuutta periyttää ja käyttää valmiina olevia luokkia, jokainen joutuisi mahdottoman suuren työmäärän eteen. Periyttäminen lyhentää koodirivien määrää: samanlaisten metodien luomisesta jokaiseen luokkaan säästyy periyttämällä kaikki luokat samasta yliluokasta. Esimerkiksi sen sijaan, että tekisi sekä Mäyräkoira- että Saksanpaimenkoira-luokille omat samanlaiset merkkaaReviiri()-metodit, voi vain periyttää kummankin luokasta Koira. Jos metodin toteutuksen halutaan kuitenkin olevan hieman erilainen, on parempana vaihtoehtona tarjolla myös rajapinnat ja abstaktit luokat. Abstrakti-luokka toimii suurelta osin samoin tavoin kuin rajapintakin kuitenkin sillä erotuksella, että luokka voi periä ainoastaan yhden (abstraktin)luokan, mutta toteuttaa monta rajapintaa. Abstrakti yliluokka antaa tosin enemmän mahdollisuuksia: voi esimerkiksi valita kirjoittaako sinne kokonaista koodia vai pelkästään metodeita joiden toteutus määritellään periytyvissä aliluokissa. Rajapintaan kun taas ei voi kirjottaa kokonaista koodia.</p>
<p style="margin-bottom:0;">Periyttäminen on kuitenkin erittäin hyödyllinen ominaisuus, johon tutustuttiin jo Java1-tehtäväkierroksella. Vaikka silloin tiesin, että Sieni perii luokan Esine, en vielä ymmärtänyt todella mitä se oikein tarkoittaa. Vasta myöhemmin olen löytänyt periytymisen valtavan hienot mahdollisuudet ja valmiiden luokkien hyödyntämisen uusia luodessa.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Portfolio - Ohjelmoimaan oppiminen]]></title>
<link>http://stud13.wordpress.com/2008/01/20/portfolio-ohjelmoimaan-oppiminen/</link>
<pubDate>Sun, 20 Jan 2008 17:51:20 +0000</pubDate>
<dc:creator>Antti</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/portfolio-ohjelmoimaan-oppiminen/</guid>
<description><![CDATA[Alussa aina mahdotonta, tuntui syyskuun puolivälin tuntumilla. En saanut mistään oljenkorresta ki]]></description>
<content:encoded><![CDATA[<p style="margin-bottom:0;">Alussa aina mahdotonta, tuntui syyskuun puolivälin tuntumilla. En saanut mistään oljenkorresta kiinni ennen syöksykierrettä alas. Näin jälkiviisaana, kaiken kantapään kautta oppineena on helppo pohtia, mitkä ohjelmoinnin apukeinot ja opetusmenetelmät olisivat kantaneet hedelmää nopeammin, ainakin omalta kohdaltani.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Ensimmäinen kosketus Javaan on hyvä aloittaa, kuten tehtiinkin, Hello World -tyyppisellä miniohjelmalla, jossa vasta-alkajat saavat heti jotain konkreettista aikaiseksi ja lyhyen esimerkin siitä, miltä koodinpätkä näyttää, varsinkin silmällä pitäen Javan kielioppia. Tuleva ohjelmointilupaus saa esimaun Javan yksinkertaisimmista rakenteista.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Muistan kurssin seuraavana askeleena hyvin lennokkaat ja filosofiset luennot, sekä olo-tapaamiset, joissa perehdyttiin olio- ja luokkamaailmaan. Näistä ei kuitenkaan vielä tässä vaiheessa kostu paljoakaan. Vaikka luennoilla asiat vaikuttivat sinänsä järkeenkäyviltä ja kirjan opetukset selkeiltä, todellisuus oli karu. Kun piti käydä käsiksi itse harjoituksiin, osoittautui, ettei paljoakaan ollut mukaan tarttunut.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Aivan ensimmäiseksi luokan rakennetta olisi voinut terävöittää korostamalla entisestään luokan rakenteen kahtiajakoa metodeihin ja attribuutteihin. Konstruktorin ja pääohjelmametodin voi esitellä myöhemmin.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Seuraavaksi voisi valottaa tiedon varastoimista ja tietotyyppejä. Tietotyypit voisi kannattanee esitellä ikään kuin muoteiksi varastoitavalle tiedolle ja selittää, että useimmat näistäkin ovat olioita. Näillä tietopalikoilla metodit sitten leikkivät. Myös metodin puumerkki tulee pilkkoa osiin (näkyvyysmääre, palautusarvo, nimi ja parametrit) ja selventää näiden merkitystä. Legendaarinen, mutta aluksi hyvin kryptinen <font face="Simplified Arabic Fixed, monospace">public static void main(String[] args)</font> käy esimerkistä. Metodin erikoistapaukset, konstruktori ja pääohjelmametodi, täytyykin opettaa jossain näillä main.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Jotta metodeja osaa käyttää, on seuraavaksi tuotava mukaan sitä filosofiaa ja määrittää ohjelma olioiden vuorovaikutukseksi. Tämä on kriittinen vaihe ja rinnakkainen edellisen kappaleen aiheiden kanssa. Se, että ymmärtää, että luokka on vain olioiden resepti, josta näkee mistä ne on tehty, miten ne tehdään ja mitä niillä voi tehdä, on tärkeää. Vasta luokan ohjeiden perusteella tehty olio voi <i>kutsua</i><span style="font-style:normal;"> luokkaan koodattuja metodeja. Pisteoperaattori ja sen rakenne meni omalta osaltani ohi, ja tuskailin sen kanssa vielä kolmannessa Java-harjoituksessa. Kuten sanottu, vasta tässä kohtaa valottuu konstruktorin ja pääohjelmametodin tarkoitukset ja eksistentiaaliset viittaussuhde konseptit.</span></p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;font-style:normal;">	Käytännön opetuksissa korostettiin voimakkaasti oikeaoppista koodin jäsennystä ja muotoa, mitkä iskostuivatkin takaraivoon. Kielioppiongelmia ja kääntövirheitä, joiden suossa itse tarvoin viikkoja, ei pitäisi liiemmin ilmetä, jos alkeet opittiin tehokkaasti.</p>
<p style="margin-bottom:0;font-style:normal;">&#160;</p>
<p style="margin-bottom:0;font-style:normal;"><span style="font-style:normal;">	Näiden perusasioiden jälkeen laajennetaan toistorakenteisiin kuten, if-lauseisiin ja for-luuppeihin ja esitellään lisää esimerkiksi tiedonvarastoijaolioita (listat, mapit, joukot, jne.) sekä tyypillisimmät poikkeukset. Asiakokonaisuus kerrallaan tiedot ja taidot karttuvat ja tästä eteenpäin homma sujun</span>ee mallikkaasti myös itseopiskeluna. Itsenäistä työskentelyä ajatellen voisi Eclipsen deduggauksen sisällyttää ohjelman luentoon, ja Eclipseen voisi siirtyä aikaisemmin. <span style="font-style:normal;">Näitä isompia paloja ei kuitenkaan kannata haukata, ennen kuin perusteet ovat hallinnassa.</span></p>
<p style="margin-bottom:0;font-style:normal;">&#160;</p>
<p style="margin-bottom:0;font-style:normal;">	Helppo tehtävä tämä kaikki ei ole, varsinkin kun kurssi lähtee käyntiin varsin vauhdikkaasti ja vieläkin hankalamman tehtävästä tekee kaltaiseni tahvot, joilla ei ole minkäänlaista aiempaa kokemusta ohjelmoinnista. Jokin ydin pitää  määritellä, jonka pohjalta ohjelmointityö aloitetaan, ja jonka ympärille lisätieto voi kertyä. Tällaisen lähtöpisteen pelkkä määrittely on pulmallista, kun sen pitäisi olla madollisimman suppea, mutta yksinkertainen ja samalla siihen ei saisi jäädä epäselvyyksiä. Suuri vastuu on myös ohjelmoijalle itsellään, ja kärsivällisyyttä kysytään aina kun tutustutaan uuteen.</p>
<p style="margin-bottom:0;font-style:normal;">&#160;</p>
<p style="margin-bottom:0;font-style:normal;">	Käytännön kannalta voisi ajatella myös harjoituksiin tasoryhmiä, niin kuin muistan eräässä olosessiossa esitettäneen. Näin voidaan puuttua usein toistuviin ja vallitseviin ongelmiin ja niiden syihin henkilökohtaisella tasolla, sekä luoda miellyttävämpi työskentely-ympäristö.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Portfolio – Ohjelmointiin suhtautuminen ja sen muutos]]></title>
<link>http://stud13.wordpress.com/2008/01/20/portfolio-%e2%80%93-ohjelmointiin-suhtautuminen-ja-sen-muutos/</link>
<pubDate>Sun, 20 Jan 2008 17:47:49 +0000</pubDate>
<dc:creator>Antti</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/portfolio-%e2%80%93-ohjelmointiin-suhtautuminen-ja-sen-muutos/</guid>
<description><![CDATA[Tämä katkelma purkaa suhtautumistani ohjelmointiin ja kirjoitankin siitä, mikä minua kouraisi ka]]></description>
<content:encoded><![CDATA[<p style="margin-bottom:0;">Tämä katkelma purkaa suhtautumistani ohjelmointiin ja kirjoitankin siitä, mikä minua kouraisi kaikkein syvimmältä menneen syys-talven aikana.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Alussa ei ollut hajuakaan. Missään lyhyen elämäni vaiheessa en ollut edes kurkistanut minkälaiselta valmis ohjelmakoodi oikein näyttää. Itse asiassa pidin ohjelmointia sinä yhtenä harmaana pilvenä Informaatioverkostojen tutkinto-ohjelman taivaalla. Alta pois vain, tuumin. 	Ainoa, joskin surkea, lähtökohta oli koodaajan stereotyyppi, jossa sosiaalisesti rajoittuneet nörtit tuhlaavat aikaansa näytön takana. Jälkikäteen oikein itkettää, miten vääristynyt irvikuva tämä on.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Olin kurssin alkaessa pihalla kuin lumiukko, enkä saanut otetta oikein mistään. Räpiköin Java tehtävistä läpi oikeastaan ymmärtämättä, mitä niissä luokissa oikein tapahtui. Vasta kolmannen harjoituksen aikana Javan perimmäinen logiikka avautui, mutta olin jo auttamattomasti jäljessä.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Kaikki tuo aika oli turhauttavaa, mutta vielä vähemmän ymmärsin omaa suhtautumistani ohjelmointiin. Ilmeisesti se, että verhon takaa ei paljastunutkaan sitä finninaamaista, näppäimistöä monotonisesti hakkaavaa teiniä, vaan jokin paljon seesteisempi ja ylevämpi maailma, sai minut kiinnostumaan ja pakotti kirimään takaisin muiden rinnalle. Totta kai, ohjelmoimaan istahtaminen  pelotti aina hieman, (tuleeko tästä mitään!) mutta itse työ oli varsin mielekästä ja inspiroivaa. Suuri kiitos tästä viehätyksestä kuuluu hauskoille harjoitustehtäville.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Erityisesti yllätyin ohjelmoinnin loogisuudesta. Siisteyttä ja minimalismia arvostavana minua huojensi, kun aluksi ruma merkkien sekamelska jäsentyi hyvin järkeviksi palasiksi, joita voi kuvitella pystyvänsä tuottamaan itsekin. Ei ohjelmointiin turhaan liitetä suffiksia <span style="font-style:normal;">”kieli”</span>.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Kielistä puheen ollen, englannissa on mainio sana <i>grind</i>, jonka yksi merkitys viittaa raskaaseen, läpensä tylsään ja kehityksellisessä umpikujassa riutuvaan työhön. Suurin ero ennakko-odotusteni ja todellisuuden välillä oikeastaan kulminoituu tähän sanaan. Ohjelmointi ei ollutkaan grindaamista. Päinvastoin se vaatii luovuutta. Se vaatii ongelmanratkontaa ja suunnittelua. Se esittelee ohjelmoijalle jatkuvasti uudenlaisia haasteita ja alati muuttuvan työskentely-ympäristön. Syyskuun loppupuolella olin siis <i>sekä</i> kaikesta pihalla, <i>että</i> ällikällä lyöty.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	En toisaalta ihmettele edellä mainitun stereotypian olemassa oloa. Ulkopuoliselle tarkkailijalle, jonkalainen itsekin siis olin, voi todella muodostua mielikuva elämättömästä koodaajasta, kun raukka viettää tyytyväisenä perjantai-illat koneen äärellä APIja selaillen tai jännittyneesti debuggaillen. Sivustakatsojalla ei tietenkään ole aavistustakaan, mistä on jäänyt paitsi.</p>
<p style="margin-bottom:0;">&#160;</p>
<p style="margin-bottom:0;">	Tuskin tästä kaikesta mitään leipätyötä tulee, mutta ohjelmoinnin peruskurssin jälkeen pystyn suhtautumaan huomattavasti rennommin siihen, mitä opinto-ohjelma tuo seuraavaksi tullessaan. Ohjelmoinnin kanssa tekemisissä oleminen ei enää pelota; möröt on kohdattu – jopa voitettu, onneksi heti näin alkuvaiheessa, joka oli sekin liian myöhään.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Parannusehdotuksia.]]></title>
<link>http://javasoturit.wordpress.com/2008/01/20/parannusehdotuksia/</link>
<pubDate>Sun, 20 Jan 2008 17:39:23 +0000</pubDate>
<dc:creator>altti</dc:creator>
<guid>http://javasoturit.fi.wordpress.com/2008/01/20/parannusehdotuksia/</guid>
<description><![CDATA[Laajuudessaan Studio 1-kurssi taitaa vetää vertoja kaikille muille kursseille koko ihmiskunnan his]]></description>
<content:encoded><![CDATA[<p>Laajuudessaan Studio 1-kurssi taitaa vetää vertoja kaikille muille kursseille koko ihmiskunnan historiassa. Kurssin selkärankana toimineet kahden viikon välein palautetut ohjelmointitehtävät olivat kokonaisuutena varsin onnistuneita. Kuitenkin neljän ensimmäisen tehtävän pohjautuminen aina edellisten varaan alkoi syömään motivaatiota. Ymmärrän, että uusien asioiden esittely on helpompaa, kun pohjaa ei joka kerta tarvitse rakentaa uudestaan. Ensimmäiset tehtävät olisi kuitenkin voinut jakaa kahteen erilliseen kokonaisuuteen. Lisäksi ainakin ensimmäisten viikkojen aikana harjoituksia olisi voinut olla enemmän.</p>
<p>Ohjelmointitehtävien välissä palautetut esseistä/käsitekartoista en itsestään löydä sinänsä mitään vikaa. Ohjelmointi on kuitenkin hyvin konkreettista, ja asioihin tutustuminen ja niiden pohtiminen ilman että niitä kokeilee käytännössä ei välttämättä edistä oppimista parhaalla mahdollisella tavalla. Usein kävi niin, että vasta paljon esseen palauttamisen jälkeen, kun ensimmäisen kerran tarvitsi esseessä käsiteltyä aihetta, ymmärsi mitä oli aikoinaan kirjoittanut. Eikä silloinkaan ainakaan omalla kohdalla tullut sellainen olo, että esseistä olisi ollut olleellista hyötyä. Jotain konkreettista olisi esseiden kirjoittamisen yhteydessä pitänyt tehdä.</p>
<p>Kurssiin sisältyi lisäksi täysin irrallisilta tuntuneet robottiturnaus ja bottiseminaari. Erityisesti robottiturnauksessa kävi varsin pian selväksi, että ryhmän sisällä oli havaittavissa selkeitä tasoeroja, eikä tehtävä mahdollistanut erillisten vastuualueiden jakamista. Käytännössä tämä tarkoitti sitä, että ryhmän edistyneimmät keksivät parhaat ratkaisut ja jo ensimmäisen ryhmätapaamisen jälkeen tuntui että oli täysin yhdentekevää mitä muut ryhmän jäsenet tekivät. Bottiseminaaria varten ryhmän jäsenten oli jo huomattavasti helpompi keskittyä omien ominaisuuksien kehittämiseen. Silti, kurssin laajuuden huomioon ottaen, myös tämä tuntui hieman ylimääräiseltä.</p>
<p>Kurssin alkupuolella kokoontuneet OLO-sessiot mahdollistivat dialogin käymisen ryhmän jäsenten välillä, mutta keskustelujen pysyminen liian abstraktilla tasolla ei ehkä näin vasta-alkajille antanut kovin paljon. Sessiot olisivat voineet käsitellä esimerkiksi tulevana viikonloppuna palautettavassa ohjelmointitehtävässä esille tulleita vaikeuksia. Tosin uudenlaisen oppimistavan esittelynä OLO oli mitä mainioin tuttavuus.</p>
<p>Ehkä kurssin ärsyttävin ja omasta mielestäni kaikkein turhin osio oli tämä blogi, poislukien varsin mielekkäiltä tuntuneet portfoliokysymykset. Jos blogin tarkoitus oli edistää ryhmän jäsenten välistä vuoropuhelua, ei se ainakaan omasta näkökulmasta tuntunut sitä tekevän. Dialogia olisi voinut käydä vaikkapa ircissä sovittuina ajankohtina, vaikkakaan mielestäni sitäkään ei tarvita.</p>
<p>Kurssin huipennus, eli oma ohjelmointiprojekti oli ehkä kurssin mielekkäin osio. Se kokosi hyvin yhteen kaikki kurssilla opiskellut aiheet ja päästi valloilleen luomisen innon, mitä ei aina muissa ohjelmointitehtävissä päässyt toteuttamaan.</p>
<p>Kaiken kaikkea, kurssi oli varsin mielenkiintoinen paketti. Itse ehdottaisin keskittymään konkreettiseen ohjelmointiin ja lisäisin ohjeistettuja harjoituksia. Selkeästi vähemmän ylimääräistä härpäkettä ja kirjoittelua.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Kurssin työkalupakki]]></title>
<link>http://stud13.wordpress.com/2008/01/20/kurssin-tyokalupakki/</link>
<pubDate>Sun, 20 Jan 2008 15:54:11 +0000</pubDate>
<dc:creator>Suni</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/kurssin-tyokalupakki/</guid>
<description><![CDATA[Kurssin alkajaisiksi meidät ohjattiin käyttämään koodauspuuhissa Emacs-tekstieditoria. Silloin ]]></description>
<content:encoded><![CDATA[<p>Kurssin alkajaisiksi meidät ohjattiin käyttämään koodauspuuhissa Emacs-tekstieditoria. Silloin ei vielä tiennyt paremmasta ja niinpä se tuntuikin silloin varsin hyvältä ohjelmalta. Ainakin itse ajattelin, että onpas hienoa kun tekstieditori helpottaa työskentelyä värjäämällä koodista javaksi tunnistamiansa sanoja. Kurssin mittaan ajatukset kyseisestä ohjelmasta ovat kuitenkin muuttuneet "hiukan".</p>
<p>Parin harjoituskierroksen jälkeen alkoi korviin kantautua huhuja jostain toisesta ohjelmasta, joka helpottaisi  koodausta entisestään. Ohjelman nimeksi paljastui Eclipse ja pakkohan sitä oli sitten heti kokeilla. Mitä pidemmälle tehtäväkierrokset etenivät, sitä useampi phuksi oli vaihtanut Emacsin Eclipseen. Lopulta kun tehtävissä alettiin tarvitsemaan swingiä, meille pidettiin luento Eclipsestä ja meitä kehoitettiin viimeistään siinä vaiheessa vaihtamaan siihen. Kun kokeilin Eclipseä ensimmäistä kertaa oli järkytys suuri. Se osasi kertoa melkein virheestä kuin virheestä, heti kun sen oli kirjoittanut. Muutenkin Eclipse oli yhtä juhlaa Emacsin jälkeen.</p>
<p>Vaikka ymmärränkin mihin sillä, että alkukurssilla suositaan Emacsia,  pyritään, olen useampaankin kertaan miettinyt onko siitä oikeasti niin paljon hyötyä, että sen käyttö kannattaa. Tottahan se on, että Emacsia käyttäen oppii tietyt asiat kunnolla kantapään kautta, mutta toisaalta sitä käyttäessä menee aikaa luvattoman paljon hukkaan monen turhan asian kanssa. Esimerkiksi kirjoitusvirheiden metsästys koodin seasta on mielestäni täysin turhaa touhua. Lisäksi Emacs ei ole käytettävyydeltään mikään maailman loistavin ohjelma, joten onko sen käytön opetteleminen muutamaa harjoitustehtävää varten kovin mielekästä.</p>
<p>Kurssin mittaan tuli tarvetta myös monille muille ohjelmille pelkän tekstieditorin lisäksi. Kaikennäköisiä ssh-, tiedostonsiirto-, tekstinkäsittelyohjelmia, jne... on tullut kurssin aikana käytettyä. Ja tietenkin, ah niin ihanat, käsitekartta ja dialogikarttaohjelmat. Lähes kaikkien tarvittavien ohjelmien käyttö on käyty läpi joko lapiokurssilla tai Studio1:llä. Mielestäni olisi kuitenkin hyvä lisätä kurssin kotisivuille linkkejä tai pieniä ohjeia esimerkiksi kuvankäsittelyyn ja äänitiedostojen muokkaukseen liittyen, sillä useat niitä kuitenkin tarvitsevat viimeistään projektia tehdessä.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Kuulutko joukkoon?]]></title>
<link>http://hepalonsorkat.wordpress.com/2008/01/20/kuulutko-joukkoon/</link>
<pubDate>Sun, 20 Jan 2008 13:25:09 +0000</pubDate>
<dc:creator>Teemu P.</dc:creator>
<guid>http://hepalonsorkat.fi.wordpress.com/2008/01/20/kuulutko-joukkoon/</guid>
<description><![CDATA[Matemaattisesti joukko on ”toisistaan erotettavien objektien (olioiden) yhdistelmä” [1]. Joukko]]></description>
<content:encoded><![CDATA[<p>Matemaattisesti joukko on <i>”toisistaan erotettavien objektien (olioiden) yhdistelmä”</i> [1]. Joukko voi olla vaikka ihmisjoukko, kokonaislukujoukko tai suomenlapinkoirajoukko <i>:hopeanuoli:</i>. Javassa joukko ei ole mikään hämärä käsite – ”rakas” ohjelmointikielemme tuntee samat eksaktit käsitteet kuin matematiikkakin: <i>leikkaus (intersection)</i>, <i>erotus (difference)</i> ja <i>yhdiste (union)</i>. Itse asiassa Javan joukko jäljittelee matemaattisen joukko-käsitteen mallia.<br />
<img src="http://users.tkk.fi/~tpoikela/k%e4sseeblog/joukko.jpg" align="right" height="262" width="300" /></p>
<p style="margin-bottom:0;">Joukot ovat tuttuja otuksia Java-kotitehtävistä. Javassa joukoilla on joskus varsin näppäräksi osoittautuva ominaisuus: ne ottavat alkiokseen vain yhden identtisen alkion, joten ne sopivat hyvin vaikkapa mallintamaan <i>sienikoria</i>. Eihän kukaan sienestäjä nyt kahta saman sienilajin sientä poimisi, eihän? Mikäli joukko sisältää jo alkion <i>”kanttarelli”</i>, ei toista samannimistä alkiota <i>”kanttarelli”</i> huolita enää mukaan. Tietysti jos näiden <i>herkullisuus</i>-arvo on eriävä, niin silloin tarkkasilmäinen sienestäjä huomaa eron ja kelpuuttaa tämän henkilökohtaiseen sienikori-joukkoonsa.</p>
<p style="margin-bottom:0;">Samassa joukossa ei siis voi olla alkioita <i>a</i> ja <i>b </i><span style="font-style:normal;">siten että <code>a.equals(b); </code>on tosi [2].  Kaksi joukkoa ovat ekvivalentit (samat) jos ne sisältävät samat alkiot.</span></p>
<p style="margin-bottom:0;"><font face="Courier New, monospace">Java.util.Set</font> on rajapinnan <i>Collection&#60;E&#62;</i> <i>alirajapinta. </i><span style="font-style:normal;">Itse asiassa </span><i>Set </i><span style="font-style:normal;">on kokoelma, joka toteuttaa <i>ainoastaan</i> Collectionin metodit sisältäen samalla tupla-alkioiden eston [2]. Set-rajapinnan toteuttavia joukkoja ovat mm. <i>TreeSet</i>, <i>HashSet </i>ja <i>LinkedHashSet.</i> </span><i>Set-</i><span style="font-style:normal;">rajapinta ei määrittele joukolle mitään tiettyä järjestystä. Jos on tarve käyttää joukkoa ja järjestää alkiot tiettyyn järjestykseen, tarvitaan <i>SortedSet</i>-rajapinnan toteuttava joukko. Joillakin Setin toteutuksilla on tietynlaisia rajoitteita lisättäville alkioille, esim. jotkut joukot eivät ota alkioikseen <i>null</i>-arvoja[2].</span></p>
<p style="margin-bottom:0;"><i>HashSet</i> on monipuolinen tietorakenne. Jos nyt haluaisimme luoda vaikkapa tällaisen HashSetin, voimme lausua taikasanat:</p>
<p style="margin-bottom:0;"><code>Set&#60;NoJaa&#62; blaa = new HashSet&#60;NoJaa&#62;();</code></p>
<p style="margin-bottom:0;">Tämä joukko ottaa alkioikseen ainoastaan NoJaa-luokan (ja sen jälkeläisluokkien) ilmentymiä.</p>
<p><img src="http://users.tkk.fi/~tpoikela/k%e4sseeblog/phuksijoukko.jpg" align="bottom" height="323" width="400" /></p>
<p style="margin-bottom:0;">Koska Javan joukko toteuttaa Collection-rajapinnan, kaikki tutut tietorakenne-metodit ovat käytössä. Voidaan lisätä (<code>add</code>) tai poistaa alkioita (<code>remove</code>) tai tarkistaa, sisältääkö joukko tietyn alkion(<code>contains</code>). Joukon läpikäymiseen tarvitaan erillinen <i>iteraattori-</i><span style="font-style:normal;">olio, mutta se on pieni miinus ottaen huomioon joukon helppokäyttöisyyden ja monipuolisuuden tietorakenteena.</span></p>
<p> - Teemu<br />
<font size="1"><br />
[1] <a href="http://fi.wikipedia.org/wiki/Joukko-oppi">Joukko-oppi, Wikipedia</a><br />
[2] <a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Set.html">Java API SE 5.0: Set</a><br />
</font></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Kuinka opettaa ohjelmoimaan?]]></title>
<link>http://stud13.wordpress.com/2008/01/20/kuinka-opettaa-ohjelmoimaan/</link>
<pubDate>Sun, 20 Jan 2008 11:19:58 +0000</pubDate>
<dc:creator>Suni</dc:creator>
<guid>http://stud13.fi.wordpress.com/2008/01/20/kuinka-opettaa-ohjelmoimaan/</guid>
<description><![CDATA[Ohjelmointi on  hankala asia opettaa. Ohjelmointi on loppupeleissä aika pitkälti käytännön työ]]></description>
<content:encoded><![CDATA[<p>Ohjelmointi on  hankala asia opettaa. Ohjelmointi on loppupeleissä aika pitkälti käytännön työskentelyä, jota oppii vain tekemällä, mutta kuitenkin jo pelkästään alkuun pääseminen vaatii paljon pohjatietoa, mitä on pakko opetella jotenkin muuten. Tämä asettaa paljon haasteita ohjelmoinnin opettamiselle. Opetuksessa pitäisi löytää se sopiva tasapaino käytännön harjoituksien ja teoripohjaisen opetuksen kuten luentojen ja kirjan pänttäyksen välille.</p>
<p>Studio1-kurssilla opetuksessa keskityttiin lähinnä käytännön harjoitteluun. Luentoja oli syksyn mittaan hyvin vähän, mutta muuta tekemistä sitäkin enemmän. Itse kaipasin lisää luentoja vain aivan kurssin ensimmäisille viikoille, jolloin työskentely oli vasta aluillaan ja kaikki aivan perusasiatkin olivat vielä täysin hukassa. Loppukurssista luentoja ei enää oikeastaan kaivannut ollenkaan ja nekin luennot, joita oli, tuntuivat vähän väkisin väännetyiltä ja turhilta. Samat asiat oppi paremmin seuraamalla netistä löytyviä tutoriaaleja.</p>
<p>Tärkeintä ohjelmoinnin opettamisessa on opettaa opetettavalle mistä hän voi etsiä tietoa ja ratkaisuja ongelmiin. Koska ongelmia on niin paljon eri tyypisiä, että on mahdotonta opettaa ratkaisuja niihin kaikkiin, on tärkeämpää opettaa mistä ratkaisuja voi etsiä. Kirjoista löytyy kattavasti tietoa lähes asiasta kuin asiasta, mutta tiedon etsiminen on usein hidasta ja työlästä. Niinpä opetuksessa kannattaa painottaa sähköisten tietolähteiden merkitystä tiedon etsimisen välineinä. (En haluaisi mainostaa, mutta...) Google on ohjelmoijan paras kaveri. API tulee heti perässä hyvänä kakkosena.</p>
<p>Assarivetoiset harjoitukset ovat elintärkeitä osia ohjelmointikurssin järjestämisessä. Kun itsenäinen harjoitusten vääntäminen tyssää johonkin ylimaalliseen ongelmaan on tärkeää, että viikottain on mahdollisuuksia konsultoida assareita, jottei yksi ongelma kaataisi koko tehtävän tekemistä. Näitä ohjelmointiharkkojakin voi vetää monella eri tavalla. Joillakin ohjelmoinnin peruskursseilla harjoitukset ovat (kuulemma) hyvin assaripainoitteisia: assari käy läpi kädestä kiinni pitäen kuinka asiat tulee tehdä. Itse olen kyllä vahvasti itsenäisemmän työskentelyn kannalla, jossa assarit ovat vain ongelmatilanteita varten.</p>
<p>Olen kaikinpuolin erittäin tyytyväinen kohta loppuvaan Studio1-kurssiin ja sen käytännön järjestelyihin. Muut kurssit voisivat hyvin ottaa mallia siitä miten hommat Studio1:llä on hoidettu. Kurssi on pakottanut tekemään itsenäistä työtä ja raitkaisemaan ongelmia omin neuvoin, mutta ei ole kuitenkaan jättänyt ketään hätään vaan aina on ollut apua saatavilla tarpeeksi. Tämä itsenäiseen tiedonhakuun ja ongelmanratkaisuun ohjaaminen on se asia mihin kaikessa ohjelmoinnin opetuksessa tulisi pyrkiä. Ohjelmoinnissa tärkeintä on, että osaa hakea ja soveltaa uutta tietoa erilaisista tietolähteistä, koska lähes ongelmaan kuin ongelmaan löytyy ratkaisu kaikille avoimista tietolähteistä, jos vain sitä osaa etsiä.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Portfoliokysymys 2: Miten ajatukseni ohjelmoinnista on muuttunut kurssin aikana?]]></title>
<link>http://studiovompatti.wordpress.com/2008/01/20/portfoliokysymys-2-miten-ajatukseni-ohjelmoinnista-on-muuttunut-kurssin-aikana/</link>
<pubDate>Sun, 20 Jan 2008 07:54:04 +0000</pubDate>
<dc:creator>perttu</dc:creator>
<guid>http://studiovompatti.fi.wordpress.com/2008/01/20/portfoliokysymys-2-miten-ajatukseni-ohjelmoinnista-on-muuttunut-kurssin-aikana/</guid>
<description><![CDATA[Kesän loppupuolella postiluukusta kolisi muiden TKK:n esitteiden seassa psykedeelisten kalojen siiv]]></description>
<content:encoded><![CDATA[<p>Kesän loppupuolella postiluukusta kolisi muiden TKK:n esitteiden seassa psykedeelisten kalojen siivittämä esite, jonka viesti oli jotakuinkin seuraava: "Javaa, kivaa, tänä syksynä." Kivaa tai ei - ainakin täysin uutta. Saavuin Studio 1:lle vailla ohjelmointikokemusta, vaikka olenkin peuhannut koneiden kanssa jo esikouluikäisestä. Pascalia olin joskus kokeillut, sekä kirjoittanut joitain shelliskriptoja Linuxin bash-terminaalissa, mutta koodaus oli melko etäinen asia. Nyt, kun pohja valettu, on helppo jatkaa eteenpäin mikäli tarve vaatii.</p>
<p>Ennen kurssia luulin ohjelmoinnin suurimpien haasteiden olevan useiden kielten osaamisessa ja niiden laajuudessa. Osoittautuikin, että vajaan puolen vuoden javailun jälkeen pystyy saamaan enemmän tai vähemmän selkoa muidenkin ohjelmointikielten syntaksista, vaikkei välttämättä kyseisellä kielellä osaisikaan ohjelmoida. Suurin haaste ohjelmoinnissa onkin järkevän ohjelmointilogiikan opetteleminen. Sellaisen, että asiat<br />
pyritään tekemään mahdollisimman yksinkertaisesti, mutta silti selkeästi. Niin, että muutkin saavat koodista selvää.</p>
<p>Hyvä ohjelmointitekniikka kehittyy yhä satojen ja satojen koodaustuntien tuloksena. Aivan kuten matematiikassakin: saman ongelman ratkaisemiseksi on tarjolla useita, jopa kymmeniä, ratkaisutapoja. Osa niistä on elegantteja ja tehokkaita - toiset kovin kömpelöitä tai vaikeaselkoisia. Järkevämmät ratkaisutavat säästävät resursseja, joka tietokonemaailmassa tarkoittaa sitä, että ongelman ratkaisemiseen tarvitaan vähemmän laskukapasiteettia. (Vrt. esim piin laskeminen Monte Carlo -menetelmällä ja monikulmiometodin käyttö)</p>
<p>Keskustelin muutamia vuosia sitten erään suomalaisen ohjelmoijan kanssa ja esitin pari toivetta, jotka olisin nähnyt mielelläni softan seuraavassa versiossa. Hän totesi, että nykyiseen versioon on vaikea koodata edellä mainittuja lisäominaisuuksia, mutta kertoi olevansa koodaamassa uusiksi softaa - kakkosversiota, johon kyseiset ominaisuudet olisivat tulossa. En käsittänyt, miksei vanhaa softaa voinut tai kannattanut enää laajentaa. Kunhan koodaisi vaan puuttuvan osan ja liittäisi sen kokoonpanoon?</p>
<p>Ei siis riitä, että ohjelmakoodi pelkästään toimii ja on selkokielistä. Sen tulisi olla myös helposti laajennettavaa. Kenties siten, että muutkin<br />
pystyvät lisäämään ohjelmaan haluamiansa toiminallisuuksia. Ohjelmoinnissa, kuten muuallakin elämässä, hyvä pohjustus ja suunnittelu on puoli voittoa.</p>
<p>Aloittelevana koodarina tuli tehtyä monia "virheitä". Koodiin tuli helposti overheadia - ajattelin asioita paljon monimutkaisemmin, kuin ne oikeastaan olivat. Seuraavana päivänä saattoi miettiä, mitä ihmettä oikein koodasi. Silti se toimi, vaikka neljä sisäkkäistä if-lausetta ei välttämättä ole järkevin tapa. Silmä kuitenkin kehittyi ja kurssin edetessä oppi uusia tapoja, millä koodista saa entistä esteettisempää.<br />
Malliratkaisujen lukeminen auttoi runsaasti oman ohjelmointityökalupakin laajentamisessa. Vanhojen menetelmien tilalle tuli uusia ja tehokkaampia keinoja.</p>
<p>Ennen kurssia en myöskään uskonut, että hyvän ohjelmakoodin tekeminen vaatii niinkin draamattista määrää testausta. Metodin ei tarvinnut olla edes kovin monimutkainen ja silti sillä sai NullPointerExceptionin aikaan ainakin viidellä eri tavalla. Kun pelkästään tällä kurssilla tehdyt ohjelmat vaativat useiden tuntien eksplisiittistä testausta, en enää ihmettele, miksi Ubuntunikin kyykkää joskus!</p>
<p>Kaikki kunnia niille jotka ammatikseen koodaavat, sillä itse joudun sanomaan: "Ei kiitos."</p>
]]></content:encoded>
</item>

</channel>
</rss>
