現(xiàn)在很多模塊故障很多,實(shí)際上是缺乏設(shè)計(jì)。如何做好設(shè)計(jì)呢?我的理解,首先要對(duì)領(lǐng)域的問題有一個(gè)清晰的認(rèn)識(shí),找到領(lǐng)域的特點(diǎn),并做出合適的構(gòu)造來達(dá)到設(shè)計(jì)的目標(biāo)。
為了更好的做軟件設(shè)計(jì),我們需要對(duì)我們密切相關(guān)的“編程”這件事有個(gè)本質(zhì)的理解,這里談一下以前學(xué)習(xí)的感悟:
*** 計(jì)算的本質(zhì):在計(jì)算機(jī)出現(xiàn)以前,一些數(shù)學(xué)家們就在研究各種“機(jī)器”,希望這些“機(jī)器”能夠完成需要人手工才能完成的計(jì)算,并理解計(jì)算的本質(zhì)。丘奇和圖靈分別從不同的方面研究出了這樣的機(jī)器模型,分別是lambda演算和圖靈機(jī)。圖靈機(jī)比較容易實(shí)現(xiàn)和理解,通過這種模型可以精細(xì)的描繪出計(jì)算的過程,這就是我們現(xiàn)在計(jì)算機(jī)的模型;而lambda演算是一種完全不同的計(jì)算模型,它完全通過數(shù)學(xué)的思維邏輯來完成計(jì)算,這種模型并不是人為感覺的“那么直觀”但它的好處是可以應(yīng)用數(shù)學(xué)的已有結(jié)論來證明程序的正確性,這也是近年來函數(shù)式編程又開始火起來的原因之一。
*** 建模的作用:我原來一直認(rèn)為建模是為了證明方案的可行性,實(shí)際上建模還有一個(gè)很重要的作用--認(rèn)識(shí)問題的本質(zhì),數(shù)學(xué)家通過計(jì)算模型認(rèn)識(shí)到了計(jì)算的本質(zhì),通過建模,數(shù)學(xué)家們知道了為了完成計(jì)算,哪些部件是提升計(jì)算能力的關(guān)鍵,而哪些只是方便表達(dá)而不沒有提高計(jì)算能力,從DFA->NFA->PDA->TM就是一些例子。我們?cè)趯?shí)際開發(fā)中建模也可以對(duì)領(lǐng)域問題的本質(zhì)有更深刻的認(rèn)識(shí)。
*** DSL和語義**:近來好像突然大家都在“DSL”了,就好像以前大家都“TDD”、“敏捷”一樣,有很多人都只是道聽途說,并不真正的理解。DSL (Domain Special Language),實(shí)際上就是通過對(duì)領(lǐng)域問題的分析,建立一套適合領(lǐng)域問題的描述語言,方便領(lǐng)域內(nèi)人進(jìn)行開發(fā)、交流和理解。建立這種適合領(lǐng)域問題的語言,要關(guān)注語言的語義,而如何來表達(dá)語義呢?有很多方法,最常用的是操作語義和指稱語義,操作語義可以很詳細(xì)的描述語義,但過程有點(diǎn)小煩瑣;而指稱語義是一種更加直接、更加抽象的描述語義的方法,特別的,如果我們能把我們的問題指稱到數(shù)學(xué)這個(gè)領(lǐng)域,那是最好不過了,因?yàn)榭梢岳脭?shù)學(xué)的性質(zhì)來證明程序的正確性。
這次培訓(xùn)的“高可用分布式系統(tǒng)的設(shè)計(jì)”,肯定能讓我們認(rèn)識(shí)到復(fù)雜系統(tǒng)種如何找出關(guān)鍵設(shè)計(jì)要素,就像前面說到的通過計(jì)算模型認(rèn)識(shí)計(jì)算的本質(zhì)一樣。