Kun tarkastellaan ohjelmistojen ylläpitoa ja jatkuvaa parantamista, tärkeä osa prosessia on lokiviestien hallinta ja tulkinta. Lokitiedostot tarjoavat arvokasta tietoa ohjelman toiminnasta, mutta niiden tulkitseminen voi olla haastavaa, erityisesti silloin, kun lokitiedostot eivät ole riittävästi informatiivisia tai päinvastoin, ne ovat liian yksityiskohtaisia. On tärkeää varmistaa, että lokiviestit ovat riittävän selkeitä ja että niistä on mahdollista löytää virheet. Jos virheitä ei voida tunnistaa pelkästään lokitiedostoista, tämä voi viitata siihen, että lokitus on joko riittämätöntä tai liian yksityiskohtaista, mikä tekee ongelman paikallistamisen mahdottomaksi. Jos virhe voidaan tunnistaa, on hyvä tarkistaa, että myös tuki- tai kehitystiimisi voi tehdä saman päätelmän lokitiedostoista.
Tuotannon lokitiedostojen analysointi ei ole usein jatkuva prosessi, vaan ne kerätään yleensä vasta häiriötilanteissa. Kuitenkin ne voivat paljastaa mielenkiintoista käyttäytymistä ja piileviä ongelmia sovelluksessa. Esimerkiksi olen nähnyt tuotannon lokin, jossa oli paljon samankaltaisia virheilmoituksia. Kävi ilmi, että käyttäjät olivat tottuneet napsauttamaan painiketta kahdesti, koska sovelluksen virhe esti ensimmäisen napsautuksen toimimisen. Tämä ensimmäinen napsautus aiheutti poikkeuksen, joka näkyi vain lokissa.
Matthew Skelton suosittelee lokitiedostojen testaamista ja käyttää niitä kanavana hajautettujen järjestelmien testattavuuden parantamiseen. Hänen mukaansa lokiviestien testaamisessa tulisi keskittyä kolmeen pääkohtaan:
-
Tapahtumat, joiden odotetaan ilmestyvän lokivirtaan, näkyvät oikein.
-
Transaktiotunnisteet (eli korrelaatio-ID:t) kulkevat oikein lokivirran läpi.
-
Tapahtumat kirjataan oikealla tasolla (Info, Error, Debug jne.), mikäli käytössä on konfiguroitavat lokitasot.
Tuotannon lokitiedostojen hallinta on tärkeää myös tiedostokoon ja säilytyskäytäntöjen osalta. Suuret lokitiedostot voivat tulla hankaliksi etsiä ja siirtää. Liian monta lokitiedostoa voi kuluttaa kohtuuttomasti levytilaa. On tärkeää määritellä käytännöt, kuten lokitiedostojen kierrätys ja säilytys, jotta ongelmat saadaan minimoitua. Tiedostojen arkistointi, kun ne saavuttavat tietyn koon, ja poistaminen, kun ne vanhenevat, voi auttaa hallitsemaan tiedostojen määrää. On myös suositeltavaa varmistaa, että arkistoidut lokitiedostot voidaan palauttaa oikein tarvittaessa.
Asiakaspalaute on toinen tärkeä osa tuotannon seurantaa. Monet ohjelmistot tarjoavat käyttäjille mahdollisuuden antaa palautetta, joko sähköpostin, palautelomakkeen tai reaaliaikaisen keskusteluyhteyden kautta. Tällaiset palautekanavat voivat paljastaa tärkeitä käyttäjien kokemuksia, jotka eivät välttämättä ole ilmeisiä pelkästään analytiikan avulla. Asiakaspalautteet voivat tuoda esiin niin tyytyväisyyttä kuin uusia kehitysehdotuksia, mutta joskus niissä ilmenee myös turhautumista ja epäselvyyksiä. Palautteet voivat auttaa kehitystiimiä ymmärtämään, millaisia haasteita käyttäjät kohtaavat, ja mitä he toivovat sovellukselta.
Kehitystiimin olisi tärkeää tehdä aktiivinen työ palautteen hyödyntämiseksi. Se ei kuitenkaan tarkoita, että kaikki palaute johtaa suoraan muutoksiin ohjelmistoon. Joskus palaute voi olla enemmänkin tunneperäinen reaktio kuin todellinen ohjelmointivirhe. On myös hyvä muistaa, että palautteen kerääminen ei ole vain velvollisuus, vaan se on mahdollisuus kehittää ohjelmistoa paremmin vastaamaan käyttäjien tarpeita.
Testikäytännöillä tuotannossa on tärkeä rooli jatkuvassa kehityksessä. Perinteisesti testaus tuotannossa saatettiin tehdä vain suurten julkaisujen jälkeen, mutta DevOps-ympäristössä testaus tuotannossa on jatkuva prosessi, joka tarjoaa palautetta ja suuntaa seuraaviin kehitysaskeliin. Yksi yleisimmistä testauskäytännöistä on A/B-testaus, jossa luodaan kaksi eri versiota ohjelmistosta ja tarjotaan käyttäjille vaihtoehtoja nähdäksesi, kumpi heistä suosivat. Tämä auttaa varmistamaan, että oikeat muutokset tehdään ja oikeat valinnat tehdään kehityksen edetessä.
A/B-testauksen avulla voidaan tehdä tarkempia päätöksiä siitä, miten ohjelmistoa tulisi muokata, ja varmistaa, että ohjelmisto vastaa käyttäjien tarpeita ja toiveita. On tärkeää, että A/B-testauksessa osapuolet ymmärtävät, mitä mitataan ja kuinka kauan testi kestää. Tulos ei ole luotettava, ennen kuin testissä on tarpeeksi dataa, jotta voidaan tehdä tilastollisesti merkittävä johtopäätös.
Testauksen ja palautteen integroiminen tuotantoon auttaa kehitystiimejä saamaan jatkuvaa palautetta, joka voi parantaa ohjelmiston laatua ja käyttäjäkokemusta. On kuitenkin muistettava, että vaikka testaus ja palaute voivat auttaa parantamaan ohjelmistoa, niillä ei ole aina yksinkertaista tai välitöntä vaikutusta – joskus parhaat parannukset voivat tulla pienistä, pitkäkestoisista muutoksista, jotka tapahtuvat askel askeleelta.
Miten Docker ja Pilvipalvelut Tukevat DevOpsin Kehitystä?
Docker lanseerattiin vuonna 2013, mutta sen käyttö on levinnyt uskomattoman nopeasti, osittain sen tiiviin yhteyden vuoksi DevOps-liikkeeseen. Dockerin avulla kehitystiimillä on pääsy suureen määrään yhdenmukaisia ympäristöjä, samalla kun operointitiimi voi hallita järjestelmän kokoonpanon eheyttä. Docker integroituu myös monien suosittujen DevOps-työkalujen kanssa, kuten Puppet, Chef, Vagrant ja Ansible, tai sitä voidaan käyttää itsenäisesti kehitysympäristöjen hallintaan. Dockerin ensisijainen myyntivaltti on sen kyky yksinkertaistaa monia tehtäviä, joita nämä muut työkalut yleensä tekevät.
Docker mahdollistaa paikallisten kehitysympäristöjen luomisen, jotka ovat täsmälleen samanlaisia kuin live-palvelimet. Tällä tavoin voi ajaa useita kehitysympäristöjä samalta isäntäkoneelta, jotka jokainen sisältävät uniikit ohjelmistot, käyttöjärjestelmät ja kokoonpanot. Tämä tekee mahdolliseksi testata projekteja uusilla tai eri palvelimilla, ja antaa kaikille tiimin jäsenille mahdollisuuden työskennellä saman projektin parissa samoilla asetuksilla riippumatta heidän omasta paikallisesta ympäristöstään. Tämän lisäksi Docker poistaa tarpeen kehitystiimiltä, että heidän koneissaan on asennettuna täsmälleen samat ohjelmistoversiot, mikä on ollut perinteisesti suuri haaste kehitysympäristön hallinnassa.
Pilvipalvelut, erityisesti niiden tarjoamat virtuaaliset infrastruktuurit, täydentävät tätä kehitystä tarjoamalla skaalautuvuutta ja joustavuutta. Pilvipalvelut voivat olla julkisia, yksityisiä tai hybridejä. Julkinen pilvi on ulkopuolisen yrityksen ylläpitämä palvelinparvi, jossa asiakas voi käyttää resursseja tarpeen mukaan. Yksityinen pilvi taas on organisaation sisäinen infrastruktuuri, joka mahdollistaa täyden hallinnan ja paremman turvallisuuden, mutta saattaa olla kalliimpi ylläpitää. Hybridi-pilvi yhdistää molemmat, tarjoten joustavuuden valita mikäli osa organisaation palveluista on sopivampia julkiseen pilveen ja toiset taas vaativat enemmän yksityisyyttä ja kontrollia.
DevOpsin ja pilvipalveluiden yhteys on ilmeinen: pilvipalveluissa käytettävät konfiguraationhallintatyökalut, kuten Puppet, Chef ja Ansible, voivat helpottaa infrastruktuurin hallintaa ja automatisointia. Pilvipalvelut mahdollistavat nopeat skaalautumiset ja helpottavat resurssien provisiointia verrattuna fyysisiin palvelimiin. Tämän joustavuuden myötä IT-osastot voivat siirtyä pois perustoimintojen, kuten laitteiston provision ja käyttöjärjestelmien päivitysten, tekemisestä, ja keskittyä liiketoimintakohtaisiin arvoihin.
DevOps-menetelmässä ympäristöhallinta on keskeinen osa toimintaa. Kehitystiimi voi luoda ja konfiguroida ympäristöjä automaattisesti, ja koska ympäristöt voivat olla kevyitä, esimerkiksi säilöjen tai pilvipohjaisten komponenttien avulla, prosessi voidaan toistaa helposti paikallisessa koneessa tai luoda uusia ympäristöjä tarpeen mukaan. Tämä kehittää ympäristöistä tavaroita, jotka voidaan luoda ja poistaa nopeasti ja helposti. Tässä yhteydessä käytetään usein vertauskuvaa: "palvelimet ovat karjaa, ei lemmikkejä". Tämä tarkoittaa sitä, että ympäristöjä ei pidetä yksittäisinä, pysyvinä yksiköinä, vaan ne ovat osa laajempaa kokonaisuutta, jota voidaan tarvittaessa muuttaa tai hävittää.
Kun ympäristöjen luominen ja hävittäminen on nopeaa ja automatisoitua, kehitystiimit voivat käyttää testaamista entistä tehokkaammin. Ympäristön luominen ennen testauksen suorittamista voi estää virheitä, jotka syntyvät ympäristön epäjohdonmukaisuudesta. Lisäksi tämä poistaa tarpeen käyttää virheellistä sanontaa "se toimii koneellani" – koska kaikkien ympäristöt ovat identtisiä, testivaiheessa ei voi olla epäselvyyksiä siitä, onko ympäristö oikeassa tilassa.
Ympäristön hallinnassa keskeinen kysymys onkin se, kuinka luodaan ja hallitaan ympäristöjä, jotka ovat luotettavia ja johdonmukaisia. Jokaisen ympäristön tulisi olla samanlainen, mikä estää ympäristön konfiguraation aiheuttamat ongelmat. Kun ympäristön määrää lisätään, testiaktiviteeteista saatava palaute voi olla hankalampaa hallita. Kehitystiimien on oltava varmoja siitä, että ympäristö, jossa ongelma ilmenee, on identtinen lopullisen tuotantoympäristön kanssa.
On tärkeää ymmärtää, että ympäristöhallinnan lisääntyminen ei ole aina hyödyllistä, vaan se voi tehdä palautteen käsittelystä monimutkaisempaa. Jatkuvan toimituksen ja DevOpsin periaatteet kannustavatkin yksinkertaistamaan ympäristön määritelmiä ja varmistamaan, että koodi siirtyy suoraan kehitysympäristöstä tuotantoon ilman monivaiheista välivaihetta, kuten staging-ympäristöä, joka saattaa vain hidastaa prosessia ja lisätä turhaa monimutkaisuutta.
Endtext
Kuinka kehittää testausstrategia DevOpsissa ja riskienhallinnassa
Kun pyritään luomaan strategia omalle organisaatiolle, vaihtoehtojen määrä voi tuntua ylivoimaiselta. Organisaatiomme ei todennäköisesti omaksu kaikkia käytäntöjä. Sen sijaan kehitys- ja operaatio-tiimi valitsevat käytännöt, jotka sopivat heille parhaiten. Organisaatioissa, jotka tavoittelevat säännöllisempää julkaisurytmiä, on silti tärkeää arvioida tuotetta testauksen avulla. Testaus ei ole katoamassa, mutta jos tämä tavoite yhdistetään tiheämpiin julkaisuihin – mikä on todennäköisesti houkuttelevin näkökulma johdolle – testauksen täytyy olla yhtä nopeaa. Nopea palaute edellyttää kehittyneitä kommunikaatioväyliä. DevOpsissa on polkuja, jotka menevät kehitystiimin ulkopuolelle ja haastavat sen, milloin opimme tuotteistamme. Jos saamme runsaasti ja nopeasti palautetta operaatio-tiimiltä, kuinka tämä muuttaa testauksen vaatimuksia ennen julkaisua?
Jerry Weinberg on sanonut, että "laatu on arvoa jollekin henkilölle." Lopulta se henkilö, joka on tärkein määriteltäessä tuotteen arvoa ja laatua, on käyttäjä. Jos mahdollistat käyttäjälle mahdollisuuden testata, saat suoraa palautetta laadusta, joka tulee tärkeimmältä sidosryhmältä. Tämä saattaa olla haastava ajatus testaajalle, joka on aiemmin toiminut käyttäjän äänenä kehitystiimissä. Toisaalta haluat julkaista tuotteen, johon uskot. On haitallista organisaation maineelle, jos julkaiset ohjelmistoa, jossa on ilmeisiä ongelmia, vaikka vain osalle käyttäjistä. Haluat tehdä asiat oikein, jotta käyttäjäpalaute kertoo, onko tuote arvokas, sen sijaan että se jatkuvasti osoittaa ongelmia.
Tässä vaiheessa automatisoidut putket tulevat kuvaan, jotka tarkistavat tuotteen testiautomaatioiden avulla. Automaatio voi olla nopeampaa kuin toistuva manuaalinen tarkistus, mutta se on myös kallista kehittää ja ylläpitää. Kun nopeus markkinoille on tärkeää, et ehkä halua käyttää yhtä paljon aikaa pre-release-testiautomaation kirjoittamiseen kuin aiemmin. DevOpsin automaatio-strategia voi olla pragmaattisempi. Tarvitset riittävästi automaatiota, joka auttaa sinua tekemään julkaisupäätöksiä, mutta ei niin paljon, että se estää sinua. Jos nämä ovat DevOpsin testausstrategian yleisiä teemoja, kuinka määrität yksityiskohdat omalle organisaatiollesi?
Riskityöpaja
Ohjelmistokehityksessä kuulee usein sanottavan, että "kaikki testaus on riskipohjaista." Tästä huolimatta keskustelut, joissa keskitytään nimenomaan riskin arvioimiseen, voivat olla suhteellisen harvinaisia. Meistä tulee itse tyytyväisiä. Kun oletamme tietävämme, mitkä riskit ovat ja että meillä on sama käsitys riskeistä muiden kanssa, luomme mahdollisuuden virheille. Jos olettamuksemme ovat vääriä, voimme tehdä testauspäätöksiä, jotka hämmentävät ympärillämme olevia. Kun näkemyksemme riskeistä poikkeavat, voimme riidellä tehtävien priorisoinnista. Perinteinen vesiputouskehitys antoi johdonmukaisen tilaisuuden keskustella riskeistä projektin alussa. Iteratiivisessa prosessissa tällaisia tilaisuuksia ei ole automaattisesti tarjolla, vaan ne on otettava itse. Säännöllinen riskityöpaja on hyvä tilaisuus kalibroida ja vahvistaa käsitystämme siitä, miksi teemme testausta.
Riskinsietokyky
DevOpsin tavoitteena on luoda tiheämpiä julkaisuja. Joka kerta, kun julkaiset, saatat aiheuttaa odottamatonta käyttäytymistä sovelluksessa, infrastruktuurissa tai asiakastiedoissa. Julkaisujen määrän kasvu lisää mahdollisuuksia ongelmien ilmenemiseen. Tämä ei tarkoita, että ongelmia tulee enemmän, vaan että mahdollisuuksia ongelmien esiintymiselle on enemmän. Toisaalta julkaisujen koko tarkoittaa, että ongelmat olisivat teoreettisesti pienempiä kuin ne, jotka liittyvät suuriin julkaisuihin. Kun julkaiset pienemmissä erissä, on mahdollista paikallistaa ongelmat välittömästi. DevOps pyrkii myös parantamaan julkaisujen luotettavuutta automatisoidulla käyttöönotolla ja peruutuksella, mikä auttaa palautumaan ongelmista. On silti tärkeää arvioida organisaatiosi valmiutta kohdata lisääntyviä tuotanto-ongelmia. Kukaan ei pidä siitä, että asiat menevät pieleen, mutta ovatko ihmiset valmiita hyväksymään sen, jos järjestelmä ei ole "väärässä kauan"? Kuinka kriittisiä tarkkuus ja saatavuus ovat ohjelmistossasi? Kun kysytään suoraan, ihmiset yleensä ilmoittavat konservatiivisen näkemyksen: "Emme voi olla väärässä lainkaan!" Mutta kun heitä haastetaan, huomaat, että he ovat valmiita hyväksymään kaikenlaisia ongelmia, joita heidän tuotantoympäristössään on tällä hetkellä. Visuaaliset ongelmat käyttöliittymässä. Esteettömyysstandardien täyttämättömyys. Kolmannen osapuolen kirjastoihin liittyvät versiot, jotka eivät ole enää tuettuja.
Sen sijaan, että kysyisit suoraan, aloita riskityöpaja harjoituksella, joka keskittyy riskinsietokykyyn. Kerää kaikki julkaisemispäätöksistä vastuussa olevat henkilöt yhteen ja aloita keskustelu riskistä. Esitä kysymyksiä, jotka paljastavat mielipiteitä nykytilasta ja tulevasta suunnasta. Olen aiemmin käyttänyt kysymyksiä, jotka on sovellettu Adam Knightin Riskikyselylomakkeesta:
• Missä mielestäsi [tuote] on tällä hetkellä tavanomaisessa testauksen huolellisuustasossaan?
• Missä mielestäsi [tuote] pitäisi olla tavanomaisessa testauksen huolellisuustasossaan?
Tee tästä interaktiivinen harjoitus pyytämällä ihmisiä vastaamaan valitsemalla paikka huoneessa: toisen seinän puolelle matalalle ja toisen puolelle korkealle. Tulokset antavat visuaalisen indikaattorin siitä, miten ihmiset kokevat nykyisen lähestymistavan testaukseen ja mihin suuntaan he haluavat mennä. Se tuo esiin eroja mielipiteissä yksilöiden ja roolien välillä ja antaa keskustelun aloituspaikan. Kun järjestin tämän harjoituksen tiimille, huomasin, että vastaukset näihin kysymyksiin liittyivät riskinsietokykyyn. Ne, jotka suosivat vähemmän huolellista testausta, olivat yleensä valmiimpia hyväksymään ongelmia tuotannossa.
Riskin tunnistaminen
Jatkaessamme työpajaa pyydä samaa yleisöä pohtimaan, mitä riskejä on ohjelmiston toimittamisessa ja tukemisessa, ja kirjoittamaan yksi riski jokaista tarralappua kohden. Ihmiset saattavat tarvita muistutusta siitä, että keskittyminen on riskiin eikä testauksen toimintoihin, sillä heidän taipumuksensa saattaa olla ilmaista ideat viimeksi mainitussa muodossa. Esimerkiksi sen sijaan, että "ristiselauksetestaus" olisi toimenpide, henkilö voisi kirjoittaa riskin "tuote ei toimi eri alustoilla". Viiden minuutin aivoriihen jälkeen pyydä osallistujia jakamaan tunnistamansa riskit. Kun jokainen riski jaetaan, muut osallistujat voivat nostaa esiin mahdolliset samankaltaiset riskit, jotka on kirjoitettu uudelleen. Näin luodaan listan, joka kattaa 12 erityistä riskiä ja jakautuu laajoihin kategorioihin, kuten toiminnallisuus, koodin yhdistäminen, ristiselauksen yhteensopivuus, alusta- ja käyttöjärjestelmäyhteensopivuus, käyttäjäkokemus, esteettömyys, turvallisuus, suorituskyky, infrastruktuuri, testidatat, vahvistusvinouma ja maine. Täsmällinen näkökulmien monimuotoisuus auttaa luomaan kattavan riskikuvan. On kuitenkin syytä käyttää aikaa verrata omaa listaa ulkopuoliseen resurssiin, kuten James Bachin Heuristinen Riskipohjainen Testaus, joka auttaa laajentamaan ajattelua.
Endtext
Mikä on käyttöliittymäkerroksen merkitys ohjelmistoarkkitehtuurissa ja miten se vaikuttaa käyttäjäkokemukseen?
Miten luoda ja tulkita monivaiheisia malleja monimuuttujamenetelmien avulla?
Miten autamme lintuja talvella: Ruokinta ja ruokailun haasteet

Deutsch
Francais
Nederlands
Svenska
Norsk
Dansk
Suomi
Espanol
Italiano
Portugues
Magyar
Polski
Cestina
Русский