當前位置:
首頁 > 最新 > 從編程序看分析和綜合,以及用於寫作和做報告

從編程序看分析和綜合,以及用於寫作和做報告

最近,不得不來指導一下學生編程序。除了

給程序加執行參數(例如cp後面的文件名就是用來滿足適於用任何文件的要求,例如ls後面的-a就是用來顯示隱藏文件等等)來增加程序的功能而不是完成非常特定的功能,然後每次不得不去修改程序本身

運行參數包含測試功能的開關,這樣測試起來簡單

程序盡量要做到命令行下可執行,,不要依賴於集成環境IDE,可以用makefile

變數名要有意義

程序要加上說明,看的出來每一行在做什麼

合適的時候,做一下優化,例如用矩陣代替循環之類的

一般的編程,以及每一種語言,基本上都會有一些風格習慣,要稍微了解和遵循

這些基本的要求之外,最重要的是Divide and conquer的思想,也就是分解和綜合的思想:把每一個程序分解成合適的步驟,每一步完成特定的功能。甚至在主程序這樣的高等級程序裡面,完全不應該有具體的計算,只能有每一段應該完成什麼的流程;甚至在比較高級的功能性模塊裡面,也只能由每一段應該完成什麼的流程;僅僅在最底層的程序裡面才應該有具體計算,核心計算。也就是程序應該長成這樣:

這樣的程序,儘管初看起來,會雲里霧裡,發現,每個子程序都沒有在幹活啊,就是在調用下一級子程序,好像只有搞懂最底層的子程序,才能看懂這個上一級程序。但是,只要稍微習慣一下,改變一下思考問題的方式,就會發現,這樣的程序比把核心程序和流程程序放在一起的,要好懂的多好懂的多。關鍵的思考問題的方式就是分析和綜合,或者叫做Divide and conquer,或者WHWM分析方法(What,How,Why,Meaningful)。具體來說,就是,在看上一級程序例如主程序的時候,每一個子程序只要明白在完成什麼功能,這個功能和當前程序的目的是什麼關係,就行了。不需要取搞清楚子程序是怎麼做的。也就是說,What(完成什麼功能)是最主要的,然後是Meaningful(起到什麼作用),How(怎麼做的)和Why(為什麼這樣做)是次要的。只有當真的需要的時候才進入下一級子程序,而且就算進入下一級子程序,還是一樣,先搞清楚這個子程序下面的流程,也就是每個子子程序的功能以及它們和這個子程序的功能的關係,而不去管這些子子程序是怎麼實現的,有沒有更好的實現。當然,這樣的閱讀依賴於程序員的注釋,因此,每一個功能模塊,都要做好注釋,完成什麼功能。

記住:很多細節我們都可以不懂,只要我們懂得這個東西做了什麼,在整體中起到什麼作用。當然,如果我們真的想搞懂整個問題,那麼,自然,底下的How和Why也是重要的。

這樣來做還有什麼好處呢?方便測試,方便協作。測試的時候,可以單獨來針對特定的子程序,而且可以設定一個針對這個子程序具有精確解的情況來測試。協作的時候,每一個貢獻者可以只管當前任務的細節,而不去管這個任務之上的子程序和之下的整合,當然,在把任務分解準確以後。

只要做好分解,不斷地分解——每一次都只有流程直到不得不寫下來核心程序,做好注釋,做好測試,無論編程水平(例如語言包的熟悉程度、演算法的創造性運用)本身多爛,都能夠編出來能用的程序。

同樣,寫作和閱讀的時候,也是如此:首先是整篇文章想說什麼主要信息,為什麼說這個;接著把整篇文章分解成一個一個的部分,每一部分說了什麼主要信息和整篇文章的關係是什麼;再接著,還可以把每一個部分再次分成一個一個的部分,每一步分說什麼主要信息和它的上一層關係是什麼。也就是在每一個層次上,問What和Meaningful的問題,然後依靠在下一層問What和Meaningful的問題來回答上一個層次的How和Why。

同樣,做學術報告的時候,更加要如此:首先是整個報告想說什麼,為什麼說這個;接著,用什麼例子或者結論來展開論證和表達這個主要信息,以及反過來,在介紹這些例子和結論的技術細節的之前一定要讓你的聽眾明白,你為什麼將這些例子和結論,它們和主要信息的關係是什麼;然後,對每一個例子和結論,做同樣的事情,先搞清楚需要用哪些進一步的細節來展開這些例子和結論,在具體進入這些進一步的細節的具體技術細節之前,能不能交代清楚這些細節和這些例子和結論的主要信息是什麼關係。不斷地重複這個分解的過程、明白起到對上一級的內容什麼樣的支撐作用、然後才是細節的展開。為什麼要這樣做?因為你的聽眾基本上不會一下就明白最底層的細節,每一次的封裝都能夠降低你的聽眾的記憶和信息處理負擔。

當然,有的時候,這個層次會有交叉。這也是為什麼要依靠概念地圖——整體是層次結構,但是跨越層次的聯繫是最重要和核心的聯繫。這也是系統科學,物理學,或者說科學的核心思想之一——分析和綜合。除了學習物理學、系統科學,你還可以通過練習編程來體會這個分析和綜合,只要完成一個需要300行以上的程序,你就不得不體會到。任何語言都可以,但是,不要直接就是圖形界面的例如VB之類的,試試C、Python、Java等,尤其是Java(Java有一個概念叫做介面,可以沒有任何具體程序)。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 為了理解而教和學 的精彩文章:

光是粒子又如何,光是波又如何?
《岳陽樓記》WHWM分析

TAG:為了理解而教和學 |