新手关于如何看编程经典书的一些疑惑?
?
很多學計算機的朋友,都有類似的困惑:我學了計算機專業,怎么還是做不出網站、軟件、APP?很多人誤以為是教材不接軌,因此崇拜國外教材,其實不是那么回事。我盡量詳細地答一下,順便也講講計算機科學到底是干什么的。
假如有個同學,受過基本的語文訓練,初學寫作,夢想成為金庸那樣的小說家。他現在想知道,如何提高創作能力,并練習寫第一篇小說。這時,有個中文系的大學生路過,面對這位略有稚氣的同學,給出了高票答案:
我不認為學生寫小說有啥意義。學生,就要沉得下心。你看我懂文學理論,要寫小說的時候,哪怕不會組詞,有本辭典就能寫了。所以你不要浪費時間去搞那些,你要先把文學的本質理解透徹,達到我的境界,就能“會當凌絕頂”。所以你現在應該學習《深入理解現當代詩歌》、《文本的結構和意義的生成》以及《音韻導論》,然后腳踏實地學習2+年,這些才是語言的內功。?
這位同學當場被這些華麗的書名擊倒,跑到知乎恭恭敬敬提問:
我想寫小說,大師給我推薦三本經典,我應該按什么順序學?學了這些,我能寫出什么?
不用覺得滑稽,初學者被高大上的書目擊倒是正常的,這三本書也確實都是入門經典。但是我們要先搞明白,它們入的是什么門。
CSAPP 《深入理解計算機系統》
這是 CMU 的“計算機科學導論”的教材。是計算機系統和操作系統入門。(這門課要求有編程基礎)
SICP 《計算機程序的構造和解釋》
這是 MIT 的6.001課程的教材。是編程語言入門。(這門課在好幾年前就改成Python了)
CLRS 《算法導論》
這是 MIT 的6.006課程的教材。是算法分析入門。
那么操作系統、編程語言、算法分析又屬于什么呢?我們系統地看看,計算機科學到底是干什么的。CS大體可以分成這么幾個大領域:硬件、系統、軟件、網絡、計算理論、計算方法。
硬件 —— 數字電路、集成電路、存儲器、各種硬件設計和驗證方法等。
系統 —— 計算機架構(指令集、串/并行、網格、云端之類)、嵌入式、實時系統等。
軟件 —— 操作系統、虛擬機、編程語言、軟件設計/開發/驗證的工具和方法論等。
網絡 —— 計算機網絡的架構、協議、組件、路徑算法、性能分析等。
計算理論 —— 可計算性、形式語言和自動機、密碼、邏輯、算法分析等。
計算方法 —— 數值計算、符號計算、并行計算、計算機圖形學、人工智能、機器學習等。
你可以按這個提綱,逐個了解一下CS是干什么的。但現在可以先看著這些詞,大概感受一下。我們再說那三本書:計算機系統屬于系統領域,操作系統和編程語言是軟件領域中的小領域,而算法分析是計算理論中的小領域,這是那三本書在計算機科學中的位置。它們作為所謂“經典”,入的就是這幾個門。現在你知道這幾本書是干什么的了,那么你的問題來了:做網站、做APP又屬于這里面的哪個位置?
答案是,哪個也不屬于。你看整個計算機科學,研究的都是非常底層或基礎的東西,與你說的“現實中的產品開發”,基本上是沒有關系的。即使有些名稱看著和開發有關,其實也不是一回事。比如這里所說的“編程語言”,就好比語言學,是研究各種語言結構的,而不是教你用語言寫作的。你要認識到這一點,這不是教材好壞的問題,而是分工不同。就像天文學不是教你制造望遠鏡的,機械動力學不是教你開挖掘機的。
那么問題又來了,你現在就想學習做網站、做APP,這是什么?怎么學?哪家強?
實際上,國內大學極少有獨立的CS專業,都是加個“與技術”,全稱叫“計算機科學與技術”。顧名思義,這就包括計算機科學、計算機技術兩部分。你想學的這些,就屬于那個“與技術”。你想學的是技術方向,別人推薦的卻是科學方向的經典,這個就是你困惑的根本原因。
如果大家對C/C++感興趣的話,可以加一下我們的學習交流Q群:637 ?935 ?295,免費領取一套學習資料和視頻課程喲~
說到這里,我想題主應該已經理解了:計算機科學是干什么的,那三本書是干什么的,以及為什么學完了還是做不出來網站和APP。接下來,我想你會問這兩個問題:
1、如果我想搞技術,那么學習科學部分還有沒有必要?
我的觀點是,這不是有沒有必要的問題。這兩者之間的區別,是追求的目標不同:科學追求盡量深入,探索原理;而技術追求盡量封裝,提高效率。各種高級技術都是力求隱藏細節,以提高效率。而你選擇學習內容的標準,就看它能否顯著提高你的生產力。有些技術高度依賴底層細節或原理,造成了效率瓶頸,就應該學。但具體到Web、APP開發,最能提高你生產力的,就是那些前/后端框架和腳本,學完了你馬上就能做產品,而不是《計算機程序的構造和解釋》什么的。當然,上邊有些朋友告訴你,你要學挖掘機,一定要先學機械動力學,否則你就沒有內功,永遠不可能成為挖掘機高手,機械動力學才是真正的知識,只是現在社會太浮躁,沒人愿意花時間學。然而,我并沒否認機械動力學的價值,它能讓你把挖掘機分析得頭頭是道,甚至設計制造挖掘機。但是,如果你的目標是開挖掘機,那你就不該這樣入門,因為這是兩回事。說了這么多,希望你明白了。
2、我現在應該如何提高技術水平?
學技術的關鍵思路是兩點:一個是模仿,一個是邊實踐邊學。比如說學挖掘機,首先你要知道基本操作,然后看別人是怎么開的,最后自己上去開。遇到問題,比如跑偏了,你研究一下,挖掘無力,你再研究一下,弄明白了就繼續開。具體到你說的做網站為例,首先你可以看看《Head First HTML5》和《Head First PHP & MySQL》,或者用Codecademy,學會基本操作。然后找一些作品,比如WordPress,和它的一些經典模板,去看別人是怎么做的。然后,你就可以自己設計一個小網站,嘗試把它做出來。不用等什么都學會了再開始做。做的過程中,你遇到什么障礙,再有針對性地去學習和解決。這種邊實踐邊學習的模式,才是學技術的正確思路,這跟搞理論研究的思路是不一樣的。
最后,再跟你說兩個題外話。
第一,這幾本書,就是大學教材而已,沒有那么神。我們以前搞OI,初三就把《算法導論》的習題做得滾瓜爛熟,也就算是入個門,從地下室來到地面的水平。只是有人剛來到地面,就跟你大談“會當凌絕頂”、“程序員世界的高富帥”什么的,這個不至于的,沒必要激動。
第二,我面試過一個前端,問他最喜歡什么書,他說TAOCP,連QQ簽名都是“只盼TAOCP出第五卷”。我問這對前端有何幫助,他說這是內功。后來考查寫代碼,他寫不出來,說這個不是內功,而他擅長內功。我說那你先證明一下輾轉相除法吧,他又強調他擅長的是計算機內功,而不是數學。但其實這個證明,就是TAOCP第一卷、第一章的第一道例題。
總結
以上是生活随笔為你收集整理的新手关于如何看编程经典书的一些疑惑?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C/C++语言基础
- 下一篇: 云炬Android开发笔记 9主界面-