Mitä yhteistä on viime vuosina paljon käytetyillä ohjelmointikielillä JavaScriptillä ja Pythonilla? Niiden tyyppiturvallisuus on heikohko. Tämä tarkoittaa, että kääntäjä ja/tai tulkki eivät löydä ohjelmavirheitä ennen kuin on liian myöhäistä ja ohjelma toimii ennalta arvaamattomasti.
Tyyppivihjeillä ja TypeScriptillä ohjelmoinnin onnelaan?
Erilaiset esikääntäjän varassa toimivat päälleliimatut tyyppijärjestelmät tuovat tilanteeseen apua, mutta ne eivät pääse tyyppiturvallisuuden osalta tyyppiturvallisemman kielen tasolle. Ne eivät myöskään ole osa itse ohjelmointikieltä, vaan ohjelmointikielen ympäristöön jälkikäteen lisättyjä osia.
Tyyppiturvallisuus on jatkumo vähemmän turvallisesta enemmän turvalliseen
Tyyppiturvallisuutta voi ajatella jatkumona, joka alkaa lähes olemattomasta JavaScriptin kaltaisesta tyyppiturvallisuudesta ja päättyy erittäin vahvaan, staattiseen tyyppiturvallisuutteen vahvoine tyyppipäättelyineen. Jälkimmäisen edustajista mainittakoon Haskell. Monet ohjelmointikielet, kuten Java ja C# ovat jossain edellä mainittujen ohjelmointikielten välimaastossa.
Vaikuttaako tyyppiturvallisuus ohjelmiston laatuun?
Tyyppiturvallisuus parantaa ohjelmiston laatua. Mitä tyyppiturvallisempi kieli on, sitä pienempi on ohjelmointivirheen mahdollisuus. Tämä vaikuttaa suoraan ohjelman kokonaisturvallisuuteen, myös ohjelman tietoturvaan.
Onko enemmän tyyppiturvallisemman kielen oppiminen vaikeampaa kuin vähemmän tyyppiturvallisemman kielen?
Kyllä on. Heikosti tyypitetty kieli on helpompi oppia, erityisesti jos kyseessä on ensimmäinen ohjelmointikieli. Ohjelmoinnin perusrakenteet näkyvät paremmin tyypittömässä kielessä ja opeteltavia asioita on tyyppiturvalliseen kieleen verrattuna yleensä yksinkertaisesti vähemmän.
Missä tyyppiturvallisuuden merkitys näkyy?
Tyyppiturvallisuus näkyy hyvin niissä ohjelmointikielissä, joita yleensä valitaan taustajärjestelmiin. Taustajärjestelmältä edellytetään yleensä enemmän vikasietoisuutta kuin järjestelmän käyttöliittymäosilta. Virhe taustajärjestelmässä on usein kertaluokkaa kohtalokkaampi kuin virhe käyttöliittymässä.
Mitä kieliä laittaisit pyörimään taustajärjestelmään?
Järjestelmän laatuun vaikuttaa moni tekijä, mutta välttäisin käyttämästä ylipäänsä heikosti tyypitettyä tai ajonaikaisesti tyypitettyä ohjelmointikieltä erityisesti laajojen taustajärjestelmän kehittämiseen.
Tämä tarkoittaa, että Python ajonaikaisesti vahvasti tyypitettynäkin putoaa pelistä – virhe ajon aikana on eri asia kuin virhe käännösaikana. Samoin pudottaisin pois myös JavaScript-johdannaiset, kuten TypeScriptin. Jälkikäteen päälleliimatut tyyppijärjestelmät ja muut esikäännöstyökalut saattavat viestiä lähtökohtaisesti vahvemman tyyppijärjestelmän tarpeesta. C++:n voi pudottaa pois esimerkiksi siksi, että se sallii hyvin liberaalisti ajonaikaiset tyyppimuunnokset. Jos se on mahdollista, niin se myös jossain vaiheessa yleensä tapahtuu.
Hyviä vaihtoehtoja kuitenkin jää jäljelle. C++ työt voi hoitaa Rustilla. Java, Kotlin ja C# hoitavat hyvin monen perusjärjestelmän tarpeet ja lisäturvallisuutta voi saada Haskellista, jos järjestelmän luonne edellyttää vielä turvallisempaa ympäristöä tyyppien osalta.
Ja jos JavaScript ei tunnu hyvältä web-sovellusten käyttöliittymässä, niin käyttöliittymän voi tiettyjen reunaehtojen täyttyessä aina luoda suoraan palvelimessa, näin vältetään myös yhden (ylimääräisen) ohjelmointikielen opiskelu.
Tämä pätee erityisesti tilanteisiin, joissa REST-rajapinnoille ei ole tarvetta ja vaikka olisikin, on hyvä muistaa, että REST-rajapinnan voi tehdä helposti tarpeen tullen. REST-rajapinnan ei ole syytä useinkaan olla ohjelmiston ainoa rajapinta. Palvelimella tuotettu HTML-sivu on aina nopeammin käyttäjän saatavilla kuin REST-rajapinnan avulla välitetty aikanaan DOM-puun saavuttava JSON-objekti.
Hyvää alkanutta kevättä ja tsemppiä tyypillisiin ja epätyypillisiin ohjelmointihommiin!
Juuso Vuorinen
Selma-koiran mielestä villapaidan voisi jo heittää talvivaatevarastoon. Ei tarvitsisi olla koko aikaa lumessa turvallaan ja pääsisi kesäiseen hajumaailmaan.