1、普遍瞭解,從科普書籍開始程序員
選擇計算機專業的同窗,也許是由於原先有必定的基礎,也許是由於一時的激情,但更多的人,可能對本身的選擇沒有深入的認識,或多或少對計算機專業有一些神祕的感受。本身到底是否喜歡這個學科?才華可以在哪一個分支領域有所施展?抑或是真的不適合這個專業?諸多疑問,解決的方法首先即是瞭解和認識咱們的學科。濃厚的興趣是學好任何學科的源泉;而普遍的瞭解則是得到興趣的途徑。當今咱們對於信息的獲取已非難事,其中「閱讀」是一個簡潔而有效的方法。web
也許你認爲閱讀專業書籍對於剛剛步入大學的本身來講有點困難,也很枯燥,那麼不妨先從科普書籍看起。科普書籍是瞭解理論、得到應用知識最好的途徑。相信很多理工科的同窗被量子物理和相對論搞得頭昏腦脹過。究其緣由,是咱們的現實生活與抽象的數學模型之間存在思想意識上的鴻溝。然而要是讀讀斯蒂芬·霍金的《時間簡史》,你就會被書中有趣的故事和例證所吸引,從而對抽象的理論有了感性的認識——即便仍然沒有讀懂,你也至少了解了這個學科研究的領域和目標是什麼,也必然有所收穫。全部理工學科都有這樣的性質,計算機專業也不例外。算法
咱們知道,計算機理論是創建在數學基礎之上的。大學計算機專業對數學的要求較高,其重要性沒必要多言。數學令很多同窗頭痛,除了其「繁」與「難」 外,很大程度上是由於他們沒有理解這些抽象理論的實際應用方向。與本科數學專業的課程設置相比,計算機專業的數學課程大都偏重實用性。好比咱們的離散數學課程中涉及到的邏輯代數奠基了計算機一切運算的基礎,形式語言構成了計算機程序編譯的模型,代數系統則是當前各種數據庫系統的理論依據等等。所以,若是可以提早地瞭解到並簡單地學習一下這些數學知識的具體應用,對理解理論是頗有益處的。此外,電子學、信號與系統、控制理論等也是計算機專業學生必修的公共課,然而很多同窗每每認爲它們與計算機專業的關係不大,從而放鬆了學習。事實上這些學科是計算機硬件與網絡通訊的基礎,學好這方面知識的前提是認識它們的現實應用及其與計算機的密切聯繫。數據庫
也許你未來學習圖論的時候,對「歐拉路」的概念會很清晰,這是由於你在小時候的圖畫書上玩過「一筆畫」的遊戲;然而「二分圖」、「生成樹」這些概念又是怎麼回事呢?你的理解可能就不是那麼深入了——由於你一時難以找到一些生活中的實例,並從中抽取出特性。在這種狀況下,翻閱一些涉及這些知識的科普書籍就十分有必要了。我曾讀過一套《數學遊戲》(《科學美國人》雜誌彙編,中文版:科學技術文獻出版社),它將圖論、邏輯代數、自動機理論等領域的抽象的概念具體化爲一個個有趣的故事,引導讀者瞭解這些知識的現實應用,啓發讀者將抽象思惟與感性生活有機結合。我還讀過一本《編碼的奧祕》(《CODE》中文版,機械工業出版社),它則將邏輯代數、數字電路、彙編語言等知識以實物和簡單電路的形式進行類比,揭示其中的原理,並引導讀者動手實踐。事實上這類與計算機專業相關的科普書籍還有不少,在學習課本的間隙閱讀一下,絕對能起到催化劑的做用。編程
談到科普書籍,相關的另外一個問題即是計算機科學與計算機技術之間的關係。也許很多同窗選擇計算機專業,是源於對計算機使人眼花繚亂的應用的認識。所謂計算機技術,通常是指包括文字處理、信息管理、多媒體、網站建設等在內的計算機應用技術;而所謂計算機科學,通常指數據結構、組成原理、操做系統、編譯原理等計算機內部實現機制。前者是計算機在各行各業提升生產力的體現,屬於各種職業教育和專科教育的範疇;然後者是研究是計算機自己的理論,是本科計算機教學的重點。市面上大多數計算機書籍與雜誌是計算機應用技術方面的,屬「技術普及型」,從受衆角度來看與科普書籍有着相似的性質。適當地涉獵一些本身感興趣的應用技術,對培養學習興趣、加強實踐能力、瞭解業界行情是頗有好處的。不過若是確實想在計算機行業長期作下去,仍然應當將主要精力放在對計算機科學的學習方面。畢竟用科學的理論指導實踐是大學教育的意義所在。網絡
總之,普遍瞭解計算機學科基礎科普知識,在從此學習具體理論的時候纔會少一些盲目,多一些頓悟。 數據結構
2、把握全局,學習計算機導論架構
當你對計算機學科涉及的領域有所瞭解後,就應該着手展開專業學習了。初讀本專業的教學計劃與課程設置,你或許會被諸如離散數學、編譯原理、接口技術等生疏的課程名稱弄得一頭霧水。這些課程都是研究什麼的?它們各自與咱們面前的計算機有哪方面的聯繫?要回答這類問題,首先須要把握全局,從總體上認識計算機科學。框架
國內高等院校通常都爲大一學生開設計算機基礎課程。這類課程的受衆面廣,主要涉及計算機基礎應用知識。各類版本的計算機基礎教程幾乎都以計算機科學導論做爲開篇。對於把計算機做爲應用工具的其餘專業的學生而言,導論只算是「內容概要」,他們每每更注重後面的應用型知識;而對於把計算機做爲研究對象的咱們,則決不能忽略這類指導性的內容。專門地、有意識地學好計算機科學導論,可以使你對計算機科學有一個大局觀,清楚地認識到每個分支學科的研究領域與重要意義,從而在從此的具體學習中明確方向,加深理解。編程語言
依我我的的學習經驗,建議初學者閱讀一些國外優秀計算機基礎與導論教材。與國內大多數講解軟硬件具體使用的同類教材相比,國外教材更偏重以應用爲切入點,深刻淺出地闡述計算機科學原理。諸如《計算機文化(第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》中文版,中國電力出版社)。它與《編程卓越之道》系列的共同特色是從程序員的視角觀察計算機系統。而這本書做爲國外數十所高校的計算機系統導論教材,其組織更加嚴密,風格更加嚴謹。它以「程序在計算機中如何執行」爲主線,全面闡述計算機系統內部實現的諸多細節。當你在學習數據結構、組成原理和體系結構等課程和時候,翻閱一下此書的相應章節,同時編程實現其中的例子,必定會對課本上單純的文字型理論有更加感性的認識——原來它們是這樣活生生地存在於個人計算機裏的!
正所謂「會當凌絕頂,一覽衆山小」,從計算機科學全局的高度總體把握其分支學科,在頭腦中率先構建計算機科學的總體框架併爲其夯實最基層的結構,就可以爲你在將來每一步的學習中掃清迷霧,指明方向。
3、指揮若定,掌握編程的思想
程序設計與開發是計算機學習的一個關鍵環節,編程能力是衡量一名計算機專業人員素質的重要考覈點。這是由於程序是鏈接理論與實踐的紐帶,是計算機科學與計算機技術相交融的領域。做爲一名計算機專業學生,咱們一方面有別於其它專業將計算機做爲工具的應用型人才,不能僅僅利用計算機,而要爲他人利用計算機提供平臺;另外一方面咱們暫時達不到計算機科學家的水平,不能作出理論研究成果,但能爲理論學習鋪墊實踐基礎。所以,只有具有足夠的程序設計與開發能力,才能真正體現咱們的智慧,同時充分發揮計算機的潛力。
學習編程,首先應掌握至少一門程序設計語言。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的使用)的討論,引導咱們對一些司空見慣的程序設計理念不但要知其然,並且要知因此然。
有一位熱衷於遊戲的同窗告訴我,遊戲給予他知足控制慾的空間。可是請放眼看看,遊戲的控制範圍不外乎一個特定進程中他人預先設定好的一系列數據,並以有限的圖像與聲音形式體現出來。然而若是你掌握了編程這一強大的武器,就可以面對眼前的計算機遊刃有餘,在硬件條件容許的狀況下盡你所能將控制慾昇華爲創造力,方便本身的同時造福他人。指揮若定,掌握編程的思想,不管走向科學研究或是應用開發,這都將爲你奠基堅實的基礎!
4、理性思辨,體味計算機哲學
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》中文版,清華大學出版社)這本書就有必要讀一讀了。它拿真實案例說事,彷彿一部實例化的軟件工程課本。若是你在團隊開發的道路上陷入了困境,不如參考一下前輩們是如何處理「人」與「月」兩者之矛盾的吧。事實上不只是軟件工程,任何事業的成功,每每技術不是關鍵,社會科學的因素纔是埋 頭技術的朋友們更應當關注的。
歸根結底,計算機的哲學依舊是人的哲學。拋開理念之爭議,超越技術的形式,以人爲本地認識咱們的行業與自身的地位,或許會使未來的發展道路走得更舒心一些。