你是一個程式設計師新手,剛從大學邁進公司卻沒有人指導,要麼公司給你指定了導師,卻不好意思大事小情都問他。你想提高自己的程式設計水平,卻不知該如何下手。如果你想提升自己,成為一個合格的天天向上的程式設計師,這篇文章就是為你準備的。
學什麼?
有些人對什麼都感興趣,硬碟上存著幾百G的教學視訊電子書破解軟體,卻只是僅僅儲存著,沒有轉化成知識。有些人只知道自己剛進公司的那點東 西,JDK一定要1.4.2,VC++一定要6.0,系統一定要Windows XP,否則就是大逆不道。前一種是不知道自己想要什麼,後一種是固步自封、眼界短淺,都不是一個程式設計師應該有的學習態度。
常見的程式設計師有Windows桌面開發,Linux伺服器開發,Web前端開發,DB資料庫相關,遊戲伺服器端開發,遊戲客戶端開發,RIA開發 (如Flash、Silverlight),移動開發(這個現在最火了尤其是Android和iOS),嵌入式開發,行業軟體開發等等,基本上我列舉的這些已經涵蓋了大部分程式設計師型別,每個型別都有不同的基礎知識以及擴充套件內容需要學習。另外有一些共通的內容如資料結構、基本演算法、作業系統是都應該學習瞭解的。
另外一種分法是按照程式語言區分,但是這個比較有侷限性,比如C程式設計師,一般是Linux伺服器開發或者嵌入式,單純懂C語言是沒前途的。再比如PHP,就要對Web前端開發和伺服器都有所涉及才能稱得上稱職。
在這裡還要多廢話一句,程式設計師相比其他行業是一個需要不停學習的行當,固步自封立刻就落後,經驗值的累積速度會隨著年齡的增長而降低,這也是為什麼在國內很少看到50歲以上的程式設計師。至於架構師這個很多程式設計師期望的職業,我的看法是:如果架構師不寫程式碼只會用PPT,只不過是一個大忽悠罷了。
我這篇文章只是介紹了一個方法,希望能幫助剛入門的朋友答疑解惑。根據這篇文章(怎樣練習一萬小時),如果你想得到一個比較不錯的職業發展,長期不間斷的練習是絕對必須的。
如果你的情商高於智商,非常擅長與人交往,那麼程式設計師不是合適你的職業,做其它任何行業都會得到比程式設計師更好的結果。這也許有些偏激,但對於國內現狀就是這樣。十年以後,如果你還是在做程式設計,比較一下你的同學朋友就會知道我說的正不正確。
如何學?
我下面介紹的學習都是關於技術,但是首先要說明的是,一個優秀的程式設計師必定要對英語有一定的掌握,應該有比較強的讀寫能力,另外最好有一定的聽說能力。
英語的學習如同技術學習一樣,必須持之以恆。比如每天都聽一篇 CNN Student News,泛聽一下Nightly News等等。在Apple iTunes上可以免費訂閱大量Podcast,只要你堅持聽時時學,英語水平一定會提高。而且英文水平的提高會對你的職業帶來非常大的幫助。
專精篇
無論什麼行業,如果想成為專家,專精某個或者某幾個方面是必要的,比如我就一直標榜:Windows Visual C++程式設計師。這裡面就包含了Windows開發,Visual C++整合開發環境使用,C++程式設計師幾個方面。
我們用學習英語的辦法來說明如何專精“聽讀寫說”,就以一名C#程式設計師來舉例好了。
1)聽看
第一步是聽視訊或者看視訊。這是對某個方面知識快速瞭解的好辦法,因為視訊相比書籍文件更精彩一些,而且花費的時間相對比較少,注意力更集中一些。
在www.verycd.com上可以看到大量的程式設計類培訓視訊,只要你想學的不是非常偏門都可以找到。也可以在優酷上線上觀看。如果你對自己的英文水平有自信,可以到youtube.com上觀看英文的視訊。另外C#是微軟公司出品,微軟公司最大的特點就是不差錢,他們的免費視訊在網上都可以找到。
2)讀
讀是專精某個領域知識中最重要的一步,讀書、讀文件、讀程式碼都算是這部分。
先說說讀書。讀書首先是選對書,選書也難也不難。如果你身邊有高人,可以請教高人。如果感覺沒有高人,那麼可以參考china-pub的排行榜,然後結合douban.com上的網友點評來選購,如果還沒頭緒,給我留言好了。計算機方面的書籍我建議選下面幾個出版社的:人民郵電(知名品牌是圖靈)、 電子工業、機械工業、清華大學出版社、東南大學出版社。不能說他們出版的一定是精品,但是精品基本上都被這幾個出版社出了。比如C#方面,如果我選擇我會選這一本作為精讀——《C#與.NET3.5高階程式設計》
精讀的書目不要多,一次應該限定在兩三本左右。讀書時應該備有以下工具:一個本子,一支熒光筆,一支簽字筆。本子用於記錄自己的心得體會,感覺比較精彩的內容可以標記出來。另外應該定期把筆記總結到網上(比如google docs中)。為什麼不直接總結成電子文件呢?個人經驗覺得本子是最快捷也最不影響閱讀的記錄方式。如果你覺得轉成電子文件麻煩,那我還有一絕招,就是直接用數位相機用微距模式拍照,然後儲存圖片就好了。
如果涉及到程式碼,也應該把示例程式碼的執行環境準備好,比如C#就需要安裝一下DotNet開發環境(比如Mono或者Visual Studio),學Java就應該安裝JDK,學C語言應該安裝一個gcc等等。
精讀時應該儘量理解每個章節,章節後面如果有習題就應該把習題做完,然後再學後續內容。如果有相關示例程式碼,也最好把程式碼自己錄入然後除錯執行一 下。前面之所以提到選對書,就是因為如果你書選的有問題,那麼精度這一步就很難進行下去,翻譯的質量直接影響到你學習質量。精讀時的進度也不要太快,免得自己理解不深。如果有可能,最好中英文比對一下(現在網路上可以搜到很多書的英文版ebook),這樣不僅可以學習英文,而且最重要的是一些中文中比較難理解的,閱讀英文部分可能會容易看懂,這個好像有些難理解,但是就我個人翻譯的經驗,一般來說翻譯會把譯者的想法帶入,所以很可能造成一些歧義。
精讀部分還包括讀文件,因為很多比較新一些的知識還沒有書籍,只有論文或者電子文件,還是建議把文件列印出來閱讀。
讀程式碼也是很重要的一點,如果不是天才,那閱讀經典程式碼就跟閱讀經典名著一樣,對於程式語言的學習是非常必要的。選擇一個好的閱讀專案跟選書一樣要精心,我建議先從比較精短的示例開始閱讀,比如微軟的C# code example或者像是www.codeproject.com上得分比較高的文章程式碼。閱讀的程式碼一定要選擇可實際執行的,這樣可以在你感興趣或者有問題的地方加上斷點除錯,觀察變數、呼叫棧等等變化。
當掌握比較基本的知識以後,應該轉向選擇一些比較經典的開源專案。C#或者Java好的開源專案很多,這裡就不多說了。
3)寫
這裡的寫不是指前一步中寫寫書上的示例程式碼,而是說把前面兩步學到的知識應用到實際專案中,這一步是最重要的。
再加強說明一次,把學到的東西應用在自己的實際專案當中,不管專案大小,這一步是自學過程中最重要的。
跑題一下說說,我看到過很多培訓,內容很好,講的也不錯,但是最後收效甚微。問題不是講師的水平不夠,而是聽眾只是聽了,沒有用起來。光看是看不成高手的。
有些朋友會問了,我真不知道寫什麼,能給點建議麼?我的建議是先從小應用開始,然後在寫一個比較實用的程式。
什麼是小應用呢?比如我喜歡看網路小說,就可以編一個瀏覽器一樣的程式,開啟以後它就直接訪問小說網站。或者喜歡炒股的,可以編一個股票資訊收集, 把網上的股票資訊抓取下來。或者有一些自己需要的功能,比如定期抓取螢幕存成圖片檔案(這個對於測試人員比較有用),或者就是編一個程式它可以播放視訊音訊。小應用的意思是自己覺得好玩,功能上也不是很複雜,比較容易實現的。
寫過一些小程式以後,有感覺了,那就應該把學到的東西用到自己實際專案當中,比如我學Lua,就用Lua加Sqlite資料庫編寫了以前需要手動實現的功能,也用Lua實現了對C++程式碼的解析生成html幫助文件。也許你工作專案未必需要這個知識,但是可以在一些邊緣專案中使用,力爭多用多寫,熟能生巧,程式設計其實就是手熟罷了。
如果就是不知道該如何寫一個小程式,那麼有幾種可能,一個是你想的功能太複雜,這個好解決,另找一個題目就是了;另一種可能是你精讀的不夠,我建議你把書再仔細讀一遍,把書上的例子好好再次寫寫;如果題目也不復雜,精讀也讀了,還是不知如何下手,那勸你還是換一個行當好了。三百六十行行行出狀元,不是一定要做程式設計師這一行的。
4)說
說,就是分享。分享的過程其實也是提高的過程。
一般來說,IT公司都有一個分享學習機制,程式設計師對自己專長的方向研究一段時間以後,整理成ppt,然後演示給大家看。也有一些興趣組比如Python本地使用者組也有類似線下分享交流的機會。如果有這樣的機會,建議大家踴躍作為講師參加。當你寫講稿或者演示的時候會突然發現某些方面其實還很薄弱,當聽眾提問交流的時候也會發現自己某些地方可能瞭解的不是那麼透徹,這其實也是在學習。分享不僅僅鍛鍊口才,而且會給人你在這個領域比較精深的感 覺,而且從分享過程中你會發現很多以前沒注意到的問題。
分享也是推廣的過程,比如你看好C#語言,但是公司可能覺得沒有這方面人力或者瞭解不夠,你的傳道會讓大家對這方面知識瞭解的多一些,相關疑問也可以找你來答疑,這樣也是提升人氣值的好辦法。
廣博篇
一個優秀的程式設計師,不僅僅要有幾樣拿手的專業領域,還應該博彩眾家之長,瞭解一下軟體工程、架構設計等等方面的知識,還要及時跟蹤瞭解國內外技術動態。
首先,應該像英語學習中的泛讀一樣,通讀一些感興趣的經典的書籍,比如《程式設計師修煉之道》《設計模式》《程式碼大全》《深入理解計算機系統》《快速軟體開發》《Unix程式設計藝術》《程式設計珠璣》等等。這些書不像精讀書可以立刻用到實際。但是這些經典書籍中的思想是可以一直影響整個程式設計生涯。其實這些書才是真正值得精讀的。只不過沒辦法立刻見效,所以把它們作為廣博篇中的提高階書目。
選書一定要小心,爛書就跟老鼠屎,會噁心你很長時間並且降低你學習的積極性。如何選一本好書參考前面精讀部分。
想了解技術動態,訂閱技術牛人的blog是非常重要的,比如我對redis很感興趣,於是就訂閱了redis作者antirez的部落格,他有時候會對一些專案中比較重要的設計做解讀。另外比如infoq.com,可以訂閱他們的rss來跟蹤最新的文章。我建議大家申請一個google賬戶,使用 google reader作為rss閱讀器。在google reader中訂閱很方便,直接加入部落格地址就可以了。
想跟蹤最新潮最酷炫最流行最時尚的程式設計技術,下面幾個來源不可錯過。
- 一個來源是reddit的programming討論區 http://www.reddit.com/r/programming/,reddit的程式設計討論區非常活躍,基本上流行的部落格文章內容都會被人提交到討論區,而且討論的質量也很高。
- 另外一個來源是DZone的首頁http://feeds.dzone.com/dzone/frontpage,DZone新聞有一個很有意思的特點是可以看到頂和踩的數量,一般頂數量比較高的,可以閱讀。
- 再有一個是美味書籤的programming http://www.delicious.com/tag/programming 和development http://www.delicious.com/tag/development ,這兩個tag基本上涵蓋了程式設計相關的連結(未必是新文章),可以作為參考。
- 最後一個新聞來源是HackerNews,也就是HN http://news.ycombinator.com/ ,HN與reddit programming有些類似,可以作為一個補充。
這幾個來源更新非常快,基本上每天都可以看到上百條更新。我建議是不用每條都看,標題感興趣的看一看,或者發現同時在幾個源都出現的也可以看看。每天有個二三十分鐘看完前面幾個新聞來源,對於新技術動態或者各種技術八卦那就是了如指掌了。
如果你發現某個部落格文章寫得質量非常高,建議你可以訂閱這個部落格,一般來講這樣的部落格質量都是水準以上的。我大部分的技術部落格都是這麼蒐集來的。
另外現在部落格上基本都有twitter地址,也可以follow這些技術牛人的twitter,由於推特的侷限,相比部落格的學習價值要更低一些,但是交流的時效性比較高。
郵件列表討論也是一種很不錯的討論方式(相比論壇而言),比如python-cn,toplanguage都是很好的中文技術類郵件討論組。
關於廣博篇,本來還想展開一些,寫寫如何解決問題,但是這些內容在以前的部落格中都有涉及。