作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!
計算機很早就走入了我的生活。小學時,家里放一台聯想“天琴”的電腦。它霸氣的音箱造型,拉風的麥克風,詭異的遙控器,都震撼着我小小的心靈。那時的小屁孩,會花一個下午,努力研究左鍵、右鍵和開始菜單。初中時,游戲成了電腦的代名詞。在報攤買大眾軟件,在商場地下室買碟,在家里輸入一下午的"show me the money",樂此不疲。到了高中,電腦和網絡相連。上網看新聞,泡論壇,閱讀最早的網絡文學,再加上小小的下載窗口。在網吧里待一夜,染上滿身的油煙味,早上再戰戰兢兢回家,似乎是叛逆期最深的記憶了。
然而,這都是門外漢的徘徊。我始終沒有踏入計算機的大門:既沒有計算機相關的學歷,也沒有在IT業的工作。想想自己這些年在大門外晃來晃去,和計算機失之交臂的經歷,也覺得有趣。聊作此文,博客官一笑。如果你也是和我一樣徘徊的門外漢,希望我的學習經歷能對你有些參考價值。
編程就是Debug
或許是之前玩電腦太凶,所以就把電腦當作純粹的娛樂工具。大學時堅決選了個和計算機靠不上邊的專業:物理。為了向父母表示拳拳的向學之心,自己連電腦都沒帶,就屁顛屁顛的研究歐拉方程去了。
但門外漢最開始接觸編程,還是來自本科的課程。本科時有五門和計算機相關的課程:
- C語言。使用的是譚浩強的《C程序設計》。對教材不置可否,但這門課給我的印象是:程序員就是解決bug。再也不想轉系到計算機學院了。
- 算法與數據結構。當時的教材是高教版的《算法與數據結構》。書里的例子使用的是偽代碼。現在覺得這不算差,但當時上機的時候總是一堆bug要改。對C語言不算熟練,所以很多bug不容易解決。
- Fortran。教材是《FORTRAN語言》,譚浩強是作者之一。這是門古老的語言,但在科學運算方面運用很廣,所以作為理科生必須要學習。和C語言給我的感覺類似,就是要不停的debug。痛苦極了。
- 微機原理。教材是《微型計算機原理與接口技術》。主講硬件原理和匯編語言。當時用UltraEdit加插件,來運行匯編語言。學習匯編時,也只是試着用了用加法、移動之類的語法,沒有具體的項目。
- 數據庫。教材是本綠皮的,題目忘記了。還能記住的,就是不斷分拆關系型數據庫的表格,直到它滿足某個范式。基本上沒有太多實踐。
回顧大學的這些課程,其實都算是計算機科學中相當重要的內容。問題是,這些課程都比較基礎,偏理論,卻輕實踐。教材和老師的講解也是如此,對於年輕人來說,樂趣少了些。具體的項目基本沒有,自己很難看到效果。一時看不出這些課程的用途,就為了應付考試,將就的學吧。大好時光,還是揮灑在籃球場上吧。
大學期間還是出於興趣,看了些Java和web的內容。Java看了《Core Java》的第一卷,但自己沒有電腦,沒法實踐。還沒把握到面向對象的精髓,就被轟然到來的期末備考裹挾走了。為了給女孩子驚喜,跟着w3cschool的教程,嘗試做網站。學了html,css和php,但沒錢租服務器,最后做了倆靜態頁面,差強人意。窘迫的年輕人。
創造才是樂趣
大學最后一年做畢業論文,陰差陽錯,選了個三維重構流體運動的課題。這和計算機圖形學沾上了邊。當時用IDL來做圖形處理和矩陣運算,可以很快看到算法對圖形的處理效果。我一下子來了興趣,連着兩個假期都撲在這上面。空閑的時候,也是調程序、實驗算法,看看結果如何。盡管導師評價代碼太亂,不適合搞計算機,自己也是嘿嘿一笑,依然樂在其中。為了解決問題,自己還學了不少計算機圖形學的內容,比如《圖像處理、分析與機器視覺》。果然,興趣是最大的學習動力。
在這期間,另一個重要的變化是接觸Linux。為了做課題,我把自己的筆記本帶到了學校。三年不見,這個本已經從曾經的“高富帥”變成了“矮挫熊”。聽從朋友的建議,忍痛把操作系統換成了Ubuntu,以減少死機的次數。網上填個表,就有一張免費的cd寄到,頓時體驗到開源的優越性。用了一段時間,總體感覺是,免費的果然差一些。比如Ubuntu上的辦公軟件就差office好多,更別說做的慘不忍睹的游戲了。唯一方便的是,學校里有一個Ubuntu鏡像,所以可以以無比迅速的節奏來下載更新或者安裝應用。真正享受Linux,還要等到未來。
需求的倒逼
本科畢業時,那所大學校園里快要溢出來的科研氣氛給我打了雞血。內心想的純粹是搞科學研究。所以沒怎么猶豫,就開始讀博了。做的課題是流體計算相關的,因此需要在高性能電腦上並行運行。
高性能計算機的運行環境和普通電腦完全不同。首先,它安裝的是CentOS,還沒有任何的圖形華界面,文本方面基本用vim。其次,由於要和別人競爭使用,要比較清楚的估計自己的工作量、所需的CPU數目和運行時間,還要查看空閑的資源,見縫插針。一個任務交上去,短的跑幾天,長的跑幾個星期。懶惰是創新的動力。為了不操那么多心,就寫了些bash腳本來處理這些繁雜的事務,或者監視集群的運行狀況。這才意識到bash和Linux工具(比如sed, awk, grep...)的好處。這期間讀了《Linux Administration Handbook》,非常全面的一本Linux參考書,寫的也很有趣。最后,高性能計算機是個並行的集群,需要了解並行算法和接口,所以讀了《Parallel Programming with MPI》。
僅僅了解Linux的管理是不夠的。在計算機上運行的是數值模型。這些數值模型是C語言和Fortran混合編寫的。為了理解程序,認真讀了《The C Programming Language 》,《Expert C Programming》,《Fortran 90/95 for Scientists and Engineers》。這幾本書的好處是簡潔且重點清晰,讀起來不費勁。然而,在集群上的編譯連接很成問題。主流的編程可以依賴StackOverflow。但數值運算的很多問題太偏門,在網上找不到資料。一封詢問郵件發出去,基本得不到什么有用的回應。幾番折騰下來,心里發狠,還不如自己讀源代碼,自己解決問題。因此讀了《Advanced Programming in the Unix Environment》(好一本厚書,讀的過程不堪回首,讀完真的學到很多)。這些基礎知識幫助我解決了不少編譯連接方面的問題。
數據處理是另一個問題。在工作最開始使用的是Matlab,但研究所里的許可證有限,有時要等到別人用完了才能去用。再加上Matlab的許多附加包價格不菲,也讓我覺得不方便。有一次和教授聊起這個問題,教授說,那你可以試試Python。Python,以及Python下的Numpy和Scipy包可以滿足我的需求。而且想想,Python是免費的,這無論對我,還是對未來可能雇佣我的研究機構來說,都可以省下筆錢。這么看,學Python是個蠻靠譜的事情。《Learning Python》是本很全面的Python教材。
寫作的動力
出於分享Python心得的目的,也為了打發空閑的時間,開始在博客園寫“Python快速教程”。寫到標准庫,發現Linux系統知識是必備的背景知識,所以重開了“Linux的概念與體系”系列。另一方面,在寫網絡相關的包時,發現自己對網絡協議方面了解太少。《TCP/IP Illustrated》里有對網絡協議非常全面的介紹。這里面學到的東西,也構成我的“協議森林”系列的文章基礎。自己的文章得到認可,也更有動力去多看多學了。
在和其它博主交流時,感覺到自己在基礎知識方面,還是有很大的差距。畢竟自己是個非計算機專業的“雜牌軍”。一是對面向對象的本質了解不夠,這在《Thinking in Java》里腦補了一下。二是算法和數據結構的知識太膚淺,因此基於《Data Structures and Algorithm Analysis in C》,自己實現了一系列的經典算法。三是沒有設計數據庫的實際經驗,正在努力做一個項目,來獲得實際經驗。看看這三點,都是本科時候學殘了的課。不是不報,時候未到啊。
門外漢的徘徊
從小屁孩時,拿着鼠標小心翼翼的點“開始”,自己還真的時徘徊了許久。幸運的是,人生幾個轉彎下來,我依然喜歡編程,喜歡靜靜的計算機打交道。有一件兩件真心喜歡的事情,就是很大的幸福了。和許多專業的計算機人士相比,我依然是一個門外漢。這種門外漢的徘徊,其實感覺不壞。作為門外漢,沒有要成為最好的負擔,只用隨心所欲的享受技術和寫作。
作為門外漢,好的技術書和好的工具會有很大的影響。畢竟,門外漢說來就來,也說走就走,很容易一時的不享受而放棄。不能不說,是那些文辭優美又簡潔的技術書,讓我感受到編程的優美。而Ubuntu下方便免費的編程環境,鋪平了自由嘗試的道路。現在更方便的是,我們可以在互聯網上找到各種各樣的教程、資料和公開課。許多雲平台工具也是免費的。所以,即時是門外漢,也可以很容易跨過那道大門。這是門外漢最好的時代了。
最后附一張圖,開啟我門外漢生活的電腦: