什麼是「守」
本篇為下一篇做準備,精化一下「守」這個概念。
在前面的討論中,我們多次使用「守」的概念,比如「守弱」,「守中節」,「守穩XX介面」。有人問到,到底「守」是什麼意思?我自己很自然使用這個概念,是因為我的武術老師常常用這個概念。如果讓我現在總結一下,我對「守」的定義是:在戰術實施中,如果對特定戰略邏輯採取優先執行的決策模型,那麼,我們稱這種決策模型叫「守」,或者說是對該特定戰略邏輯的「守」。
「守」是戰略思考的關鍵輸出。
你出門去北京,計算好了路徑,交通工具,把這個方案確定下來,你執行遇到障礙的時候,都首先考慮這個方案,這就是對這個方案的「守」。
戰略思考不可能深入細節,否則無法響應變化,工作量也受不了,所以戰略思考的關鍵是決定到戰術階段「守」什麼。而戰術階段你沒有足夠的時間去考慮所有的情況了,你也需要有「優先考慮的邏輯」,所以你也需要「守」。
有人把「守」和「堅持」看作是同一個概念,這取決於你如何定義「堅持」,「守」不是保持不動的,「守」是讓自己和設計的策略有一個強力的吸引力,但不表示在戰術執行過程中遇到具體問題不可以臨時甚至永久偏離守的目標。「死堅持」類似激流中的木樁,在壓力面前完全不動,「守」類似木樁上用彈簧系著一條小船,因應變化而動,但總以木樁為方向。
架構設計本質也是戰略思考,也是決定到實施和實現的時候守什麼,否則面對新的情況和變化,就可能走向錯誤的方向,從而導致整個設計的失敗。
守了錯誤的對象你就不可能實現你的目標,要去北京你守「一定要坐車」,你一輩子都到不了北京。寫一個程序,你不守「實現用戶需求」,而守「把Makefile寫好」,這也一定寫不出這個程序。
這也是為什麼要守弱,守弱是守無人關注的東西,解決整個問題中最沒人關注的問題。人人都知道的問題,這個團隊中一定有人去管,這是不需要你(構架師)去關注的,守最弱一環才會帶動整個團隊和設計前進。
做一個軟體,國家誰是總理關你鳥事,守國家誰是總理就是浪費時間;誰負責實現memcpy,這也關你鳥事,如果他們實現某個功能的時候用到memcpy,自然要嚷得震天響的。不做就跑不起來的東西,也關戰略和架構鳥事,一跑就會知道,自然會處理的。最怕那種跑也能跑,但做好了以後和別人對比沒有競爭力的,這屬於溫水煮青蛙,死了都不知道怎麼死的。這才是戰略設計者和架構師要考慮的問題的關鍵。架構師定義的「守」是不是正確,看的是這個。
所以架構師的對「守」的定義不能明顯感覺是「正確」的,如果明顯感覺是「正確」的,說明選錯方了。這就是為什麼上士聞道,勤而行之,下士聞道,大笑之,不笑不足以為道。這是道(最佳模型)的特徵之一。
有些時候,守可以有多個考慮對象,但有守比不守強。比如潑婦打架,守「抓頭髮」也行,守「抓臉皮」也行,都會很有戰鬥力。但如果沒有目標上去就亂打,結果就是被人抓頭髮或者被人抓破臉。
但也有些時候,強行守沒有必要守的東西,會是不守比守強。比如潑婦遇到流氓,守打左邊那個還是右邊那個,都是自取其辱。先看清楚情況或者等老公過來才是正道。守和不守是一體兩面,不守是守「不守」的另一種表述。
作為架構師,我們盡量要讓自己守的要素簡單,因為在滿足戰略目標的情況下,越簡單的戰略要素,意味著更多戰術籌碼。比如形意拳強調「守中節,打中節」,戰鬥中千變萬化,很多問題要考慮,等你想得清楚,都被人奏扁了。而守中節,就是用前臂響應對方的前臂(大概這個意思,反正這裡不是教你打架),用中節防守,力量足,貼身,最容易防守,攔對方的中節,基本上也攔住進攻的全部路徑了,這樣就可以執行。否則老想著對方是白鶴亮翅,你就應該來個懷中撈月,或者追著人家的手掌亂跑,那你就不用打了。
換成架構師,你設計一套複雜的方案,A和B在協議層關聯,B和C在業務層關聯,B和C的關聯中又有個信息在A層中體現,然後現在告訴你,A的供應商提價,你的設計就掛了。
所以,守之道,就是架構師之道。
推薦閱讀:
※含德之厚
※讀《代碼不朽:編寫可維護軟體的10大要則》C# 版
※Logging,Metrics 和 Tracing
※理解架構版本
※如何成為一名軟體架構師?
TAG:软件架构 |