程式設計“初學者”入門指南 (轉)

amyz發表於2007-08-14
程式設計“初學者”入門指南 (轉)[@more@]

 

  這篇文章大致上是我上次的一個回帖,今天有空就把它整理了出來,希望能造福更多的人。

 


  首先我想說的是,人各有志,不是每一個專業出生的人以後都會去“”的,以前和我同寢室的同學,現在在程式設計的人只有兩個,另外的六個有的去當公務員了,有的去類似銀行、法院這樣的地方做計算機維護什麼的,還有一個改行了,現在在做“信貸”。所以你完全有別的選擇,如果對程式設計沒有興趣,建議你還是去幹點別的,因為沒興趣的話你堅持不下去的,就算硬著頭皮去學,永遠也只能跟在別人後面跑,很痛苦的。另外,考研其實是個不錯的選擇,只可惜要考“政治”和“英語”,不然我也去考了。:)

 

  如果你是一名本科在校生的話,下面的文章就是為你寫的;如果你剛剛開始工作不久,也希望下面的內容能對你有所幫助。。。。。。

 

一。關於計算機本科大學四年的各種必修課

  我首先想說的是,並不是每一門必修課都是有用的,而且確實如此。

1。“顯然沒用”的課是:“大學物理”,這門課你只要做到能有60分就行了。“大學物理”我們是大一學的,由於高中帶來的慣性,我學得很認真,可是現在回頭來看,它是最沒用的一門課,一點用都沒有,當然,也許某某會說這是個“素質”問題,當然,如果你這麼想的話也行,但是我覺得如果你不是對它十分的感興趣的話,還是別在這上面花太多的時間,時間寶貴呀。

2。“更顯然沒用”的如:“XX革命史”、“XX品德”我也就不廢話了。

3。“十分有用”的,它們是:“設計”、“資料結構”、“操作原理”。這三門課,我覺得是整個大學四年最有用的三門課了,而且是直接的有用。“程式設計”,在我們的課表上全稱叫做“C++程式設計”,其實就是教會你使用一門高階語言,重要性不言而喻;而且學到後面,比如在學“編譯原理”的時候,講到各種詞法分析方法時它就會用C++(我看的那本書用的是C++)來寫一些例子,再接著講,也就是說“程式設計”這門課同時也是用來學習後面很多的課程的工具。“資料結構”可以說是“程式設計整件事”要使用到的核心技術之一,必須要很好的理解、完全掌握這門課。“原理”包括了很多東西,都應該很好的掌握,比如“程式和執行緒”的基礎知識如果你掌握的不好,那你以後編“多執行緒”程式的時候就會碰到很多麻煩;而且,只有理解了作業系統,才有可能編好應用,道理很簡單,所用的應用軟體都必須執行在作業系統之上,都必須它的功能。

  對於這三門課,最好不要看國人寫的教材。“作業系統原理”建議看《作業系統:設計與實現》(第二版),作者Anderw S.Tanenbaum等。此書中譯本分上下兩冊,上冊為原理,下冊為Minix作業系統的,上冊必看,下冊根據各人情況有選擇的讀一些也是好的。“資料結構”建議看《資料結構——C++語言描述》,作者William Ford等,但是裘宗燕的一本《資料結構——C++與面向的途徑》也還行,如果你們學校用它做教材的話,那你勉強看看也就湊合了。至於“程式設計”,書太多了,《The C++ Programming Language》、《C++ Prime》、《Thinking In C++》、《Thinking In 》都是好書。另外,說到這裡,不得不提到一個問題:以前經常看到有人爭論一個問題,就是C++、Java、(現在又多了一門)這三種語言到底哪種好?我們應該學習哪一種?這其實是一個無聊的爭論,因為它們的80%都是相同的,所以你用“用來爭論的這點時間”已經可以在“掌握它們其中之一”的前提下學完另外的兩種了,等你精通了這三門語言後,也就不屑於這種爭論了,語言本身只是表現思想的一種手段罷了,它們是何等的容易學習!

4。“有用”的課。這些課,不能算是“直接的有用”,也就是說,它們的很多內容你過幾年也許就忘得差不多了,竟然也不會影響你當前的工作。但是,它們是鋪墊,是基石。對於這些課,我們的態度應該是,注重基本概念,做到“弄清楚大致的”就可以了,但可以忽略不必要的細節(但也許考試的時候會考到一些細節,那你就自己看著辦了)。。這些課是:“微機系統與語言”、“計算機組成原理”、“計算機”、“軟體工程”、“原理”、“計算機介面原理”、“編譯原理”、“計算方法”、“離散數學”。“彙編”還是有用的,它是你理解和學習“計算機組成原理”和“計算機介面原理”的鑰匙。“計算機組成原理”和“計算機介面原理”其實是給你講一遍計算機的結構,比如內部是怎麼回事,它是怎麼計算和快取的,DMA傳輸方式是怎麼樣的等等,弄清楚(或者說曾經弄清楚過,畢竟它們的很多東西你以後會慢慢忘記的)這些東西心裡會感覺比較有底。“計算機網路”感覺上和實際的網路程式設計聯絡不大,也是為你解釋了一些原理性的東西,看了心理比較有底:)。另外“資料庫原理”除了講一些原理以外,一般還會教你語法,其中最難的是各種“查詢”語法了,但是到了實際用的時候你會發現,這些是不必要的,一般的“複雜查詢語句”都有工具可以自動生成的,不用你自己寫的,所以對此你不必擔心。“軟體工程”其實作為一個本科生來說是不可能很好的理解它的,它必須要有很多實踐以後,才能體會其中的一些道理,而且國內的“軟體工程”教材一般都比較“教條主義”,建議瀏覽一遍即可,知道個大概,瞭解一下大型軟體的開發流程是怎麼樣的,就可以了(並且也是需要的),至於其中的諸多概念,重在理解,能理解多少就理解多少,千萬不要去“背”,沒有用的。“計算方法”這門課現在可以說是實用價值劇減,因為基本上所有的演算法都有現成的程式庫可以呼叫的,所以大概瞭解一下就行了,真到要自己開發演算法的時候,不管你當時學得再好,肯定還要回過頭來看這些書的,因為這之間你根本不曾使用過它們,早忘記了。至於“編譯原理”有人認為它很重要,我認為做個瞭解,大致上知道是怎麼回事就行了,因為你不太可能會去開發一個,但是在實際中用到的機會也是有的,比如我有一次程式設計時就需要用到“編譯原理”的知識來做一個“詞法分析程式”,用來處理輸入的,再呼叫幾個庫函式來做定積分,但總的來說“編譯原理”只對很有限的一部分程式的編寫起到了實際的作用,所以,先了解一下,等到用時,再來細看。“離散數學”是前面提到的“資料結構”的理論基礎,如果“離散數學”學得好,理解“資料結構”會更容易些,所以還是花點時間看看吧。

  推薦一本書:《編譯原理及實踐》,作者Keh C.Louden,此書附錄中有一份Tiny語言編譯器的原始碼,對照著前面的理論來看就不會像清華版的《編譯原理》那樣不知所云(我們當時用的就是這本教材,後來我去買了Kenneth C.Louden的《編譯原理及實踐》來看,很多問題才豁然開朗)。
  另外,我想說的是,“軟體工程學”其實現在才處在一個初級的發展階段,CMM、XP等等的理論打得不可開交,各說各的理,幾乎達到了互相對罵的程度。作為一個初學者,特別是“實踐經驗缺乏”的初學者,我建議你對各種理論多瞭解,注意我指的是“瞭解”,不是去“背”其中的條條框框,當你瞭解了大多數現在的主流軟體工程思想以後,就會形成你自己的比較客觀的思想了,當然還需要結合一些實踐的經驗,這是以後的事了。至於看哪些書,太多太多了,自己去找吧。

5。“不太有用”的。其實說這些課“不太有用”已經是客氣的了,它們其中的一些其實就是“沒用”。這些課是:“自動控制原理”、“通訊原理”、“電路原理”、“數位電路原理”、“類比電路原理”、“複變函式與積分變換”、“線性代數”、“機率論與數理統計”、“高等數學”。其中,“自動控制原理”和“通訊原理”我感覺和實際的程式設計相差得實在是太遠了,我學過它們可是現在全忘了,也不影響我現在的任何東西。“電路原理”、“數位電路原理”、“類比電路原理”這三門課講起來也是計算機學科的基礎課,我只覺得“數位電路原理”對於理解比如“計算機組成原理”和“計算機介面原理”這樣的課還有一些幫助,但是另兩門課,我實在發現不了它們到底有用在哪裡,比如“類比電路原理”主要是教你“三極體的內部構造”之類的東西,如果你覺得這也屬於“必須要掌握的東西”的話,那我也無話可說。另外,“複變函式與積分變換”是“數字圖象處理”(這是一門研究生課程)的基礎,如果以後想到Adobe去工作的人,還是應該趁早學好它們,但是除此以外,好像也是別無他用。“線性代數”、“機率論與數理統計”和“高等數學”我倒覺得是屬於所謂的“素質”了,這些東西不懂好像就說不過去了,但是要懂到什麼程度,各人自己看了。另,“高等數學”也是“複變函式與積分變換”的基礎。

6。英語。這門課很特殊,很有用,總之一句話,現在學好了以後絕對不會後悔。:)

 


二。關於課外的學習

  首先我想說的是,如果有志以後成為“優秀的程式設計師”的人,應該從大學就開始自己的“課外自學”了,這是很必要的,否則你會一開始就落在別人後面。另外,不要以為“所有的基礎課都學得十分的好了”就可以“用比別人短得多的時間來學會各種實際的程式設計技術”。

(還有,我想說明的是,我只瞭解程式設計,我不懂。所以你以後如果立志於Linux領域的,我下面的文章對你不會有多少幫助)

1。主線。

  作為“主線學習”。我建議這樣進行:首先看這兩本書:《Windows 程式設計》(第五版),作者Charles Petzold;《Windows 核心程式設計》(第四版) ,作者Jeffrey Richter;毫無疑問,此兩本書必看!否則你永遠也不可能成為一個專業的、高階的程式設計師(我指Windows程式設計師)。另,看《Windows 核心程式設計》以前需要有“作業系統原理”的基礎。同時,如果學的是C++(在目前,C++在中國仍然是使用最廣泛的程式語言),只看看你們的教材是肯定不夠的,除了上面說的《The C++ Programming Language》等書(挑一本看就夠了)以外,還應該看看《Effective C++ 中文版》,作者tt Meyers。接下來,我建議你不要去學MFC了,它已經過時了,而且確實不太好用,我回想起當年學MFC的情景,總是覺得付出和得到不成正比。這時候可以去學“.NET”程式設計了,先學一下C#的語法(Tom Archer的《C#技術內幕》還算不錯),你會發現它極容易,可以飛速的看完,因為你已經有了很好的C++基礎了。然後再找一本比較全面介紹“.NET”的書看起,現在的話,我覺得《.NET 程式設計技術內幕》是個不錯的選擇,作者Jeff Prosise。我這裡不是說學“.NET”就看這兩本書就OK了,但是作為一個“學生”,能看到這裡就不錯了(當然你要是覺得還不夠的話可以去看看Jeffrey Richter的《Applied .NET Programming》)。還有,在學習各種程式設計技術期間編一些自己的小程式是必不可少的,不然的話,你會學什麼忘什麼。最後,再有時間的話,學一學“設計”(它其實很重要的,而且慢慢的你會覺得它越來越重要),書蠻多,《設計模式》值得推薦(作者Erich Gramma等),它是“設計模式”類書籍的宗師,很不錯的書,“設計模式”也是要一些實踐經驗作鋪墊的,因此你可能不能完全的理解它。

2。支線。

  作為支線,也就是說我覺得它們相對次要些。並且學習它們可以不分先後次序,但是,我還是建議先看完上面說的前三本書(《Windows 程式設計》、《Windows 核心程式設計》、《Effective C++ 中文版》)以後再來學下面的東西。

  “Java”。。把“Java”作為支線一定會引起很多人的不滿,或者說是憤慨,當然,你也可以把它作為主線來學,用來替代上面說的“.NET”。可是根據我自己的體會,“.NET”擁有更多的優勢,如果你不同意我的觀點,當然可以去學“Java”,沒問題。但是作為一個“初學者”,我還是建議你兩樣都學一下,這樣自己才能有比較,才能為自己的將來選擇一條更適合自己的“技術路線”。另外,時間還是多的(主線中才提到了六本書),而且,我這裡說的“學Java”只建議你看一本書:《Thinking in Java》,這本書可以說是的絕佳選擇,至於以後怎麼繼續學習“Java”,可以去看看蔡學庸在CSDN上的專欄文章,裡面講得很詳細了。
 
  “網路程式設計”。。這個東西我想很多人都是比較嚮往的。我建議如果想做到對網路程式設計“比較精通”的話,應該去看看《Windows 網路程式設計技術》(第二版),作者Anthony Jones。這本書和上面講的《Windows 程式設計》屬於同一個技術層次,都是用“Windows ”直接程式設計,學這類東西的好處是能使你不僅“知其然”而且“知其所以然”。但是,如果立志要學“Java”的,也可以跳過這本書,直接看《Java Network Programming》,是O'Reilly的書,作者我忘記了。至於“.NET”方面,我還沒發現專門講網路程式設計講得特別好的書,自己去找找吧。(其實一般的“.NET”書籍中已經有大量關於網路程式設計的內容了)

  “COM”。。“以前的學習方法”是先看《深度探索C++ 物件模型》,作者Stanley B.Lippman;再看《本質論》(作者Don Box)的前面兩章,然後看《COM 原理與應用》(作者潘愛民),再回過頭來看《COM 本質論》的後面部分。《COM 本質論》的前面兩章講得極好,它用最能讓人理解的方式講述了“什麼是COM”,但這本書的後面部分比較晦澀,如果沒有一點實際的“COM程式編寫經驗”,就很難理解了,所以我提到這裡要插進來看一看潘愛民的《COM 原理與應用》。但是,這裡有一個問題,《COM 原理與應用》裡的應用部分使用的是MFC和ATL(抱歉我又提到了這些過時的東西,我只是對它們太熟悉了),我前面曾建議大家不要去學MFC了,於是產生了矛盾,請恕我無知,在當前的情況下,我不太能肯定要怎麼學習“COM”才是最有效的,這裡我確實不能給大家“的方法”了。但是現在隨著“.NET”的推進,“COM”的生存空間似乎是越來越小了,因此“到底要把COM學到什麼程度”也幾乎成了“到時候看情況再說”的問題了。但是,我覺得無論如何瞭解一下“COM的基本思想”還是能帶來莫大的好處,它太經典了!也就是我上面說的《COM 本質論》的前面兩章。

  “DDK”。。所謂“DDK”就是“裝置程式”,這屬於一個相對冷僻的方面,但事實是“正因為它冷僻,所以這方面的技術人員的收入還是不錯的”,但是“DDK”的知識對你學習別的很多東西(比如“.NET”、“Java”)都不會帶來任何的幫助,它比較獨立。所以我的建議是“在你還沒有能力確定以後自己的專攻方向時,不要去學它”,因為它實在也不太好學。我對它只是略知一二,所以也只能說到這裡就作罷了。不過可以給你推薦一本書:《Programming Microsoft Windows Model》,(作者Walter Oney)。

  好了好了,再下面就絕對要超出“初學者”的範疇了。其實學到這裡,再加上你已經積累了一定的實際經驗了,那下面再要學些什麼,路要怎麼走,就一定會有自己獨立的想法了。我就不再廢話了。

 


三。幾個初學者要注意的問題

1。無論在學基礎課的時候,還是在學實際的程式設計的時候,都是重在理解,千萬不要死記硬背。比如上面說的“軟體工程”就是最好的例子。有一次,我碰到兩個人正在討論MFC,“甲”說:“我覺得MFC真是複雜,這麼多的類和方法,根本不知道怎麼去學。”這時“乙”表示他也有同感,但是已經找到了學習的方法,於是“乙”很誠懇的對“甲”說:“其實有時候還是要背一些東西的,你可以去買一本中文版的MFC類庫手冊,天天背,天天記,慢慢的就好了。”。我當時從旁邊走過,打了一個冷顫。。對於MFC這種東西,除了理解還要多用,很多東西自然就記住了,當然這麼多的類和函式還是沒能記住它們的確切名字和用法,但是彆著急,你已經知道了有哪些類和方法大概是存在的,所以真到用的時候再到“MSDN”裡去找唄,怕什麼呢。

2。我前面提到了《Windows 程式設計》和《Windows 核心程式設計》這兩本書是必看的,它們都是在介紹基於“ SDK” 平臺(或者說是介面)的程式設計,也就是用“Windows API”直接程式設計,這是一種十分底層的Windows程式設計方法。就今天來說,學習“Win32 SDK”程式設計的意義更大的在於“使你能夠更徹底的理解基於它們之上的、包裝得更好的、更易於使用和更高的各種技術,以便能更好的使用它們”,比如“MFC”、“.NET”等等。如果你一定要在實際的開發中也直接用“Windows API”來程式設計,無疑是自討苦吃。因此,我們要鼓勵使用各種開發效率更高的工具,當然,理解“Win32 SDK” 平臺的程式設計能在你使用這些高階工具的時候給你帶來巨大的好處。“網路程式設計”也是同理,我上面提到的那本《Windows 網路程式設計技術》也是基於Winsock(它是Win32 SDK的一部分)的書,實際程式設計的時候,你也許不太會直接去用它。

3。實踐很重要。這個道理是很明顯的,比如C++的語法,如果你不去用它的話,就算你當初能把整本書都背下來,到了大四的時候肯定也忘得差不多了。用的過程其實就是熟悉的過程,在用的時候可能會發現自己某一個細節怎麼又想不起來了,沒關係,正常的,再拿來書翻開看看,如此反覆幾次也就記住了。

4。堅持很重要。這裡有一個前提,就是“你是真的對程式設計很有興趣”,如果確實如此,那不用說你也會去不斷的學習的。但如果不是這樣,那就很糟糕了,就像我開頭的時候提到的那個人,他就是“實在對程式設計沒興趣呀”,所以一直工作的很辛苦,感到身心疲憊,還總是落在別人後面,現在終於不得以該行去作“信貸”了。

5。關於“高階程式設計師”考試。這個考試其實是名不副實的,他分上午場和下午場,上午考一些基礎概念,也就是上面提到的那些本科課程中比較重要的幾門課,考試難度和形式都和你們的期末考試差不多,下午考程式設計,其實就和你們的“程式設計”期末考試最後的幾道程式設計題差不多。一句話,考的是很理論的東西,死讀書的人一般都能透過的:)。如果你瞭解到你以後要去應聘的公司對這張證照比較看重的話,那就花一些時間去複習一下以前的課程,去拿一張證照,像我的兩個去當公務員的同學居然也都透過了這個考試。但是如果這張證照不是你就業的前提的話,我建議你不要在這上面花時間了,因為它太簡單了,對提高你的實際水平沒有幫助的。當然這只是我的個人觀點,沒有蔑視這項考試的意思。

6。也許你的志向是當一個“技術總監”,或是“XX主管”之類的,也就是所謂的“不寫程式碼的人”,當然,很多人都這麼想。但是,請記住,這些人其實都有著很好的實際程式設計經驗,如果沒有這段經歷和積累,他們根本就到達不了現在的境界,也不能服眾。所以,趁早多學一些“技術”是很必要的。

7。最後我想提醒各位,雖然至此你可能已經覺得自己“學識滿腹”了,但是千萬不要以為自己懂的多了,就開始自以為是,開始看不起別人了。我曾經有幸聽過“錢能”老師的課,他給我印象最深的一句話就是:“你越學就應該越是覺得自己無知啊,怎麼這麼多東西自己都不懂呢?所以要謙虛啊,要謙虛啊,千萬不能學了一點點東西就自認為了不起了。”(這是他在課堂上的原話。。。)

 

***真心的祝你:學習愉快,程式設計愉快!***


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-956276/,如需轉載,請註明出處,否則將追究法律責任。

相關文章