一位十年軟體工程師告訴你什麼是程式設計思想

shupan001發表於2011-09-27
什麼是程式設計思想?答案可能很會複雜,但也可以很簡單。一句話來講就是,用計算機來解決人們實際問題的思維方式,即程式設計思想。 
我們學習程式語言的最終目的,就是希望用計算機來解決我們的實際問題。那麼學習計算機該如何入手,也是很多初學者犯難的一個問題,特別是對與非計算機專業的人來說更是如此。面對現實如此多的程式語言(比如: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程式設計,http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/WindowsUserInterface/Windowing/WindowClasses/UsingWindow.asp 這就是一個入門的例子)。 掌握了程式設計思想你將不在侷限於某個特定的程式設計技術,而是對整個軟體系統有了全域性的把握,研究的不再是程式設計技術,而是協議和規範。

大家在學習初期看書。最好不要看電子書,而是買書本看(電子書用來當詞典查閱一下還是不錯的)。因為電子書看一會眼就花,給人造成一種煩躁的情緒而不能靜下心來好好體會書裡所說的內容。一本書,一支筆,加一個草稿本,是最佳的學習狀態。如果你是在校學生,你可以到http://www.xiangyataclub.com裡看看你本校內有沒有你想要的二手書或者學習用的電腦裝置,這樣能使得資源可以重複利用。遇到不懂的地方到論壇裡面討論一下還是不錯的,比如http://www.csdn.net裡面一般性的問題能夠找得到答案。學習計算機需要達到一種狀態,就是在任何時候腦海裡面都會在隱約的思考:對計算機裡面某種原理的理解,或者尋找某種問題的演算法。有時一個新想法的閃現會讓自己興奮不已。如果你表現出這種狀況,說明你對計算機有著濃厚的興趣。 

最後補充一點,就是中國的一句老話"盡信書,不如無書"。程式設計的學習還是需要有一點批判的精神和創造的精神才好。對於某些東西不要過早下定論,或許你某一個智慧的閃光,將為計算機開闢出一個新的發展方向。 

程式設計思想在我實踐看來就是這樣一個事情,很多程式碼你認真的都啊都啊,開始有很多不明白,他們為什麼這麼做,有的是不明白他們在幹什麼,有的是不明白他們為什麼搞得這麼彆扭,慢慢的就瞭解編寫過程中一些敲門。在讀啊讀啊,你就能明白怎麼遵守他們之間的那種默契和協定(中國沒有),在讀啊讀啊,你就開始自己想寫些什麼來表達你對他方法的不認同,然後會有很多國外的高手會告訴你你的錯誤(他們真的很好很謙虛,願意和你探討的!國內沒有遇見過。我所知道的高人都玩潛水可能)。然後你就不感造次了,冷靜的讀啊讀啊,直到有一天你突然覺得就是你自己對了,他們都錯了,你就又發表文章了,這回國外的高手明顯少了,只有1,2個人發來郵件詳細談談,你可能對了可能錯了,於是你不僅繼續讀啊讀啊,也開始研究啊研究啊,這時候基本上你開始回人家的問題,等你一旦發表文章的時候就會引起圈內幾個知道你的人注意,你繼續努力,注意你的人就會越來越多,這時候你就有了小小小小的名氣,開始有人找你希望你能加盟或者幫助開發等等。

可能有人說,我沒有談到程式設計思想,但是我告訴你,沒有程式設計思想,在這個過程中,你明白了遊戲規則,你取得了他人的認可,你就有了程式設計思想,這是潛移默化產生的,說白了這個思想就是在這個圈子裡高手之間尊從的一種合同,大家都這麼做,規則就這麼建立了,直到有人提出新的合同方式,大家再去討論,你在去發展。有人可能問我搞什麼,我告訴你搞linux方面的工作(但絕對不再中國那幾個linux公司幹)。有人問我用了多少時間,我告訴你學習用了將近3年,搞出一點點明堂用了1年多。

因為我不是很聰明,所以用了這麼長時間,但是我相信3年時間是肯定要的,我每天至少6個小時埋頭學習,4年時間,懂得了程式設計思想,真的很苦,很寂寞。所以如果你不是非常熱愛這項事業,請慎重,如果你熱愛,請努力。

相關文章