Automatisoitu ohjelmiston tuotantoprosessi

Ohjelmistojen kehittäminen poikkeaa monesta tekniikan alasta merkittävästi abstraktin luonteensa takia. Kaikkein monimutkaisimmat insinöörien rakennelmat löytyvät tietojärjestelmistä; kompleksisimmatkaan perinteisen tekniikan alojen kuten kone- tai rakennustekniikan rakennelmat eivät pääse monimutkaisuudessa lähellekään ohjelmistotekniikkaa. Ohjelmistotekniikassa on myös huomattavasti vaikeampi hahmottaa rakennettavan asian koko ja monimutkaisuus.

Kuka tahansa näkee, että pilvenpiirtäjä tai Juutinrauman silta on paljon suurempi ja haastavampi rakennelma kuin omakotitalo tai Hämeensilta tai että uuden automallin suunnittelu ja valmistus vaatii enemmän työtä ja maksaa enemmän kuin polkupyörän. Ulkopuolisen on vaikea tietää pitäisikö tietojärjestelmän toteutuksen kestää vuosia vai kuukausia ja pitäisikö sen maksaa miljoonia vai kymmeniä tuhansia.

Toinen ero ohjelmistotekniikassa konkreettisiin tekniikan aloihin on tuotantotyön ja tuotantotyöläisten puuttuminen; ohjelmistojen rakentamiseen liittyvä työ on suunnittelutyötä. Usein käytetty – ja Goforenkin käyttämä – analogia rakennustekniikkaan voi monesti olla harhaanjohtava. Ohjelmistotuotannossa ei ole kirvesmiehiä tai liukuhihnatyöntekijöitä, koska kokoonpanotyön hoitaa tietokone. Toki suunnittelutyötä on erilaista ja jos analogiaa rakennustekniikan puolelle halutaan hakea, niin voitaisiin verrata vaikka yleiskaava-, asemakaava-, rakenne- ja sähkösuunnittelun eroja.

Tässä blogissa keskityn erityisesti ohjelmiston tuotantotyöhön eli siihen rutiininomaiseen osuuteen, jonka tietokone tekee ihmisen puolesta, ja miten se hoidetaan automaattisesti palvelinpohjaisia ohjelmistoja rakennettaessa. Tällaisia ovat suurin osa nykyään käytetyistä yritys- ja kuluttajajärjestelmistä sekä julkishallinnon järjestelmistä. Käyttöliittymänä on useimmiten WWW-selain tai mobiililaite.

Automaatio kehitysympäristössä

Ohjelmistokehityksessä pääosissa on suunnittelu, jossa formaalilla tavalla kerrotaan tietokoneelle mitä sen pitää tehdä. Tämä tehdään käyttäen ohjelmointikieliä, markup-kieliä ja erilaisia ohjelmistokehitystyökaluja. Ohjelmointi sekä työkalujen käyttö ja konfigurointi on suunnittelutyötä. Formaalin suunnitelman eli ohjelman muuttamisen lopulliseksi ajettavaksi järjestelmäksi hoitaa tietokone suunnittelijan formaalien ohjeiden mukaan.

Kehittämiseen liittyy olennaisena osana kehitysympäristön työkalujen, ohjelmistojen ja palvelinten valitseminen ja näiden asentaminen. Ensimmäistä kertaa tehtäessä tämä on ilman muuta suunnittelutyötä, mutta toistuessaan voi muodostua rutiiniksi. Tietotekniikassa on se mukava puoli, että kaikki rutiinit voidaan ja pitää automatisoida, niin tämäkin.

Tietojärjestelmän kehitysympäristö pitää saada pystyyn parissa minuutissa kun mukaan lasketaan kehittäjän aktiivinen työaika; kalenteriajassa aikaa voi kulua muutamia minuutteja enemmän. Kehitysympäristöllä tarkoitan kaikkia kyseisen järjestelmän kehittämiseen liittyviä välttämättömiä ja hyödyllisiä välineitä mahdollisesti käyttöjärjestelmästä lähtien ja sisältäen esimerkiksi kääntäjän, IDEn, sovelluspalvelimen, tietokannat, sähköpostipalvelimen, palveluväylän, ldap-palvelimen, mahdolliset vpn-yhteydet kehitysverkkoon, mallinnustyökalun, sql -työkalun. Näiden asentamiseen liittyvä suunnittelutyö toki vie aikaa, mutta tämä tehdään vain kerran jonka jälkeen ympäristö on kaikkien, myös uusien kehittäjien käytettävissä parissa minuutissa.

Kehitystyökalut ja varusohjelmistot tai niiden versiot usein vaihtuvat kesken järjestelmän rakentamisen, mutta se ei ole ongelma. Päivitys tehdään kerran, jonka jälkeen uusi kehitysympäristö päivitettyine työkaluineen on saatavissa jokaisen kehittäjän käyttöön automaattisesti yhdellä komennolla. Kehittäjä voi tarvittaessa myös tehdä valintoja kehitysympäristössä käytössä olevista työkaluista ja vaikuttaa sen konfiguraatioon. Ympäristö on kuitenkin standardoitu ja tärkeimmiltä osiltaan samanlainen kaikkien kehittäjien kesken.

Jatkuva integraatio ja testaus

Yksittäisten kehittäjien työ integroituu yhteen toisten työn kanssa versionhallinnan ja jatkuvan integraation (CI) palvelimen kautta. Tämän tulee tapahtua nopeassa syklissä, tyypillisesti useita kertoja päivässä. CI-palvelin tekee automaattisesti järjestelmän rakennukseen liittyvät toimet (build) eli kääntää lähdekoodin, ajaa testit (mm. yksikkö- ja integraatiotestit) ja laskee järjestelmän metriikan. Build tuottaa myös järjestelmän ajettavan version, joka asennetaan automaattisesti jatkuvasti päivittyvään testiympäristöön. Järjestelmästä on siis aina testattavissa uusin ja tuorein versio. Automaattinen asennus sisältää myös järjestelmän tietokannan ja siihen tarvittavat migraatiot.

Rakennettavan järjestelmän automaattisen asennuksen lisäksi myös itse testiympäristö käyttöjärjestelmineen, varusohjelmistoineen ja konfiguraatioineen asennetaan ja päivitetään automaattisella prosessilla.

Jatkuvasti päivittyvän testiympäristön lisäksi tarvitaan pysyvämpi testiympäristö, jonne järjestelmän versio asennetaan ihmisen päätöksestä “nappia painamalla”. Uusi stabiili versio voidaan asentaa aina esimerkiksi kehitysiteraation päätteeksi. Järjestelmän asennus tapahtuu saman automaation avulla kuin jatkuvasti päivittyvän testiympäristön kanssa ja ilman muita manuaalisia toimenpiteitä kuin napin painaminen.

Myös pysyvä testiympäristö asennetaan ja päivitetään automaattisella prosessilla. Ympäristöjen väliset erot on kuvattu ympäristökohtaisessa konfiguraatiossa.

Jatkuvan testiympäristön ja tuotantoympäristön välissä voi olla useita muitakin testausympäristöjä. Tärkeimpänä näistä on staging-ympäristö, joka vastaa tuotantoympäristöä täysin mm. palvelinten klusteroinnin ja kuormantasauksen osalta.

Lienee jo selvää, että sekä kaikki järjestelmän asennukset kaikkiin ympäristöihin että ympäristöjen asennukset tapahtuvat automaattisesti ilman manuaalisia toimenpiteitä. Kaiken pohjana on sama suunnittelutyö, joka suurimmalta osalta on tehty jo kehitysympäristön ja ensimmäisen testiympäristön synnyttyä. Uusia ympäristöjä saadaan hetkessä pystyyn lähes rajaton määrä.

Tuotanto

Oleellista on, että myös tuotantoympäristöä koskee sama automatiikka kuin muita ympäristöjä. Järjestelmän tuotantopäivitys on yhtä kevyt operaatio kuin päivitys testiympäristöön. Järjestelmä on päivitettävissä tuotantoon automaattisesti napin painalluksella tarvittaessa useita kertoja päivässä. Myös tuotannon palvelin- ja varusohjelmistot voidaan päivittää napin painalluksella eikä riskiä ole, koska prosessi on täysin automaattinen ja jokainen päivitys on koeistettu jo testiympäristöissä.

Työkaluja

Tuotantoprosessin automatisointi on arkipäivää ja rakennettavissa nykypäivänä yleisesti käytössä olevilla työkaluilla. Aiheesta riittäisi kerrottavaa toiseenkin blogiin, joten tyydyn tässä mainitsemaan esimerkinomaisesti muutamia mahdollisia, ainakin Java-maailmassa käytettyjä, työkaluja ja avainsanoja: virtualisointi, Vagrant, Gradle, Maven, Flyway, Jenkins, Puppet, Chef, bash.

Yhteenveto

Automatisoidun tuotantoprosessin suunnittelu vaatii työtä ja osa työstä on rakennettavasta järjestelmästä riippuvaista. Aivan pienessä projektissa tuotantoprosessin täydellinen automatisointi ei välttämättä maksa itseään takaisin, mutta niissäkin tärkeimmät osat pitää ehdottomasti automatisoida.

Jos omassa projektissasi tehdään joitakin rutiiniasioita käsin, en olisi yllättynyt tai huolestunutkaan, vielä. Mutta ensi vuonna alkavassa yli miljoonan euron projektissa näiden asioiden pitäisi olla kunnossa.