Lannisteri uvijek plaćaju svoje dugove. Što je Lannisterov moto? Yuri Boldyrev blati sitnog subkremaljskog blogera Rogersa

Tehnološke prakse upravljanja dugom u jednom timu


Prije otprilike godinu dana naš tim prešao je iz faze brzog rasta značajki u fluidniji razvoj s fokusom na poboljšanje kvalitete. U ovom trenutku naši su proizvodi nakupili primjetnu količinu neoptimalnih rješenja, ružnog koda i zastarjelih biblioteka. Nešto se moralo poduzeti u vezi svega ovoga.


Do danas smo uspjeli izgraditi proces koji borbu protiv tehničkog duga čini predvidljivom, bezbolnom i neizbježnom.


Što smo dobili kao rezultat:

  • Ekipa je sretna. Retrospektiva izdanja redovito uključuje pozitivne točke o poboljšanju tehnologije i smanjenju tehničkog duga.
  • Za nekoliko tromjesečnih izdanja zaredom uspjeli smo povećati funkcionalnost bez povećanja broja redaka koda u projektu. Uklanjanje nepotrebnog koda i pojednostavljenje onoga što je bilo potrebno smanjilo je veličinu baze koda za postojeću funkcionalnost. I ovo smanjenje otprilike se podudaralo u opsegu s novim kodom koji implementira novu funkcionalnost.
  • Tijekom refaktoriranja i nadogradnji, proizvod je uvijek u ispravnom stanju. Svaka dva tjedna objavljujemo potpuno radno privremeno izdanje.

Reći ću vam kako smo to postigli.

Što je tehnički dug

Moja radna definicija tehničkog duga je količina posla koji je potrebno obaviti kako bi projekt ispunio viziju tima o tome što je sjajno. Imajte na umu da tehnički dug može nastati ne samo zbog liberalne upotrebe štaka u razvoju, već i zbog promjene ideja o ljepoti. Na primjer, promijenile su se uobičajene industrijske prakse. Ili su programeri odljubili OOP i zaljubili se u funkcionalno programiranje. Ili nekad pomodni okvir više nije kolač i postalo je teško pronaći stručnjake koji bi htjeli pisati po njemu.


Međutim, glavni uzrok tehničkog duga je entropija u svoj svojoj raznolikosti. Onemogućeni jedinični testovi, zastarjeli komentari koji su izgubili dodir s kodom, neuspješne arhitektonske odluke, implementacija značajki koje nitko više ne koristi, temelj za budućnost koja nije došla i još puno, puno više.


Iz toga slijedi da je pojava tehničkog duga neizbježna u svakom dugovječnom projektu.

Kada tehnički dug nije problem

Zašto je tehnički dug loš? Povećava troškove daljnjeg razvoja zbog niza čimbenika:

  • Smanjena je brzina implementacije nove funkcionalnosti.
  • Povećava se vjerojatnost regresija prilikom ispravljanja nedostataka.
  • Razvojni proces postaje manje predvidljiv i stoga manje upravljiv.
  • Proces uvođenja novog programera u projekt se produljuje.

Taj se gubitak ponekad naziva "kamate na tehnički dug"


Postoje situacije u kojima su ti gubici jeftiniji od uklanjanja tehničkog duga:

  • Bliži se kraj života projekta. Napomena, ovo nije kraj dodavanja funkcionalnosti, već trenutak kada možete prestati uzalud trošiti programerske napore i na podršku. Ova kategorija također uključuje jednokratne prototipove, jednokratne demo snimke za izložbe itd.
  • Vrijednost vremena razvoja sada je mnogo veća od očekivane u budućnosti. Hitni popravci prema fiksnom roku, startupi kojima ponestaje novca od sljedećeg kruga financiranja itd. U takvim slučajevima, popravljanje tehničkog duga može se odgoditi dok se žar trenutka ne ohladi. Postoje projekti koji ne izlaze iz izvanrednog stanja, ali savjeti iz ovog članka im ipak neće pomoći.

Što učiniti s tehničkim dugom? Neuspjeli pristupi

Pristup br. 1. “Nemamo vremena, priopćenje mora biti predano jučer”

Želja da se pod svaku cijenu ispoštuje sutrašnji rok, a nauštrb brzine razvoja prekosutra.


Ponekad je montažna konstrukcija napravljena od štaka objektivno ispravan izbor. U mojoj praksi to je najjasnije došlo do izražaja prilikom izrade demo verzija za izložbe. Datum održavanja je strogo određen; ako niste stigli na vrijeme za važnu izložbu, sljedeći pokušaj bit će za godinu dana. U tom slučaju možete prikazati proizvod "iz svojih ruku", pažljivo izbjegavajući sve greške. Kao inženjeru, neugodno mi je raditi takve projekte, ali štake u njima su opravdane.


Kada napravite proizvod koji će dugo trajati, sve je drugačije. Poštivanje roka zbog sumnjivih tehničkih rješenja skupo je zadovoljstvo. Ukupni trošak je:

  1. od implementacije same štake,
  2. od njegove naknadne zamjene potpunim rješenjem,
  3. od patnje što ima štaku između prethodnih točaka.

Drugu je točku vrlo lako podcijeniti, a postoji rizik da o trećoj, najskupljoj uopće ne razmišljate.


Kad na konferenciji sretnete tehnološkog vođu s trzavim okom, može se ispostaviti da ga je do ovog stanja dovela noćna mora beskonačnog otklanjanja pogrešaka u dizajnu napravljenom pomoću štaka.


Pristup br. 2. “Da, ovdje moramo sve izbaciti i ponovno napisati”

Što je lošija situacija s tehničkim dugom, to je veće iskušenje da se cijeli projektni kod zakopa i sve se napiše ponovno. Ovo je jedna od klasičnih grešaka koja može ubiti cijeli projekt.


Tema je toliko dobro obrađena u poznatom članku Joela Spolskog da ne vidim smisla iznositi vlastite argumente.

Pristup br. 3. "Refaktorizirat ćemo noću i vikendom kako upravitelj ne bi saznao."

Nije uvijek lako argumentirati potrebu uklanjanja tehničkog duga u smislu poslovnih koristi. Razvojni tim bi mogao biti u iskušenju da zaobiđe grube rubove i započne veliko refaktoriranje na licu mjesta. To se može učiniti u neradno vrijeme, u pauzama između drugih zadataka ili "na repu" drugih zadataka napuhavanjem procjena.


Što je tu loše? Oh, cijela hrpa stvari:

  • Smanjena transparentnost potkopava povjerenje između uprave i tima. Često naknadni pokušaji da se situacija ispravi nametanjem discipline i zatezanjem šarafa dovedu do daljnjeg pogoršanja timskog rada.
  • Ukorijenjena situacija u kojoj su prioriteti tima i uprave u sukobu uzrokuje demotivaciju na obje strane.
  • Plodovi refaktoriranja uključeni su u proizvod na nepredvidive načine i uzrokuju regresijske pogreške tamo gdje se ne očekuju. U svjesnim timovima to dovodi do iznenadnog i neplaniranog opterećenja QA-a. U nesvjesnom ide u proizvodnju i tamo se razgrađuje.

Nakon što tim upotrijebi ovaj recept, menadžmentu počinju trzati oči.

Naši principi

1. Dodajte tehničke zadatke općem zaostatku

Postoji niz obrazaca u životu zadataka u projektima:

  • Zadatak koji nije u zaostatku ima manje šanse da uđe u posao.
  • Zadatak bez jasne formulacije ima manje šanse da uđe u posao.
  • Zadatak koji se ne može procijeniti s visokim stupnjem povjerenja ima manje šanse da uđe u posao.
  • Veliki zadatak čekat će duže u redu nego mali.

Maxim Dorofeev vrlo dobro govori o tim stvarima u svojoj “Empty Inbox Technique”


Kako bi se spriječilo nakupljanje tehničkog duga, rad na njegovom uklanjanju treba dovršiti uzimajući u obzir gore navedena načela.


Svi zadaci, osim onih najmanjih, navedeni su u zaostatku. Na taj način imaju priliku raditi ne samo u slobodno vrijeme, već iu sklopu planiranog posla. Osim toga, takve je zadatke teže potpuno izgubiti iz vida - zaostaci se gledaju češće i pomnije nego TODO-ovi u kodu, komadići papira na monitoru, napuštene wiki stranice, salvete umrljane čajem s dijagramima i drugo izvori informacija.

  • Ako u kodu postoji netrivijalni TODO, on sadrži poveznicu na zadatak u zaostatku. Provjeravamo usklađenost s ovim načelom pri pregledu koda i ne prihvaćamo složene TODO bez referenci.

    Možda iza komentara stoji drama.

    Jednom je uz takav TODO pisalo: “Štaka. Product Owner me natjerao na to. Uklonite što je prije moguće."

  • Kada programer shvati da neko mjesto zahtijeva refaktoriranje, on stvara problem u zaostatku.
  • Kada programer ima želju poboljšati platformu, on kreira zadatak u zaostatku.
  • Dugoročni arhitektonski planovi stavljaju se u zaostatke u obliku zasebnih zadataka čim postoji dovoljno izvjesnosti barem o prvim koracima.

Sve dok su takve promjene jeftine u smislu troškova razvoja i količine potrebnog testiranja, možemo postupno poboljšavati našu bazu kodova bez prekidanja poslovnih ciljeva ili uvođenja dodatnih rizika.

2. Planirajte tehničke priče na temelju poslovnih prioriteta

Ako je drvo palo u šumi, ali ga nitko nije čuo, je li bilo zvuka? Ako postoji loš kod u projektu, ali taj modul nikada neće trebati mijenjati, postoji li tehnički dug?


Vjerujem da kada je programeru neugodno gledati u neki stari modul, to samo po sebi nije veliki problem. Mnogo je gore ono što se događa kada ovom modulu trebate dodati novu funkcionalnost ili proširiti staru. U usporedbi s izmjenama dobro napisanog koda, takvi su zadaci vjerojatniji (i veća je vjerojatnost da će premašiti izvornu procjenu) i sadržavati više grešaka. Ponekad i mnogo više. Kako bismo se zaštitili od ovakvih problema, pokušavamo zakazati refaktoring tako da se izvrši prije pisanja nove funkcionalnosti na istom mjestu.


Ako se promjene funkcionalnosti i refaktoriranja čine malima, mogu se napraviti zajedno. Empirijski odabrana veličina zadatka za koju će ovaj pristup biti optimalan je 3 dana rada za jednog programera ili manje. Kada je jasno da posla ima više, on se dijeli na refactoring uz zadržavanje trenutnog ponašanja i implementaciju nove funkcionalnosti.


Dakle, redoslijed rada na otklanjanju tehničkog duga određen je redoslijedom poslovnih zadataka u zaostatku.


Načelo “poslovnih prioriteta” ima još jednu primjenu. Jedan od uobičajenih problema od kojeg pate programeri koji nastoje dobro pisati je poteškoća u posvećivanju vremena optimiziranju performansi, poboljšanju mogućnosti održavanja ili drugim stvarima koje nisu izravno uključene u radni plan. Gotovo uvijek postoji poslovna potreba za tim poboljšanjima. Tko ne želi da sustav radi brže, stabilnije i da je jeftiniji za održavanje? Sve te prednosti mogu se procijeniti i na temelju te procjene zadaci za poboljšanje mogu se staviti u zaostatak, zajedno sa svim ostalima.


Dakle, ako želite optimizirati performanse, ali umjesto toga morate popraviti još jednu dosadnu grešku, možda jednostavno ne znate kako objasniti prednosti optimizacije na jeziku koji vlasnik proizvoda može razumjeti.

3. Ostavite kod čišćim nego što je bio prije vas

Gotovo svaki kodeks, osim onog koji je napisan nedavno, malo zaostaje za trenutnom idejom ljepote u polju stila i arhitekture. Kada trebate promijeniti kôd kao dio zadatka, smatra se dobrom praksom napraviti sva sigurna poboljšanja koja su moguća u zahvaćenom području. Što bi to moglo biti?

  • Dovođenje modula u trenutni stil.
  • Promjena naziva internih varijabli u razumljivija.
  • Pojednostavite implementaciju uz zadržavanje ponašanja.
  • Lokalna refaktoriranja koja ne uvode promjene velikih razmjera u druge module.

Očekuje se da će ova poboljšanja poboljšati kôd, ali neće značajno povećati troškove razvoja ili testiranja.


Zbog ovog principa, kvaliteta koda se postupno povećava u pozadini, čak i na onim mjestima gdje nisu planirane posebne refaktorizacije. Štoviše, što češće radimo na određenom dijelu sustava, to je kod za taj dio bolji. Lijep kontrast u odnosu na projekte u kojima programer troši najviše vremena na dijelove s najgorim kodom.

4. Što god se dogodilo, sustav mora ostati u ispravnom stanju.

Jedno od osnovnih načela SCRUM-a kaže da bi na kraju svakog sprinta sustav trebao doći u stabilno stanje.


“Do kraja sprinta, dodatak bi trebao biti spreman, što znači da zadovoljava kriterije spremnosti Scrum tima i spreman je za upotrebu. Trebao bi biti spreman za korištenje, bez obzira na odluku vlasnika proizvoda da ga objavi ili odgodi.”

Svaki rad na uklanjanju tehničkog duga obavlja se u skladu s ovim načelom.


Velike transformacije nužno se rastavljaju tako da se svaka pojedinačna etapa može završiti u jednom sprintu. Na primjer, promijenili smo sustav izrade u dvije faze (Angular 1.x: puzanje webpacka, lurking gunđanje)


S VCS-om radimo po principima bliskim klasičnom gitflowu. Razvoj se provodi u granama značajki, tamo se provodi testiranje. Takva grana u pravilu ne traje duže od jednog dvotjednog sprinta. Podružnica koja duže živi gotovo uvijek rezultira dodatnim troškovima.


Naše iskustvo jasno potvrđuje ovaj obrazac. Svaki put kad nismo uspjeli dovršiti veliko refaktoriranje u dva tjedna, bila je to bol i patnja. I što je zadatak bio duži i što je otvorena grana duže živjela, to je posao išao sporije i bilo je više problema.


Potreba da uvijek budete nekoliko koraka od stabilnog izdanja stvara jedan od najtežih i najzanimljivijih inženjerskih problema - pronalaženje optimalne dekompozicije strateških planova. Promjene velikih razmjera mogu se rastaviti na zasebne, neovisne korake. Preporučljivo je početi primati naknade što je ranije moguće. Što se ova raščlamba posla bolje izvede, veće su šanse da se posao dovrši.

Kako izgleda naš proces

Jednom po izdanju radimo detaljan pregled tehničkog zaostatka:

  • Zatvaramo nebitne priče (izgubljene na važnosti, napravljene u sklopu nečeg drugog, duplikati).
  • Ažuriramo opis tamo gdje se promijenila vizija problema.

Kada se poslovne priče pojave na horizontu, radi se tehnička analiza i sve tehničke priče koje bi pomogle u realizaciji povezuju se s poslovnom pričom.


U pripremi za planiranje sprinta:

  • Provjeravamo povezanost tehničkih i poslovnih priča.
  • Sve povezane greške povezujemo s tehničkim pričama koje se mogu jeftino popraviti na istom mjestu.

Kako formirati tehnički dio zaostatka

Kad sam preuzeo ulogu voditelja tima, pitao sam svakog programera i QA koja poboljšanja proizvoda najviše žele napraviti. Većina zahtjeva odnosila se na tehnička poboljšanja platforme i preinake. Kao što je daljnje iskustvo pokazalo, svi ključni tehnički problemi proizvoda bili su uključeni u ovaj set želja. Dakle, ovu praksu možete koristiti za brzo stvaranje tehničkog zaostatka od nule ili dobivanje općenite ideje o stanju tehničkog duga u novom projektu.


Trenutačno popunjavanje zaostataka tehničkim zadacima događa se zbog gore opisanih praksi i ne zahtijeva posebne napore ili analizu. Osim toga, nove ideje za tehničko poboljšanje proizvoda dodane su zaostatku. To radi svaki član tima koji je došao na takvu ideju. Glavna stvar u ovoj fazi je ne izgubiti ideju. Pojašnjenje i određivanje prioriteta događa se kasnije, tijekom planiranja rada.

zaključke

  • Tehnički dug je neizbježan.
  • Za većinu projekata uklanjanje tehničkog duga dobro je ulaganje truda.
  • Ako se tehnički dug ne riješi, brzina razvoja postupno će se približiti nuli.
  • Napast da sve izbacite i ponovno pišete može ubiti ili ozbiljno osakatiti vaš projekt.
  • Prednosti uklanjanja tehničkog duga trebale bi biti uokvirene u smislu poslovnih koristi, inače postoji rizik da će se zadaci stvaranja nove funkcionalnosti uvijek smatrati važnijima.
  • Zadaci za uklanjanje tehničkog duga vrijedni su rješavanja. Takvi se zadaci ne razlikuju od ostalih projektnih zadataka u smislu računovodstva, planiranja i određivanja prioriteta.
  • Redovito se pojavljuju situacije u kojima možete smanjiti tehnički dug i riješiti poslovni problem u isto vrijeme jeftinije nego da to radite zasebno. Ove prilike se moraju iskoristiti.
  • Promišljene i pravovremeno ažurirane konvencije stilova koda i procesi pregleda pomažu usporiti pojavu novih tehničkih dugova.
  • Kratke iteracije korisne su za refaktoriranje koliko i za razvoj nove funkcionalnosti.
  • Tim obično zna gdje je tehnički dug u projektu i koliko je loš. Vrijedno je koristiti ovo znanje pri stvaranju ideje o tehničkom dugu projekta.

U svom odgovoru dotaknut ću se ne samo Velikih kuća, nego i nekih drugih kuća o kojima sam uspio dobiti podatke.

1.Starkey - "Zima dolazi". Znači da su mir i sigurnost privremeni i iluzorni; uvijek treba biti spreman na katastrofe i ratove kako bi se opasnosti dočekalo potpuno naoružano. U Westerosu zima nije samo godišnje doba koje traje godinama, već i simbol teških iskušenja .. I zapravo, ovaj se moto ne tiče samo kuće Starks, već cijele zemlje.

2. Lannisteri- Čini se da kuća Lannister ima dva mota, jedan potvrđuje zastrašujući grb -" Čuj moju graju!", drugi, ekvivalentan izreci, ali zvuči red veličine češće od prvog - " Lannisteri uvijek plaćaju svoje dugove". Prvi moto može se pripisati izravno grbu. Lannisterov grb prikazuje lav rampant- “ričući lav”, a moto “Čujte moju riku” izravno ga nadopunjuje, također je dokaz da je lav kralj zvijeri, a Lannisteri imaju visok položaj u društvu. Izreka "A Lannister uvijek plaća svoje dugove" prvenstveno se povezuje s Iron Bank of Braavos "The Iron Bank will always get what is due." Drugo, "Lannister uvijek plaća svoje dugove" znači da Lannisteri nikada ne zaboravljaju one koji su im pomogli i da Lannisteri nikada ne opraštaju nepravde koje su im učinjene.

3. Baratheon - "Bijesni smo". izvorno je pripadao Durrandonima iz Storm's Enda. Orys Baratheon (izvanbračni brat Aegona I. Osvajača), nakon što je ubio Argilaca Arogantnog, posljednjeg gospodara Olujnih zemalja, usvojio je njegov moto. Ali moto je preveden previše doslovno. Daje logičan prijevod mota" Ljutnja je naš element", uz objašnjenje njegovog značenja" Ljutnja je naš element, što znači: kad nas naljutiš, baciš ribu u more, gdje se dobro osjeća.“To jest, za Baratheone nasilno ispoljavanje emocija na račun hladnog razuma nije porok.

4. Greyjoy - "Ne sijemo"Greyjoyi su uglavnom pirati. Teritorij njihovih zemalja nalazi se na golom kamenju i pijesku. Moto ove kuće je izravna poruka da Greyjoyi ne rade na zemlji (koja zapravo ne postoji). Oni ne siju ništa i ne uzgajaju, pljačkaju one koji imaju ljetinu i plijen, budući da nemaju i ne mogu imati svoj.

5. Targaryen - "Vatra i krv". Targaryenov moto može se tumačiti na dva načina. Prvi - Aegon Osvajač i njegove dvije sestre, na tri zmaja, pokorili su Westeros, što se naziva "s njim i mačem". Druga opcija - (gore spomenuti samoća zalaska sunca) - " Targaryeni su rođeni kao zmajevi, imaju krv drevne Valyrije i zmajeva, kao i bonus imuniteta na vatru i pitome zmajeve. Kad Targaryeni kažu Vatra i krv, podsjećaju one koji su na to odjednom zaboravili."

6. Arryns - "Visok kao čast"S jedne strane, kuća Arryn, po uzoru na Jona Arryna, brinula je o očuvanju časti. Jon se nije mogao zastrašiti niti podmititi. A u zemljama Westerosa bilo je nemoguće pronaći nekoga kome je više bilo stalo do očuvanja časti nego Arrynovi. Ali nakon Jonove smrti, vjerojatno je primjenjivija druga opcija - aristokratska arogancija, prezir prema onima nižeg statusa, kažu, "kamo si ti od nas."

7. Tarly - "Prvi u borbi„Kuća Tarly iznjedrila je mnoge velike ratnike i izvanredne generale, što potvrđuje ovaj moto.

8. Tully - "Obitelj, dužnost, čast"Kuća Tully je prije svega odana svojim obiteljskim vezama. Dužnost i čast dolaze nakon njih, ali obitelj je na prvom mjestu. Kuća Tully je podržala Roba Starka u Ratu pet kraljeva, za što su platili.

9. Martells - "Nepopustljiv, nepopustljiv, nepopustljiv". Uzor ponosa i nefleksibilnosti. Martellovi su jedina kuća koju Targaryeni nisu mogli zauzeti silom. A iz ponašanja likova ove kuće sasvim je očito da su svojeglavi i nepokolebljivi. Ne trebaju im zakonima Gospodara, odobravanjem kraljeva, prepušteni su sami sebi, ali jasno pokazuju da nisu spremni odustati.

10. Tyrell - "Odrastajući, postajemo jači". Moto kuće Tyrell potvrdila je njihova vojska, čija se brojnost nije mogla usporediti ni s jednom vojskom u Westerosu. Tyrellovi su također imali "jastuk" u obliku bogatstva koje su nagomilali. S obzirom da je kaput grb ove kuće prikazuje ružu, s njom se također može povući paralela Od male klice do golemog ružinog grma. Tako su članovi kuće Tyrell, postupno skupljajući snagu, razvijali i jačali svoje pozicije. Međutim, kao i sama Olenna rekao, oni uopće nisu ratnici.

11. Bolton -"Naše su oštrice oštre". Ovaj moto služi prije kao upozorenje neprijateljima (i ne samo) obitelji Bolton. Predstavnici ove kuće imaju sumornu reputaciju; u knjigama su čak nosili ogrtače od ljudske kože i ukrašavali zidove svojih dvoraca s njom. : “Goli čovjek nema tajni, ali odrani čovjek i više od toga.” “Naše su oštrice oštre” - očito može značiti i oštrice za guljenje kože.

12. Mormont - "Ovdje stojimo". Moto, koji je, prema samoti zalaska sunca, također pogrešno preveden na ruski." Ovdje stojimo - može značiti "Ovdje su naše zemlje", što opet znači "Mali, ali ponosni otok koji nikome ne smeta, ali se može definirati sam za sebe. Ovdje su naše zemlje, sjetite se toga kada dođete ovdje, mi će biti upozoren." Ili se može prevesti kao "Na tome stojimo" - što bi bio izravan pokazatelj snage Mormontove tvrdoglavosti"

13. Frey - "Stojimo rame uz rame"Freyevi su cijenili obiteljske veze i nepovredivost ove riječi, što je ono što je odražavao ovaj moto. Odatle je Walder Frey imao neizrecivu kivnost prema Robu Starku, koji je prekršio obećanje da će oženiti njegovu kćer, što je dovelo do tužnih posljedica.

"Lannister uvijek plaća svoje dugove." © FFG ( Jason A. Engle)

"Lannisteri uvijek plaćaju svoje dugove"(Također: "Lanister uvijek plaća svoje dugove" slušajte)) popularna je izreka u Sedam kraljevstava o kući Lannister i omiljeni izraz Tyriona Lannistera. Nije ništa manje poznat od "službenog" mota kuće, "Čuj me kako urlam!" Ovaj izraz ima dvostruko značenje. S jedne strane, to znači da su Lannisterovi, kao najbogatija kuća u državi, uvijek spremni platiti račune i zahvaliti onima koji su im pomogli, ili obećati nagrade u budućnosti - uvijek možete računati na velikodušnost i predanost “lavovi”. Ali ovaj moto ima i drugo, prijeteće značenje: Lannisteri ne zaboravljaju uvrede koje su im nanesene i sigurno će se osvetiti prijestupnicima.

U ustima Cersei Lannister, izreka je zvučala u govoru usmjerenom protiv samog Tyriona - Cersei je optužila svog brata za spletke protiv nje i Joffreya i pokušala ucijeniti zarobljenu Alayu. Kasnije, nakon što se našla na čelu države, Cersei je istim riječima opravdala svoju odluku da prestane plaćati javne dugove Željeznoj banci Braavosa - Lannisteri uvijek plaćaju svoje dugove, a taj će dug prije ili kasnije biti plaćen. Kasnije je spomenula izreku u dijalogu s Balmanom Birchom i Falisom Stokeworth, obećavši im nagradu za njihovu pomoć, a zatim poslala Tyroshija koji ju je pokušao prevariti krvniku uz riječi “Lannisteri plaćaju svoje dugove, a ti ćeš platiti isto."

Tywin Lannister spomenuo je izreku u razgovoru s Tyrionom, opravdavajući potrebu da se Harrenhal da Petyru Baelishu, budući da je on sam to želio. Sam Tyrion odmah je ponovio riječi o dugovima, zahtijevajući nagradu za sebe za svoje usluge kao Ruka. Shae je ponovila izreku, podsjetivši Tyriona na njegovo obećanje da će je vratiti u gradsku kuću. Saznavši za prebjeg Westerlinga Robbu Starku, Tyrion je pomislio da će Tywin sigurno kazniti izdajice, i sjetio se izreke.

Jaime Lannister podsjetio je Urswicka na nju, pokušavajući ga zavesti bogatstvom, a kasnije, izgubivši ruku, ponavljao je izreku u sebi, potičući svoju žeđ za osvetom i želju za životom. Rekao je Brienne od Tartha da ju je spasio od silovanja u znak zahvalnosti za potonuće galije Robina Riegera na početku njihova putovanja, ponovno se prisjećajući te izreke. Kasnije je ponovio te riječi u razgovoru s Varysom, objašnjavajući tako svoju želju da oslobodi Tyriona. Nakon što je uklonio Edmurea Tullya sa skela na zidinama Riverruna, Jaime je pomislio: "Lannisteri plaćaju svoje dugove, a ti si jedini novčić koji mi je ostao."

Sam Edmure Tully prisjetio se te izreke nakon što je saznao da je Rickard Karstark ubio Willema Lannistera i Theona Freya. Roose Bolton, govoreći o svojoj namjeri da napusti Harrenhal i prepusti ga Vargu Howthu, rekao je da "Lannisteri nisu jedini koji plaćaju svoje dugove." Jaime je ponovio izreku kada se opraštao s Hrabrim dječacima na izlasku iz dvorca, nagovještavajući da će im se osvetiti, a zatim je, vrativši se u dvorac po Brienne, iste riječi uputio Vargu Haughtu, rekavši da će dobiti otkupnina i za Jaime i za Brienne

Tehnološke prakse upravljanja dugom u jednom timu


Prije otprilike godinu dana naš tim prešao je iz faze brzog rasta značajki u fluidniji razvoj s fokusom na poboljšanje kvalitete. U ovom trenutku naši su proizvodi nakupili primjetnu količinu neoptimalnih rješenja, ružnog koda i zastarjelih biblioteka. Nešto se moralo poduzeti u vezi svega ovoga.


Do danas smo uspjeli izgraditi proces koji borbu protiv tehničkog duga čini predvidljivom, bezbolnom i neizbježnom.


Što smo dobili kao rezultat:

  • Ekipa je sretna. Retrospektiva izdanja redovito uključuje pozitivne točke o poboljšanju tehnologije i smanjenju tehničkog duga.
  • Za nekoliko tromjesečnih izdanja zaredom uspjeli smo povećati funkcionalnost bez povećanja broja redaka koda u projektu. Uklanjanje nepotrebnog koda i pojednostavljenje onoga što je bilo potrebno smanjilo je veličinu baze koda za postojeću funkcionalnost. I ovo smanjenje otprilike se podudaralo u opsegu s novim kodom koji implementira novu funkcionalnost.
  • Tijekom refaktoriranja i nadogradnji, proizvod je uvijek u ispravnom stanju. Svaka dva tjedna objavljujemo potpuno radno privremeno izdanje.

Reći ću vam kako smo to postigli.

Što je tehnički dug

Moja radna definicija tehničkog duga je količina posla koji je potrebno obaviti kako bi projekt ispunio viziju tima o tome što je sjajno. Imajte na umu da tehnički dug može nastati ne samo zbog liberalne upotrebe štaka u razvoju, već i zbog promjene ideja o ljepoti. Na primjer, promijenile su se uobičajene industrijske prakse. Ili su programeri odljubili OOP i zaljubili se u funkcionalno programiranje. Ili nekad pomodni okvir više nije kolač i postalo je teško pronaći stručnjake koji bi htjeli pisati po njemu.


Međutim, glavni uzrok tehničkog duga je entropija u svoj svojoj raznolikosti. Onemogućeni jedinični testovi, zastarjeli komentari koji su izgubili dodir s kodom, neuspješne arhitektonske odluke, implementacija značajki koje nitko više ne koristi, temelj za budućnost koja nije došla i još puno, puno više.


Iz toga slijedi da je pojava tehničkog duga neizbježna u svakom dugovječnom projektu.

Kada tehnički dug nije problem

Zašto je tehnički dug loš? Povećava troškove daljnjeg razvoja zbog niza čimbenika:

  • Smanjena je brzina implementacije nove funkcionalnosti.
  • Povećava se vjerojatnost regresija prilikom ispravljanja nedostataka.
  • Razvojni proces postaje manje predvidljiv i stoga manje upravljiv.
  • Proces uvođenja novog programera u projekt se produljuje.

Taj se gubitak ponekad naziva "kamate na tehnički dug"


Postoje situacije u kojima su ti gubici jeftiniji od uklanjanja tehničkog duga:

  • Bliži se kraj života projekta. Napomena, ovo nije kraj dodavanja funkcionalnosti, već trenutak kada možete prestati uzalud trošiti programerske napore i na podršku. Ova kategorija također uključuje jednokratne prototipove, jednokratne demo snimke za izložbe itd.
  • Vrijednost vremena razvoja sada je mnogo veća od očekivane u budućnosti. Hitni popravci prema fiksnom roku, startupi kojima ponestaje novca od sljedećeg kruga financiranja itd. U takvim slučajevima, popravljanje tehničkog duga može se odgoditi dok se žar trenutka ne ohladi. Postoje projekti koji ne izlaze iz izvanrednog stanja, ali savjeti iz ovog članka im ipak neće pomoći.

Što učiniti s tehničkim dugom? Neuspjeli pristupi

Pristup br. 1. “Nemamo vremena, priopćenje mora biti predano jučer”

Želja da se pod svaku cijenu ispoštuje sutrašnji rok, a nauštrb brzine razvoja prekosutra.


Ponekad je montažna konstrukcija napravljena od štaka objektivno ispravan izbor. U mojoj praksi to je najjasnije došlo do izražaja prilikom izrade demo verzija za izložbe. Datum održavanja je strogo određen; ako niste stigli na vrijeme za važnu izložbu, sljedeći pokušaj bit će za godinu dana. U tom slučaju možete prikazati proizvod "iz svojih ruku", pažljivo izbjegavajući sve greške. Kao inženjeru, neugodno mi je raditi takve projekte, ali štake u njima su opravdane.


Kada napravite proizvod koji će dugo trajati, sve je drugačije. Poštivanje roka zbog sumnjivih tehničkih rješenja skupo je zadovoljstvo. Ukupni trošak je:

  1. od implementacije same štake,
  2. od njegove naknadne zamjene potpunim rješenjem,
  3. od patnje što ima štaku između prethodnih točaka.

Drugu je točku vrlo lako podcijeniti, a postoji rizik da o trećoj, najskupljoj uopće ne razmišljate.


Kad na konferenciji sretnete tehnološkog vođu s trzavim okom, može se ispostaviti da ga je do ovog stanja dovela noćna mora beskonačnog otklanjanja pogrešaka u dizajnu napravljenom pomoću štaka.


Pristup br. 2. “Da, ovdje moramo sve izbaciti i ponovno napisati”

Što je lošija situacija s tehničkim dugom, to je veće iskušenje da se cijeli projektni kod zakopa i sve se napiše ponovno. Ovo je jedna od klasičnih grešaka koja može ubiti cijeli projekt.


Tema je toliko dobro obrađena u poznatom članku Joela Spolskog da ne vidim smisla iznositi vlastite argumente.

Pristup br. 3. "Refaktorizirat ćemo noću i vikendom kako upravitelj ne bi saznao."

Nije uvijek lako argumentirati potrebu uklanjanja tehničkog duga u smislu poslovnih koristi. Razvojni tim bi mogao biti u iskušenju da zaobiđe grube rubove i započne veliko refaktoriranje na licu mjesta. To se može učiniti u neradno vrijeme, u pauzama između drugih zadataka ili "na repu" drugih zadataka napuhavanjem procjena.


Što je tu loše? Oh, cijela hrpa stvari:

  • Smanjena transparentnost potkopava povjerenje između uprave i tima. Često naknadni pokušaji da se situacija ispravi nametanjem discipline i zatezanjem šarafa dovedu do daljnjeg pogoršanja timskog rada.
  • Ukorijenjena situacija u kojoj su prioriteti tima i uprave u sukobu uzrokuje demotivaciju na obje strane.
  • Plodovi refaktoriranja uključeni su u proizvod na nepredvidive načine i uzrokuju regresijske pogreške tamo gdje se ne očekuju. U svjesnim timovima to dovodi do iznenadnog i neplaniranog opterećenja QA-a. U nesvjesnom ide u proizvodnju i tamo se razgrađuje.

Nakon što tim upotrijebi ovaj recept, menadžmentu počinju trzati oči.

Naši principi

1. Dodajte tehničke zadatke općem zaostatku

Postoji niz obrazaca u životu zadataka u projektima:

  • Zadatak koji nije u zaostatku ima manje šanse da uđe u posao.
  • Zadatak bez jasne formulacije ima manje šanse da uđe u posao.
  • Zadatak koji se ne može procijeniti s visokim stupnjem povjerenja ima manje šanse da uđe u posao.
  • Veliki zadatak čekat će duže u redu nego mali.

Maxim Dorofeev vrlo dobro govori o tim stvarima u svojoj “Empty Inbox Technique”


Kako bi se spriječilo nakupljanje tehničkog duga, rad na njegovom uklanjanju treba dovršiti uzimajući u obzir gore navedena načela.


Svi zadaci, osim onih najmanjih, navedeni su u zaostatku. Na taj način imaju priliku raditi ne samo u slobodno vrijeme, već iu sklopu planiranog posla. Osim toga, takve je zadatke teže potpuno izgubiti iz vida - zaostaci se gledaju češće i pomnije nego TODO-ovi u kodu, komadići papira na monitoru, napuštene wiki stranice, salvete umrljane čajem s dijagramima i drugo izvori informacija.

  • Ako u kodu postoji netrivijalni TODO, on sadrži poveznicu na zadatak u zaostatku. Provjeravamo usklađenost s ovim načelom pri pregledu koda i ne prihvaćamo složene TODO bez referenci.

    Možda iza komentara stoji drama.

    Jednom je uz takav TODO pisalo: “Štaka. Product Owner me natjerao na to. Uklonite što je prije moguće."

  • Kada programer shvati da neko mjesto zahtijeva refaktoriranje, on stvara problem u zaostatku.
  • Kada programer ima želju poboljšati platformu, on kreira zadatak u zaostatku.
  • Dugoročni arhitektonski planovi stavljaju se u zaostatke u obliku zasebnih zadataka čim postoji dovoljno izvjesnosti barem o prvim koracima.

Sve dok su takve promjene jeftine u smislu troškova razvoja i količine potrebnog testiranja, možemo postupno poboljšavati našu bazu kodova bez prekidanja poslovnih ciljeva ili uvođenja dodatnih rizika.

2. Planirajte tehničke priče na temelju poslovnih prioriteta

Ako je drvo palo u šumi, ali ga nitko nije čuo, je li bilo zvuka? Ako postoji loš kod u projektu, ali taj modul nikada neće trebati mijenjati, postoji li tehnički dug?


Vjerujem da kada je programeru neugodno gledati u neki stari modul, to samo po sebi nije veliki problem. Mnogo je gore ono što se događa kada ovom modulu trebate dodati novu funkcionalnost ili proširiti staru. U usporedbi s izmjenama dobro napisanog koda, takvi su zadaci vjerojatniji (i veća je vjerojatnost da će premašiti izvornu procjenu) i sadržavati više grešaka. Ponekad i mnogo više. Kako bismo se zaštitili od ovakvih problema, pokušavamo zakazati refaktoring tako da se izvrši prije pisanja nove funkcionalnosti na istom mjestu.


Ako se promjene funkcionalnosti i refaktoriranja čine malima, mogu se napraviti zajedno. Empirijski odabrana veličina zadatka za koju će ovaj pristup biti optimalan je 3 dana rada za jednog programera ili manje. Kada je jasno da posla ima više, on se dijeli na refactoring uz zadržavanje trenutnog ponašanja i implementaciju nove funkcionalnosti.


Dakle, redoslijed rada na otklanjanju tehničkog duga određen je redoslijedom poslovnih zadataka u zaostatku.


Načelo “poslovnih prioriteta” ima još jednu primjenu. Jedan od uobičajenih problema od kojeg pate programeri koji nastoje dobro pisati je poteškoća u posvećivanju vremena optimiziranju performansi, poboljšanju mogućnosti održavanja ili drugim stvarima koje nisu izravno uključene u radni plan. Gotovo uvijek postoji poslovna potreba za tim poboljšanjima. Tko ne želi da sustav radi brže, stabilnije i da je jeftiniji za održavanje? Sve te prednosti mogu se procijeniti i na temelju te procjene zadaci za poboljšanje mogu se staviti u zaostatak, zajedno sa svim ostalima.


Dakle, ako želite optimizirati performanse, ali umjesto toga morate popraviti još jednu dosadnu grešku, možda jednostavno ne znate kako objasniti prednosti optimizacije na jeziku koji vlasnik proizvoda može razumjeti.

3. Ostavite kod čišćim nego što je bio prije vas

Gotovo svaki kodeks, osim onog koji je napisan nedavno, malo zaostaje za trenutnom idejom ljepote u polju stila i arhitekture. Kada trebate promijeniti kôd kao dio zadatka, smatra se dobrom praksom napraviti sva sigurna poboljšanja koja su moguća u zahvaćenom području. Što bi to moglo biti?

  • Dovođenje modula u trenutni stil.
  • Promjena naziva internih varijabli u razumljivija.
  • Pojednostavite implementaciju uz zadržavanje ponašanja.
  • Lokalna refaktoriranja koja ne uvode promjene velikih razmjera u druge module.

Očekuje se da će ova poboljšanja poboljšati kôd, ali neće značajno povećati troškove razvoja ili testiranja.


Zbog ovog principa, kvaliteta koda se postupno povećava u pozadini, čak i na onim mjestima gdje nisu planirane posebne refaktorizacije. Štoviše, što češće radimo na određenom dijelu sustava, to je kod za taj dio bolji. Lijep kontrast u odnosu na projekte u kojima programer troši najviše vremena na dijelove s najgorim kodom.

4. Što god se dogodilo, sustav mora ostati u ispravnom stanju.

Jedno od osnovnih načela SCRUM-a kaže da bi na kraju svakog sprinta sustav trebao doći u stabilno stanje.


“Do kraja sprinta, dodatak bi trebao biti spreman, što znači da zadovoljava kriterije spremnosti Scrum tima i spreman je za upotrebu. Trebao bi biti spreman za korištenje, bez obzira na odluku vlasnika proizvoda da ga objavi ili odgodi.”

Svaki rad na uklanjanju tehničkog duga obavlja se u skladu s ovim načelom.


Velike transformacije nužno se rastavljaju tako da se svaka pojedinačna etapa može završiti u jednom sprintu. Na primjer, promijenili smo sustav montaže u dvije faze ()


S VCS-om radimo po principima bliskim klasičnom gitflowu. Razvoj se provodi u granama značajki, tamo se provodi testiranje. Takva grana u pravilu ne traje duže od jednog dvotjednog sprinta. Podružnica koja duže živi gotovo uvijek rezultira dodatnim troškovima.


Naše iskustvo jasno potvrđuje ovaj obrazac. Svaki put kad nismo uspjeli dovršiti veliko refaktoriranje u dva tjedna, bila je to bol i patnja. I što je zadatak bio duži i što je otvorena grana duže živjela, to je posao išao sporije i bilo je više problema.


Potreba da uvijek budete nekoliko koraka od stabilnog izdanja stvara jedan od najtežih i najzanimljivijih inženjerskih problema - pronalaženje optimalne dekompozicije strateških planova. Promjene velikih razmjera mogu se rastaviti na zasebne, neovisne korake. Preporučljivo je početi primati naknade što je ranije moguće. Što se ova raščlamba posla bolje izvede, veće su šanse da se posao dovrši.

Kako izgleda naš proces

Jednom po izdanju radimo detaljan pregled tehničkog zaostatka:

  • Zatvaramo nebitne priče (izgubljene na važnosti, napravljene u sklopu nečeg drugog, duplikati).
  • Ažuriramo opis tamo gdje se promijenila vizija problema.

Kada se poslovne priče pojave na horizontu, radi se tehnička analiza i sve tehničke priče koje bi pomogle u realizaciji povezuju se s poslovnom pričom.


U pripremi za planiranje sprinta:

  • Provjeravamo povezanost tehničkih i poslovnih priča.
  • Sve povezane greške povezujemo s tehničkim pričama koje se mogu jeftino popraviti na istom mjestu.

Kako formirati tehnički dio zaostatka

Kad sam preuzeo ulogu voditelja tima, pitao sam svakog programera i QA koja poboljšanja proizvoda najviše žele napraviti. Većina zahtjeva odnosila se na tehnička poboljšanja platforme i preinake. Kao što je daljnje iskustvo pokazalo, svi ključni tehnički problemi proizvoda bili su uključeni u ovaj set želja. Dakle, ovu praksu možete koristiti za brzo stvaranje tehničkog zaostatka od nule ili dobivanje općenite ideje o stanju tehničkog duga u novom projektu.


Trenutačno popunjavanje zaostataka tehničkim zadacima događa se zbog gore opisanih praksi i ne zahtijeva posebne napore ili analizu. Osim toga, nove ideje za tehničko poboljšanje proizvoda dodane su zaostatku. To radi svaki član tima koji je došao na takvu ideju. Glavna stvar u ovoj fazi je ne izgubiti ideju. Pojašnjenje i određivanje prioriteta događa se kasnije, tijekom planiranja rada.

zaključke

  • Tehnički dug je neizbježan.
  • Za većinu projekata uklanjanje tehničkog duga dobro je ulaganje truda.
  • Ako se tehnički dug ne riješi, brzina razvoja postupno će se približiti nuli.
  • Napast da sve izbacite i ponovno pišete može ubiti ili ozbiljno osakatiti vaš projekt.
  • Prednosti uklanjanja tehničkog duga trebale bi biti uokvirene u smislu poslovnih koristi, inače postoji rizik da će se zadaci stvaranja nove funkcionalnosti uvijek smatrati važnijima.
  • Zadaci za uklanjanje tehničkog duga vrijedni su rješavanja. Takvi se zadaci ne razlikuju od ostalih projektnih zadataka u smislu računovodstva, planiranja i određivanja prioriteta.
  • Redovito se pojavljuju situacije u kojima možete smanjiti tehnički dug i riješiti poslovni problem u isto vrijeme jeftinije nego da to radite zasebno. Ove prilike se moraju iskoristiti.
  • Promišljene i pravovremeno ažurirane konvencije stilova koda i procesi pregleda pomažu usporiti pojavu novih tehničkih dugova.
  • Kratke iteracije korisne su za refaktoriranje koliko i za razvoj nove funkcionalnosti.
  • Tim obično zna gdje je tehnički dug u projektu i koliko je loš. Vrijedno je koristiti ovo znanje pri stvaranju ideje o tehničkom dugu projekta.

KATEGORIJE

POPULARNI ČLANCI

2024 “kingad.ru” - ultrazvučni pregled ljudskih organa