代碼閱讀方法與實踐
⑴ 代碼閱讀方法與實踐怎麼樣
名氣不是很大的一本書,本來覺得看看電子版就ok了,讀了一半覺得值得收藏,以後再翻幾遍。幸好沒有絕版,得以買了一本新的。翻閱圈點了一遍,發現最後附錄B的格......
⑵ 求高人給個計算機學習指導。
一、廣泛了解,從科普書籍開始
選擇計算機專業的同學,也許是因為原先有一定的基礎,也許是因為一時的激情,但更多的人,可能對自己的選擇沒有深刻的認識,或多或少對計算機專業有一些神秘的感覺。自己究竟是否喜歡這個學科?才華能夠在哪個分支領域有所施展?抑或是真的不適合這個專業?諸多疑問,解決的方法首先便是了解和認識我們的學科。濃厚的興趣是學好任何學科的源泉;而廣泛的了解則是獲得興趣的途徑。當今我們對於信息的獲取已非難事,其中「閱讀」是一個簡潔而有效的方法。
也許你認為閱讀專業書籍對於剛剛步入大學的自己來說有點困難,也很枯燥,那麼不妨先從科普書籍看起。科普書籍是了解理論、獲得應用知識最好的途徑。相信不少理工科的同學被量子物理和相對論搞得頭昏腦脹過。究其原因,是我們的現實生活與抽象的數學模型之間存在思想意識上的鴻溝。然而要是讀讀斯蒂芬•霍金的《時間簡史》,你就會被書中有趣的故事和例證所吸引,從而對抽象的理論有了感性的認識——即使仍然沒有讀懂,你也至少了解了這個學科研究的領域和目標是什麼,也必然有所收獲。所有理工學科都有這樣的性質,計算機專業也不例外。
我們知道,計算機理論是建立在數學基礎之上的。大學計算機專業對數學的要求較高,其重要性不必多言。數學令不少同學頭痛,除了其「繁」與「難」外,很大程度上是因為他們沒有理解這些抽象理論的實際應用方向。與本科數學專業的課程設置相比,計算機專業的數學課程大都偏重實用性。比如我們的離散數學課程中涉及到的邏輯代數奠定了計算機一切運算的基礎,形式語言構成了計算機程序編譯的模型,代數系統則是當前各類資料庫系統的理論依據等等。因此,如果能夠提前地了解到並簡單地學習一下這些數學知識的具體應用,對理解理論是很有益處的。此外,電子學、信號與系統、控制理論等也是計算機專業學生必修的公共課,然而不少同學往往認為它們與計算機專業的關系不大,從而放鬆了學習。事實上這些學科是計算機硬體與網路通信的基礎,學好這方面知識的前提是認識它們的現實應用及其與計算機的密切聯系。
也許你將來學習圖論的時候,對「歐拉路」的概念會很清晰,這是因為你在小時候的圖畫書上玩過「一筆畫」的游戲;然而「二分圖」、「生成樹」這些概念又是怎麼回事呢?你的理解可能就不是那麼深刻了——因為你一時難以找到一些生活中的實例,並從中抽取出特性。在這種情況下,翻閱一些涉及這些知識的科普書籍就十分有必要了。我曾讀過一套《數學游戲》(《科學美國人》雜志匯編,中文版:科學技術文獻出版社),它將圖論、邏輯代數、自動機理論等領域的抽象的概念具體化為一個個有趣的故事,引導讀者了解這些知識的現實應用,啟發讀者將抽象思維與感性生活有機結合。我還讀過一本《編碼的奧秘》(《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》,中文版,清華大學出版社)這本書就有必要讀一讀了。它拿真實案例說事,彷彿一部實例化的軟體工程課本。如果你在團隊開發的道路上陷入了困境,不如參考一下前輩們是如何處理「人」與「月」二者之矛盾的吧。事實上不僅是軟體工程,任何事業的成功,往往技術不是關鍵,社會科學的因素才是埋頭技術的朋友們更應當關注的。
歸根結底,計算機的哲學依舊是人的哲學。拋開理念之爭議,超越技術的形式,以人為本地認識我們的行業與自身的地位,或許會使將來的發展道路走得更舒心一些。
⑶ <代碼閱讀方法與實踐>這本書適合我嗎
適合已經學過編程,但沒有養成寫代碼習慣的人!適合你的!
⑷ 如何通過閱讀源碼來學習優秀開源框架
對於開發者來說,社區里豐富的開源代碼其實是筆極為寶貴的財富。如果能充分利用好開放源代碼的資源,不僅可以掌握多種編程方法,提高實踐能力,還能獲得好的思想,激發編程靈感。開源代碼怎麼學以及怎樣才能學好是大家經常關注的話題,日前,在問答網站知乎上,有人拋出了「如何更有效地學習開源項目的代碼?」的話題,眾技術好手各抒己見,CSDN軟體研發頻道對本文內容進行了整理,方便大家學習與參考。盛大創新研究院研究員 庄表偉:學習開源 盡可能在代碼里找答案 庄表偉提供了以下9個建議:1.在下載源代碼之後,首先要跑起來,編譯通過、正常運行;2.在你覺得最有可能運行到的地方,設置斷點或者拋出異常,這樣,就能夠找到一個項目在正常運行時的入口點;3.從入口點所在的那個源文件開始閱讀,逐步把握整個項目是如何啟動起來;4.隨便改點代碼,看看會不會報錯,如果報錯,會從哪裡報錯;5.試著把報錯屏蔽、修復、或者繞開;6.嘗試理解一個系統的內部結構,多少組成部分,主線模塊是哪些?輔助模塊是哪些?7.從實際需要出發,修改這個項目,滿足自己的某一個小的需求。(注意在此之前,盡量不要在網路上找答案);8.看看相關的討論與心得,是否與自己的理解相一致;9.提交bug fix或者某個新的功能代碼。在學習開源的過程中,有幾個方面會獲得大量收獲,1.架構與模式;2.開源社區常見的一些慣用法;3.相關領域的結構與演算法。總結一點:學習開源,盡可能在代碼里找答案,而不是在代碼之外找答案,那些都是二手的,而且很可能不準確。互聯網評論員 朱曉陽:從簡單做起 理論聯系實踐朱曉陽對此發表了兩點看法:首先,從簡單做起。剛開始的時候學習一些領域內基礎理論,然後找一些簡單的東西去實現,不能一開始就去找開源項目。建議大家經常動手寫一些小程序,如改進宿舍網路登錄客戶端等。積小成多,能顯著提高自己的編程能力。其次,學習的知識一定要和自己生活或工作有聯系,這樣才會有樂趣或動力。互聯網評論員孫竟:先構想一個想做的項目首先,構想一個想做的項目(比如論壇、博客、微博等);然後,思考需要什麼功能,應該怎麼去實現,盡可能包括各種細節,有必要時記錄下來;最後,去找個類似的開源應用,看看它是怎麼實現的,和你的想法有什麼差異,有什麼可以學習或需要改進的地方。互聯網草根hqman:我的5個建議:1.反復地使用軟體,熟釋軟體的組成文件和軟體功能,注意IE地址欄內的地址變化;2.打開資料庫文件或存放數據的XML文件,參照數據字典了解各個表和欄位的數據含意;如果沒有數據字典,就運行軟體輸入數據,參照所輸入的數據,了解各個表和欄位的數據含義;3.利用Visio進行反向工程,將類圖抽出來;4.研究類之間的關系,注釋各個類的屬性和方法,弄清程序的整體框架;5.另開一個項目,按照軟體開發的流程,將代碼分段復制進新的項目,進行編譯調試,關注一些實現細節,學習一些編程的技巧。在讀研究生張偉:在校學生空閑時間多參加一下比賽張偉的建議是大家在空閑時間多參加一些比賽。一個完整的項目,不管再小,只要做完了,就會有收獲。多看一些比較大的開源項目源代碼,每次看完後都會受益匪淺。從網上成熟的開源代碼里,可以學到很多的設計思想。他認為,從項目入手,以項目為驅動,可激勵自己進步。當然,是否一定需要看開源代碼,這將取決於個人的興趣和需要。畫出程序流程圖 理解程序流程思想CSDN博客專家i_like_cpp:曾在CSDN分享了《如何將源代碼學好》的博文,對此,他給出了四點建議:1. 畫出整個程序的流程圖,理解整個程序流程的思想。畫流程圖的方式更讓人很直接的理解程序的整體流程,而不會被代碼所干擾,讓程序員總體上把握整個程序;2. 對流程各節點(函數或過程)的理解,流程的每一節點是構成整個流程的不可缺少的部份;3.再把流程和流程各節點串起來理解整個程序,可能的話最好寫出讀書筆記;4. 如果想深刻的學習到源代碼的精髓所在,請寫一個相近的程序進行操練。理解了這個程序並不表明掌握了這個程序,只有在操練一個相近的程序時,才知道你到底理解了多少,掌握了多少。編後語:源代碼的學習是一個從整體到不斷細化的過程,是一個極為繁瑣的過程同時也是一個不斷認清事物本源的過程。本文總結的源代碼的學習經驗,希望對您有所幫助。那麼,CSDN的網友們,你們是如何對待開源項目源代碼的呢?
⑸ 結合計算機專業特點,談談在學習和生活中如何做到以實際出發
一、廣泛了解,從科普書籍開始
選擇計算機專業的同學,也許是因為原先有一定的基礎,也許是因為一時的激情,但更多的人,可能對自己的選擇沒有深刻的認識,或多或少對計算機專業有一些神秘的感覺。自己究竟是否喜歡這個學科?才華能夠在哪個分支領域有所施展?抑或是真的不適合這個專業?諸多疑問,解決的方法首先便是了解和認識我們的學科。濃厚的興趣是學好任何學科的源泉;而廣泛的了解則是獲得興趣的途徑。當今我們對於信息的獲取已非難事,其中「閱讀」是一個簡潔而有效的方法。
也許你認為閱讀專業書籍對於剛剛步入大學的自己來說有點困難,也很枯燥,那麼不妨先從科普書籍看起。科普書籍是了解理論、獲得應用知識最好的途徑。相信不少理工科的同學被量子物理和相對論搞得頭昏腦脹過。究其原因,是我們的現實生活與抽象的數學模型之間存在思想意識上的鴻溝。然而要是讀讀斯蒂芬·霍金的《時間簡史》,你就會被書中有趣的故事和例證所吸引,從而對抽象的理論有了感性的認識——即使仍然沒有讀懂,你也至少了解了這個學科研究的領域和目標是什麼,也必然有所收獲。所有理工學科都有這樣的性質,計算機專業也不例外。
我們知道,計算機理論是建立在數學基礎之上的。大學計算機專業對數學的要求較高,其重要性不必多言。數學令不少同學頭痛,除了其「繁」與「難」 外,很大程度上是因為他們沒有理解這些抽象理論的實際應用方向。與本科數學專業的課程設置相比,計算機專業的數學課程大都偏重實用性。比如我們的離散數學課程中涉及到的邏輯代數奠定了計算機一切運算的基礎,形式語言構成了計算機程序編譯的模型,代數系統則是當前各類資料庫系統的理論依據等等。因此,如果能夠提前地了解到並簡單地學習一下這些數學知識的具體應用,對理解理論是很有益處的。此外,電子學、信號與系統、控制理論等也是計算機專業學生必修的公共課,然而不少同學往往認為它們與計算機專業的關系不大,從而放鬆了學習。事實上這些學科是計算機硬體與網路通信的基礎,學好這方面知識的前提是認識它們的現實應用及其與計算機的密切聯系。
也許你將來學習圖論的時候,對「歐拉路」的概念會很清晰,這是因為你在小時候的圖畫書上玩過「一筆畫」的游戲;然而「二分圖」、「生成樹」這些概念又是怎麼回事呢?你的理解可能就不是那麼深刻了——因為你一時難以找到一些生活中的實例,並從中抽取出特性。在這種情況下,翻閱一些涉及這些知識的科普書籍就十分有必要了。我曾讀過一套《數學游戲》(《科學美國人》雜志匯編,中文版:科學技術文獻出版社),它將圖論、邏輯代數、自動機理論等領域的抽象的概念具體化為一個個有趣的故事,引導讀者了解這些知識的現實應用,啟發讀者將抽象思維與感性生活有機結合。我還讀過一本《編碼的奧秘》(《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》中文版,清華大學出版社)這本書就有必要讀一讀了。它拿真實案例說事,彷彿一部實例化的軟體工程課本。如果你在團隊開發的道路上陷入了困境,不如參考一下前輩們是如何處理「人」與「月」二者之矛盾的吧。事實上不僅是軟體工程,任何事業的成功,往往技術不是關鍵,社會科學的因素才是埋 頭技術的朋友們更應當關注的。
歸根結底,計算機的哲學依舊是人的哲學。拋開理念之爭議,超越技術的形式,以人為本地認識我們的行業與自身的地位,或許會使將來的發展道路走得更舒心一些。
⑹ 代碼大全的社會評價
《程序員》雜志海量篇幅專題報道(2006年第3期)。
「《代碼大全》第1版在我看來堪稱軟體工程領域的經典之作一而第2版則更棒!」
——Ralph Johnson,伊利諾伊州立大學; 《設計模式》(Design Patterns)作者之一
「無論您是新手還是經驗豐富的開發人員,《代碼大全》(第2版)都能教會您思考編程的最佳方法。」
——Jeffrey Richter(),《Microsoft NET框架實用編程》(AppfiedMicrosoft.NETFrameworkProgramming)作者
「這本書是講述軟體構建的權威指南一準備孤身前往荒島的程序員只要帶上這本書就足夠了。」
——Diomidis Spinellis,《代碼閱讀方法與實踐》(Code Reading:
The Open Source Perspective)作者「Steve McConnell是一位既在一線實踐,又能把其中奧妙講個明白的少數人之一。」
——John Vlissides,IBM研究院; 《設計模式》(Design Patterns)作者之一
「Steve McConnell比任何人都懂得如何構建軟體;我們十分慶幸他能把其所有的深邃見解和實踐經驗寫成這樣一本重要而新穎的圖書。」
——「Visual Basic之父」Alan Cooper,《軟體觀念革命》(About Face 2.0)作者 Mike Riley,asp.netPRO,「此書的每一頁都提供了注重實效的見解,這些真知灼見是從數年的有效編碼經驗中總結而得出的,並繼而成為軟體設計者成功的主要指導。 項目負責人應該從頭到尾認真閱讀此書, 然後購買他們的每一項直接報告的副本。」
Ed Schaefer,Unix Review,「《代碼大全》已經影響了我思考軟體發展的方式,這在其他的書來說是沒有過的。我知道這樣說有些老套,但是如果有一本書應被稱作「本月傑作」的話,那就是它。我稱贊McConnell不只是因為他編纂法典--把這些知識寫下來-- 還因為此書涵蓋了重點與檢索目錄。」
Pan Pantziarka,Tech Book Report,「Steve McConnell的《代碼大全》獨具匠心,第一版被譽為經典之作可謂實至名歸。 現在,隨著第二版的出版,更新更詳細的表述和再編內容的擴展,其傑出地位被證實......。 書中包含了太多實用可靠的素材,所以要想在一篇評論中給予它公正的評價是相當困難的。對於任何想有所提高的編譯人員來說,這都是一本值得一看的好書。 我們全力推薦!」
Sam Gentile,Blog,「我敢說它甚至比第一版更好。利用「現代語言」如 C++和JAVA更新之後,它完全稱得上是軟體設計的教科書……讀過本書之後,我發現自己仍然有很多東西需要學習。強烈推薦!」
⑺ 哪些JavaScript 框架的源代碼最值得閱讀和學習
RubyLouvre/avalon · GitHub Object.defineProperty的極致使用來及各源種黑魔法
knockout/knockout · GitHub 觀察者模式的極致使用
jakearchibald/es6-promise · GitHub 目前最好的Promise實現
Polymer/observe-js 路 GitHub 強大的狀態機與最短編輯長度演算法
jquery/jquery · GitHub 最強的DOM兼容處理
⑻ 如何有效地閱讀C++編寫的項目
推薦可以參考書籍《代碼閱讀方法與實踐》,其中介紹了很多相關知識和建議,其實只有對C++程序的基礎知識和結構有了解,對於你所閱讀代碼的背景知識、體系結構、所用框架有所認識,才能更快的理解代碼。
⑼ 國際經濟與貿易專業要學數學嗎。
國際經濟與貿易專業要學數學。
學生首先要學習宏觀經濟學、微觀經濟學、國際經濟學、計量經濟學、統計學等學科基礎課程。這些經濟類課程中涉及不少數學知識。比如,對外經濟貿易大學國貿專業的小付說,大學前兩年他們要修完高等數學、線性代數、概率論等課程,之後又學了應用統計、計量經濟學等。如果學生具備一定的數學知識儲備,在學習中將佔有一定優勢,特別對那些致力於從事國貿理論研究的學生而言。
該專業的骨幹專業課還包括國際貿易、國際貿易實務、國際金融、中國對外貿易、外貿運輸與保險、國際商法、國際市場營銷,等等。
國貿專業學生還要關注世界經濟運行規律,熟悉世界貿易組織及不同國家經貿法則和業務流程,掌握國際管理規則等內容。因此,該專業學生除了學習經濟學專業課程外,還要學習管理類、法學類等課程。
全英文教學課程:商務溝通英語、國際經貿函電、經貿英語選讀;
雙語 教學課程:信息系統概論、國際營銷學;
模擬操作訓練課程:國際貿易實務;
研究型課程:國際貿易專題;
討論型課程:世界經濟專題 WTO專題
國際經濟與貿易專業第一學年要學數學(公共基礎課),高數的微積分1和2,還有線性代數。第二學年要學概率論與數理統計,資料庫管理系統等。
課程分必修課、限修課、選修課三類。必修課包括公共基礎課、專業基礎課和重要專業課。
⑽ 如何快速看懂別人的代碼
1.要養成一個習慣, 經常花時間閱讀別人編寫的高品質代碼.
2.要有選擇地閱讀代碼, 同時, 還要有自己的目標. 您是想學習新的模式|編碼風格|還是滿足某些需求的方法.
3.要注意並重視代碼中特殊的非功能性需求, 這些需求也許會導致特殊的實現風格.
4.在現有的代碼上工作時, 請與作者和維護人員進行必要的協調, 以避免重復勞動或產生厭惡情緒.
5.請將從開放源碼軟體中得到的益處看作是一項貸款, 盡可能地尋找各種方式來回報開放源碼社團.
6.多數情況下, 如果您想要了解"別人會如何完成這個功能呢?", 除了閱讀代碼以外, 沒有更好的方法.
7.在尋找bug時, 請從問題的表現形式到問題的根源來分析代碼. 不要沿著不相關的路徑(誤入歧途).
8.我們要充分利用調試器|編譯器給出的警告或輸出的符號代碼|系統調用跟蹤器|資料庫結構化查詢語言的日誌機制|包轉儲工具和Windows的消息偵查程序, 定出的bug的位置.
9.對於那些大型且組織良好的系統, 您只需要最低限度地了解它的全部功能, 就能夠對它做出修改.
10.當向系統中增加新功能時, 首先的任務就是找到實現類似特性的代碼, 將它作為待實現功能的模板.
11.從特性的功能描述到代碼的實現, 可以按照字元串消息, 或使用關鍵詞來搜索代碼.
12.在移植代碼或修改介面時, 您可以通過編譯器直接定位出問題涉及的范圍, 從而減少代碼閱讀的工作量.
13.進行重構時, 您從一個能夠正常工作的系統開始做起, 希望確保結束時系統能夠正常工作. 一套恰當的測試用例(test case)可以幫助您滿足此項約束.
14.閱讀代碼尋找重構機會時, 先從系統的構架開始, 然後逐步細化, 能夠獲得最大的效益.
15.代碼的可重用性是一個很誘人, 但難以理解與分離, 可以試著尋找粒度更大一些的包, 甚至其他代碼.
16.在復查軟體系統時, 要注意, 系統是由很多部分組成的, 不僅僅只是執行語句. 還要注意分析以下內容: 文件和目錄結構|生成和配置過程|用戶界面和系統的文檔.