首先問你一個問題:你們在學校都學些什麼課程?
問這個問題的原因是,我認為學校的電腦科學基礎課很重要。如果你所在學校的課程設定合理,那你應該先把主要精力花在這些基礎課上。很多學生看到基礎理論就茫然,不知道這些圖表,符號,甚至硬體的知識對將來的軟體開發有什麼用。用處大得很哪。比如,作業系統課裡講到的多線程的東西在系統編程裡很有用。又比如,儘管你將來不會去涉及電腦的硬體,電腦架構裡的知識對分析演算法的效能(快慢等等)很有用。可以把電腦語言和開發工具比作文字,而把電腦科學的知識比做思想。只有思想,不會行文,不行;但是,行文流暢,思想空洞,也不行。大學的階段正是打好基礎,豐富思想的年代。
成為一名好的程式員,不是簡單地通過學幾門課程就能做到的。我個人認為成為一名好的程式員的要素有:
1。紮實的基礎知識;
2。很強的解決問題的能力;
3。熟練的編程調試能力;
4。創新能力;
5。團隊合作能力;
6。持續的自學能力;
7。好奇心
這些能力和品質(甚至可以說是習慣)都應該從大學階段就著手培養,並且從身邊的小事開始培養。比如,很多中國的大學畢業生都缺乏編程和調試經驗。學習C語言,考試過關就算學會了。課題項目中,只要程式能夠編譯,運行,並且輸入輸出滿足要求就了事了。但是,寫程式的時候是否想過如何把程式寫得更加精鍊,高效,高品質?對程式調試中出現的問題是否刨根問底知道原因,還是不求甚解搪塞過去算數?還有,很多中國的大學畢業生對於知識的掌握膚淺,機械,沒有好奇心,不會刨根問底。比如,學會了C++,有沒有看過一個object在編譯後,在彙編代碼中是如何被初始化的?這個object的各個成員在記憶體中是如何放的?在一個成員函數被調用的時候編譯器在彙編代碼中加入了哪些額外的動作?虛函數的調用是如何?的? 這些東西恐怕在程式設計語言或編譯原理中都沒有詳細提到。但是,你是否有過好奇心去知道?最後,一些中國學生的大問題就是死記硬背,沒有學到某種演算法技術的根本原理,沒有應變和創新的能力。比如,有個問題是如何在不用額外記憶體的情況下把一棵樹的同一層節點都連起來。很多學生都能夠回答這是一個廣度遍曆的問題。但是,課本上說了廣度遍曆是一定要有額外資料結構輔助的(隊列)。所以,不給額外記憶體怎麼行?請看,課本上說的用隊列的方法記住了,但是就是不知道為什麼要用隊列。如果深刻掌握了這個隊列的作用,那麼這個問題是很容易的。
程式設計語言其實是一個很初級的工具,但是你又必須熟練的掌握它,學懂一門程式設計語言就好像學會了寫字,但是會寫字的人不見得會寫文章,而會寫文章又不見的寫得好。可是如果你不會寫字,那就一定寫不出文章來。
首先,在學習C語言之前,應該學好電腦基礎。裡面的很多概念對於C程式員都是非常重要的。如果你在著手學習C之前,或者已經開始學習C,但是碰到了很多問題,應該再把電腦基礎的書拿來好好看看。
如果你有足夠的耐心,十足的毅力,應該再學習C語言之前學學彙編,這會讓你對許多比較細膩的概念有清醒的認識,如果你不是那麼有耐心(恕我直言,大部分人可能沒有)。那麼可以在看完一遍C語言的教材後再看,但是一定要看一遍,相信我一定會受益匪淺。
看到有些人發問的文章,很明顯的沒有仔細的思考過問題,或者沒有認真地查閱過書籍,因為其中的文法和邏輯錯誤實在是不能理解。想來如果你的語文作業上面滿篇都是錯字,老師一定不會放過你。為什麼不先打好基礎呢?有些人抱怨說因為教材不好,老師水平不行等等。但是我本人就是在TC2下學習C語言的,那時候除了譚浩強的書,也幾乎找不到什麼別的書。我不打算就譚浩強的書發表什麼意見,那也實在稱不上是一本好書,但是如果這本是能學好,全部看好,都記住,也應該有相當的水平了。建議不管看什麼書,先認真地看懂,不要貪速度,應該力求深入的理解。
如果你能夠比較熟練的解決一本教材上的所有習題,那麼就應該轉入對演算法的學習,儘管此時你的C語言還稱不上精通,有許多細節問題還不瞭解,許多問題還沒有碰到,但是這些問題會在後面的工作和學習中得到解決的。
過去,有個著名的公式,大概是:程式=語言+演算法+資料,不知道現在還提不提這個了。可能現在要加上更多的內容:專案管理、品質控制、代碼規範…………。但是這個公式還是有相當的參考價值,還是用寫文章來類比,語言好比文字,演算法是文章的思想,資料是文章的內容。所以在經過一個階段的識字之後,應該試著發表一下自己的思想了。
經過一段零零散散的演算法學習,對“演算法”這兩個字有了概念之後,應該系統地對演算法進行學習,這個過程是與資料結合在一起的,應該看看資料結構,而且必須熟練的掌握。在這裡提到的一本書是《運籌學》,裡面的演算法大都可以用電腦實現,我推薦這本書的原因在於,它不僅介紹了特定問題的演算法,而且詳細解釋了為什麼要這樣算,怎麼得出這個演算法的,等等。對於提高思考問題的能力有很大協助。
如果你的精力和時間允許,現在就應該開始大量的閱讀和編寫代碼了,兩者同樣重要。“讀書破萬卷,下筆如有神”,儘管這種學習方法效率較低,而且很枯燥,但是應該看到,古代的這種教育方式培養了千古文豪,而現在的語文教育培養出來的…………(唉,中小學語文教育的現狀大家都知道,我就是受害者)。讀代碼確實是一件非常辛苦的事情,我曾經試圖閱讀全部的Linux核心原代碼,最後只看了不到十分之一,而其中看懂領會的,也就一半而已,但還是感到有很大協助。至於大量編寫代碼,理由很簡單:實踐性的技術要在實踐中提高。但是要注意,如果你已經學完了C語言和資料結構(而且學得不錯),那就不應該專註於那些小程式了,那根本就是在浪費時間,此時應該編寫有些規模的,具有一定實用性的程式。並在這個過程中開始領會軟體工程的一些思想。第一個寫出來的程式一定是錯誤百出,一點點地修改,一點點地調試,一定會通過的。對於寫代碼,說一個我本人的經曆,我第一遍看譚浩強的那本書,看到條件分支的時候,突然很興奮,想要寫點什麼,於是看了一些TC2的協助,懂得了圖形編程,就自己寫了一個水果賭盤的遊戲,可能有人在遊戲廳見過,就是可以壓什麼蘋果橙子之類的。各位可以想象一下,當時我還不會數組,不知道迴圈,於是所有的這類東西都是用goto來完成的,這個曆史上最蹩腳的程式居然也正常運行了,後來我發現原來可以使用迴圈,於是將這段代碼替換掉,學到數組的時候,終於將那些小燈在螢幕上的位置放到了數組裡,學到檔案的時候,將圖形放進了二進位檔案(原本都是一條線、一個點畫出來的),記不得經過了多少次修改,總之程式能運行之後,長度從2700行變成了127行。所以,想學好編程是要有點毅力的。
最後發表一下先學習C還是先學習C++的問題,這個問題見仁見智,我的意見是,先學習C。
儘管現在我很少用C了,但是C語言確實更加基礎,一個C++的高手要考慮的一些問題(比如記憶體的操作方面的問題),C語言的初學者可能就必須有所瞭解,否則會犯錯誤。這些只是遲早是要掌握的,但是因為C++關注更高層的概念,所以在學習C++的過程中這些問題可能被忽略了,以至於有人用了一兩年C++,還是有些問題不是很清楚。另一個主要的原因是:C++太優秀了,而C++的程式員會在某種程度上感覺自己比C程式員高明(他們確實有理由這樣),於是學完C++之後你可能就不屑於學習C所關注的內容,這樣的話會錯過提高的很好機會。
想成為一位好程式員(其實從事任何一個行業都是如此),重要的是要養成一個鑽研,好奇,創新,動手,合作,不滿足於填鴨,不滿足於考試交差,不滿足於表象的一種優秀的習慣。這不是學幾門課能夠一蹴而就的。當然,如果你的在校課程不能使你滿足,論壇上的朋友可能能夠給你推薦一些書或科目。
最後,不能只學語言。許多大學生認為學最新的電腦語言、技術、標準是最好的鋪路方法,因為許多公司招聘時要求這些方面的經驗。這些新技術雖然該學,但是學習電腦基礎課程更重要,因為電腦語言和開發平台日新月異,但是萬變不離其宗的就是那些基礎課程:資料結構、演算法、編譯原理、電腦群組成、關係型資料庫原理等。有位同學生動地在“開複學生網”上把這些基礎課程比擬為內功,把新的語言、技術、標準比擬為外功。只追尋時髦的學生最後只懂招式,沒有功力,是不可能成為高手的。