一、廣泛瞭解,從科普書籍開始
選擇計算機專業的同學,也許是因為原先有一定的基礎,也許是因為一時的激情,但更多的人,可能對自己的選擇沒有深刻的認識,或多或少對計算機專 業有一些神祕的感覺。自己究竟是否喜歡這個學科?才華能夠在哪個分支領域有所施展?抑或是真的不適合這個專業?諸多疑問,解決的方法首先便是瞭解和認識我 們的學科。濃厚的興趣是學好任何學科的源泉;而廣泛的瞭解則是獲得興趣的途徑。當今我們對於資訊的獲取已非難事,其中“閱讀”是一個簡潔而有效的方法。
也許你認為閱讀專業書籍對於剛剛步入大學的自己來說有點困難,也很枯燥,那麼不妨先從科普書籍看起。科普書籍是瞭解理論、獲得應用知識最好的途 徑。相信不少理工科的同學被量子物理和相對論搞得頭昏腦脹過。究其原因,是我們的現實生活與抽象的數學模型之間存在思想意識上的鴻溝。然而要是讀讀斯蒂 芬·霍金的《時間簡史》,你就會被書中有趣的故事和例證所吸引,從而對抽象的理論有了感性的認識——即使仍然沒有讀懂,你也至少了解了這個學科研究的領域 和目標是什麼,也必然有所收穫。所有理工學科都有這樣的性質,計算機專業也不例外。
我們知道,計算機理論是建立在數學基礎之上的。大學計算機專業對數學的要求較高,其重要性不必多言。數學令不少同學頭痛,除了其“繁”與“難” 外,很大程度上是因為他們沒有理解這些抽象理論的實際應用方向。與本科數學專業的課程設定相比,計算機專業的數學課程大都偏重實用性。比如我們的離散數學課程中涉及到的邏輯代數奠定了計算機一切運算的基礎,形式語言構成了計算機程式編譯的模型,代數系統則是當前各類資料庫系統的理論依據等等。因此,如果能夠提前地瞭解到並簡單地學習一下這些數學知識的具體應用,對理解理論是很有益處的。此外,電子學、訊號與系統、控制理論等也是計算機專業學生必修的公共課,然而不少同學往往認為它們與計算機專業的關係不大,從而放鬆了學習。事實上這些學科是計算機硬體與網路通訊的基礎,學好這方面知識的前提是認識它們的現實應用及其與計算機的密切聯絡。
也許你將來學習圖論的時候,對“尤拉路”的概念會很清晰,這是因為你在小時候的圖畫書上玩過“一筆畫”的遊戲;然而“二分圖”、“生成樹”這些概念又是怎麼回事呢?你的理解可能就不是那麼深刻了——因為你一時難以找到一些生活中的例項,並從中抽取出特性。在這種情況下,翻閱一些涉及這些知識的科普書籍就十分有必要了。我曾讀過一套《數學遊戲》(《科學美國人》雜誌彙編,中文版:科學技術文獻出版社),它將圖論、邏輯代數、自動機理論等領域的抽象的概念具體化為一個個有趣的故事,引導讀者瞭解這些知識的現實應用,啟發讀者將抽象思維與感性生活有機結合。我還讀過一本《編碼的奧祕》(《CODE》, 中文版:機械工業出版社),它則將邏輯代數、數位電路、組合語言等知識以實物和簡單電路的形式進行類比,揭示其中的原理,並引導讀者動手實踐。事實上這類與計算機專業相關的科普書籍還有很多,在學習課本的間隙閱讀一下,絕對能起到催化劑的作用。
談到科普書籍,相關的另一個問題便是電腦科學與計算機技術之間的關係。也許不少同學選擇計算機專業,是源於對計算機令人眼花繚亂的應用的認識。所謂計算機技術,一般是指包括文書處理、資訊管理、多媒體、網站建設等在內的計算機應用技術;而所謂電腦科學,一般指資料結構、組成原理、作業系統、編譯原理等計算機內部實現機制。前者是計算機在各行各業提高生產力的體現,屬於各類職業教育和專科教育的範疇;而後者是研究是計算機本身的理論,是本科計算機教學的重點。市面上大多數計算機書籍與雜誌是計算機應用技術方面的,屬“技術普及型”,從受眾角度來看與科普書籍有著類似的性質。適當地涉獵一些自己感興趣的應用技術,對培養學習興趣、增強實踐能力、瞭解業界行情是很有好處的。不過如果確實想在計算機行業長期做下去,仍然應當將主要精力放在對電腦科學的學習方面。畢竟用科學的理論指導實踐是大學教育的意義所在。
總之,廣泛瞭解計算機學科基礎科普知識,在今後學習具體理論的時候才會少一些盲目,多一些頓悟。
二、把握全域性,學習計算機導論
當你對計算機學科涉及的領域有所瞭解後,就應該著手展開專業學習了。初讀本專業的教學計劃與課程設定,你或許會被諸如離散數學、編譯原理、介面技術等生疏的課程名稱弄得一頭霧水。這些課程都是研究什麼的?它們各自與我們面前的計算機有哪方面的聯絡?要回答這類問題,首先需要把握全域性,從整體上認 識電腦科學。
國內高等院校一般都為大一學生開設計算機基礎課程。這類課程的受眾面廣,主要涉及計算機基礎應用知識。各種版本的計算機基礎教程幾乎都以電腦科學導論作為開篇。對於把計算機作為應用工具的其他專業的學生而言,導論只算是“內容概要”,他們往往更注重後面的應用型知識;而對於把計算機作為研究物件的我們,則決不能忽略這類指導性的內容。專門地、有意識地學好電腦科學導論,能夠使你對電腦科學有一個大局觀,清楚地認識到每一個分支學科的研究領域與重要意義,從而在今後的具體學習中明確方向,加深理解。
依我個人的學習經驗,建議初學者閱讀一些國外優秀計算機基礎與導論教材。與國內大多數講解軟硬體具體使用的同類教材相比,國外教材更偏重以應用為切入點,深入淺出地闡述電腦科學原理。諸如《計算機文化(第8版)》(《New Perspectives on Computer Concepts》,中文版,機械工業出版社)、《電腦科學導論》(《Foundations of Computer Science: From Data Manipulation to Theory of Computation》,中文版,機械工業出版社):前者適合於各種資訊類專業的學生或計算機愛好者閱讀。該書圖文並茂,語言生動,從應用角度出發,廣泛涉及計算機軟體、硬體、網路的基本原理,同時概述了計算機學科的歷史背景與行業現狀。隨書的光碟中給出了不少影音材料,在學習的同時還可以提高計算機專業英語聽說能力。後者在風格上與前者類似,但內容更適合計算機專業學生閱讀,被美國不少高校定為計算機專業學生的入門課。它以例項作為出發點,系統地講解了計算機組成、計算機網路、作業系統、資料結構、演算法設計等分支學科的研究領域、基本原理和應用方向,而幾乎不涉及晦澀的數學模型與實現細節。閱讀此類書 籍,可以在潛移默化中理清初學者對於電腦科學學習的思路。
電腦科學是一個有機聯絡的整體,每個分支都或多或少地與其它分支存在依賴關係。如果死板地依照教學計劃線性地進行學習,往往會遇到知識理解上 的問題。例如演算法分析課程與程式設計課程分屬理論與實踐;組成原理課程與體系結構課程是對計算機系統不同層面的剖析。我們不能簡單地找出它們的先修、後修關係,這樣難以建立完整的知識體系。因此在把握大局之後,我們仍有必要簡單瞭解一下每個分支學科的基礎知識。在這方面,推薦大家閱讀《程式設計卓越之道(第一卷):深入理解計算機》(《WRITE GREAT CODE: Volume 1:Understanding the Machine》,中文版,電子工業出版社)這本書。分開來看每一章節,其內容編排結構與國內高校計算機課程體制相近,涵蓋了邏輯代數、數位電路、機器指令、體系結構、儲存器管理等方面的基礎知識和實現方法,特別是闡明瞭各個分支學科之間的本質聯絡。有了這些基礎之後,在遇到更高階的問題時,你至少會明白這個問題應該在哪個分支學科中尋找答案了。
當你有了一定的計算機理論基礎,尤其是程式設計基礎後,想更加深入地把握電腦科學的脈絡,不妨看看這本書:《深入理解計算機系統(修訂版)》 (《Computer Systems A Programmer’s Perspective》,中文版,中國電力出版社)。它與《程式設計卓越之道》系列的共同特點是從程式設計師的視角觀察計算機系統。而這本書作為國外數十所高校的計算機系統導論教材,其組織更加嚴密,風格更加嚴謹。它以“程式在計算機中如何執行”為主線,全面闡述計算機系統內部實現的諸多細節。當你在學習資料結構、組成原理和體系結構等課程和時候,翻閱一下此書的相應章節,同時程式設計實現其中的例子,一定會對課本上單純的文字型理論有更加感性的認識——原來它們是 這樣活生生地存在於我的計算機裡的!
正所謂“會當凌絕頂,一覽眾山小”,從電腦科學全域性的高度整體把握其分支學科,在頭腦中率先構建電腦科學的整體框架併為其夯實最基層的結構,就能夠為你在未來每一步的學習中掃清迷霧,指明方向。
三、運籌帷幄,掌握程式設計的思想
程式設計與開發是計算機學習的一個關鍵環節,程式設計能力是衡量一名計算機專業人員素質的重要考核點。這是因為程式是連線理論與實踐的紐帶,是電腦科學與計算機技術相交融的領域。作為一名計算機專業學生,我們一方面有別於其它專業將計算機作為工具的應用型人才,不能僅僅利用計算機,而要為他人利用計算機提供平臺;另一方面我們暫時達不到電腦科學家的水平,不能做出理論研究成果,但能為理論學習鋪墊實踐基礎。因此,只有具備足夠的程式設計與開發能力,才能真正體現我們的智慧,同時充分發揮計算機的潛力。
學習程式設計,首先應掌握至少一門程式設計語言。C語言作為一種語法清晰、功能強大、應用廣泛的高階語言,長期以來被國內大多數高校的定為程式設計必修課。全面理解和掌握C語言的脈絡的重要意義這裡毋庸多言。市面上C語言的教程多如牛毛,但最經典的當數C語言的設計者Kernighan與 Ritchie 合著的權威白皮書——《C程式設計語言(第2版)》(《The C Programming Language》,中文版,機械工業出版社)。書雖不厚,但絕對全面而準確。其語言簡潔,例證通俗,實用性強。相比之下國內的一些C語言教材在學習曲線可能比前者平滑,但它們往往以考試為導向,過多地糾纏語法死角,同時大都未遵從ANSI標準。對於計算機專業學生來說,前者能夠讓我們看到更加嚴謹與實務的態度。當你的語言功底達到一定程度後,就需要從一個更高的視角來探察語言的本質,不妨看看這本:《計算機程式的構造和解釋(第2版)》 (《Structure and Interpretation of Computer Programs》,中文版,機械工業出版社)。它闡述了程式語言本身的機制與實現,同時引入了一門對於大多數中國學生來說不甚瞭解的語言——LISP。 LISP是很多美國高校計算機專業的入門語言,也是一種結構上與C、Pascal、Java、Basic等完全不同的非馮·諾依曼語言。研讀SICP,體味LISP,給你耳目一新的感覺之後更多地可以加深對程式設計思想本質的理解。
大學的各類程式設計與開發課程旨在培養我們兩方面的能力——演算法設計能力與應用開發能力。前者偏重電腦科學,後者偏重計算機技術。演算法是用計算機思維解決現實問題的理論,具有較強的數學性。演算法學的曠世鉅著應數Knuth的《計算機程式設計藝術》(《The Art of Computer Programming》,中文版,清華、機工、國防等出版社皆有授權),不過要徹底讀懂這個大部頭需要相當的數學理論基礎與程式設計實踐經驗積累。對於初學者,建議首先培養使用常規演算法解決小規模問題的能力,並行地提高駕馭語言的水平與抽象問題的思維。針對這個目的,結合程式設計實踐一類的課程,可以讀讀這幾本書:《程式設計珠璣(第2版)》(《Programming Pearls》,中文版,中國電力出版社)、《程式設計實踐》(《The Practice of Programming》,中文版,機械工業出版社)、《程式碼閱讀方法與實踐》(《Code Reading: The Open Source Perspective》,中文版,清華大學出版社)、《C專家程式設計》(《Expert C Programming》,中文版,人民郵電出版社)。它們的側重點各有不同,但對於通過實踐來學習演算法與資料結構都是很有益處的。
應用開發方面,實踐是第一要務,然而高效的實踐是建立在科學的程式設計方法之上的。以C語言為代表的結構化程式設計方法是規範的程式邏輯的基礎,目前主要使用在系統級開發中,前面所提到的諸多書籍都或多或少有所涉及。而以Java、C++為代表的物件導向程式設計方法廣泛應用於實用專案開發, 這方面的經典之作中,推薦閱讀Bruce Eckel的《Java程式設計思想(第3版)》(《Thinking in Java》,中文版,機械工業出版社)與《C++程式設計思想(第2版)》(《Thinking in C++》,中文版,機械工業出版社)。此外軟體架構設計、編碼規範與風格、程式碼除錯與質量管理以及軟體工程的各類原則在實際專案開發中都是及其重要的,在 具備了一定的程式設計經驗、準備投入一些實際專案開發的時候務必要了解。建議閱讀《程式碼大全(第2版)》(《Code Complete》,中文版,電子工業出版社)這本大而全的軟體構建綜合性寶典,它在從總體上指導軟體開發的各個環節的同時也引入了一些細節問題(諸如 goto的使用)的討論,引導我們對一些司空見慣的程式設計理念不但要知其然,而且要知所以然。
有一位熱衷於遊戲的同學告訴我,遊戲給予他滿足控制慾的空間。但是請放眼看看,遊戲的控制範圍不外乎一個特定程式中他人預先設定好的一系列資料,並以有限的影象與聲音形式體現出來。然而如果你掌握了程式設計這一強大的武器,就能夠面對眼前的計算機遊刃有餘,在硬體條件允許的情況下盡你所能將控制慾昇華為創造力,方便自己的同時造福他人。運籌帷幄,掌握程式設計的思想,無論走向科學研究或是應用開發,這都將為你奠定堅實的基礎!
四、理性思辨,體味計算機哲學
Bill Gates對計算機事業充滿激情——“每天早晨醒來,一想到所從事的工作和所開發的技術將會給人類生活帶來的巨大影響和變化,我就會無比興奮和激動。”自由軟體運動的精神領袖Richard Stallman幾十年如一日,將打破知識壟斷、共享人類智慧作為己任,帶領著數以萬計的軟體志願者推動著開源世界的發展。但並非每個計算機業者都能有Gates那樣豪邁的氣度和Stallman那種堅定的信仰,計算機及其相關技術對於大多數業者來說僅僅是興趣愛好或者謀生的工具。計算機行業半個多世紀 以來形成了其獨有的文化氛圍,作為一名計算機專業學生,瞭解專業文化,體味專業哲學,對於學習和從業都是具有指導意義的。
首先必須承認,計算機世界中存在著形形色色的意識理念差異。諸如微軟帝國與開源世界的明爭暗鬥,不僅僅是一場商戰,更多的是兩種哲學的搏擊。當代大學生多數是在微軟Windows光環照耀下認識計算機的。在這種環境下,多接觸一些開源世界的事物,對於理解計算機的本質不無裨益。《共創未來:打造自由軟體神話》(《Free for All: How Linux and the Free Software Movement Undercut the High-Tech Titans》,中文版,上海科技教育出版社)是一本講述開源世界發展史的書,你可以從中瞭解自由軟體運動及其領袖人物的傳奇故事,從而對GNU、 Linux、OpenSource這些概念蘊生人性化的理解。清華大學王垠的《完全用GNU/Linux工作,擯棄Windows——你我共勉》、蘭州大學黃平的《自由,你忘記了嗎?》等長篇文章則是國人對開源運動的慷慨陳辭。儘管這些文章常常被指為“偏激”,但沒有調查就沒有發言權,無論支援還是反對, 客觀的認識是第一位的。
其次,我們應該用平和的心態對待知識與技術,衡準專業學習在生活中的位置。一些同學出於種種原因,成為了“先進技術”的追隨者:通曉各類流行的程式語言,一有新版本的工具推出立即安裝學習,一有新的技術論戰立即關注其走向。還有一些同學成為了某些技術的忠實信徒:看準了Java就對.NET的東西置之不理。這些追隨者和信徒們往往為突飛猛進的技術所累,以至於有感於學習的空虛。過分追捧技術可謂捨本逐末,死扣某一知識也顯得目光短淺。一方面百變的技術離不開電腦科學的本源,在實踐過程中深入理解基礎知識是關鍵;另一方面任何技術都有統領其實現細節的思想精髓,觀其形不如知其神。我們不妨甩開冗繁的技術,換個角度靜下心來讀幾部計算機文化與哲學作品:
程式人生方面:《程式設計之道》(《The Tao of Programming》,雙語版,電子工業出版社)一書出自一位對東方道家與禪宗思想有著獨特理解的美國軟體工程師之手,全書由一則則短小而富有哲理故事組成,以類似寓言的形式生動地反映了程式設計師群體的生活以及計算機文明的演進。閒暇時隨手翻閱,即使不能立刻體會到每個故事的真諦,但隨著自身閱歷的增長,相信你會領悟程式人生的“道法自然”。
設計理念方面:開源軟體界的“鬥士”級元老Eric Raymond所著的《Unix程式設計藝術》(《The Art of Unix Programming》,中文版,電子工業出版社)一書,以Unix系統的設計原則為主線,展示了Unix所開啟的“KISS”(Keep It Simple, Stupid!)程式設計文化與思維方式。對於很多幹啃千篇一律的課本、禁錮於Windows開發的計算機專業學生來說,這本書一定能夠使你眼界大開——“結構化”並非真理,“物件導向”也不是王道;而對於有一定Unix/Linux使用或開發經驗的同學,這本書也一定會使你豁然明朗——原來一個程式的設計竟可以如此精巧!
管理哲學方面:對於有志於軟體工程,想涉足專案管理的同學,《人月神話》(《The Mythical Man-Month》,中文版,清華大學出版社)這本書就有必要讀一讀了。它拿真實案例說事,彷彿一部例項化的軟體工程課本。如果你在團隊開發的道路上陷入了困境,不如參考一下前輩們是如何處理“人”與“月”二者之矛盾的吧。事實上不僅是軟體工程,任何事業的成功,往往技術不是關鍵,社會科學的因素才是埋 頭技術的朋友們更應當關注的。
歸根結底,計算機的哲學依舊是人的哲學。拋開理念之爭議,超越技術的形式,以人為本地認識我們的行業與自身的地位,或許會使將來的發展道路走得更舒心一些。