標籤:

新手關於如何看編程經典書的一些疑惑?

昨晚翻了蕭大的151個答案,看了很多,收穫也有些,總結如下:
1.《csapp》
2.《sicp》
3.《演算法導論》
4.腳踏實地學2+年

小白問題來了:
1.學了這些如何實踐到現實的項目中去,小白的意思是,如何應用到現在的Web開發,移動開發,類似做出一個Demo中去,小白太菜,描述不好,囧。

2.很多公司要求參與過什麼項目,學了這些能做出什麼?

3.這幾本書學習的先後順序?

我在想提問的方式和語氣是不是欠妥,不妥求見諒。


很多學計算機的朋友,都有類似的困惑:我學了計算機專業,怎麼還是做不出網站、軟體、APP?很多人誤以為是教材不接軌,因此崇拜國外教材,其實不是那麼回事。我盡量詳細地答一下,順便也講講計算機科學到底是幹什麼的。

假如有個同學,受過基本的語文訓練,初學寫作,夢想成為金庸那樣的小說家。他現在想知道,如何提高創作能力,並練習寫第一篇小說。這時,有個中文系的大學生路過,面對這位略有稚氣的同學,給出了高票答案:

我不認為學生寫小說有啥意義。學生,就要沉得下心。你看我懂文學理論,要寫小說的時候,哪怕不會組詞,有本辭典就能寫了。所以你不要浪費時間去搞那些,你要先把文學的本質理解透徹,達到我的境界,就能「會當凌絕頂」。所以你現在應該學習《深入理解現當代詩歌》、《文本的結構和意義的生成》以及《音韻導論》,然後腳踏實地學習2+年,這些才是語言的內功。

這位同學當場被這些華麗的書名擊倒,跑到知乎恭恭敬敬提問:

我想寫小說,大師給我推薦三本經典,我應該按什麼順序學?學了這些,我能寫出什麼?

不用覺得滑稽,初學者被高大上的書目擊倒是正常的,這三本書也確實都是入門經典。但是我們要先搞明白,它們入的是什麼門。

CSAPP 《深入理解計算機系統》
這是 CMU 的「計算機科學導論」的教材。是計算機系統和操作系統入門。(這門課要求有編程基礎)

SICP 《計算機程序的構造和解釋》
這是 MIT 的6.001課程的教材。是編程語言入門。(這門課在好幾年前就改成Python了)

CLRS 《演算法導論》
這是 MIT 的6.006課程的教材。是演算法分析入門。

那麼操作系統、編程語言、演算法分析又屬於什麼呢?我們系統地看看,計算機科學到底是幹什麼的。CS大體可以分成這麼幾個大領域:硬體、系統、軟體、網路、計算理論、計算方法。

硬體 —— 數字電路、集成電路、存儲器、各種硬體設計和驗證方法等。
系統 —— 計算機架構(指令集、串/並行、網格、雲端之類)、嵌入式、實時系統等。
軟體 —— 操作系統、虛擬機、編程語言、軟體設計/開發/驗證的工具和方法論等。
網路 —— 計算機網路的架構、協議、組件、路徑演算法、性能分析等。
計算理論 —— 可計算性、形式語言和自動機、密碼、邏輯、演算法分析等。
計算方法 —— 數值計算、符號計算、並行計算、計算機圖形學、人工智慧、機器學習等。

你可以按這個提綱,逐個了解一下CS是幹什麼的。但現在可以先看著這些詞,大概感受一下。我們再說那三本書:計算機系統屬於系統領域,操作系統和編程語言是軟體領域中的小領域,而演算法分析是計算理論中的小領域,這是那三本書在計算機科學中的位置。它們作為所謂「經典」,入的就是這幾個門。現在你知道這幾本書是幹什麼的了,那麼你的問題來了:做網站、做APP又屬於這裡面的哪個位置?

答案是,哪個也不屬於。你看整個計算機科學,研究的都是非常底層或基礎的東西,與你說的「現實中的產品開發」,基本上是沒有關係的。即使有些名稱看著和開發有關,其實也不是一回事。比如這裡所說的「編程語言」,就好比語言學,是研究各種語言結構的,而不是教你用語言寫作的。你要認識到這一點,這不是教材好壞的問題,而是分工不同。就像天文學不是教你製造望遠鏡的,機械動力學不是教你開挖掘機的。

那麼問題又來了,你現在就想學習做網站、做APP,這是什麼?怎麼學?哪家強?

實際上,國內大學極少有獨立的CS專業,都是加個「與技術」,全稱叫「計算機科學與技術」。顧名思義,這就包括計算機科學、計算機技術兩部分。你想學的這些,就屬於那個「與技術」。你想學的是技術方向,別人推薦的卻是科學方向的經典,這個就是你困惑的根本原因。

說到這裡,我想題主應該已經理解了:計算機科學是幹什麼的,那三本書是幹什麼的,以及為什麼學完了還是做不出來網站和APP。接下來,我想你會問這兩個問題:

1、如果我想搞技術,那麼學習科學部分還有沒有必要?

我的觀點是,這不是有沒有必要的問題。這兩者之間的區別,是追求的目標不同:科學追求盡量深入,探索原理;而技術追求盡量封裝,提高效率。各種高級技術都是力求隱藏細節,以提高效率。而你選擇學習內容的標準,就看它能否顯著提高你的生產力。有些技術高度依賴底層細節或原理,造成了效率瓶頸,就應該學。但具體到Web、APP開發,最能提高你生產力的,就是那些前/後端框架和腳本,學完了你馬上就能做產品,而不是《計算機程序的構造和解釋》什麼的。當然,上邊有些朋友告訴你,你要學挖掘機,一定要先學機械動力學,否則你就沒有內功,永遠不可能成為挖掘機高手,機械動力學才是真正的知識,只是現在社會太浮躁,沒人願意花時間學。然而,我並沒否認機械動力學的價值,它能讓你把挖掘機分析得頭頭是道,甚至設計製造挖掘機。但是,如果你的目標是開挖掘機,那你就不該這樣入門,因為這是兩回事。說了這麼多,希望你明白了。

2、我現在應該如何提高技術水平?

學技術的關鍵思路是兩點:一個是模仿,一個是邊實踐邊學。比如說學挖掘機,首先你要知道基本操作,然後看別人是怎麼開的,最後自己上去開。遇到問題,比如跑偏了,你研究一下,挖掘無力,你再研究一下,弄明白了就繼續開。具體到你說的做網站為例,首先你可以看看《Head First HTML5》和《Head First PHP MySQL》,或者用Codecademy,學會基本操作。然後找一些作品,比如WordPress,和它的一些經典模板,去看別人是怎麼做的。然後,你就可以自己設計一個小網站,嘗試把它做出來。不用等什麼都學會了再開始做。做的過程中,你遇到什麼障礙,再有針對性地去學習和解決。這種邊實踐邊學習的模式,才是學技術的正確思路,這跟搞理論研究的思路是不一樣的。

最後,再跟你說兩個題外話。

第一,這幾本書,就是大學教材而已,沒有那麼神。我們以前搞OI,初三就把《演算法導論》的習題做得滾瓜爛熟,也就算是入個門,從地下室來到地面的水平。只是有人剛來到地面,就跟你大談「會當凌絕頂」、「程序員世界的高富帥」什麼的,這個不至於的,沒必要激動。

第二,我面試過一個前端,問他最喜歡什麼書,他說TAOCP,連QQ簽名都是「只盼TAOCP出第五卷」。我問這對前端有何幫助,他說這是內功。後來考查寫代碼,他寫不出來,說這個不是內功,而他擅長內功。我說那你先證明一下輾轉相除法吧,他又強調他擅長的是計算機內功,而不是數學。但其實這個證明,就是TAOCP第一卷、第一章的第一道例題。


沒時間,晚上再說,先隨便說幾句。

這些都是計算機的基礎學科,學好了基礎,遷移技術和往高處爬都很容易。

說實話,我不認為學生做個網站有啥意義,我要做網站的時候找個東西看一下就好了,我要做windows程序找個最佳實踐和幾個例子看看就好了,你把每種api都會背了,也只是一種經驗*n而已。

學生,就要沉得下心。

以學演算法為例,第一步完成之後,也就是大致的演算法你都知道優劣和實現了,那你以後一輩子的光景,都不必為這些分析啊性能啊最佳數據結構之類的問題發愁困惑。
這個境界,只要把演算法導論上的演算法看看熟就好了,甚至公式證明習題你都完全可以不看,一點關係都沒有。我去年說過,7天就夠了,結果被一堆噴子圍攻。。。哎,我就是7天的嘛沒人信,每天十幾個小時手寫了一本本子誒,人非各種挑刺,很沒意思啊,7天真的可以讓你演算法入門的啊。。。。
然後第二層,就是那些噴我不做習題不看證明的人其實也沒達到的境界,設計演算法,手機屏幕太小先不展開講了。

其實編程高手的能力無非是對特定問題像語言,演算法,平台,庫,底層設施等知識的理解程度高以及對設計和思想的透徹理解。
簡單說來就是越深入理解,越能掌控全局。如果你只想做泛泛之輩,隨便怎麼玩都行。

像你只會演算法,那隻能說是演算法強,沒有平台知識,不能解決平台問題,所以說演算法平台這些東西你本來就逃不掉,必須學好。

番外講兩個小故事,一個是fb發布的php編譯cpp的工具,php社區用戶不行,所以用著拙劣的語言也寫不出堪用的工具,而寫得出的人壓根不會用php,這個東西的出現完全是因為巧合,世上本不會有這樣的工具。
噴子要說了扎克伯格就用php造fb,比你牛逼多了,是呀,你趕緊去學php造下一個fb吧。

還有一個是前幾年手機遊戲剛火爆,很多公司ios的遊戲用cocos2d,安卓就重寫一份,其實把objc的運行時弄到安卓上再寫幾個基礎庫函數就好了,何必重寫。。。。。
其實還可以自己弄一個何必用cocos2d,我說就月旬就可以寫出來結果又被無知的人在知乎輪了。。。
碼畜會說unity包辦一切,其實unity這種工具你不改是不能做得更快更好的,渲染器那麼糟糕,當然你如果就只是想普普通通,怎樣都行。

所以你學好這些cs學生本應該學好的專業課,以後就少了一個噴我的程序員。

你應該感到慶幸的是這些書都是我用人肉看出來的,我看了很多別的坑爹書,不希望有人再看爛書誤入歧途。我從事的領域不夠多,所以推書也不夠全,以本科基礎為主,但這足夠讓你打下堅實的基礎了。

看了這些書,腰還是會疼,走路還是會費勁,一口氣也上不了5樓,但是我保證一個人會在思想上有巨大的轉變,獲得極大的自信,看老師同學和csdn的眼光會變得非常微妙,雖然還只能是屌絲但已經成為了程序員精神世界的高富帥。
不,我說錯了,即使是高富帥也不會有強力精神力,他也會懷疑自己,覺得自己沒錢就什麼都不是了。但,你好好看書,那就是體驗會當凌絕頂的感覺喲

歡迎實踐過的同學現身說法


我的情況應該是從 @蘇椰 所說的計算機技術入門,現在往計算機科學方向走。

我贊同 @蕭井陌 的答案,原因無他,新人先踏上計算機技術容易走歪路,什麼歪路?被所謂「技術」的創作者、狂熱信徒們進行宣傳轟炸,先覺得其神乎其神,入了教,接下去覺得這東西真的比安利還好啊!於是成了組織中「堅定」的一員同時展開對其他新人小白的洗腦灌輸:你知道XXX嗎?

你看垠神年輕時因為接觸了一些「計算機技術」後寫得文章(早年博文還可以在搜索引擎上搜到),連他這般大智慧的人都會受影響,我認為僅有非常少的新人能在這條路上保持堅定清晰的「技術為我用、技術為我馭」的頭腦。

以及我對現在的媒體資訊有種本能上的畏懼,看看這些標題吧:

  • 現在就開始使用HTML5的十大原因
  • 現在就開始使用AngularJS的三個重要原因
  • 【知識庫】八款你不得不知的開源前端JS框架 |
    CODE
  • HTML5定稿了,為什麼原生App世界將被顛覆
  • HTML 5終於定稿,八年後我們再一次談談怎麼改變世界
  • PHP路在何方?Facebook的Hack
  • Spark:大數據的「電光石火」-CSDN.NET
  • 是時候放棄MySQL的五大理由-CSDN.NET
  • 對SQL說不!NoSQL的資料庫技術革命
  • SQL/NoSQL兩大陣營激辯:誰更適合大數據
  • 下一代NoSQL:最終一致性的末日?
  • 愛上MongoDB的七大理由-CSDN.NET

問題來了,一個學習計算機不久的學生憑什麼在這些信息中保持清晰、理智的判斷力?有沒有人因此而認為銀彈真的存在了?我相信大有人在。

如果只是興趣愛好做Web開發,那隻要能把網站架起來足矣。如果是以此作為職業,做到深處,會不會遇到性能瓶頸?需不需要對運作中的一部分數據做獨立的緩存策略?如果是並發場景,遇到Race Condition了?不懂PV原語、信號量怎麼辦?Endpoint並發上不去發現瓶頸在一部分計算上,如何將這部分計算做成非同步而保證I/O的暢通?是不是要懂MQ、消費者/生產者模型、Pub/Sub模型?如何讓用戶連上伺服器後保持連接直到有消息返回(典型的站內通知場景,此處不用WebSocket)?用長輪詢技術?它是怎麼做到同時掛住成千上萬個連接的?在我的理解中一個線程處理一個連接,這麼多連接數伺服器根本吃不消啊?什麼,有個I/O多路復用技術?為什麼這框架號稱高並發,超擅長處理I/O密集型應用,但我寫的程序效率卻還不如以往的那些呢?

聽說Node.js這個解決方案很不錯,可以用JavaScript做服務端應用,它為什麼單線程還那麼快?又聽說最近有個國人的解決方案叫fib.js很火,能夠用同步的方式編寫非同步應用,想了解背後的技術?什麼,協程?這特么不是山寨版的線程么,為什麼在一個線程中跑那麼多協程有時會比同時跑多個線程要快多了,同時程序運行所需的空間也小多了?什麼是內核態、用戶態、棧幀?

如果您看到這裡還是對我寫的東西無感,我覺得您對核心競爭力也無感。學而不思則罔,思而不學則殆。

如果您和我一樣,也是從計算機技術入門,我假設您對我之前說的媒體銀彈宣傳導向認可並且已經具備了一定的免疫力,那麼我想說,其實「銀彈」還是有的,例如:

  • 哈希表的查找速度比線性表要快
  • 鏈表的插入刪除操作速度比線性表要快(根據場景而論,請看評論區)
  • 在有序線性表中查找元素存在問題的最好的解決方案是二分查找法
  • 最近訪問過的數據,不久之後很可能再次被訪問
  • 一旦訪問了某個存儲單元,不就之後其附近的存儲單元也會被訪問

2015/03/31更新。

作為一名認真讀過《csapp》《sicp》《演算法》的結構工程師,轉型為Android開發的人。
這三本書給我留下很深的印象,優點可自行豆瓣或者亞馬遜,不表。
第一.csapp給我打下了很好的計算機軟硬系統框架基礎知識。我基本上從計算機系統小白了解到16進位運算--&>位運算--&>機器碼--&>指令集--&>條件判斷機制--&> 分階儲存機制--&>進程,線程機制--&>通訊機制...看完這本書的一個很顯著的能力提升是對代碼優化的能力,如果接著學習《演算法》會深有體會,有時候少寫一個內嵌判斷可以減少一個數量級的運算量。順便增加了C語言知識。
第二.作為一本的優秀的導學教材,如果自覺自己哪方面的知識欠缺,可以直接翻看csapp的相關參考書籍,順藤摸瓜,是一個很好的看書技巧。

《SICP》我看的是Lisp語言版的,讓我驚奇的是編程語言可以是這樣的。基本上不需要花時間去學習語法,就可以循序看懂代碼。這本書,我沒看完,我知識的儲備和編程實踐經驗欠缺導致,這本書的後1/3部分,我很難再理解,暫時放棄。這本書跟caspp是較為互補的,csapp側重硬體部分,而sicp基本上都是軟體部分。特別是語言的部分打開了一個很好的視野,元語言的部分,讓我知道如何在一門語言的基礎上寫另外一門語言。此後,我不再拘泥於編程語言。

《演算法》第四版,我看了將近一個月。如果說,前兩本書讓我見識到了計算機過往驚奇的發展歷程,這本書則讓我看到了計算機未來驚嘆的無限可能,這正是吸引我持續學習的動力所在。

關於現實的例子部分可以看我另外一個回答:畢業兩年後脫產轉行自學java靠譜嗎? - 知乎用戶的回答。

在知乎上,能明顯的感覺到,越來越多的非計算機專業的人都在朝著互聯網行業發展,自學編程,可能多數人都曾被各大牛軟工無意間曬的薪水亮瞎了雙眼。作為其中一名,我最深的體會是,興趣應該是第一位的。自學的過程中,我花費了2000+小時用於看書,編程,調試...甚至我工作後,每天早上7點起床,看書2小時(這個習慣很好),九點半上班到晚上十一點下班,十二點睡覺,幾乎不感覺到累。
我以前做結構工程師的時候,工作時間一周40小時,稍微一加班就覺得違願。

最後來點現實的忠告:25歲之後自學編程,其實是一條九死一生的道路。
需要具備以下加分條件若干才有可能成功:
1.興趣驅動。
2.有靠譜的領路人(此法效率最高)。
3.高於平均線的自學能力。
4.英語能力良好,可無礙閱讀開發文檔。
5.具備一定的經濟基礎能力,可支撐一年以上無收入生活。

如果是奔著提高收入去轉行的人,我更推薦去看《富爸爸 窮爸爸》系列,看完那個更能直接改變你的經濟情況。
以上。


---------------------------------------------------------原文------------------------------------------------------------------

很多人都對工科有一種很大的誤解:看到工程師用X工具造出來了Y產品,就以為X工具很厲害,自己去學會了X工具同樣可以造出來Y產品。

現實是:你確實可以通過教程或者模仿,採用X工具做出Y產品。但是,如果稍微偏離了教程,就一頭霧水。

原因是:支撐工程師用X工具能造出來Y產品的實際上是隱藏在X工具之前的A~W基礎理論知識;脫離了X工具,工程師可以用其他工具應用A~W,同樣可以造出Y產品。舉個例子:現在做電子產品結構設計MD的大部分都是用PROE三維軟體畫圖再交給模具廠開模生產,看起來就是會用PROE就能做結構設計一樣,但是我敢打賭,如果你真是僅僅只是會PROE,沒有其他任何的機械設計基礎,即使你PROE用的人件合一,沒有任何一家靠譜公司會錄用你的。

道理其實很簡單,但是社會的浮躁使得越來越少的人願意花幾倍於學習X工具的時間去學習A~W這些真正的知識。再加上某些培訓機構鼓吹教程和模仿的便捷,從幾年前的三維設計室內設計到今天的JAVA培訓,時代的悲哀總是存在。

CSAPP&<深入理解計算機系統&>正如它的前言所說,「如果你研究和領會了這本書的概念,你將成為少數的牛人,這些牛人知道事情是如何運作的,也知道當事情出現故障時如何修復。」這是一本適合有編程語言基礎,真正有志於編程的導學教材。初次讀完全本含練習題不含家庭作業,預計花費時間120個小時到200小時左右。


你看看周芷若同學,基礎知識不好,直接速成九陰真經,遇到楊過的後人,還不是被虐成狗。


很多人假設知識之間的關係是這樣的

而沒有意識到,更多時候真實的關係是這樣的

甚至是這樣的

覺得「有且必然有一個確定」的方向,是因為...。


我同時支持了蘇椰 和 蕭井陌 同學的答案。

1、古話說的好,學而不思則罔,思而不學則殆。
學編程,關鍵是靈活運用自己的知識儲備;知識儲備越多(即要多學),原理理解越透徹(要多思考),能找到的解決方案就越多。

只是學很多,卻沒理解,那就不可能把知識儲備轉化成解決方案;頭腦很好,邏輯嚴謹,卻沒有足夠的知識儲備,同樣經常會陷入找不到解決方案的尷尬境地。

2、小馬過河,牛說河水很淺,剛過蹄子,松鼠說它兄弟前幾天剛被淹死:誰在撒謊?
都沒撒謊。個人情況不同而已。你要結合它們自身的情況以及語境,再對比自身情況,找到其中蘊含的信息。

事實上,只要你有一定的邏輯基礎、有解決問題的能力,那麼哪怕僅僅是看了本《XX語言入門》,你也真就能入門。

我當初是在高中剛畢業,還沒見過電腦是啥樣時,到同學打短工的列印店裡趁著看了一下午公認坑爹的《QBasic語言入門教程》,然後回家思考了一個月,編程就入了門。等到了大學,沒上過幾次機,就可以用QBasic/C寫一些字元動畫格式的小遊戲了。

——當然,能這麼做的前提是:在此之前,我已經有了動畫原理、電視機原理、幾何(主要是坐標概念)之類知識儲備。

然後,演算法與數據結構方面的教材,就更加開闊了我的眼界——一點都不誇張:國內本科通用的那本數據結構教材,我只花了一下午就看完了,之後沒有再翻開第二遍。不需要了。
(當然,那本本科教材比較淺,加上之前做遊戲已經有過很多思考,自然學一遍就夠了。以後當然還得找別的書看)

————————————————————————
總之呢,如果你處於「學了一門語言,卻不知道如何用它來解決問題」的階段,這說明你只是學了些死知識,還沒學會用它們來思考。那麼建議看蘇椰推薦的那幾本書入門——若即便這樣都還入不了門,那數學、邏輯等方面就需要補一補了(或許拆一些機械小玩具、自製並搞懂收音機之類東西的原理也能有所幫助)。


而如果你處於「學了一門語言,簡單問題能解決,稍難的問題兩眼一抹黑」,這就說明你已經有了一定的「程序員的思考能力」,但知識儲備不足,那麼建議看蕭井陌推薦的那些書提高。


我在北大教SICP,這本書還是很有意思的,能開闊眼界。不過真的蠻難懂,備課很費勁。
我覺得要做個好程序員,沒什麼一定之規,不會演算法也可以,只會演算法也可以,似乎就沒有什麼是一定要掌握的。如果你對現實要解決的問題和需求了解得很透徹,哪怕連快速排序都不會寫,哪怕只會用VB和C,也一樣能夠靠寫程序過上很好的日子。這是個人的經驗之談。但是作為一個程序員而言,我已經老了,我說的也許過時了。我覺得不少軟體的開發用不到什麼高深的技術和演算法,只要界面過得去,有別人沒想到的功能就可以了。當然還要會營銷,那就不是程序員的事情了。


1.學了這些如何實踐到現實的項目中去,小白的意思是,如何應用到現在的Web開發,移動開發,類似做出一個Demo中去,小白太菜,描述不好,囧。

一般你見到的web項目都是苦力項目,極少有那些會用到這些知識的,譬如說阿里做的那個資料庫什麼的。但是資料庫怎麼能算web項目呢,頂多算web公司搞的項目。

2.很多公司要求參與過什麼項目,學了這些能做出什麼?

基本沒有

3.這幾本書學習的先後順序?

隨便什麼順序


勿在浮沙築高台!
勿在浮沙築高台!

勿在浮沙築高台!

以前自學的時候也有樓主一樣的疑惑!自學最大的難處就是找不到學習的方向!
毫不否認的是,往往大塊頭的經典書籍帶給你的成效是長期性的,而不是立竿見影。所以搞技術的一定要沉下心來,切勿浮躁。
好了回答問題,這些對web之類的有沒有用,好吧,沒用。
公司項目有沒有用,沒用。
順序:哪本感興趣就看哪本。

那些經典書籍表面上看沒用,但是卻是你提升技術的資本。(不要在該學習基礎的時候去學習應用型知識)。打個比方,在你能看懂彙編的情況下,你學習一個月的C語言所理解的深度往往比那些沒有學過彙編去學習C語言半年時間的多的多!

彙編直到現在都被放在一個尷尬的位置,很多程序員往往認為自己是搞應用的,不需要接觸底層的項目,就不需要學習彙編,但是你如果真正的學習了彙編,你會發現你對程序的理解會站在另外一個高度。

個人學習的時候,對程序理解一共經歷了三個階段,希望對作者有幫助。(個人比較喜歡底層方面的東西,web方面的不包含在這裡面)

第一階段:單純的學習C語言(這裡幾乎把所有經典的C語言書籍看完了的),在這裡理解的時候程序也就是組合起來的流程吧!
第二階段:把彙編好好的搞了一遍,這個時候能夠完整的看到程序在計算機裡面到底是怎麼執行的。
第三階段:計算機組成原理,自己嘗試寫了一個操作系統內核模型。 這一階段讓我受益匪淺,以前在學習完彙編的時候,感覺看程序已經看得夠底層了,但是到了自己寫一個操作系統內核模型出來,自己才發現以前彙編的時期自己看程序是多可笑。

一共三個階段,本人花了4年時間,也許在作者看來我什麼都沒有學到!我沒有移動開發的能力。(這是根據你的問題描述推斷的,如有理解錯誤,抱歉) 但是我想說的是,這四年,絕對是物有所值。很多方向我都能輕鬆進去,同時基礎打好了,學習相關的東西都很快,深!譬如軟體漏洞分析。提取shellcode 寫exploit這些東西,如果你讓一個只有C語言基礎的人來,需要的時間起碼得用年來計算吧!而有了基礎,入門只是分分鐘的事情,一點也不誇張。

說了這麼多,還是那句話!

勿在浮沙築高台!
勿在浮沙築高台!

勿在浮沙築高台!


我一直是「學習編程」的傳教士,我鼓勵人們無論因為什麼目的都應該學習編程,哪怕只有一點點。但我經常遇到的困難就是人們往往認為編程是一件需要花費時間的學習的技能,需要很多基礎知識。好吧,我承認編程唯一需要的基礎知識就是——英語。如果你不會英語我真的很難保證你會精通編程,但並不表示完全學不了。

如果題主已經有了我上面所說的基礎,那麼可以接著往下看。
Learn | Codecademy
上面的網站是一個自學編程的網站,使用它僅僅需要英語而已。
可以從HTMLCSS學起,然後javascript,並用上面的例子學習創建一個主頁。完成這些之後可以在PHP,Python或者Ruby中選一個學習(我個人推薦python),整個過程大概40學時左右,也就是你大學一個學期的一門課的量。然後使用這三門語言中的任意一種語言下的web框架(PHP的我不太清楚,python可以用Django,Ruby可以用Rail),按照官方文檔的例子+模板完成一個個人博客,去萬網購買一個一年期的域名(大概70塊錢),再直接租一台小型的虛擬主機(一個月10塊-20塊不等),將這個網站放到虛擬主機上並向外服務,最後在上面轉載10+篇以上編程相關的技術文章(總計要200學時左右,相當於大學一個學期的5門課)。
然後去微軟的office模板中心去下載一個看起來炫酷一點的簡歷模板,寫上自己做這個網站用到的技術,並且在項目經驗上寫上使用XX語言1年,建有自己的網站,期望崗位是研發。最後將這份簡歷給20家公司投過去(網投就可以),等待面試通知。之後隨便選一家公司,但記住在面試的最後階段,一定要底氣十足的要求薪資8K,13薪,5險一金,以及補助若干,如果對方比較主動,可以要1W。
正式入職之後你的編程學習之路才正式開始,工作中需要用到什麼技術就去買什麼書,看什麼網站,不會的地方就問同事。希望我的答案能幫助到你。


1. 學了這些如何實踐到現實的項目中去

首先簡要回答一下。web開發用不用學這些東西?不用。學了這些對web開發有什麼幫助?有。

《csapp》,組成原理和os。當然內容多了有些東西就講得不是那麼詳細。最前面是彙編與反彙編,看完之後可以去看看雪的《加密與解密》。中間的pipeline拿y86講實在是坑,推薦去看以mips為範例的《計算機組成原理:硬體軟體介面》。最後有一部分是linux c,可以去看《apue》。

《sicp》,講函數式語言編程思想。

《演算法導論》,演算法。鏈表、堆棧、圖、樹,貪心、動態規劃、回溯、分治、遞歸。這些辭彙本身稍微懂編程的人應該都知道。

從技能樹上來看,組原、os和演算法都需要編程這個技能。web開發也需要編程,但是跟它們不在一枝上面,而且它比較low,也就是不需要什麼高大上的理論,學會語言再加上會用框架,就能手寫web應用。

計算機是分層的,最下面是硬體,上面是OS,之後是各種庫和框架,再上面才是你的應用。(造成這種現象的原因是,任何問題理論上都可以通過「加一層」來解決。)不同的層面上有不同的人干不同的事情,簡而言之就是隔層如隔山。web開發會用到資料庫,用到server,用到linux,但這僅僅是用而已。 編寫一個工具,和用一個工具開發應用,是兩類人乾的事情,需要的知識量差距也很大。

我一向堅持用什麼學什麼的觀點。 比如說你要用php+mysql開發一個項目,你就應該去找《php 與 mysql web開發》這種教人php語法和庫的書。 再比如你懂得php而不會sql,你就應該花一個星期了解一下如何編寫sql語句,學習e-r模型如何設計。而不是看如何自己編寫一個資料庫服務,再用這個你自己寫的資料庫去實現你的應用。

然而,php也要懂zval容器機制,才能夠多快好省。要懂os和網路,才能在大用戶量的前提下,用計算機有限的資源把apache配置好。要懂演算法,才能知道各種操作的複雜度是什麼,什麼東西什麼時候該用,避免寫出來那種「把停車場的車都撞一遍」的代碼。不過這些都是進階了,的確不會這些也能寫web應用,語言的標準庫封裝了基本的數據結構、演算法和系統api,會了這些可以讓你寫的更好。

用不上還是因為你做的東西太low,等你以後轉行干別的了,也許就能用上了。

很多人開始只是想開發一個App,不小心看了數據結構演算法,然後又想學OS和網路,然後又不得已轉成了架構和項目管理。最後退休前才發現,其實只想做一個App而已。所以入行之前先想清楚你需要什麼,上了賊船就下不來了。

2. 學了這些能做出什麼?

在計算機的世界中,實踐是實踐,理論到最後也是實踐,因為最後都要靠寫代碼來檢驗。如果你真打算啃這些書,不推薦僅僅是看書,看完《csapp》之後寫寫lab,看完《sicp》之後做做習題,看完《算導》之後刷刷oj,都是極好的。

啃完書之後,一定上機多接觸代碼,之後多反思,很多東西不用刻意去記就會了。你光看書背書,知識都記住了,寫出來的代碼根本就編譯不過,還調試不出來哪裡錯了。

關於《csapp》的labs,這裡簡要介紹一下。

lab2:反編譯一段c語言程序,找出過關的密碼。類似CrackedMe,這種程序你可以在吾愛破解上面找到成千上萬個。

lab3:還是反編譯,利用緩衝區溢出,顯示指定信息。

lab9:寫一個基本的bash,也就是linux里那個命令行。你可以體會一下管道過濾器模型,以及如何拿c處理命令行。

lab10:寫一個基本的代理伺服器,需要用到套接字,文件讀寫,線程,中斷之類的東西,相當於把最後面那幾章糅合起來。

別看《csapp》這麼高大上,他不過是底層方向入門的課用的教材罷了。我們當時做的事情不過是安裝linux、學會使用shell和vim,擺弄gcc和gdb,最後,還是寫代碼。跟我們後來的web開發課程,安裝mysql,配置apache,了解ssh庫的使用,反覆調試ajax,強不到哪裡去。

3. 這幾本書學習的先後順序?

如果真要說順序的話,推薦先看《sicp》,再看後兩個。然而我覺得,《sicp》看不看無所謂,因為入門語言可以隨便選,講編程思想的書又不是只有《sicp》一本。一些入門的書,比如《c程序設計現代方法》既講語法也講思想。在例如有些專門講思想的書,比如《重構》也是非常不錯的。

個人一直認為,思想是共用的東西,特性是語言獨有的東西。學會思想除了讓你開發效率更高,還會讓你能夠舉一反三,在不同語言和庫之間切換得更容易。

推薦看《算導》之前,先看sedgwick的《演算法》。總感覺後者是給程序員看的演算法書。 知乎上一上來就推薦這本書的,不是顯裝逼的,估計就是為難你的。

如果你要看其它書的話,一定先看豆瓣的書評,避開國產的一些爛書,一定要記住。

最後補充一點。計算機的世界,最重要的一點就是講究「權衡」。如果你是在職的程序員,先把你的工作做好,先把你的技術使用熟練,有一份穩定而且自己滿意的收入之後,再研究這些有的沒的。如果你是在校生,不用跑知乎上面來問了,課表已經給了你答案。


反正已經這麼亂了,也不妨多我一個答案再來添堵。

我一直認為程序員有三種。
一種是像E.W.Dijkstra、王垠、 @bhuztez這種大師,信手拈來,九淺一深。
第二種是Martin Fowler、 @winter 、@趙劼這種高手,身經百戰,內功精湛。
第三種就是 @vczh V大這種行者,技藝嫻熟,洞悉萬物。

做Web和App開發的那不叫程序員,說到底還不是在不停地做重複勞動?
做OI、OJ、OK、OL的也不叫程序員,說到底還不是把老的演算法抄來反覆練習?

程序員比他們多出來的就是對本質的思考

你想做Web、做App的話,要掌握的是領域和建模相關的理論技術。這樣子才可能抽取需求完成設計建模,進一步轉為代碼實現。至於代碼實現,隨便看某一個框架入門教程就夠你用了。
於是我也非常不負責任的推薦你一本用來學習建模的書:
領域驅動設計 (豆瓣)
嗯,估計你可能不太看得懂裡面的圖畫,建議你再參考一下:
UML精粹 (豆瓣)

--------------------- 下面正式回答題主的問題 ------------------------

小白問題來了:
1.學了這些如何實踐到現實的項目中去,小白的意思是,如何應用到現在的Web開發,移動開發,類似做出一個Demo中去,小白太菜,描述不好,囧。

前文已經回答過了。

2.很多公司要求參與過什麼項目,學了這些能做出什麼?

學了這些能做的東西還是比較多,比如一個OS的demo,一個虛擬機demo,一個Scheme解釋器。

很多公司要求參與過項目,也不是像一兩個小的demo那樣子的;而且像v大那樣子沒學過做Web也沒寫過App的不一樣還是進了M$RA。

3.這幾本書學習的先後順序?

這幾本書的先後順序沒啥可探討的,我倒是覺得,你可以先通過做Web、App來嘗試一下(說不定你突然覺得Android平台的生態圈太腦殘了自己擼一個rOS或者YuOS出來呢。這樣子你提到的那三本書應該都有用了。


今天翻郵箱的時候看到了知乎的推薦,題目很感興趣,隨手就點開了。
看了題主的描述,竊把題主定位為沒有太多經驗想入互聯網行業做技術。
然後我就可以回答了。

我今年參加校招,校招結束後寫了一篇博客,想分享一下奮鬥的歲月,同時給大家一些激勵。血靈騎士 - 博客園 。 有個回答讓我眼睛亮(xia)了一下:瞄了一個下,各路B格的書而已。是的,我就是讀了題主所寫的csapp、演算法導論的這些經典(B格)書的人。


那麼,讀了這些書有什麼用?
我很明確告訴你,你一本書都不用看,也可以做Web開發、移動應用開發,也可以做項目。
但是,你可能走不遠。

我喜歡做類比,這裡就不類比武功中的內功和招式了,我們換個說法,如何成為一個優秀的籃球運動員。你不需要去系統學習,只要你花費大量時間去打籃球,你肯定可以打的比一般人好。但是可能你不知道,那些籃球運動員會控制自己飲食,做一些針對性的肌肉訓練,學習一些戰術,有專門的訓練師。這些東西,我類比為看書。對普通人來說,搞這些東西幹什麼!可能你覺得自己籃球打的還好,只是你還是進不了那些頂級球隊。

看那些書,對於做工程項目實際的幫助,沒有那麼立竿見影。很多時候是因為你做的東西太簡單,簡單到還沒有對演算法有需求的地步。O(1)和O(N)對你來說是無所謂的。

其他的回答答的已經夠好了,我只有最後一句話:如果你想走的遠,紮根要扎的深。


其實吧,很多人都在撒謊,他們沒告訴你在讀那些經典著作之前他們都讀了什麼入門的東西。畢竟國內大學生的英文水準根本就達不到流利閱讀英文作品的地步,就算是淺顯如CS著作也是難讀。
更不要說,這些人在讀大學之前就學了很多相關東西了,已經比普通人早,和轉行進來的人隔著兩層距離。


盡顯浮華,不要信那些聽起來很神的答案,腳踏實地,那些書都不適合你,你需要的是計算機技術,和計算機科學無關,那些書都是計算機科學的。


打個比方,計算機系統(底層的硬體和作為基礎架構的操作系統和平台)是身體的話(A部分),演算法和數據結構是靈魂(B部分),結合起來是一個有機的生命,要做出偉大的事,活出美好的生活(C部分)。

CSAPP針對的是A部分,解釋這個身體(計算機系統)在現實中是什麼樣的(但沒有涉及硬體部分)。如同開車,對引擎工作原理的了解有助於成為一個更好的司機,程序員了解了這部分內容後有助於寫出更好的程序。

CLRS針對的是B部分。

SICP則針對C部分,講怎麼用計算過程中的各種抽象方法來解決問題(前3章和第4章的大部分);但同時也有A部分的內容,不過是在相較於CSAPP更抽象的層次描述了計算機系統(第4章第一節,第5章),拿這部分與CSAPP對比著看,很有意思。


這些東西當然都很有營養,但不是光有營養就能讓人成為一個運動健將的。成為運動健將需要多在場地中訓練,但是肯定也離不了這些營養,營養不良的練的再多不也是廢柴么。


  • csapp太細緻了 而且很底層 現在也沒深入去看
  • SICP真是受益匪淺(我是被《黑客與畫家》洗腦以後看的此書)
  • 演算法導論這本書可以用很多"看法" 因為演算法這個東西即是前沿領域的刀鋒 也是構建軟體工程的基石 演算法導論裡面不但詳解了各類演算法 也舉出大量論證 更多的是介紹演算法和設計演算法的思想 所以名為導論 當然你也可以拋開學術性的考究 單單作為掌握演算法的工具 也是極佳

以前看到過一個比喻 把編程思想比喻成武學內功 把編程技巧比喻成外功 而使用的編程語言則是各門武學 照這個比喻 上面這些書可以看成內功心法 教給你的是編程思想 在遇到問題和需求時如何用計算機的思路來hack之 這些書無一不是經典 全是出之大師之手 讀之 相當於能站在大師的視角來理解計算機 這也是吾等」普通人「所希冀的
至於談到公司為何要招項目經驗豐富的人 這個可以當做另外一個話題了 自己也是剛畢業參加工作 公司的項目和以前學校做的玩具差距還是很大的 在接觸到真正的產品項目和涉及的面越來越廣的時候 就發現了 編程是很瑣碎的或者應該說做編程項目是很瑣碎的 因為很多時候光有編程思想也是寫不出好項目的 很難直述 舉例來說吧

  • java在表現多態的時候,實例變數和實例方法表現不一致
  • rails里驗證boolean不為空不能使用presence: true, 而要使用inclusion: [true, false]
  • 圖片的路徑最好不要出現ad(就算是廣告O(∩_∩)O~ 有些人會裝adblocks之類的插件)

等等 這些大概都算不上什麼編程思想 只是一些語言和工具使用時的一些細節技巧和經驗吧 但離開這些細節也不行 有時候想當然的寫出一段代碼 但是就是不能正常運行 很大可能就是被些細節和給絆住了 我堅信很多大牛前輩都是從無數坑趟過來的 一些項目的解決方案 也是一種經驗的積累 所以就算你編程理解和思想上不差一些經驗豐富的前輩 但是工作效率和可靠程度肯定是比之不如的
答案寫得比較亂(理科生) 希望對題主有些幫助


我的現狀和題主的狀況類似,現在在做ios開發,但是業餘時間也在看csapp、sicp、code、computer networking:a top down approch。
我認為蕭大 @蕭井陌和 @蘇椰說得挺好的,蕭大說明了這些知識是上層建築的下層基礎,打牢了基礎,你不僅知道如何做還知道為什麼這麼做。蘇椰說明了你的目的其實是要在這兩個著重點中選擇一個上層的建築,捷徑是直接研究上層建築而不是去研究下層的基礎。
但是一名不想當黑客的廚師不是一位好司機啊,我在決定讀這些書之前也問過自己,我為什麼要讀這些書?得到的答案是:我不僅想寫app、搭建網站,我還想了解這些app在運行的時候系統都做了什麼、如何讓我的app運行的更好、我訪問一個網站的時候我的計算機都做了什麼、哪些數據需要被傳輸、這些數據在我的計算機和伺服器(或者其他計算機)之間都是怎麼傳輸的。
說了這麼多,其實我的觀點已經挺明顯了,學習這些內容不會在短時間內對你現在鎖從事的工作有明顯的幫助(見效不快),但是一旦悟了將會對你永遠有幫助(但是治本)。
與題主共勉。


殺雞不用牛刀啊
這些書都是高手寫的
我實在很討厭程編程的各種大部頭
很多都是翻譯過來的,文理不通,看著非常彆扭。
比如說,外國人常常說In fact,翻譯過來就是「事實上」,但是我們正常人會這樣說話嗎。
我們喜歡說「其實」
我很早以前曾經自己寫了一本ASP的書,名字叫ASP七日速成湯。沒拿去印刷就扔在網路上給大家下載,看過都說哎呀早看到這本書早就入門計算機了。雖然ASP過時了。但是裡面還是講了不少計算機基礎的東西,你可以找來看看,應該還能搜得到。
我覺得書這東西出來就是用來讀的,必須要搞笑生動讓人容易理解,搞那麼多艱深的術語真心沒必要。

但是你這個情況,又和書的關係不是那麼大。
關鍵是你的定位啊老兄
我看了你要達到的目標,根本和這些書八竿子打不著。
你這個情況,我給你個建議你先別看書
去找個編程培訓班(我保證你本地一大把,很多都是包你找工作的),選一個方向,學幾個月
你就差不多有基本水平了,而且還有你說的「項目經驗」。因為這些培訓班都是跟公司很做的,常常接一些外包項目,就需要你們這樣嗷嗷待哺的學生來打工,不用給你工錢你還要交學費內

說實話,如果不是接觸遊戲開發,演算法這個東西用的機會實在是不多。
一般被這種培訓班揠苗助長以後 ,你差不多會倒騰了,但是你會發現你只是學了些實戰技巧,隱藏在實戰技巧下面的兵法,你還不了解,但是那時候你入門了,看書就能看的進去了。這時候去看,吸收就快得多,很多平時的疑問也很容易就迎刃而解。

大部分書,我都是當做字典用的,完全沒耽誤我成為一個合格的程序員。

最後,編程這玩意,真的還是要熱忱的。
小弟9歲的時候就在小霸王學習機上寫程序寫到11點,不玩裡面的卡帶遊戲你敢想像嗎?但是到了現在我也沒多牛叉,因為這條路稍微走走還行,走精真的不容易。
希望你能成功


推薦閱讀:

網上常能見到的一段 JS 隨機數生成演算法如下,為什麼用 9301, 49297, 233280 這三個數字做基數?
大學學的不是喜歡的專業怎麼辦?
寫代碼時,縮進使用 tab 還是空格?
計算機系學生,感覺自己編程能力很差勁,怎麼提高自己編程能力?
遊戲編程裡面有哪些經典或者很酷的演算法?

TAG:程序員 | 編程 |