1. 程式人生 > >怎樣學好程式設計(個人程式設計感受)!

怎樣學好程式設計(個人程式設計感受)!

前言


 編了這麼久的程式,一直想找機會總結下其中的心得和方法,但回想我這段程式設計道路,又很難說清楚,如果按照我走過的所有路來說,顯然是不可能的!當我看完了雲風的《遊戲之旅--程式設計感悟》和樑肇新的《程式設計高手箴言》我突然知道我要從何說起,我要怎麼說了!

 從接觸程式設計到現在已經至少要6年,,雖然時間短,但我幾乎每天都在編,而程式設計上突飛猛進的還是最近一兩年,單純程式設計上的進步,很簡單就是經驗,但你要理解才可以進步的快!這就是說,你的理論課要學好,才能學好程式設計,作業系統,網路原理,計算機體系結構,資料結構,編譯原理,你哪個學的不好,你根本不配成為程式設計高手,我見過的高手,這些學的都不錯!這些都是計算機的支柱,你連它的支柱都不瞭解,怎麼程式設計,即使你編寫的程式好——只有一個原因,你用的是高階語言或指令碼語言,因為它們封閉大量低層語言細節,讓你不用瞭解就可以編寫,你不瞭解低層細節你雜成為高手!

 解釋什麼叫程式設計?


 我覺得現在很多同學,根本不知道什麼叫程式設計!我現在告訴你,單純的程式設計,也就是就知道語法知識的程式設計,根本不叫程式設計,只會單純的語法的程式設計連低階程式設計師都不如!
 程式設計不僅僅是你對語法的掌握,你還要把各種技術混合到裡面,這樣才叫程式設計,你程式設計的時候,你應該問問自己,你的程式有演算法嗎?你的程式寫的夠簡單嗎?速度足夠快嗎?佔用空間足夠少嗎?程式碼寫的規範嗎?語句寫的標準嗎?你的程式之間的結構合理嗎?你類定義的合適嗎?方法和屬性合理嗎?介面合理嗎?等等等,包含很多東西!這就是高階程式設計師為什麼賺這麼多錢!要付出相當大的腦力勞動!
 除錯對你也很重要,一個程式高手,也是除錯專家,其實除錯很多方法,但大多數都是實踐中得到的!
 
 


 指正現在人對學計算機誤區


 現在我每天在和彙編,硬體指令 ,c和c++或一些低層API打交道,有些時候程式設計這個東西很難說清楚,只有你經歷了,你才能感受到,你沒有經歷,就永遠體驗不到!
 我現在要更正幾個現在學計算機人的誤區,我想回答的是,學什麼才是學計算機!
 學計算機的兩個方向:一個是純搞理論的,一個是搞實踐的。搞理論的無可厚非的,大家都承認是學計算機。那麼實踐呢?我很難給出一個定義,但我會列出那些才是真正學計算機學的:
 (1)程式設計,這裡的程式設計,我要丟擲FLASH,PHOTOSHOP,3DMAX等,它們雖然也有語言,但都是為了給美術人員提供的!也就是幾乎封閉了大量的低層細節,對於一個學計算機的人來說,如果你努力學它們,你還是不要學計算機了,去學美術把!網頁程式設計能接觸到至少兩種型別語言,,HTML和ASP或JSP(PHP),HTML說實話,不應該是計算機人學的,你應該學的是ASP,JSP等!
 按嚴格意義上講(但實際沒有這麼嚴格)如果你的主要必修語言,不是c ,c++,JAVA,或者硬體指令,都不算是真正學計算機的,之所以這麼說,我舉個例子,比如你用JSP,它是一個指令碼語言,如果你用過這個語言,你認為你用好這門語言需要了解硬體結構知識嗎?顯然不用,如果你純是JSP程式設計師,你需要只是,JSP語法,一些簡單的JAVA語言,SQL之類的資料庫知識,其餘的你什麼都不需要,至於分析流程,那是系統分析師的事,不要和程式設計混為一談,我學JSP學了3個月,現學現買就做出了功能齊全的網上書店(當時是老師佈置的作業),如果再努點力,就可以投如使用!所以說,學JSP根本就不需要太多的專業知識,不是學計算機的也很容易就學會!
 學c++,我都學了好幾年了,用它寫程式都幾十萬行,我也不敢說我學的精通!就是因為它太靈活了!不同人,用的效果就是不一樣!
 所以按嚴格意義上講,如果你的主要必修語言,不是c ,c++,JAVA,或者硬體指令,都不算是真正學計算機的,也就是說,學那些對計算機專業知識不需要太多瞭解的語言,就不叫學計算機的!

 (2)從事軟體方法實踐研究,這個純是軟體工程方面的,如果你沒有容入一個大專案中很難體會它的重要性,想一想,一個程式,幾十萬,幾百萬行程式碼,能這麼好的實現,並執行,它的功勞不小!
 (3)從事低層硬體開發,這裡可能和搞電子的專業有些重疊,但事實就是這樣,他們也是學計算機的!
 其餘的,裝系統了,裝電腦了,用人家編好的軟體實現些圖片音樂等功能的,那都是計算機的門外漢,不要和真正學計算機的混為一談!
 我經常被問到:
 你會盜qq不?我暈,學計算機的就要會盜qq?
 你會裝電腦不?雖然我會,但不會並不可恥
 你會裝系統不?雖然我會,但不會並不可恥
 '''''''''''''''''''''''
 '''''''''''''
 等等把,有好多,通過我上面解釋,你應該理解學計算機的應該會什麼,不會什麼也是應該的!

 正式入題,怎麼學好程式設計!

, 世面上好象只有這兩本是中國人寫的關於程式設計心得的書,中國程式設計好的人很多,但寫出方法很難!第一本《遊戲之旅--程式設計感悟》前面幾章寫的是雲風的程式設計經歷,後面幾章寫的是程式設計經驗!總的來說本書很容易讀懂!《程式設計高手箴言》書很難,尤其寫作業系統那章!正如作者所說,真正寫一門程式設計方法學的書很難!本書前幾張概括了當前中國軟體面臨的形式,我強烈建議看一下,寫的很經典!以前我不知道程式和軟體的區別是什麼,現在我知道了!後面幾張寫的都是程式設計方法和程式設計要具備的知識!


 總結他們兩人所說的,我準備按照下面提綱來寫程式設計方法!


 1。如果你感興趣,學計算機是一種光榮,如果你不感興趣,那麼它是地獄!
 2。理論對你很重要,尤其是你一名搞技術的程式工程師!
 3。學會自學,學會思考,學會合作與交流!
 4。要想成為高手,一定要從底層學起,底層是什麼?CPU,彙編等硬體指令!
 5。程式設計需要經驗積累,學會除錯對你尤其重要!
 6。全域性把握整個工程,具體到每個類的屬性和方法以及各個類的關係!一定確保你設計的類和類模式和類間關係能夠有效,利於修改和升級!概括說就是軟體工程
 
 下面我就分別說一下

 一。如果你感興趣,學計算機是一種光榮,如果你不感興趣,那麼它是地獄!


 我經常聽很多同學說,開始他對計算機很感興趣,但隨著大學裡的學習,越來越感覺無聊甚至厭煩!你之所以這麼想,其實一點也不怪你!從高中的應試教育到大學裡的自由學習方式上的轉變,我們幾乎都不適應,一到大學,突然有一種解放的感覺,沒有老師的強硬指示學習,自己根本不知道怎麼學,學什麼!所以說,教育對我們很不負責任!
 如果你在大學以前已經知道程式設計怎麼回事,那到沒什麼事情!但好象很少有人象雲風這樣從小就接觸了程式設計教育!所以我們在沒有上大學前幾乎是零起步!
 其實,按我的理解,剛上大學開始學程式設計有些晚了,之所以這麼說,不是因為單純的程式設計很難,如果你很努力,幾年完全可以搞定,其他的你去公司的經驗可以彌補!我這裡想說的是,一個真正的程式設計師不單單要有強硬的程式設計實力,還要有強大的理論後盾!你只會程式設計,沒有強大的理論做後盾,你也就不會把理論轉化成實際的程式碼,你也不會做出高效,高技能的程式!在計算機理論中,圖論,人工智慧等等都是很難的理論,但如果你能把它們有效的用在計算機領域,功德無量!國人能做這點的很少,本來厲害的程式設計師就很少,有高尖端理論技術並把它應用的更是鳳毛麟角!
 (這裡可以推薦大家一本書《遊戲程式設計中的人工智慧技術》,這本書拋開了傳統的自動機,產生式,各種規則的傳統的人工智慧理論,而是講的更前沿的計算智慧——生物遺傳演算法,人工神經網路!這本書,不單純講理論,還用c++語言結合理論實現各種遊戲程式!有時抽象的理論都是基於數學基礎之上,如果沒有一定數學基礎是很難看懂的,但正因為它有數學證明是正確的,所以它是可行的!能把它用語言實現更是可觀!)
 所以,如果你熱愛計算機,在大學以前,就應該成為一個程式高手,而大學以後,主要專研各種技術的實現,和各種技術的學習,如果你把他留在工作裡,可能很難,我的同學在參加工作後,很少有繼續看技術書籍,因為技術書籍很難,不是一下兩下就看懂的,有幾個還有這樣的耐力和精力去搞!這些怎麼在程式設計上實現,都在等著老外,咱們COPY,這樣我們的軟體技術能強大嗎?
 可是在大學以前成為一個程式設計高手幾乎不可能,我們沒有良好的學習程式設計的環境,而且面對著中考,高考的各種壓力,幾乎沒有機會去學習程式設計!其實,小學,初中,高學,那些課程沒有必要象我們這樣反覆的複習,反覆的作題,浪費了大量時間,我們要學會什麼?學會一種技能,能夠應付各種變化的技能,就是自學,學會思考,學會自己解決問題,學會團結合作!初等教育,打的口號很好,實際上,完全壓制了這種學習方式!
 所以我們應該以最快的速度,在大學裡容入一個熱愛計算機的氛圍!說到這又很難,當代大學生迷茫呀!不知道作什麼,有些知道自己該好好程式設計,但光說不做!有些人,寫了幾段程式碼,出現了問題,不會除錯,就放棄了!大家都這樣,所以以寢室為單位沒有人程式設計,逐漸以整個計算機學院為單位逐漸程式設計!確實我們的計算機老師,會程式設計的很少,我們應該知道,中國計算機引進並發展才短短20年,正是這樣老一輩的,把這些計算機理論上確立,他們不會程式設計理所當然,大學的老師主要研究理論,國外的也是,因為理論太難了!
 所以大學裡學習程式設計要完全考自己,你要有信心,有意志把它學好才可以,而且這個過程是循序漸進的!以最快方式,找到你程式設計的愛好和興趣!
 我介紹幾個方法,學習方式,希望你能找到興趣,起碼我是這樣做的,記住如果跌倒了,你要站起來

  1。一定要和喜歡程式設計的,或程式設計厲害的,或經常程式設計的人,在一起,經常探討問題!初學程式設計會有很多問題出現,你自己很  難解決
  2。我建議VB和c一起學習,這個只是我的建議!我為什麼這樣說呢?如果你開始只學c,你會厭煩整天在DOS下,沒有圖象的  程式!如果你直接學WINDOW程式設計會很難,所以我建議學VB,VB這是個語法簡單,很快可以見到你編寫程式的畫面,這樣你就會逐漸喜  歡程式設計,沒有畫面很枯燥的,你不這樣認為嗎?反正我是這樣認為的,你編寫的好壞,沒有畫面也很難用眼睛直接看出來!VB是最簡  單的語言了!不存在c的複雜語法結構,程式出錯概率相對c 來說很少,因為VB封狀的很好,幫你解決了複雜的過程!其實象JAVA,MFC,  c#完全可以作到VB效果,但上手相對困難!
  c是我們一定要學的,它是一種很接近底層的語言!如果你要成為高手,應該學這個!C是個純面向過程的語言,它的語法不  是很難,你用它大約一年半多左右,就完全可以掌握它,記住這需要你的實踐,多做程式,主要是演算法程式,最好把你教科書的後的  的習題都做了。大家幾乎學的都是潭浩強的書,這本書我開始認為很 好,但我看了很多國外的書,和很多國外人所打的程式碼後,  和國內高階程式設計師所說的話,我只能說這本書,只能是你的開端,但不能 讓你更深層次瞭解語言。但你要問我初學者用什麼  書,我還會介紹這本書。C的精髓在於指標,你能靈活運用指標就幾乎等於你掌握了 C語言,這是一種高效的語法支援,快的讓  你無法想象,我很有感觸,在VB下要慢的多。
  那麼我們學VB究竟做什麼,很簡單,做WINDOWS程式,控制元件的使用,資料庫的使用等等,還有一個很重要的是,你可以練習你   學的資料結構,各種計算機演算法,很快就可以用圖形的方式顯現出來!你現在知道這些就可以,等你以後學了真正WINDOWS編  程,你會對你以前所實現的東西有很深的理解,究竟什麼是API,什麼是動態連線庫,什麼是控制元件,象VB,MFC這樣的東西,究竟封狀  了什麼讓我們用起來這麼簡單!
  3如果你能作到,以上兩點,(加上你學的專業,如果你很努力,課大約1年)我想你會對計算機感興趣的!你逐漸容入愛學  計算機的氛圍!接下來有兩個方向你要去做,一個是努力學好其他計算機專業課,二是在鞏固c 語言的基礎上,你可以選擇學習c++   或者WINDWOS程式設計!這兩個先學哪個都無所謂。記住你大學時學的10大專業課,數學,離散數學,資料結構,編譯原理,彙編,資料庫  ,計算機體系結構,作業系統,計算機網路,軟體工程,你要盡力把它們學好,這個是整個計算機系統的精髓,這些都是相互貫穿的  ,相互聯絡的,你可能學某科沒學懂,但學了別的後,可能會懂的!切記,在你學好程式設計的同時,一定要學好這些理論,以後你會受  益匪淺的。
  4。在你覺的c或者VB學的沒什麼問題,或者你學會WINDOWS程式設計,記住一定要自己有個想法,做個小的視覺化程式,小遊戲也  好,小應用軟體也好,都可以,這個步驟,你一定要做,你會學到很多東西!在這期間,你還會遇到很多問題,你要自己多想,多問  別人,多去網上查資料!但你做的程式,最好不要COPY別人的,如果都是你自己做的,自己想的,你收穫最大,哪怕你是模仿別人的 程式,你用你自己的想法實現了,也是厲害的!其次,你可以COPY部分程式碼,作為自己的。在你對你的想法,知道怎麼實現後,寫代  碼只是浪費時間的時候,而且你寫的效率沒有現成的程式碼效率高,你就可以完全COPY,但如果你是初學者,你千萬不要這麼做!否則 你會對它產生依賴,有一天真正讓你自己去寫,你會無從下手!所以開始時,你可以試著COPY,逐漸擺脫對它們的依賴,以後擺脫了 ,這個時候,你才可以總依賴它們。
  5。大學期間,有很多程式的實驗課,你要認真做,做出來收穫是自己的,也可以作為自己的一個小專案!大學期間加上實驗 課,基本上自主程式設計或者團隊自主編寫的總小軟體數目應該不少於7,8個,如果你做的程式很大,可以少些!
 以上,我把如果學習計算機入門 和提起 你興趣的方法告訴你了!我相信你按照我的去做,應該沒有問題的!對於每個細節,我會在接下來詳細為你們寫出的!


 二。理論對你很重要,尤其是你一名搞技術的程式工程師!

 大學裡所有課程幾乎都是針對理論的!大學裡是你學習理論的最好機會,因為我們不明白可以問老師,老師會幫助我們解決的!當然有些老師很垃圾,那就要你自己解決了!我上面提到的10大專業課程,是你以後學習其他理論的基礎。你不可能一輩子有老師幫助,以後學習其他理論就要靠自己,所以,在你學習10大專業課程的同時,要學會自己和思考問題!如果你上大學就為了以後做網頁,那你沒有必要學這寫東西,同時,你永遠成不了高手!
 數學:
 數學我們從小就學,它實在太重要,幾乎所有的科學都建立在它的基礎之上。讓我們每個人都成為數學大師是不可能的,我們沒有時間也沒有精力去搞這麼抽象的東西,我們要做的就是,以後遇到和數學相關的東西,能看懂就可以了!
 雖然我很長時間沒有看大學課本,但我還很清楚的知道學了什麼?極限,導數,微分,積分,空間向量幾何,多重微分,多重積分!傅立葉變換,等等把!其實這些很大程度隨著物理學的發展而發展的,現在的模擬技術這麼厲害,都建立在物理學上!我希望大家,在能理解這些真正含義,不要單單會做題!題海戰術既浪費時間,也浪費精力!極限:說白了,就是自變數要趨進某個值時的值,我們可以說0.999999,當9趨進無限時,它的極限為1,否則說0.999999就是1,是不對的,如果沒有條件9趨進於無限,也是不對的!極限是有條件的!所以說無論學什麼,你一定要把概念搞清楚,你要學的東西,都是建立在概念上的,如果這些概念你都沒有弄懂,以後你是沒有辦法學的!
 這裡我畢竟不是講數學的,我所要說的就是,你學的東西要紮實,地基要牢,對概念要理解透徹,死記硬背是不行的!如果你不瞭解它的現實和本身的意義是什麼,你根本不知道你在學什麼!
 離散數學:
 這個實際是最難的理論課程,估計能把它講好的老師也寥寥無幾!
 集合,命題邏輯,謂詞邏輯,數論,圖,群,環,域!前幾部分很簡單,圖論往後簡直難的要命!我在這裡不做多說,因為我沒有學明白,太難了,群,環,域,我連它們的現實基礎都找不到!它們之所以難,是我們很難容入到那種神祕的思考方式,容入思考方式太難了,只有靠我們的感悟,因為這些真正很強的人真的寥寥無幾,能指導我們的更是很少,我本人始終無法理解群的真正含義,我也沒有去查什麼相關資料,但我知道,再抽象的數學理論,都不是憑空想象的,它一定有它的現實基礎,它的出現是有來歷的。
 資料結構:
 資料結構是十分重要的學科,它完全是建立在實踐的基礎上,也就是說,你要多打程式碼。它在一定程度是依賴語言的。我很清楚的知道,第一遍學習資料結構,也就是幾乎很少有實踐的,大腦幾乎一片空白,也是隻有在考試前,反覆的複習才知道在講什麼,只能手工的模擬執行過程,把演算法轉化成程式始終是個迷。但我認為這已經足夠了,因為任何理論只有在理解它,你才能凌駕於它,所以接下來一個質的飛躍就靠自己,靠自己把那些演算法變成程式碼,在自己有想法時,能夠把這個想法用適當的資料結構實現,這需要在電腦旁的硬功夫,絕對是。一個高階的程式設計師,絕對是個硬功夫。這種把自己的想法變成程式碼,也是你獨立思考的開始,記住思考很重要,他是你在捕捉你的靈感,善於思考的人,靈感來的很快,而且你的靈感會告訴你,對於它,你能把它做出來,這一切都是思考的結果,我不是個思想家,但我知道,我每天對世界萬物的沉思,在指引著我發現那些太多的為什麼的答案,這個世界為什麼這個樣子,它後面究竟隱藏著什麼,讓我們大膽的假設吧!!多做程式的人,程式會改變你的思維,這絕對錯不了。
 編譯原理:
 其實編譯原理和彙編,作業系統,語言都是緊密相關的,編譯器是在作業系統之上,語言之下。在講編譯器時,除了講編譯源程式成目標程式外,還介紹了很多地方都用到的自動機理論,這個也很重要。在人工智慧,很多分析語法,文字類的東西都很重要。編譯原理和語言是相輔相成的,只學語言不學編譯,無法真正的瞭解語言,而編譯器是在語言基礎上的,沒有語言的瞭解更學不了編譯,現在大多數高校的編譯原理講的語言都是基於面向過程的,但我認為足夠了,你真正的理解了編譯所講的東西,自己在深入學習面向物件的語言,你一定會很好的把握面向物件的編譯過程,很好的掌握面嚮物件語言,在語義分析過後的中間程式碼生成和動態儲存空間分配,和彙編有很大的聯絡,我在學習彙編時,總是先把要求的題目寫成C語言,在轉化成組合語言,這就是不知不覺的一種中間程式碼生成,雖然不完全一樣,但讓你掌握中間程式碼生成已經足夠了。動態儲存空間分配,主要基於指標所指向的動態空間。因為非指標的變數在編譯時就已經有記憶體分配了,這也是編譯要做的事。
 彙編:
大多數學的都是8086,編譯器我推薦用TD,很好的開發環境。作程式除錯是最主要的,沒有作過程式的人是想不到除錯是多麼難 ,好的開發環境有助於有效的開發程式。個人認為,學習彙編要和計算機組成聯絡起來,主要是指令系統,講CPU時的知識。彙編是最低階的,最快的語言了,有時為了執行速度不得不用匯編來實現想要的功能,我認為對彙編的掌握程度,只要你能做出個遞迴函式就可以了,你瞭解了很多指令用法,暫存器的使用,計算機儲存資料和程式碼的方式,函式呼叫的方式,棧是怎麼實現函式的,你會有很深刻的發展,相信我沒錯的,一定要上機實現一個遞迴函式,再加上你對C語言的瞭解,和一些程式設計知識,你就可以擺平幾乎所有的彙編程式了。
 資料庫
我在大學裡沒有接觸過太大的專案,而且平常程式設計對資料庫深入不多,只是達到了做網上書店所要求的基本知識,首先是ER圖,各種正規化,還有資料流圖,怎麼用語言插入資料,刪除,查詢等等,實際上,你要不是搞理論的,深到資料的具體儲存效率的級別,我想這些對於程式設計就足夠了,但對於高階的資料庫程式設計師這些是不夠的。
計算機組成
對於學習彙編和C語言這個其實很重要,因為這些語言還沒有遮蔽這些硬體細節,VB就幾乎完全遮蔽了硬體細節,你不需要了解太多的硬體知識。但學習彙編和C語言並不是要你瞭解到能作出CPU和連線儲存器,我們只要知道他們的執行機理,但有一點你不要懷疑,那就是電訊號他就是那樣有趣,有趣到你無法想象它的速度和高低電平的傳遞,但是事實就是這樣,你不需要懷疑,承認它就好了,因為我們還不能解釋規律,只能運用它一樣。原理對軟體程式設計師就應該足夠了,它會使你更加容易瞭解作業系統和硬體的工作。
 作業系統
大家每個人對作業系統都不陌生,所有的計算機的課程幾乎都是息息相關的,他們都有太多的聯絡,有些你可能迷茫,當所有的學完以後,你應該有個豁然開朗的感覺,那就是計算機的一切不應該是個迷。作業系統和硬體的介面,就是那些硬體提供的指令,通過這些指令來操作硬體,就象作業系統定義一樣,他是管理系統資源的,管理硬體的使用,你在學習作業系統時,把它看成一個管理者就可以了,它是一個有著自己管理方法的管理者,管理這些硬體給每個程序使用,程序說白了就是一個應用程式在記憶體中或在外存中,有著執行權利的程式。現在的作業系統是多工的,可以執行多個程式,併發是指單個CPU而言,每個程序在CPU中輪流執行,因為它太快了,你根本感覺不到他們的交替性,就象在同時執行,大多數教材講併發比較多,我們大多數計算機都是單CPU的,具體怎麼交替執行,那就是作業系統管理程序使用硬體的方法,不同的作業系統方法不同,但你的方法不要讓其中的一個程序總是得不到想要的硬體使用(活鎖或飢餓),但想出個好辦法還不發生死鎖(這裡不說什麼是死鎖了,我畢竟不是再講作業系統)也很難,總之,你要學的就是這些方法,這裡說的是管理CPU,還有管理記憶體,外設等等。我在給出程序定義時,還說了外存,其實通常就指硬碟,因為你的記憶體太小,執行的程式又多,我要為了讓其他的程式執行,只能先把它放在外存,也叫掛起。總之,你學的就是管理硬體的方法,怎麼管理才能有效率,方便使用者使用。如果可以,你也可以設計一套管理方法,那你就作出了一個新的作業系統。
 計算機網路
所有和硬體有關的最後一個,說實話計算機網路很雜,你學第一遍後,把網路7層所有管理方法說出個查不多,很難,大多數學生都是暈頭轉向,網路是個很龐大的系統,它從硬體到軟體,被規定了很正規的完整體系,這樣大家都遵照這個規則才能,使每個人開發出的軟體和硬體都可以用。記住計算機的互動就象人與人的互動,它通過0和1來代替人的語言,表情或所有可以可以傳達資訊的東西,也可以說是計算機通訊的暗號,只有雙方都知道了這個暗號的含義,雙方才能通訊,你和另一個人怎麼通訊,那麼計算機和另一個計算機就怎麼通訊。例如:我想給你一個禮物(計算機看成我要給你傳送資料,A發給B),我要先通知你,看你能不能收(這符合人的交往)(A發給B一個0和1組成的編碼,事先兩臺計算機已經規定好了,比如說10010011代表看對方是否能接受),如果這個請求不丟失的話(丟失有很多處理方法,你自己也可以想一個處理方法,比如隔一端時間你沒有收到對方是否同意接受,你就重發資訊,總之,只要你肯想象,任何都是可能的),(1)對方傳送一個可以接受的訊息(比如說10010012),你收到了,你就可以傳送,傳送途中又有很多情況,比如說,你怎麼傳送,作車,還是徒步,如果交通堵了怎麼辦,是把禮物一起送過去,還是分開送過去,等等,具體到網路裡是快速傳送,分開發送,我們學的就是這些方法。(2)對方傳送個不能接受的資訊,你是還要立即傳送,還是不發,還是等一會在發,這些方法很活,你要學的就是這些方法,如果你可以處理網路中出現的任何問題,你不學它也可以。我要告訴你的是,你要學的就是就是通訊協議(就是實現規定好的暗號),通訊方法,出現問題怎麼處理等,你有好的方法,你可以不學了,很簡單,方法就是人發現的,你比它的好,學它的幹什麼,就用你的。
 軟體工程
軟體工程是從實踐中總結的經驗,對於很少做過專案的大學生來說,確實很難理解,只要你作過一些專案,比如網上書店之類的系統,你就會有些瞭解,它說的很對,我很清楚的記得軟體工程分這幾個過程:(1)可行性研究,也就是你要做的這個系統可行不,是否值得去做,做了能得多大效益。(2)總體分析,這個就是從整體來規劃你要作的系統,只是個概況,並沒有詳細的階段,把系統大體分成幾個模組。(3)詳細分析,這個階段就是來詳細每個模組,把所有的細節都要寫好。(4)程式編碼(5)測試(6)售後服務。
每個過程有分很多規範,因為一個專案很多人做,很多公司做,沒有個很好的規範會亂套的,所以最後很容易合在一起。

 三。學會自學,學會思考,學會合作與交流!


 大學階段你一定要學會的,這個也是你必須學會!否則你很難進步,對於自學,大家都知道,但確切含義,是你一定要學進去,看一本書,當你看完後,你要有你的見解,要麼接受,要麼否定,如果你兩個態度,都沒有,說明你根本就沒有看進去,哪怕你歪曲了作者的意思,本來作者是對的,你否定了他的意見,這也證明你思考了,只不過是錯誤的,但這比那些光看沒有思考的人要強!但我們看書,如果我們錯誤了,很快就可以改過來的!所以你自學,要學進去,知其然,知其所以然才可以!
 很多人,總說,沒有心情學習,說實在是你自己不去培養這個方面的興趣罷了,說到底都是自己的原因,你不能很好的看書,浪費的是時間,是你的精力,不如不看,做些有意義的事情!
 讀書和思考是同時進行的,學而不思則惘,思而不學則怠,我到大學才真正理解這句話的含義!思考的重要性,超過了一切,思考可以看成兩種,一種是有意識的,一種是無意識的,我們在玩些體育運動時,這種情況想,思考是無意識的,完全靠你的本能,這種本能是靠先天和後天的訓練才獲得的!但我們遇到的事情,大多數都是有時間去思考的,所以,你遇到事情要冷靜的,想想問題的突破口!
 說實話,中國的教育是失敗的,他過分強調知識的結果,不注重過程和起始,思維過程很重要,其實結果並沒有它重要,思維的方式決定著一個人,從小就聽人家說1+1=2,但為什麼?從什麼地方來去思考,怎麼思考,卻很少有人知道。我可能說的有點偏題,但這是重要的,也許是我說數學來把說思維模式引出來。在講授思維時,這狠難,最根本的是,人們對思維還存在著爭議,而且不同人的經歷也多少要決定人的思維。我在這裡只說學習上的思維。我認為人從一出生,就具有某種特長(這是相對的),也就是說在同等環境下的人學習(我們排除在這種學習以前的經歷的影響,比如說學習音樂),一定會分出優劣,在大家都很努力的情況下。如果有音樂天賦的人,他不去努力,可能落後於努力而不具有天賦的人,所以勤奮出天才不假,但要用到自己具有天賦的一面,那必然事倍功半。天賦和興趣不是一會事,但大多數人,能在有天賦中找到興趣,在興趣中而找不到天賦。所以在大學階段,(在中國這種教育,高中階段幾乎不可能),在大多有自己支配的時間裡,你要儘快找出自己的天賦,並發現這方面的興趣。記住,你在這方面有天賦,不代表你在這方面比任何人都前,但你已經比很多人強,如果你很努力,你會走的更高。因為很少有人知道牛頓看蘋果落地,為什麼會想出萬有引力定律,而為什麼我們不能。很多人說是牛頓愛思考的結果,這一點不假,但並不是每個愛思考的人能想到,很好問題就在這裡,這就是我們跟人家的差別,因為思維的東西很難傳授給別人,所以這樣的高人很少,光靠他們留下的書是很難解決問題的。
 記住,你不是愛迪生,你不是愛因斯坦這樣的天才,如果你是,你可以不這樣做,你的學習需要交流和合作。哪怕是天才也少不了這些的,一個人學習,掌握知識慢,效果不高,多個人研究會使你進步的很快!

 四。要想成為高手,一定要從底層學起,底層是什麼?CPU,彙編等硬體指令!

 這個方面我可能要多說一點,其實程式設計這個概念真是有點廣義,做FLASH有FLASH語言,也能程式設計,做網頁有HTML語言和ASP,JSP等也能程式設計,其實這些都是低階的程式設計,不用瞭解底層結構,就可以書寫!當然,你也不可能瞭解這些語言能封狀了什麼東西,你也不能瞭解真正出了問題時,該怎麼辦?舉個MFC例子,如果你對MFC的內部結構不瞭解,對WINDWOS程式設計不瞭解,一旦出了問題,很難找到!有時,為了挽救,就要從建工程,從新把編寫的模組載入到工程下!雖然你解決了問題,但你沒有解決導致你從新編寫程式的根本問題!語言就一個,高階語言封狀了,內部的太多細節!
 現在很多語言有萬能型別,其實這是個垃圾型別,高手一般都不會用,只有菜鳥,覺的使用方便才用它!
 所以你一定要學習彙編,確切的說硬體指令。你學會了彙編,其他硬體指令都是相通的,如果程式碼詳細到彙編的級別,不可能有問題發現不了,一定可以發現!
 學習彙編,你一定要對計算機的體系結構有深刻的瞭解,具體說CPU和記憶體構造!現在的CPU都是邏輯運算器和算術運算器和積存器組成,CPU的發展史應該看一看,對你有很大的幫助,你用匯編程式設計就是用硬體指令,記憶體和積存器!
 對於彙編,你要了解語言的語法,當然所有的指令,我們不一定要記住,用時會查就可以了!如果你能用匯編語言寫個遞迴函式就符合要求了,其他沒有什麼難的!
 編寫一個遞迴函式,要求你會靈活運用各種指令,還要了解函式在記憶體中究竟是怎麼實現的,棧到底是什麼東西!我下面舉個簡單的例子:
 
資料在記憶體的分配

最早的計算機資料段和程式碼段區分的很嚴格,現在似乎沒有這麼嚴格了!對於全域性變數和靜態變數它的分配完全在資料段分配,知道執行結束才會收回記憶體!而對於自動變數(包括函式引數和函式中定義的變數)則在堆疊中分配!一般的分配情形是這樣的:從棧下到棧頂依次是函式引數,函式結束後下一條指令的地址,暫存器保護,然後是函式中定義的變數!
例如:
 void main()
 {
  int m=3,n=4,s=0;
    
  s=f(m,n);

 }
 int f(int a,int b)
 {
  int c=2;
  return a+b+c;

 }
我們從s=f(3,4)開始
它的彙編程式碼大致是這樣:
push n 
push m
call f
push bp 
mov bp sp
push ax //保護暫存器
'
'
'
為c開闢儲存空間
計算a+b+c
彈出c的空間
' //彈出暫存器值
'
'
pop ax
pop bp
ret 8

資料儲存棧的示意圖 
_________
|___c___|<--sp
|___'___|
|___'___|
|___'___|
|__ax___|
|__bp___|<--bp
|IP next|
|___m___|
|___n___|

首先壓棧m,n,這個壓棧的順序c和c++是從右到左,而PASCAL則是從左到右,其實哪個順序是無所謂的
接下來是call f這個是讓IP指標指到函式的入口地址,這個入口地址是在連線時候完成的
接下來是把BP壓入棧中,這裡為什麼要把BP值壓入,因為函式要使用BP這個暫存器,計算機裡的暫存器個數是有限的每個函式都使用,可能造成值的丟失,所以先把BP的值儲存起來,以免丟失,在彈棧時,把這個值在放回BP中!後面的AX等暫存器壓入棧都是這個原理,一般BP用做棧基指標,用來使用棧中當前函式的變數值這個很方便mov bp sp,SP是棧頂指標,這時BP就指向了BP暫存器壓入值的位置BP+4(之所以加4因為整形佔4個位元組)就指向 IP NEXT(函式返回時,IP要接著函式結束的後一條指令執行,這個地方就儲存的這條指令地址)BP+8就指向m,BP-20就指向c
函式執行完後要彈棧,按入棧的反方向彈出,然後IP等於IP NEXT的值,ret 8是告訴系統要把m,n也彈出,8是位元組數
這個模型是一個簡單的函式呼叫模型,它是你必須要掌握的模型,其他的和它實質上都是一樣的c++的函式呼叫也是這樣,只不過在找函式入口時不一樣!
彙編和現在一些常用的指令集合
我又開始說彙編了,因為它實在太重要了!你不學好它,你是學不好其他高階語言的,但要學好彙編又要了解計算機的體系結構,計算機的CPU和記憶體和外設之間的關係,及其它們的構造!現在CPU的暫存器已經達到了64位,算術運算器和邏輯運算器都比以前工作快的多,而且提供專門執行浮點數的各種運算!學彙編是個基礎,有時候,你還要聯合用MMX和SIMD或FFD等多種CPU指令

很多人學過c,c++,其實它們最後都要被編譯器轉化成組合語言的,現在的編譯器已經很好了,完全可以轉化高效的彙編程式碼,機器是機器,始終是不會有人做的好的,有時確實學要我們人來手工編寫程式碼!
很多人始終反對這個觀點——成為高手一定要學彙編,有人用JAVA,c++,c,挺順手的!JAVA我先不提,對於c,和c++因為保留了指標,你不學編譯原理,你不瞭解彙編,你能學好這門語言嗎?根本就學不好,你用著順手是順手,真正講原因,恐怕你說不出來,如果你是做遊戲,做一些需要很高時間和空間效率的程式,c 和c++有時根本就解決不了問題!
現在很多人學JAVA,有幾個知道JAVA的從JAVA這樣語言從源程式——詞法分析——語法分析——語意分析——中間程式碼——中間程式碼優化——目的碼——目的碼在虛擬機器執行,這一系列的整個過程的,幾乎沒有,我們現在拋開面向物件物件語言,來說說象JAVA一樣支援多執行緒的面向過程指令碼語言(其實JAVA也可以理解為角本語言),因為相對面向物件,和麵向過程,唯一不通就是源程式——詞法分析——語法分析——語意分析——中間程式碼這個階段不一樣,往後都是一樣的,有了中間程式碼,有利於跨平臺,有利於移植,對不同平臺我們只需要編寫中間程式碼——中間程式碼優化——目的碼——目的碼在虛擬機器執行這個部分就可以了!
上面過程,你不瞭解(精通很難)怎麼能學好語言,怎麼能說JAVA用的好呢!彙編也是一種中間程式碼,所有的中間程式碼幾乎都是模仿它的模式來做的!

 五。程式設計需要經驗積累,學會除錯對你尤其重要!


 學好程式設計那就是程式設計,程式設計再程式設計!我還是那句話,單純的程式設計很容易學,除錯也是程式設計的一部分,程式是調試出來的一點也不假,我要講的是一些常用的除錯方法,但這裡更多針對c 和c++相關的,用 MS的編譯器!
 你要想除錯,首先要對你用的編譯器有充分了解,我現在經常用visual c++6.0 + sp5 + msdn,這裡建議大家用英文版!因為中文版的有時有問題!
 經常除錯的方法,要針對,具體問題!
 這裡編譯沒有通過的程式 我 不說,那是你語法不過關,出了問題,自己仔細看書去!
 我大致分了兩類,1。能執行的,結果不對,2。根本不能執行!
 對於1,有兩種可能錯誤:
    a是邏輯錯誤,你的程式演算法就不對。也就是說,你程式從總體框架可能就不對,或者演算法根本就是錯誤的
           b是語法你還沒有掌握!容易出現這個錯誤的就是,型別轉換!c和c++是強語言型別,有時提供隱式型別轉換,float c=3.06f; int a=c;這裡的a=3不是3.06,但你有時不知道發生了轉換,所以出錯了!還有就是指標型別轉換,這裡建議要學好指標,這些語法問題,一定要過關!
 對於這種問題除錯方法就是:跟蹤程式,逐漸縮小出錯的範圍 ,最後發現出錯點!這裡你必須有個良好的習慣,寫一點程式碼就或一個小模組就要驗證它的正確性,如果你把寫的程式,一堆不知道對錯都放在一起,很難除錯!
 跟蹤程式,就是跟蹤程式的具體變數值是否正確,用設定段點的方法執行跟蹤,發現錯誤出現在具體哪個模組,然後單步跟蹤,visual c++6.0 編譯器給了我們很多除錯資訊,變數變化,棧和暫存器值,函式呼叫關係,足夠我們找出錯誤!
 對於2,很大一部分原因就是指標問題,指標問題,一般都是由於使用者使用不慎造成的,比如訪問越界,沒有釋放了等等把!
 這裡我教大家一個解決方法,在不設定任何斷點時,調式執行程式,編譯器,執行到出錯地方,馬上就會停止,你就能找的出錯的地方在那裡,但出錯的地方不是出錯的原因所在,一般能找到是哪個指標有問題(但有時編譯器也找不到,這時,你要自己想一下指標在程式流程,逐個分析)你要根據程式的執行流程,觀察這個指標,一定就可以發現問題的!
 其實基本除錯方法也就這些,可能還有很多,具體的都是在這些方法上的操作或演變,其他的經驗因人而異!
     
 6。全域性把握整個工程,具體到每個類的屬性和方法以及各個類的關係!一定確保你設計的類和類模式和類間關係能夠有效,利於修改和升級!概括說就是軟體工程
 對於這個我不想多說,因為我很清楚,這個很難說明白,沒有經過專案的訓練很難理解,大學裡學軟體工程,學完了之後基本空白,不知道怎麼用,有什麼用,說白了,就是把你的系統做的很合理,很簡便,很利於升級!對於這些沒有嚴格的標準!這個還是大家在專案中漫漫體會!


 長篇大論終於寫完了,其實我可能要說的還很多,但作為一個帖子,我主要是把綱寫下來,告訴你們怎麼做,不再迷茫,做到一個真正程式高手!
 作一個優秀的程式設計師很難,他需要了解太多知識,而知識又不斷的更新,你還要不斷的學習,你要有這種熱情,你要有這種激情,才能把他學好,學通,學懂!
 
 計算機行業每年需要大量的人才,中國高層人才少的要命,給你黃金你都拿不走,你知道為什麼嗎?所以你要裝備你自己的能力,總是抱怨,不如使自己更強!
 
 樑肇新有一句話說的好“雄心的二分之一是耐心,我認為應該是三分之二”,你做事情 要有耐心,有忍耐力,才可以,大學每天吃喝玩樂,不去學,說明你根本沒有耐心,所以也很難成就事業!