;

ITIL: Kladivo na recesi

27. 11. 2009
Doba čtení: 6 minut

Sdílet

Propouštění či zastavení rozvojových projektů není tím nejlepším lékem pro IT oddělení, které nefunguje zcela efektivně. Dojde k úspoře nákladů, zároveň se ale takové opatření nejspíše projeví v poklesu kvality poskytovaných IT služeb.

ITIL vznikl proto, aby se i ostatní mohli učit či inspirovat od úspěšných a zavedením tohoto rámce mohlo být dosahováno efektivního a účelného využívaní IT zdrojů, které by ve svém důsledku podpořilo cíle, které si vytýčil management organizace. Krásné, ale mnohdy velmi těžce proveditelné, protože jde o běh na dlouhou trať, u kterého je nutné si dobře rozvrhnout síly, znát předpokládanou trasu a své možnosti. Řešení, která hledají podniky v době poklesu poptávky, bývají jen zřídka taková. Přesto lze z ITIL uchopit základní koncept služby a s jeho pomocí zefektivnit fungování podnikové informatiky v rozumném čase.

IT služba

IT služba je ústředním bodem, od kterého se odvíjí vše ostatní. Jedná se o užitek, který IT nabízí a přináší svým zákazníkům – ať už uvnitř či vně podniku. Samozřejmě, pokud je tato IT služba nabízena, tak spotřebovává určité zdroje (lidské, HW, SW, partneři), a to je mnohdy kamenem úrazu současných IT oddělení – neznalost očekávání a požadavků ze strany dalších oddělení a rozpouštění nákladů bez vztahu ke konkrétní IT službě. Výsledkem jsou různé druhy plýtvání se zdroji:

  • Nabízení IT služeb, o které je nízký zájem a ve svém důsledku je jejich užitek (hodnota) nižší, než jsou vynaložené náklady, což vede k „dotování“ a k zakrývání neúspěšných služeb.
  • Nabízení IT služeb, o které je zájem, ale při vztažení relevantních nákladů k dané službě (provoz, školení, změny, údržba, servis, řešení incidentů a problémů atd.) vyjde její ztrátovost.
  • Provoz IT služeb, o kterých uživatel ani neví, že jsou dostupné, čímž dochází k nevyužití kapacit a možností IT služeb. Nevyužité IT zdroje taktéž představují zbytečně vynaložené náklady.
  • Nabízení obdobných IT služeb a konzumace více zdrojů než je třeba, protože selhala komunikace a k uspokojení potřeb mohlo dojít i jen jedinou službou.
  • Využívání IT zdrojů (převážně lidských) na činnosti, které jsou mimo hranice poskytování IT služeb, což pramení z toho, že se přesně neví, za co IT oddělení zodpovídá.

Již při letmém pohledu na výše zmíněných pět bodů je jasné, že vedení evidence nákladů k IT službě může poukázat na nečekané skutečnosti, které by mohly pomoci ke snížení nákladů, bez významného dopadu na provoz podniku.

 

Záruka služby

Další částí, která výrazně promlouvá do rozpočtu IT oddělení, jsou záruky za služby – tedy ukazatele, jako jsou dostupnost, kapacita, bezpečnost a kontinuita IT služby. Záruky mohou být dalším možným zdrojem nehospodárnosti, ať už podnik zažívá konjunkturu či recesi. Jen s tím rozdílem, že když je dostatek peněz, tak to všechno méně bolí.

Když už se tedy IT oddělení podaří nabídnout užitečnou službu, může stále ještě narazit na nepochopení a spory se zákazníkem/uživatelem plynoucí z toho, že záruky nejsou specifikovány, anebo se zdá, že nejsou naplňovány. Většinou je hluboce zakořeněno, že všechny IT služby musejí běžet neustále při plnění nejvyšších záruk – ty jsou v důsledku toho drahé, nehledě na to, že maximální úsilí je věnováno i těm službám, které si to nezaslouží.

Výsledkem je oboustranná frustrace. IT oddělení neví co dříve a zákazník není spokojený s kvalitou, kterou by si představoval. Obchod se nemůže spolehnout, že výpadky budou řešeny s ohledem na případné finanční ztráty plynoucí z nefunkčnosti služby, počítané např. z doby, kdy uživatelé nemohou pracovat, z ceny ušlé zakázky či z nevyužité výrobní kapacity, z hrozícího penále apod.

Hodinová ztráta jednotlivých služeb se tedy může výrazně lišit – i to bývá často opomíjeno. IT oddělení by mělo být schopno provést kalkulaci, kolik by požadovaná záruka stála, a zákazník by měl mít možnost zvolit si úroveň záruk. Toto má dvojí efekt – zákazník má představu, co kolik stojí, a IT oddělení může korigovat nepřiměřená očekávání v oblasti záruk.

 

Evidence a vazby

Ke zdárnému rozklíčování nákladů ke službě je však nutné mít dobrý přehled o tom, co s čím souvisí. Proto existují např. takovéto vazby:

  • služba – HW zařízení, která tuto službu podporují,
  • HW – SW, který je umístěn na daném zařízení,
  • služba – smlouvy (SLA, dodavatelské smlouvy, licence),
  • HW nebo SW – incidenty nebo problémy,
  • problémy – změny (nutné pro jejich odstranění),
  • služba – změny (vyvolány změnou požadavků na ní),
  • služba – uživatelé, kteří danou službu využívají,
  • HW nebo SW – znalosti (dokumentace, školení).

Na základě těchto vazeb lze provést například následující rozbor:

Počet incidentů za období, vztahující se k určitému problému bylo vyřešeno tak, že část řešili pracovníci podpory (délka trvání × hodinová sazba pracovníka) a zbytek specialisté (délka trvání × hodinová sazba specialisty). Tyto náklady jsou vztaženy k určitému zařízení a toto zařízení slouží pro určitou IT službu.

Změna souvisí s nákupem nového zařízení, SW, práce specialistů, zaškolením a to v ceně XY Kč. Ta se pak může porovnávat s očekávaným přínosem pro uživatele, či s náklady (prostoje, penále, ztráty), které jsou vyvolány problémem, jenž způsobuje nefunkčnost služby.

Cyber25

Pokud disponujeme výše zmíněnými informacemi, lze se jasně a konkrétně zaměřit na ty části v infrastruktuře, které vyvolávají nejvíce nákladných incidentů. Lze také identifikovat změny, jejichž náklady převyšují případný přínos.

Máte na výběr, zda jít metodou lékaře, který provede operaci bez potřebných vyšetření a dat a poté čeká, co to s pacientem udělá, nebo má přesné informace o bolavých místech pacienta a ty se snaží dát do pořádku, třeba i redukční dietou, aniž by to zanechalo velké následky na jeho výkonnosti a duševním zdraví.

'; document.getElementById('preroll-iframe').onload = function () { setupIframe(); } prerollContainer = document.getElementsByClassName('preroll-container-iframe')[0]; } function setupIframe() { prerollDocument = document.getElementById('preroll-iframe').contentWindow.document; let el = prerollDocument.createElement('style'); prerollDocument.head.appendChild(el); el.innerText = "#adContainer>div:nth-of-type(1),#adContainer>div:nth-of-type(1) > iframe { width: 99% !important;height: 99% !important;max-width: 100%;}#videoContent,body{ width:100vw;height:100vh}body{ font-family:'Helvetica Neue',Arial,sans-serif}#videoContent{ overflow:hidden;background:#000}#adMuteBtn{ width:35px;height:35px;border:0;background:0 0;display:none;position:absolute;fill:rgba(230,230,230,1);bottom:20px;right:25px}"; videoContent = prerollDocument.getElementById('contentElement'); videoContent.style.display = 'none'; videoContent.volume = 1; videoContent.muted = false; const playPromise = videoContent.play(); if (playPromise !== undefined) { playPromise.then(function () { console.log('PREROLL sound allowed'); // setUpIMA(true); videoContent.volume = 1; videoContent.muted = false; setUpIMA(); }).catch(function () { console.log('PREROLL sound forbidden'); videoContent.volume = 0; videoContent.muted = true; setUpIMA(); }); } } function setupDimensions() { prerollWidth = Math.min(iinfoPrerollPosition.offsetWidth, 480); prerollHeight = Math.min(iinfoPrerollPosition.offsetHeight, 320); } function setUpIMA() { google.ima.settings.setDisableCustomPlaybackForIOS10Plus(true); google.ima.settings.setLocale('cs'); google.ima.settings.setNumRedirects(10); // Create the ad display container. createAdDisplayContainer(); // Create ads loader. adsLoader = new google.ima.AdsLoader(adDisplayContainer); // Listen and respond to ads loaded and error events. adsLoader.addEventListener( google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, onAdsManagerLoaded, false); adsLoader.addEventListener( google.ima.AdErrorEvent.Type.AD_ERROR, onAdError, false); // An event listener to tell the SDK that our content video // is completed so the SDK can play any post-roll ads. const contentEndedListener = function () { adsLoader.contentComplete(); }; videoContent.onended = contentEndedListener; // Request video ads. const adsRequest = new google.ima.AdsRequest(); adsRequest.adTagUrl = iinfoVastUrls[iinfoVastUrlIndex]; console.log('Preroll advert: ' + iinfoVastUrls[iinfoVastUrlIndex]); videoContent.muted = false; videoContent.volume = 1; // Specify the linear and nonlinear slot sizes. This helps the SDK to // select the correct creative if multiple are returned. // adsRequest.linearAdSlotWidth = prerollWidth; // adsRequest.linearAdSlotHeight = prerollHeight; adsRequest.nonLinearAdSlotWidth = 0; adsRequest.nonLinearAdSlotHeight = 0; adsLoader.requestAds(adsRequest); } function createAdDisplayContainer() { // We assume the adContainer is the DOM id of the element that will house // the ads. prerollDocument.getElementById('videoContent').style.display = 'none'; adDisplayContainer = new google.ima.AdDisplayContainer( prerollDocument.getElementById('adContainer'), videoContent); } function unmutePrerollAdvert() { adVolume = !adVolume; if (adVolume) { adsManager.setVolume(0.3); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } else { adsManager.setVolume(0); prerollDocument.getElementById('adMuteBtn').innerHTML = ''; } } function onAdsManagerLoaded(adsManagerLoadedEvent) { // Get the ads manager. const adsRenderingSettings = new google.ima.AdsRenderingSettings(); adsRenderingSettings.restoreCustomPlaybackStateOnAdBreakComplete = true; adsRenderingSettings.loadVideoTimeout = 12000; // videoContent should be set to the content video element. adsManager = adsManagerLoadedEvent.getAdsManager(videoContent, adsRenderingSettings); // Add listeners to the required events. adsManager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, onAdError); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED, onContentPauseRequested); adsManager.addEventListener( google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED, onContentResumeRequested); adsManager.addEventListener( google.ima.AdEvent.Type.ALL_ADS_COMPLETED, onAdEvent); // Listen to any additional events, if necessary. adsManager.addEventListener(google.ima.AdEvent.Type.LOADED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.STARTED, onAdEvent); adsManager.addEventListener(google.ima.AdEvent.Type.COMPLETE, onAdEvent); playAds(); } function playAds() { // Initialize the container. Must be done through a user action on mobile // devices. videoContent.load(); adDisplayContainer.initialize(); // setupDimensions(); try { // Initialize the ads manager. Ad rules playlist will start at this time. adsManager.init(1920, 1080, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will // start at this time; the call will be ignored for ad rules. adsManager.start(); // window.addEventListener('resize', function (event) { // if (adsManager) { // setupDimensions(); // adsManager.resize(prerollWidth, prerollHeight, google.ima.ViewMode.NORMAL); // } // }); } catch (adError) { // An error may be thrown if there was a problem with the VAST response. // videoContent.play(); } } function onAdEvent(adEvent) { const ad = adEvent.getAd(); console.log('Preroll event: ' + adEvent.type); switch (adEvent.type) { case google.ima.AdEvent.Type.LOADED: if (!ad.isLinear()) { videoContent.play(); } prerollDocument.getElementById('adContainer').style.width = '100%'; prerollDocument.getElementById('adContainer').style.maxWidth = '640px'; prerollDocument.getElementById('adContainer').style.height = '360px'; break; case google.ima.AdEvent.Type.STARTED: window.addEventListener('scroll', onActiveView); if (ad.isLinear()) { intervalTimer = setInterval( function () { // Example: const remainingTime = adsManager.getRemainingTime(); // adsManager.pause(); }, 300); // every 300ms } prerollDocument.getElementById('adMuteBtn').style.display = 'block'; break; case google.ima.AdEvent.Type.ALL_ADS_COMPLETED: if (ad.isLinear()) { clearInterval(intervalTimer); } if (prerollLastError === 303) { playYtVideo(); } break; case google.ima.AdEvent.Type.COMPLETE: if (ad.isLinear()) { clearInterval(intervalTimer); } playYtVideo(); break; } } function onAdError(adErrorEvent) { console.log(adErrorEvent.getError()); prerollLastError = adErrorEvent.getError().getErrorCode(); if (!loadNext()) { playYtVideo(); } } function loadNext() { iinfoVastUrlIndex++; if (iinfoVastUrlIndex < iinfoVastUrls.length) { iinfoPrerollPosition.remove(); playPrerollAd(); } else { return false; } adVolume = 1; return true; } function onContentPauseRequested() { videoContent.pause(); } function onContentResumeRequested() { videoContent.play(); } function onActiveView() { if (prerollContainer) { const containerOffset = prerollContainer.getBoundingClientRect(); const windowHeight = window.innerHeight; if (containerOffset.top < windowHeight/1 && containerOffset.bottom > 0.0) { if (prerollPaused) { adsManager.resume(); prerollPaused = false; } return true; } else { if (!prerollPaused) { adsManager.pause(); prerollPaused = true; } } } return false; } function playYtVideo() { iinfoPrerollPosition.remove(); youtubeIframe.style.display = 'block'; youtubeIframe.src += '&autoplay=1&mute=1'; } }
OSZAR »