我的簡單設計價值觀


保持簡單

簡單是一個成年人司空見慣的詞,我們大部分人卻覺得純真的孩子纔是簡單的

很多時候,我們習慣把簡單容易理解爲是一個意思,比如:這個問題好簡單(複雜),另一層含義是:解決這個問題很容易(困難)?這個時候簡單跟容易是一個意思。再比如說:我真羨慕她能過如此簡單的生活。另一層含義是什麼呢?我們先來看一張圖:

簡單和複雜多用於形容事物或人的屬性或狀態,容易和困難一般形容達到某種目標的過程。所以就有了人活簡單點真難啊!系統一不小心就複雜化,非常難以維護!等感慨。這些感慨流露出一種願望 – 保持簡單。對於人來說,保持簡單可能意味着人情世故的簡單、工作關係的簡單、生活狀態的簡單。對於軟件系統來說,則意味着系統設計的簡單、部署運維的簡單等等。


三重境界

看山是山,看水是水;看山不是山,看水不是是水;看山是山,看水是水。

保持簡單的確不是一件容易的事情。禪宗提出的人生三境界中也詮釋了這個理:人從簡單開始,以複雜貫穿了大部分甚至整個人生,最後返璞歸真

對應到一個需求簡單的軟件系統中,系統的設計一開始處於簡單的狀態。然而軟件開發的核心問題是複雜多變的業務需求,隨着時間的推移,軟件系統可能呈現出以下三個狀態:

沒有人希望系統處於第三個狀態,所有人都期望能從第二個狀態回到第一個狀態。映射到禪宗的人生三境界,系統的三境界應該是:

  1. 清晰 – 單一化
  2. 複雜 – 層級化
  3. 清晰 – 模塊化

在面臨複雜多變的業務需求,如何設計一個恰好簡單夠用的系統?如何保持系統的高響應力?我們一直都沒有停止對最佳實踐的探索,我們始終爲這些目標奮鬥,只爲了引導系統經歷禪宗三境界。軟件開發的所有問題最終都能歸結到人身上,那麼驅動我們不斷前進的力量是什麼?

我的答案之一是:對簡單設計、高響應力價值的認可,對簡單設計價值觀的深層次內化。


普適價值觀

提到價值觀,大家可能有一種感覺:望着這些高大上的價值觀詞彙,感覺缺點什麼,卻總又說不上來。比如Scrum的價值觀:專注開放承諾勇氣尊重。再比如極限編程(XP)的價值觀:溝通簡單反饋勇氣尊重。尤其是剛開始接觸這些知識體系的新人,每個詞都能看懂,就是不知道它們是如何去指導Scrum和XP。

我親身經歷了Scrum和XP的實踐之後,再回過頭來看,才深刻體會到,Scrum和XP的那些實踐其實跟它們的價值觀都非常吻合。同樣,我能夠在日常開發以及培訓和練習中去落地簡單設計,這背後驅使我不斷前進的是已經內化的價值觀:

  • 潔癖
  • 專注
  • 懶惰
  • 勇氣
  • 反饋

潔癖

潔癖多數場所被我們用來形容一個人在生活上不容易相處,因爲非常講究個人衛生而適合一個人獨自生活。我也經常在Code Review中聽到同事開玩笑說我有代碼潔癖,比如對命名太較真了。一開始我會有所妥協,畢竟軟件開發是一個團隊來完成的,如果因爲我的嚴格而讓其他人不舒適,不利於團隊協作。可是時間總會告訴我,那些貼有不用心不認真或者不嚴格標籤的小魔頭在後面出來製造各種噪音,比如命名看不懂、結構不一致、架構臃腫等等。

做程序員這幾年,潔癖已經深刻影響着我的編碼和設計風格,小到變量命名、代碼註釋、文檔管理,大到系統技術架構和部署架構,我都會時刻保持警惕,盡我所能去消除噪音污染。在沒有其他更重要的原因(比如客戶交付壓力,即便有,也應該盡力去消除)前提下,我都會嘗試讓團隊採納我的潔癖。

潔癖更側重於團隊個體成員,對於我們個體,可以通過不斷強化自己的整潔代碼、整潔架構的意識來保持代碼潔癖和架構潔癖,並嘗試在實踐中去運用它們。而對於團隊,我提供一條指導原則: 任何有助於提升系統質量的潔癖都不應該被忽視,團隊應該盡全力接納並落實

專注

在Scrum中,專注強調的是所有人都專注於Sprint工作和Scrum團隊的目標,大家都爲同一個目標努力。對於簡單設計,我們要專注在哪裏呢?我給大家分享我經歷過三個典型的場景:

  1. 一上來匆匆忙忙編寫業務代碼,沒有Tasking,沒有測試,沒有設計,業務Scope逐步偏離或擴大
  2. 在編碼階段,聽到聲音:“你這個設計太土氣了,都沒用設計模式”,於是琢磨着怎麼去套設計模式
  3. 在系統架構設計階段,有人說:“什麼年代了,你還不拆出幾個微服務”,於是嘗試拍腦袋拆出一個分佈式單體

上述三個場景根本原因是不能很好地專注於自己要實現的真實業務價值,要麼缺乏思考和設計,要麼受外界影響,本末倒置。你可能會質問:我們不應該多做設計來兼容後期可能出現的情況嗎?爲未來做設計,難免會摻入猜測,不但增加系統的複雜度,還可能浪費成本。

我們應該專注於當下的真實業務價值,讓系統保持簡單,再借助一些實踐來響應未來的變化。

懶惰

懶惰是一個優秀的程序員必備的特質,因爲Ta勤于思考如何才能懶惰。

懶惰聽起來是一個負面的詞,幾千年的文化價值觀在告訴我們要做一個勤奮努力的人。而到軟件開發領域它卻成了一個靚麗的標籤了,我們一起看看程序員的懶惰:

  1. 需求變更,我懶得動太多代碼。怎麼辦?隔離變化,分離關注點
  2. 重複的手工集成和測試,我懶得做這個事情。怎麼辦?搭建自動化流水線
  3. 用戶鑑權分散在各個服務中,我懶得修改所有的服務。怎麼辦?引入API Gateway
  4. 每次項目上新人,搭建環境總找我,我懶得跟他們一次一次地講。怎麼辦?編寫自動化腳本和文檔指

如果每次面對相同的問題,不得不花精力去處理,在這種毫無挑戰的重複性工作中我們很容易犯錯,所以如果你懶得去做這些事情,懶惰會驅使着你去思考一種自動化的方式,從而取代一遍遍的重複的操作,解放人力,並且你還會思考如何運用KISS(Keep it Simple and Stupid)原則來落實自動化方案。

CV(Ctrl + C + Ctrl + V)程序員也很懶惰,但他們更偏向思想上的懶惰。我所提到的懶惰以勤快地思考爲前提,思考如何能夠變得懶惰。

反饋

反饋是敏捷和XP的核心價值觀,我們通過溝通來獲取反饋、通過編寫單元測試來快速獲得代碼的反饋、通過自動化流水線來獲得代碼庫健康狀態的反饋、通過AB測試來獲取用戶的反饋等等,這些都是在強調反饋的重要性。我曾用一句話來概括敏捷:通過高效地團隊協作來獲取快速的反饋。

即便在一條筆直的高速公路上開車,我們也沒法保證車一直沿直線前進,我們要時刻保持警惕,通過線條、護欄、其他車輛等物體來獲取反饋並調整方向盤來糾正車身方向。對於設計,我們無法保證一開始的方向會一直是正確的,在前進的路上通過各種不同的渠道來獲取反饋,從而改進自己的設計,閉門造車最終很可能落下敗筆之名。

勇氣

拋開其他單獨談勇氣意義不大,我們常說無畏之人如魔鬼,一個心中毫無畏懼的人,不受任何倫理道德和法律的束縛,便同野人無異。正因如此,我所說的勇氣是結合特定場景的。

在Scrum和XP中,我們要有勇氣去做正確的事情,有勇氣處理棘手的問題,有勇氣去做出承諾,有勇氣去堅持自己的原則,有勇氣拒絕損害工作的事情,有勇氣去暴露自己的不足並尋求幫助,有勇氣去提供有建設性的意見,有勇氣去揭露違背價值觀的現象。在簡單設計中,這些勇氣都是我們應該具備的。同時,我們還具備勇氣去做一個潔癖、懶惰的程序員。

關於勇氣,我提供一條參考原則: 只要你所做的事情是符合價值觀,你都應該無所畏懼,勇往直前。


寫在最後

簡單設計在XP中的定位是一項實踐,它本身有一套自己的指導原則。通過在客戶交付、公司內訓、客戶培訓中不斷思考和運用簡單設計,在我意識中潛移默化地積累了一套指導我去落實簡單設計的價值觀,而這些價值觀大多跟我現在所經歷的敏捷工作方式有密切關聯。

做任何事情,背後總有一套價值觀在指導我們。當我們開始接受一項實踐並願意努力落實它的時候,意味着我們已經開始認可它,它背後的價值觀得到了我們的認同。起初你不用太在意它,只管認真落實你認可的實踐,在實戰中去思考總結。好好享受過程,做一個快樂的程序員。


Posted by Yuan Shenjian

版權聲明:自由轉載•非商用•非衍生•保持署名 | Creative Commons BY-NC-ND 3.0

原文鏈接:http://sjyuan.cc/value-of-simple-design/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章