標籤:
今天突然想到兩個有意思的問題:程式與軟體有區別嗎? 編程與軟體開發有何區別?
這兩個問題也是我在大學時期一直思考的兩個問題。作者在學校期間閱讀了許多的專業書籍,比如《Java語言程式設計》、《C語言程式設計》、《軟體工程》、《設計模式:可複用物件導向軟體的基礎 》以及許多《21天精通XXX程式設計》系列書籍,也寫了許多的小程式,但有一些問題作者始終沒有完全弄清楚。比如:
1.真的可以在21天之內精通某一門程式設計語言嗎?
2.什麼是物件導向?
3.Java語言為什麼要提供介面,為什麼要將介面定義和實現強制分開?
4.什麼是異常?為什麼需要異常處理機制?
作者在學校期間曾向老師請教過這些問題,得到的答案要麼照本宣科,要麼含糊其辭不得要領。直到工作多年之後作者才明白,有許多問題是無法在學校得到答案的,必須要等你真正進入這個行業之後,才會慢慢明白其中的道理。 好的老師與差的老師區別在哪裡:好的老師總是能用最簡單的方式給大家解釋清楚最複雜的問題。下面來談談上面的幾個問題:
1.真的可以在21天之內精通某一門程式設計語言嗎?
從開始學習電腦到現在已有8年時間,但是工作中遇到的難題仍然比比皆是。每當讀到James Gosling、Rod Johnson這些大師的經典著作時,才發現大師的高度難以企及。想想當初找工作在簡曆上寫精通XX語言時,難免汗顏耳赤。
2. 什麼是物件導向?
在學校期間,電腦課程的老師會引用各種比喻來解釋什麼是對象。比如:你是對象我是對象世間萬物皆是對象;類和對象的關係就像學生和王小明的關係、飛機和波音737的關係等等等等。大家聽完還是雲裡霧裡。其實在瞭解物件導向之前,我們應該瞭解兩個概念:資料結構中的抽象資料類型(Abstract Data Type)和C語言中的結構體(struct)。在瞭解這兩個概念之後,相信大家對物件導向應該有更清晰的瞭解。物件導向無非是抽象資料類型(Abstract Data Type)執行個體化,也是結構體(struct)的升級版。很多人容易被物件導向這個概念搞暈往往是因為物件導向這個概念被濫用或者過度解釋所致。無論是結構體還是對象,都是用來組織和傳遞資料的。當軟體規模越來越龐大時,模組化是必然的選擇。物件導向可以幫我們更好的實現模組化。
3.Java語言為什麼要提供介面,為什麼要將介面定義和實現強制分開?
如果一個軟體的全部功能都能在一個檔案中來編寫實現,那顯然我們不需要介面,也不需要物件導向和類,更不需要package包這些玩意。但是軟體規模的增長速度是驚人的,軟體功能越來越強大,體積也越來越龐大,這是誰也無法阻擋的趨勢。把軟體劃分成不同的模組,讓不同的類去實現不同的功能,讓一個類去調用另外一個類的方法來完成業務,這是通行的做法。但是這種強引用會帶來一個嚴重的問題:耦合度太高。有一個成語可以形容這種情況“牽一髮而動全身”,某一處的小改動會導致所有地方受到影響。但是軟體需求的變更、功能的增加、資料的調整,這些是我們每天都會面對的事情。而介面實際上將調用方和實現方強制分離開,實現的變更對調用方不會產生影響,降低了模組之前的耦合度。
4.什麼是異常?異常處理機制可以保證我們的程式永遠不出錯嗎?
筆者記得上大學時,老師對著Java異常類階層圖大講特講,但最後大家對異常的概念總是一知半解,寫程式時try-catch總是用的不對。其實異常簡單點說就是邏輯錯誤。我們編寫電腦程式實際上是我們邏輯思維的具體符號化,但是邏輯難免會存在缺陷,程式也是如此。編寫程式就像我們焊了一個電路,只有通上電某個地方冒煙了,你才知道這裡存在bug,這種情況就是出現異常了。寫代碼時出現編譯錯誤那不叫異常,編譯器可以幫我們指出語法錯誤,但是編譯器無法幫我們解決異常。比如我定義了一個對象,調用了對象的一個方法,但是在運行環境中這個對象卻不存在,這個時候就出現了null 指標異常。如果沒有異常處理機制,程式會中斷退出,或者進入非正常運行狀態。運行時異常是非常常見的,我們當然不希望我們的程式出現任何一點異常就崩潰了。所以異常處理機制對於提高我們程式的健壯性有著重要的作用。
再回到開始的兩個問題:
1.程式與軟體有區別嗎?
我們在大學實驗室寫的代碼並不能稱之為軟體,而只能叫做程式。軟體是為瞭解決使用者的需求,而程式往往沒有特定的使用者。是否經過測試達到一定的品質標準,這也是程式和軟體的差別之一。文檔和代碼對軟體來說同等重要,而程式則對文檔基本沒有要求。
2.編程與軟體開發有區別嗎?
這個問題跟上面的問題本質是一樣。我們在學校實驗室寫了一段程式和我們在公司為客戶開發軟體區別在哪裡呢? 在實驗室寫程式不用面對客戶多變的需求,也不用擔心程式的版本升級問題,也不必過多考慮程式的容錯性和健壯性等等。我想這就是編程和軟體開發的差別吧。也正是這些源源不斷的問題推動著技術向前發展,我們也在解決問題中不斷提高。
程式與軟體、編程與軟體開發的區別