模型思維基礎 —— 以軟件開發元模型為例

不知道你有沒有想過,公共澡堂里面淋浴頭之間的距離是如何被決定的?現在我們假設自己是承包澡堂項目的工程團隊,嘗試用最簡單的方式來確定這個數值。

最直觀的想法是:假設將直立的人內嵌在一個圓柱體里面,可以得到這個圓柱體的半徑d。我們通過調查,獲得一部分人的d值,取其平均值,設為Avg(d)。那么,Avg(d)加上一個特定距離就可以是淋浴頭之間的距離。這里我們先假設這個特定距離是1米。

于是我們得出一個很簡單的模型

淋浴頭之間的間距 = Avg(d) + 1

這里我們利用模型對一個問題做出了決策。先不評價它的好壞,它確實針對這個問題給出了解決方案。

生活中利用模型解決問題的例子無處不在。單純從工程上來說,所有問題都是要用模型來解決的。

對于模型的定義有很多,我在這里給出我的一家之言。模型是過往經驗的集合,用于幫助針對當下問題做出決策。舉個大家都比較熟悉的例子,統計學里面的線性回歸就是根據很多收集到的過往的數據點建模,得出參數x和值y的線性關系。通過建立出來的模型,可以評價、選擇參數x

模型的正確性

天底下沒有正確的模型,所有的模型都是錯的。模型只有好與壞的區別。因為過往經驗的產生(例如數據)是伴隨著各種各樣不同的因素產生的,其中包括內在因素和外在因素兩種。而在幾乎所有情況下,我們是無法嚴格證明所有因素已經被我們所考慮了的。

例如,在剛才的淋浴頭模型里面,我們是否考慮到了:

  • 人在洗澡這個特定環境下時,周圍人與他的距離多遠才算舒適?
  • 性別對這些數值是否有影響?
  • 年齡呢?

就算這些都被考慮了,被根據數據統計出來了的,我們還是無法嚴格證明我們窮舉了所有的因素。另外,我們還面臨著

  • 精度丟失問題
  • 樣本不足問題
  • 數據真實性問題
  • ……

所以,我們是找不到正確的模型的,只能找到更好的模型。例如,考慮了性別的情況下,得出的淋浴頭之間距離的模型應該會比我們最初得出來的模型好。因為它考慮了更多的因素。

自底向上的模型構建方式

剛才提到,模型是過往經驗的集合。將過往經驗看成點,以某種形式連接在一起,就形成了一個模型。

你應該注意到了,我提到的是以某種形式連接在一起。所以,對于同樣的經驗集合,我們有很多種連線的方式。即,對于同一個經驗集合,我們可以有很多種建模方式。

一個模型也可以由多個已有模型建立起來。這時候,已有模型也可以看成是點,連接在一起之后,就形成了新的模型。例如,加減乘除可以看做是四個二元運算的模型,那么根據他們我們可以構建二元運算模型。

a + b, a - b, a * b, a / b 得出 a ? b

這是一種自底向上構建模型的方式。

自底向上構建模型的方式就是學習的方式,也可以論證為什么基礎知識不扎實是無法理解高級知識的。

拿軟件行業做例子。在軟件行業里,有一種職稱叫做架構師。架構師可能不做實際的編碼工作,而是做系統宏觀的設計。有些學生就會說,“不就是畫圖么,我也會”!這是不正確的。

優秀的架構師都是從基礎編碼做起的。他們需要有計算機專業的專業基礎知識,如計算機體系結構知識、計算機網絡體系結構知識、算法基本知識等。這些知識實際上就是我們所說的那些點。他們從最底層做起,一步步地向上建立模型,才能夠有能力對一個大規模系統進行建模。可以說,他們的能力提升,就是一個不斷建模的過程。

水平模型建立方式

對于一個現有模型A,我們可以根據它做修改,產生一個相似的兄弟模型B。

例如,除法二元運算模型的形態是被除數 / 除數 = 商 ... 余數,那么我們稍加修改就可以得出取模運算模型被除數 % 除數 = 余數,同樣也是個二元運算模型。

水平模型建立方式可以說是很多互聯網產品的思路。它們先根據自己的理解找到競品的模型(先不論它是不是找了差勁的模型),然后分析出該模型的問題,對其進行微調加以改進。

例如,微信最初可以說就是由WhatsApp的模型修改而來的。雖然到現在他們已經完全不一樣了。

自頂向下的模型建立方式

對于一個現有模型A,我們可以根據它做細化,產生一個新的子模型B。這時候我們稱模型A是模型B的元模型(Meta Model)。與兄弟模型之間的關系不同,元模型可以描述子模型。

對于熟悉面向對象程序設計的人來說,我需要提醒一下,這里面存在的不是繼承關系。繼承關系的場景下,子類包含父類。但是在元模型產生的子模型并不能包含元模型,而是元模型的一部分。因此,我們可以說,是元模型細分出了子模型。

例如,二元運算模型a?b也可以細分出取模運算模型a%b。然而,這次我們得出取模運算模型的方式和之前的方式是完全不同的。

例子:軟件開發元模型

軟件開發流程有許多的模型。例如,瀑布流模型、增量模型、迭代模型、螺旋模型等。

這些模型有一個共同的元模型,它非常的簡單:將普通人類的理解完全正確地翻譯為機器的理解

軟件開發元模型:將普通人類的理解完全正確地翻譯為機器的理解
軟件開發元模型:將普通人類的理解完全正確地翻譯為機器的理解

你會發現,瀑布流模型、增量模型之類的模型,都是可以被這個模型所描述的。

同樣,敏捷開發的12項原則也是可以被這個模型所描述的,因為它們都是為這個模型服務的。

創新的本質:創造模型

我對創新的描述就是創造新的模型。

對于采用自底向上法得出的模型,我們可以說是基于大量數據總結得出的創新。大數據是個最好的例子,無數企業在大數據幫助下取得的成功印證了這一點。

對于采用水平模型建立方式得出的模型,大多“性能”都不太好。因為你可能找錯了原有模型存在的問題,并且你的改進可能也不高明。

對于采用自頂向下法得出的模型,在我看來就是聰明人才能做得出的事情。Facebook就是這樣一家在技術上擅長使用自頂向下法來創新的公司。他們所創造出的技術產品遵循著其"Move fast and break things"的原則,總是能創造出截然不同的模型。

例如,Facebook的React.js這個產品,打破了一個最傳統的軟件設計理念 —— Separation of concerns(我不知道怎么翻譯比較好)。看似是打破現有模型,但是實際上這個突破來自于同一個元模型 —— 模塊化設計原則。當然了,每個人的理解角度可以是不一樣的,關于這點,我們可以多多討論。

總結:從今天開始利用模型思維

我曾經在Coursera上面完成過Model Thinking這門課,這門課對我的影響可以說超過任何一門學校里面教授的課程。如果大家有興趣,可以去學習這門課。

模型可以讓人更好地理解、闡述這個世界。模型讓你有能力同時快速地掌握多類事物的運作規則,融會貫通之,也由此能產生創新。

你會發現,那些處于最高層的模型,其實就是哲學。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容