你是一個(gè)程序員初哥,剛從大學(xué)邁進(jìn)公司卻沒(méi)有人指導,要么公司給你指定了導師,卻不好意思大事小情都問(wèn)他。你想提高自己的編程水平,卻不知該如何下手。如果你想提升自己,成為一個(gè)合格的天天向上的程序員,這篇文章就是為你準備的。
學(xué)什么?
有些人對什么都感興趣,硬盤(pán)上存著(zhù)幾百G的教學(xué)視頻電子書(shū)破解軟件,卻只是僅僅保存著(zhù),沒(méi)有轉化成知識。有些人只知道自己剛進(jìn)公司的那點(diǎn)東西,JDK一定要1.4.2,VC++一定要6.0,系統一定要WindowsXP,否則就是大逆不道。前一種是不知道自己想要什么,后一種是固步自封眼界短淺,都不是一個(gè)程序員應該有的學(xué)習態(tài)度。
常見(jiàn)的程序員有Windows桌面開(kāi)發(fā),Linux服務(wù)器開(kāi)發(fā),Web前端開(kāi)發(fā),DB數據庫相關(guān),游戲服務(wù)器端開(kāi)發(fā),游戲客戶(hù)端開(kāi)發(fā),RIA開(kāi)發(fā)(如flash、silverlight),移動(dòng)開(kāi)發(fā)(這個(gè)現在最火了尤其是Android和iOS),嵌入式開(kāi)發(fā),行業(yè)軟件開(kāi)發(fā)等等,基本上我列舉的這些已經(jīng)涵蓋了大部分程序員類(lèi)型,每個(gè)類(lèi)型都有不同的基礎知識以及擴展內容需要學(xué)習。另外有一些共通的內容如數據結構、基本算法、操作系統是都應該學(xué)習了解的。
另外一種分法是按照編程語(yǔ)言區分,但是這個(gè)比較有局限性,比如C程序員,一般是Linux服務(wù)器開(kāi)發(fā)或者嵌入式,單純懂C語(yǔ)言是沒(méi)前途的。再比如PHP,就要對Web前端開(kāi)發(fā)和服務(wù)器都有所涉及才能稱(chēng)得上稱(chēng)職。
在這里還要多廢話(huà)一句,程序員相比其他行業(yè)是一個(gè)需要不停學(xué)習的行當,固步自封立刻就落后,經(jīng)驗值的累積速度會(huì )隨著(zhù)年齡的增長(cháng)而降低,這也是為什么在國內很少看到50歲以上的程序員。至于架構師這個(gè)很多程序員期望的職業(yè),我的看法是:如果架構師不寫(xiě)代碼只會(huì )用PPT,只不過(guò)是一個(gè)大忽悠罷了。
這里只是介紹了一個(gè)方法,希望能幫助剛入門(mén)的朋友答疑解惑。根據這篇文章
http://www.geekonomics10000.com/519 如果你想得到一個(gè)比較不錯的職業(yè)發(fā)展,長(cháng)期不間斷的練習是絕對必須的。
如果你的情商高于智商,非常擅長(cháng)與人交往,那么程序員不是合適你的職業(yè),做其它任何行業(yè)都會(huì )得到比程序員更好的結果。這也許有些偏激,但對于國內現狀就是這樣。十年以后,如果你還是在做編程,比較一下你的同學(xué)朋友就會(huì )知道我說(shuō)的正不正確。
如何學(xué)?
我下面介紹的學(xué)習都是關(guān)于技術(shù),但是首先要說(shuō)明的是,一個(gè)優(yōu)秀的程序員必定要對英語(yǔ)有一定的掌握,應該有比較強的讀寫(xiě)能力,另外最好有一定的聽(tīng)說(shuō)能力。
英語(yǔ)的學(xué)習如同技術(shù)學(xué)習一樣,必須持之以恒。比如每天都聽(tīng)一篇cnn student news,泛聽(tīng)一下nightly news等等。在apple itunes上可以免費訂閱大量podcast,只要你堅持聽(tīng)時(shí)時(shí)學(xué),英語(yǔ)水平一定會(huì )提高。而且英文水平的提高會(huì )對你的職業(yè)帶來(lái)非常大的幫助。
專(zhuān)精篇
無(wú)論什么行業(yè),如果想成為專(zhuān)家,專(zhuān)精某個(gè)或者某幾個(gè)方面是必要的,比如我就一直標榜:Windows Visual C++程序員。這里面就包含了Windows開(kāi)發(fā),Visual C++集成開(kāi)發(fā)環(huán)境使用,C++程序員幾個(gè)方面。由于行業(yè)不同專(zhuān)業(yè)不同,這里就不說(shuō)明對于你的行業(yè)需要專(zhuān)精什么了。
我們用學(xué)習英語(yǔ)的辦法來(lái)說(shuō)明如何專(zhuān)精“聽(tīng)讀寫(xiě)說(shuō)”,就以一名C#程序員來(lái)舉例好了。
1)聽(tīng)看
第一步是聽(tīng)視頻或者看視頻。這是對某個(gè)方面知識快速了解的好辦法,因為視頻相比書(shū)籍文檔更精彩一些,而且花費的時(shí)間相對比較少,注意力更集中一些。
在
www.verycd.com上可以看到大量的編程類(lèi)培訓視頻,只要你想學(xué)的不是非常偏門(mén)都可以找到。也可以在優(yōu)酷上在線(xiàn)觀(guān)看。如果你對自己的英文水平有自信,可以到youtube.com上觀(guān)看英文的視頻。另外C#是微軟公司出品,微軟公司最大的特點(diǎn)就是不差錢(qián),他們的免費視頻在網(wǎng)上都可以找到。
在verycd上搜索一下
http://www.verycd.com/search/folders?kw=C%23 就可以找到好幾頁(yè),比如這個(gè)
http://www.verycd.com/topics/2857178/ 《傳智播客.Net培訓視頻教程》,還有
http://www.verycd.com/topics/2866044/ 《C#4.0中文視頻教程》都可以下載聽(tīng)聽(tīng)。
在微軟WebCast
http://msdn.microsoft.com/zh-cn/dd796167 可以看到大量編程方面的培訓視頻。關(guān)于C#有三個(gè)“C#面向對象設計模式縱橫談系列課程”“C#2.0 銳利體驗系列”“Modern C#系列課程”,可以下載視頻和培訓的ppt,看完這幾個(gè)系列視頻,對C#就應該有一個(gè)基本程度的了解。
如果想學(xué)習Java編程語(yǔ)言,搜一下
http://www.google.com/search?q=java%E5%9F%B9%E8%AE%AD%E8%A7%86%E9%A2%91 也可以找到大量視頻資源。
建議是把視頻下載,放到手機或者ipod上就可以隨時(shí)隨地的聽(tīng)聽(tīng)看看,方便得很。
2)讀
讀是專(zhuān)精某個(gè)領(lǐng)域知識中最重要的一步,讀書(shū)、讀文檔、讀代碼都算是這部分。
先說(shuō)說(shuō)讀書(shū)。讀書(shū)首先是選對書(shū),選書(shū)也難也不難。如果你身邊有高人,可以請教高人。如果感覺(jué)沒(méi)有高人,那么可以參考china-pub的排行榜,然后結合douban.com上的網(wǎng)友點(diǎn)評來(lái)選購,如果還沒(méi)頭緒,給我留言好了。計算機方面的書(shū)籍我建議選下面幾個(gè)出版社的:人民郵電(知名品牌是圖靈)、電子工業(yè)、機械工業(yè)、清華大學(xué)出版社、東南大學(xué)出版社。不能說(shuō)他們出版的一定是精品,但是精品基本上都被這幾個(gè)出版社出了。比如C#方面,如果我選擇我會(huì )選這一本作為精讀
http://www.china-pub.com/192099 《C#與.NET3.5高級程序設計》
精讀的書(shū)目不要多,一次應該限定在兩三本左右。讀書(shū)時(shí)應該備有以下工具:一個(gè)本子,一支熒光筆,一支簽字筆。本子用于記錄自己的心得體會(huì ),感覺(jué)比較精彩的內容可以標記出來(lái)。另外應該定期把筆記總結到網(wǎng)上(比如google docs中)。為什么不直接總結成電子文檔呢?個(gè)人經(jīng)驗覺(jué)得本子是最快捷也最不影響閱讀的記錄方式。如果你覺(jué)得轉成電子文檔麻煩,那我還有一絕招,就是直接用數碼相機用微距模式拍照,然后保存圖片就好了。
如果涉及到代碼,也應該把示例代碼的運行環(huán)境準備好,比如C#就需要安裝一下DotNet開(kāi)發(fā)環(huán)境(比如Mono或者VisualStudio),學(xué)Java就應該安裝JDK,學(xué)C語(yǔ)言應該安裝一個(gè)gcc等等。
精讀時(shí)應該盡量理解每個(gè)章節,章節后面如果有習題就應該把習題做完,然后再學(xué)后續內容。如果有相關(guān)示例代碼,也最好把代碼自己錄入然后調試運行一下。前面之所以提到選對書(shū),就是因為如果你書(shū)選的有問(wèn)題,那么精度這一步就很難進(jìn)行下去,翻譯的質(zhì)量直接影響到你學(xué)習質(zhì)量。精讀時(shí)的進(jìn)度也不要太快,免得自己理解不深。如果有可能,最好中英文比對一下(現在網(wǎng)絡(luò )上可以搜到很多書(shū)的英文版ebook),這樣不僅可以學(xué)習英文,而且最重要的是一些中文中比較難理解的,閱讀英文部分可能會(huì )容易看懂,這個(gè)好像有些難理解,但是就我個(gè)人翻譯的經(jīng)驗,一般來(lái)說(shuō)翻譯會(huì )把譯者的想法帶入,所以很可能造成一些歧義。
精讀部分還包括讀文檔,因為很多比較新一些的知識還沒(méi)有書(shū)籍,只有論文或者電子文檔,還是建議把文檔打印出來(lái)閱讀。
讀代碼也是很重要的一點(diǎn),如果不是天才,那閱讀經(jīng)典代碼就跟閱讀經(jīng)典名著(zhù)一樣,對于編程語(yǔ)言的學(xué)習是非常必要的。選擇一個(gè)好的閱讀項目跟選書(shū)一樣要精心,我建議先從比較精短的示例開(kāi)始閱讀,比如微軟的C# code example
http://msdn.microsoft.com/en-us/vcsharp/aa336738 或者像是
www.codeproject.com上得分比較高的文章代碼。閱讀的代碼一定要選擇可實(shí)際運行的,這樣可以在你感興趣或者有問(wèn)題的地方加上斷點(diǎn)調試,觀(guān)察變量、調用棧等等變化。
當掌握比較基本的知識以后,應該轉向選擇一些比較經(jīng)典的開(kāi)源項目。C#或者Java好的開(kāi)源項目很多,這里就不多說(shuō)了。
3)寫(xiě)
這里的寫(xiě)不是指前一步中寫(xiě)寫(xiě)書(shū)上的示例代碼,而是說(shuō)把前面兩步學(xué)到的知識應用到實(shí)際項目中,這一步是最重要的。
再加強說(shuō)明一次,把學(xué)到的東西應用在自己的實(shí)際項目當中,不管項目大小,這一步是自學(xué)過(guò)程中最重要的。
跑題一下說(shuō)說(shuō),我看到過(guò)很多培訓,內容很好,講的也不錯,但是最后收效甚微。問(wèn)題不是講師的水平不夠,而是聽(tīng)眾只是聽(tīng)了,沒(méi)有用起來(lái)。光看是看不成高手的。
有些朋友會(huì )問(wèn)了,我真不知道寫(xiě)什么,能給點(diǎn)建議么?我的建議是先從小應用開(kāi)始,然后在寫(xiě)一個(gè)比較實(shí)用的程序。
什么是小應用呢?比如我喜歡看網(wǎng)絡(luò )小說(shuō),就可以編一個(gè)瀏覽器一樣的程序,打開(kāi)以后它就直接訪(fǎng)問(wèn)小說(shuō)網(wǎng)站?;蛘呦矚g炒股的,可以編一個(gè)股票信息收集,把網(wǎng)上的股票信息抓取下來(lái)?;蛘哂幸恍┳约盒枰墓δ?,比如定期抓取屏幕存成圖片文件(這個(gè)對于測試人員比較有用),或者就是編一個(gè)程序它可以播放視頻音頻。小應用的意思是自己覺(jué)得好玩,功能上也不是很復雜,比較容易實(shí)現的。
寫(xiě)過(guò)一些小程序以后,有感覺(jué)了,那就應該把學(xué)到的東西用到自己實(shí)際項目當中,比如我學(xué)Lua,就用Lua加Sqlite數據庫編寫(xiě)了以前需要手動(dòng)實(shí)現的功能,也用Lua實(shí)現了對c++代碼的解析生成html幫助文檔。也許你工作項目未必需要這個(gè)知識,但是可以在一些邊緣項目中使用,力爭多用多寫(xiě),熟能生巧,編程其實(shí)就是手熟罷了。
如果就是不知道該如何寫(xiě)一個(gè)小程序,那么有幾種可能,一個(gè)是你想的功能太復雜,這個(gè)好解決,另找一個(gè)題目就是了;另一種可能是你精讀的不夠,我建議你把書(shū)再仔細讀一遍,把書(shū)上的例子好好再次寫(xiě)寫(xiě);如果題目也不復雜,精讀也讀了,還是不知如何下手,那勸你還是換一個(gè)行當好了。三百六十行行行出狀元,不是一定要做程序員這一行的。
4)說(shuō)
說(shuō),就是分享。分享的過(guò)程其實(shí)也是提高的過(guò)程。
一般來(lái)說(shuō),IT公司都有一個(gè)分享學(xué)習機制,程序員對自己專(zhuān)長(cháng)的方向研究一段時(shí)間以后,整理成ppt,然后演示給大家看。也有一些興趣組比如Python本地用戶(hù)組也有類(lèi)似線(xiàn)下分享交流的機會(huì )。如果有這樣的機會(huì ),建議大家踴躍作為講師參加。當你寫(xiě)講稿或者演示的時(shí)候會(huì )突然發(fā)現某些方面其實(shí)還很薄弱,當聽(tīng)眾提問(wèn)交流的時(shí)候也會(huì )發(fā)現自己某些地方可能了解的不是那么透徹,這其實(shí)也是在學(xué)習。分享不僅僅鍛煉口才,而且會(huì )給人你在這個(gè)領(lǐng)域比較精深的感覺(jué),而且從分享過(guò)程中你會(huì )發(fā)現很多以前沒(méi)注意到的問(wèn)題。
分享也是推廣的過(guò)程,比如你看好C#語(yǔ)言,但是公司可能覺(jué)得沒(méi)有這方面人力或者了解不夠,你的傳道會(huì )讓大家對這方面知識了解的多一些,相關(guān)疑問(wèn)也可以找你來(lái)答疑,這樣也是提升人氣值的好辦法。
廣博篇
一個(gè)優(yōu)秀的程序員,不僅僅要有幾樣拿手的專(zhuān)業(yè)領(lǐng)域,還應該博彩眾家之長(cháng),了解一下軟件工程、架構設計等等方面的知識,還要及時(shí)跟蹤了解國內外技術(shù)動(dòng)態(tài)。
首先,應該像英語(yǔ)學(xué)習中的泛讀一樣,通讀一些感興趣的經(jīng)典的書(shū)籍,比如《程序員修煉之道》《設計模式》《代碼大全》《深入理解計算機系統》《快速軟件開(kāi)發(fā)》《Unix編程藝術(shù)》《編程珠璣》等等。這些書(shū)不像精讀書(shū)可以立刻用到實(shí)際。但是這些經(jīng)典書(shū)籍中的思想是可以一直影響整個(gè)編程生涯。其實(shí)這些書(shū)才是真正值得精讀的。只不過(guò)沒(méi)辦法立刻見(jiàn)效,所以把它們作為廣博篇中的提高級書(shū)目。
選書(shū)一定要小心,爛書(shū)就跟老鼠屎,會(huì )惡心你很長(cháng)時(shí)間并且降低你學(xué)習的積極性。如何選一本好書(shū)參考前面精讀部分。
想了解技術(shù)動(dòng)態(tài),訂閱技術(shù)牛人的blog是非常重要的,比如我對redis很感興趣,于是就訂閱了redis作者antirez的博客,他有時(shí)候會(huì )對一些項目中比較重要的設計做解讀。另外比如infoq.com,可以訂閱他們的rss來(lái)跟蹤最新的文章。我建議大家申請一個(gè)google賬戶(hù),使用google reader作為rss閱讀器。在google reader中訂閱很方便,直接加入博客地址就可以了。
想跟蹤最新潮最酷炫最流行最時(shí)尚的編程技術(shù),下面幾個(gè)來(lái)源不可錯過(guò)。
一個(gè)來(lái)源是reddit的programming討論區
http://www.reddit.com/r/programming/ reddit的編程討論區非?;钴S,基本上流行的博客文章內容都會(huì )被人提交到討論區,而且討論的質(zhì)量也很高。另外一個(gè)來(lái)源是DZone的首頁(yè)
http://feeds.dzone.com/dzone/frontpage DZone新聞?dòng)幸粋€(gè)很有意思的特點(diǎn)是可以看到頂和踩的數量,一般頂數量比較高的,可以閱讀。再有一個(gè)是美味書(shū)簽的programming
http://www.delicious.com/tag/programming 和development
http://www.delicious.com/tag/development 這兩個(gè)tag基本上涵蓋了編程相關(guān)的鏈接(未必是新文章),可以作為參考。最后一個(gè)新聞來(lái)源是HackerNews,也就是HN
http://news.ycombinator.com/ ,HN與reddit programming有些類(lèi)似,可以作為一個(gè)補充。
這幾個(gè)來(lái)源更新非???,基本上每天都可以看到上百條更新。我建議是不用每條都看,標題感興趣的看一看,或者發(fā)現同時(shí)在幾個(gè)源都出現的也可以看看。每天有個(gè)二三十分鐘看完前面幾個(gè)新聞來(lái)源,對于新技術(shù)動(dòng)態(tài)或者各種技術(shù)八卦那就是了如指掌了。
如果你發(fā)現某個(gè)博客文章寫(xiě)得質(zhì)量非常高,建議你可以訂閱這個(gè)博客,一般來(lái)講這樣的博客質(zhì)量都是水準以上的。我大部分的技術(shù)博客都是這么搜集來(lái)的。
另外現在博客上基本都有twitter地址,也可以follow這些技術(shù)牛人的twitter,由于推特的局限,相比博客的學(xué)習價(jià)值要更低一些,但是交流的時(shí)效性比較高。
郵件列表討論也是一種很不錯的討論方式(相比論壇而言),比如python-cn,toplanguage都是很好的中文技術(shù)類(lèi)郵件討論組。
建議大家閱讀以下內容:
Windows桌面開(kāi)發(fā)者的必備軟件 http://sunxiunan.com/?p=1543關(guān)于編程的一些想法 http://sunxiunan.com/?p=1073計算機編程新人入行指導 http://sunxiunan.com/?p=961計算機編程新人入行指導番外篇 http://sunxiunan.com/?p=969技術(shù)筆記一月二十二日 http://sunxiunan.com/?p=928 (2009年年初這篇博客最后我寫(xiě)到:c、python、web開(kāi)發(fā)、iphone開(kāi)發(fā),是我在2009年比較感興趣的技術(shù),另外,有空學(xué)學(xué)外語(yǔ)也很必要,感覺(jué)自己這兩年有些吃老本,是該充充電了。兩年以后我看好的Python和iPhone現在都是火到不行,但我都沒(méi)有真正學(xué)好投入進(jìn)去,典型的眼高手低)