Projektipäällikön työ ei ole pelkkää aikataulujen ja Excel-taulukoiden seuraamista

Kirjoittelen näitä ajatuksia projektien vedosta samalla, kun palailen Tanskasta, jossa käytiin uusia raportoinnin tarpeita läpi asiakkaan eri osastojen kanssa.

Monta kertaa mielletään, että projektipäällikön työ on taskitusta ja aikataulun seuraamista ja exceleitten pyörittelyä, eli kustannusten ja työajan seuraamista. On se sitäkin toki.

Nyt olen kuitenkin ehtinyt urallani tapamaan moneen otteeseen erilaisten yritysten erilaisia ammattilaisia. Olen useamman vuoden vetänyt projekteja mm. samalle isolle yritykselle ja sen eri osastojen tarpeisiin. Mukana on ollut niin myyntiä, taloutta, sisäistä laskentaa kuin HR:ääkin, sekä muita vastaavia kokonaisuuksia. Oma kokemukseni on, että työni projektipäällikkönä on enemmänkin ihmisten kohtaamista.

Asia kirkastui tällä matkalla, kun etukäteen mietin, minkälainen yrityskulttuuri ja minkälaisia ihmisiä tehtävien takana on. Alussa aina uusien ihmisten kanssa tuntuu, että puhutaan eri kieltä, vaikka oltaisiin samasta kaupungista. Ei heti täysin ymmärretä, mitkä ovat asiakkaan tarpeet ja mitkä taas toimittajan valitun teknisen ympäristön rajoitteet tai mahdollisuudet.

Kun keskustelut jatkuvat ja yhteistyö syvenee, löytyy se hyvä yhteisymmärrys, jonka päälle on hyvä aloittaa rakentaminen. Siitä hetkestä lähtien useimmiten alkaa paistamaan innostus ja kunkin oma ammattitaito tulee esiin. Sitten puhutaankin jo samaa kieltä!

Ei ole väliä onko vastapuolen osaaja miltä näistä osa-alueista tai mistä maasta. Vastassa on kuitenkin ihminen ja hänen tarpeensa työn tekemisen suhteen. Näissä kun päästään samalle aaltopituudelle, saadaan etsittyä parhaat mahdolliset ratkaisut ja välineet ja päästään toteutukseen. Sitten alkaa toki tuo aikataulutus ja taskien seuranta. Mutta edelleen sen takana on se ihmisten välinen kanssakäyminen. Se on aika avainasemassa tokikin kaikessa asiakastyöskentelyssä, mutta tässä kohtaa jäin miettimään vain tätä projektien vetoa ja sen haasteita.

Tärkeintä on ymmärtää asiakkaan tarpeet ja tuskat päivittäisessä työssä, sekä löytää sieltä ensin ne kuormittavimmat kohdat, joissa päästään auttamaan. Pitää löytää tapa, jolla saadaan vaikkapa myynnistä vastaavan tietotaito ja päässä oleva tietous hyötykäyttöön kaiken sen datan kanssa, jota yritys on eri järjestelmiinsä kerännyt.

Ilman tuota ihmistä ei sillä kaikella datallakaan ole juuri merkitystä. Jonkun pitää osata kertoa, mitkä datat milläkin tavalla esitettynä ovat olennaisimpia. Ja jonkun on sitten siitä esille tuodusta raportista, graafeista tai Power BI- mittaristoista saatava tulkittua päätöstensä tueksi tärkeät tiedot, jotta siitä on hyötyä asiakkaan liiketoiminnalle.

Oiwassa nähdäänkin tärkeänä, että asiakkaan ja Oiwan asiantuntijat istuvat saman pöydän ympärillä eikä vastakkaisilla puolilla pöytää. Näin saadaan, tällä hyvällä porukalla, projektille paras mahdollinen lopputulos.

Juha on Oiwan operatiivinen johtaja ja pitää myös huolta asiakkaan projekteista. Tutustu tarkemmin Juhaan!

Se ihmiselle luettavampi Business Intelligence Markup Language (Biml)

Olen perehtynyt viimeisen parin viikon aikana bimliin eli Business Intelligence Markup Languageen. Biml on Varigencen kehittämä XML-pohjainen merkintäkieli. Biml on hyvin samanluontoinen kuin SSIS-pakettien takaa löytyvä XML, mutta ihmiselle paljon luettavampaa. Biml mahdollistaa SSIS-pakettien, SQL skriptien ja SSAS-kuutioiden kehityksen ohjelmallisesti. Itse perehdyn tässä blogissa SSIS-pakettien kehitykseen.

Jos olet niinkuin minä ja tykkäät mieluummin tehdä kaiken kirjoittaen, kuin hiirellä raahaillen, niin nyt se on myös SSIS-pakettien kohdalla mahdollista. Biml kaikessa yksinkertaisuudessaa on työkalu, jonka avulla voit kirjoittaa SSIS-pakettien sisällön ja näin generoida perinteisen .DTSX -tiedoston.

Bimlillä koodailluun löytyy useampi työkalu. Varigencella on oma maksullinen editori BimlStudio, mutta myös Visual Studiolle on saatavilla lisäosia. Näistä suosituimpia lienevät Varigencen BimlExpress ja open source BI Developer Extensions. Omissa demoissani olen kokeillut vasta BimlExpressiä.

Kuinka sitä käytetään?

BimlExpressin avulla voi lisätä SSIS-projektille biml-tiedostoja. Biml-tiedostoja voi käyttää samaantapaan kuin JavaScript-tiedostoja ja yhdistellä niitä mielen mukaan. Kaikkea ei tarvitse laittaa yhteen tiedostoon vaan esimerkiksi ConnectionStringit voi siirtää omaan "Environment.biml" -tiedostoon. Kun kokonaisuudet on tehty biml-tiedostoihin ne maalaamalla ja hiiren kakkospainiketta painamalla löytyy "Generate SSIS Packages", joka nimensä mukaan generoi biml-tiedostojen määrittelemät DTSX-tiedostot. Eli biml ei pois sulje myöskään perinteistä paketin muokkausta. Bimlin avulla voi yhtä hyvin tehdä paketille pelkän rungon ja käsin muokkaamalla voi pakettiin helposti lisäillä tarvittavat palikat.

Miltä se näyttää?

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection 
            Name="target" 
            ConnectionString="Data Source=localhost;Initial Catalog=Staging;Provider=SQLNCLI11;Integrated Security=SSPI;">
        </OleDbConnection> 
    </Connections>
    <Packages>
        <Package Name="Demo_Package">
            <Tasks>
                <ExecuteSQL Name="Get tables" ConnectionName="target">
                   <DirectInput>
                       SELECT * FROM sys.tables
                   </DirectInput>
                </ExecuteSQL>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Tässä yksinkertainen esimerkki, jossa luodaan paketti nimeltä "Demo_Package", jolla on yksi ExecuteSQL-taski. Kuten esimerkistä huomaa, on tätä XML paljon helpompi lukea verrattuna paketin takaa löytyvään XML. Vielä tässä muodossa biml jää hieman vaisuksi, eikä tuo paljon muuta lisäarvoa kuin hiiren käytön jättämisen. Onneksi tämän ympärille on lisätty ruutia BimlScriptillä.

BimlScript toimii muuten samaantapaan, kuin perinteisempi biml, mutta sen kylkeen voi lisätä C# tai VB koodia. Tämä tekee bimlistä jo paljon houkuttelevamman työkalun, kun pakettien teosta tulee paljon dynaamisempaa.

Kuinkas se sitten toimii?

<#
List<string> tables = new List<string>{
    "sys.schemas",
    "sys.tables",
    "sys.columns"
};
#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <OleDbConnection 
            Name="target" 
            ConnectionString="Data Source=localhost;Initial Catalog=Staging;Provider=SQLNCLI11;Integrated Security=SSPI;">
        </OleDbConnection> 
    </Connections>
    <Packages>
        <Package Name="Demo_Package_v2">
            <Tasks>
                <# foreach (string table in tables) { #>
                    <ExecuteSQL Name="Get <#=table#>" ConnectionName="target">
                        <DirectInput>
                            SELECT * FROM <#=table#>
                        </DirectInput>
                    </ExecuteSQL>
                <# } #>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Lisäämällä XML sekaan "<# #>" -tagit saimme upotettua C# koodia. Näin saimme helposti tehtyä paketin, jossa on kolme ExecuteSQL-taskia joidenka nimet ja kyselyt tulevat dynaamisesti määrittelemästämme listasta.

Mitä tällä saavutetaan?

Mahdollisuuksia on todella paljon. Kaikki itseään toistavat paketit voidaan kirjoittaa parametrisoiduksi BimlScriptiksi ja näin säästetään paljon työaikaa. BimlScript sisältää myös muita mahtavia työkaluja. Esimerkiksi ympäristön toisintaminen, vaikka kehitykseen on todella helppoa.

<# var sourceConnection = RootNode.DbConnections["Source"]; #>
<# var importResults = sourceConnection.GetDatabaseSchema(; #>
<ImportOptions.ExcludeForeignKey | ImportOptions.ExcludeColumnDefault | ImportOptions.ExcludeViews);#>
<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Packages>
        <Package Name="Create tables" ConstraintMode="Linear">
            <Tasks>
                <# foreach (var table in importResults.TableNodes) { #>
                    <ExecuteSQL Name="Create <#=table.Name#>" ConnectionName="Target">
                        <DirectInput><#=table.GetTableSql()#></DirectInput>
                    </ExecuteSQL>
                <# } #>
            </Tasks>
        </Package>
    </Packages>
</Biml>

Oheinen skripti käyttää hyväkseen tietokannan metadatoja. GetDatabaseSchema() tuo tietokannan metadatat käsiteltäviksi objekteiksi. Näin voidaan foreachilla loopittaa kaikki kannan taulut. Foreach-loopin table olio on tyyppiä AstTableNode, jonka metodi GetTableSql() palauttaa SQL-lauseen, joka tarkistaa onko kyseinen taulu jo olemassa ja jos taulu löytyy pudottaa se sen. Tämän jälkeen se luo uuden taulun metadatojen perusteella.

Edellistä esimerkkiä kokeillessani törmäsin yhteen haasteeseen koskien BimlScriptiä. Biml aina loppuviimein käännetään SSIS-paketiksi. Tällöin biml-kääntäjällä tulee olla saatavilla kaikki samat tiedot mitä SSIS-pakettiakin tehtäessä. Eli tietääkseni ei ole mahdollista tehdä pakettia, joka loisi taulut, jos ne puuttuvat ja tämän jälkeen toisi tauluihin testidataa, vaikka tuotannosta, koska tauluja ei välttämättä ole olemassa ennen paketin generoimista. Tällöin ei ole mahdollista tehdä Data Flow Taskissa mappauksia. Tämän pystyy tietysti ohittamaan sillä, että luo eri paketit taulujen luomiselle ja datan viemiselle. Tällöin on mahdollista luoda taulut ennen toisen paketin generointia.

Mitä jatkossa?

Biml tuo toivottua dynaamisuutta ssis-paketteihin. Käyttötarkoituksia ja tapoja on varmasti monia. Itse yritän jatkossa korvata yksinkertaiset taskit BimlScripteillä ja näin haen lisää ymmärrystä kyseisestä työkalusta. Lyhyen tutustumiseni jälkeen löysin myös muutamia blogeja, joissa oli hyviä esimerkkejä. Näihin perehtyessä löytyy varmasti muitakin käyttötarkoituksia ja toimintatapoja.

Tässä pari edellämainituista blogeista: https://www.solisyon.de/biml https://www.cathrinewilhelmsen.net/biml

Eniten informaatiota löytyy BimlScriptin omilta sivuilta.