技術債管理的七大挑戰

{"type":"doc","content":[{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"blockquote","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","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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/7a\/9c\/7a98a93d16699f02aa1bd70c1f5c649c.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":"link","attrs":{"href":"https:\/\/medium.com\/mobile-app-development-publication\/scaling-mobile-development-365cab84781e","title":"","type":null},"content":[{"type":"text","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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/d8\/e4\/d81cba3b0b9388167c13d1fd79fc18e4.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰1:團隊的邊界"}]},{"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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/16\/eb\/16e53a924c785a5d3b5ac6996647b4eb.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/0f\/b4\/0f5410fe30b33c78100318c5c698c5b4.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":3},"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","text":"隨着時間的推移,核心團隊的能力也會提升,它可以接手更多職責。它可以抽象出跨各個特性團隊通用的組件,並從那裏開始延伸出去。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰2:靈活性與一致性"}]},{"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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/52\/8c\/52d7e721426a1ce5a79bbbbe609f188c.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":"這種方法有很多收益,特性團隊無需自己實現通用代碼就可以享受它帶來的種種好處。以上面這張簡圖所示,依賴項1、2和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","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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/e8\/ab\/e83d24bda85c2bfbcb8aa8c7b5e035ab.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":3},"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","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":"至於“有用的實用程序”,這些工具可以是團隊能輕鬆採用的通用UI組件,讓他們無需創建新的組件。(一些設計師可能會說這類組件需要完全一致,才能確保整個團隊的一致設計風格。)"}]},{"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":"挑戰3:核心團隊的組成"}]},{"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}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"核心團隊成員實現的是由所有人使用的通用組件,或者要設計與所有組交互的公共抽象。這不是初級開發人員都能應付得來的。同時,我們不能只依靠一位專家開發人員來定義一切。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"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\/resource\/image\/c5\/99\/c5604bded7aba7976a25ebd56d362b99.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":3},"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","text":"最重要的是,如果可以的話,我們應該在每個特性團隊中都配置一名來自核心團隊的大使(下圖特性組中的綠色人員),這會是很有價值的。在組織結構上,他們可以是特性團隊的成員,但他們在實踐中會積極參與決策以及核心團隊產品的開發。"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/28\/74\/28ac282ff7cf54b8e1a4byy40347c674.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":"挑戰4:產品和利益相關者管理"}]},{"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\/resource\/image\/24\/5c\/24413f51febfb0db827130b6609ac35c.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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}},{"type":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/c5\/99\/c5604bded7aba7976a25ebd56d362b99.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":3},"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","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":"挑戰5:工作結果的可見性"}]},{"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":"但是人們在基礎設施團隊工作時,這裏沒有任何能讓外部用戶輕易看到的有形特徵。他們完成的工作可能只是又一個API,或現有服務的一個新屬性——這種成果遠不足以發什麼公告,看公告的用戶看到這麼點東西會很生氣的。但沒有公告,他們所做的工作就不會被別人注意到了。"}]},{"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}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣的環境對團隊所做的工作評價很低,對他們犯的錯誤懲罰卻很高,於是核心團隊中的開發人員很快就會士氣低落,沒有人願意呆在這樣的團隊裏面。這個團隊現在實際上就是技術債管理團隊了:高風險、低收益。沒有人願意加入這樣的一個羣體。"}]},{"type":"heading","attrs":{"align":null,"level":3},"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","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":"挑戰6:成功的衡量標準"}]},{"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":"但對於核心小組來說,如何衡量他們的成功呢?他們沒有有形的、面向客戶輸出的產品。當然,我們可以說我們提供了這個庫、那個API服務,等等,但這樣做有什麼意義呢?拿組織底線來說,核心團隊如何爲組織的潛在成功做出貢獻?"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"可行解決方案"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"評價核心團隊成果的一種方式是,把它看作是爲公司提供所有所需計算機和基礎設施的IT部門那樣。它就像一個對支出做出重大貢獻的部門。"}]},{"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":"因此,如果我們有一種方法來衡量特性小組獲得的生產力或開發擴展能力,那肯定是非常有價值的。也許一種簡單的方法是統計特性團隊使用了多少API,當然這個例子太簡單了。這裏沒有一目瞭然的公式,說起來容易做起來難。"}]},{"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":"沿着這些思路,有幾個行業案例展示了這樣一個核心或基礎設施團隊的巨大成就。一個例子是AWS,它的服務器最初只是在亞馬遜內部提供服務,現在已經成爲亞馬遜最大的業務部門。"}]},{"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":"像Airbnb和Square這樣的公司也是類似的例子,他們開發了很多核心庫供其他開發人員使用,這對組織在開發社區中的聲譽做出了重大貢獻。雖然這些工作沒有直接的收入收益,但組織因爲這些成果而更容易招納人才了。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰7:不斷變化的軟件技術"}]},{"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}},{"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":3},"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","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":"image","attrs":{"src":"https:\/\/static001.geekbang.org\/resource\/image\/99\/c2\/9989b7641338aaec3da91a600dc90ec2.png","alt":null,"title":null,"style":[{"key":"width","value":"75%"},{"key":"bordertype","value":"none"}],"href":null,"fromPaste":true,"pastePass":true}},{"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":"技術債管理團隊是組織希望擴展產品開發工作時必不可少的重要團隊。我們可以將其命名爲核心團隊、基礎設施團隊、架構團隊,甚至像SWAT Team這樣有趣的名稱。"}]},{"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}},{"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":"link","attrs":{"href":"https:\/\/betterprogramming.pub\/the-7-struggles-of-a-tech-debt-management-team-ec8ef8316369","title":"","type":null},"content":[{"type":"text","text":"https:\/\/betterprogramming.pub\/the-7-struggles-of-a-tech-debt-management-team-ec8ef8316369"}]}]},{"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}},{"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":"text","text":":可以在這篇"},{"type":"link","attrs":{"href":"https:\/\/medium.com\/mobile-app-development-publication\/scaling-mobile-development-365cab84781e","title":"","type":null},"content":[{"type":"text","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":"爲了提升可維護性和可擴展性,負責公共代碼的團隊要探索開發跨各個特性團隊的代碼,以便重構、改進和更好地對齊。這項工作本質上和管理技術債是一回事。因此,把這個小組叫作技術債管理小組是挺合適的。"}]},{"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":"挑戰1:團隊的邊界"}]},{"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}},{"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":"heading","attrs":{"align":null,"level":3},"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","text":"隨着時間的推移,核心團隊的能力也會提升,它可以接手更多職責。它可以抽象出跨各個特性團隊通用的組件,並從那裏開始延伸出去。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰2:靈活性與一致性"}]},{"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":"這種方法有很多收益,特性團隊無需自己實現通用代碼就可以享受它帶來的種種好處。以上面這張簡圖所示,依賴項1、2和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","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":"heading","attrs":{"align":null,"level":3},"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","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":"至於“有用的實用程序”,這些工具可以是團隊能輕鬆採用的通用UI組件,讓他們無需創建新的組件。(一些設計師可能會說這類組件需要完全一致,才能確保整個團隊的一致設計風格。)"}]},{"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":"挑戰3:核心團隊的組成"}]},{"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}},{"type":"numberedlist","attrs":{"start":1,"normalizeStart":1},"content":[{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":1,"align":null,"origin":null},"content":[{"type":"text","text":"核心團隊成員實現的是由所有人使用的通用組件,或者要設計與所有組交互的公共抽象。這不是初級開發人員都能應付得來的。同時,我們不能只依靠一位專家開發人員來定義一切。"}]}]},{"type":"listitem","attrs":{"listStyle":null},"content":[{"type":"paragraph","attrs":{"indent":0,"number":2,"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":"heading","attrs":{"align":null,"level":3},"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","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":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰4:產品和利益相關者管理"}]},{"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}},{"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":"heading","attrs":{"align":null,"level":3},"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","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":"挑戰5:工作結果的可見性"}]},{"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":"但是人們在基礎設施團隊工作時,這裏沒有任何能讓外部用戶輕易看到的有形特徵。他們完成的工作可能只是又一個API,或現有服務的一個新屬性——這種成果遠不足以發什麼公告,看公告的用戶看到這麼點東西會很生氣的。但沒有公告,他們所做的工作就不會被別人注意到了。"}]},{"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}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"這樣的環境對團隊所做的工作評價很低,對他們犯的錯誤懲罰卻很高,於是核心團隊中的開發人員很快就會士氣低落,沒有人願意呆在這樣的團隊裏面。這個團隊現在實際上就是技術債管理團隊了:高風險、低收益。沒有人願意加入這樣的一個羣體。"}]},{"type":"heading","attrs":{"align":null,"level":3},"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","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":"挑戰6:成功的衡量標準"}]},{"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":"但對於核心小組來說,如何衡量他們的成功呢?他們沒有有形的、面向客戶輸出的產品。當然,我們可以說我們提供了這個庫、那個API服務,等等,但這樣做有什麼意義呢?拿組織底線來說,核心團隊如何爲組織的潛在成功做出貢獻?"}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"可行解決方案"}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"評價核心團隊成果的一種方式是,把它看作是爲公司提供所有所需計算機和基礎設施的IT部門那樣。它就像一個對支出做出重大貢獻的部門。"}]},{"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":"因此,如果我們有一種方法來衡量特性小組獲得的生產力或開發擴展能力,那肯定是非常有價值的。也許一種簡單的方法是統計特性團隊使用了多少API,當然這個例子太簡單了。這裏沒有一目瞭然的公式,說起來容易做起來難。"}]},{"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":"沿着這些思路,有幾個行業案例展示了這樣一個核心或基礎設施團隊的巨大成就。一個例子是AWS,它的服務器最初只是在亞馬遜內部提供服務,現在已經成爲亞馬遜最大的業務部門。"}]},{"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":"像Airbnb和Square這樣的公司也是類似的例子,他們開發了很多核心庫供其他開發人員使用,這對組織在開發社區中的聲譽做出了重大貢獻。雖然這些工作沒有直接的收入收益,但組織因爲這些成果而更容易招納人才了。"}]},{"type":"heading","attrs":{"align":null,"level":2},"content":[{"type":"text","text":"挑戰7:不斷變化的軟件技術"}]},{"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}},{"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":3},"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","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":"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":"技術債管理團隊是組織希望擴展產品開發工作時必不可少的重要團隊。我們可以將其命名爲核心團隊、基礎設施團隊、架構團隊,甚至像SWAT Team這樣有趣的名稱。"}]},{"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}},{"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":"link","attrs":{"href":"https:\/\/betterprogramming.pub\/the-7-struggles-of-a-tech-debt-management-team-ec8ef8316369","title":"","type":null},"content":[{"type":"text","text":"https:\/\/betterprogramming.pub\/the-7-struggles-of-a-tech-debt-management-team-ec8ef8316369"}]}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章