1. 程式人生 > >成為程式設計大牛很簡單,把這些書看個八成就OK

成為程式設計大牛很簡單,把這些書看個八成就OK

本文把程式設計師所需掌握的關鍵知識總結為三大類19個關鍵概念,然後給出了掌握每個關鍵概念所需的入門書籍,必讀書籍,以及延伸閱讀。旨在成為最好最全面的程式設計師必讀書單。

前言

Reading makes a full man; conference a ready man; and writing an exact man.

Francis Bacon

優秀的程式設計師應該具備兩方面能力:

  • 良好的程式設計能力:
    • 掌握常用的資料結構和演算法(例如連結串列,棧,堆,佇列,排序和雜湊);
    • 理解電腦科學的核心概念(例如計算機系統結構、作業系統、編譯原理和計算機網路);
    • 熟悉至少兩門以上程式語言(例如C++,Java,C#,和Python);
  • 專業的軟體開發素養:
    • 具備良好的程式設計實踐,能夠編寫可測試(Testable),可擴充套件(Extensible),可維護(Maintainable)的程式碼;
    • 把握客戶需求,按時交付客戶所需要的軟體產品;
    • 理解現代軟體開發過程中的核心概念(例如面向物件程式設計,測試驅動開發,持續整合,和持續交付等等)。

和其它能力一樣,程式設計能力和軟體開發素養源自專案經驗和書本知識。專案經驗因人而異(來自不同領域的程式設計師,專案差異會很大);但書本知識是相通的——尤其是經典圖書,它們都能夠拓寬程式設計師的視野,提高程式設計師的成長速度。

在過去幾年的學習和工作中,我閱讀了大量的程式設計/軟體開發書籍。隨著閱讀量的增長,我意識到:

  • 經典書籍需要不斷被重讀——每一次重讀都會有新的體會;
  • 書籍並非讀的越多越好——大多數書籍只是經典書籍中的概念延伸(有時甚至是照搬);

意識到這兩點之後,我開始思考一個很功利的問題:如何從儘可能少的書中,獲取儘可能多的關鍵知識?換句話說:

  • 優秀的程式設計師應該掌握哪些關鍵概念?
  • 哪些書籍來可以幫助程式設計師掌握這些關鍵概念?

這即是這篇文章的出發點——我試圖通過程式設計師必讀書單這篇文章來回答上面兩個問題。

標準

進入必讀書單之前,我先介紹下書單裡的書籍選擇標準和領域選擇標準。當然你也

點選這裡直接跳轉到書單開始閱讀。

書籍選擇標準

  1. 必讀:什麼是必讀書籍呢?如果學習某項技術有一本書無論如何都不能錯過,那麼這本書就是必讀書籍——例如Effective Java於Java,CLR via C#於C#;
    • 注意我沒有使用“經典”這個詞,因為經典計算機書籍往往和電腦科學聯絡在一起,而且經典往往需要10年甚至更長的時間進行考驗;
  2. 注重實踐,而非理論:所以這個書單不會包含過於原理性的書籍;
  3. 入門—必讀—延伸:必讀書籍的問題在於:1. 大多不適合入門;2. 不夠全面。考慮到沒有入門閱讀和延伸閱讀的閱讀列表是不完整的——所以書單中每個關鍵概念都會由一本入門書籍,一本必讀書籍(有時入門書籍和必讀書籍是同一本),和若干延伸閱讀書籍所構成。

概念選擇標準

  1. 全面:全面覆蓋軟體開發中重要的概念;
  2. 通用:適用於每一個程式設計師,和領域特定方向無關;
  3. 注重基礎,但不過於深入:優秀的程式設計師需要良好的電腦科學基礎,但程式設計師並沒必要掌握過於深入的電腦科學知識。以演算法為例,每個程式設計師都應該掌握排序、連結串列、棧以及佇列這些基本資料結構和演算法,但計算幾何、線性規劃和網路流這些演算法可能就不是每個程式設計師都需要掌握的了;

通過這幾個標準,我把程式設計師應掌握的關鍵概念分為程式設計,軟體開發,以及個人成長三大類,每一大類均由若干關鍵概念組成。

快速通道

自從開博以來,經常會有朋友在論壇,微博,和QQ上提問學習X技術讀什麼書合適(例如:學習Java讀什麼書合適?如何學習程式設計?)所以我在這裡列出了一個“快速通道”——把常見的問題集中在一起,點選問題,即可直接進入答案。(當然,如果你把本文從頭讀到尾幫助會更大 :–))

入門書籍

程式設計:

軟體開發:

個人成長:

必讀書籍

程式設計:

軟體開發:

個人成長:

這個閱讀列表覆蓋了軟體開發各個關鍵領域的入門書籍和必讀書籍,我相信它可以滿足絕大多數程式設計師的需求,無論你是初學者,還是進階者,都可以從中獲益:

  • 基礎理論包括了程式設計師應該掌握的計算機基礎知識;
  • 程式語言對軟體開發至關重要,我選擇了CC++JavaC#Python,和JavaScript這六門主流程式語言進行介紹,如果想進一步理解程式語言,可以閱讀程式語言理論裡的書目;
  • 在理解程式語言的基礎上,優秀的程式設計師還應該瞭解各種程式設計技巧,熟悉基本的演算法資料結構,並且能夠高效的進行程式除錯
  • 良好的程式設計能力是成為優秀程式設計師的前提,但軟體開發知識也是必不可少的:優秀的程式設計師應具備良好的程式設計實踐,知道如何利用面向物件重構,和軟體測試編寫可複用,可擴充套件,可維護的程式碼,並具備軟體專案管理知識和專業開發素養;
  • 就像我們可以從名人傳記裡學習名人的成功經驗,程式設計師也可以通過追隨優秀程式設計師的足跡使自己少走彎路。大師之言包含一系列對大師程式設計師/電腦科學家的訪談,任何程式設計師都可以從中獲益良多;
  • 為了打造使用者滿意的軟體產品,程式設計師應當掌握一定的介面設計知識和互動設計知識(是的,這些工作應該交給UI和UX,但如果你想獨自打造一個產品呢?);
  • 專業程式設計師應當對自己進行職業規劃,並熟悉程式設計師求職面試的流程,以便在職業道路上越走越遠;
  • 軟體開發是一項需要不斷學習的技能,學習思維方式可以有效的提升學習能力和學習效率;
  • 軟體開發是一項國際化的工作,為了讓更多的人瞭解你的程式碼(工作),良好的英語寫作能力必不可少。

儘管我儘可能的去完善這個書單,但受限於我的個人經歷,這個書單難免會有所偏頗。所以如果你有不同的意見,或者認為這個書單漏掉了某些重要書籍,請在評論中指出,我會及時更新。:–)

程式設計

編碼:隱匿在計算機軟硬體背後的語言

編碼:隱匿在計算機軟硬體背後的語言這本書其實不應該叫編碼——它更應該叫“Petzold教你造計算機”——作者Charles Petzold創造性的以編碼為主題,從電報機和手電筒講到數位電路,然後利用數位電路中的邏輯閘構造出加法器觸發器,最後構造出一個完整的儲存程式計算機。不要被這些電路概念嚇到——編碼使用大量形象貼切的類比簡化了這些概念,使其成為最精彩最通俗易懂的計算機入門讀物。

深入理解計算機系統(第2版)

深入理解計算機系統(第2版)這本書的全名是:Computer Systems:A Programmer’s Perspective(所以它又被稱為CSAPP),我個人習慣把它翻譯為程式設計師所需瞭解的計算機系統知識,儘管土了些,但更名副其實。

深入理解計算機系統是我讀過的最優秀的計算機系統導論型作品,它創造性的把作業系統,計算機組成結構,數位電路,以及編譯原理這些計算機基礎學科中的核心概念彙集在一起,從而覆蓋了指令集體系架構,組合語言,程式碼優化,計算機儲存體系架構,連結,裝載,程序,以及虛擬記憶體這些程式設計師所需瞭解的關鍵計算機系統知識。如果想打下紮實的計算機基礎又不想把作業系統計算機結構編譯原理這些書統統讀一遍,閱讀深入理解計算機系統是最有效率的方式。

延伸閱讀:

  • 世界是數字的K&R中的K(Brian Kernighan)的近作,這本書源自Brian在普林斯頓大學所教授的計算機基礎課程,以通俗易懂的方式講述了現代人所應瞭解的計算機知識和網路知識;
  • 計算機系統概論(第2版):另一部優秀的計算機系統導論型作品,和深入理解計算機系統不同,這本書採用自下而上的方式,從二進位制,和數字邏輯這些底層知識一步步過渡到高階程式語言(C),從而以另一種方式理解計算機系統。

程式語言是程式設計師必不可少的日常工具。工欲善其事,必先利其器。我在這裡給出了C,C++,Java,C#,JavaScript,和Python這六種常用程式語言的書單(我個人不熟悉Objective-C和PHP,因此它們不在其中)。

需要注意的是:我在這裡給出的是程式語言(Programming Language)書籍,而非程式設計平臺(Programming Platform)書籍。以Java為例,Effective Java屬於程式語言書籍,而Android程式設計權威指南就屬於程式設計平臺書籍。

C

C和指標

忘記譚浩強那本糟糕不堪的C程式設計,C和指標才是C語言的最佳入門書籍。它詳細但又不失簡練的介紹了C語言以及C標準庫的方方面面。

對於C語言初學者,最難的概念不僅僅是指標和陣列,還有指向陣列的指標和指向指標的指標。C和指標花了大量的篇幅和圖示來把這些難懂但重要的概念講的清清楚楚,這也是我推薦它作為C語言入門讀物的原因。

C程式設計語言(第2版)

儘管C程式設計語言是二十多年前的書籍,但它仍然是C語言——以及電腦科學中最重要的書籍之一,它的重要性不僅僅在於它用清晰的語言和簡練的程式碼描述了C語言全貌,而且在於它為之後的計算機書籍——尤其是程式語言書籍樹立了新的標杆。以至於在很多計算機書籍的扉頁,都會有“感謝Kernighan教會我寫作”這樣的字樣。

延伸閱讀:

  • C專家程式設計:不要被標題中的“專家”嚇到,這實際是一本很輕鬆的書籍,它既包含了大量C語言技術細節和程式設計技巧,也包含了很多有趣的程式設計軼事;
  • C陷阱與缺陷:書如其名,這本書介紹了C語言中常見的坑和一些稀奇古怪的程式設計“技巧”,不少刁鑽的C語言面試題都源自這本小冊子;
  • C語言參考手冊:全面且權威的C語言參考手冊,而且覆蓋C99,如果你打算成為C語言專家,那麼這本書不可錯過;
  • C標準庫:給出了15個C標準庫的設計思路,實現程式碼,以及測試程式碼,配合C程式設計語言閱讀效果更佳;
  • C語言介面與實現:這本書展示瞭如何使用C語言實現可複用的資料結構,其中包含大量C語言高階技巧,以至於Amazon上排行第一的評論是“Probably the best advanced C book in existance”,而排行第二的評論則是“By far the most advanced C book I read”。

C++

C++程式設計原理與實踐

作為C++的發明者,沒有人能比Bjarne Stroustrup更理解C++。Bjarne在Texas A&M大學任教時使用C++為大學新生講授程式設計,從而就有了C++程式設計原理與實踐這本書——它面向程式設計初學者,既包含C++教程,也包含大量程式設計原則。它不但是我讀過最好的C++入門書,也是我讀過最好的程式設計入門書。

比較有趣的是,C++程式設計原理與實踐直到全書過半都沒有出現指標,我想這可能是Bjarne為了證明不學C也可以學好C++吧。

C++程式設計語言(第4版)

同樣是Bjarne Stroustrup的作品,C++程式設計語言是C++最權威且最全面的書籍。第4版相對於之前的版本進行了全面的更新,覆蓋了第二新的C++ 11標準,並砍掉了部分過時的內容。

延伸閱讀:

  • A Tour of C++:如果你覺得C++程式設計語言過於龐大,但你又想快速的瀏覽一遍新版C++的語言特色,那麼可以試試這本小紅書;
  • C++語言的設計與演化:C++的“歷史書”,講述了C++是如何一步一步從C with Classes走到如今這一步,以及C++語言特性背後的故事;
  • C++標準庫(第2版):相對於其它語言的標準庫,C++標準庫雖然強大,但學習曲線十分陡峭,這本書是學習C++標準庫有力的補充;
  • 深度探索C++物件模型:這本書系統的講解了C++是如何以最小的效能代價實現物件模型,很多C++面試題(包括被問爛的虛擬函式指標)都可以在這本書裡找到答案;
  • Effective C++More Effective C++:由於C++的特性實在繁雜,因此很容易就掉到坑裡。Effective系列既講述了C++的良好程式設計實踐,也包含C++的使用誤區,從而幫你繞過這些坑。

Java

Java核心技術(第9版)

平心而論Java核心技術(即Core Java)並不算是一本特別出色的書籍:示例程式碼不夠嚴謹,充斥著很多與C/C++的比較,語言也不夠簡潔——問題在於Java並沒有一本很出色的入門書籍,與同類型的Java程式設計思想相比,Java核心技術至少做到了廢話不多,與時俱進(Java程式設計思想還停留在Java 6之前),矮子裡面選將軍,Java核心技術算不錯了。

Effective Java(第2版)

儘管Java沒有什麼出色的入門書籍,但這不代表Java沒有出色的必讀書籍。Effective Java是我讀過的最好的程式設計書籍之一,它包含大量的優秀Java程式設計實踐,並對泛型和併發這兩個充滿陷阱的Java特性給出了充滿洞察力的建議,以至於Java之父James Gosling為這本書作序:“我很希望10年前就擁有這本書。可能有人認為我不需要任何Java方面的書籍,但是我需要這本書。”

延伸閱讀:

  • 深入理解Java虛擬機器(第2版):非常優秀且難得的國產佳作,系統的介紹了Java虛擬機器和相關工具,並給出了一些調優建議;
  • Java程式設計師修煉之道:在這本書之前,並沒有一本Java書籍系統詳細的介紹Java 7的新特性(例如新的垃圾收集器,try using結構和invokedynamic指令),這本書填補了這個空白;
  • Java併發程式設計實踐:系統全面的介紹了Java的併發,如何設計支援併發的資料結構,以及如何編寫正確的併發程式;
  • Java Puzzlers:包含了大量的Java陷阱——以至於讀這本書時我說的最多的一個詞就是WTF,這本書的意義在於它是一個反模式大全,Effective Java告訴你如何寫好的Java程式,而Java Puzzlers則告訴你糟糕的Java程式是什麼樣子。更有意思的是,這兩本書的作者都是Joshua Bloch

視訊教程:

  • Java語言學習極速之旅:系統全面的Java語言教程,6個階段Java基礎入門,循序漸進掌握Java面向物件精髓。3個Java進階方向,Java SE、Java EE、Android開發,每一個都包含相應的知識點精講和專案開發例項,快速上手。
  • Android 0基礎極速養成計劃:Android開發快速入門視訊教程,通過對Android基礎知識講解,詳細介紹Android開發環境搭建,同時包含Android實戰案例解析,通過全新實戰的Android課程,系統學習Android開發。

C#

精通C#(第6版)

可能你會疑問我為什麼會推薦這本接近1200頁的“鉅著”用作C#入門,這是我的答案:

  1. C#的語言特性非常豐富,很難用簡短的篇幅概括這些特性;
  2. 精通C#之所以有近1200頁的篇幅,是因為它不但全面介紹了C#語言,而且還覆蓋了ADO.NET,WCF,WF,WPF,以及ASP.NET這些.Net框架。你可以把這本書視為兩本書——一本500多頁的C#語言教程和一本600多頁的.Net平臺框架快速上手手冊。
  3. 儘管標題帶有“精通”兩字,精通C#實際上是一本面向初學者的C#書籍,你甚至不需要太多程式設計知識,就可以讀懂它。

CLR via C#(第4版)

相關推薦

成為程式設計簡單這些成就OK

本文把程式設計師所需掌握的關鍵知識總結為三大類19個關鍵概念,然後給出了掌握每個關鍵概念所需的入門書籍,必讀書籍,以及延伸閱讀。旨在成為最好最全面的程式設計師必讀書單。 前言 Reading makes a full man; conference a ready man; and

過來人告訴你:如何快速從零基礎成為程式設計

1、做一名程式設計師,絕對要耐得住寂寞,並且要一直有興趣促進自己學習。如果你完全沒興趣,基本是不可能學會程式設計的。 2、能抗壓。咱們幹程式設計師這一行,幾乎每天都是面對枯燥的程式碼,經常要面臨著加班,除非是特意去很輕鬆的公司上班(當然不加班的公司不是沒有,但是很少,可以這麼說,沒有加過班的

利用Python圖片生成詞雲!裝逼!其實非常簡單不信你

前言 今天教大家用wrodcloud模組來生成詞雲,我讀取了一篇小說並生成了詞雲,先看一下效果圖: 效果圖一:     進群:548377875   即可獲取數十套PDF哦! 效果圖二:    

零基礎Python學習路線小白的你也能成為Python

近幾年Python的受歡迎程度可謂是扶搖直上,當然了學習的人也是愈來愈多。一些學習Python的小白在學習初期,總希望能夠得到一份Python學習路線圖,小編經過多方彙總為大家彙總了一份Python學習路線圖。   對於一個零基礎的想學習python的朋友來說,學習方法很重要, 學習方法不對努力

十年程式設計的Python筆記如何系統的來學習Python

  在我剛學Python的時候,每天除去白天上班,為了保證學習質量,我會每天花三四個小時來學習,天天如此。 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢?           &n

Python|成為爬蟲這個知識點佇列Queue你一定要理解

今天給大家分享寫Python爬蟲不可不理解佇列Queue Queue是python標準庫中的執行緒安全的佇列(FIFO)實現, 提供了一個適用於多執行緒程式設計的先進先出的資料結構,即佇列, 用來在生產者和消費者執行緒之間的資訊傳遞 更多Python視訊、原始碼、資料加群96

天天寫業務程式碼的程式設計師怎麼成為技術開始寫技術程式碼?

粗略的掃了一下前面的答案,有幾個典型的答案我覺得有必要反駁一下: 1)拜大牛為師 – 你想得美 看起來很美好,實際上想拜大牛為師的多了去了,大牛憑什麼看中你呀;而且一個公司或者部門的大牛本來就不多,你正好和大牛在一個組的機率是很小的;如果都不在同一個組,

如何快速成為技術阿里的總結亮了

寫在前面 不管是開發、測試、運維,每個技術人員心裡多多少少都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。  然而“夢想是美好的,現實卻是殘酷的”,很多同學在實際工作後就會發現,夢想是成為大牛,但做的事情

轉行做IT還可以成為技術嗎?

因為工作的原因,在日常生活中,有很多小夥伴向小卓諮詢職業生涯的抉擇。他們對自己的職業現狀不滿意,打算學習程式設計成為一名程式設計師。 嗯,有想法,網際網路火了這麼多年,還在持續升溫中,如果自己確實適合做技術,選擇IT是很明智的。 半路轉行做程式設計師,在求職市場上的

天天寫業務程式碼如何成為技術

寫在前面 不管是開發、測試、運維,每個技術人員心理多多少少都有一個成為技術大牛的夢,畢竟“夢想總是要有的,萬一實現了呢”!正是對技術夢的追求,促使我們不斷地努力和提升自己。 然而“夢想是美好的,現實卻是殘酷的”,很多同學在實際工作後就會發現,夢想是成為大牛,但做的事情看起來跟大牛都不沾邊,例如,程式設計

天天寫業務程式碼如何成為技術

    程式設計師平時的日常編碼工作中,大多數人都只是編寫業務程式碼,各種if else以及資料庫操作等。針對於不同的產品去實現功能時,也只是重複性的搬磚工作。此時會有很多人認為天天寫業務程式碼,感覺沒有什麼長進,也沒有實際的需求可以讓自己深入的研究技術程式碼。那麼這種情況下

天天寫業務程式碼的程式設計師怎麼成為技術

作者:程式之心丁儀 來源:https://chengxuzhixin.com/blog/post/zen_me_cheng_wei_ji_shu_da_niu.html 天天寫業務程式碼,感覺沒長進,技術深度止步不前,感覺很煩躁。很多人都在問,怎麼樣才能成為技術大牛?機會總是留給有準備的人,還是有一些方法

【轉載】通俗地介紹《信號與系統》

推廣 mil 原始的 智能控制 最好 有時 如果 數學 根據 轉載地址:http://emuch.net/bbs/viewthread.php?tid=4009368&fpage=1 第一課 什麽是卷積 卷積有什麽用 什麽是傅利葉變換 什麽是拉普拉斯變換 引子

【轉】如何理解雲計算?簡單就像吃貨想吃披薩了

公司 如果 pan 雲技術 cit 分類 本地應用 style 分發 你一定聽說過雲計算中的三個“高大上”的概念:IaaS、PaaS和SaaS。這幾個術語並不好理解。不過,如果你是個吃貨,還喜歡披薩,這個問題就好解決了!好吧,其實你根本不是一個吃貨,之所以自我標榜為

原創:聊Python小白如何系統自學成為Python(基礎篇一)上

Python Python學習 Python開發 Python自學 原創:聊Python小白如何系統自學成為Python大牛(基礎篇一)上 支持原創 本文章,由頭條py柯西發表,禁止轉載,希望大家支持原創 歡迎大家點擊復制鏈接看原文https://www.toutiao.com/i654581

SQL註入其實簡單別一不留神就被利用了

SQL註入 sqlmap SQL防註入 SQL註入這個詞相信大家應該都不陌生,而且每年都會有這樣子的事情發生,下面我先帶大家回憶11年兩期起比較經典的案例事件: 1、SONY索尼事件2011年4月,著名的×××組織Anonymous***SONY一個網站,一星期後才被發現7千萬的用戶個人信息,其中

C語言實現聊天工具鐘的抖動窗口功能代碼簡單思路也簡單

.com 微信公眾號 eight 後來 這就是 get -i 答案 ros 想必都知道QQ聊天對話框中,有一個抖動個功能,相信大家也都用過,但能否用C語言做出來呢?答案肯定是可以的! 至於如何,今天就為大家分享出來!這就是今天的主題。 制作流程:簡直簡單的小編都不好意思說

填坑:Windows下使用OpenSSL生成自簽證簡單一個晚上搞明白的讓後來者少走彎路)

vat 都是 環境 csr 過程 環境變量 crypt 報錯 out 最近在學習中發現openssl 中有個坑,所有的教程都是openssl genrsa -des3 -out private.key 1024,但是產生的證書,npm start 之後就報錯如下: erro

別再說SUM函數簡單進來看看吧!

exc 多條件 shift 函數 單條件 log ctrl blog 單元格 條件求和 單條件求和 如下圖,統計A產品的銷量總和,輸入公式:=SUM((A2:A6="A")*(C2:C6))按Ctrl+Shift+Enter組合鍵即可。 多條件求和 統計