<?xml version="1.0" encoding="UTF-8"?>
<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/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Ville Salonen</title>
	<atom:link href="http://villesalonen.fi/feed/" rel="self" type="application/rss+xml" />
	<link>http://villesalonen.fi</link>
	<description>Ville Salonen - Software Designer, Photographer</description>
	<lastBuildDate>Sun, 20 May 2012 09:21:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>What (Natural) Language To Program In?</title>
		<link>http://villesalonen.fi/2011/what-natural-language-to-program-in/</link>
		<comments>http://villesalonen.fi/2011/what-natural-language-to-program-in/#comments</comments>
		<pubDate>Wed, 07 Dec 2011 16:16:13 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=556</guid>
		<description><![CDATA[When people are starting a new software project, they tend to only think about what programming language they are going to use. It is usually simply assumed that there is no other way than to use English as the natural language of the project. I&#8217;ve found myself more often than once questioning this assumption. Of [...]]]></description>
			<content:encoded><![CDATA[<p>When people are starting a new software project, they tend to only think about what programming language they are going to use. It is usually simply assumed that there is no other way than to use English as the natural language of the project. I&#8217;ve found myself more often than once questioning this assumption.</p>

<p>Of course, there are many plusses with going with English. Firstly, programming language syntax is usually written in English. If one writes own code in another language, the code is bilingual. I&#8217;m not an expert in psychology but I think it is safe to say that reading bilingual code adds at least some burden to the programmer&#8217;s mental burden.</p>

<p>Another obvious plus is that English is de facto language of the programming world so if you&#8217;re collaborating with programmers speaking another language, you are more likely to have English than anything else as your common language. This is also fairly safe bet for the customer or managers of the project. If the project is written in English, it is easier to move development to another company or country. This can of course be exploited by a programmer: writing in non-English language can be used as a guarantee that one will not be kicked out of the project as easily. Hopefully a programmer doesn&#8217;t need this kind of shenanigan and can prove one&#8217;s worth with technical prowess rather than knowing an obscure natural language.</p>

<p>These are pretty weighty reasons for using English so what are the pluses for using something else?</p>

<p>Unfortunately, even though English is de facto language in programming world, that doesn&#8217;t necessarily mean that all programmers can use English proficiently. Maybe they&#8217;ve learned to program in a non-English-speaking school or reading non-English books. They might be sufficient enough to understand error messages or other such short messages. However, writing unambiguous and comprehensive documentation for quite abstract constructs such as an architecture of multithreaded banking application requires a lot of talent. Usually programmers struggle even with writing this kind of documentation in their native tongue without the additional burden of using another language.</p>

<p>I think that it&#8217;s very important to use good naming when writing a software. If for example the models of the software are named well, it is much easier to understand the software firstly as a developer but also as an user. Figuring out good names is hard: figuring out good names in multiple languages is more than twice as hard. This can create a barrier between the developers and customers or project managers. If managers and customers tend to use for example Finnish terms for business models, developers mentally translate these terms to their English counterparts before processing the message of the customer. If names are poorly selected or in a worst case, there are multiple ambiguous translations, it&#8217;s a lot harder to be on the same page about the current state and the future of the project.</p>

<p>Next time when you&#8217;re starting a new project, please take a moment to think if English is really the best choice for writing your program in. If this decision is done in haste, it is very time consuming to translate the code later on if the decision proves to wrong.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/what-natural-language-to-program-in/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Y Combinator (In Finnish)</title>
		<link>http://villesalonen.fi/2011/y-combinator/</link>
		<comments>http://villesalonen.fi/2011/y-combinator/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 13:05:21 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[USA]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=538</guid>
		<description><![CDATA[Johdanto Analyysini tavoitteena on tutkia ohjelmistoalaan erikoistunutta Y Combinator -yrityshautomoa ja analysoida muun muassa sen perustajien, sijainnin ja siihen valittavien startup-yritysten toimialan merkitystä yrityshautomon menestykselle sekä yleisesti markkinoille. Mikä Y Combinator? Y Combinator on vuonna 2005 perustettu yrityshautomo. Y Combinator valitsee kahdesti vuodessa suuren joukon ohjelmistoalan startup-yrityksiä (n. 60), joita he rahoittavat suhteellisen pienellä summalla [...]]]></description>
			<content:encoded><![CDATA[<h2>Johdanto</h2>

<p>Analyysini tavoitteena on tutkia ohjelmistoalaan erikoistunutta Y Combinator -yrityshautomoa ja analysoida muun muassa sen perustajien, sijainnin ja siihen valittavien startup-yritysten toimialan merkitystä yrityshautomon menestykselle sekä yleisesti markkinoille.</p>

<h2>Mikä Y Combinator?</h2>

<p>Y Combinator on vuonna 2005 perustettu yrityshautomo. Y Combinator valitsee kahdesti vuodessa suuren joukon ohjelmistoalan startup-yrityksiä (n. 60), joita he rahoittavat suhteellisen pienellä summalla (keskimäärin 18 000 dollaria). Vuodesta 2005 toiminut Y Combinator on rahoittanut 300 yritystä. [1]</p>

<p>Yksi Y Combinatorin perustajista, Paul Graham, on kokenut startup-yrittäjä. Vuonna 1995 hän perusti Viaweb-yrityksen, joka tarjosi asiakasyrityksille web-sovelluksen, joilla he voivat rakentaa omia verkkokauppojaan. Viaweb oli pieni yritys, mutta pienen kokonsa ansiosta ja valitsemalla tehokkaat työkalut ohjelmistonsa toteuttamiseen Viaweb pystyi nopeasti reagoimaan isojen kilpailijoidensa uusiin ominaisuuksiin. [2] Vain kolme vuotta yrityksen perustamisen jälkeen Viawebin omistajat myivät yrityksen Yahoolle 49 miljoonalla dollarilla. [3]</p>

<p>Sama asenne näkyy myös Y Combinatorin koulutusohjelmassa, jossa käytetään usein käsitettä “ramen profitable”. Ramen profitable tarkoittaa, että startup on sen verran kannattava, että sen nuoret perustajat pystyvät juuri elättämään itsensä ja pyörittämään yritystään. Ramen-sana viittaa edulliseen japanilaiseen ateriaan. Ramen profitable -tason yritys ei olisi mahdollinen esimerkiksi tietokonevalmistajana, koska tietokoneen valmistaminen vaatii mittavia panostuksia muun muassa tehtaisiin ja niiden työntekijöihin ennen kuin lopullinen tuote on mahdollista valmistaa. Y Combinatorin valitsemat yritykset ovat ohjelmistoalan yrityksiä, jotka eivät vaadi parhaassa tapauksessa muuta kuin työntekijöilleen tietokoneet, jotka todennäköisesti löytyvät jo omasta takaa. Grahamin mukaan ramen profitable -ajattelussa on useita hyviä puolia: Ensinnäkin yritys pystyy toimimaan ilman rahoittajien metsästämistä ja heidän kanssa neuvottelua. Tämä ei tarkoita sitä, etteikö yritys pyrkisi saamaan ollenkaan rahoitusta, vaan että heidän ei ole sillä hetkellä ehdottoman pakko keskittyä sen hankkimiseen. Toinen hyvä puoli on yrityksen moraalin kehittäminen, koska vastaperustettu yritys saattaa tuntua teoreettiselta, mutta oikeiden asiakkaiden ja kassavirtojen saaminen auttaa sen konkretisoimisessa. Kolmantena yritys pääsee laittamaan liikeideansa ikään kuin julkiseen beta-vaiheeseen, joka paljastaa liikeidean hyvät ja huonot puolet. [5]</p>

<p>Y Combinator ei ole pelkästään Grahamin kädenjälkeä. Esimerkiksi Paul Grahamin vaimo, Jessica Livingston toimi ennen Y Combinatoria markkinoinnin varajohtajana Adams Harkness -investointipankissa ja kirjoitti yritysten perustajista haastattelukirjan, Founders at Work. [22] Livingston haastatteli kirjaansa varten muun muassa Adoben, Applen, Fog Creek Softwaren, Paypalin, Research In Motionin ja Yahoo!:n perustajia. [23]</p>

<p>Lisäksi Y Combinatoriin kuuluvat osakkaina</p>

<ul>
<li>Trevor Blackwell &#8211; Anybotsin perustaja, PhD-tutkinto tietotekniikasta Harvardista,</li>
<li>Paul Buchheit &#8211; Gmailin perustaja, rakensi prototyypin Googlen AdSense-mainospalvelusta ja kehitti Googlen sloganin “Don’t be evil”,</li>
<li>Robert Morris &#8211; Morris-madon kirjoittaja, tietotekniikan professori MIT:llä, PhD-tutkinto tietotekniikasta Harvardista, ja</li>
<li>Harj Taggar &#8211; Auctomaticin perustaja, joka opiskeli lakia Oxfordin yliopistossa. [22]</li>
</ul>

<p>Y Combinatorin osakkaiden laaja ammattitaito ja kattavat verkostot ovat merkittävä etu Y Combinatorin hautomoyrityksiä auttaessa. Liian usein tekniikan alan ihmiset keskittyvät liikaa vain tekniikkaansa ja unohtavat esimerkiksi henkilöstöjohtamisen ja markkinoinnin tärkeyden.</p>

<h2>Sijainnin merkitys</h2>

<p>Yksi ilmeinen selitys Y Combinatorin sijaitsemiselle Yhdysvalloissa lienee se, että Y Combinatorin perustajat asuivat Yhdysvalloissa. Tämä ei kuitenkaan selitä sitä, miksi sijaitseminen Yhdysvalloissa on todennäköisesti paras valinta.</p>

<p>Eräs suurista hyvistä puolista Yhdysvalloissa on suuret sisämarkkinat. Esimerkiksi Euroopan unionissa on 500 miljoonaa asukasta, mutta Euroopan union sisällä on kuitenkin suuria kulttuuri- ja kielieroja maiden välillä. Lisäksi maiden sisäinen lainsäädäntö vaihtelee suhteellisen paljon. Yhdysvaltojen kaikki 50 osavaltiota käyttävät pääsääntöisesti samanlaista lainsäädäntöä pienillä osavaltiokohtaisilla eroilla ja kaikkien virallinen kieli on englanti. Myös espanjaa äidinkielenään puhuvien määrä on kasvussa, mutta vaikka espanjakin valittaisiin yrityksen käyttämäksi kieleksi englannin lisäksi, olisi kielten määrä kuitenkin vain kaksi. Sen sijaan EU:ssa on 23 eri virallista kieltä [24] ja lisäksi monta epävirallista.</p>

<p>Kiina voisi olla toinen hyvä sijainti vastaavalle yrityshautomolle, mutta ainakin toistaiseksi Kiinan kaupankäynti on kohdistunut enemmän ulkomaille kuin sen omille sisämarkkinoille. Lisäksi suurin osa maan väestöstä on köyhää, joten korkean teknologian ohjelmistopalveluita tarjoaville yrityksille ei ole vielä yhtä hedelmällistä maaperää.</p>

<p>Paul Graham listaa esseessään Why Startups Condense In America 10 syytä, miksi hänen mielestään Yhdysvallat on paikka, johon Piilaakso on ollut mahdollista rakentaa:</p>

<ol>
<li>Yhdysvallat sallii maahanmuuton. Piilaakso tarvitsee älykkäitä ihmisiä, joiden pääsyä sinne ei sovi estää.</li>
<li>Yhdysvallat on rikas valtio. Rikkaalla valtiolla on kehittyneempi infrastruktuuri, jossa yritykset voivat kukoistaa.</li>
<li>Yhdysvallat ei ole (vielä) poliisivaltio. Jos esimerkiksi poliitikasta ei ole sallittua ajatella uusilla radikaaleilla tavoilla, miten ihmiset pystyvät luomaan uusia radikaaleja bisnesideoitakaan?</li>
<li>Yhdysvalloissa on paljon hyviä yliopistoja. Etenkin tekniikan alan parhaat yliopistot löytyvät pääasiassa Yhdysvalloista.</li>
<li>Yhdysvalloissa on helppo erottaa ihmisiä, jos he osoittautuvat epäpäteviksi.</li>
<li>Yhdysvalloissa ei suhtauduta työhön enää niin, että työ on jotain, jota saadaan, vaan se voi myöskin olla jotain, jonka itse luo.</li>
<li>Yhdysvalloissa on helppo perustaa yritys, koska lainsäädäntö ei ole niin tiukkaa kuin monessa muussa valtiossa.</li>
<li>Yhdysvalloissa on suuret sisämarkkinat.</li>
<li>Yhdysvalloista löytyy paljon rahoittajia.</li>
<li>Yhdysvalloissa työurat ovat dynaamisempia eivätkä ihmiset yleensä joudu valitsemaan omaa uraansa jo lukioiässä. [25]</li>
</ol>

<p>Entä sitten Y Combinatorin sijainti Yhdysvaltojen sisällä? Alunperin Y Combinatorin kesäkausi järjestettiin Cambridgessä, Massachusettsissa ja talvikausi Mountain View’ssa, Kaliforniassa, mutta vuonna 2009 Paul Grahamin sekä hänen vaimonsa ja toisen Y Combinatorin Jessica Livingstonen perhesyistä johtuen kesäkaudetkin päätettiin järjestää Mountain View’ssa. [6]</p>

<p>Mountain View sijaitsee Piilaaksossa, joka taas sijaitsee Kaliforniassa, Yhdysvaltojen länsirannikolla. Ilmasto on miellyttävä ja pääasiassa lämmin. Läheltä löytyy suuria kaupunkia kuten San Francisco, Fresno ja San Jose, mutta myös paljon pienempiä kyliä, jossa voi nauttia rauhallisemmasta elämästä. Työntekijöitä on siis helppo houkutella Piilaakson miljööseen.</p>

<p>Pelkkä miellyttävä ilmasto ja viihtyisät kaupungit eivät kuitenkaan takaa hedelmällistä maaperää startup-kulttuurille. Syyt Piilaakson erinomaisuudelle startup-kulttuurissa löytyvät alueen historiasta.</p>

<p>Charles David Herrold rakensi 1900-vuosikymmenellä oman radiolähettimensä. Ensimmäinen radiolähetys tapahtui vuosikymmenen lopulla ja vuonna 1912 alkoi säännöllinen radio-ohjelmien lähettäminen. [14]</p>

<p>Vuonna 1912 alueella myös perustettiin Alco Hydro-Aeroplane Company -yritys [16], joka sittemmin vaihtoi nimensä Lockheediksi ja on nykyisin osa Lockeed Martin -konsernia [17]. Myöhemmin Yhdysvaltain laivasto päätyi sulkemaan oman toimintansa alueella ja siirsi toimitilansa NASA:lle [18].</p>

<p>High technology -osaamista on siis löytynyt alueelta jo pitkään. Kenties merkittävin panostus alueen tulevaisuuteen tehtiin vuonna 1950-luvulla, kun muun muassa Frederick Termanin ansiosta lähellä sijaitse Stanfordin yliopisto ja alueen high technology -yritykset perustivat yhteisen Stanford Industrial Parkin. Ensimmäinen yritys alueella oli Varian Associates Inc. Pian perässä seurasivat muun muassa Frederick Termanin oppipoikien Bill Hewlettin ja David Packardin Hewlett-Packard, General Electric, Eastman Kodak ja Lockheed. [19]</p>

<p>Vuonna 2011 Piilaaksossa toimineiden yritysten joukossa ovat muun muuassa Hewlett-Packard, Apple, Intel, Cisco Systems, Oracle, Google, eBay, AMD, Yahoo, Symantec, Sandisk, Nvidia, Electronic Arts, VMware, Netflix ja McAfee. [21]</p>

<p>Venture capital -sijoittajat ovat erityisen kiinnostuneita Kaliforniassa. CB Insightsin tekemän tutkimuksen mukaan 44% vuoden 2010 kolmannen kvartaalin VC-rahoituksesta meni Kaliforniaan. Seuraavana tuleva New York sai vain 16% ja sitä seuraava Massachusetts, jossa muun muassa Boston ja Cambridge sijaitsevat, sai vain 11%. [20]</p>

<p>Myös uusien pätevien työntekijöiden löytäminen on helppoa Piilaaksossa. Aivan Piilaaksossa ovat esimerkiksi Palo Altossa sijaitseva Stanfordin yliopisto ja Berkeleyssä sijaitseva Berkeleyn yliopisto.</p>

<p>Global Venture Labin Christian Aspegrenin mukaan niin sanottuja vahvoja sidoksia &#8211; suoria yhteyksiä &#8211; arvostetaan liikaa. Vahvoista sidoksista muodostetut verkostot ovat väkisinkin pienempiä, koska yksittäiset ihmiset eivät voi olla tekemisissä kovin laajan ihmismäärän kanssa. Siksi kannattaisikin suosia enemmän heikkoja sidoksia eli epäsuoria yhteyksiä, jossa ei hyödynnetäkään esimerkiksi suoraan ystävää tai sukulaista, vaan löydetään yhteistyökumppaneita omien vahvojen sidosten ystävistä tai heidän ystävistään. Koska Piilaakson alueella on paljon yrityksiä, rahoittajia ja yliopistoja, on helppo luoda tällaisia heikkojen sidosten verkostoja. Esimerkiksi Oklahoma Cityssä perustettava yritys on paljon kalifornialaista kilpailijaansa heikommassa asemassa.</p>

<h2>Hautomon tuloksia</h2>

<p>Rahoitettujen startup-yritysten määrä ei merkitsisi mitään, jos yritysten joukosta ei löytyisi menestyksiä. Y Combinatorin rahoittamia menestyneitä startup-yrityksiä ovat muun muassa Airbnb, Reddit, Loopt, Scribd ja Dropbox [4].</p>

<p>Airbnb on palvelu, johon käyttäjät voivat ilmoittaa asuntonsa tai talonsa tilapäisesti vuokrattavaksi ja muut käyttäjät voivat selata ilmoituksia varatakseen itselleen majoituksen. Airbnb tarjoaa vaihtoehdon hotellimajoituksille. [10]</p>

<p>Reddit on sosiaalinen uutispalvelu, jossa käyttäjät tuottavat sisällön sekä kommentoivat ja arvioivat muiden sisältöä.</p>

<p>Loopt tarjoaa mobiilipalvelun, jonka avulla käyttäjät voivat löytää lähialueeltaan uusia ystäviä, paikkoja ja tapahtumia.</p>

<p>Scribd on web-palvelu, jonka avulla käyttäjät voi helposti tuottaa dokumentteja ja jakaa niitä eri muodoissa tai liittää niitä web-sivuille.</p>

<p>Kenties kuuluisin Y Combinatorin hautomista yrityksistä on Dropbox. Dropbox on toteuttanut samannimisen palvelun, jonka asiakasohjelmiston käyttäjä voi asentaa useammalle tietokoneelle tai mobiililaitteelle. Laitteisiin lisätään erityinen Dropbox-hakemisto, johon käyttäjä voi laittaa tiedostojaan, jotka synkronoidaan käyttäjän jokaisen Dropbox-laitteen välillä. Näin esimerkiksi iPhonella otetut kuvat voidaan siirtää Dropbox-hakemistoon, jonka jälkeen käyttäjä voi katsella kuvia omalta kotikoneeltaan. Käyttäjän on mahdollista jakaa tiedostoja myös ystävilleen. Yritysmaailmassa ja tietokoneharrastajien keskuudessa tiedostojen siirtäminen oli arkipäivää jo ennen Dropboxia, mutta peruskäyttäjille ei löytynyt helppoja työkaluja. Tiedostojen siirtäminen vaati yleensä hankalia palvelinohjelmistoja, joille käyttäjän piti osata asettaa esimerkiksi palomuuriasetukset. Dropboxin käyttäminen on ilmaista, mutta tehokäyttäjille on tarjolla maksullisia päivityksiä.</p>

<p>Dropboxilla oli 25 miljoonaa käyttäjää huhtikuussa 2011. [7] Lokakuussa 2011 Dropbox sai 250 miljoonaa B-sarjan rahoituskierroksella, joka nosti yrityksen markkina-arvon arvion 4 miljardiin dollariin. Käyttäjämäärä oli kasvanut 45 miljoonaan käyttäjään. [8] Applen toimitusjohtaja Steve Jobs oli vuonna 2009 tarjoutunut ostamaan Dropboxin 9-numeroisella summalla. [9]</p>

<p>Ohjelmistoalan palveluiden tarjoaminen on erinomainen valinta yritykselle, joka haluaa aloittaa pienellä sijoituksella, mutta kasvaa mahdollisesti hyvinkin nopeasti valtavaksi. Koska ohjelmistot hoitavat varsinaisen palvelun tarjoamisen, on palvelun skaalaaminen jopa kymmenille miljoonille käyttäjille vain tekninen ongelma, jonka ratkaiseminen ei vaadi parhaimmillaan kuin kourallisen työntekijöitä. Tämä eroaa merkittävästi esimerkiksi ohjelmistoprojektien toteuttamista tai konsultointipalveluita tarjoavista yrityksistä, joiden skaalautuminen vaativaksi vaatii lähes poikkeuksetta myös yrityksen työntekijöiden määrän skaalamisen valtavaksi.</p>

<p>Tämän tyyppiset yritykset ovat myös rahoittajien mieleen. Esimerkiksi vuonna 2004 perustettu Facebook on seitsemässä vuodessa kasvanut 800 miljoonan käyttäjän palveluksi [11] ja jonka ennakoidaan listautuvan pörssiin vuonna 2012: talousanalystit ovat arvioineet yrityksen markkina-arvon olevan tuolloin huikeat 100 miljardia dollaria [12].</p>

<p>Ohjelmistoalan nopealla vauhdilla ja hurjilla markkina-arvoarvioilla on mielestäni myös varjopuolensa. Esimerkiksi radikaalin uuden idean kehittäneen startup-yrityksen myyminen isolle ja vanhoihin kaavoihinsa kangistuneelle markkinajohtajalle ei vie yhteiskuntaa eteenpäin, vaikka se tuottaakin yrityksen perustajille ja sijoittajille nopeasti rahaa.</p>

<p>Facebookin perustaja Mark Zuckerberg totesi lokakuussa 2011, että jos hän saisi aloittaa yrityksensä alusta, hän ei olisi muuttanut rakentamaan yritystä Piilaaksoon, vaan olisi pysynyt Bostonissa. Zuckerbergin mielestä alueella keskitytään liian paljon lyhyen tähtäimen saavutuksiin ja ihmiset eivät sitoudu tekemiinsä asioihin. Zuckerbergin mukaan myös Amazon.comin toimitusjohtaja Jeff Bezos on samaa mieltä. Bezosin mukaan työntekijät pysyvät yhdessä työpaikassa Piilaaksossa vain puolet siitä ajasta kuin Seattlessa, missä Amazon.comin päämaja sijaitsee. [15]</p>

<p>Myös Steve Jobs on kritisoinut alueelle tyypillistä kulttuuria: &#8220;I hate it when people call themselves ‘entrepreneurs’ when what they’re really trying to do is launch a startup, so they can cash in and move on. They’re unwilling to do the work it takes to build a real company, which is the hardest work in business. That’s how you really make a contribution and add to the legacy of those who went before. You build a company that will still stand for something a generation or two from now. That’s what Walt Disney did, and Hewlett and Packard, and the people who built Intel. They created a company to last, not just to make money.” [13]</p>

<h2>Lähteet</h2>

<p>[1] <a href="http://ycombinator.com/">Y Combinator</a>, 3.11.2011.</p>

<p>[2] Paul Graham, <a href="http://www.paulgraham.com/avg.html">Beating the Averages</a>, 3.11.2011.</p>

<p>[3] Inc. Magazine, <a href="http://www.inc.com/magazine/20090601/the-start-up-guru-y-combinators-paul-graham.html">The Start-up Guru</a>, 3.11.2011.</p>

<p>[4] Wired Magazine, <a href="http://www.wired.com/magazine/2011/05/ff_ycombinator/all/1">Y Combinator Is Boot Camp For Startups</a>, 3.11.2011.</p>

<p>[5] Paul Graham, <a href="http://www.paulgraham.com/ramenprofitable.html">Ramen Profitable</a>, 3.11.2011.</p>

<p>[6] Paul Graham, <a href="http://ycombinator.com/ycca.html">California Year-Round</a>, 4.11.2011.</p>

<p>[7] GigaOm, <a href="http://gigaom.com/2011/04/18/why-dropboxs-25-million-users-are-just-the-start/">Why Dropbox’s 25 Million Users Are Just the Start</a>, 4.11.2011.</p>

<p>[8] TechCrunch, <a href="http://techcrunch.com/2011/10/18/dropbox-raises-250m-in-funding-boasts-45-million-users/">Dropbox Raises $250M In Funding, Boasts 45 Million Users</a>, 4.11.2011.</p>

<p>[9] Forbes, <a href="http://www.forbes.com/sites/victoriabarret/2011/10/18/dropbox-the-inside-story-of-techs-hottest-startup/">Dropbox: The Inside Story Of Tech&#8217;s Hottest Startup</a>, 4.11.2011</p>

<p>[10] Airbnb, <a href="http://www.airbnb.com/home/about">About</a>, 4.11.2011.</p>

<p>[11] Mashable, <a href="http://mashable.com/2011/09/22/facebook-800-million-users/">Facebook Now Has 800 Million Users</a>, 4.11.2011.</p>

<p>[12] CNBC, <a href="http://www.cnbc.com/id/43378490">Facebook IPO Valuation Could Top $100 Billion: Sources</a>, 4.11.2011.</p>

<p>[13] Walter Isaacson, Steve Jobs, Simon &amp; Schuster, 2011.</p>

<p>[14] SFGate, <a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2009/04/05/BAFE16RPCC.DTL">A forgotten genius on your radio dial</a>, 4.11.2011.</p>

<p>[15] International Business Times, <a href="http://www.ibtimes.com/articles/240747/20111031/zuckerberg-prefers-boston-silicon-valley.htm">Zuckerberg Prefers Boston To Silicon Valley</a>, 4.11.2011.</p>

<p>[16] U.S. Centennial of Flight Commission, <a href="http://www.centennialofflight.gov/essay/Aerospace/earlyU.S/Aero1.htm">The First U.S. Aircraft Manufacturing Companies</a>, 4.11.2011.</p>

<p>[17] Lockheed Martin, <a href="http://www.lockheedmartin.com/aboutus/history/index.html">Lockheed Martin History</a>, 4.11.2011.</p>

<p>[18] NASA, <a href="http://www.nasa.gov/centers/ames/about/aboutames-moffetfield.html">Ames History</a>, 4.11.2011.</p>

<p>[19] Palo Alto History, <a href="http://www.paloaltohistory.com/stanford-research-park.php">The Stanford Research Park: The Engine of Silicon Valley</a>, 4.11.2011.</p>

<p>[20] New York Observer, <a href="http://www.observer.com/2010/wall-street/new-york-officially-beating-boston-number-2-city-new-startups">New York Beating Boston in Number of New Startups</a>, 4.11.2011.</p>

<p>[21] Mercury News, <a href="http://www.mercurynews.com/sv150/ci_17861178">2011 Silicon Valley 150 listings: Nos. 1-75</a>, 4.11.2011.</p>

<p>[22] Y Combinator, <a href="http://ycombinator.com/people.html">Partners</a>, 4.11.2011.</p>

<p>[23] Jessica Livingston, Founders at Work, Apress, 2008.</p>

<p>[24] European Union, <a href="http://ec.europa.eu/languages/languages-of-europe/eu-languages_en.htm">Official EU Languages</a>, 4.11.2011.</p>

<p>[25] Paul Graham, <a href="http://www.paulgraham.com/america.html">Why Startups Condense in America</a>, 4.11.2011.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/y-combinator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redesigning website by making it worse</title>
		<link>http://villesalonen.fi/2011/redesigning-website-by-making-it-worse/</link>
		<comments>http://villesalonen.fi/2011/redesigning-website-by-making-it-worse/#comments</comments>
		<pubDate>Thu, 15 Sep 2011 15:33:41 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Design]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=490</guid>
		<description><![CDATA[VR &#8211; our national railway company &#8211; recently changed their pricing strategies. The main goal was to offer cheaper prices for early buyers. The change itself might be good: at least a student ticket from Jyväskylä to Tampere seems to a euro or two cheaper than before. The worst part about the change is that [...]]]></description>
			<content:encoded><![CDATA[<p>VR &#8211; our national railway company &#8211; recently changed their pricing strategies. The main goal was to offer cheaper prices for early buyers. The change itself might be good: at least a student ticket from Jyväskylä to Tampere seems to a euro or two cheaper than before. The worst part about the change is that they had to change their website too.</p>

<p>What were they thinking with these changes!</p>

<p>Let&#8217;s start from the front page. I&#8217;m not an expert but I think that the most used function of their website is the search for train timetables. Previously this was presented right on the first page. Apparently they deemed that unnecessary:</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr11.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr11.png" alt="" title="vr1" width="850" class="aligncenter size-full wp-image-494" /></a></p>

<p>This would be merely stupid if this was the only design flaw. After entering the webshop I was presented with this:</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr2.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr2.png" alt="" title="vr2" width="850" class="aligncenter size-full wp-image-496" /></a></p>

<p>Umm&#8230; I would have liked to look at the timetable and then buy tickets. Two of them actually. So should I choose &#8220;View timetable&#8221;, &#8220;Buy tickets&#8221; or &#8220;Multi-ticket seat reservation&#8221;? Let&#8217;s try &#8220;Multi-ticket seat reservation.&#8221; <strong>&#42;click&#42;</strong></p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr3.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr3.png" alt="" title="vr3" width="522" height="536" class="aligncenter size-full wp-image-504" /></a></p>

<p>What is a multi-ticket order number? Where can I get it? Apparently I shouldn&#8217;t have chosen this. Maybe I&#8217;ll just look at the timetables after all.</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr4.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr4.png" alt="" title="vr4" width="787" height="342" class="aligncenter size-full wp-image-506" /></a></p>

<p>Reasonable enough. <strong>&#42;click&#42;</strong></p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr5.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr5.png" alt="" title="vr5" width="786" height="374" class="aligncenter size-full wp-image-508" /></a></p>

<p>By looking a the breadcrumb links above I thought that we already were on <em>Timetables</em> page in the previous page. Oh well, onto the next page. I&#8217;ve already spent 10 minutes figuring out this order and I&#8217;m only on the third page of an eight-page process. Or is it the fourth page? Now I&#8217;m confused.</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr6.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr6.png" alt="" title="vr6" width="850" class="aligncenter size-full wp-image-514" /></a></p>

<p>Now we can choose our train. Again. At this point my friend had already decided that he didn&#8217;t need the train ride after all. So, let&#8217;s go back to the previous page and change that.</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr21.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr21.png" alt="" title="vr2" width="850" class="aligncenter size-full wp-image-520" /></a></p>

<p>What the hell! Not this page again. <strong>&#42;sigh&#42;</strong> Let&#8217;s input all the values again.</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr7.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr7.png" alt="" title="vr7" width="779" height="465" class="aligncenter size-full wp-image-526" /></a></p>

<p>&#8220;Please note that the selected seats to ensure only once the order has been added to your basket.&#8221; Umm&#8230; Okay. Noted. I guess.</p>

<p><a href="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr8.png"><img src="http://www.villesalonen.fi/wp-content/uploads/2011/09/vr8.png" alt="" title="vr8" width="780" height="408" class="aligncenter size-full wp-image-528" /></a></p>

<p>After this the rest of the process went quite painlessly, actually. But then again, there was confusion enough for one order.</p>

<p>It&#8217;s always depressing to see that some good product has been taken for redesigning and after spending a lot of work on it, presenting the new and worse version. Of course even the presentation didn&#8217;t work quite as planned: the whole website crashed and hundreds of people couldn&#8217;t make their reservations.</p>

<p><strong>UPDATE</strong>: Apparently their website wasn&#8217;t the only one that crashed.<a href="http://www.iltasanomat.fi/kotimaa/vrn-lippu-uudistus-epaonnistui---matkustajat-ilmaiseksi-juniin/art-1288414416170.html">Their ticket counters were also closed due to IT problems</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/redesigning-website-by-making-it-worse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Going Digital</title>
		<link>http://villesalonen.fi/2011/going-digital/</link>
		<comments>http://villesalonen.fi/2011/going-digital/#comments</comments>
		<pubDate>Thu, 25 Aug 2011 18:04:16 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Books]]></category>
		<category><![CDATA[Magazines]]></category>
		<category><![CDATA[Smartphones]]></category>
		<category><![CDATA[Tablets]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=486</guid>
		<description><![CDATA[I&#8217;ve been told that a book is not just its contents. That the weight, the smell, the feel of the paper is something that adds to the whole experience. That filling the bookshelf with books and showing it off to impress friends is important. While I don&#8217;t actually disagree with any of these statements, I&#8217;ve [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been told that a book is not just its contents. That the weight, the smell, the feel of the paper is something that adds to the whole experience. That filling the bookshelf with books and showing it off to impress friends is important. While I don&#8217;t actually disagree with any of these statements, I&#8217;ve tried the future and liked it too much to go back.</p>

<p>Goodbye to the paper.</p>

<p>Goodbye to the piles of magazines filling your hallway. Goodbye to the endless rows of books gathering dust, fading pages. Goodbye to curled page corners and bookmarks lost in your bedsheets. Goodbye to splashes of food and drink on the pages.</p>

<p>Digital books and magazines are nothing new but reading them by sitting in front of a computer always felt awkward. Maybe it&#8217;s because I&#8217;ve never been the one to read sitting in a chair.</p>

<p>My first positive experience with a digital book came just a year ago when I ended up buying Surely You&#8217;re Joking, Mr. Feynman from Amazon Kindle to my phone. At first the higher price compared to the paperback version and the small, under 4-inch display felt discouraging but this feeling faded quick enough.</p>

<p>One of the most memorable experiences with a digital book was when I was eating in Subway and waiting for an hour for my friend. Being bored I wished that I&#8217;d brought something entertaining with me until I remembered that I indeed had. After balancing the phone on the edge of the tray I found the clock racing as I flipped through pages. Eating and reading have always been two of my favorite things to combine and by going digital it became much easier.</p>

<p>The full-on revolution started after I bought a tablet. The bigger screen and better reading software were a big plus. Even bigger ones were the easy availability of good magazines such as Time and Wired. Living in Finland makes ordering these foreign magazines a tad difficult but having them delivered to my tablet as soon as I they became available made the reading so much easier.</p>

<p>Here&#8217;s a thought for those who resist the idea of switching to digital books: imagine yourself in your bed, a bit tired but wanting to starting some new book but not having anything in your bookshelf. How about if you could have one in your hands in less than a minute? Today, there&#8217;s no longer nothing stopping you.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/going-digital/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Biggest Challenge of Google+: How to Persuade Non-Techie Friends to Join?</title>
		<link>http://villesalonen.fi/2011/the-biggest-challenge-of-google-plus/</link>
		<comments>http://villesalonen.fi/2011/the-biggest-challenge-of-google-plus/#comments</comments>
		<pubDate>Sat, 09 Jul 2011 19:42:32 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Social Media]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=471</guid>
		<description><![CDATA[There&#8217;s been a lot of talk about Google+ in the techie circles. Some have even declared that Facebook and Twitter are now on a quick way out [1]. That&#8217;s quite a bold statement to make about services which have over 750 [2] and 200 [3] million users, respectively. For a social network, obviously one of [...]]]></description>
			<content:encoded><![CDATA[<p>There&#8217;s been a lot of talk about Google+ in the techie circles. Some have even declared that Facebook and Twitter are now on a quick way out [1]. That&#8217;s quite a bold statement to make about services which have over 750 [2] and 200 [3] million users, respectively.</p>

<p>For a social network, obviously one of the most important requirements is that it has people in it. With everyone and their parents having joined Facebook and Twitter having become such an important communication service that even the President of the United States is using it to coordinate questions for his Twitter town hall meeting [4], how can one persuade people to switch to Google+?</p>

<p>Of course some have valid gripes with Facebook&#8217;s policies regarding privacy and might have been waiting for an alternative to leap to. But is this is enough to drive the critical mass from Facebook to Google? And are the policies of Google actually better? Google recently announced that they would be deleting all the private Google profiles and only allow public profiles in the future [5]. This is a natural decision for Google &#8211; they run The Search Engine after all &#8211; but is this a natural decision for users?</p>

<p>One of the most important arguments for me for moving to Google+ is the better user experience in sharing stuff with only certain groups &#8211; or Circles as Google refers to them. However Facebook already has support for similar sharing restrictions albeit with a poorer UX. I&#8217;ve actually only tried this once recently and ended up sharing my status post with everyone else except the ones I actually tried to share to. Yikes! If the easier restricting of sharing proves to be a major selling point, I&#8217;m sure Facebook will devote a lot of attention on improving their implementation &#8211; well before the critical mass of the users end up switching to Facebook&#8217;s competitor.</p>

<p>I dislike the fact that Twitter and Facebook, two privately owned companies with China rumoredly eyeing the shares of Facebook [6], have become such powerhouses in the world of social media. For this reason I&#8217;m glad that Google is stepping into the fight. Even if the balances of power will not be tipped, healthy competition surely won&#8217;t be a bad thing for the users. However if a non-techie friend of mine asks for what for she should to switch to Google+ &#8211; to move all their photo albums and profile descriptions, persuading their friends to make the switch to &#8211; for the time being my answer will be: &#8220;Nothing.&#8221;</p>

<p><strong>References:</strong></p>

<ol>
<li><a href="http://singularityhub.com/2011/07/06/google-is-awesome-facebook-maimed-twitter-mortally-wounded/">http://singularityhub.com/2011/07/06/google-is-awesome-facebook-maimed-twitter-mortally-wounded/</a></li>
<li><a href="http://www.usatoday.com/tech/news/2011-07-06-facebook-skype-growth_n.htm">http://www.usatoday.com/tech/news/2011-07-06-facebook-skype-growth_n.htm</a></li>
<li><a href="http://www.bbc.co.uk/news/business-12889048">http://www.bbc.co.uk/news/business-12889048</a></li>
<li><a href="http://www.huffingtonpost.com/john-robinson/askobama-askyourself_b_892117.html">http://www.huffingtonpost.com/john-robinson/askobama-askyourself_b_892117.html</a></li>
<li><a href="http://www.pcmag.com/article2/0,2817,2388120,00.asp">http://www.pcmag.com/article2/0,2817,2388120,00.asp</a></li>
<li><a href="http://www.zdnet.com/blog/facebook/rumor-china-wants-to-buy-a-stake-in-facebook/1909">http://www.zdnet.com/blog/facebook/rumor-china-wants-to-buy-a-stake-in-facebook/1909</a></li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/the-biggest-challenge-of-google-plus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Graphics Improvements Still Matter</title>
		<link>http://villesalonen.fi/2011/why-graphics-improvements-still-matter/</link>
		<comments>http://villesalonen.fi/2011/why-graphics-improvements-still-matter/#comments</comments>
		<pubDate>Wed, 06 Jul 2011 14:08:22 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Games]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=465</guid>
		<description><![CDATA[The graphics of games have come a long, long way from the days of Tennis for Two in the 1958 OXO in the 1952 (Corrected thanks to Jani Vainiomäki). This first graphical video game ever used only a very limited display of an oscilloscope. On this kind of a display, even presentation of text was, [...]]]></description>
			<content:encoded><![CDATA[<p>The graphics of games have come a long, long way from the days of <del datetime="2011-07-06T15:58:43+00:00">Tennis for Two in the 1958</del> OXO in the 1952 (Corrected thanks to Jani Vainiomäki). This first graphical video game ever used only a very limited display of an oscilloscope. On this kind of a display, even presentation of text was, if not impossible, at least very cumbersome.</p>

<p>Some people argue that these days the graphics are so good that further improvements are unnecessary. I disagree.</p>

<p>It&#8217;s true that for some games the limit has just about been reached. For example reconstructing a Formula 1 race in a way that&#8217;s almost indistinguishable from a TV broadcast is achievable. This is because a race settings consist mostly of quite static elements such as the track and the cars. Static elements are a lot simpler to model. Of course cars move but they don&#8217;t usually change shape if not for a collision. The audience is also quite distant most of the time. For these reasons lacking details won&#8217;t distract the gamers from the immersion of the game.</p>

<p>I think that the most graphically demanding games deal with a rather surprising genre: human drama. When you&#8217;re trying to convince the gamer that the characters in the game are real people that they should care about, the minute details can break or make the game.</p>

<p>Graphical glitches which are often present in games are especially distracting in serious drama games. If your character can accidentally fly or see through walls, the realism is quite easily shattered.</p>

<p>Even more difficult is recreating the human face. We human beings develop our face recognition skills at a very early age and from then rarely a day goes by without using it in some capacity. That&#8217;s why it&#8217;s so difficult to model a real human face: they are so familiar to us.</p>

<p>In my opinion human faces in games have been unrealistic until just recently. Heavy Rain from last year and L.A. Noire from this one have really pushed the envelope.</p>

<p>Heavy Rain is a game dealing with very serious concepts such as a loss of a child. The game consists of some actions scenes but the most important part of the game is telling a human story which would be impossible if not for the most advanced facial modeling.</p>

<p>L.A. Noire takes a step even a bit further: the main gameplay aspect is observation of people&#8217;s faces. Your character is a police detective interviewing suspects. Breaking a murder case might depend on noticing a small tell of a lying suspect.</p>

<p>Although Heavy Rain and L.A. Noire are quite merited I would argue that you couldn&#8217;t fool a viewer into confusing them with a real video of real people. I think succeeding in this might be the most important milestone since the dawn of 3D games.</p>

<p>And that is why graphics improvements still matter.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/why-graphics-improvements-still-matter/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>BetterExplained.com</title>
		<link>http://villesalonen.fi/2011/betterexplained-com/</link>
		<comments>http://villesalonen.fi/2011/betterexplained-com/#comments</comments>
		<pubDate>Tue, 05 Jul 2011 19:14:00 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Education]]></category>
		<category><![CDATA[Mathematics]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=447</guid>
		<description><![CDATA[Once in a while you end up on a website you wish you would have found years ago. My most recent discovery is BetterExplained.com. I&#8217;ve minored in mathematics in University of Jyväskylä but the explanations of complex numbers, pi and e among others on this site were way better than in my classes. It&#8217;s unfortunate [...]]]></description>
			<content:encoded><![CDATA[<p>Once in a while you end up on a website you wish you would have found years ago. My most recent discovery is <a href="http://betterexplained.com/">BetterExplained.com</a>.</p>

<p>I&#8217;ve minored in mathematics in University of Jyväskylä but the explanations of complex numbers, pi and e among others on this site were way better than in my classes.</p>

<p>It&#8217;s unfortunate that most of the mathematics classes emphasize memorization of difficult formulas instead of explaining the concepts and showing examples of why they&#8217;ve been invented and why they are so useful. Some might argue that proving the formulas is the same as explaining them but I&#8217;ve found that I usually just end up memorizing the proofs instead of understanding them.</p>

<p>Of course I have to accept part of the blame. I could have used more of my own time to find explanations for these concepts but finding books that explain the concepts of university level mathematics in a simple manner without oversimplification is quite hard.</p>

<p>I think that the current situation is sustained because of two main reasons:</p>

<p>Firstly the professors of mathematics are usually mainly researchers and are forced to teach classes. Because they are so well versed in their subject, it&#8217;s very difficult to understand the perspective of novice students. This added with the lack of motivation leads to teachers who don&#8217;t even try to put themselves in the shoes of students and who just wish that they were back in their rooms continuing their research.</p>

<p>Second reason is academic arrogance. Unfortunately some of the academics show off their education by using difficult, long words and overly complex explanations. They think that all university students should be able to understand in the same way or else they are stupid. This is not true. Paraphrasing Einstein: “Everything should be made as simple as possible, but no simpler.” Solving difficult problems with science should be all that matters. Everything else is just ego tripping.</p>

<p>Unfortunately the situation in Finland is unlikely to change anytime soon. Because Finland is in the top places in international <a href="http://www.guardian.co.uk/news/datablog/2010/dec/07/world-education-rankings-maths-science-reading">PISA rankings</a>, there is no hurry to make things better.</p>

<p>Why bother?</p>

<p>This is already the best. Allegedly.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/betterexplained-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javasta C#:iin (In Finnish)</title>
		<link>http://villesalonen.fi/2011/javasta-ciin/</link>
		<comments>http://villesalonen.fi/2011/javasta-ciin/#comments</comments>
		<pubDate>Mon, 21 Mar 2011 16:50:20 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=330</guid>
		<description><![CDATA[Tämä on kirjoitettu alunperin kandidaatintutkielmakseni Jyväskylän yliopiston tietotekniikan laitokselle. Päätin julkaista sen myös täällä sivuillani, ettei tutkielma jää vain yliopiston arkistoihin pölyttymään. Tutkielmaa kirjoittaessani sain korvaamatonta ohjausapua Tuukka Puraselta ja Vesa Lappalaiselta. Jos tutkielman lukemisen jälkeen kiinnostaa tutustua yksityiskohtaisemmalla tasolla kielten eroihin, suosittelen lukemaan kirjoittamani esseen Javasta C#:iin: Erot pintaa syvemmältä. Tutkielman PDF-versio on saatavilla [...]]]></description>
			<content:encoded><![CDATA[<p><em>Tämä on kirjoitettu alunperin kandidaatintutkielmakseni Jyväskylän yliopiston tietotekniikan laitokselle. Päätin julkaista sen myös täällä sivuillani, ettei tutkielma jää vain yliopiston arkistoihin pölyttymään. Tutkielmaa kirjoittaessani sain korvaamatonta ohjausapua <a href="http://users.jyu.fi/~tupepura/">Tuukka Puraselta</a> ja <a href="http://users.jyu.fi/~vesal/">Vesa Lappalaiselta</a>.</em></p>

<p><em>Jos tutkielman lukemisen jälkeen kiinnostaa tutustua yksityiskohtaisemmalla tasolla kielten eroihin, suosittelen lukemaan kirjoittamani esseen <a href="http://www.villesalonen.fi/2010/javasta-c-sharpiin-erot-pintaa-syvemmalta/">Javasta C#:iin: Erot pintaa syvemmältä</a>.</em></p>

<p><em><a href="http://urn.fi/URN:NBN:fi:jyu-2011120111752">Tutkielman PDF-versio</a> on saatavilla JYX-julkaisujärjestelmästä.</em></p>

<p><strong>Tiivistelmä:</strong> Tutkimuksen tavoitteena on selvittää, miten ohjelmoijan Java-osaamista
voidaan hyödyntää C#-kielen opiskelussa tai toisinpäin. Helppo siirtyminen antaisi muun muassa yrityksille enemmän joustavuutta rekrytointiin, koska palkattavan työntekijän tuntemus tietystä käytettävästä kielestä ei olisi niin tärkeää kuin käytettävän kielen nopea oppiminen valmiita taitoja hyödyntäen. Tutkimus tehtiin vertailemalla kielistä julkaistuja ohjelmointioppaita, rajanpintakuvauksia ja kielten teknisiä spesiﬁkaatioita. Tutkimuksen tulosten perusteella kielet ovat monessa suhteessa samankaltaisia, mutta erojakin on. Erot eivät ole haastavia ja Javasta C#:iin siirryttäessä ne tehostavat ohjelmointityötä. Tulosten perusteella siirtymät Javasta C#:iin
tai toisinpäin ovat helppoja ja nopeita.</p>

<p><strong>Abstract:</strong> The objective of the thesis was to ﬁnd out if you can use existing
Java experience to ease the learning of C# or vice versa. Easy moving from language
to another would beneﬁt for example companies’ hiring decisions as the candidate’s
knowledge of a speciﬁc language would not be as important as an ability to learn the
language quickly by using existing experience of another language. The study was
done by comparing published programming tutorials, application programming interfaces and technical speciﬁcations. Based on the results of the study, languages are
similar in many ways but there are some differences. These differences are not challenging and when moving from Java to C# they increase the productivity of the programming. The results suggest that learning C# by using existing Java experience or
vice versa is easy and fast.</p>

<p><strong>Avainsanat:</strong> Java, C#, ohjelmointikielet, oppiminen.</p>

<p><strong>Keywords:</strong> Java, C#, programming languages, learning.</p>

<h2>Sisältö</h2>

<ul>
  <li><a href="#sec_terms">Termilista</a></li>
  <li><a href="#sec1">1 Johdanto</a></li>
  <li><a href="#sec2">2 Java ja C#</a>
    <ul>
      <li><a href="#sec2_1">2.1 Käyttöalustat</a></li>
      <li><a href="#sec2_2">2.2 Kehitysympäristöt</a></li>
    </ul>
  </li>
  <li><a href="#sec3">3 Yhtäläisyydet</a>
    <ul>
      <li><a href="#sec3_1">3.1 Oliotyypit</a></li>
      <li><a href="#sec3_2">3.2 Arvotyypit</a></li>
      <li><a href="#sec3_3">3.3 Ohjelmointisyntaksi</a></li>
      <li><a href="#sec3_4">3.4 Virtuaalikoneet ja tavukoodi</a></li>
    </ul>
  </li>
  <li><a href="#sec4">4 Erot</a>
    <ul>
      <li><a href="#sec4_1">4.1 Luokat ja tietueet</a></li>
      <li><a href="#sec4_2">4.2 Muuttujatyyppien yhdenmukaisuus</a></li>
      <li><a href="#sec4_3">4.3 Ominaisuudet</a></li>
      <li><a href="#sec4_4">4.4 Operaattoreiden ylikuormitus</a></li>
      <li><a href="#sec4_5">4.5 Parametrinvälitys</a></li>
      <li><a href="#sec4_6">4.6 Delegaatit ja osoittimet</a></li>
      <li><a href="#sec4_7">4.7 Osittaiset luokat</a></li>
      <li><a href="#sec4_8">4.8 Lambda-lausekkeet</a></li>
      <li><a href="#sec4_9">4.9 Suoritusteho</a></li>
    </ul>
  </li>
  <li><a href="#sec5">5 Yhteenveto</a></li>
  <li><a href="#sec_sources">Lähteet</a></li>
</ul>

<h2><a id="sec_terms">Termilista</a></h2>

<ul>
<li><strong>Konekoodi (<em>engl. machine code</em>)</strong> Ohjelmakoodia, jonka koneen prosessori osaa suorittaa.</li>
<li><strong>Tavukoodi (<em>engl. bytecode</em>)</strong> Ohjelmakoodia, jota ei voi suoraan suorittaa koneen prosessorilla, vaan jota suoritetaan virtuaalikoneella.</li>
<li><strong>Virtuaalikone (<em>engl. virtual machine</em>)</strong> Alusta, jonka päällä tavukoodia suoritetaan. Virtuaalikone tulkkaa tavukoodin konekoodiksi.</li>
<li><strong>Common Language Runtime</strong> Microsoftin .NET-kielten yhteinen virtuaalikone. Esimerkiksi C#- tai Visual Basic -koodista käännetään samanlaista tavukoodia, joka suoritetaan Common Language Runtimessa.</li>
<li><strong>Java Virtual Machine</strong> JVM-pohjaisten kielten yhteinen virtuaalikone. Javan lisäksi esimerkiksi Scala [<a href="#source8">8</a>] ja Groovy [<a href="#source5">5</a>] käyttävät JVM:ää tavukoodin suoritukseen.</li>
</ul>

<h2><a id="sec1">1. Johdanto</a></h2>

<p>Olio-ohjelmointikieliä on lukuisia erilaisia. Viime aikoina dynaamisesti tyypitetyt ohjelmointikielet kuten Python ja Ruby ovat saaneet huomiota, mutta staattiset tyypitetytkään kielet eivät ole katoamassa. Microsoftin kehittämä C# ja Sunin kehittämä Java ovat kaksi suosittua staattisesti tyypitettyä olio-ohjelmointikieltä.</p>

<p>Jyväskylän yliopistossa uusille opiskelijoille suunnatut Ohjelmointi 1- ja Ohjelmointi 2 -kurssit ovat viime vuosina järjestetty käyttäen Java-kieltä. Hyvä ohjelmoija ei kuitenkaan ole vain yhden kielen osaaja.</p>

<p>Tutkielmani tarkoitus on selvittää, miten Java-kieltä osaavat opiskelijat pystyisivät opettelemaan mahdollisimman helposti C#-kieltä. Kartoitan ensin kielten historiaa ja käyttötarkoituksia, jonka jälkeen tutkin, mitä yhteistä ja erilaista kielillä on. Teen tutkimukseni vertailemalla kielten opetusmateriaaleja ja ohjelmakoodiesimerkkejä.</p>

<h2><a id="sec2">2. Java ja C#</a></h2>

<p>Sun Microsystemsin (myöhemmin Sun) työntekijä, James Gosling, aloitti Java-kielen kehityksen vuonna 1991. Kieli oli alunperin suunnattu käytettäväksi sittemmin unohdetussa kodin elektroniikkalaitteiden ohjaukseen tarkoitetussa *7-laitteessa (StarSeven). Jo alusta asti kielen tavoitteena oli olla prosessoririippumaton, jolloin samalla ohjelmointikielellä pystyttäisiin toteuttamaan sovelluksia useille eri alustoille. *7-laitteet suunniteltiin käytettäväksi digitaalikaapelitelevisioon liittyvissä interaktiivisissa palveluissa, joissa käyttäjät voisivat tuottaa sisältöä. Kaapelitelevisioyhtiöt vastustivat ajatusta, koska he halusivat pitää sisällön kontrolloinnin itsellään. Goslingin tiimissä oli jo 70 henkilöä, mutta selkeää käyttötarkoitusta kielelle ei ollut kaapelitelevisioyhtiöiden kieltäytymisen takia. John Gage, James Gosling, Patrick Naughton, Wayne Rosing ja Eric Schmidt kokoontuivat miettimään uutta käyttötarkoitusta ja he päätyivät tutkimaan mahdollisuuksia Javan käyttöön Internetissä. [<a href="#source2">2</a>]</p>

<p>1990-luvun loppupuolelle asti Windows-ohjelmistot kehitettiin edelleen lähes yksinomaan C- ja C++-kielillä, joiden muun muassa vaikeammasta muistinkäsittelystä johtuva monimutkaisuus piti ohjelmistonkehityksen monille vaikeana ja hitaana prosessina. Lisäksi Microsoftin kirjastojen käyttäminen sitoi kehitetyt ohjelmat Windows-ympäristöön.</p>

<p>Jos ohjelmistoja pystyisi käyttämään millä tahansa käyttöjärjestelmällä, ei Windowsia voisi enää markkinoida ylivoimaisella ohjelmatarjonnalla ja Microsoft menettäisi valta-asemansa. Estääkseen Javan kehittymisen merkittäväksi kilpailijaksi Microsoft teki läheisimmän yhteistyökumppaninsa, Intelin, kanssa yhteisen päätöksen kehittää kilpailija Javalle. Javan prosessoririippumattomuus oli uhka myös Intelille sen ollessa suurin prosessorivalmistaja. Microsoftin sisällä laadittiin toimintastrategia, jossa Javan kehityksestä pyrittiin tekemään vaikeampaa niin, ettei koodin kirjoittaminen yhdelle alustalle ja sen ajaminen kaikilla muilla enää onnistunutkaan. Tämä onnistui toteuttamalla Windowsille oma Java-virtuaalikone, joka oli Sunin virallista tehokkaampi, mutta käytti epästandardeja J++-nimellä kulkeneita laajennuksia. Näennäisesti Microsoft jatkoi edelleen Javan tukemista omalla alustallaan, mutta pyrki saamaan oman Windowsiin sidotun ratkaisunsa kehityksessä Javan ohi. Sun ei pitänyt Microsoftin aiheuttamasta uhasta tuotettaan kohtaan ja vuonna 1998 Sun haastoi Microsoftin oikeuteen. [<a href="#source3">3</a>] Syytteen perusteluiksi Sun esitti Microsoftin rikkoneen lisenssiehtoja, joista Sun ja Microsoft oli sopineet vuonna 1995. [<a href="#source25">25</a>]</p>

<p>Oikeustaistelu varjosti Microsoftin Java-toteutuksen tulevaisuutta ja Microsoftin suunnittelema uusi pohja omaa korvaavaa kieltä varten lopetti J++:n jatkokehityksen. Vuonna 1999 Microsoft perusti Anders Hejlsbergin johdolla kehitysryhmän C#-ohjelmointikieltä varten. Kieli otti vaikutteita muun muassa Pascalista ja Javasta. Erityisen paljon vaikutteita on antanut Delphi, koska Hejlsberg työskenteli edellisessä työpaikassaan Borlandilla yhtenä Delphin pääkehittäjistä. [<a href="#source6">6</a>]</p>

<p>Oikeustaistelu sovittiin oikeussalien ulkopuolella vuonna 2004 ja Microsoft maksoi 1,95 miljardia dollaria korvauksia ja lisenssimaksuja Sunille. [<a href="#source4">4</a>]</p>

<h3><a id="sec2_1">2.1 Käyttöalustat</a></h3>

<p>Kuten edellisessä luvussa selvisi, Java on alusta asti suunnattu käytettäväksi useilla eri alustoilla. Näin ohjelmiston toteuttava organisaatio ei joudu sitoutumaan vain yhteen laitealustaan, jonka tulevaisuuteen organisaatio ei voi suoraan vaikuttaa. Kaikille alustoille Java-virtuaalikonetta ei ole kehitetty, mutta muun muassa Windowsin, Mac OS X:n, Linuxin ja BSD-varianttien tukeminen kattaa suuren osan maailman tietokoneista. Microsoftin virallinen tuki C#:lle kattaa Windows-työpöydän, Xbox 360 -pelikonsolin ja Windows Mobile -laitteet.</p>

<p>C# ja siihen olennaisesti liittyvät kirjastot eivät kuitenkaan ole sidottu pelkästään Windowsiin. Mono on Novellin johtama projekti, jonka tavoitteena on kehittää useilla eri käyttöjärjestelmillä toimivat avoimen lähdekoodin versiot näistä työkaluista. Kirjoitushetkellä Monosta on toteutettu viralliset versiot Windowsille, Linuxille, Mac OS X:lle ja Solarikselle. Koska projekti ei ole Microsoftin toteuttama, kaikki Microsoftin kehittämät ominaisuudet eivät ole käytettävissä, mutta kattava osa näistä on kuitenkin jo toimivia. Myös Microsoftin Silverlight-web-teknologiasta on muilla alustoilla toimiva Mono-projektin alainen Moonlight-käännös. [<a href="#source24">24</a>]</p>

<h3><a id="sec2_2">2.2 Kehitysympäristöt</a></h3>

<p>Javalle ei ole yhtä virallista kehitysympäristöä, mutta hyvin suosituksi valinnaksi on osoittautunut alunperin IBM:n VisualAge-ohjelmiston pohjalta kehitetty Eclipse Foundationin Eclipse. Eclipse itsessään on kehitetty Javalla ja sillä on mahdollista kääntää sovelluksia jokaiselle Java-virtuaalikonetta tukevalle alustalle. Toinen suosittu kehitysympäristö on Sunin NetBeans. Ominaisuuksiltaan ja käytettävyydeltään nämä kaksi ovat hyvin lähellä toisiaan.</p>

<p>Visual Studio on Microsoftin tarjoama kehitysympäristö, jolla pystytään kehittämään muun muassa C#-ohjelmia. Siitä on olemassa kaupallinen ominaisuuksiltaan monipuolisempi versio, mutta myös harrastelijoille ja opiskelijoille suunnattu kevyempi, ilmainen Visual Studio Express. Visual Studio toimii vain Windows-ympäristössä, mutta sillä voidaan kehittää muillakin alustoilla toimivia sovelluksia käyttämällä Mono-kääntäjää.</p>

<h2><a id="sec3">3. Yhtäläisyydet</a></h2>

<p>Java ja C# ovat molemmat staattisesti tyypitettyjä olio-ohjelmointikieliä. Ohjelma koostuu yhdestä tai useammasta luokasta. Luokat sisältävät olio- ja arvotyyppejä. Kun ohjelmakoodi on valmis, se käännetään kääntäjäohjelmalla tavukoodiksi. Tavukoodia ei pysty suoraan suorittamaan koneella, vaan se suoritetaan virtuaalikoneessa, joka tulkkaa tavukoodin käyttöjärjestelmälle sopivaksi binäärikoodiksi.</p>

<h3><a id="sec3_1">3.1 Oliotyypit</a></h3>

<p>Oliot ovat tietorakenteita, joilla on tietokenttiä ja metodeja eli olion liittyviä funktioita. Oliotyyppiset muuttujat ovat viitteitä olion ensimmäiseen muistipaikkaan. Olion tietorakenteeseen tallennetaan olion tyyppi, arvotyyppiset muuttujat ja viitteet oliotyyppisiin muuttujiin. Lisäksi olio tarvitsee metodiensa sijainnin muistissa.</p>

<h3><a id="sec3_2">3.2 Arvotyypit</a></h3>

<p>Javan ja C#:n arvotyyppiset muuttujat ovat keskenään hyvin samankaltaisia. Arvotyyppeihin säilötään totuusarvoja, yksittäisiä merkkejä ja kokonais- ja desimaalilukuja. Arvotyypit on esitelty taulukossa 1 [<a href="#source11">11</a>].</p>

<table>
<tr><th>Java</th><th>C#</th><th>Kuvaus</th></tr>
<tr><td><code>boolean</code></td><td><code>bool</code></td><td>Kaksiarvoinen totuusarvomuuttuja</td></tr>
<tr><td><code>char</code></td><td><code>char</code></td><td>Unicode-merkki</td></tr>
<tr><td><code>byte</code></td><td><code>sbyte</code></td><td>8-bittinen kokonaisluku väliltä [-128, 127]</td></tr>
<tr><td><code>-</code></td><td><code>byte</code></td><td>8-bittinen positiivinen kokonaisluku väliltä [0, 255]</td></tr>
<tr><td><code>short</code></td><td><code>short</code></td><td>16-bittinen kokonaisluku väliltä [-32 768, 32 767]</td></tr>
<tr><td><code>-</code></td><td><code>ushort</code></td><td>16-bittinen positiivinen kokonaisluku väliltä [0, 65 535]</td></tr>
<tr><td><code>int</code></td><td><code>int</code></td><td>32-bittinen kokonaisluku väliltä [-2 147 483 648, 2 147 483 647]</td></tr>
<tr><td><code>-</code></td><td><code>uint</code></td><td>32-bittinen positiivinen kokonaisluku väliltä [0, 4 294 967 295]</td></tr>
<tr><td><code>long</code></td><td><code>long</code></td><td>64-bittinen kokonaisluku väliltä [-922 337 203 685 477 508, 922 337 203 685 477 507]</td></tr>
<tr><td><code>-</code></td><td><code>ulong</code></td><td>64-bittinen positiivinen kokonaisluku väliltä [0, 1 844 674 407 370 955 015]</td></tr>
<tr><td><code>float</code></td><td><code>float</code></td><td>32-bittinen desimaaliluku väliltä [-3,402823e38, 3,402823e38]</td></tr>
<tr><td><code>double</code></td><td><code>double</code></td><td>64-bittinen desimaaliluku väliltä [-1,79769313486232e308, 1,79769313486232e308]</td></tr>
<caption>Taulukko 1: Javan ja C#:in arvotyypit.</caption>
</table>

<p>Primiitivien nimet ovat kielissä lähes identtiset. Eroina totuusarvotyyppi on Javassa nimeltään <code>boolean</code> ja C#:ssa <code>bool</code> sekä 8-bittinen kokonaisluku on Javassa <code>byte</code> ja C#:ssa <code>sbyte</code>.</p>

<p>Nimeämiserojen lisäksi C#:ssa on omat tyypit etumerkittömille (<em>engl. unsigned</em>) kokonaisluvuille. Javassa kaikki desimaali- ja kokonaisluvut voivat olla positiivisia tai negatiivisia. Jos haluamme käsitellä pelkkiä positiivisia lukuja, joudumme kirjoittamaan ohjelmakoodiin logiikan, joka tarkistaa lukujen positiivisuuden.</p>

<h3><a id="sec3_3">3.3 Ohjelmointisyntaksi</a></h3>

<p>Hello World -esimerkki on todennäköisesti monille opiskelijoille tuttu. Java-kielellä se toteutetaan seuraavasti:</p>

<pre><code>public class HelloWorld {
  public static void main(String[] args) {
    System.out.writeln("Hello World!");
  }
}
</code></pre>

<p>Luodaan <code>HelloWorld</code>-luokka, johon määritellään julkinen staattinen <code>main</code>-metodi. <code>main</code>-metodi ottaa parametrikseen merkkijonotaulukon, joka sisältää mahdolliset komentoriviltä annetut argumentit. <code>main</code>-metodissa kutsumme Javan järjestelmäkirjastoista <code>System.out.writeln</code>-metodia, joka tulostaa rivin <code>Hello World</code>.</p>

<pre><code>public class HelloWorld {
  public static void Main(string[] args) {
    System.Console.WriteLine("Hello World!");
  }
}
</code></pre>

<p>Java ja C# lainaavat suuren osan syntaksistaan C-kieleltä, joten Javasta C#:iin siirtyessä ei tarvitse opetella täysin uutta syntaksia. Koodiesimerkeistä voidaan huomata, miten ohjelmat ovat lähes identtisiä. Suurin ero on, että C#-ohjelmissa luokat määritellään nimiavaruuden (<em>engl. namespace</em>) alle ja Javassa ne määritellään pakettiin (<em>engl. package</em>). Nimiavaruudet ja paketit ovat käsitteinä samoja, mutta niiden toteutukset poikkeavat [<a href="#source14">14</a>].</p>

<h3><a id="sec3_4">3.4 Virtuaalikoneet ja tavukoodi</a></h3>

<p>Nykyajan tehokkaat tietokoneet ja korkean tason ohjelmointikielet piilottavat suuren osan siitä, mitä koneen sisällä tapahtuu ohjelmaa ajettaessa. Kun tietokoneet olivat huomattavasti nykyistä tehottomampia, ei ollut varaa tuhlata suorituksen kellojaksoja. Tällöin ohjelmat kirjoitettiin Assembly-kielellä, joka on hyvin matalan tason ohjelmointikieli. Se on tehokas, koska ohjelmoija kirjoittaa koodiin jokaisen operaation, joka ohjelman ajamisen aikana suoritetaan. Koska ohjelmointi tehdään laitetasolla, kirjoittaminen on hidasta ja virhealtista ja toiselle käyttöjärjestelmä- tai laitealustalle siirtyminen saattaa vaatia huomattavia muutoksia koodiin.</p>

<p>Koneiden nopeutuessa yksittäisten kellojaksojen arvo ei ollut enää yhtä suuri kuin aiemmin, joten ohjelmat voitiin kirjoittaa korkeamman tason kielillä, jotka piilottavat kehittäjältä osan ohjelman monimutkaisuudesta. Korkeamman tason kielellä kirjoitetut ohjelmat muutetaan kääntäjällä Assembly-koodiksi, jota tietokone osaa suorittaa. Nyt toiselle käyttöjärjestelmä- tai laitealustalle siirtyminen on helpompaa, koska ohjelmakoodi voidaan parhaassa tilanteessa kirjoittaa vain kerran. Kun otetaan käyttöön uusi alusta, kirjoitetaan sille sopiva kääntäjä. Kääntäjä kääntää aiemmin kirjoitetun ohjelmakoodin uuden alustan ymmärtämäksi konekoodiksi. Usein siirtyminen ei kuitenkaan aivan näin yksinkertaista ole, vaan esimerkiksi Windowsista Linuxiin siirryttäessä joudutaan muokkaamaan tiedostonkäsittelyyn liittyviä osia, koska Windows ja Linux käsittelevät tiedostojärjestelmää eri tavoin.</p>

<p>Kun ohjelmakoodi muutetaan kääntäjällä tietylle alustalle sopivaksi ohjelmaksi, sen kopioiminen toiselle alustalle ei onnistu. Jotta siirtyminen alustalta toiselle onnistuisi ilman uutta käännöstä, muun muassa C#:ia ja Javaa ei käännetä suoraan konekoodiksi, vaan tavukoodiksi. Tavukoodia ei suoraan voi suorittaa koneella kuten konekoodia, vaan väliin tarvitaan virtuaalikone, joka kääntää tavukoodin pyytämät operaatiot konekoodiksi. Kun ohjelmaa halutaan käyttää uudella alustalla, voidaan vanhaa ohjelmatiedostoa suorittaa uudelle alustalle kehitetyllä virtuaalikoneella.</p>

<h2><a id="sec4">4. Erot</a></h2>

<p>Javasta on mahdollista siirtyä C#:iin kirjoittamalla lähes täysin samanlaista koodia kuin Javalla kirjoittaisi, mutta tällöin kielestä toiseen siirtyminen ei tuo merkittäviä etuja, koska C#:stä löytyy useita tekniikoita, jotka mahdollistavat lyhyempiä ja tehokkaampia tapoja kirjoittaa sama ohjelmalogiikka.</p>

<p>Javan versiota 6 ja C#:n versiota 3 vertaillessani ei löytynyt ainoatakaan eroa, jossa Javan toteutus olisi teknisesti tai ohjelmointityön helppouden kannalta ylivoimainen C#:n toteutukseen verrattuna. Tästä ei kuitenkaan voi vetää johtopäätöstä, ettei Javalla ole sijaa ohjelmistokehityksessä ja että C# olisi jokaiseen tilanteeseen parempi ratkaisu. Suurin osa eroista ovat pieniä ja suhteellisen helposti kierrettäviä suoritustehon tai käyttäjäystävällisyyden kustannuksella. Lisäksi ohjelmointikielen valintaan vaikuttavat lukuisat tapauskohtaiset yksityiskohdat, joten yleispätevän suosituksen antaminen ei ole järkevää.</p>

<h3><a id="sec4_1">4.1 Luokat ja tietueet</a></h3>

<p>Javassa primitiivimuuttujien lisäksi on olemassa vain erilaisia luokkia. C#:ssa on tietueita ja luokkia. C#:in primitiivimuuttujat on toteutettu tietueilla [<a href="#source18">18</a>]. Tietue on paremmin C-ohjelmointikielestä tuttu tietorakenne. C:ssä näihin pystyi tallentamaan vain primitiivimuuttujia: funktioita ei pystynyt kirjoittamaan suoraan tietueen sisälle. C#:ssa tietueisiin sopivat kuitenkin funktiot, konstruktorit, operaattorifunktiot ja tapahtumat. Tietueiden periminen ei ole mahdollista, mutta ne voivat kuitenkin toteuttaa rajapintoja samoin kuin luokatkin. [<a href="#source22">22</a>]</p>

<p>Luokista poiketen tietueiden muisti varataan pinosta, eikä dynaamisen muistinhallinnan keosta. Lisäksi uuden tietueen luominen on uuden olion alustamiseen verrattuna kevyt operaatio.</p>

<h3><a id="sec4_2">4.2 Muuttujatyyppien yhdenmukaisuus</a></h3>

<p>Javassa kaikki muuttujatyypit pystyttiin jaottelemaan primitiiveihin ja olioihin. Primitiivejä ovat kaikki, joiden muuttujatyyppi alkaa pienellä alkukirjaimella eli <code>short</code>, <code>int</code>, <code>long</code>, <code>float</code>, <code>double</code>, <code>boolean</code>, <code>char</code> ja <code>byte</code>. Primitiivimuuttujan muistiosoitteessa on suoraan muuttujan arvo. Kaikki muut muuttujatyypit ovat olioita, joiden muistiosoitteessa on viite olion sijaintiin.</p>

<p>Microsoftin mukaan C#:ssa muuttujia ei jaotella primitiiveihin ja olioihin, vaan kaikki periytyvät object-luokasta: näin esimerkiksi <code>int</code>-muuttujilta löytyy <code>ToString</code>-metodi, ja ne pystytään antamaan argumentteina metodille, joka hyväksyy argumentikseen <code>object</code>-tyyppisen olion. Tätä kielen ominaisuutta kutsutaan muuttujatyyppien yhdenmukaisuudeksi (<em>engl. unified type system</em>). [<a href="#source23">23</a>]</p>

<p>Jos Javassa haluttaisiin toteuttaa esimerkiksi pino-olio, johon voidaan asettaa mitä tahansa muuttujia, primitiivimuuttujat tulisi muuttaa vastaaviksi oliomuuttujiksi:</p>

<pre><code>public class Stack {
  public void push(Object input) { ... }
  public object pop() { ... }

  public void main(String[] args) {
    Stack stack = new Stack();
    stack.push(new Double(3.14));
    stack.push(new Integer(17));
  }
}
</code></pre>

<p>C#:ssa sama tapahtuisi seuraavasti [<a href="#source23">23</a>]:</p>

<pre><code>public class Stack {
  public object Pop() { ... }
  public void Push(object o) { ... }

  public void main() {
    Stack stack = new Stack();
    stack.Push(3.14);
    stack.Push(17);
  }
}
</code></pre>

<p>Olioita luodessa on varattava dynaamisesti muistia, suoritettava mahdolliset konstruktorimetodit ja luotava viite luotuun olioon. Arvomuuttujia käyttäessä tarvitsee vain tallentaa arvo staattisesti varattuun muistipaikkaan. Jos kaikki arvomuuttujat olisivat todellisuudessa olioita, suorituskyky kärsisi merkittävästi.</p>

<p>Esimerkiksi tieteellinen laskenta C#:llä olisi hyvin hidasta, koska yhden silmukkakierroksen aikana saatetaan luoda tuhansia muuttujia. Primitiivimuuttujien tapaan tehtävä suora tallennus muuttujan muistiosoitteeseen olisi nopea operaatio, mutta uuden olion luominen on sen sijaan merkittävästi hitaampi. Suoritustehon kasvattamiseksi arvomuuttujien käsittely suoritetaan suoraan muistiosoitteita käyttämällä. Vasta asetettaessa arvomuuttujaa olioon sen arvo kopioidaan olion sisään ja asetetaan muuttuja viittaamaan luotuun olioon. Vastaavasti asetettaessa olioa takaisin arvomuuttujaan arvo kopioidaan olion sisältä ja asetetaan suoraan muistiosoitteeseen. Näitä operaatioita kutsutaan boxing- ja unboxing-operaatioiksi. [<a href="#source23">23</a>]</p>

<h3><a id="sec4_3">4.3 Ominaisuudet</a></h3>

<p>Lähes kaikilla olioilla on attribuutteja, joiden arvoja tulee pystyä lukemaan olion ulkopuolelta. Yksi tapa toteuttaa tämä on asettaa attribuutit täysin tai osittain julkisiksi <code>public</code>- tai <code>protected</code>-avainsanoilla.</p>

<p>Attribuuttien asettaminen julkiseksi on kuitenkin huono tapa, ellei muuttujia ole asetettu vakioksi Javan <code>final</code>- tai C#:in <code>const</code>-avainsanalla, koska muulloin niiden arvoja pystytään myös muuttamaan olion ulkopuolelta. Tällöin syötettäviä uusia arvoja ei pystytä tarkistamaan ennen asettamista, eikä kohdeolio saa itse tietoa arvojensa muuttumisesta. Tämä rikkoo myös enkapsulaatioperiaatetta, jonka perusteella ohjelman pitäisi koostua komponenteista, jotka tarjoavat muille komponenteille käytettävän rajapinnan. Jos muut komponentit käyttävät suoraan toisen komponentin sisäisiä arvoja, on niiden toteutus riippuvainen tietystä komponentin toteutuksesta ja kyseisen komponentin vaihtaminen vaihtoehtoiseen toteutukseen olisi tarpeettoman työlästä.</p>

<p>Yleiseksi tavaksi on muodostunut asettaa attribuutti salaiseksi <code>private</code>-avainsanalla ja kirjoittaa olioon julkiset <code>getter</code>- ja <code>setter</code>-metodit, joilla arvo pystytään lukemaan ja haluttaessa myös muuttamaan. Tämä johtaa niin sanottuun boilerplate-koodiin, jossa vain pieni osa koodista liittyy varsinaiseen toteutukseen [<a href="#source15">15</a>].</p>

<pre><code>public class User {
  private String username;

  public getUsername() {
    return this.username;
  }

  public setUsername(String value) {
    this.username = value;
  }
}
</code></pre>

<p>Valitettavasti Javassa tähän ei ole parempaa keinoa ja ainoa tapa vähentää boilerplate-koodin kirjoittamista on käyttää esimerkiksi kehitysympäristön makroja. C#:ssa sen sijaan on käytettävissä ominaisuudet (<em>engl. properties</em>):</p>

<pre><code>public class User {
  public string Username { get; set; }
}
</code></pre>

<p>Tällä tavoin luokkaan määritellään yhdessä lohkossa julkinen ominaisuus, jonka sisällä <code>get</code>- ja <code>set</code>-avainsanoilla kerrotaan, mitä ominaisuuden arvoa luettaessa ja kirjoittaessa tehdään. Lohkosta voidaan jättää jompikumpi operaatio pois, jolloin ominaisuudesta tulee vain luettava tai vain kirjoitettava.</p>

<p>Esimerkkikoodissa on hyvin yksinkertainen tapaus, jossa kaikki arvot hyväksytään ja arvon lukeminen on sallittua, eikä vaadi erikoismuotoiluja. Vaikeammissa tapauksissakin ominaisuuksista on hyötyä, koska tällöin attribuutin lukemiseen ja kirjoittamiseen liittyvä logiikka on koottuna yhdessä paikassa. Myöskään eri luokkien välillä ei ole eroja <code>getter</code>- ja <code>setter</code>-metodien nimissä: ei ole siis esimerkiksi <code>getName</code>- ja <code>writeName</code>-nimisiä metodeja, vaan arvo luetaan aina syntaksilla <code>olio.Ominaisuus</code> ja uusi arvo asetetaan syntaksilla <code>olio.Ominaisuus = uusiArvo</code>.</p>

<pre><code>private string email;
public string Email {
  get { return this.email; }
  set {
    if ( Validator.validateEmail(value) ) {
      this.email = value;
    }
  }
}
</code></pre>

<p>Yllä olevassa esimerkissä ominaisuuden arvoa asettaessa sille tehdään tarkistus ja vasta sen läpäistyään argumenttina annettu arvo asetetaan ominaisuudelle. Yleisen tavan mukaisesti salainen attribuutti ja julkinen ominaisuus ovat saman nimisiä, mutta ominaisuuden nimi on kirjoitettu isolla alkukirjaimella.</p>

<h3><a id="sec4_4">4.4 Operaattoreiden ylikuormitus</a></h3>

<p>Operaattoreiden ylikuormituksella (<em>engl. operator overloading</em>) kehittäjän on mahdollista määritellä, miten kahden olion väliset aritmeettiset operaatiot ja yhtäsuuruusvertailut toteutetaan. Javassa operaattoreiden ylikuormitus ei ole kehittäjän määriteltävissä, mutta Sun on toteuttanut erikoistapauksena merkkijonojen yhdistämisen <code>+</code>-operaattorilla.</p>

<p>Kuormittamisen puuttumisen takia esimerkiksi matriisien yhteen- ja kertolaskun toteuttaminen on Javassa tehtävä erityisillä, mielivaltaisesti nimetyillä metodeilla, jotka ottavat parametrikseen toisen matriisin. Jo yksinkertaisesta matemaattisesta lausekkeesta tulee monimutkainen.</p>

<pre><code>public class Matrix {
  public Matrix add(Matrix matrix) { /* ... */ }
  public Matrix multiply(Matrix matrix) { /* ... */ }

  public void main(String[] args) {
    Matrix matrix1 = new Matrix(/* ... */);
    Matrix matrix2 = new Matrix(/* ... */);
    Matrix matrix3 = new Matrix(/* ... */);

    matrix1.add(matrix2).multiply(matrix3);
  }
}
</code></pre>

<p>C#:n kanssa operaattoreiden ylikuormitus onnistuu määrittelemällä luokkaan staattinen metodi <code>operatorX</code>, jossa <code>X</code> on ylikuormitettava operaattori. Lista mahdollisesti ylikuormitettavista operaattoreista löytyy Microsoft Developer Network -palvelusta [<a href="#source20">20</a>].</p>

<pre><code>public class Matrix {
  public static Matrix operator+(Matrix m1, Matrix m2) { ... }
  public static Matrix operator*(Matrix m1, Matrix m2) { ... }

  public void main() {
    Matrix matrix1 = new Matrix(/* ... */);
    Matrix matrix2 = new Matrix(/* ... */);
    Matrix matrix3 = new Matrix(/* ... */);

    matrix1 = (matrix1 + matrix2) * matrix3;
  }
}
</code></pre>

<p>Matriisilaskenta yllä olevalla koodilla ei ole tehokasta. Jokaista laskutoimitusta kohden luodaan uusi matriisiolio. Esimerkiksi <code>matrix1 + matrix2</code> luo uuden olion, joka kerrotaan <code>matrix3</code>-oliolla, jolloin syntyy jälleen uusi olio. Jos alkuperäisiä matriiseja ei ole tarvetta säilyttää, kannattaa esimerkiksi kertolaskun tulokset sijoittaa suoraan kerrottavaan matriisiin. Periaatteessa tämän voi toteuttaa operaattoreiden ylikuormituksellakin, jos kuormittavassa metodissa lasketaan lopputulos operandiin. Tämä tosin on epäloogista käyttäjän kannalta, koska hän ei pysty huomaamaan lausekkeesta <code>matrix1 * matrix2</code>, että <code>matrix2</code>:n arvo muuttuu. Koska operaattoreiden ylikuormituksella ei voi saavuttaa muuta kuin parempaa luettavuutta, olisi tällaisen ylikuormituksen tekeminen mieletöntä.</p>

<p>Sinänsä operaattoreiden ylikuormitus ei ole kuin kuorrutusta syntaksin päälle, mutta sillä on mahdollista yksinkertaistaa ja lyhentää monimutkaisia lausekkeita. Etenkin matemaattista ohjelmistoa kehittäessä laskukaavat näyttävät samankaltaisemmilta paperilla ja ohjelmakoodissa. Lisäksi vähempi koodimäärä ja loogisempi muotoilu edesauttaa virheettömyyttä.</p>

<p>Operaattoreita ylikuormittaessa on tärkeää muistaa tehdä vain loogisia ylikuormituksia: mitä toiminnallisuutta haluttaisiin esimerkiksi kuvata merkkijonojen <code>-</code>-operaattoria kuormittaessa? Epäloogisilla ylikuormituksilla on helppo tehdä koodista vaikealukuista.</p>

<h3><a id="sec4_5">4.5 Parametrinvälitys</a></h3>

<p>Javassa parametrinvälitys hoidetaan aina arvonvälitysmenetelmällä (<em>engl. pass by value</em>). Tämä tarkoittaa sitä, että kun metodia kutsuttaessa annetaan argumenttina jokin arvo, se kopioidaan metodin parametrille.</p>

<p>Arvomuuttujilla tilanne on yksinkertainen. Jos metodille annetaan argumenttina <code>3</code> ja metodissa tätä arvoa kasvatetaan, muutos näkyy ainoastaan metodin määrittelemällä näkyvyysalueella.</p>

<p>Olioiden kanssa tilanne on valitettavasti monimutkaisempi. Jos esimerkkimetodilla <code>changeReference</code> on parametri <code>greetings</code> ja kutsuvasta metodista annetaan argumentti <code>greetingsArgument</code>, parametriin kopioidaan arvoksi sama viite kuin argumentilla. Jos <code>changeReference</code>-metodissa viite asetetaan osoittamaan uuteen olioon, parametrin arvo vaihtuu, mutta argumentin arvo säilyy ennallaan, koska parametrin arvo oli vain kopio argumentista: ei siis sama viite. Jos esimerkkimetodissa useReference kutsutaan parametriolion <code>append</code>-metodia argumentilla <code>Thanks!</code>, sekä parametri että argumentti osoittavat kuitenkin edelleen samaan olioon, joten sekä suorittaja että vastaanottaja näkevät <code>append</code>-metodilla tehdyn muutoksen.</p>

<pre><code>public class ReferenceTest {
  private static void changeReference(StringBuffer greetings) {
    greetings = new StringBuffer("Thanks!");
  }

  private static void useReference(StringBuffer greetings) {
    greetings.append(" Thanks!");
  }

  public static void main(String[] args) {
    StringBuffer greetingsArgument = new StringBuffer("Hello!");
    System.out.println(greetingsArgument.toString());
    changeReference(greetingsArgument);
    System.out.println(greetingsArgument.toString());

    StringBuffer goodbyeArgument = new StringBuffer("Goodbye!");
    System.out.println(goodbyeArgument.toString());
    useReference(goodbyeArgument);
    System.out.println(goodbyeArgument.toString());
  }
}
</code></pre>

<p>Ohjelman tulosteeksi saadaan:</p>

<pre><code>Hello!
Hello!
Goodbye!
Goodbye! Thanks!
</code></pre>

<p>C#:ssa parametrinvälityksessä käytetään oletuksena samaa arvonvälitysmenetelmää, mutta tarvittaessa parametrit voidaan välittää myös viitteenvälitysmenetelmällä (<em>engl. pass by reference</em>). Tällöin kutsuttu metodi voi muuttaa annetun viitteen arvoa. Viitteenvälitys valitaan käyttöön <code>ref</code>-avainsanalla. <code>Ref</code>-avainsanaa on silloin käytettävä sekä metodin määrittelyssä että metodia kutsuttaessa, jottei metodi pääse yllättäen muuttamaan viitteen arvoa ilman kutsun suorittajan erillistä lupaa.</p>

<pre><code>public class ReferenceTest {
  public static void setThanks(StringBuilder input) {
    input = new StringBuilder("Thanks!");
  }

  public static void setThanksByReference(ref StringBuilder input) {
    input = new StringBuilder("Thanks!");
  }

  public static void Main(string[] args) {
    StringBuilder greetings = new StringBuilder("Hello!");
    System.Console.WriteLine(greetings.ToString());
    setThanks(greetings);
    System.Console.WriteLine(greetings.ToString());
    setThanksByReference(ref greetings);
    System.Console.WriteLine(greetings.ToString());
  }
}
</code></pre>

<p>Ohjelman tulosteeksi saadaan:</p>

<pre><code>Hello!
Hello!
Thanks!
</code></pre>

<h3><a id="sec4_6">4.6 Delegaatit ja osoittimet</a></h3>

<p>Javassa ja C#:ssa metodeihin viittaaminen on toteutettu eri tavalla. Esimerkiksi graafisia käyttöliittymiä ohjelmoitaessa komponentille määritetään, mikä metodi sen tulee ajaa tietyn tapahtuman ilmetessä. Javassa suoraan metodiin viittaaminen ei ole mahdollista. Tämä kierretään yleisesti ohjelmoimalla kuuntelijarajapinnan toteuttava olio, joka sisältää tapahtuman ilmetessä ajettavan metodin. Alla esimerkki, kuinka painikkeen painallustapahtumaan liitetään kutsuttava metodi:</p>

<pre><code>loginButton.addMouseListener(new java.awt.event.MouseAdapter() {
  public void mouseClicked(java.awt.event.MouseEvent evt) {
    loginButtonMouseClicked(evt);
  }
});
</code></pre>

<p>C#:ssa funktioihin viittaaminen onnistuu delegaateilla. C#:ssa on viitteiden ja delegaattien lisäksi myös esimerkiksi C-kielestä tutut osoittimet. Osoittimilla pystytään viittaamaan suoraan muistipaikkaan, jossa on primitiivimuuttuja tai tietue, joka sisältää primitiivimuuttujia [<a href="#source21">21</a>].</p>

<h3><a id="sec4_7">4.7 Osittaiset luokat</a></h3>

<p>Osittaiset luokat (<em>engl. partial classes</em>) mahdollistavat luokan jakamisen useampaan eri lähdekooditiedostoon. Näin esimerkiksi graafisissa käyttöliittymissä itse käyttöliittymän asettelu- ja muotoilukoodi voidaan eriyttää sen toiminnallisuutta kuvaavasta koodista ja lopputuloksena on selkeämpi kokonaisuus, jolloin kehittäjä voi keskittyä kulloinkin olennaiseen osaan.</p>

<p>Javassa osittaisia luokkia ei ole. Siksi yhden ikkunan ohjelmakoodissa on sekä käyttöliittymä komponenttien sijoittelu ja muotoilu että ikkunan käyttöliittymän logiikkakoodi. Esimerkiksi NetBeansillä käyttöliittymää kehittäessä tätä koodin paljoutta yritetään piilottaa tekemällä sijoittelu ja muotoilu niiden tekemiseen tarkoitetulla apuohjelmalla, eikä suoraan koodilla. Oletuksena NetBeans piilottaa tämän apuohjelman luoman koodin ja estää sen muokkaamisen. Muotoilu- ja sijoittelukoodi on kuitenkin samassa luokassa käyttöliittymän logiikan kanssa ja luokan koko kasvaa.</p>

<p>C#:ssa muotoilu ja sijoittelu sijoitetaan omaan tiedostoonsa, jota käyttäjän ei pitäisi joutua muokkaamaan suoraan ollenkaan. Luokan toiseen osaan jää vain käyttöliittymän logiikkaan liittyvä koodi. Osittaiset luokat sopivat myös muualle. Käyttöliittymäohjelmointi on vain yksi esimerkki niiden käytöstä.</p>

<h3><a id="sec4_8">4.8 Lambda-lausekkeet</a></h3>

<p>C#:n lambda-lausekkeet ovat anonyymejä funktioita. [<a href="#source19">19</a>] Anonyymit funktiot ovat nimensä mukaisesti nimettömiä funktioita. Anonyymejä funktioita käytetään usein tilanteissa, joissa funktiota ei tarvitse pystyä kutsumaan muualta ja funktio on suhteellisen yksinkertainen. Esimerkki tällaisesta tilanteesta on listojen läpikäynti tilanteessa, jossa listasta etsitään tietyn ehdon täyttäviä alkioita tai halutaan järjestää alkiot jotenkin muuten kuin alkioiden luonnolliseen järjestykseen. Alla esimerkki, miten kokonaislukutaulukosta voidaan laskea parittomien alkioiden lukumäärä:</p>

<pre><code>public class LambdaExpressionExample {
  public static void Main(string[] args) {
    int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    int oddNumbers = numbers.Count(n =&gt; n % 2 == 1);
    System.Console.WriteLine(oddNumbers);
  }
}
</code></pre>

<p><code>Count</code>-metodille ei tarvitse antaa tyyppiparametriä. C#:in tyypin määrittely (<em>engl. type inference</em>) pystyy päättelemään geneerisen metodin tyypin argumenttien perusteella. [<a href="#source16">16</a>] <code>Count</code>-metodi on määritelty muodossa <code>Enumerable.Count<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)</code>.    [<a href="#source17">17</a>] Esimerkin lista <code>numbers</code> on tyyppiä <code>IEnumerable<int></code>, joten anonyymin funktion geneerinen tyyppi <code>Func<TSource, Boolean></code> pystytään päättelemään eksplisiittiseksi tyypiksi <code>Func<int, Boolean></code>.</p>

<p>Javassa ei ole mahdollista tehdä lambda-lausekkeita. [<a href="#source10">10</a>] Lähes samanlaisen toiminnallisuuden voi tehdä käyttämällä anonyymejä luokkia. Kuten yllä olevassa C#-esimerkissä, on myös Java-esimerkin <code>count</code>-metodi geneerinen eli samalla metodilla voitaisiin laskea esimerkiksi oliolistasta niiden olioiden lukumäärä, joiden attribuutit täyttävät halutun ehdon. C#:sta poiketen Javassa geneeriset tyypit voivat olla vain oliotyyppejä. [<a href="#source1">1</a>]</p>

<pre><code>interface Predicate&lt;T&gt; { public boolean apply(T type); }

public class AnonymousClassExample {
  public static &lt;T&gt; int count(T[] values, Predicate&lt;T&gt; predicate) {
    int amount = 0;
    for (T value : values) {
      if (predicate.apply(value)) {
        amount++;
      }
    }
    return amount;
  }

  public static void main(String[] args) {
    Integer[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
    int oddNumbers = count(numbers, new Predicate&lt;Integer&gt;() {
      public boolean apply(Integer number) {
        return number % 2 == 1;
      }
    });
    System.out.println(oddNumbers);
  }
}
</code></pre>

<h3><a id="sec4_9">4.9 Suoritusteho</a></h3>

<p>Java ja C# ovat molemmat virtuaalikoneessa ajettavia kieliä. Tästä voisi nopeasti vetää johtopäätöksen, että molemmat ovat hitaampia C:hen ja C++:aan verrattuna, koska niillä kirjoitetut ohjelmat käännetään suoraan binäärikoodiksi. Tilanne ei kuitenkaan ole aivan niin yksinkertainen. Esimerkiksi IBM:n suorittamien testien perusteella Javan muistinvaraus on C++:n muistinvarausta nopeampaa, vaikka C++:ssa ohjelmoija voi päättää, varataanko tila keosta vai pinosta [<a href="#source9">9</a>].</p>

<p>Vaikka korkeamman tason kielillä ohjelmoijan mahdollisuudet yksityiskohtaiseen suoritustehon virittelyyn ovatkin pienemmät, ei tämä ole välttämättä suora osoitus suoritustehon laskemisesta. C:täkin voitaisiin pitää Assemblyä hitaampana kielenä, koska C on välitaso ja ohjelmoijan kirjoittaessa suoraan Assembly-kieltä hän voi tehdä kaikki hyväksi toteamansa optimoinnit, joita kääntäjä ei osaa tehdä.</p>

<p>Kannattaa kuitenkin muistaa, että ohjelmien suoritustehovaatimukset vaihtele-vat ohjelmien luonteesta riippuen. Esimerkiksi verkkokauppaa tehdessä suuri osa käyttäjän kokemasta hitaudesta johtuu HTTP-yhteyksien hitaudesta ja tähän ei voi ohjelmointikielen valinnan vaikuttaa. Donald Knuth, eräs tietotekniikan alan suurista tutkijoista, on todennut ennenaikaisen optimoinnin olevan kaiken pahan alku ja juuri. Hän teki tämän väitteen jo vuonna 1974 [<a href="#source13">13</a>].</p>

<p>Harvaa ohjelmaa kirjoitetaan tilanteessa, jossa aikaa ja rahaa olisi tarjolla loputtomasti. Jos rupeaa alusta asti kirjoittamaan käyttöliittymärutiineja C:llä tai jopa Assemblyllä, venyy kehitysaika varmasti Javaan ja C#:iin verrattuna, koska näille on tarjolla hyvin tehokkaita käyttöliittymäkirjastoja ja -työkaluja. Jos epäilee, että suoritusteho ei korkeamman tason kielillä välttämättä riitä, kannattaa kirjoittaa ensin prototyyppi korkeamman tason kielillä ja ajaa tämä kattavien suoritustehotestin läpi. Todennäköisesti pahimmassakin tapauksessa lisäsuoritustehoa vaativat ohjelman osat ovat pieni osa kokonaisuudesta. Nämä osat voidaan sitten optimoida esimerkiksi hiomalla algoritmit huippuunsa ja jos tarvetta oikeasti vielä tässä vaiheessa on, kirjoittaa ne uudestaan alemman tason kielillä ja liittää osaksi muuta ohjelmaa.</p>

<h2><a id="sec5">5. Yhteenveto</a></h2>

<p>Maailmassa on valtava määrä ohjelmointikieliä. Eri ohjelmointikielet on suunniteltu erilaisia tarpeita varten. Vanhoja ohjelmointikieliä korvataan jatkuvasti uusilla. Vain yhden ohjelmointikielen osaaminen ei siis ole kannattavaa.
Tutkimuksen tarkoituksena oli selvittää, voidaanko Java-ohjelmointikielen osaamista hyödyntää C#-ohjelmointikielen opiskelussa. Tutkimuksessa selvitettiin ohjelmointikielten yhtäläisyyksiä ja eroja ohjelmoijan näkökulmasta.</p>

<p>Yhtäläisyyksiä ja eroja selvitettiin vertaamalla etupäässä Microsoftin sekä aiemmin Sunin, mutta nykyään Oraclen tekemiä kielten ohjelmointioppaita, rajapintakuvauksia ja kielten teknisiä spesifikaatioita. Näiden lisäksi materiaalina käytettiin myös kolmansien osapuolten artikkeleita Javasta, C#:sta ja ohjelmoinnista yleisesti.</p>

<p>Tutkimuksen tulosten perusteella Javan osaamista voidaan käyttää hyvin C#:in opiskelussa. Molemmat kielet käyttävät olio-ohjelmoinnin paradigmaa, yhtälaista syntaksia ja virtuaalikonetta tavukoodin tulkitsemisessa käytettävän tietokoneen ymmärtämäksi konekoodiksi. Eroja kielten välillä ovat muun muassa C#:in käyttämät tietueet primiitimuuttujien kantaluokkana, virtuaalikoneiden saatavuus eri käyttöjärjestelmissä sekä C#:in tuki delegaateille ja lambda-lausekkeille.</p>

<p>Tutkimusten tulosten perusteella Javaa osaava ohjelmoija voi siirtyä helposti käyttämään C#:ia ja vastaavasti C#:ia osaava ohjelmoimaan Javaa. Tästä on hyötyä erityisesti yritysmaailmassa, jossa on tätä kirjoittaessa pula tietoteknologian osaajista Tietotekniikan liiton toiminnanjohtaja Robert Serénin mukaan [<a href="#source12">12</a>]. Esimerkiksi C#-osaajaa etsivän yrityksen ei tarvitse tutkimusten tulosten mukaan hylätä Java-osaajaa, vaan hakija pystyy todennäköisesti omaksumaan uuden kielen nopeasti.</p>

<p>Voin vahvistaa tutkimusten tulosten pitävän paikkaansa omakohtaisten kokemuksieni perusteella. Keväällä 2010 vaihdoin Java-ohjelmointitehtävistä C#:ia käyttävään yritykseen. Siirtyminen tuntui helpolta ja se onnistui nopeasti.</p>

<h2><a id="sec_sources">Lähteet</a></h2>

<p>[<a id="source1">1</a>] Allen, E., Diagnosing Java code: Java generics without the pain, Part 1, saatavilla <a href="http://www.ibm.com/developerworks/java/ library/j-djc02113.html">WWW-muodossa</a>, 1.3.2011.</p>

<p>[<a id="source2">2</a>] Byous, J., Java Technology: The Early Years, saatavilla <a href="http://web.archive.org/web/20080530073139/http://java.sun.com/features/1998/05/birthday.html">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source3">3</a>] CNET News, Microsoft’s Holy War On Java, saatavilla <a href="http://news.cnet.com/Microsofts-holy-war-on-Java/2009-1001_3-215854.html">WWW-muodossa</a>, 23.9.2008.</p>

<p>[<a id="source4">4</a>] CNET News, Sun settles with Microsoft, announces layoffs, saatavilla    <a href="http://news.cnet.com/ Sun-settles-with-Microsoft,-announces-layoffs/2100-1014_3-5183848.html">WWW-muodossa</a>, 7.12.2008.</p>

<p>[<a id="source5">5</a>] Codehaus Foundation, Groovy &#8211; An agile dynamic language for the Java Platform, saatavilla <a href="http://groovy.codehaus.org/">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source6">6</a>] Computer World, The A-Z Of Programming Languages: C#, saatavilla <a href="http://www.computerworld.com.au/article/ 261958/-z_programming_languages_c?p=1&#038;fp=&#038;fpid=">WWW-muodossa</a>, 6.12.2008.</p>

<p>[<a id="source7">7</a>] DedaSys LLC, Programming Language Popularity, saatavilla <a href="http://langpop.com/">WWW-muodossa</a>, 25.1.2011.</p>

<p>[<a id="source8">8</a>] École Polytechnique Fédéralede Lausanne, The Scala Programming Language, saatavilla <a href="http://www.scala-lang.org/node/25">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source9">9</a>] IBM developerWorks, Java theory and practice: Urban performance legends, revisited, saatavilla <a href="http://www.ibm.com/developerworks/java/library/j-jtp09275.html">WWW-muodossa</a>, 18.1.2011.</p>

<p>[<a id="source10">10</a>] Java Community Process, JSR 335: Lambda Expressions for the JavaTM Pro- gramming Language, saatavilla <a href="http://jcp.org/en/jsr/detail?id=335">WWW-muodossa</a>, 1.3.2011.</p>

<p>[<a id="source11">11</a>] Jones, A. &amp; Freeman, A., 2003. C# for Java Developers. Redmond, Washington: Microsoft Press.</p>

<p>[<a id="source12">12</a>] Kaleva,   Oikeanlaisista  it-osaajista    ollut   pulaa,  saatavilla  <a href="http://www.kaleva.fi/uutiset/oikeanlaisista-it-osaajista-ollut-pulaa/889837">WWW-muodossa</a>, 21.2.2011.</p>

<p>[<a id="source13">13</a>] Knuth, D.E., Structure Programming with go to Statements, saatavilla <a href="http://www.univasf.edu.br/~marcus.ramos/pc-2008-2/p261-knuth.pdf">WWW-muodossa</a>, 25.1.2011.</p>

<p>[<a id="source14">14</a>] Kurniawan B., Comparing C# and Java, saatavilla <a href="http://ondotnet.com/pub/a/dotnet/2001/06/07/csharp_java. html?page=1">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source15">15</a>] Lämmel, R. &amp; Jones, S.P., Scrap Your Boilerplate: A Practical Design Pattern for Generic Programming, saatavilla <a href="http://homepages.cwi.nl/~ralf/tldi02.pdf">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source16">16</a>] Microsoft Developer Network, C# Language Specification, luku 7.5.2, saa- tavilla <a href="http://msdn.microsoft.com/en-us/library/ms228593.aspx">WWW-muodossa</a>, 1.3.2011.</p>

<p>[<a id="source17">17</a>] Microsoft Developer Network, Enumerable.Count<TSource> Method (IEnume- rable<TSource>, Func<TSource, Boolean>), saatavilla <a href="http://msdn.microsoft.com/en-us/library/bb535181.aspx">WWW-muodossa</a>, 1.3.2011.</p>

<p>[<a id="source18">18</a>] Microsoft Developer Network, Int32 Structure, saatavilla <a href="http://msdn.microsoft.com/en-us/library/system.int32.aspx">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source19">19</a>] Microsoft Developer Network, Lambda Expressions, saatavilla <a href="http://msdn.microsoft.com/en-us/library/bb397687.aspx">WWW-muodossa</a>, 1.9.2009.</p>

<p>[<a id="source20">20</a>] Microsoft Developer Network, Overloadable Operators, saatavilla <a href="http://msdn.microsoft.com/en-us/library/8edha89s(VS.71).aspx">WWW-muodossa</a>, 24.1.2011.</p>

<p>[<a id="source21">21</a>] Microsoft Developer Network, Pointer Types (C#), saatavilla <a href="http://msdn.microsoft.com/en-us/library/y31yhkeb(VS.80).aspx">WWW-muodossa</a>, 3.9.2009.</p>

<p>[<a id="source22">22</a>] Microsoft Developer Network, struct (C#), saatavilla <a href="http://msdn.microsoft.com/en-us/library/ah19swz4(VS.71).aspx">WWW-muodossa</a>, 1.12.2008.</p>

<p>[<a id="source23">23</a>] Microsoft Developer Network, Type system unification, saatavilla <a href="http://msdn.microsoft.com/en-us/library/aa664638(VS.71).aspx">WWW- muodossa</a>, 7.1.2009.</p>

<p>[<a id="source24">24</a>] Mono Project, Mono, saatavilla <a href="http://www.mono-project.com/">WWW-muodossa</a>, marraskuu 2008.</p>

<p>[<a id="source25">25</a>] SunWorld, Microsoft licenses Java, saatavilla <a href="http://sunsite.uakom.sk/sunworldonline/swol-12-1995/swol-12-microsoft.html">WWW-muodossa</a>, 2.5.2009.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2011/javasta-ciin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Javasta C#:iin: Erot pintaa syvemmältä (In Finnish)</title>
		<link>http://villesalonen.fi/2010/javasta-c-sharpiin-erot-pintaa-syvemmalta/</link>
		<comments>http://villesalonen.fi/2010/javasta-c-sharpiin-erot-pintaa-syvemmalta/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 16:47:35 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=250</guid>
		<description><![CDATA[Tämä essee on kirjoitettu alunperin Jyväskylän yliopiston Ohjelmointikielten periaatteet -kurssille. Päätin julkaista sen myös täällä sivuillani, ettei essee jää vain kurssinjärjestäjän pöytälaatikkoon pölyttymään. PÄIVITYS: Nyt sivuillani on julkaistu myös kandidaatintutkielmani Javasta C#:iin. Johdanto Sain Vesa Lappalaiselta aiheeksi kandidaatintutkielmalleni Javan ja C#:in erojen selvittämisen. Koska tutkielman tarkoituksena oli kattaa suurin osa tavallisessa käytössä vastaan tulevista eroista, [...]]]></description>
			<content:encoded><![CDATA[<p><em>Tämä essee on kirjoitettu alunperin Jyväskylän yliopiston Ohjelmointikielten periaatteet -kurssille. Päätin julkaista sen myös täällä sivuillani, ettei essee jää vain kurssinjärjestäjän pöytälaatikkoon pölyttymään.</em></p>

<p><em><strong>PÄIVITYS:</strong> Nyt sivuillani on julkaistu myös kandidaatintutkielmani <a href="http://www.villesalonen.fi/2011/javasta-ciin/"><strong>Javasta C#:iin</strong></a>.</em></p>

<h2>Johdanto</h2>

<p>Sain Vesa Lappalaiselta aiheeksi kandidaatintutkielmalleni Javan ja C#:in erojen selvittämisen. Koska tutkielman tarkoituksena oli kattaa suurin osa tavallisessa käytössä vastaan tulevista eroista, ei mihinkään yhteen tai muutamaan aiheeseen voinut tutustua erityisen tarkasti. Niinpä Ohjelmointikielten periaatteet -kurssin esseen aihetta miettiessä ajatukseni palasivat Javan ja C#:in pariin.</p>

<p>Esseessäni aion perehtyä neljään minua kiinnostavaan aiheeseen:</p>

<ul>
<li>Anonyymit funktiot ja delegaatit. Javassa lähes kaikki ovat olioita. Tästä johtuen yksittäisten funktioiden antaminen esimerkiksi järjestelijäoliollle ei onnistu suoraan, vaan funktio on paketoitava olion metodiksi. Miksi näin on? Onko tästä etua suoritusteholle, virtuaalikoneen toteutukselle vai onko kyse vain huonosta suunnittelusta?</li>
<li>C#:in yhtenäinen tyyppijärjestelmä. Kaikki ovat C#:issa olioita: myöskin kokonais- ja liukuluvut. Javassa kokonaisluvuille on olemassa primitiivityyppi int ja oliotyyppi Integer. Tämä aiheuttaa ongelmaa esimerkiksi listoja käsitellessä, koska listat ottavat alkioikseen vain olioita, joten int-tyyppiset kokonaisluvut on paketoitava jälleen olion sisään. Miksi näin on? Häviääkö C#:in toteutusratkaisu Javalle nopeudessa?</li>
<li>Operaattoreiden ylikuormitus. Javaan ei haluttu toteuttaa operaattoreiden ylikuormitusta C++:n kanssa ilmenneiden ongelmien takia. Oliko tämä pelko perusteltua? Ilmenevätkö C++:n ongelmat myös C#:ssa?</li>
<li>Javassa poikkeuksia on kahdenlaisia: tarkistettavia ja ajonaikaisia. C#:ssa kaikki poikkeukset ovat ajonaikaisia. Mitä tämä tarkoittaa? Onko kahdenlaisista poikkeuksista hyötyä?</li>
</ul>

<p>Tavoitteenani on, että tämä essee toimisi erinomaisena jatkoluettavana kandidaatintutkielmalleni niille, jotka haluavat perehtyä vielä tarkemmin kielten välisiin eroihin. Kandidaatintutkielma on pituudeltaan rajoitettu sellaiseksi, ettei kaikkia yksityiskohtia ole mielekästäkään käsitellä. Lisäksi käytän työelämässäni C#:ia, joten lisätutustuminen kyseiseen kieleen auttaa sekä akateemisia että työelämän tavoitteitani.</p>

<h2>Delegaatit ja anonyymit funktiot</h2>

<p>Anonyymit funktiot ovat funktioita, joille ei ole määritetty tunnistetta. Anonyymit funktiot eivät ole uusi keksintö, vaan Alonzo Church esitteli ne jo 1936 kehittäessään lambda-laskennan, jossa kaikki laskenta tehdään anonyymeillä funktioilla. Ohjelmointikielissä anonyymejä funktioita käytetään etenkin funktionaalisissa ohjelmointikielissä, mutta ne löytyvät myös esimerkiksi C#:ista ja JavaScriptistä. Java ei niitä tosin tue.</p>

<p>Ennen kuin perehdyn tarkemmin syihin, miksi C# tukee anonyymejä funktioita ja Java ei, on hyvä pysähtyä miettimään hetkeksi, miksi kukaan haluaisi käyttää anonyymejä funktioita moderneissa olio-ohjelmointikielissä. Esimerkiksi kokoelmien alkioiden suodattaminen ja järjestäminen on usein kätevää tehdä anonyymillä funktiolla. Javassa nykyisen käytännön mukaisesti järjestäminen muuhun kuin olioiden luonnolliseen järjestykseen hoidetaan tekemällä funktio-olio eli niin sanottu funktori, joka toteuttaa Comparator<T>-rajapinnan vaatiman järjestysmetodin. Funktori annetaan edelleen staattiselle Collections.sort-metodille, joka lopulta hoitaa järjestämisen. Mielestäni tämä kuitenkin katkaisee ikävästi luontevan ohjelmointivauhdin ja pakottaa ohjelmoijan hyppäämään päässään toiselle abstraktiotasolle. Lisäksi mielestäni funktiot, jotka tekevät usean eri abstraktiotason tehtäviä, pyrkivät piilottamaan funktion varsinaisen tarkoituksen. Kyse ei ole siis vain tarpeettomasta kosmeettisesta kikkailusta, vaan anonyymeille funktioille pystyy mielestäni tekemään selkeästi luettavampaa ohjelmakoodia.</p>

<p>Javassa metodiin viittaminen ei onnistu, koska kaikki muuttujat ovat joko arvomuuttujia, jotka siis sisältävät suoraan esimerkiksi kokonaisluvun, tai viitemuuttujia, jotka voivat sisältää ainoastaan viitteitä olioihin, jotka ovat luokka-, rajapinta- tai taulukkotyyppisiä [1]. Suora viittaaminen metodiin ei siis ole mahdollinen. Alunperin Java 7 -versioon oli tarkoitus tuoda tuki anonyymeille funktioille, mutta tämän toteuttaminen lykättiin versioon 8 tai myöhempään [2].</p>

<p>C#:ssa viitemuuttujat voivat sisältää viitteitä olioihin, jotka ovat luokka-, rajapinta- tai delegaattityyppisiä. (Erillistä taulukkotyyppistä oliota ei C#:ssa ole, koska kaikki taulukot perivät yhteisestä abstraktista kantaluokasta System.Array [3].)</p>

<p>Delegaatti on viitetyyppi, joka voi viitata yhteen tai useampaan nimettyyn tai anonyymiin funktioon. Ne muistuttavat osittain C:n ja C++:n funktio-osoittimia, mutta niistä poiketen ne ovat tyyppiturvallisia. [4]</p>

<p>Jos ohjelmoija on käyttänyt pelkästään esimerkiksi Javaa, ei hän ole välttämättä osannut edes kaivata mitään tapaa viitata suoraan funktioihin tai esitellä niitä ilman anonyymin luokan vaatimaa byrokratiaa. Omasta mielestäni funktiot ovat kuitenkin erittäin tärkeitä yksiköitä ohjelman rakentamisessa ja niiden oliopaketoinnin vaatiminen Javassa johtaa ylimääräiseen byrokratiaan. Käsittelen Javan byrokratiaa ja sen vaikutuksia lisää yhteenvedossani.</p>

<h2>Yhtenäinen tyyppijärjestelmä</h2>

<p>Javassa muuttujatyypit voidaan luokitella kahteen ryhmään: arvo- ja viitemuuttujiin. Arvomuuttujiin kuuluvat boolean, char, byte, short, int, long, float ja double. Viitemuuttujat viittaavat olioihin, joiden nimet yleisen käytännön mukaan alkavat isolla alkukirjaimella: esimerkiksi String. Koska esimerkiksi kokoelmaoliot ovat kokoelmia toisista olioviitteistä, ei niihin voi sijoittaa arvomuuttujia suoraan. Siispä esimerkiksi kokonaisluvuillekin on oliovastine, Integer.</p>

<p>C#:ssa vastaavaa jakoa ei ole. Kaikki tyypit, myös arvotyypit, perivät object-kantaluokasta [5].</p>

<p>Miksi nämä kaksi samankaltaista kieltä eroavat? Äkkiseltään Javan toteutus kuulostaa tehokkaammalta. Olioiden luominen ei nimittäin ole kevyt operaatio, koska luodessa on laskettava olion tarvitsema tila, varattava muistista alue oliolle, sidottava olioon sen luokan ja mahdollisten kantaluokkien määrittelemät metodit, kutsuttava luokan ja mahdollisten kantaluokkien konstruktorimetodeja sekä luotava olioon osoittava viite. Arvomuuttujien kanssa riittää varata muistista vaadittu alue, jonka laskeminen on olion vaatiman tilan laskemiseen verrattuna triviaali, koska arvomuuttuja on vain yksi arvo, kun taas olion attribuuttien määrä joudutaan laskemaan. Lisäksi arvomuuttujan muistinkäyttö on huomattavasti pienempi. Jos ohjelmaa ajetaan 32-bittisessä käyttöjärjestelmässä, ovat myöskin olioviitteet 32-bittisiä, koska niillä pitää pystyä osoittamaan mihin päin muistiavaruutta tahansa. Siispä jos ohjelmassa käsitellään esimerkiksi 8-bittistä kokonaislukua 32-bittisessä käyttöjärjestelmässä, sen tallentaminen oliona vaatii 32 bittiä olioviitteelle, 8 bittiä varsinaiselle luvulle sekä kielestä ja olion luokasta riippuen jonkun verran lisämuistia olion muita tietoja varten. Arvomuuttujana 8-bittinen kokonaisluku sen sijaan vie vain 8 bittiä eli muistinkäytöltään kukin 8-bittinen arvomuuttuja on vähintäänkin 32 bittiä vaatimattomampi kuin vastaava kokonaislukuolio.</p>

<p>C#:n ratkaisu ongelmaan on matalammalla tasolla Javaa vastaavaa. Myös C# käsittelee kokonaislukuja sekä primitiiveinä että olioina. Erona Javaan on se, että C#:ssa muunnos näiden välillä tapahtuu käyttäjän huomaamatta tarpeen vaatiessa. Kun ohjelmassa esimerkiksi kokonaisluku annetaan argumentiksi metodille, joka hyväksyy object-tyyppisiä arvoja, kokonaisluku paketoidaan olioksi (engl. boxing).</p>

<p>Boxing- ja unboxing-toiminnot siis muuttavat arvomuuttujan oliomuuttujaksi ja takaisin. Sama löytyy myös Javasta. Erona kielten välillä on se, että Java tekee sekä boxingin että unboxingin tarpeen vaatiessa [6], kun taas C# paketoi arvomuuttujan oliomuuttujaksi implisiittisesti, mutta purkaminen takaisin arvomuuttujaksi tehdään eksplisiittisesti [7].</p>

<p>On tärkeää huomata, että jos boxing- tai unboxing-toimintoja käytetään vaativassa laskennassa, suoritusteho laskee valtavasti. Microsoftin mukaan erityisesti C#:lla ja yleisemmin kaikkien Common Language Runtimen päälle ajettavilla kielillä boxing-toiminto kestää 20 kertaa pidempään kuin viitemuuttujan asettaminen sekä unboxing-toiminto ja sen vaatima casting-operaatio kestävät 4 kertaa pidempään kuin arvon asettaminen arvomuuttujalle [8].</p>

<p>Suoritustehoa on yritetty paikata Javassa luomalla etukäteen joukko arvomuuttujien oliomuuttujia, jolloin boxing-operaatiot nopeutuvat huomattavasti, koska olioita ei tarvitse enää luoda tarpeen vaatiessa. Esimerkiksi boolean-arvot true ja false sekä kokonaisluvut väliltä [-128, 127] löytyvät valmiina [9]. Tästä johtuu muun muuassa minua kummastuttanut yksityiskohta, että kahden yllä mainitulta väliltä valitun kokonaislukuolion vertaaminen myös ==-operaattorilla pitää paikkaansa. Toki ==-operaattorilla ei Javassa suositella vertaamaankaan muita kuin primitiiviarvoja, mutta tämä saattaa aiheuttaa sekaannusta etenkin uusissa Java-ohjelmoijissa, jotka huomaavat tämän pitävän paikkaansa pienillä arvoilla, mutta jotka eivät huomaa testata samaa isommilla arvoilla.</p>

<p>Erityisen ongelmalliseksi Javan tyypit osoittautuvat tilanteessa, jossa tarvitaan ennalta tuntematon määrä kokonaislukuja tai muita arvomuuttujia. Tällöin suoritusteholtaan tehokkain ratkaisu on tallentaa arvot taulukkoon, jolle varataan jonkinlainen määrä muistia. Ongelmia ilmenee kuitenkin tilanteissa, joissa taulukon kokoa kasvatetaan, jolloin aiemman taulukon arvot joudutaan kopioimaan uuteen taulukkoon, joka on sopivan verran suurempi. Mikä sitten on sopiva määrä? Mahdotonta sanoa, koska tämä riippuu aina tilanteesta. Mielestäni tämä on jälleen yksi tilanne, missä Java-ohjelmoija joutuu miettimään ongelman ratkaisemista tasolla, jolle hänen ei tarvitsisi joutua.</p>

<p>Myös C#:issa on alunperin ollut ongelmia suoritustehon kanssa, jos arvomuuttujia on täytynyt tallentaa kokoelmiin (System.Collection-luokasta periviin olioihin). Tilanne kuitenkin muuttui C# 2.0:n julkaisussa, kun C#:iin lisättiin tuki geneerisyydelle. Jos arvomuuttujia tallennetaan System.List<T>-luokasta periviin listoihin, ei boxing- ja unboxing-toiminnoille ole tarvetta arvomuuttujia listaan lisätessä tai niitä sieltä pois otettaessa [8]. Lisäksi geneerisyys on muutenkin suositeltavaa, jolloin ei joudu tukeutumaan cast-operaatioihin ja niistä mahdollisesti aiheutuviin poikkeuksiin, jos object-tyyppisestä kokoelmasta löytynyt olio ei ollutkaan alunperin peritty oikeasti luokasta.</p>

<p>Mielestäni C#:in yhtenäinen tyyppijärjestelmä on selkeä parannus Javan arvo- ja oliomuuttujiin jakamiseen verrattuna. Korkeamman tason ohjelmointikielten tavoitteena on nimenomaan vapauttaa ohjelmoija miettimästä yksityiskohtia, jotka tapahtuvat tarpeellista matalammalla abstraktiotasolla, jotta ohjelmoija voi keskittyä häntä oikeasti kiinnostavaan ongelmaan. Tietenkin abstraktiotasoissa voidaan mennä joissain tapauksissa liian pitkälle. Esimerkiksi jos kielessä ei olisi mitään mahdollisuutta tallentaa arvomuuttujia primitiiveinä, vaan kaikki tallennettaisiin olioina kuten esimerkiksi Python tekee, kärsii kyseisellä kielellä tehtyjen ohjelmien suoritusteho. Tällöin usein ohjelmoijan ainoaksi ratkaisuksi jää toteuttaa vaativa ohjelmaosuus jollain matalamman tason kielellä, jolla saadaan vaadittu suoritustehotaso. En väitä, että esimerkiksi Python olisi huono kieli, koska se näin tekee: Python on vain abstraktiotasoltaan vielä astetta Javaa ja C#:ia korkeammalla. Java ja C# sen sijaan toimivat samalla abstraktiotasolla, mutta Java pakottaa ohjelmoijan miettimään tyyppijärjestelmää mielestäni tarpeettoman matalalla tasolla muunnoskohdissa, joissa taas C# hoitaa muunnokset ilman ohjelmoijan panosta ja suoritustehoa laskematta.</p>

<h2>Operaattoreiden ylikuormitus</h2>

<p>Jo Javan kehityksen alkuvaiheissa päätettiin, ettei kieleen tule tukea operaattoreiden ylikuormitukselle, eikä kantaa olla muutettu kielen myöhemmissäkään versioissa. Kielen alkuperäinen kehittäjä James Gosling tosin myöntää jälkikäteen epäilevänsä ratkaisun pätevyyttä ja kertoo poisjättämisen syyksi hänen kohdallaan olleen huonot kokemukset C++-kielestä, jolla ohjelmoijat &#8220;väärinkäyttivät&#8221; operaattoreiden ylikuormitusta [10]. Myöskin comp.lang.java-uutisryhmän Usein kysytyt kysymykset -sivu listaa yhdeksi syyksi C++:n osoittaneen esimerkillään, että operaattoreiden ylikuormitus tekee ohjelmakoodista lähes ylläpitokelvotonta. Samainen vastaus mainitsee, että myöskään metodien ylikuormittaminen aiottiin jättää pois kielestä, mutta esimerkiksi tulostusmetodien kohdalla ylikuormittaminen auttoi niin paljon, ettei ominaisuutta lopulta jätetty pois. [11]</p>

<p>Väite on mielestäni erikoinen, koska esimerkiksi C#-yhteisöstä ei ole tullut vastustusta operaattoreiden ylikuormittamiselle eivätkä C#-kielellä tehdyt ohjelmat ole osoittautuneet ylläpitokelvottomiksi.</p>

<p>Javan kehittäjät väittivät, että kaiken, mitä operaattoreiden ylikuormituksella pystyy tekemään, pystyy aivan yhtä hyvin tekemään metodeilla ja attribuuteilla. Lisäksi operaattoreiden ylikuormittamisen poistaminen tekee koodista huomattavasti yksinkertaisempaa. [12] On totta, että teknisesti kaiken saman pystyy tekemään ilmankin ylikuormitusta. On myöskin totta, että esimerkiksi matriisiluokkia käsiteltäessä on huomattavasti yksinkertaisempaa kirjoittaa</p>

<p><code>result = (matrix1 + matrix2 - matrix3) * matrix4;</code></p>

<p>kuin</p>

<p><code>result = ((matrix1.sum(matrix2)).subtract(matrix3).multiply(matrix4);</code></p>

<p>Eräs usein kuulemani perustelu pelkillä metodeilla kirjoitetun koodin paremmuudelle on, että silloin metodin nimestä näkee suoraan, mitä metodi aikoo tehdä. Tämä ei kuitenkaan ole valitettavasti näin yksinkertaista. Hyvin usein metodeilla saattaa olla yllättäviä sivuvaikutuksia kuten esimerkiksi jostain lähteestä JDK:n BufferedReader-olion readLine-metodilla seuraava lukukohta siirtyykin luetun rivin verran eteenpäin [13]. Tämä ei todellakaan ilmene metodin nimestä, vaan ohjelmoijan on tiedettävä tämä muista lähteistä. Itse asiassa tämä ei ilmene myöskään metodin dokumentoinnista.</p>

<p>Kenties dokumentointi olisi hyvä kieltää kielen seuraavasta versiosta, koska se voi johtaa epäselviin tilanteisiin?</p>

<p>Javassa on valitettavan epäselvä tapa vertailla muuttujien samanarvoisuutta. Uuden ohjelmoijan aloittaessa Javan opettelun, näytetään hänelle usein esimerkkejä kokonaisluvuilla laskemisesta ja niiden vertailusta ==-operaattorilla. Olioiden kanssa kyseistä vertailua kuitenkin varoitetaan käyttämästä. Tämä johtuu siitä, että Javassa olioiden kanssa ==-operaattori vertaakin olioviitteiden samanarvoisuutta. Siispä esimerkiksi ohjelmakoodissa</p>

<p><code>
String a = "merkkijono";<br />
String b = "merkkijono";<br />
bool vertailu = a == b;
</code></p>

<p>vertailu saa arvokseen <code>false</code>. Tai ehkä <code>true</code>. Jos kääntäjä on huomannut, että kahta String-oliota yritetään luoda samalla merkkijonolla, se saattaakin luoda vain yhden String-olion, johon tässä tapauksessa sekä a- että b-muuttujat osoittavat. Jos halutaan vertailla olioiden yhtäsuuruutta, on käytettävä equals-metodia. Tämä yhtäsuuruusvertailujen tekeminen kahdella eri tavalla on mielestäni tarpeettoman monimutkaista ja on omien kokemuksieni perusteella johtanut lukuisiin virhetilanteisiin aloittelevien ja kokeneempienkin Java-koodaajien kohdalla. Aivot mieltävät olioidenkin vertailun ==-operaattorilla helposti oikeaksi toimenpiteeksi, koska pitäähän se paikkaansa myöskin primiitivien vertailun kohdalla.</p>

<p>Mielestäni Javan linja operaattoreiden ylikuormituksen kieltämiseen on paitsi perustelematonta myös tekopyhää. Mitenkäs Javassa yhdistetäänkään kaksi merkkijonoa yhteen? Aivan: <code>"+" + "-" + "operaattorilla"</code>. Tässä tilanteessa +-operaattorin ylikuormittaminen onkin ollut hyvä idea, mutta ilmeisesti mitään muuta mahdollista tilannetta ei heidän mielestään ole.</p>

<p>Ymmärrän hyvin Javan kehittäjien alkuperäisen tavoitteen luoda kieli niin, että sillä olisi vaikeampi kirjoittaa epäselvää ohjelmakoodia. On totta, että on epäselvää, mitä esimerkiksi matriisiluokan ylikuormitettu bitshift-operaattori &lt;&lt; tarkoittaisi? Kuitenkaan viisas ohjelmoija ei tällaista koskaan kirjoittaisi, jos se ei olisi mielekästä. On valitettava tosiasia, ettei ohjelmointikieli pysty suojelemaan ohjelmoijaa hänen omalta tyhmyydeltään Välillä ohjelmoijat tekevät virheitä ja epäselvällä operaattoreiden ylikuormittamisella saavat aikaan epäselvää ohjelmakoodia. Tämä kuitenkin pitää paikkaansa kaikilla kielillä &#8211; myös Javalla. Tehokkaan työkalun poistaminen kokonaan kielestä sen takia, että epäselvää koodia tuottavat ohjelmoijat voisivat tehdä sillä epäselvää koodia, on huono syy, koska samaisella työkalulla on lukuisissa tilanteissa osoitettu pystyvän tuottamaan luettavampaa ohjelmakoodia.</p>

<h2>Poikkeukset</h2>

<p>Ennen kuin tarkastelen enemmän poikkeuksia, puutun heti Javan poikkeusten nimeämiseen. Javan virallinen dokumentaatio jakaa poikkeukset tarkistettaviin (engl. checked) ja ajonaikaisiin (engl. runtime). Tämä on kuitenkin hämäävä tapa nimetä, koska eiväthän tarkistettavatkaan poikkeukset aiheudu muulloin kuin ajon aikana. Nimi juontaakin juurensa siihen, että käännön aikana voidaan huomata, mistä kohti tarkistettavia poikkeuksia voi aiheutua, kun taas ajonaikaisia poikkeuksia ei voida huomata etukäteen.</p>

<p>Olennaisin ero ohjelmoijalle tarkistettavien ja ajonaikaisten poikkeusten välillä on se, että kaikki metodin mahdolliset heittämät tarkistettavat poikkeukset on ilmoitettava metodin esittelyssä. Tarkistettavien poikkeuksien listauksessa on sekä hyviä että huonoja puolia. Hyvänä puolena on mielestäni se, että metodia käyttävät ohjelmoija tietää suoraan, mitä (tarkistettavia) poikkeuksia metodi voi heittää ja osaa varautua näihin joko käsittelemällä ne itse tai päästää ne oman kutsujametodinsa käsiteltäväksi. Huonona puolena on se, että kaikkien mahdollisten poikkeusten listaaminen on usein työlästä ja monitasoisessa ohjelmistoarkkitehtuurissa ylempien tasojen metodien poikkeuslistat venyvät helposti valtavan pitkiksi. Tästä johtuen tarkistettavia poikkeuksia käsiteltäessä onkin usein tapana paketoida ne omiin poikkeusolioihin, jolloin esimerkiksi asiakkaita käsittelevä CustomerRegister-olio voi heittää ainoastaan CustomerRegisterException-tyyppisiä poikkeuksia. Tämä johtaa kuitenkin siihen, että tasoja ylöspäin noustaessa oikeat poikkeukset saattavat löytyä todella monen erillisen poikkeusolion sisältä. Tällöin oikean ongelman löytäminen ja alempien tasojen vain tietynlaisiin poikkeuksiin reagointiin on hyvin työlästä.</p>

<p>Valitettavasti myöskin tarkistettavien poikkeusten hyvät puolet ovat täysin turhia, koska metodit voivat aina heittää ajonaikaisia poikkeuksia, joita ei ole pakko luetella metodin esittelyssä. Täten metodia käyttävä ohjelmoija osaa varautua vain osaan poikkeuksista, eikä hän voi koskaan täysin varmistua siitä, että kaikki mahdolliset poikkeukset olisivat hänen tiedossaan. Tämä johtaa omien kokemusteni perusteella kahdenlaisiin ongelmiin.</p>

<p>Ensimmäisenä ongelmana on se, että ohjelmoijalla jää valheellinen turvallisuuden tunne, kun reagoituaan tarkistettaviin poikkeuksiin hän kuvittelee poikkeustilanteiden olevan hallinnassa. Näin helposti unohdetaan kattavalla yksikkötestauksella tai muilla testaustyökaluilla varmistaa metodin toimiminen erilaisissa ongelmatilanteissa.</p>

<p>Toisena ongelmana on se, että ohjelmoija helposti varmistaa kaikkien poikkeusten käsittelyn ottamalla suoraan kiinni kaikki Exception-kantaluokasta perivät poikkeukset. Näin oikeat ongelmat kuitenkin jäävätkin alempien tasojen metodien syövereihin ja ylemmiltä tasoilta ongelmat ilmenevät vain ohjelmiston käsittämättömällä toiminnalla, jonka tunnistaminen ei tyypillisillä virheenkäsittelytavoilla onnistu mitenkään.</p>

<p>Omien kokemusten perusteella tarkistettavista poikkeuksista aiheutuvia haittoja paikataan usein paketoimalla kaikki mahdolliset poikkeukset ajonaikaisten poikkeusten kantaluokasta periviin poikkeusolioihin, jolloin niitä ei tarvitse enää esitellä kunkin metodin kohdalla.</p>

<p>Tiivistettynä siis Javan poikkeusjaottelut johtavat siihen, että kaikki tarkistettavat poikkeukset on ilmoitettava, jotta metodia käyttävä ohjelmoija osaisi niihin reagoida, mutta metodista saattaa lentää ajonaikaisia poikkeuksia, joista hän on onnellisen tietämätön. Eli siis byrokratiaa, joka ei lopulta ratkaise ongelmaa, vaan kannustaa ohjelmoijia huonoihin käytänteisiin.</p>

<p>C#:in kanssa poikkeuksia on ainoastaan yhdenlaisia eikä niitä tarvitse metodien esittelyssä listata. Aivan ongelmatonta ei ole toki tämäkään. Nyt ohjelmoijan tehtäväksi jää selvittää kaikki mahdolliset poikkeukset joko lukemalla metodin dokumentaatiota tai sen ollessa puutteellista, kirjoitettava kattavat automatisoitavat yksikkötestit tai muut vastaavat työkalut, joilla hän voi varmistua metodien odotetunlaisesta toiminnasta. Tämä kuitenkin on jo itsessään erittäin arvokasta ohjelmiston jatkokehityksen kannalta, joten poikkeusten esittelemättömyys ei sinänsä johdakaan huonompaan koodiin, vaan parempaan.</p>

<h2>Yhteenveto</h2>

<p>Jo kandidaatintutkielmaa kirjoittaessani huomasin, että Javan ja C#:in eroja vertaillessa en löytänyt mielestäni yhtäkään kohtaa, jossa Javan ratkaisu olisi osoittautunut paremmaksi. Näin kävi myös esseeseen valitsemieni erojen syitä selvitellessä.</p>

<p>Kenties on epäreilua vertaillakaan Javaa ja C#:ia näin suoraan, koska C# on tehty monta vuotta Javan jälkeen ja yksi sen suunnitteluun eniten vaikuttanut kieli onkin juuri Java. Täten C#:in kehittäjät ovat voineet katsoa, missä Java meni vikaan ja korjata ongelman. Javassa useat muutokset olisi vaikeaa tai jopa mahdotonta toteuttaa, koska kieli on ollut jo pidempään käytössä ja kaikki muutosehdotukset joutuvat tarkan kritiikin ja usein kovan muutosvastarinnan kohteeksi.</p>

<p>Mielestäni on ollut mielenkiintoista tutkia näiden kahden kielen eroja, koska sinänsä ne ovat niin lähellä toisiaan, mutta monissa yksityiskohdissa eroavat niin paljon toisistaan. Vertailujen aikana olen uudella tavalla oppinut arvostamaan kielensuunnittelun yksityiskohtien huomiota ja niiden vaikutusta kielellä toteuttaviin ohjelmistoihin pitkälläkin aikavälillä.</p>

<p>Olen työskennellyt molempien ohjelmointikielien kanssa. Javasta minulla on reilun kahden vuoden ja C#:ista noin kahdeksan kuukauden ammatillinen kokemus. Työskennellessäni Javan kanssa huomasin lähes päivittäin, miten kieli osoittautui työtä hidastavaksi tekijäksi. Pahimmillaan kielen puutteet tekivät joistain ratkaisuista todella vaikeita toteuttaa, mutta parhaimmillaankin ongelmat tekivät ohjelmakoodin kirjoittamisesta vähemmän mielekästä. Lisäksi huomasin oman luovuteni ja inspiraationi kärsivän joutuessani käyttämään työkalua, joka niin monesta kohdasta tuntui kankealta ja mielikuvituksettomalta. C#:in kanssa en ole huomannut vielä kertaakaan miettiväni, miten helppoa ohjelman toteuttaminen olisi toisella kielellä. Tämä on parantanut huomattavasti työmotivaatiotani. Onkin hyvä muistaa, että ohjelmakielten puutteet eivät aiheuta vain teknisiä, vaan myös henkisiä ongelmia.</p>

<h2>Lähteet</h2>

<p>[1] <a href="http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html">Sun Microsystems Inc., Java Language Specification, 3rd Edition</a>, haettu 22.11.2010.</p>

<p>[2] <a href="http://openjdk.java.net/projects/jdk7/features/">Oracle Corporation, JDK 7 Features</a>, haettu 22.11.2010.</p>

<p>[3] <a href="http://msdn.microsoft.com/en-us/library/aa288453(VS.71).aspx">Microsoft Corporation, Arrays Tutorial</a>, haettu 22.11.2010.</p>

<p>[4] <a href="http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx">Microsoft Corporation, Using Delegates (C# Programming Guide)</a>, haettu 22.11.2010.</p>

<p>[5] <a href="http://msdn.microsoft.com/en-us/library/aa664638(VS.71).aspx">Microsoft Corporation, Type System Unification</a>, haettu 23.11.2010.</p>

<p>[6] <a href="http://download.oracle.com/javase/1.5.0/docs/guide/language/autoboxing.html">Oracle Corporation, Autoboxing</a>, haettu 23.11.2010.</p>

<p>[7] <a href="http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx">Microsoft Corporation, Boxing and Unboxing</a>, haettu 23.11.2010.</p>

<p>[8] <a href="http://msdn.microsoft.com/en-us/library/ms173196.aspx">Microsoft Corporation, Performance</a>, haettu 23.11.2010.</p>

<p>[9] <a href="http://java.sun.com/docs/books/jls/third_edition/html/conversions.html#5.1.7">Sun Microsystems, Conversions and Promotions</a>, haettu 23.11.2010.</p>

<p>[10] <a href="http://www.gotw.ca/publications/c_family_interview.htm">The C Family of Languages: Interview with Dennis Ritchie, Bjarne Stroustrup, and James Gosling</a>, haettu 23.11.2010.</p>

<p>[11] <a href="http://www.cafeaulait.org/javafaq.html#xtocid1902938">The comp.lang.java FAQ List</a>, haettu 23.11.2010.</p>

<p>[12] <a href="http://java.sun.com/docs/white/langenv/Simple.doc2.html">The Java Language Environment</a>, haettu 23.11.2010.</p>

<p>[13] <a href="http://download.oracle.com/javase/1.5.0/docs/api/java/io/BufferedReader.html#readLine()">BufferedReader (Java 2 Platform SE 5.0)</a>, haettu 23.11.2010.</p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2010/javasta-c-sharpiin-erot-pintaa-syvemmalta/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Kuvausharrastus (In Finnish)</title>
		<link>http://villesalonen.fi/2010/kuvausharrastus/</link>
		<comments>http://villesalonen.fi/2010/kuvausharrastus/#comments</comments>
		<pubDate>Sun, 14 Nov 2010 12:32:11 +0000</pubDate>
		<dc:creator>Ville Salonen</dc:creator>
				<category><![CDATA[Writings]]></category>
		<category><![CDATA[Photography]]></category>
		<category><![CDATA[Videography]]></category>

		<guid isPermaLink="false">http://www.villesalonen.fi/?p=168</guid>
		<description><![CDATA[Kipinä kuvausharrastukseeni lienee tullut isältäni. Muistan pienenä tutkineeni isän Canon T70 -kameraa. Tietenkin tekninen laite kiinnosti, mutta filmikameran kanssa kuvat tuntuivat ottamisen jälkeen häviävän johonkin, kunnes kuukausia tai joskus vuosiakin myöhemmin ne viimein kehitettiin. Näin laiskalla kuvaustahdilla en päässyt vielä innostumaan valokuvauksesta. Astetta mielenkiintoisempi laite oli hieman myöhemmin kuvioihin tullut videokamera. Sen kanssa ei ollut [...]]]></description>
			<content:encoded><![CDATA[<p>Kipinä kuvausharrastukseeni lienee tullut isältäni. Muistan pienenä tutkineeni isän <a href="http://en.wikipedia.org/wiki/Canon_T70">Canon T70</a> -kameraa. Tietenkin tekninen laite kiinnosti, mutta filmikameran kanssa kuvat tuntuivat ottamisen jälkeen häviävän johonkin, kunnes kuukausia tai joskus vuosiakin myöhemmin ne viimein kehitettiin. Näin laiskalla kuvaustahdilla en päässyt vielä innostumaan valokuvauksesta.</p>

<p>Astetta mielenkiintoisempi laite oli hieman myöhemmin kuvioihin tullut videokamera. Sen kanssa ei ollut kehitysongelmia, vaan lopputuloksen pystyi katsomaan välittömästi TV-ruudulta. Tällä tulikin kuvattua kavereiden kanssa paljon erilaisia lyhytelokuvia. Dialogi ja näyttelytyö aiheuttaisivat varmastikin nyt katsottuna päänsärkyä, mutta jo pienenä osasi kiinnittää huomiota kohtausjärjestyksiin ja erikoistehosteisiin. Tyynyillä täytetyt vanhat vaatteet toimivat hyvin stunttinukkena, jonka pystyi heittämään parvekkeelta. Valitettavasti videoiden leikkauksesta ei ollut mitään käsitystä, vaikka kaverilla olikin käytettävissä kahdet videot, joten tekniikka olisi periaatteessa ollut käytettävissä. Tästä johtuen elokuvat oli kuvattava kronologisessa järjestyksessä ja liikuttava edestakaisin kuvauspaikkojen välillä. Videokuvausharrastus lakkasi lopulta yllättäen, kun erään elokuvan kuvauksissa kamera yllättäen lopetti toimintansa. Idea videokuvauksesta tulevaisuudessa jäi kuitenkin kytemään.</p>

<p>Kaikenlaiset kuvausharrastukset jäivät pitkälle tauolle. Perheestä ei löytynyt mielenkiintoa herättäviä kameroita ja ala-asteikäisenä ei ollut varaa sellaista itsekään hankkia. Yläasteella rahaa kuitenkin rupesi siunautumaan etenkin rippikoulun jäljiltä ja päätin sijoittaa rahani <a href="http://en.wikipedia.org/wiki/Canon_Digital_IXUS">Canon Ixus V</a> -kameraan.</p>

<p>Olin aiemmin kokeillut muutamaa levykettä muistinaan käyttävää kameraa, mutta levykkeiden virhesietoisuudella lähes joka viides kuva tuntui korruptoituvan ja levykeasema kasvatti kameran koonkin valitettavan isoksi. Lisäksi levykkeelle ei kovin montaa kuvaa mahtunut, vaikka megapikseleitä ei vielä laskettukaan monikossa. Ixus V:ssä ei ollut levykeasemaa aiheuttamassa murheita, vaan kuvat tallentuivat CompactFlash-korteille. Kun mukana tulleen 8 megan kortin vielä korvasi (aikanaan) valtavalla 64 megan kortilla, mahtui kuvia kerralla jo lähemmäs sata. Kun oli tottunut 24 kuvan filmirulliin, joiden kehittäminen kesti ikuisuuksia, tällainen kamera tuntui valtavalta harppaukselta kehityksessä. Pienen kokonsa ansiosta kamera kiersikin mukana monta vuotta ja sillä otettiin varmastikin yli 10 000 kuvaa. Kuvasimmepa ystävien kanssa myös Lego-animaation, jotka 2000-luvun alkupuolella olivat kuumaa hottia:</p>

<p><center><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/ML6_csBwSbc&amp;hl=en_US&amp;fs=1&amp;ap=%2526fmt%223D&amp;ap=%2526fmt%3D22"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/ML6_csBwSbc&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></center></p>

<p>Ylläoleva video on muuten kerännyt YouTubessa yhteensä vajaa 90 000 katsomiskertaa*. Tällainen katsojamäärä yläasteikäisten yhden illan projektille on jotain sellaista, mitä ei ennen Internetin aikakautta olisi voinut kuvitellakaan. Tästä lisää joskus myöhemmin.</p>

<p><small>*) Katsomiskerrat ovat jakautuneet <a href="http://www.youtube.com/watch?v=ML6_csBwSbc">kahdelle</a> <a href="http://www.youtube.com/watch?v=e009daQ2_K8">eri</a> videolle.</small></p>

<p>Sanotaan, että on harrastettava jotain aihetta 10 000 tuntia tullakseen siinä todella hyväksi. Valitettavasti sääntö tuntuu pitävän paikkaansa myös valokuvauksen saralla ja vain 10 000 kuvan ottaminen ei välttämättä tuo vielä osaamista. Pikku hiljaa kuviin kuvatessa rupesin kiinnittämään huomiota muuhunkin kuin että osasi vain osoittaa kameran suurinpiirtein kohti kohdetta. Erityisesti minua kiinnostivat jo tässä vaiheessa syväterävyydellä leikittelevät ja pimeässä otetut kuvat. Näiden ottaminen ei Ixus V:llä oikein onnistunut, vaikka muutama aikanaan mielestäni hienokin kuva tuli napattua.</p>

<p><center>
<a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_3663.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_3663-1024x768.jpg" alt="" title="Sateen jälkeen" width="450" height="337" class="aligncenter size-large wp-image-175" /></a>
</center></p>

<p>Jostain syystä vuonna 2007 valokuvaus rupesi kiinnostamaan uudestaan ja markkinoilta löytyikin mieleinen uusi kamera, Canon Ixus 850 IS. Kameran kuvanvakaaja ja yli sekunnin valotusajat auttoivat kummasti pimeäkuvauksen kanssa. Lisäksi samaan aikaan innostuin myös matkailusta ja kamera onkin kiertänyt ostamisensa jälkeen kymmeniä tuhansia kilometrejä matkassani. Edelleenkin kameraa tulee käytettyä tilanteissa, joihin järjestelmäkameran kantaminen olisi liian raskasta tai joissa järjestelmäkameran koko säikäyttäisi kuvauskohteen.</p>

<p><center>
<div id="attachment_206" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/J3072x1728-00737.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/J3072x1728-00737-1024x565.jpg" alt="Yöpilvet Jyväsjärven yllä" title="Yöpilvet Jyväsjärven yllä" width="450" height="248" class="size-large wp-image-206" /></a><p class="wp-caption-text">Yöpilvet Jyväsjärven yllä</p></div>
</center></p>

<p><center>
<div id="attachment_208" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_2687.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_2687-1024x576.jpg" alt="Belfastin kaupungintalo" title="Belfastin kaupungintalo" width="450" height="253" class="size-large wp-image-208" /></a><p class="wp-caption-text">Belfastin kaupungintalo</p></div>
</center></p>

<p>Kun rupesin saamaan hienompia kuvia aikaiseksi, alkoi kameran pokkarimaisuus rasittamaan. Käytännössä tämä ilmeni niin, että monet asetukset piti seikkailla kankeiden valikoiden takaa. Olipa laukaisinpainikkeen herkkyydessäkin pienoisia ongelmia ja pari hienoa tilannekuvaa menivät ohi suun minun ja painikkeen ollessa eri mieltä painalluksen tapahtumisesta.</p>

<p>Kenties tärkeimpänä oli kuitenkin pokkarin kennon koko. Pienellä kennolla ei saa yhtä intiimiä syväterävyyttä kuin järjestelmäkameralla, jos ei ota aivan lähikuvaa niin sanotulla kukka-asetuksella. Aiemmin digitaaliset järjestelmäkamerat olivat maksaneet aivan älyttömästi ja siten jääneet haaveiluidenkin tavoittamattomiin, mutta Canonin EOS D -sarja oli tuonut markkinoille monta kuluttajille suunnattua järjestelmäkameraa, joiden hintalappu oli alle 1000 euron luokassa. Kun samalla pääsin ensimmäistä kertaa oman alan työpaikkaan, oli päätös järjestelmäkameran ostamisesta helppo.</p>

<p>En ollut ennen oman järkkärin käsittelyä tehnyt kuin muutaman nopean kokeilun tuttujen kameroilla ja kuvittelin, että kuvan ottaminen järkkärillä olisi samanlaista kuin pokkarilla, mutta kuvista tulisi vain jotenkin automaattisesti parempia. Tämä ei kuitenkaan pitänyt paikkaansa. Pokkarilla kuvista tuli lähes poikkeuksetta teräviä, jos vain valoa oli kylliksi. Järkkäreillä isomman kennon myötä tuleva syväterävyys johtaa siihen, että juuri haluttu kuvauskohde on pidettävä tarkkana, koska usein koko kuva ei olekaan enää tarkkana. Tätä ominaisuuttahan olin järkkäriä ostaessa hakenutkin, mutta kuten niin monet muutkin asiat valokuvauksessa, myös tämän takia joutui uhraamaan jostain toisaalta. Automaattitarkennuksella tätä tehtävää voi toki hieman helpottaa, mutta se valitsee usein etualalla olevat kuvat tarkennettaviksi. Alla hieno esimerkki siitä, miten väärään kohteeseen osunut tarkennus muuttaa kuvan luonteen täysin:</p>

<p><center>
<a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_02591.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_02591-682x1024.jpg" alt="" title="IMG_0259" width="450" height="675" class="aligncenter size-large wp-image-219" /></a></center></p>

<p>Elämä järjestelmäkameran kanssa alkoi hieman kivikkoisesti ja hetkellisesti kuvausinto laantuikin uutuuden viehätyksestä huolimatta, kun kuvaaminen tuntui vaikealta. Askel askeleelta opin kuitenkin ajattelemaan kuvausta syvemmällä tasolla ja miettimään uudella tavalla aukkoja, valotusaikoja ja polttovälejä. Samalla myöskin kuvat paranivat. Tämä ei kuitenkaan ollut helppoa tai nopeaa, vaan vasta nyt kaksi vuotta järkkärin ostamisen jälkeen rupeaa tuntumaan siltä, että osaan jotakuinkin käyttää sitä. Valitettavasti pelkkä tekniikan osaaminen ei tosin riitä, mutta sen hallitseminen vapauttaa taas ajattelun miettimään korkeamman tason asioita.</p>

<p><center><div id="attachment_222" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_4197.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_4197-1024x682.jpg" alt="Itsenäisyyspäivän viettoa Bostonissa" title="Itsenäisyyspäivän viettoa Bostonissa" width="450" height="299" class="size-large wp-image-222" /></a><p class="wp-caption-text">Itsenäisyyspäivän viettoa Bostonissa</p></div></center></p>

<p><center>
<div id="attachment_221" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/img_7907.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/img_7907-1024x682.jpg" alt="Japanissa" title="Japanissa" width="450" height="299" class="size-large wp-image-221" /></a><p class="wp-caption-text">Japanissa</p></div>
</center></p>

<p>Uudet objektiivit kameran mukana tulleen lisäksi ovat avanneet uusia mahdollisuuksia niin läheltä kuin kaukaakin. Ostoslistalla onkin jo varmaan tuhannen euron edestä muutama objektiivi, joilla pääsee kuvaamaan entistä kauempaa tai entistä pimeämmässä. Kaiken ostohuuman keskellä on kuitenkin muistettava, että oikea valokuvaus ei ole välineharrastus, vaan hyvä valokuvaaja ottaa kuvan kameralla kuin kameralla. Ennen kaikkea on vain otettava paljon kuvia. Olen myöskin huomannut hyväksi tavaksi omien kuvien tarkan arvioinnin. Muun muassa tästä syystä olenkin täyttänyt asuntoni seinät itse otetuilla kuvilla, jotta aiempien kuvien onnistumiset ja virheet painuvat mieleen.</p>

<p><center><a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_7025.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_7025-1024x680.jpg" alt="" title="IMG_7025" width="450" height="298" class="aligncenter size-large wp-image-224" /></a></center></p>

<p><center><div id="attachment_227" class="wp-caption aligncenter" style="width: 460px"><a href="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_8830.jpg"><img src="http://www.villesalonen.fi/wp-content/uploads/2010/11/IMG_8830-1024x680.jpg" alt="Tiikerin päiväunet turvallisen etäisyyden päästä" title="Tiikerin päiväunet turvallisen etäisyyden päästä" width="450" height="298" class="size-large wp-image-227" /></a><p class="wp-caption-text">Tiikerin päiväunet turvallisen etäisyyden päästä</p></div></center></p>

<p>Järkkärin kanssa kuvaillessa vierähtikin mukavasti tovi jos toinenkin. Tänä aikana teräväpiirtovideokamerat olivat kavalasti valloittaneet videokameramarkkinat ja niiden hintakin oli laskenut taas kuluttajatasolle. Vanha viehätys videokuvaukseen heräsi uudestaan, kun lomamatka Yhdysvaltojen itärannikolle rupesi häämöttämään suunnitelmissa. Mieli oli tehnyt jo pitkään päästä Yhdysvaltoihin, eikä tällaista reissua voinut jättää vain valokuvien muistettavaksi. Säästöjäkin oli kertynyt niin mukavasti, että Canon Legria HF200 -kameran hankkiminen ennen reissua ei pakottanut syömään matkalla pelkkää purkkitonnikalaa.</p>

<p>Vaikka olinkin teräväpiirtokuvaan tottunut jo Internetin myötä, oli kavereiden ja minunkin näkeminen teräväpiirtona yllättävä kokemus. Vanhoihin kasettivideokameroihin ei kuvanlaatua voinut oikein edes verrata. Vaikka aivan filmitasolle ei vielä päästykään, oli lopputulos mielestäni jo sellaista, ettei katsoessa muistanut koko ajan katsovansa &#8220;vain&#8221; kotivideota.</p>

<p>Nauhakameroilla nauha jouduttiin kuvaamaan alusta loppuun ja jos väliin jäi jotain turhaa, jonka olisi halunnut poistaa, olisi ainoana mahdollisuutena olla kuvata jotain uutta päälle. Tämä kuitenkin johti herkästi siihen, että uusi video meni vanhan onnistuneenkin päälle. Muistikortteja käyttävillä kameroilla tämä ei ole ongelma, vaan kohtaukset voi poistaa kätevästi yksi kerrallaan ja kortilla mahtuu edelleenkin saman verran kuin jos sen olisi täyttänyt järjestyksessä.</p>

<p>Usein videoita kuvatessa tulee kuvattua kaikenlaista ylimääräistäkin, joka kuvaushetkellä saattaa vaikuttaa hyvältä. Myöskin tiettyjä tilanteita odottaessa kameran antaa varmuuden vuoksi pyöriä tyhjää, jotta se hieno hetkikin tallentuisi muistiin. Näitä ei kuitenkaan jaksa katsoa itsekään saati sitten ulkopuoliset katsojat. Siispä videoita kannattaa leikata. Muistikorttipohjaisten kameroiden kanssa tämä oli helppoa: muistikortti koneelle, ohjelmasta import-toiminto päälle ja hetken odottelun jälkeen video oli valmiina leikattavaksi. Mac-koneiden mukana tuleva iMovie-ohjelmisto osoittautui varsin näppäräksi työkaluksi, jonka käytettävyys oli niin hyvä, että pystyi keskittymään vain lopputuloksen miettimiseen, eikä aikaa tuhrautunut ohjelmiston kanssa tappeluun.</p>

<p><a href="http://www.villesalonen.fi/2010/the-united-states-of-america/">The United States Of America</a> -kirjoituksestani löytyy esimerkki siitä, millaista lomavideota Yhdysvalloista sain uuden kameran ja leikkausohjelmani kanssa. Myöskin Japanin matkaltani on tulossa vastaava video, kunhan saan pitkän leikkausoperaationi valmiiksi.</p>

<p>Tässä vaiheessa olin päässyt jo lähes niihin tavoitteisiin, mistä lapsena olinkin haaveillut. Vielä oli kuitenkin yksi tärkeä askel: vaikka video olikin teräväpiirtoa, näytti se kuitenkin edelleen videolta eikä Hollywood-elokuvalta. Tekniikka tarjosi lopulta avun myös tähän. Uusimmat järjestelmäkamerat saivat teräväpiirtovideokuvauksen lisäominaisuudekseen. Olennaisena erona järkkärillä ja videokameralla kuvatessa ovat samat tekijät kuin pokkarilla ja järkkärillä valokuvia ottaessa: iso kenno mahdollistaa syvyysterävyydellä kikkailun ja paremman pimeäkuvauksen sekä vaihdettavat objektiivit auttavat kameran muuntamisen kuhunkin kuvaustilanteeseen paremmin sopivaksi. Canon EOS 550D oli Canon-merkkiuskolliselle kuvaajalle ensimmäinen järkevän hintainen kamera. Se päätyikin ostoskoriin lähes heräteostoksena, kun Alternative Party 2010 -tapahtuman vierestä löytyi Verkkokauppa.comin myymälä ja säästötilillä poltteli useampi ylimääräinen satanen.</p>

<p>Uusi kamera on ollut käytössäni vasta reilun kuukauden, joten en ole vielä päässyt mielestäni kunnolla perehtymään sen käyttöön. Käsin tarkentaminen liikkuvan kuvan kanssa on vielä valokuvien tarkentamistakin haastavampaa. Elokuvia kuvatessa tämä homma onkin usein ulkoistettu erilliselle tarkentajalle (focus puller), jolloin kuvaaja pystyy keskittymään kuvan rajaamiseen ja kameran sijoitteluun.</p>

<p>Kuten kirjoituksesta varmasti huomaakin, on kuvaaminen päässyt hyvinkin lähelle sydäntäni. Jatkossa on siis varmasti luvassa lisää kirjoituksia aiheesta. Tästä loppuun vielä esimerkki siitä, millaista videokuvaa olen tähän mennessä uudella järkkärilläni saanut aikaan:</p>

<p><center><object width="640" height="385"><param name="movie" value="http://www.youtube.com/v/rID5-hJKRas&amp;hl=en_US&amp;fs=1&amp;ap=%2526fmt%223D&amp;ap=%2526fmt%3D22"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/rID5-hJKRas&amp;hl=en_US&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="640" height="385"></embed></object></center></p>
]]></content:encoded>
			<wfw:commentRss>http://villesalonen.fi/2010/kuvausharrastus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced
Database Caching using disk: basic
Object Caching 775/892 objects using disk: basic

Served from: villesalonen.fi @ 2012-05-20 21:51:15 -->
