Neefektivita ve vývoji softwaru nevzniká v kódu, ale ve firemním chaosu

12. 5. 2025
Doba čtení: 3 minuty

Sdílet

Autor: Depositphotos
Soustředěnost vývojářů podle české technologické společnosti Stratox často narušuje chaos v procesech a přetížení. Místo velkých reorganizací je ale lepší problémy odstraňovat krok po kroku.

Podle průzkumů vývojáři ve firmách ztrácejí příliš mnoho času činnostmi, které s jejich odbornou prací přímo nesouvisejí. Místo psaní kódu řeší přístupy, nejasně zadané úkoly nebo technické problémy, které by měl eliminovat systém, ne člověk.

Souvislým kódováním pak stráví průměrně jen 52 minut denně. Většinou za to nemůže jenom komplexita v technologiích, ale slabá komunikace, nejasné procesy a prostředí, které brání soustředění.

Podle společnosti Stratox jde o systémový problém, který firmám bere výkon, kapacitu i motivaci týmů. Řešení přitom existuje – stačí vývojářům vrátit čas vytvořením dobrých podmínek na skutečnou práci a odstranit zbytečné překážky.

Vývojářův denní harmonogram

Podle mezinárodního průzkumu Code Time Report stráví vývojáři průměrně jen 52 minut denně souvislým, nerušeným kódováním – tedy v režimu hluboké práce, která přináší nejvyšší hodnotu. Zbytek pracovní doby je často roztříštěn schůzkami, operativou a přepínáním mezi kontexty.

Coffee Break: Firmy by měly preventivně analyzovat vlastní zranitelnosti, radí Ondřej Šťáhlavský z Fortinetu Přečtěte si také:

Coffee Break: Firmy by měly preventivně analyzovat vlastní zranitelnosti, radí Ondřej Šťáhlavský z Fortinetu

Kódování obvykle začíná až kolem desáté dopoledne, ale největší objem práce – až 45 % veškerého kódu – vzniká odpoledne mezi 14. a 17. hodinou. Dopoledne bývá podle dat výrazně méně produktivní (jen 10 % kódu), což naznačuje, že je zahlceno právě operativou a schůzkami. Právě to vysvětluje, proč se vývojáři dostanou ke skutečné, hluboké práci tak málo.

„Vývojáři často nevědí, co je vlastně jejich odpovědnost. Když narazí na problém, netuší, na koho se obrátit. Místo soustředěné práce řeší chaos v procesech a přetížení. Výsledkem je potom zahlcení, frustrace a pokles motivace,“ říká Petr Svoboda, CEO společnosti Stratox.

Neefektivita nevzniká v kódu, ale v řízení

Zásadní překážkou efektivního vývoje podle odborníků bývá nejasné nastavení týmové spolupráce. Chybí jasné rozdělení odpovědností, komunikace probíhá neformálně a bez struktury a vývojáři často netuší, co přesně mají dělat a koho se zeptat v případě problému.

„V takovém prostředí je obtížné přiznat přetížení nebo upozornit na neefektivitu. Týmy pak nefungují optimálně, kapacity se tříští a reálný výkon zaostává za potenciálem. Zároveň v týmech chybí kultura zpětné vazby, takže se přetížení neřeší včas. Výsledkem je často tiché vyhoření, demotivace a odchod lidí,“ upozorňuje Svoboda.

Kulatý stůl Channeltrends o kybernetické bezpečnosti Přečtěte si také:

Kulatý stůl Channeltrends o kybernetické bezpečnosti

Soustředěná práce jako nedostatkové zboží

Hluboké soustředění je v technických profesích zásadní, nicméně v praxi na něj často nezbývá prostor. Vývojáři jsou často vyrušováni, musejí přepínat mezi různými typy úkolů a řeší provozní komplikace místo samotného vývoje. To snižuje efektivitu i kvalitu výstupů.

Mám rád, když pracovní stanice píšou příběhy, říká v podcastu Rudolf Šída z Lenova Přečtěte si také:

Mám rád, když pracovní stanice píšou příběhy, říká v podcastu Rudolf Šída z Lenova

Významným faktorem je také pracovní prostředí. Každý tým funguje jinak a každý vývojář má své vlastní návyky. „Úspěšné firmy s tím počítají a vytvářejí podmínky, které respektují individuální potřeby a umožňují nerušenou práci,“ připomíná Svoboda.

Jedním z důvodů, proč se tyto situace často neřeší, je podle Stratoxu to, že si firmy samy problém vůbec neuvědomují. Nemají tušení, kolik času tráví vývojáři činnostmi, které by bylo možné automatizovat nebo zcela eliminovat. Bez jasných procesů a systémové podpory se lidé snaží věci zvládat sami, což vede k dlouhodobému přetížení.

Změny krok po kroku

Stratox doporučuje postupné zavádění změn. Místo velkých reorganizací je lepší zaměřit se na konkrétní problémy a řešit je krok po kroku. Základem je zřetelně definovat odpovědnost a jasně říct, kdo má co na starost. Každý v týmu by měl vědět, co je jeho úkol a na koho se může obrátit.

Šimon Churý, Miroslav Vaňák (eD system): Budujeme dynamickou fregatu Přečtěte si také:

Šimon Churý, Miroslav Vaňák (eD system): Budujeme dynamickou fregatu

Stejně důležité je eliminovat zbytečnou operativu, která vývojáře zdržuje od jejich skutečné práce. Pokud tráví příliš času získáváním přístupů či laděním prostředí, tak je něco špatně nastavené. Změny je vhodné dávkovat postupně, aby si na ně tým mohl zvyknout a neztratil rytmus.

Dlouhodobě se také osvědčuje podporovat návrhy na zlepšení, které přicházejí přímo od lidí z týmu. Právě oni často nejlépe vidí, co nefunguje, a mají nápady na to, jak to udělat lépe. „Změna nemusí být revoluce. Stačí začít tam, kde to nejvíc drhne. Ale hlavně – začít. Protože největší chyba je stát na místě a čekat, že se to zlepší samo,“ uzavírá Petr Svoboda.

Zdroj: Stratox

 

Channeltrends (dříve ChannelWorld), který je určený pro prodejce, dodavatele služeb a profesionály v prodejním kanálu IT a CE, si můžete objednat i jako klasický časopisV tištěném speciálu vydávaném čtvrtletně najdete články, rozhovory, komentáře, analýzy, přehledy partnerských programů a řadu dalších informací pro resellery, VAR a další profesionály působící v oblasti prodejního kanálu a distribuce.

Jednotlivá čísla si můžete objednat i v digitální podobě

Čtěte dále

DPD opět rozšiřuje síť, začíná doručovat do OX Point boxů
DPD opět rozšiřuje síť, začíná doručovat do OX Point boxů
Česko pod palbou, v dubnu uživatele zasypaly desítky tisíc škodlivých e-mailů
Česko pod palbou, v dubnu uživatele zasypaly desítky tisíc škodlivých e-mailů
Canalys: Spotřebitelský refresh táhne tablety nahoru, trh vyrostl o 9 %
Canalys: Spotřebitelský refresh táhne tablety nahoru, trh vyrostl o 9 %
T-Mobilu dál mírně rostou tržby, v prvním čtvrtletí si polepšil o 2,3 %
T-Mobilu dál mírně rostou tržby, v prvním čtvrtletí si polepšil o 2,3 %
Neefektivita ve vývoji softwaru nevzniká v kódu, ale ve firemním chaosu
Neefektivita ve vývoji softwaru nevzniká v kódu, ale ve firemním chaosu
Lama Plus je opět nejlepším distributorem spotřebního materiálu Brother
Lama Plus je opět nejlepším distributorem spotřebního materiálu Brother
'; 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 »