Solidabis

Kevään reittiopas-teemainen koodihaaste ratkaistu – tutustu voittajaratkaisuun!


Koodihaaste Solidabis

Heti kärkeen suuri kiitos kaikille 46 osallistujalle! Koodihaasteen raati kävi jokaisen työn läpi, ja parhaimpiin suorituksiin oli suorastaan tungosta. Voittajien valinta ei siis ollut tälläkään kertaa helppo tehtävä. Lopullinen voittaja valittiin Solidabiksen sisäisellä äänestyksellä – kansa on siis puhunut!

On ilo nähdä, että kisa innostaa koodareita osallistumaan. Seuraavat palautteet kielivät siitä, että koodihaasteen parissa viihdyttiin monipuolisesti:

  • ”Koodihaaste oli tosi hauska tehdä!” 
  • Haluan kiittää hauskasta tehtävästä, oli mielenkiintoista hypätä pois mukavuusalueelta ja opiskella uusia teknologioita tällaisen pikkuprojektin parissa.” 
  • ”Suuri kiitos erinomaisen mukavasta pääsiäisen ajan aikasyöpöstä!” 
  • ”Kiitos mielenkiintoisesta haasteesta, vaikka en kilpailussa pärjäisikään, niin opin ainakin paljon uusia jippoja ja tekniikoita luodessani ratkaisuani.” 
Koodihaasteen voittajat

Koodihaasteen ja 300 € Verkkokauppa.com lahjakortin voittajaksi valittiin Pekka Turtola (Vantaa), onneksi olkoon! Pekan voittajatyöhön pääsee tutustumaan täällä.

Kaksi muuta kärkityötä palauttivat Joska Kallatsa (Järvenpää) sekä Aleksi Leino (Espoo). Molemmat palkitaan 100 € Verkkokauppa.com-lahjakorteilla. Paljon onnea!

Lisäksi arvoimme kaikkien osallistujien kesken yhden 100€ lahjakortin Verkkokauppa.comiin sekä neljä kahden Finnkino-superlipun pakettia. Arvonnan voitot jakautuivat seuraavasti.

Verkkokauppa.comin 100€ lahjakortti:

  • Otso, Helsinki

2 x Finnkinon Superliput:

  • Vili, Raisio
  • Kaarlo, Helsinki
  • Tuomo, Jyväskylä
  • Erik, Vantaa

Tarjosimme 2 x Finnkinon superliput voittaneille mahdollisuuden vaihtaa palkinnon 25€ Verkkokauppa.comin lahjakorttiin Finnkinojen ollessa koronaviruksen vuoksi toistaiseksi suljettuina.

Kiitos kaikille osallistujille ja onnea voittajille!

Mistä koodihaasteessa oli kyse? 

Koodihaasteen aiheena oli tällä kertaa reittioppaan toteuttaminen, eli annetun materiaalin pohjalta lyhyimmän reitin etsiminen matkustajalle. Aineisto koostuu tieverkostosta sekä bussireiteistä, jotka kulkevat teitä pitkin. Tehtävänä oli toteuttaa käyttöliittymä, jonka avulla käyttäjä pystyy selvittämään parhaan reitin paikasta toiseen. Varsin tuttu konsepti siis ainakin julkisen liikenteen hyödyntäjille! 

Suurin osa osallistuneista suoritti varsinaisen reittihaun oikein. Virheitä sattui esimerkiksi, jos ratkaisussa ei huomioitu kulkuvälineen vaihtojen minimointia tai ettei kaikkia teitä pitkin kulkenut bussilinjaa. Toteutuksia testattiin myös suuremmalla aineistolla, sillä skaalautuvuus oli myös arvioitava osa-alue. Reittioppaan tuli esittää tulokset käyttöliittymässä, jonka toteutus painoi myös arvostelussa. Näimmekin myös visuaalisesti erittäin hienoja palautuksia, joissa oli hyödynnetty listauksia, animointia ja karttagraafeja. Arviossa painotettiin koodin selkeyttä, laatua, käyttöliittymän toimivuutta, ulkoasua ja reittihaun tuloksen oikeellisuutta. Parhailla töillä nämä kaikki osa-alueet olivat hallussa, mikä teki voittajan valinnasta haastavaa. 

Koodihaasteen voittaja
Kuva: Voittajaratkaisu (Pekka Turtola)

Kisaan oli mahdollista osallistua valitsemillaan työkaluilla. Teknologiat ovat listattuna alla olevassa taulukossa. Suosituimpia olivat siis React, JavaScript, Python ja Angular, mutta ratkaisuissa nähtiin myös Vue, .Net, Unity, Java (Spring Boot), Clojure, React Native sekä PHP & SQL.

Teknologioita: React, JavaScript, Python, Angular, Vue, .Net, Unity, Java (Spring Boot), Clojure, React Native ja PHP & SQL
Kuva: Koodihaasteratkaisuissa käytetyt teknologiat

Vapaasti valittavalla teknologialla haluttiin antaa mahdollisuus käyttää ominta tapaa haasteen toteuttamiseen – olikin mukava nähdä erilaisia ratkaisuja. Teknologiassa olikin odotetusti enemmän kirjavuutta kuin reitin ratkaisun algoritmissa. Teknologiavalinnan kannalta erityisesti esiin nousi Mauri Salbergin tietokantaa hyödyntävä ratkaisu. Mauri on tehnyt koodihaasteen ratkaisuprosessista loistavan YouTube-videosarjan, jossa hän käy läpi haasteen aina toimeksiannon analysoimisesta lopulliseen ratkaisuun. 

Ratkaisuja lyhyimmän reitin löytämiseen 

Lyhyimmän reitin ratkaiseminen on vanha pulma, jonka ratkaisemiseen on olemassa useita hyväksi havaittuja tapoja. Pyörää ei siis kannata keksiä uudestaan ja ongelmanratkaisu on hyvä aloittaa tiedonhaulla. Lyhyimmän reitin ongelmassa törmää ainakin seuraaviin vaihtoehtoihin, jotka kaikki olivat edustettuna kisassa. Kaikissa on omat etunsa ja myös karttaverkoston muoto vaikuttaa valitun ratkaisun tehokkuuteen: 

Dijkstran algoritmi on keksitty 1956 ja se on suosituin käytetty ratkaisu lyhyimmän reitin löytämiseen. Kyseessä on ahne algoritmi, joka käsittelee aina lyhyintä tunnettua polkua, kunnes löytää halutun määränpään. 

Bellman-Ford laskee reitin kaikkiin mahdollisiin loppupisteisiin. Tapa on hitaampi kuin Dijkstra, mutta mahdollistaa myös negatiivisten yhteyksien huomioisen. Reittioppaassa tämä ei ole kuitenkaan tarpeellista, sillä minkään reitin kulkeminen ei siirrä aikaa taaksepäin. Tilanne olisi eri, jos matka-ajan sijasta nodejen väliset arvot olisivat rahaa, ja kartalla kulkisi taksikuski. Tällöin olisi tarvetta käsitellä myös negatiivisia polkuja siinä yhteydessä, kun ketään ei olisi kyydissä ja kulkemisesta seuraavan asiakkaan luokse muodostuu bensakuluja. 

Floyd Warshall on algoritmi, joka tuottaa etäisyysmatriisin jokaisesta reitin pysäkistä toiseen. Etuna tällä lähestymisellä on, että kun kaikki reitit on kerran laskettu, niin ne voidaan hakea valmiiksi lasketusta matriisista tehokkaasti käyttäjälle, eikä reittiä lasketa joka kerta uudelleen käyttäjän kyselyn yhteydessä. Kaikkien mahdollisten reittien laskemiseen menee vaihtokauppana enemmän aikaa. 

Koodihaasteen ratkaisu
Kuva: Toinen sija (Joska Kallatsa) (vasemmalla) ja kolmas sija (Aleksi Leino) (oikealla)

Algoritmien toteuttamisen lisäksi tehtävässä oli oleellista huomioida myös rajoitteet, eli linjastoa pitkin kulkevat reitit ja vaihtojen minimointi. Vaikka datan käsittely tarvittavaan muotoon ja algoritmin implementointi on jo hyvä suoritus, niin nämä toimivat lisähaasteina tehtävässä. Mikään ratkaisutapa koodihaasteessa ei ollut oikea tai väärä, vaan riitti, että reittihaun tulokset ovat oikein ja toteutus tehokas. 

Retrospektiivi, eli katsaus koodihaasteen toteutukseen 

Koodihaasteen päätyttyä katselmoidaan taas hieman lähimenneisyyteen, eli mitä tunnelmia koodihaasteen toteuttamisesta heräsi ja minkälaisia oppeja tästä jäi mieleen. 

Tekniikat koodihaasteessa olivat jälleen osallistujien vapaasti valittavia kuten edellisessäkin koodihaasteessa, jossa selvitettiin kryptattuja sanoja. Valinnanvapauden tarkoituksena oli helpottaa osallistumisen kynnystä ja olla rajaamatta osallistujia tätä kautta pois. Tässä onnistuttiinkin osallistumisten perusteella hyvin. Arvosteluun tämän tiedettiin tuovat lisähaastetta, sillä suora vertaaminen ei ole täysin mahdollista. Hyvät koodauskäytännöt ovat kuitenkin hyvin universaaleja, ja näiltä osin arviointia pystyttiin tekemään onnistuneesti. Yksi hyvä perusteos aiheesta kiinnostuneille on Clean Code, jonka on kirjoittanut Robert C. Martin. Netistä Clean Codesta löytyy tiivistelmiä (esimerkiksi tämä), joista näkee nopeasti mihin asioihin koodin laadussa kannattaa kiinnittää huomiota. 

Suurin osa palautetuista töistä suoritti reitin etsimisen oikein, joten tällä tuloksessa ratkaisevaa eroa kisaajien kesken ei pystytty tuottamaan. Toimeksiannossa arviointikriteerinä oli myös käyttöliittymän selkeys ja laatu ja tällä kertaa siinä nähtiinkin suurimmat erot töiden välillä. Käyttöliittymän puolella arvostettiin erityisesti selkeyttä ja helppoa käytettävyyttä, sekä teknisiä ratkaisuja kuten kartan visualisointia ja mobiilin huomiointia. 

Yksi harkittava vaihtoehto tulevaisuutta ajatellen olisikin tehtävän suunnittelu niin, että pääpaino haasteen voittajan valinnassa olisi optimaalisimman tuloksen tuottaminen. Tätä varten tulisikin kehittää haaste erilaisella kulmalla, jossa oli selkeämpi “oikea vastaus”, jota kohti tulisi pyrkiä. Olemme halunneet kuitenkin kurkata myös kirjoitettua koodia ja antaa sille painoarvoa töiden arvioinnissa. 

Tsekkaa avoimet työpaikkamme, tai tutustu lisää Solidabikseen.

Solidabiksen Koodihaaste palaa vielä tänä vuonna. Seuraa meitä someissa @Solidabis, niin saat tietää tulevista haasteista. Kiitos vielä kerran kaikille osallistujille! 

Katso myös viime vuoden koodihaasteeseen liittyvät postaukset:

Kirjoittaja Veli-Pekka Nurmi, tuttavallisemmin Vellu, toimii Solidabiksella ohjelmistokehittäjänä. Devauskokemuksen lisäksi Vellulla on usean vuoden kokemus tulospohjaisesta markkinoinnista ja analytiikasta erityisesti digitaalisissa kanavissa. Monipuolisen kokemuksen ansiosta Vellu pystyy samaistumaan myös loppukäyttäjien sielunelämään ja liiketoiminnan vaatimuksiin, josta on usein apua teknisiä ratkaisuja sorvatessa. Vellu osallistui Solidabiksen viime vuoden koodihaasteeseen, ja nappasi pääpalkinnon lisäksi työpaikan Solidabikselta – viimeisimmässä koodihaasteessa Vellu pääsikin toimimaan päävastuuhenkilönä.  

Yhteydenottolomake

  • Kenttä on validointitarkoituksiin ja tulee jättää koskemattomaksi.