面臨兩種選擇時,多數人認為最重要的是從中選擇,然而設計(無論是軟體設計還是其他設計)並不是這樣的。當你面對兩種可能性時,應該仔細考慮設計中存在的不確定性。不確定性可以促使你推遲決定(譯註1),收集更多的資訊;促使你使用分隔(partition)和抽象(abstract)的方法來降低設計決策的重要性(譯註2)(significance of design decisions)。如果抱著頭腦中最先閃現的想法不放,被它束縛,偶然性決策就會占上風,軟體的靈活性會降低。
格雷·迪布奇(grady booch)對架構的定義是眾多定義中最簡單也最具有建設性的:「架構屬於設計範疇,但並非所有的設計屬於架構之列。架構代表了那些形成系統的重要設計決策。其重要性由變更決策的代價來衡量。」也就是說,優良的架構能夠從整體上降低設計決策的重要性,糟糕架構則會突出重要性。
如果出現兩個合理的選擇,架構師應該停下來,設法找出介於兩者之間,具有更低重要性的決策,而不是簡單地在兩者中作出選擇。了解兩者之外還存在其他決策(這個選擇關非顯而易見),比決策結果本身更有價值。
架構師往往要冥想苦思反覆嘗試,才能清楚地將問題一分為二。當你積極地與同事在白板前爭論不同的可能性時,當你對著**反覆琢磨而無法採用哪種實現方式時,當新的需求或對需求的新解釋質疑現在實現方式時,說明你碰到不易確定的情況了,這時要設法利用分離(separation)或封裝(encapsulation)將決策和最終依賴於決策的**隔離(isolate)開。做不到這一點,**就會雜亂無章,彷彿乙個緊張的應聘者,試圖用模稜兩可、含糊其辭的方式回答沒有把握的問題。還有些盲目自信的人會作出武斷的選擇,但是開快車又不願回頭看是會拐錯彎的。
迫於壓力,人們常常為了決策而決策。這時可以借鑑期權思想(options thinking)(譯註3)。當你在不同的系統開發路線之間舉棋不定時,不要急於做出決策。推遲決策,直到掌握更詳實的資訊,以便作出更可靠的決策。但也別太遲,要趕在這些資訊失效前利用它們。
架構和過程相互交織,所以架構師應該在開發周期中促成那些注重實證的架構方法,並設法引出反饋,建設性地利用不確定性,將系統和進度分割開來。
譯註1:推遲決定(defer commitment)是精益軟體開發的原則之一。推遲決定不是故意拖延,而是強調作出的決定應該基於足夠的事實,不能僅憑假定和猜測。
譯註2:重要性(significance),指設計決策對系統影響程度。重要性用變更設計決策須要付出的代價來衡量,如果變更某個決策須要付出的代價高,那麼其重要性就高,反之則低。
不確定性推理
不確定性推理 是指建立在不清楚,不明確的知識和證據基礎上的推理,不完備 不精確的知識推理,模糊知識推理。多種原因導致同一結論。解題方案不唯一,現實生活中的問題有很多解決方案,這些方案之間很難決定誰優誰劣,所以選擇認為較優的方案,就屬於一種不確定性推理。所需知識不完備,不精確。所需知識描述模糊。知識的...
不確定性學習(2)
續上。定義的常量 不確定性很小的一些量,比如 一些物理常量,我們認為他們是確定的,因此為定義的常量。決策變數 決策者可以直接控制的數量,也稱為控制變數或者政策變數。決策變數根據定義沒有真值,其值的確定依賴於決策者。價值引數 代表了決策者以及其代表人群的偏好。價值引數不應該被認為經驗數量 將價值引數的...
度量不確定性 雲理論
李德毅老師開創的雲理論,是對傳統的隸屬函式概念的揚棄。自然界中大量模糊概念可以用正態雲來刻劃的事實,導致了對正態雲外部特徵以及內部機理的深入研究。模糊概念可表述為乙個邊界具有不同彈性的,收斂於正態分佈函式的雲。實質上,雲是用語言值表示的某個定性概念與其定量表示之間的不確定性轉換模型,雲的數字特徵可用...