軟體的核心價值:長期演進(讀之一)
< clean architecture >這書的第一部分算是老生常談了,用一個匿名的case study說軟體如何腐化進而大幅影響開發效率。軟體有兩個價值維度,行為的價值和架構的價值,前者可以理解為滿足客戶需求,後者可以理解為軟體可擴充套件性的價值。這兩個價值肯定不是矛盾的,並不是說你滿足了客戶需求就會失去擴充套件性。長遠的看,只有容易擴充套件的軟體才是有價值的軟體,而評價一個軟體架構最直接的指標就是,長期演進過程中,軟體變更的成本。變更成本隨著時間不急劇惡化的軟體既可以被視為有著良好架構的軟體。

圖片發自簡書App
記得十七八年前,第一次學習軟體工程的時候,就看到過類似的話題,修復一個故障在不同階段(設計-編碼-測試-釋出)的成本是級數增長的(1-10-100-1000);大概七八年前第一次學習敏捷軟體設計(clean code、refactor、SOLID、XP、implement patterns、design patterns...)時,印象非常深刻的一句話是“Software must be soft,it must be easy to change, easy to change has huge business value.” 回頭看, 這些當時看起來政治正確的話,實際上是非常昂貴的價值觀 。其昂貴之處在於,如果你不是生於羅馬(比如說工作在普遍重視軟體設計和架構且有完備制度保障的大公司?),那麼就得靠在跋山涉水的痛苦掙扎中慢慢體悟到架構的價值。 體悟到這種價值,讓它成為你的價值觀,進而去影響和改變組織也會是很難的事情 。這兩個過程哪個更難?仰望天空天空沉思和飛到火星哪個更難?發白日夢和實現它哪個更難?生一念淨信到立地成佛哪個更難?從生命起源到第一隻仰望天空的古猿,大概走過數億年的的時間,而倮猿飛向火星可能只需要幾萬年。對一個工作十年、飽經風霜、早生華髮的程式員,做做改善架構的白日夢可能也是奢望。這真是見仁見智的問題。
行為價值和架構價值之間的衝突,是長期利益和眼前利益之間的衝突 。人的動物性一面要求我們不關注長期利,理性方面又時常在耳邊絮叨說還有更長遠的未來。這是非常深刻的衝突。另外,專案交付壓力大的時候,誰還顧得上明年或者下一個版本?先活下去似乎成了一個聽起來光榮(何其猥瑣而正確)的口號。在兩者之間找到平衡並不是容易的事。一個解決方案是, 給長遠利益預留資源和權利 。在大型專案的開發中,要留給架構相應的人力和時間資源。好的資源應該留給設計而不是解決故障。其次 要讓這部分資源發揮作用 。一般而言,架構一定會外於當前交付和故障解決,有時候甚至會被視為某種干擾因素。如果再參雜組織壁壘的考慮,實際上非常容易形成對抗。兩個建議, 一是架構需要貼近程式碼和實現,提供具體的建議和實現指南 。一定要具體,哪怕是僵化、一刀切的方法又如何,對於大部分組織而言,有規則都比沒有規則的野生狀態要好(想想《利維坦》中描述的人人為敵的“自然狀態”?)。規則先僵化,再優化; 二是記錄技術債,把技術債顯現在每個人的面前 。要把技術債轉換成內部需求,並錄入需求系統(或者類似的啥東西?),然後在不同的場合不停的強調還債的重要性。雖說債多了有可能不還,但識別和展示出來總是第一步。 架構師的一個職責就是讓大家意識到長遠利益的重要性 ,而且應該找到你的贊同者(統一戰線的意思,高祖V5),仔細想想誰關注兩年後的生產力?(啥?沒有?難道都是打算幹完這一票就離職的人麼?老闆開公司是用來洗錢的麼?)
真正開始考慮架構問題,首先要識別專案的 規模和約束 。
規模,包括時間和空間的。專案可能演進多長時間,目前處於什麼階段,專案目前和潛在規模會有多大?不同情況採取的手法可能會不盡相同。簡答的說,大型專案和小型專案不相同,一個功能單一的工具軟體沒必要引入那些對大型專案必須的複雜技術手段。 要識別出那種勢必長大的專案,別假裝看不見。 這種專案的早期投入非常重要,而且會有明顯的效果。正如kent beck說的,院子裡種一棵樹最好的時機是五年前(才搬來的時候)。
約束,效能、實時性、時延、擴充套件方式,都可能是約束。feature從一頁紙就能列完到要用專業的需求系統管理,程式碼從幾千行增加的幾十萬行,開發人員從一個小組到上千人規模。在這個過程中,我們對效能的要求往往是不變的,與其將它視為需求不如視為約束。系統如何擴充套件,如何解決效能問題,有些時候可以通過增加伺服器來解決,有時候你的硬體資源就是固定的(比如通訊系統),八年前的硬體今天還得正常工作,甚至服務的使用者還更多了!對於後者,它可能是你的系統最大的一個約束,你從第一天開始就得考慮完備的解決方案。 約束的含義是,要想辦法劃出明確的紅線,給出警示牌,並安裝能識別跨域紅線行為的報警器。
能意識認同到長期利益的存在,並預分配較好的資源和權力給它,對一個組織而言,是質變,是變好的開始。這是頓悟, 頓悟之後還需要長時間的按照所悟內容的實踐和修行 。對於禪宗一個大誤解就是頓悟完了就立地成佛了,其實哪是那麼回事,頓悟只是個開始。至於怎麼修行,後邊的章節再慢慢聊。