軟件思考系列之二

軟件思考系列之二
                                      —— 該如何來學習程序設計?
鄧 輝
萬惡之源——複雜性
軟件開發所面臨的根本問題就是應對日益增加的複雜性,這些複雜性可能來自於軟件本身、所涉及的問題領域、參與軟件開發活動的人以及協調軟件開發活動中各個元素的過程等。當所面臨的複雜性超出了人們的理解範圍時,就會造成混亂和危機。爲了能夠有效地降低這些複雜性,人們想出了很多方法。這些方法涉及軟件開發的各個方面。舉例來說,在過程方法方面,計劃驅動方法試圖通過遵守嚴格的過程來降低協調方面的複雜性,而敏捷方法試圖加強人之間的溝通、協調以及期望管理來降低人以及問題領域所導致的複雜性。同時,人們也通過提出各種新的程序設計方法和語言來提高自身應對軟件本身複雜性的能力。
遺憾的是,我們在學習程序設計和語言時,往往忽視了提高應對複雜性能力方面的內容,而把精力放在了語法等一些低層次的細枝末節之上,對程序設計本身產生了很大的誤解。當語言本身存在缺陷、教育不當時,後果就變得更加嚴重。這種狀況對提高我們的處理複雜性的能力帶來很大的障礙。在本文中,我僅僅關注於程序設計這個問題,就該如何來學習程序設計展開討論,希望對大家有所幫助。
認識程序設計
雖然程序最終是運行在計算機上的,但是程序設計本身卻和計算機沒有多少聯繫。計算機革命爲我們帶來的是一場思維方式以及思維表達方式的革命。引用《Structure and Interpretation of Computer program》前言中的一段話就是:
“The computer revolution is a revolution in the way we think and in the way we express what we think. The essence of this change is the emergence of what might best be called procedural epistemology -- the study of the structure of knowledge from an imperative point of view, as opposed to the more declarative point of view taken by classical mathematical subjects. Mathematics provides a framework for dealing precisely with notions of ``what is.'' Computation provides a framework for dealing precisely with notions of ``how to.''”
而程序設計活動正是這種思維活動和思維表達的體現,好的思考和表達方式可以顯著降低我們在“how to”時的複雜性。這種活動的核心就是:模塊化(分而治之),而達成這個目標的最爲有效的手段就是 ―― 抽象。
還有另外一個非常重要的問題和能否有效地學習程序設計密切相關,那就是表達設計所用的實現語言。一個程序設計如果沒有通過實現語言表達出來,如果不能運行和驗證,那不是真正的設計,用UML畫出來的圖示也不是真正的設計,只不過是一些粗糙的想法。程序設計必須用實現語言表達出來,纔是真正的、準確的設計。因此,實現語言本身的特性會直接影響到學習的效果。
程序設計語言
一門優秀的程序設計語言不僅僅只是提供一些指揮計算機去完成某些任務的手段。這門語言必須也要是提供一個框架,在這個框架中我們可以組織我們的思想。因此,在我們學習一門語言時,應該特別關注於該語言提供的“組合簡單思想去形成複雜思想”的手段。同樣,用《Structure and Interpretation of Computer program》中的話來講:
“Every powerful language has three mechanisms for accomplishing this:
 primitive expressions, which represent the simplest entities the language is concerned with,
 means of combination, by which compound elements are built from simpler ones, and
 means of abstraction, by which compound elements can be named and manipulated as units.
    ”
其中,“means of abstraction”是最重要,最值得學習和關注的一點。好的程序設計語言,可以使你把精力放在如何去構建更好的抽象上去,並且爲你提供了一種自然的表達方式,而不會使得一些無關的細節干擾你的思路和表達。
在開始學習程序設計方面,C族語言表現的最爲糟糕。因爲作爲初學者,你無法把精力放在程序設計本身的學習上去,而是被許多語言的細節和陷阱困擾,大部分精力都花費在如何解決語言爲你設置的障礙上去。看看我們所學習和閱讀的東西吧,其中要麼就是瑣碎的語言語法細節,也就是primitive expressions層面的東西,要麼就是一些語言的缺陷所導致的陷阱,要麼就是一些稀奇古怪的語法分析(比如:“i+++++++++”,請告訴我結果。),要麼就是提出一個錯誤的問題(比如:C語言中,兩個指針能相加嗎?),然後長篇大論的進行解釋。在這種學習和教育氛圍中,聽到“什麼OOP、AOP都一樣,最終不都是二進制嗎”之類的話就不奇怪了。
在程序設計學習方面:Lisp、Smalltalk、Ruby、Python是首選的實現語言。如果有正確的教育C++也還不錯。Java、C#這些中間過渡語言也還行。C、Basic、Fortran最差。等真正掌握了好的程序設計思想模式之後,再去學習其他東西就會事半功倍。
語言對於學習程序設計的影響實例研究
Lisp、Smalltalk、Ruby和Python
C++
Java、C#
C
待續. . . . . .

發佈了28 篇原創文章 · 獲贊 1 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章