1. 程式人生 > >給學計算機的忠告

給學計算機的忠告

極端的社會輿論每每看到大學生就業報告裡提到計算機系學生失業人數最多時,我就想,什麼原因導致了這種現象的發生,在中國軟體還處於比較初級的階段時,市場對軟體人才的需求應該每年在大幅的遞增,可是大學裡培養出來的計算機科班人才質量卻每況愈下,甚至還不如一個軟體培訓機構兩三個月訓練出來的人好用,為什麼?想想現在的計算機科班畢業生的水平吧,大學四年下來,90%的學生寫的程式碼沒有超過2000行,不Linux作業系統為何物,不知道C++和Vc的區別,沒有開發出一塊實用功能的簡單軟體, 沒有使用過STL,甚至不知STL為何物,更不用提設計模式之類的比較高階一點的東西了……這樣的例子還能舉出很多… 就是這樣的人才質量,如何讓一個以營利為目的的公司接受,如何為企業創造價值? 但是也有那麼一些人,能進入微軟、IBM、google、百度這樣的公司,拿著年薪幾十萬。 
  2. 失敗的計算機教育體制我也是一名畢業不久的計算機科班畢業生,從我目前瞭解的情況看來,大學時,沒有幾個學生真正的對計算機程式設計感興趣,體會不到通過程式設計解決問題帶來的樂趣,只是單純的跟著課程的設定學習,這樣沒有目的性的學習效率如何之底?大學裡的學生又有幾個人能對自己的職業規劃有一個基本的瞭解?大學裡有幾個人能理解學習的課程在具體的實踐中的作用? 這些慘痛的例子說明了我們大學對計算機系學生的引導是非常不夠的?沒能激起對學習計算機技術的興趣?不能告訴大家一個將來一個明確的職業規劃方向,沒有很好的引導學生去思考自己的職業規劃方向?如果是這種狀態去學習,大學四年基本是廢掉了…… 另外一個就是大學課程的設定,各種各樣的課程,填鴨式的教學方式…. 純粹理論式的教學方式….到頭來,學生真正學到了什麼?幾個術語名詞而已…..一樣對作業系統是那樣的迷茫….不知道編譯原理的語法分析為何物? 不知道資料結構中的樹和圖將有何用? 
  3. 四年後,我能驕傲的說我是計算機系的學生 上面發了那麼多的牢騷,其實都是有感而發….下面在結合自己的工作的感受具體談談計算機學生應該如何規劃自己的大學四年
大一: 一個新兵蛋子,剛走進象牙塔的大門,什麼都是新鮮的,不斷聽著學長們說著天書般的技術術語… 天天爭論C++和java哪個好,.net是否比Vc更智慧先進…. 還有什麼Asp.net …. 一堆的技術擺在自己面前了… 然後自己就糊塗了….去問學長吧…學長告訴你..好好學習java吧…將來有錢途….. 其實大一,沒必要學習各種新鮮的技術…..把高等數學學好吧….這才是正事,是決定了著將來你是否能稱為一個大牛還是一個程式語言的熟練操作工人的因素…. 也許這時候的你還不知道高等數學有什麼作用… 但我要告訴你的是如果你的悟性高…. 工作一兩年也許就能體會到數學的做用…. 學高數..不是簡簡單單的學習微積分…. 在掌握這些知識的時候….鍛鍊自己的邏輯思維….. 鍛鍊自己的思考問題解決問題的方法和能力。作用在將來一定大大的….. 等將來如果你涉足密碼學…你會發現各種積分方程和矩陣變化…. 將來在計算一個演算法的複雜性和證明演算法的可靠性時,也離不開數學知識…. 如果你涉足人工智慧和語音識別,各種統計模型就會呈現在你面前。在你畢業找工作時,這個才是你和專業培訓機構培訓出來的學生的差異能力。這才是企業更看重的能力。如果你還有時間的話,學習C語言… 但是不要再用譚浩強的書了…. 看 The C program langue 吧… 如果能真正領悟書中70%的例子話,那就足夠了. 如果能把這兩門課程學到十分優秀,恭喜你,你已經成功了一半了…..   
大二: 如果你在大一學習了C之後,這個時候大學的課程就要涉及作業系統和資料結構、還有組合語言了…… 這也是大二一定要學好的兩門課了……大學的作業系統太失敗了,上完課後,很多的學生不知道所云,更加感覺作業系統的神祕了,課程設計也就是什麼銀行家演算法的,然後大家在網上一頓搜尋,然後交給老師就算完事了… 其實,我的建議是自己寫一個作業系統核心,實現記憶體管理,程序管理和切換 等一些基礎的東西了就可以了,《自己動手寫作業系統》就是很好的教材…… 如果還有時間,學習《Linux核心設計與實現》,看看現實商用的作業系統是怎麼實現的? 當然最好和原碼結合的一起看,效果最好。還有趙炯博士的 “.012Linux核心完全剖析”什麼的。如果能仔細閱讀,收穫一定不少。當然還有資料結構,這個也是重中之中,這也是和非科班出身的學生的差別,關鍵是你學的好壞,這個的實踐主要在ACM上,當學習完資料結構後,最重要的是使用,不斷的在Acm上做各種各樣的題目,不斷的提升自己演算法設計的能力。從大二開始,如果能堅持兩年下來,那麼一般的演算法設計肯定是難不住的了,也許這時候高數打下的基礎就會起作用了。 當畢業的時候,進入一家好的公司應該不是太難的事情了。再說說組合語言,本質上這也是一門程式語言,可能剛入門的時候比較困難,但是程式寫多了,和C也沒有差別了。我還想說一點,就是現在Windows核心也逐步開放了,至少有很多的逆向的資源可以學習。如果對Windows有興趣,一樣可以學習作業系統的實現原理。   
大三: 離散數學和編譯原理是個重頭戲,離散數學雖然我現在還沒體會到他的作用,但是和高數一樣,這中內在的東西才是最重要的,代表著內功,如果沒有學好,這些債遲早還要要還的。 編譯原理,學習完以後一樣會讓你雲裡霧裡,整天做那些無聊的題目。還是說實踐吧,網上有開源的C編譯器的原始碼,下載下來然後好好學習下,結合編譯原理書中講的東西,好好的消化一些這些知識,最後,自己如果能寫出來一個C編譯器的話,那你的編譯原理也就通過了。當然這個時候可以學習一些C++或Java之類語言,但是學到夠平時用的就可以了,沒有學非常深。選擇一本教材學習兩三個月就行了。      當然,這個時候,可能你的同學已經能做出來各種漂亮的網頁,也可能熟練的使用MFC類庫做出各種各樣的漂亮的軟體,這些沒什麼,如果三年下來,如果你能夠按照上面我寫的那樣堅持學習。也許他們用三年學習的這些東西,你用三個月就能熟練。    大四: 到了找工作的時候,如果你按照上面一步一個腳印的學習,我相信你會收到很多大公司的offer。因為大公司更看重的是你的內功的深厚,而小公司才會看重那些花拳繡腿的技術。但是這個時候,千萬不要忘記繼續學習,很多的學生大四一年都浪費掉了,真實太可惜了,在前面三年的基礎上,到了厚積薄發的時候了, 開始要思考自己的職業規劃了,你要選擇Linux方向還是Windows方向,要選擇底層方向還是應用方向, 要選擇網頁方向還是桌面應用方向。是選擇自然語言處理還是人工智慧。這個時候你要選擇自己的一個方向,當然你可以向你的導師求助,然後確定自己的發展方向,大四一年就可以專心的學習了。   
  4. 附上我認為計算機學習比較好輔助教材:  
C語言: the C Program Language 作業系統;
於淵:《自己動手寫作業系統》                
   《Linux核心設計與實現》                
   《Linux核心完全剖析》                   
《Linux核心情景分析》                   
《Windows核心情景分析》
編譯原理: 龍書《編譯原理》
彙編: 王爽老師《彙編第二版》   
5. 後記   以上都是自己在實習對大學的反思,可能很多人有不一樣的看法,我沒有任何異議。畢竟每個人經歷是不一樣的,但是如果你向想做真正的計算機科班出身的學生,學好上面介紹的課程吧。在以後的職業生涯中,你會終身受益的。當然上面很多的課程我沒有提到,並不代表他們不需要學習,只是分量沒有那麼重而已。因為你還是要畢業的,每門功課還是要過的。