首先解釋一下“思想”。
先問你個問題:你想做個怎樣的人?
可能你會回答:我想做個好人,孝敬父母,尊重長輩,關愛親朋……
你看,這就是思想。這是你做人的思想,或者說,是你做人的原則。
做人有做人的原則,編程也有編程的原則。這些編程的原則呢,就是編程思想。比如說,C語言中,數據與處理這些數據的函式是分離的,程式的最小單元是函式。——這種思想叫做面向過程編程。前輩們說,這樣不好,應該把數據和與這些數據相關的行為放在一起,用一個叫做類的東西裝起來。於是,在Java中,程式的最小單元變成了類。——這種思想叫做面向對象編程。
當然,面向對象編程並不是如此簡單的。會使用Java語言並不代表已經領會了面向對象的思想。面向對象有三大特性:封裝、繼承、多態。封裝有什麼作用?封裝時要注意什麼?繼承有什麼優點和缺點?什麼時候使用繼承?多態有什麼好處?什麼時候使用多態?……這些問題的解答有一些指導原則,比如單一職責原則、里氏替換原則、開閉原則、接口隔離原則、依賴倒置原則等等。這些原則就是編程思想。
舉個例子來說,你寫了一個程式,現在用的是SQLServer的資料庫,但客戶說,將來也可能換成MySQL資料庫。那你可能就會考慮了:如何在現有的基礎上,做最少的改動,就能從SQLServer換到MySQL。於是,你就會開始想這些問題:如何能達到更少的變動?是否需要創建接口?在什麼地方創建接口?接口中定義哪些方法?如何讓調用者更方便地獲取接口的實現類的對象?……這個,就是你的編程思想。就是那些原則在你的實踐中的套用。
建議閱讀如下書籍:
《面向對象編程導論(原書第3版)》
《設計模式:可復用面向對象軟體的基礎》(經典中的經典,巨著中的巨著,精華中的精華)
《大話設計模式》(適合初學者。如果看不懂上邊那本,請配合這本書看)
《敏捷軟體開發:原則、模式與實踐》(如果不想停留在紙上談兵的水平,請看這本)
《重構與模式》
那什麼是編程思想?答案可能很會複雜,但也可以很簡單。一句話來講就是,用計算機來解決人們實際問題的思維方式,即編程思想。
我們學習程式語言的最終目的,就是希望用計算機來解決我們的實際問題。那么學習計算機該如何入手,也是很多初學者犯難的一個問題,特別是對與非計算機專業的人來說更是如此。面對現實如此多的程式語言(比如:C,C ,JAVA,C#…)和種類繁多的套用技術(比如:windows編程,linux編程,資料庫,網路編程…)。確實讓人有些眼花繚亂,摸不著頭腦。此篇文章就來談談學習計算機的步驟和編程思想的發展。
計算機的發展大家也有所了解,在這裡就不多費口舌。我們現在用的計算機CPU只能認識0和1,這是目前的現狀。(如果你能發明另一種機器,能夠識別更多的符號,那么我支持你,並由衷的希望你能有所成就)這個階段裡面代表性的書籍就是“計算機組成原理”。這門課的精髓在於兩點:第一,計算機由哪些部分組成,各有什麼作用,少一個組成部件會有什麼後果。雖然當初我對這本書看得不是很透,但看完後我至少就知道了,電腦只要有個CPU,主機板,記憶體就可以點亮了。加個軟碟機,就可以運行DOS超作系統。再加個光碟機,硬碟,就可以把WINDOWS系統放到硬碟上運行起來。第二,CPU是如何工作,CPU做了哪些事情,CPU為什麼只能認識0和1,CPU的定址方式?對CPU本人了解得不深,不敢隨意賣弄。但有一個還是是需要知道一下的,CPU基礎計算只有3個:與,或,非。這3個邏輯門實現了我們現在所有的電腦程式計算。
二:過程性的編程思想
計算機只能認識0和1,但人卻不能只是用0,1來寫程式。為了程式的寫得方便就出現了0,1的第一層抽象標記,彙編語言。彙編裡面的那些標記可是直接對應硬體的。硬體生產廠商都有明確的指令說明書。這些彙編標記是可以被硬體直接識別的。比如CPU,生產CPU的廠家都會有暫存器的標識比如(ax,bx,cx),操作指令標識(mov),等等。驅動方面的編程大多會用到這方面的東西。學習彙編的核心是你需要認識到彙編是一種過程性的程式語言,並且目前的CPU只能執行過程性的程式,任何高級語言都必須轉換成過程性的程式語言後再交給CPU執行。在彙編里主要有三個操作:比較,跳轉(goto),過程調用(call)。為什麼說它是過程性的編程思想,值得你去好好的體會一下。不妨寫幾個算法的程式(在程式裡面用到比較,跳轉,過程調用),再來看看彙編程式的特點,相信你會有所感悟。值得提一下的是,如果你對作業系統感興趣,也可以看看什麼是保護模式。
三:結構性的編程思想
隨著人們解決的問題越來越複雜,彙編程式當然束縛了計算機軟體的發展。因此編程思想發生了一場革命性的變化,結構性的編程方法出現了。在結構性編程思想的程式語言裡面,C語言首當其衝。C語言裡面有幾個能表現出結構化思想的地方:分支(if),循環(while,for),結構體(struct).只要你會用這三個,那么你就可以寫出結構化的程式,但不一定你就了解什麼是結構化的編程方法。什麼叫做結構化?為什麼說goto會破壞程式的結構化?結構體有什麼作用,你能說出結構體的哪些好處?這些都是值得認真體會的地方。別人給的定義不見得都全面。還是自己理解比較靠得住。結構化編程裡面最具代表性的書籍就要屬“數據結構“,具體哪本書比較好就不知道了,好像都差不多,只要是用C寫的就行。C語言的“數據結構“裡面就是專門來講怎么用結構性的編程思想來解決實際中的算法問題。看完某些章節,然後自己找個問題,再用程式去實現它。多寫一些程式,會很有幫助。如果第一遍看完後你看得很模糊,不防先放一放,過一段時間再看看,你可能會有種霍然開朗的感覺。還有需要說明一下,並不是所有的時候結構化的編程一就定好。某些的時候,結構化的編程會使程式更繁雜。(比如結構化編程希望函式只能有一個入口,一個出口。然而有時一個出口會使程式看起來更繁雜)
四:面向對象的編程思想
現在該說說面向對象編程了。這個也是現在用得最多的編程思想。什麼是面向對象,它和結構性的思想有什麼不同?從程式語法上看,面向對象比結構性的程式多了兩個特性:
1,結構體成員的私有化。結構化程式裡面,結構體的成員都是公有的。然而在面向對象裡面,結構體改稱為類,並且成員分為公有和私有兩個部分。就因為這一點的不同,就產生了接口的概念。接口不就是類成員的公有部分么?(想想很好笑,本人剛開始認識面向對象的時候,以為只有定義成interface的才叫做接口)
2,類的繼承。因為出現了繼承,才出現了多態。然而就是因為多態,才出現諸如:隱藏啊,虛函式啊…等等這些概念。多態的出現,能夠讓同一組數據,在不同的階段,用同一種表達方式,執行不同的操作。如果把這個東西領悟到了,那么你會感嘆一句”原來程式是可以這么寫的”.
因為以上兩點的變化,編程思想也隨之發生了巨大轉變。它可以讓程式更適合人的思維方法來編寫。面向對象的程式語言就很多了,可謂五花八門:C ,JAVA,C#…。這三個本人都用過。用的感覺在這裡也隨口說說,只是代表個人觀點。都說C 和JAVA有很大的不同,而JAVA和C#卻非常相似,你知道為什麼嗎?最根本區別就在於垃圾收集器。就是因為JAVA裡面有垃圾自動收集功能,所以JAVA不能和C兼容,而且也不能使用指針。在C 中的值類型和引用類型是可以自己定義的。如果對象被定義為值類型,那么當編輯器自動把對象收集走之後,有時自己會一無所知。如果對象被定義為引用類型,那么又要必須記得把它釋放掉,不然又會引起什麼記憶體泄漏的問題。在JAVA和C#裡面就不一樣,在這兩種語言裡面,自定義的類,初始得到的對象只能是引用類型。並且有垃圾收集器幫你回收垃圾對象。所以就不會出現記憶體泄漏的問題。因為C#比JAVA後出來吧,JAVA所具有的特性,C#基本上都有。並且還具有一些JAVA所不具有的特性(但C#目前不能在linux上面運行)。當然在這裡不是說哪個語言好,哪個語言壞。其實他們都是來實現面向對象編程的工具。你也可以用C或者彙編寫一門支持面向對象的語言出來(如果你想做,本人絕對支持,或者用彙編也行。為中國的軟體事業貢獻一份力量,免得總說什麼什麼語言都是他們外國人發明的。)只要它能夠實現數據封裝,成員私有化,和繼承就行了。在面向對象的編程裡面,代表性書籍就要屬“設計模式“了。不過設計模式這個東西,不是你看書就能看懂的。並且你硬套那些模式,不一定對你有多大的好處。這個東西,只有設計做多了,才能有所領悟,自己得到總結。總結多了,就會發現和書上的那些東西不謀而合,或許可能比書上總結得更好。
將來的編程思想的會是一個什麼樣子,我也不得而知。希望有志之士能夠發明一種編程的思想出來,推動軟體業的發展,讓中國也來引領一下世界軟體的發展潮流。如果你是初學者,可以按照上面的順序來學習計算機。希望在每個環節中能掌握其重點。相信一年之後,你就會有所感悟。
大家都希望學的東西是可以用來賺錢的。而往往能夠快速用來賺錢的都是一種套用技術像windows編程,linux編程,WEB開發等等。你掌握了其中的一門技能,就可以謀得一個職位,可能還可以拿到一個不錯的薪水。然而如果你掌握了編程思想,那么那些套用技術將一通百通(因為套用技術往往都是對特定的一些函式的調用,通俗一點就是調用API,這些東西到專門的網站上查手冊將一目了然,比如windows編程。掌握了編程思想你將不在局限於某個特定的編程技術,而是對整個軟體系統有了全局的把握,研究的不再是編程技術,而是協定和規範學習計算機編程需要達到一種狀態,就是在任何時候腦海裡面都會在隱約的思考:對計算機裡面某種原理的理解,或者尋找某種問題的算法。有時一個新想法的閃現會讓自己興奮不已。如果你表現出這種狀況,說明你對計算機編程有著濃厚的興趣。
最後補充一點,就是中國的一句老話“盡信書,不如無書”。編程的學習還是需要有一點批判的精神和創造的精神才好。對於某些東西不要過早下定論,或許你某一個智慧的閃光,將為計算機開闢出一個新的發展方向