大學就四年。學校通常安排前兩年學數學英語,然后大一學語言大二學數據結構。到了大三有很多比較具體而且復雜的課程,然后就要找實習,大四其實就是在找工作,課也沒有,衛生也不檢查了,等于在租學校的宿舍住。
于是在這短短的三年里面想在計算機那么多領域里面找到自己喜歡的,然后鉆研下去,最后還有所成就的話,還是比較難的。因此很多人經常會看到自己周圍突然有兩三個人就干了點什么很有成就感的事情了,一問,以前學過的。這種人我也接觸了幾個。我有一個同學說是高中的時候被稱為代碼狂人,給emule寫了點代碼,然后還自己做了個即時通訊工具賣了出去。到了大學就一直在重寫這個東西,最后實習就到騰訊去了。前幾天還遇到個人,說是小學就在折騰flash里面的action script了,后來投靠perl,說是一直到了大一才寫了一個超過2000行的程序。我也沒去求證,只是覺得比較不可思議。
于是我想,就照著那些傳統的路子先搞定一門語言(《C++Primer》),然后學數據結構(《算法導論》),再去學點庫(《STL源代碼分析》《深入淺出MFC》),之后弄點設計模式(《設計模式》),最后寫個某某管理系統(笑)什么的,也是無聊了點。竟然要學了那么多東西,才能弄出一個看得見摸得著的程序,也太考驗人的意志力了吧。幾乎是個人都是從拖控件開始的。那些一開始就摸著黑白屏幕狂搞算法的人,要么是NOI出身,要么是ACM出身,然后對著幾道算法題樂此不疲。但是最后有所成就的,很少。我在學校認識了那么多個ACM出身的,最后也就一個去了google。感覺風險還是有點大啊。
但是反過來也是有問題的。要是一開始就從界面開始弄,人也是很容易浮躁的。很多人因此就陷入了對花花世界的追求了(根據對群里面的人的統計),譬如說特別關心怎么在ListView前面畫棵樹什么的。這種人里面,其中一些有追求的,最后都會沿著Windows SDK,再走到DDK,最后寫驅動,一腳踏進泥坑,從此不能自拔,當然這些人也是少數。每當有少數人人對著剩下的多數人說跟“我今天實現了讓Word不能打開某某文件”差不多的這些事情的時候,他們兩眼大放光芒,然后就開始跪求源碼,狂問用了什么API,最后當代碼終于到手的時候,就放進之前精心準備好的一個文件夾里面,封存萬世,從此再也不去看了。當然也有其他的版本,譬如說老是下載書,而且還是rar,然后從不解壓一樣。曾經有這么一個人就在群上炫耀說自己有多少多少G的電子書。我讓他上截圖,結果全是rar。根本就沒看嘛,他自己也承認了。
于是怎么看兩條路都是很有危險的,這就是為了什么到了大四的時候,能學成的人總是不多的緣故。太容易陷進去了。這是什么意思呢?人總是只對自己做得好的事情感興趣。對自己還沒做的事情感興趣那種是好奇,需要嚴肅對待。當人終于做好了一件事情之后,就會一直不斷的鉆研下去,這當然是好事。但是,從此只見樹木不見森林,以為全天下的編程就那一件事情,那當然是要吃虧的。
所以首先要開闊眼界,知道世界上原來還有這么多的東西可以做。在差不多知道編程是什么東西的時候,需要這個玩一玩,那個玩一玩。不然就會看到旁邊的同學這個用java在手機上跑一個能告訴你1+1=2的東西,那個人用PHP+MYSQL弄了個留言版,看得唾液直流,心里發慌,說自己對著C++的黑白屏幕弄了這么久居然連那點小玩意都做不出來,自尊心很容易受到打擊的。
于是在玩過了之后呢,要及時收手,就專門做一件事情好了。因為這個時候自己已經大概知道自己看見的東西差不多就是那個樣子,想做自己也做得出來,看著別人寫那些花邊的程序也就不會給自己施加太多壓力了。專門做一件事情的意思就是,選定一個方向,然后找書,找人,看代碼,寫程序。譬如說可以去弄圖形做游戲,也可以去弄腳本引擎做做編譯器,還可以跟著老師去搞什么數據挖掘啊嵌入式什么的。對一個領域的深入研究最大的用處是可以讓自己接觸復雜的問題。
當然,當研究得深入了之后,程序就越寫越大了,這個時候就會出現很多各種各樣的問題了。譬如說效率太低啦,程序一出錯就要全盤推倒重來啦(這個還是比較可悲的),代碼太多很難組織函數啊類什么的啦,或者說名字給你用光啦等等。這個時候就需要各種各樣的理論知識了,譬如說數據結構與算法,還有設計模式什么的。當然講來講去也就這幾樣,因為“這世界上沒有銀彈”,所以那些通用的東西必然不多,剩下的還是要靠在同各領域里面其他人的積累或者自己的研究才能最終解決的。
上面所說的可以做的各種各樣的事情還是偏向于理論化一點,其實有一個學術上的領域還是不夠的,因為最終一個程序在跟計算機打交道的時候靠的是輸入輸出,也就是俗稱IO的東西了。這究竟是什么呢?也就是說,知道那個地方放著你要的數據,你要把它拿過來。你自己算出了什么,知道要往哪里放,你要會放。這里面包含的東西很多,譬如說典型的,鍵盤和屏幕上的輸入輸出,網絡要用的Socket啦Web Service啦,那些看得見的窗口啦控件啦,讀寫硬盤啦,還有其他什么的。這種在某一平臺上的專用的API都是至少要熟悉一種的。不然你光學會這個算法那個算法有什么用啊,譬如說你想對一個圖片進行壓縮,專門學了那個知識,但是一個bmp放在硬盤上你卻讀不進來,那豈不沒意義了么。
于是說了這么多,無非就是剛開始的時候要去見識世面,然后挑一個來慢慢研究,最后研究著研究著程序搞大了,就自然會碰到很多高級的問題了。這個時候去解決了,其實本科需要你具備的水平其實也差不多達到了。
所以很多人都洗心革面,終于開始努力研究一個領域的問題了。領域總是復雜的,這個時候會遇到很多編程上的問題,譬如說算法太復雜表達不出來啦,文件讀著讀著就掛啦,一不小心越界了之后造成了很多奇怪的問題啦(C++)等等。這種關于調試的問題,一般只能夠靠自己錯得多錯得離譜了,最后就成才了。當然前人也總結出了經驗,寫了本叫《Why Programs Fail》的書,想看的話可以自己去下載。其次,具體的庫總是有很多書和文檔的,沒事也要多看點,譬如說用Visual Studio的人都得把MSDN給裝了。
話也差不多說完了,雖然我自己也覺得這篇文章比較虛,因為這也是“通用的東西”。具體自己該怎么辦自己得好好想想。我就把這篇東西獻給現在大一大二那些還在迷宮里轉的弟弟妹妹了,要是有什么特殊的疑難雜癥的話,就私底下聯系我吧。
總之,無論什么時候,手頭上都要留有一個可以研究的問題才好。