Lannisterovci vždy platia svoje dlhy. Aké je motto Lannisterov? Jurij Boldyrev špiní drobného podkremeľského blogera Rogersa

Technologické postupy riadenia dlhu v jednom tíme


Asi pred rokom prešiel náš tím z fázy rýchleho rastu funkcií k plynulejšiemu vývoju so zameraním na zlepšovanie kvality. V tomto bode sa v našich produktoch nahromadilo značné množstvo neoptimálnych riešení, škaredého kódu a zastaraných knižníc. S tým všetkým bolo treba niečo urobiť.


K dnešnému dňu sa nám podarilo vybudovať proces, vďaka ktorému je boj proti technickému dlhu predvídateľný, bezbolestný a nevyhnutný.


Čo sme získali ako výsledok:

  • Tím je spokojný. Retrospektíva vydania pravidelne obsahuje pozitívne body o zlepšovaní technológie a znižovaní technického dlhu.
  • Pri niekoľkých štvrťročných vydaniach za sebou sme dokázali zvýšiť funkčnosť bez zvýšenia počtu riadkov kódu v projekte. Odstránenie nepotrebného kódu a zjednodušenie toho, čo bolo potrebné, znížilo veľkosť kódovej základne pre existujúcu funkčnosť. A toto zníženie sa v rozsahu zhruba zhodovalo s novým kódom implementujúcim novú funkčnosť.
  • Počas refaktorizácie a modernizácie je produkt vždy v prevádzkyschopnom stave. Každé dva týždne vydávame plne funkčné dočasné vydanie.

Poviem vám, ako sme to dosiahli.

Čo je technický dlh

Moja pracovná definícia technického dlhu je množstvo práce, ktorú treba urobiť, aby projekt spĺňal predstavu tímu o tom, čo je skvelé. Všimnite si, že technický dlh môže vzniknúť nielen kvôli liberálnemu používaniu barlí vo vývoji, ale aj kvôli zmene predstáv o kráse. Zmenili sa napríklad bežné priemyselné praktiky. Alebo vývojári prepadli OOP a zamilovali sa do funkčného programovania. Alebo kedysi módny rámec už nie je koláč a je ťažké nájsť špecialistov, ktorí by naň chceli písať.


Hlavnou príčinou technického dlhu je však entropia v celej jej rozmanitosti. Zakázané jednotkové testy, zastarané komentáre, ktoré stratili kontakt s kódom, neúspešné architektonické rozhodnutia, implementácia funkcií, ktoré už nikto nepoužíva, základ pre budúcnosť, ktorá neprišla a mnoho, oveľa viac.


Z toho vyplýva, že výskyt technického dlhu je nevyhnutný v každom dlhodobom projekte.

Keď technický dlh nie je problém

Prečo je technický dlh zlý? Zvyšuje náklady na ďalší vývoj v dôsledku viacerých faktorov:

  • Rýchlosť implementácie novej funkcionality je znížená.
  • Pravdepodobnosť regresií pri oprave defektov sa zvyšuje.
  • Proces vývoja sa stáva menej predvídateľným, a preto menej zvládnuteľným.
  • Proces zavádzania nového developera do projektu sa predlžuje.

Táto strata sa niekedy nazýva „úroky z technického dlhu“


Existujú situácie, keď sú tieto straty lacnejšie ako odstránenie technického dlhu:

  • Blíži sa koniec životnosti projektu. Všimnite si, že toto nie je koniec pridávania funkcií, ale moment, kedy môžete prestať plytvať úsilím programátora na podporu. Do tejto kategórie patria aj jednorazové prototypy, jednorazové ukážky na výstavy atď.
  • Hodnota času vývoja je teraz oveľa vyššia, ako sa očakávalo v budúcnosti. Naliehavé opravy pevného termínu, startupy, ktorým dochádzajú peniaze z ďalšieho kola financovania atď. V takýchto prípadoch môže byť oprava technického dlhu odložená, až kým momentálna teplota nevychladne. Sú projekty, ktoré sa z núdzového stavu nedostanú, no rady z tohto článku im aj tak nepomôžu.

Čo robiť s technickým dlhom? Neúspešné prístupy

Prístup č. 1. „Nemáme čas, vydanie musí byť odoslané včera“

Túžba dodržať zajtrajší termín za každú cenu, na úkor rýchlosti vývoja pozajtra.


Niekedy je objektívne správnou voľbou prefabrikovaná konštrukcia vyrobená z barlí. V mojej praxi sa to najjasnejšie prejavilo pri robení demoverzií na výstavy. Termín podujatia je pevne stanovený, ak ste nestihli dôležitú výstavu, ďalší pokus bude o rok. V takom prípade môžete produkt zobraziť „z vašich rúk“ a opatrne sa vyhnúť všetkým chybám. Ako inžinierovi je pre mňa nepríjemné robiť takéto projekty, ale barličky v nich sú opodstatnené.


Keď vyrobíte produkt, ktorý dlho vydrží, všetko je inak. Dodržať termín kvôli pochybným technickým riešeniam je drahé potešenie. Celková cena je:

  1. od samotnej implementácie barly,
  2. od jeho následnej výmeny za plnohodnotné riešenie,
  3. z utrpenia mať barličku medzi predchádzajúcimi bodmi.

Druhý bod sa dá veľmi ľahko podceniť a hrozí, že na tretí, najdrahší, vôbec nepomyslíte.


Keď na konferencii stretnete technologického lídra s trhavým okom, môže sa ukázať, že do tohto stavu ho priviedla nočná mora nekonečného ladenia dizajnu vyrobeného z barlí.


Prístup č. 2. „Áno, tu musíme všetko vyhodiť a napísať to znova“

Čím horšia je situácia technického dlhu, tým silnejšie je pokušenie pochovať celý kód projektu a napísať všetko znova. Toto je jedna z klasických chýb, ktorá môže zabiť celý projekt.


Táto téma je tak dobre spracovaná v slávnom článku Joela Spolského, že nevidím zmysel v uvádzaní vlastných argumentov.

Prístup č. 3. „Budeme refaktorovať v noci a cez víkendy, aby to manažér nezistil.“

Argumentovať potrebou eliminácie technického dlhu z hľadiska obchodných výhod nie je vždy jednoduché. Vývojový tím môže byť v pokušení obísť drsné hrany a začať rozsiahlu refaktorizáciu na mieste. Dá sa to urobiť počas mimopracovnej doby, v prestávkach medzi inými úlohami alebo „na chvoste“ iných úloh nafúknutím odhadov.


čo je na tom zlé? Oh, veľa vecí:

  • Znížená transparentnosť podkopáva dôveru medzi vedením a tímom. Následné pokusy o nápravu situácie disciplinovanosťou a uťahovaním skrutiek často povedú k ďalšiemu zhoršeniu tímovej práce.
  • Zakorenená situácia, v ktorej sú priority tímu a manažmentu protichodné, spôsobuje demotiváciu na oboch stranách.
  • Plody refaktorizácie sú súčasťou produktu nepredvídateľným spôsobom a spôsobujú regresné chyby tam, kde sa neočakávajú. V uvedomelých tímoch to vedie k náhlemu a neplánovanému zaťaženiu QA. V nevedomí ide do výroby a tam sa pokazí.

Keď tím použije tento recept, oči manažmentu začnú trhať.

Naše zásady

1. Pridajte technické úlohy do všeobecného backlogu

V živote úloh v projektoch existuje niekoľko vzorov:

  • Úloha, ktorá nie je v nevybavených úlohách, má menšiu šancu dostať sa do práce.
  • Úloha bez jasnej formulácie má menšiu šancu dostať sa do práce.
  • Úloha, ktorú nemožno odhadnúť s vysokou mierou istoty, má menšiu šancu dostať sa do práce.
  • Veľká úloha bude čakať vo fronte dlhšie ako malá.

Maxim Dorofeev o týchto veciach veľmi dobre hovorí vo svojej „technike prázdnej schránky“


Aby sa zabránilo hromadeniu technického dlhu, práce na jeho odstránení by sa mali dokončiť s prihliadnutím na zásady uvedené vyššie.


Všetky úlohy, okrem tých najmenších, sú uvedené v backlogu. Majú tak šancu robiť sa nielen vo voľnom čase, ale aj v rámci plánovanej práce. Navyše, takéto úlohy je ťažšie úplne stratiť zo zreteľa – na nevybavené úlohy sa pozerá častejšie a dôkladnejšie ako na TODO v kóde, kúsky papiera na monitore, opustené wiki stránky, od čaju zašpinené obrúsky s diagramami a iné zdrojov informácií.

  • Ak je v kóde netriviálne TODO, obsahuje odkaz na úlohu v backlogu. Kontrolujeme súlad s týmto princípom pri kontrole kódu a neakceptujeme zložité TODO bez referencií.

    Za komentárom môže byť dráma.

    Raz bolo pri takom TODO napísané: „Barla. Prinútil ma k tomu vlastník produktu. Odstráňte čo najskôr."

  • Keď si vývojár uvedomí, že niektoré miesto si vyžaduje refaktorizáciu, vytvorí problém v nevybavených úlohách.
  • Keď má vývojár túžbu vylepšiť platformu, vytvorí úlohu v backlogu.
  • Dlhodobé architektonické plány sa ukladajú do nevybavených úloh vo forme samostatných úloh hneď, ako je dostatočná istota aspoň o prvých krokoch.

Pokiaľ takéto zmeny zostanú lacné z hľadiska nákladov na vývoj a množstva potrebného testovania, môžeme postupne zlepšovať našu kódovú základňu bez prerušenia obchodných cieľov alebo zavádzania ďalších rizík.

2. Plánujte technické príbehy na základe obchodných priorít

Ak v lese spadol strom, no nikto ho nepočul, ozval sa nejaký zvuk? Ak je v projekte zlý kód, ale tento modul nebude potrebné nikdy meniť, existuje technický dlh?


Verím, že keď je programátorovi nepríjemný pohľad na nejaký starý modul, samo o sebe to nie je veľký problém. Oveľa horšie je to, čo sa stane, keď potrebujete pridať novú funkcionalitu do tohto modulu alebo rozšíriť starú. V porovnaní s vykonávaním zmien v dobre napísanom kóde sú takéto úlohy pravdepodobnejšie (a pravdepodobnejšie prekročia pôvodný odhad) a obsahujú viac chýb. Niekedy oveľa viac. Aby sme sa ochránili pred týmito typmi problémov, snažíme sa naplánovať refaktoringy tak, aby boli vykonané pred napísaním novej funkcionality na rovnakom mieste.


Ak sa zmeny funkčnosti a refaktorizácie zdajú malé, možno ich vykonať spoločne. Empiricky zvolená veľkosť úlohy, pre ktorú bude tento prístup optimálny, je 3 dni práce pre jedného vývojára alebo menej. Keď je jasné, že je viac práce, rozdelí sa na refaktoring pri zachovaní súčasného správania a implementáciu novej funkcionality.


Poradie prác na odstránení technického dlhu je teda určené poradím obchodných úloh v nevybavených úlohách.


Princíp „obchodných priorít“ má ďalšie uplatnenie. Jedným z bežných problémov, ktorým trpia vývojári, ktorí sa snažia dobre písať, je problém venovať čas optimalizácii výkonu, zlepšovaniu udržiavateľnosti alebo iným veciam, ktoré nie sú priamo zahrnuté v pracovnom pláne. Tieto vylepšenia takmer vždy potrebujú podniky. Kto by nechcel, aby systém fungoval rýchlejšie, stabilnejšie a jeho údržba bola lacnejšia? Všetky tieto prínosy je možné posúdiť a na základe tohto posúdenia možno zaradiť úlohy na zlepšenie spolu s ostatnými.


Ak teda chcete optimalizovať výkon, no namiesto toho musíte opraviť ďalšiu nudnú chybu, možno jednoducho neviete, ako vysvetliť výhody optimalizácie v jazyku, ktorému produktový vlastník rozumie.

3. Nechajte kód čistejší ako pred vami

Takmer každý kód, okrem toho, ktorý bol napísaný veľmi nedávno, trochu zaostáva za súčasnou myšlienkou krásy v oblasti štýlu a architektúry. Keď potrebujete zmeniť kód ako súčasť úlohy, považuje sa za osvedčený postup vykonať všetky bezpečné vylepšenia, ktoré sú možné v postihnutej oblasti. čo by to mohlo byť?

  • Prenesenie modulov do aktuálneho štýlu.
  • Zmena interných názvov premenných na zrozumiteľnejšie.
  • Zjednodušte implementáciu pri zachovaní správania.
  • Lokálne refaktoringy, ktoré nezavádzajú rozsiahle zmeny do iných modulov.

Očakáva sa, že tieto vylepšenia vylepšia kód, ale výrazne nezvýšia náklady na vývoj alebo testovanie.


Vďaka tomuto princípu sa kvalita kódu postupne zvyšuje na pozadí, a to aj na miestach, kde sa neplánovali samostatné refaktoringy. Navyše, čím častejšie pracujeme na určitej časti systému, tým lepší je kód pre túto časť. Pekný kontrast k projektom, kde vývojár trávi najviac času na častiach s najhorším kódom.

4. Bez ohľadu na to, čo sa stane, systém musí zostať v prevádzkovom stave.

Jeden zo základných princípov SCRUM hovorí, že na konci každého sprintu by mal systém dosiahnuť stabilný stav.


„Na konci sprintu by mal byť prírastok pripravený, čo znamená, že spĺňa kritériá pripravenosti Scrum tímu a je pripravený na použitie. Mal by byť pripravený na použitie bez ohľadu na rozhodnutie produktového vlastníka vydať ho alebo ho odložiť.“

Všetky práce na odstránení technického dlhu sa vykonávajú v súlade s touto zásadou.


Veľké transformácie sú nevyhnutne rozložené tak, že každá jednotlivá etapa môže byť dokončená v jednom sprinte. Napríklad sme zmenili systém zostavovania v dvoch fázach (Angular 1.x: creeping webpack, číhajúci grunt)


S VCS pracujeme podľa princípov blízkych klasickému gitflow. Vývoj prebieha vo funkciách, tam sa testuje. Takáto vetva spravidla netrvá dlhšie ako jeden dvojtýždňový šprint. Pobočka, ktorá žije dlhšie, má takmer vždy za následok dodatočné náklady.


Naše skúsenosti tento vzorec jednoznačne potvrdzujú. Zakaždým, keď sa nám nepodarilo dokončiť veľký refaktoring za dva týždne, bola to bolesť a utrpenie. A čím dlhšia bola úloha a čím dlhšie žila otvorená vetva, tým pomalšie práca išla a tým viac problémov bolo.


Potreba byť vždy pár krokov od stabilného vydania vytvára jeden z najťažších a najzaujímavejších inžinierskych problémov – nájdenie optimálneho rozkladu strategických plánov. Rozsiahle zmeny možno rozdeliť do samostatných, nezávislých krokov. Odporúča sa začať poberať dávky čo najskôr. Čím lepšie sa toto rozdelenie práce vykoná, tým väčšia je šanca na dokončenie úlohy.

Ako vyzerá náš proces

Raz za vydanie vykonáme podrobnú kontrolu technického backlogu:

  • Irelevantné príbehy zatvárame (stratené relevantné, vytvorené ako súčasť niečoho iného, ​​duplikáty).
  • Aktualizujeme popis, kde sa zmenila vízia problematiky.

Keď sa obchodné príbehy objavia na obzore, vykoná sa technická analýza a všetky technické príbehy, ktoré by pomohli pri implementácii, sú spojené s obchodným príbehom.


V rámci prípravy na plánovanie sprintu:

  • Kontrolujeme súvislosti medzi technickými a obchodnými príbehmi.
  • Všetky súvisiace chyby spájame s technickými príbehmi, ktoré sa dajú lacno opraviť na rovnakom mieste.

Ako vytvoriť technickú časť nevybavených vecí

Keď som prevzal úlohu vedúceho tímu, spýtal som sa každého vývojára a QA, aké vylepšenia produktu by chceli najviac urobiť. Väčšina požiadaviek sa týkala technických vylepšení platformy a refaktorov. Ako ukázali ďalšie skúsenosti, do tohto súboru prianí boli zahrnuté všetky kľúčové technické problémy produktu. Túto prax teda môžete použiť na rýchle vybudovanie technického nevybavenia od nuly alebo na získanie všeobecnej predstavy o stave technického dlhu v novom projekte.


Súčasné zapĺňanie nevybavených úloh technickými úlohami je spôsobené vyššie opísanými postupmi a nevyžaduje si osobitné úsilie alebo analýzu. Okrem toho sa do backlogu pridávajú nové nápady na technické vylepšenie produktu. Robí to každý člen tímu, ktorý prišiel s takýmto nápadom. Hlavnou vecou v tejto fáze je nestratiť myšlienku. K objasneniu a určeniu priorít dochádza neskôr, počas plánovania práce.

závery

  • Technický dlh je nevyhnutný.
  • Pre väčšinu projektov je odstránenie technického dlhu dobrou investíciou úsilia.
  • Ak sa nebude riešiť technický dlh, rýchlosť vývoja sa bude postupne blížiť k nule.
  • Pokušenie všetko vyhodiť a písať znova môže zabiť alebo vážne ochromiť váš projekt.
  • Výhody odstránenia technického dlhu by mali byť rámcované do obchodných výhod, inak existuje riziko, že úlohy na vytvorenie novej funkcionality budú vždy považované za dôležitejšie.
  • Úlohy na odstránenie technického dlhu sa oplatí zvládnuť. Takéto úlohy sa nelíšia od iných projektových úloh z hľadiska účtovníctva, plánovania a stanovenia priorít.
  • Pravidelne nastávajú situácie, kedy môžete znížiť technický dlh a zároveň vyriešiť obchodný problém lacnejšie, ako keby ste to robili samostatne. Tieto príležitosti treba využiť.
  • Premyslené a včas aktualizované konvencie štýlu kódu a kontrolné procesy pomáhajú spomaliť vznik nových technických dlhov.
  • Krátke iterácie sú rovnako užitočné pre refaktoringy, ako aj pre vývoj nových funkcií.
  • Tím zvyčajne vie, kde je technický dlh v projekte a aký je zlý. Tieto znalosti sa oplatí využiť pri vytváraní predstavy o technickom dlhu projektu.

Vo svojej odpovedi sa dotknem nielen veľkých domov, ale aj niektorých ďalších domov, o ktorých sa mi podarilo získať informácie.

1.Starkey - "Zima sa blíži". Znamená, že mier a bezpečnosť sú dočasné a iluzórne; človek by mal byť vždy pripravený na katastrofy a vojny, aby čelil nebezpečenstvu v plnej zbroji. Vo Westerose je zima nielen obdobím, ktoré trvá roky, ale aj symbolom ťažkých skúšok." A v skutočnosti sa toto motto netýka len rodu Starkovcov, ale celej krajiny.

2. Lannisters- Zdá sa, že rod Lannisterov má dve heslá, jedno potvrdzuje impozantný erb -" Počuj môj rev!", druhé, ekvivalentné prísloviu, ale znie rádovo častejšie ako prvé -" Lannisterovci vždy platia svoje dlhy". Prvé motto možno priradiť priamo k erbu. Lannisterský erb zobrazuje lev nekontrolovateľný- „revúci lev“ a motto „Počuj môj rev“ ho priamo dopĺňa, je tiež dôkazom, že lev je kráľom zvierat a Lannisterovci majú v spoločnosti vysoké postavenie. Príslovie „Lannister vždy platí svoje dlhy“ sa primárne spája s Iron Bank of Braavos „Železná banka vždy dostane, čo má“. Po druhé, „Lannister vždy platí svoje dlhy“ znamená, že Lannisterovci nikdy nezabudnú na tých, ktorí im pomohli, a že Lannisterovci nikdy neodpustia krivdy, ktoré im boli spôsobené.

3. Baratheon - "Sme nahnevaní". pôvodne patril k Durrandonom z Storm's End. Orys Baratheon (nelegitímny brat Aegona I. Dobyvateľa), ktorý zabil Argilaca Arogantného, ​​posledného Pána Búrkových krajín, prijal jeho motto. Ale heslo bolo preložené príliš doslovne. Dáva logický preklad motta" Hnev je náš živel", s vysvetlením jeho významu" Hnev je náš živel, čo znamená: keď nás nahneváš, hodíš rybu do mora, kde sa cíti skvelo.„To znamená, že pre Baratheonov nie je násilné prejavovanie emócií na úkor chladného rozumu zlozvykom.

4. Greyjoy - "Nezasievame"Greyjoyovia sú väčšinou piráti. Územie ich pozemkov sa nachádza na holých skalách a piesku. Mottom tohto domu je priamy odkaz, že Greyjoyovci nepracujú na pozemku (ktorý v skutočnosti neexistuje). Nesievajú čokoľvek a nepestujú, okrádajú tých, čo majú úrodu a kazia, keďže nemajú a nemôžu mať vlastnú.

5. Targaryen - "Oheň a krv". Targaryenské motto možno interpretovať dvoma spôsobmi. Prvý - Aegon Dobyvateľ a jeho dve sestry si na troch drakoch podmanili Westeros, ktorý sa nazýva "s ním a mečom." Druhá možnosť - (vyššie uvedená sunsetsolitude) - " Targaryeni sa narodili ako drak, majú krv starovekej Valýrie a drakov, ako aj bonus imunity voči ohňu a krotkých drakov. Keď Targaryeni hovoria Oheň a krv, pripomínajú tým, ktorí na to zrazu zabudli."

6. Arryns - "Vysoký ako česť"Na jednej strane sa rod Arryn po vzore Jona Arryna staral o zachovanie cti. Jon sa nedal zastrašiť ani podplatiť. A v krajinách Westeros nebolo možné nájsť nikoho, komu by na zachovaní cti záležalo viac ako Arrynovci, ale po Jonovej smrti je pravdepodobne vhodnejšia iná možnosť - aristokratická arogancia, pohŕdanie ľuďmi s nižším postavením, hovoria: "Odkiaľ ste u nás."

7. Tarly - "Prvý v boji„Dom Tarly zrodil mnoho veľkých bojovníkov a vynikajúcich generálov, čo potvrdzuje aj toto motto.

8. Tully - "Rodina, povinnosť, česť"Rod Tully je verný predovšetkým svojim rodinným väzbám. Po nich prichádza povinnosť a česť, ale rodina je na prvom mieste. Rod Tully podporoval Roba Starka vo Vojne piatich kráľov, za čo zaplatil.

9. Martells - "Neústupný, nepoddajný, nepoddajný". Vzor hrdosti a nepružnosti. Martellovci sú jediný dom, ktorý si Targaryeni nemohli vziať násilím. A zo správania postáv tohto domu je úplne zrejmé, že sú svojhlavé a neotrasiteľné. Nepotrebujú zákony lordov, súhlas kráľov, sú sami, ale jasne ukazujú, že nie sú pripravení vzdať sa.

10. Tyrell - "Keď vyrastáme, stávame sa silnejšími". Heslo domu Tyrellovcov potvrdila ich armáda, ktorej počet sa nedal porovnať so žiadnou armádou vo Westerose. Tyrellovci mali aj „vankúš“ v podobe nahromadeného bohatstva. Vzhľadom na to, že kabát ramien tohto domu zobrazuje ružu, dá sa s ňou nakresliť aj paralela Od malého výhonku k obrovskému ružovému kríku Tak si členovia Tyrellovho domu postupne hromadiac sily rozvíjali a upevňovali svoje pozície povedali, že nie sú bojovníci.

11. Bolton -"Naše čepele sú ostré". Toto motto slúži skôr ako výstraha pre nepriateľov (nielen) Boltonovcov. Predstavitelia tohto domu majú pochmúrnu povesť, v knihách dokonca nosili plášte z ľudskej kože a zdobili ňou steny svojich hradov : „Nahý muž nemá žiadne tajomstvá, ale muž s kožou a ešte viac.“ „Naše čepele sú ostré“ – zrejme to môže znamenať aj čepele na sťahovanie mäsa.

12. Mormont - "Tu stojíme". Heslo, ktoré je podľa západu slnka samoty aj nesprávne preložené do ruštiny." Tu stojíme – môže znamenať „Tu sú naše krajiny“, čo zase znamená „Malý, ale hrdý ostrov, ktorý nikoho netrápi, ale dokáže sa definovať sám za seba Tu sú naše krajiny, pamätajte na to, keď sem prídete, my bude varovaný." Alebo to možno preložiť ako „Na tomto stojíme“ – čo by bolo priamym znakom sily Mormontovej tvrdohlavosti."

13. Frey - "Stojíme plece pri pleci"Freyovci si vážili rodinné väzby a nedotknuteľnosť tohto slova, čo odzrkadľovalo aj toto motto. Odtiaľ mal Walder Frey nevýslovnú zášť voči Robovi Starkovi, ktorý porušil svoj sľub oženiť sa s jeho dcérou, čo viedlo k smutným následkom."

"Lannister vždy platí svoje dlhy." © FFG ( Jason A. Engle)

"Lannisteri vždy platia svoje dlhy"(Tiež: "Lannister vždy platí svoje dlhy" počúvajte)) je populárny výrok v Siedmich kráľovstvách o rode Lannisterov a obľúbený výraz Tyriona Lannistera. Nie je o nič menej známe ako „oficiálne“ motto domu: „Počuj ma revať!“ Tento výraz má dvojaký význam. Na jednej strane to znamená, že Lannisterovci ako najbohatší dom v štáte sú vždy pripravení zaplatiť účty a poďakovať tým, ktorí im pomohli, alebo sľúbiť odmeny v budúcnosti - vždy sa môžete spoľahnúť na štedrosť a odhodlanie „levy“. Ale toto motto má aj druhý, hrozivý význam: Lannisterovci nezabúdajú na urážky, ktoré im boli uštedrené, a rozhodne sa previnilcom pomstia.

V ústach Cersei Lannister zaznelo porekadlo v prejave namierenom proti samotnému Tyrionovi – Cersei obvinila svojho brata z intríg proti nej a Joffreymu a pokúsila sa vydierať zajatú Alaya. Neskôr, keď sa Cersei ocitla na čele štátu, použila tie isté slová na zdôvodnenie svojho rozhodnutia prestať platiť verejné dlhy Železnej banke Braavos – Lannisterovci svoje dlhy vždy platia a tento dlh bude skôr či neskôr zaplatený. Neskôr toto príslovie spomenula v dialógu s Balmanom Birchom a Falisou Stokeworthovou, pričom im za pomoc sľúbila odmenu a potom poslala Tyroshi, ktorý sa ju pokúsil oklamať, ku katovi so slovami „Lannisterovci splatia svoje dlhy a vy zaplatíte tiež."

Tywin Lannister spomenul toto príslovie v rozhovore s Tyrionom, čím odôvodnil potrebu dať Harrenhal Petyrovi Baelishovi, keďže si to sám prial. Slová o dlhoch vzápätí zopakoval aj samotný Tyrion a za služby Handa požadoval pre seba odmenu. Shae to slovo zopakovala a pripomenula Tyrionovi jeho sľub, že ju vráti späť do mestského domu. Keď sa Tyrion dozvedel o zbehnutí Westerlingov k Robbovi Starkovi, pomyslel si, že Tywin určite potrestá zradcov, a spomenul si na toto príslovie.

Jaime Lannister ju pripomenul Urswickovi, snažil sa ho zviesť bohatstvom, a keď neskôr prišiel o ruku, zopakoval si toto príslovie, čím podporil svoj smäd po pomste a túžbu žiť. Brienne z Tarthu povedal, že ju zachránil pred znásilnením z vďačnosti za potopenie galeje Robina Riegera na začiatku ich cesty, pričom si opäť pripomenul toto príslovie. Neskôr tieto slová zopakoval v rozhovore s Varysom, čím vysvetlil svoju túžbu oslobodiť Tyriona. Po odstránení Edmura Tullyho z lešenia pri stenách Riverrunu si Jaime pomyslel: „Lannisterovci platia svoje dlhy a ty si jediná minca, ktorá mi zostala.“

Sám Edmure Tully si toto príslovie spomenul, keď sa dozvedel o vražde Willema Lannistera a Theona Freya Rickardom Karstarkom. Roose Bolton, keď hovoril o svojom úmysle opustiť Harrenhal a nechať to na Vargovi Howthovi, povedal: "Lannisterovci nie sú jediní, ktorí platia svoje dlhy." Jaime zopakoval výrok, keď sa pri odchode z hradu lúčil so statočnými chlapcami, pričom naznačil, že sa im pomstí, a potom, keď sa vrátil do hradu za Brienne, adresoval tie isté slová Vargovi Haughtovi a povedal, že dostane výkupné za Jaimeho aj Brienne

Technologické postupy riadenia dlhu v jednom tíme


Asi pred rokom prešiel náš tím z fázy rýchleho rastu funkcií k plynulejšiemu vývoju so zameraním na zlepšovanie kvality. V tomto bode sa v našich produktoch nahromadilo značné množstvo neoptimálnych riešení, škaredého kódu a zastaraných knižníc. S tým všetkým bolo treba niečo urobiť.


K dnešnému dňu sa nám podarilo vybudovať proces, vďaka ktorému je boj proti technickému dlhu predvídateľný, bezbolestný a nevyhnutný.


Čo sme získali ako výsledok:

  • Tím je spokojný. Retrospektíva vydania pravidelne obsahuje pozitívne body o zlepšovaní technológie a znižovaní technického dlhu.
  • Pri niekoľkých štvrťročných vydaniach za sebou sme dokázali zvýšiť funkčnosť bez zvýšenia počtu riadkov kódu v projekte. Odstránenie nepotrebného kódu a zjednodušenie toho, čo bolo potrebné, znížilo veľkosť kódovej základne pre existujúcu funkčnosť. A toto zníženie sa v rozsahu zhruba zhodovalo s novým kódom implementujúcim novú funkčnosť.
  • Počas refaktorizácie a modernizácie je produkt vždy v prevádzkyschopnom stave. Každé dva týždne vydávame plne funkčné dočasné vydanie.

Poviem vám, ako sme to dosiahli.

Čo je technický dlh

Moja pracovná definícia technického dlhu je množstvo práce, ktorú treba urobiť, aby projekt spĺňal predstavu tímu o tom, čo je skvelé. Všimnite si, že technický dlh môže vzniknúť nielen kvôli liberálnemu používaniu barlí vo vývoji, ale aj kvôli zmene predstáv o kráse. Zmenili sa napríklad bežné priemyselné praktiky. Alebo vývojári prepadli OOP a zamilovali sa do funkčného programovania. Alebo kedysi módny rámec už nie je koláč a je ťažké nájsť špecialistov, ktorí by naň chceli písať.


Hlavnou príčinou technického dlhu je však entropia v celej jej rozmanitosti. Zakázané jednotkové testy, zastarané komentáre, ktoré stratili kontakt s kódom, neúspešné architektonické rozhodnutia, implementácia funkcií, ktoré už nikto nepoužíva, základ pre budúcnosť, ktorá neprišla a mnoho, oveľa viac.


Z toho vyplýva, že výskyt technického dlhu je nevyhnutný v každom dlhodobom projekte.

Keď technický dlh nie je problém

Prečo je technický dlh zlý? Zvyšuje náklady na ďalší vývoj v dôsledku viacerých faktorov:

  • Rýchlosť implementácie novej funkcionality je znížená.
  • Pravdepodobnosť regresií pri oprave defektov sa zvyšuje.
  • Proces vývoja sa stáva menej predvídateľným, a preto menej zvládnuteľným.
  • Proces zavádzania nového developera do projektu sa predlžuje.

Táto strata sa niekedy nazýva „úroky z technického dlhu“


Existujú situácie, keď sú tieto straty lacnejšie ako odstránenie technického dlhu:

  • Blíži sa koniec životnosti projektu. Všimnite si, že toto nie je koniec pridávania funkcií, ale moment, kedy môžete prestať plytvať úsilím programátora na podporu. Do tejto kategórie patria aj jednorazové prototypy, jednorazové ukážky na výstavy atď.
  • Hodnota času vývoja je teraz oveľa vyššia, ako sa očakávalo v budúcnosti. Naliehavé opravy pevného termínu, startupy, ktorým dochádzajú peniaze z ďalšieho kola financovania atď. V takýchto prípadoch môže byť oprava technického dlhu odložená, až kým momentálna teplota nevychladne. Sú projekty, ktoré sa z núdzového stavu nedostanú, no rady z tohto článku im aj tak nepomôžu.

Čo robiť s technickým dlhom? Neúspešné prístupy

Prístup č. 1. „Nemáme čas, vydanie musí byť odoslané včera“

Túžba dodržať zajtrajší termín za každú cenu, na úkor rýchlosti vývoja pozajtra.


Niekedy je objektívne správnou voľbou prefabrikovaná konštrukcia vyrobená z barlí. V mojej praxi sa to najjasnejšie prejavilo pri robení demoverzií na výstavy. Termín podujatia je pevne stanovený, ak ste nestihli dôležitú výstavu, ďalší pokus bude o rok. V takom prípade môžete produkt zobraziť „z vašich rúk“ a opatrne sa vyhnúť všetkým chybám. Ako inžinierovi je pre mňa nepríjemné robiť takéto projekty, ale barličky v nich sú opodstatnené.


Keď vyrobíte produkt, ktorý dlho vydrží, všetko je inak. Dodržať termín kvôli pochybným technickým riešeniam je drahé potešenie. Celková cena je:

  1. od samotnej implementácie barly,
  2. od jeho následnej výmeny za plnohodnotné riešenie,
  3. z utrpenia mať barličku medzi predchádzajúcimi bodmi.

Druhý bod sa dá veľmi ľahko podceniť a hrozí, že na tretí, najdrahší, vôbec nepomyslíte.


Keď na konferencii stretnete technologického lídra s trhavým okom, môže sa ukázať, že do tohto stavu ho priviedla nočná mora nekonečného ladenia dizajnu vyrobeného z barlí.


Prístup č. 2. „Áno, tu musíme všetko vyhodiť a napísať to znova“

Čím horšia je situácia technického dlhu, tým silnejšie je pokušenie pochovať celý kód projektu a napísať všetko znova. Toto je jedna z klasických chýb, ktorá môže zabiť celý projekt.


Táto téma je tak dobre spracovaná v slávnom článku Joela Spolského, že nevidím zmysel v uvádzaní vlastných argumentov.

Prístup č. 3. „Budeme refaktorovať v noci a cez víkendy, aby to manažér nezistil.“

Argumentovať potrebou eliminácie technického dlhu z hľadiska obchodných výhod nie je vždy jednoduché. Vývojový tím môže byť v pokušení obísť drsné hrany a začať rozsiahlu refaktorizáciu na mieste. Dá sa to urobiť počas mimopracovnej doby, v prestávkach medzi inými úlohami alebo „na chvoste“ iných úloh nafúknutím odhadov.


čo je na tom zlé? Oh, veľa vecí:

  • Znížená transparentnosť podkopáva dôveru medzi vedením a tímom. Následné pokusy o nápravu situácie disciplinovanosťou a uťahovaním skrutiek často povedú k ďalšiemu zhoršeniu tímovej práce.
  • Zakorenená situácia, v ktorej sú priority tímu a manažmentu protichodné, spôsobuje demotiváciu na oboch stranách.
  • Plody refaktorizácie sú súčasťou produktu nepredvídateľným spôsobom a spôsobujú regresné chyby tam, kde sa neočakávajú. V uvedomelých tímoch to vedie k náhlemu a neplánovanému zaťaženiu QA. V nevedomí ide do výroby a tam sa pokazí.

Keď tím použije tento recept, oči manažmentu začnú trhať.

Naše zásady

1. Pridajte technické úlohy do všeobecného backlogu

V živote úloh v projektoch existuje niekoľko vzorov:

  • Úloha, ktorá nie je v nevybavených úlohách, má menšiu šancu dostať sa do práce.
  • Úloha bez jasnej formulácie má menšiu šancu dostať sa do práce.
  • Úloha, ktorú nemožno odhadnúť s vysokou mierou istoty, má menšiu šancu dostať sa do práce.
  • Veľká úloha bude čakať vo fronte dlhšie ako malá.

Maxim Dorofeev o týchto veciach veľmi dobre hovorí vo svojej „technike prázdnej schránky“


Aby sa zabránilo hromadeniu technického dlhu, práce na jeho odstránení by sa mali dokončiť s prihliadnutím na zásady uvedené vyššie.


Všetky úlohy, okrem tých najmenších, sú uvedené v backlogu. Majú tak šancu robiť sa nielen vo voľnom čase, ale aj v rámci plánovanej práce. Navyše, takéto úlohy je ťažšie úplne stratiť zo zreteľa – na nevybavené úlohy sa pozerá častejšie a dôkladnejšie ako na TODO v kóde, kúsky papiera na monitore, opustené wiki stránky, od čaju zašpinené obrúsky s diagramami a iné zdrojov informácií.

  • Ak je v kóde netriviálne TODO, obsahuje odkaz na úlohu v backlogu. Kontrolujeme súlad s týmto princípom pri kontrole kódu a neakceptujeme zložité TODO bez referencií.

    Za komentárom môže byť dráma.

    Raz bolo pri takom TODO napísané: „Barla. Prinútil ma k tomu vlastník produktu. Odstráňte čo najskôr."

  • Keď si vývojár uvedomí, že niektoré miesto si vyžaduje refaktorizáciu, vytvorí problém v nevybavených úlohách.
  • Keď má vývojár túžbu vylepšiť platformu, vytvorí úlohu v backlogu.
  • Dlhodobé architektonické plány sa ukladajú do nevybavených úloh vo forme samostatných úloh hneď, ako je dostatočná istota aspoň o prvých krokoch.

Pokiaľ takéto zmeny zostanú lacné z hľadiska nákladov na vývoj a množstva potrebného testovania, môžeme postupne zlepšovať našu kódovú základňu bez prerušenia obchodných cieľov alebo zavádzania ďalších rizík.

2. Plánujte technické príbehy na základe obchodných priorít

Ak v lese spadol strom, no nikto ho nepočul, ozval sa nejaký zvuk? Ak je v projekte zlý kód, ale tento modul nebude potrebné nikdy meniť, existuje technický dlh?


Verím, že keď je programátorovi nepríjemný pohľad na nejaký starý modul, samo o sebe to nie je veľký problém. Oveľa horšie je to, čo sa stane, keď potrebujete pridať novú funkcionalitu do tohto modulu alebo rozšíriť starú. V porovnaní s vykonávaním zmien v dobre napísanom kóde sú takéto úlohy pravdepodobnejšie (a pravdepodobnejšie prekročia pôvodný odhad) a obsahujú viac chýb. Niekedy oveľa viac. Aby sme sa ochránili pred týmito typmi problémov, snažíme sa naplánovať refaktoringy tak, aby boli vykonané pred napísaním novej funkcionality na rovnakom mieste.


Ak sa zmeny funkčnosti a refaktorizácie zdajú malé, možno ich vykonať spoločne. Empiricky zvolená veľkosť úlohy, pre ktorú bude tento prístup optimálny, je 3 dni práce pre jedného vývojára alebo menej. Keď je jasné, že je viac práce, rozdelí sa na refaktoring pri zachovaní súčasného správania a implementáciu novej funkcionality.


Poradie prác na odstránení technického dlhu je teda určené poradím obchodných úloh v nevybavených úlohách.


Princíp „obchodných priorít“ má ďalšie uplatnenie. Jedným z bežných problémov, ktorým trpia vývojári, ktorí sa snažia dobre písať, je problém venovať čas optimalizácii výkonu, zlepšovaniu udržiavateľnosti alebo iným veciam, ktoré nie sú priamo zahrnuté v pracovnom pláne. Tieto vylepšenia takmer vždy potrebujú podniky. Kto by nechcel, aby systém fungoval rýchlejšie, stabilnejšie a jeho údržba bola lacnejšia? Všetky tieto prínosy je možné posúdiť a na základe tohto posúdenia možno zaradiť úlohy na zlepšenie spolu s ostatnými.


Ak teda chcete optimalizovať výkon, no namiesto toho musíte opraviť ďalšiu nudnú chybu, možno jednoducho neviete, ako vysvetliť výhody optimalizácie v jazyku, ktorému produktový vlastník rozumie.

3. Nechajte kód čistejší ako pred vami

Takmer každý kód, okrem toho, ktorý bol napísaný veľmi nedávno, trochu zaostáva za súčasnou myšlienkou krásy v oblasti štýlu a architektúry. Keď potrebujete zmeniť kód ako súčasť úlohy, považuje sa za osvedčený postup vykonať všetky bezpečné vylepšenia, ktoré sú možné v postihnutej oblasti. čo by to mohlo byť?

  • Prenesenie modulov do aktuálneho štýlu.
  • Zmena interných názvov premenných na zrozumiteľnejšie.
  • Zjednodušte implementáciu pri zachovaní správania.
  • Lokálne refaktoringy, ktoré nezavádzajú rozsiahle zmeny do iných modulov.

Očakáva sa, že tieto vylepšenia vylepšia kód, ale výrazne nezvýšia náklady na vývoj alebo testovanie.


Vďaka tomuto princípu sa kvalita kódu postupne zvyšuje na pozadí, a to aj na miestach, kde sa neplánovali samostatné refaktoringy. Navyše, čím častejšie pracujeme na určitej časti systému, tým lepší je kód pre túto časť. Pekný kontrast k projektom, kde vývojár trávi najviac času na častiach s najhorším kódom.

4. Bez ohľadu na to, čo sa stane, systém musí zostať v prevádzkovom stave.

Jeden zo základných princípov SCRUM hovorí, že na konci každého sprintu by mal systém dosiahnuť stabilný stav.


„Na konci sprintu by mal byť prírastok pripravený, čo znamená, že spĺňa kritériá pripravenosti Scrum tímu a je pripravený na použitie. Mal by byť pripravený na použitie bez ohľadu na rozhodnutie produktového vlastníka vydať ho alebo ho odložiť.“

Všetky práce na odstránení technického dlhu sa vykonávajú v súlade s touto zásadou.


Veľké transformácie sú nevyhnutne rozložené tak, že každá jednotlivá etapa môže byť dokončená v jednom sprinte. Napríklad sme zmenili montážny systém v dvoch fázach ()


S VCS pracujeme podľa princípov blízkych klasickému gitflow. Vývoj prebieha vo funkciách, tam sa testuje. Takáto vetva spravidla netrvá dlhšie ako jeden dvojtýždňový šprint. Pobočka, ktorá žije dlhšie, má takmer vždy za následok dodatočné náklady.


Naše skúsenosti tento vzorec jednoznačne potvrdzujú. Zakaždým, keď sa nám nepodarilo dokončiť veľký refaktoring za dva týždne, bola to bolesť a utrpenie. A čím dlhšia bola úloha a čím dlhšie žila otvorená vetva, tým pomalšie práca išla a tým viac problémov bolo.


Potreba byť vždy pár krokov od stabilného vydania vytvára jeden z najťažších a najzaujímavejších inžinierskych problémov – nájdenie optimálneho rozkladu strategických plánov. Rozsiahle zmeny možno rozdeliť do samostatných, nezávislých krokov. Odporúča sa začať poberať dávky čo najskôr. Čím lepšie sa toto rozdelenie práce vykoná, tým väčšia je šanca na dokončenie úlohy.

Ako vyzerá náš proces

Raz za vydanie vykonáme podrobnú kontrolu technického backlogu:

  • Irelevantné príbehy zatvárame (stratené relevantné, vytvorené ako súčasť niečoho iného, ​​duplikáty).
  • Aktualizujeme popis, kde sa zmenila vízia problematiky.

Keď sa obchodné príbehy objavia na obzore, vykoná sa technická analýza a všetky technické príbehy, ktoré by pomohli pri implementácii, sú spojené s obchodným príbehom.


V rámci prípravy na plánovanie sprintu:

  • Kontrolujeme súvislosti medzi technickými a obchodnými príbehmi.
  • Všetky súvisiace chyby spájame s technickými príbehmi, ktoré sa dajú lacno opraviť na rovnakom mieste.

Ako vytvoriť technickú časť nevybavených vecí

Keď som prevzal úlohu vedúceho tímu, spýtal som sa každého vývojára a QA, aké vylepšenia produktu by chceli najviac urobiť. Väčšina požiadaviek sa týkala technických vylepšení platformy a refaktorov. Ako ukázali ďalšie skúsenosti, do tohto súboru prianí boli zahrnuté všetky kľúčové technické problémy produktu. Túto prax teda môžete použiť na rýchle vybudovanie technického nevybavenia od nuly alebo na získanie všeobecnej predstavy o stave technického dlhu v novom projekte.


Súčasné zapĺňanie nevybavených úloh technickými úlohami je spôsobené vyššie opísanými postupmi a nevyžaduje si osobitné úsilie alebo analýzu. Okrem toho sa do backlogu pridávajú nové nápady na technické vylepšenie produktu. Robí to každý člen tímu, ktorý prišiel s takýmto nápadom. Hlavnou vecou v tejto fáze je nestratiť myšlienku. K objasneniu a určeniu priorít dochádza neskôr, počas plánovania práce.

závery

  • Technický dlh je nevyhnutný.
  • Pre väčšinu projektov je odstránenie technického dlhu dobrou investíciou úsilia.
  • Ak sa nebude riešiť technický dlh, rýchlosť vývoja sa bude postupne blížiť k nule.
  • Pokušenie všetko vyhodiť a písať znova môže zabiť alebo vážne ochromiť váš projekt.
  • Výhody odstránenia technického dlhu by mali byť rámcované do obchodných výhod, inak existuje riziko, že úlohy na vytvorenie novej funkcionality budú vždy považované za dôležitejšie.
  • Úlohy na odstránenie technického dlhu sa oplatí zvládnuť. Takéto úlohy sa nelíšia od iných projektových úloh z hľadiska účtovníctva, plánovania a stanovenia priorít.
  • Pravidelne nastávajú situácie, kedy môžete znížiť technický dlh a zároveň vyriešiť obchodný problém lacnejšie, ako keby ste to robili samostatne. Tieto príležitosti treba využiť.
  • Premyslené a včas aktualizované konvencie štýlu kódu a kontrolné procesy pomáhajú spomaliť vznik nových technických dlhov.
  • Krátke iterácie sú rovnako užitočné pre refaktoringy, ako aj pre vývoj nových funkcií.
  • Tím zvyčajne vie, kde je technický dlh v projekte a aký je zlý. Tieto znalosti sa oplatí využiť pri vytváraní predstavy o technickom dlhu projektu.

KATEGÓRIE

POPULÁRNE ČLÁNKY

2024 „kingad.ru“ - ultrazvukové vyšetrenie ľudských orgánov