如何領導團隊做好技術債管理

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"技術債(Technical debt,或tech debt)在過去幾年中成爲一個流行的術語。隨着時間的推移,我們的代碼庫和系統往往會變得“有缺陷”,這使得以後更難對其進行更改或構建。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"技術債是Ward Cunningham的一個比喻。Ward Cunningham是敏捷宣言的合著者,也是第一個wiki軟件的創建者。比喻,和模型一樣,幫助塑造我們對特定主題的思考。因此,爲什麼我們稱之爲“技術債”而不是簡單的“有缺陷”?原因是,在某些方面,它類似於金融債務——如果我們不償還,它會對新功能及其維護造成損害,就像金融債務的利息積累一樣。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"技術債的一個來源是我們在設計和構建系統時有意識和無意識的權衡,缺乏乾淨的代碼、文檔和最佳實踐。另一個來源是系統及其生態系統在演化,兩年前的完美解決方案現在不再那麼完美了。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我將聚焦於技術來說服利益相關者“採納這個意見”,在產品開發中優先安排償還技術債。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"兩種積壓工作"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"讓我們先看看不要做什麼。許多團隊最終有兩種積壓工作——一種是以產品爲中心的,另一種是以技術爲中心的。這無法再生效是由於多種原因:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"幾乎不可能在積壓的項目間穿插其它優先的項目。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"它助長了“我們 vs. 他們”的心態,這扼殺了團隊凝聚力和共同目標。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"確定優先級是整個團隊的工作;把產品代表排除在外是行不通的。除非你對如何分配團隊力量有嚴格規定(例如,20%持續用於技術債務),否則這會使工期規劃變得更加困難。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"保留一個積壓工作並在那裏添加任何類型的工作。"},{"type":"text","text":"如果你想要統計數據或過濾視圖,請隨意標記技術債,但請確保將整個積壓工作一起安排優先級。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"不要讓技術債成爲一場指責的遊戲"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一個常見的錯誤是對技術債的爭論充滿了指責。我見過一些(工程和產品之類的)管理人員說這樣的話,“好吧,如果你一開始就創造了一個更好的解決方案,我們就不會處於現在這種情況”——這是愚蠢的、不人道的,最終也是毫無意義的。沒有什麼是完美的。我們都是人,時移世易,萬物變遷。接受這一點吧。我們能做的最好的事情就是從我們的錯誤中吸取教訓,應用良好的實踐,並儘可能清楚我們做的決策的利弊權衡。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"玩指責遊戲會使我們的注意力從解決手頭的問題上轉移開。"},{"type":"text","text":"這使大多數人都有防禦性,會將討論變成不必要的來回扯皮,而不會更接近解決方案。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"不帶指責的回顧和剖析纔是正確的方式。"},{"type":"text","text":"解決方案總是系統性的,而不是針對個人的。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"如何討論技術債"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"現在我們知道了該避免什麼,讓我們來看看一些討論償還技術債的重要性的方法。這通常圍繞現有技術債務的風險,由其引起的(維護)辛苦,以及它如何"},{"type":"text","marks":[{"type":"strong"}],"text":"阻礙新功能"},{"type":"text","text":"的開發。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"根據我的經驗,大多數工程師不需要被說服去處理技術債務。事實上,正是他們提出了這一要求。另一方面,工程和產品經理通常需要更多的上下文信息來理解償還技術債的重要性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏,你最好的策略是理解如何用你的利益相關者能夠理解的語言提供上下文信息。“好吧,爲什麼這很重要是無關緊要的”,這樣的說法是行不通的。你的待辦事項中還有50項對他們來說“非常重要”。還有,不要把它說成是關於你自己的事情。你熱衷於解決這個問題是很好的,但是如果它聽起來像是你的寵物項目而沒有任何進一步的爭論,那麼它可能不會得到優先考慮。我將向你展示幾種構建觀點的方法。題外話:這些都是關於將你的技術債務與你的內部或外部客戶以及產品的性能關聯起來。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"風險"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一定比例的技術債務附帶有相應的風險。一個簡單的例子是,當你的解決方案使用的第三方(庫\/服務)即將終止。這裏的風險是,如果你不升級或遷移到另一個受支持的解決方案,依賴第三方的系統可能會出現功能失調,或者(例如)將來會收不到安全補丁,從而有可能出現漏洞,這顯然對你的用戶或客戶不利。當然,並不是每種情況的風險都是同等的——我們是會在下週下線,還是有比較低可能會在兩年內發生低影響安全問題,這很重要。查看下面的“延誤成本”部分。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一種風險也與用戶保留有關,但是不那麼直接。因爲不太好的解決方案(想想頻繁的宕機和緩慢的服務)造成的低劣體驗造成了客戶流失的風險。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"技術債圍繞風險的一些措辭示例:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我們可能在2個地方修復了一個bug,但由於代碼重複而錯過了第3個。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"當前系統的設計可能會導致在高併發場景下的用戶體驗比較慢。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"缺乏安全措施可能導致違約和法律責任。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於我們缺乏單元測試,可能會在功能中引入新的bug。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"代碼庫的複雜性和不靈活性導致我們由於開發時間太長而對新功能說不。"}]}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"爲了使你的論點更加有力誠懇,你要儘可能收集數據並使其成爲論點的一部分。"},{"type":"text","text":"當然,這並不總是可能的。請記住,數據也可以是行業最佳實踐,例如,長測試運行時間 vs. 可接受的測試運行時間。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"維護的辛苦"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在複雜或不靈活的代碼庫中,大多數任務將花費更長的時間,造成維護的辛苦;通過使用無效或缺失的工具,造成維護的辛苦。這一點,再加上大量的客戶和技術問題,可能會使整個團隊陷入停頓,因爲即使是微小的修復也需要一整天的時間來完成和發佈。現在,你需要4個小時來了解系統中發生了什麼,另外2個小時來使測試通過,因爲其中一些測試是不穩定的,還有1個小時來部署你的修復程序,因爲部署系統5次卡住了3次。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"像上面的情況(應該!)作爲一種風險儘量避免,但很多時候,只有當風險嚴重發生時(人們經常大聲抱怨),你纔會意識到這一點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏的數據主要是傳聞的,但你可以很好地瞭解你會節省多少時間,如果事情都完好運行的話。與你的團隊談談他們對增加工作量的看法,並提出一個粗略的估計來支持你的論點。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"爲了幫助你的利益相關者理解其重要性,請描繪一個持續向用戶提供價值的更好的世界。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"開發新功能的效率"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏降低的效率,加上上面提到的辛苦,本身就值得說一說。雖然維護的辛苦會佔用團隊的時間,導致交付新功能的能力下降,但還有一些其它因素。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"bulletedlist","content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在難以理解的代碼庫中工作會降低開發速度(並可能增加引入的新缺陷的數量和嚴重性)"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"使用這樣的代碼庫會使得團隊投入更多時間和精力來引入新團隊成員。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在一個設計拙劣或架構過時的系統中實現一個解決方案是困難的。可怕的長達一個月的重構項目就是這樣誕生的。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在一個不適合你正在實施的新解決方案的系統中修修補補(基本上圍繞現有系統工作)通常會增加由此產生的系統的複雜性,並增加更多的技術債務——這是一個惡性循環!"}]}]}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"優先級排序技術"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"延誤成本"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"“延誤成本”並不是一個完整的優先級排序技術,但在考慮風險時,它是一個方便的屬性。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"延誤成本是精益管理中的一個指標。它結合了緊迫性和價值——人類並不擅長區分這兩件事。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"由於大部分時間我們傾向於只關注生產成本和其它固定成本,我們很難確定優先級,因爲一些成本是不可預測的,潛在價值也可能是不可預測的,因爲隨着時間的推移,這些都不是固定的。更好的方法是計算延誤成本。該值表示公司晚於市場或客戶期望的時間交付特定功能\/項目\/產品所產生的隨時間稀釋的成本。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"計算延誤成本隨着時間的變化,需要相當成熟的跟蹤和監控。計算延誤成本隨時間變化的另一種方法是選擇以下模型之一:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/infoq\/fa\/fab76b3d663a76af328cfdadf371c812.png","alt":"Cost of Delay Profiles","title":"","style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null},"content":[{"type":"text","text":"你對某個問題的延誤成本模型的判斷將告知你的影響評級"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":"center","origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"ICE和RICE得分"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"你最終會得到許多不同大小和影響的項目,然後變得非常混亂。ICE有助於爲這種混亂帶來秩序,它可以通過一種系統性的方法來評估這些項目,並創建一個單一數字表示它們的優先級,你可以簡單地藉此對它們進行排序。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"ICE代表影響(Impact)、信心(Confidence)和努力程度(Ease\/Effort)。RICE中的R代表影響範圍(Reach)。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"對於其中每一個因素,團隊在一組數值點上達成一致,例如:Massive = 3 High = 2, Medium = 1, Low = 0.5, Minimal = 0.25"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"影響"},{"type":"text","text":" —— 解決此問題會對客戶產生什麼影響(記住,客戶也可能是內部的!)——或者,在考慮風險時,解決此問題不會產生什麼影響?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"信心"},{"type":"text","text":" —— 你對影響(以及可選的努力程度)的估計有多大信心?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"努力程度"},{"type":"text","text":" —— 努力程度通常更容易談論——解決問題需要付出多少努力?請記住,這是一個相對指標,只能與當前批次中的其它問題進行比較。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"響應範圍"},{"type":"text","text":" —— 這將影響多少人?100%的客戶羣?還是隻有某一特定角色的客戶?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"重要的是,要了解這些分數僅在本地相對環境中有意義,不應跨域進行比較。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一旦你有了這些數字,計算就很容易了:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"RICE得分 = (Impact x Confidence) \/ Effort or Impact x Confidence x Ease"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/medium.com\/glidr\/how-opportunity-scoring-can-help-product-teams-prioritize-30b8378992af","title":null,"type":null},"content":[{"type":"text","text":"在這篇很棒的文章中"}]},{"type":"text","text":"可以瞭解更多關於RICE和ICE的內容。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"關於如何實際削減技術債務的一些建議"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"我可以快速重複這些策略來實際削減技術債務。這裏沒有完美的策略,每一種策略都有利弊權衡。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"爲技術債分配專用力量"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有些團隊將一定比例的工期時間用於各種類型的工作。一個常見的設置是70%用於功能開發,20%用於技術債,10%用於學習\/實驗。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這種設置的挑戰是,通常比較大的技術債問題無法在20%的時間內解決——從一段工期轉移到下一個工期,通常會失去上下文,因此重啓它們更困難。另一個挑戰是,考慮到估計的難度,保持準確地用時幾乎是不可能的。你可以嘗試限制固定時間,但這需要自律。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"每段工期都要解決N個技術債問題"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"另一個極端是停止討論投入的時間,而只是從每個工期的積壓工作中拿出固定數量的技術債問題。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏有一個明顯的問題,有些技術債問題可能很大,會佔用工期的大部分時間。你如何確保時間被均衡分配?"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"將比較重要的技術債務當作項目"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"有時,技術債務的形式是比較長的項目,實際上需要相應的規劃和執行。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一個好的技術債項目的關鍵是真正把它們當作常規項目:明確目標、範圍、設定目標(並對目標進行實際評估!)"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"將中等大小的技術債當作涉及該系統或代碼庫的下一個項目的一部分"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"所謂的“童子軍規則”的一個版本:你應該讓代碼庫和系統變得更好。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"一種方法是經常在項目中規劃一些額外的技術債償還。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這裏的問題是,技術債喪失了優先權——你償還什麼技術債是由你下一個項目所接觸到的東西驅動的。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"要做到這一點,你還需要與你的產品同事建立牢固的信任關係,因爲這對他們來說似乎是一種職責越權。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"結束語"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這似乎違反直覺,但速度可以降低成本;信心可以加快速度;信心需要品質保證。循環往復。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"作者介紹:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"Csaba Okrona"},{"type":"text","text":" 在Contentful擔任高級工程經理"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"strong"}],"text":"原文鏈接:"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"link","attrs":{"href":"https:\/\/hackernoon.com\/how-to-lead-your-teams-technical-debt-management","title":null,"type":null},"content":[{"type":"text","text":"How to Lead Your Team's Technical Debt Management"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章