相關閱讀 |
>>> 技術話題—商業文明的嶄新時代 >>> | 簡體 傳統 |
英文原文:The Hidden Costs That Engineers Ignore 有時候我們說,實現這個功能,我只花了幾個小時。但是完成之后,我們發現每隔幾周,我們要么在修復該功能的 bug、向另一個工程師解釋,要么做客服回答問題、解釋其工作原理。維護該功能總的投入時間要遠遠超過最初開發的幾個小時。 軟件工程特有的最嚴酷的教訓之一就是額外復雜度所帶來的隱形成本。有時候,復雜度在問題領域只是固有的。為了匹配乘客和司機,通過調整價格來平衡供求是一個復雜和痛苦的問題。因此,在擴大一個社區和維護社區質量的時候,把問題和答案疏通到喜歡回答和看問題的人們那里,也是如此。或者像是開發一個兼容所有設備的富文檔編輯器以支持實時協作。這是固有的復雜度,我們需要根據產品做出調整以取得成功。 但是其它時候,和我們較勁的恰恰是我們自己產生的復雜度。我們用新編程語言寫代碼,很少人了解它,現在我們不得不維護它。或者我們增加了額外的基礎架構,因為我們嘗試從 Hacker News 看到的熱門新技術,但是它失敗了,這是我們當初沒有想到的。或者我們引入了一個很少人使用的功能,但是修復和 bug 報告就花掉了極不對稱的大把時間。 額外的復雜度暴露了很多隱形成本。在開發軟件時,我們所做的決定不只是決定了我們當前的開發速度,它們還要反映出我們花在維護上的時間和努力程度。 復雜度的隱形成本 太多復雜度增加了認知負荷,并產生了做完事情的額外阻力。它以很多不同的方式滲入到團隊里大部分是直接滲入到代碼、系統和產品復雜度里,但是間接地滲入到了組織的復雜度里。我們逐個看看這幾種不同類型復雜度的隱形成本。 代碼復雜度 代碼復雜度不只是隨著代碼行數的線性函數而增長它組合式地增長。在復雜的代碼庫里,每行代碼可能與其它很多行代碼交互和影響。我們對于組合式增長難以有足夠的認識,這就是為什么我們傾向于嚴重低估完成大型軟件項目所需要的時間,這也是重寫項目有時候會大幅延期的主要原因。 當代碼過于復雜的時候,它將變得難以擴展、難以理清其中緣由、難以修復 bug,很難理清追蹤錯誤來源的依賴和數據流向。工程師或許會積極地避免代碼庫最復雜的部分,即使它是可以做某種修改的、最有邏輯的地方,也要選擇繞彎來解決。他們或許避免把那些地方都組合起來,即使這項工作有著很大的影響。 系統復雜度 工程師喜歡擺弄新玩具,要么因為好奇,要么因為他們認為新技術可能為解決他們的緊迫問題提供了銀彈。當 Pinterest 在 2011 年剛開始擴容網站以應對快速增長時,他們只有 3 個工程師的后端小組卻使用了 6 種不同的存儲技術(MySQL、Cassandra、Membase、Memcache、Redis 和 MongoDB)。他們實驗每項新技術的諾言都是解決現有系統的某些限制。但是,每種新解決方案都以其自身特定方式失敗了,為了管理和維護而投入了更多時間和努力。最終,團隊明白了,增加更多機器而不是更多技術,更能簡化擴容,因此他們消除了 Cassandra 和 MongoDB 之類的系統,強化了架構的已有組件。 把基礎架構切分為太多系統,會帶來很多隱形成本,注意力被分散到了多個系統。對于每個系統來說,更難以整合資源以開發可復用的資源庫,更難以為日常工作招聘新人,更難以理解具體的失敗模式和每個系統的性能特點。每個系統的抽象最終變得更弱,因為沒有太多的可投入時間。當工具和抽象太復雜、或太多的時候,讓團隊去理解和探索將變得困難。 產品復雜度 產品復雜度可以導致一個不明確的版本、或引發缺乏產品聚焦的無節制野心。它希望在很多地方是優秀的,而不只是在一個核心領域,這種欲望使其不能向新用戶明確地解釋產品的意圖。產品復雜度引發了更多的代碼和系統復雜度團隊增加更多代碼、更多基礎架構以支持新功能。當產品外圍寬泛時,增加一個新功能或修改現有功能,將需要放大很多的努力來理解和適應舊的功能。 過于復雜的產品意味著有更多的代碼分支,更多要考慮的問題、更多的需要團隊解決的 bug 反饋。工程師和數據科學家需要分析更多的變量、做更多的一次性的報表,而不是集中于核心用戶行為的理解上。工程師需要投入更多時間來提供功能空間和提高效率。每個人最終在更多的項目中進行切換。投入在維護所有這些功能上的時間,并不是重新投入代碼、償還技術債務、加固抽象的時間。 組織的復雜度 代碼、系統和產品復雜度,依次產生了組織的復雜度。團隊需要雇傭更多人來處理和維護已開發的所有東西。越大的團隊意味著越多的溝通成本、越多的協調和和越低的總體效率。招聘過程本身,涉及的所有面試和匯報,消耗了團隊很大比例的時間。當然,所有新員工不得不被培訓才能上崗。 雇傭更多人的替代方法,就是將工程師組成劃分成更小的團隊或許甚至創建了一人小組來承担較多代碼、系統和產品外圍的工作。這降低了溝通成本,但是一人小組有他們自己的成本。一旦遇到難題,就完全拖延了項目中的唯一人手,因為有更少的人來分享這些低谷期,這種體驗對于士氣是有害的。與其他人合作的機會少了,會傷害到工作場所的快樂和員工的留任。除非每個人比較自覺,而且主動詢問反饋,否則個人收到的工作反饋將更少,因為分享相同項目上下文的人更少了。減少的反饋能夠降低代碼質量、或因疏忽導致的復雜度引入到代碼庫或基礎架構里。 如何應付復雜度 Tony Hoare 在 1980 年圖靈獎的演講中建議,構造軟件設計有兩種方法:一種是簡單,明顯地沒有缺陷;另一種方法是使其復雜,卻沒有明顯的缺陷。提到了由于復雜度而導致的非明顯的缺陷是如何傷害我們的,以及我們該如何應對這些成本? 下面是你能夠用到的一些策略: 當我們為學校課程開發軟件時,我們有著世界的過于簡單的視角維護任意復雜度的成本隨著下課而消失了。但是在我們的職業生涯中,糟糕的軟件決定將產生數年負担的影響。 不要使事情復雜化。 END 譯文: 《工程師忽略的隱形成本 》 臘八粥
Cnblogs 2015-08-23 08:57:36
稱謂:
内容: