❶ 如何閱讀和學習《計算機程序設計藝術(TAOCP)》
哦,上帝!《The Art of Computer Programming》引那位出名的王垠對TAOCP的評論: 本來早就想想寫一個對於Knuth的The Art of Computer Programming的看法。 沒想到一去Amazon就找到一個同類 關於Knuth的 TAOCP,我想,大部分人聲稱看了他的書,或者買了他的書,不過是作為一種炫耀的資本或者擺設。我對門的同學幾年前就買了一套三本,全新的精裝本,花了 200多塊錢。可是呢,他從來就沒看。我把它借過來,看了幾頁就放在那裡沒有看了。我哪有時間看他用那些一個位元組6位的機器語言實現簡單的鏈表!有一天一個師弟走進來,看到那套書在我書架上,顯示出一種敬畏感:「挖!師兄!你好牛啊!居然看這么高深的書!」 我一愣。嗯,不錯嘛,這套書放在書架上可以讓人對我刮目相看。這恐怕就是它對很多人的實際作用。還有人可以幫助神化這套書,同時也神化自己,比如他可以這么說:「誰要是看完了Don Knuth的 The Art of Computer Programming 我就僱用他!」 這樣可以顯得比一般看過書的人還要高一等。據說Bill Gates就是這么做的。我懷疑他自己看完過沒有。 我討厭這套書的一個原因就是Knuth故意用一個叫 MIX 的處理器的機器語言來寫這本書。雖然在新版的書里他設計了一種新的處理器 MMIX,但是換湯不換葯。他以為一部「永恆」的計算機編程書不應該使用高級語言,因為它們很容易過時。但是他錯了,機器語言恰恰是最容易過時的東西,看看現在有多少牌子的更新換代的處理器就知道。而世界上確實存在非常高級的語言從60年代到現在都沒有過時。我預言,MMIX會在不久的將來被淘汰。很好笑的是MMIX是在MIX上加了一個「M」,代表Millennium(千禧年)。關於它的專著也起名為 MMIXware---A RISC Computer for the Third Millennium。一千年甚至短短一百年,幾十年以後,計算機還是不是二進制的集成電路都說不清楚,況且這個處理器其實就是從別的處理器比如RISC II, Sparc之類的撿了一點東西,沒有什麼大的創新。他就把這個處理器的模擬程序印在紙上賣,曰:「一個優秀的程序要像一部好的小說一樣容易讀懂。一個優秀的程序員會在將來拿到普利策獎。」 用機器語言寫一點初級的計算機入門部分還可以,但是用來寫整整一部書未免容易讓讀者只見樹木不見森林了。看TAOCP最容易出現的一種現象就是,「哇!原來這個程序可以這么寫。」 但是你不知道為啥那麼寫。雖然可以知道一些底層的原因,但是最根本的原理,讀者始終不會明白。就像看清楚了一張圖片上的每一個像素,卻認不出圖片上其實是一個熟人。看清楚了棋盤上每一個棋子能走的地方,卻不能贏棋。Dijkstra 說計算科學不應該被叫做"computer science",就像外科手術不應該叫做"knife science"。可是這關Knuth什麼事呢,他的書名叫做 The Art of... 再說他的支票吧…… 很多人拿了Knuth的支票就作為一種可以炫耀的東西。以前我就看到一個Cambridge的教授主頁上掛著一個Knuth支票的照片。Knuth的支票真的可以作為炫耀的資本嗎?告訴你們,我找到的錯誤都是typo而已,沒想到他也給我支票。誰叫他打字不小心,Millennium都能打成 Millenium?嘿!我湊足了一頓飯錢的支票時就想去中國銀行兌現,准備換了錢大吃一頓。可是銀行的職員告訴我,他們必須把支票寄回美國才能拿到現金,辦理這件事的費用大大高於支票本身的價值!所以Knuth相當於給我一些空頭支票。Damn!早該想到的,他為什麼不往大家的信用卡上面轉賬,而使用支票這種過時的東西!他明顯覺得有他簽名的支票,肯定誰也不會拿去兌現,甚至裝裱在相框里作為紀念。hmmm... 算你狠~ 好了,啰里啰唆。還是看看這個別人寫的書評。White elephant,這確實道出了我對這套書的感覺。 (但是評價者有些觀點我不能苟同,比如「O(n)表示法足夠了」。) 希望以後對 paper 也有這種公開的 comments! Dan Friedman 的故事 (4)——C311當我剛從 Cornell 轉學到 IU 的時候,Dan Friedman 叫我去上他的研究生程序語言課 B521。我當時以自己在 Cornell 上過程序語言課程為由,想不去上他的課。Friedman 把我叫到他的辦公室,讓我在他旁邊坐下來,和藹的對我說:「王垠,我知道你在 Cornell 上過這種課。我也知道 Cornell 是比 IU 好很多的學校。可是每個老師的教學方法都是不一樣的,你應該來上我的課。我和我的朋友們在這里做教授,不是因為喜歡這個學校,而是因為我們的家人和朋友都在這里。」後來由於跟 Amr Sabry(我現在的導師)的課程 B522 時間重合,他特別安排我坐在本科生的 C311 的課堂上,卻拿研究生課程的學分。後來發現,這兩門課的內容基本沒有區別,只不過研究生的作業要多一些。 在第一堂課上,他說了一句讓我記憶至今的話:「《The Little Schemer》和《Essentials of Programming Languages》是這門課的參考教材,但是我上課從來不講我的書里的內容。」剛一開始,我就發現這門課跟我在 Cornell 學到的東西很不一樣。雖然有些概念,比如 closure,CPS,我在 Cornell 都學過,在他的課堂上,我卻看到這些概念完全不同的一面,以至於我覺得其實我之前完全不懂這些概念!這是因為在 Cornell 學到這些東西的時候只是用來應付作業,而在 Friedman 的課上,我利用它們來完成有實際意義的目標,所以才真正的體會到這些概念的內涵和價值。 一個例子就是課程進入到沒幾個星期的時候,我們開始寫解釋器來執行簡單的 Scheme 程序。然後我們把這個解釋器進行 CPS 變換,引入全局變數作為"寄存器" (register),把 CPS 產生的 continuation 轉換成數據結構(也就是堆棧)。最後我們得到的是一個抽象機 (abstract machine),而這在本質上相當於一個真實機器里的中央處理器(CPU)或者虛擬機(比如 JVM)。所以我們其實從無到有,「發明」了 CPU!從這里,我才真正的理解到寄存器,堆棧等的本質,以及我們為什麼需要它們。我才真正的明白了,馮諾依曼體系構架為什麼要設計成這個樣子。後來他讓我們去看一篇他的好朋友 Olivier Danvy 的論文,講述如何從各種不同的解釋器經過 CPS 變換得出不同種類的抽象機模型。這是我第一次感覺到程序語言的理論對於現實世界的巨大威力,也讓我理解到,機器並不是計算的本質。機器可以用任何可行的技術實現,比如集成電路,激光,量子,分子,基因…… 但是無論用什麼作為機器的材料,我們所要表達的語義,也就是計算的本質,卻是不變的。 而這些還不是我那屆 C311 全部的內容。後半學期,我們開始學習 miniKanren,一種他自己設計的用於教學的邏輯式語言 (logic programming language)。這個語言類似 Prolog,但是它把 Prolog 的很多缺點給去掉了,而且變得更加容易理解。教材是免費送給我們的《The Reasoned Schemer》。在書的最後,兩頁紙的篇幅,就是整個 miniKanren 語言的實現!我學得比較快,後來就開始搗鼓這個實現,把有些部分重新設計了一下,然後加入了一些我想要的功能。這樣的教學,給了我設計邏輯式語言的能力,而不只是停留於一個使用者。這是學習 Prolog 不可能做到的事情,因為 Prolog 實現的復雜性,會讓初學者無從下手,只能停留在使用者的階段。 我很幸運當初聽了他的話,去上了這門課,否則我就不會是今天的我。 誰是真正的程序語言專家Knuth 也曾有類似的說法:「要是看不懂 TAOCP,就別當程序員。」他總是被譽為「計算機科學的神」,在他的演講里大談文學,藝術,上帝和宗教,給人陡增神秘感。他總是說程序員應該學習機器語言,而不是高級語言,機器才是不變的真理。但是 Knuth 卻不是從科學的角度來看這個問題,而只是他個人的偏見。當他看到 Fortran, Lisp, ALGOL, Pascal, C, C++, Java 這些語言的發展彷彿沒有盡頭的時候,他並沒有理解其中不變的原理。在程序語言的設計上,他不是一個強者。他很有可能根本不理解 lambda calculus 和類型理論,否則他不會設計出像 TeX 那樣毫無章法的語言。TeX 排版的質量無可厚非,但是到了1978年還仍然採用程序語言專家們早已深惡痛絕的 dynamic scoping,再加上其它一些蹩腳的設計,說明他對程序語言理論缺乏理解。實際上 TeX 含有一個圖靈完備的擴展語言,是因為 Knuth 採納了 Guy Steele(Scheme 的發明者)的建議,然而 Knuth 卻沒有把它設計好。 Knuth 覺得機器是不變的真理,所以他堅持用機器語言來寫作 TAOCP。但是由於機器語言缺乏抽象,程序員沒法專注於真正的問題。使用機器語言來描述演算法,會把本來很簡單的問題都顯得高深難懂,彷彿這書永遠也看不完。有多少人真正的看過 TAOCP 呢?恐怕大部分人把這套書買回去,只是把它們擺在書架上做面子。只要有人說機器語言太難懂,這些人就會說你自己不夠聰明,不配做程序員。而其實呢,他們自己都沒看過。 機器不是計算的本質這個事實,很多人包括 Dijkstra,早就看到了。他說:「計算機科學是個錯誤的名字,因為它不是計算機的科學,這就像外科手術不是刀子的科學。」而這是幾乎每一個程序語言專家都明白的道理。在他們的眼裡,這不再是道聽途說或者個人觀點,而是可以用邏輯來證明的事實。真正明白計算本質的人,可以設計出全新的硬體來來滿足語義的需要,而不是受控於處理器的設計。他們甚至可以超越集成電路,而使用另外的技術來製造機器。這些都說明,計算其實是獨立於機器的。 有不好的想法不要緊,但是如果把不好的想法硬說成是好的,那就會阻礙歷史發展了。我並不否認 Knuth 和 Ritchie 對演算法,排版和操作系統的重要貢獻,但是由於他們以及他們崇拜者經常在有關語言的事情上誤導群眾,所以覺得有必要指出他們的一些局限性。Linus Torvalds, Guido van Rossum, Eric Raymond, Paul Graham 也經常發表對語言的評論,被很多人奉為聖旨,但其實他們言論裡面很少有真知灼見。 其實我要說的不過是,通常程序員們膜拜的偶像,大部分都不是真正的程序語言專家。希望你不要覺得這是危言聳聽,實際上這些是大部分世界級的計算機科學家們很多年前就知道的事情。
❷ 程序員需要學些什麼
程序員的崗位需求很多,例如大型網路公司、軟體開發公司等等都需要程序員。
程序員需要學習:
1、掌握數據及其轉換、數據的機內表示、算術和邏輯運算,以及相關的應用數學基礎知識;
2、理解計算機的組成以及各主要部件的性能指標;
3、掌握操作系統、程序設計語言的基礎知識;
4、熟練掌握計算機常用辦公軟體的基本操作方法;
5、熟練掌握基本數據結構和常用演算法;
6、熟練掌握C程序設計語言,以及C++、Java、Visual Basic中的一種程序設計語言;
7、熟悉資料庫、網路和多媒體的基礎知識;
8、掌握軟體工程的基礎知識,了解軟體過程基本知識、軟體開發項目管理的常識;
9、了解常用信息技術標准、安全性,以及有關法律、法規的基本知識;
10、了解信息化、計算機應用的基礎知識;
11、正確閱讀和理解計算機領域的簡單英文資料。
程序員必備技能:
1、熟練開發工具
做為一名程序員至少熟練掌握兩到三種開發工具的使用,這是程序員的立身之本,其中C/C++和JAVA是重點推薦的開發工具,C/C++以其高效率和高度的靈活性成為開發工具中的利器,很多系統級的軟體還是用C/C++編寫。
而JAVA的跨平台和與WEB很好的結合是JAVA的優勢所在,而JAVA即其相關的技術集JAVAOne很可能會成為未來的主流開發工具之一。
其次,能掌握一種簡便的可視化開發工具,如VB,PowerBuilder,Delphi,CBuilder,則更好,這些開發工具減小了開發難度,並能夠強化程序員對象模型的概念。
另外,需要掌握基本的腳本語言,如shell,perl等,至少能讀懂這些腳本代碼。
2、熟知資料庫
作為程序員,他們自然有自己的理由:很多應用程序都是以資料庫的數據為中心,而資料庫的產品也有不少,其中關系型資料庫仍是主流形式,所以程序員至少熟練掌握一兩種資料庫,對關系型資料庫的關鍵元素要非常清楚,要熟練掌握SQL的基本語法。
雖然很多資料庫產品提供了可視化的資料庫管理工具,但SQL是基礎,是通用的資料庫操作方法。如果沒有機會接觸商業資料庫系統,可以使用免費的資料庫產品是一個不錯的選擇,如mySQL,Postgres等。
3、了解操作系統
當前主流的操作系統是Windows,Linux/Unix,熟練地使用這些操作系統是必須的,但只有這些還遠遠不夠。
要想成為一個真正的編程高手,需要深入了解操作系統,了解它的內存管理機制、進程/線程調度、信號、內核對象、系統調用、協議棧實現等。
Linux作為開發源碼的操作系統,是一個很好的學習平台,Linux幾乎具備了所有現代操作系統的特徵。雖然Windows系統的內核實現機制的資料較少,但通過互聯網還是能獲取不少資料。懂得網路協議TCP/IP。
在互聯網如此普及的今天,如果您還沒有對互聯網的支撐協議TCP/IP協議棧有很好的掌握,就需要迅速補上這一課,網路技術已改變了軟體運行的模式。
從最早的客戶/伺服器結構,到今天的WEBServices,再到未來的網格計算,這一切都離不開以TCP/IP協議棧為基礎的網路協議支持,深入掌握TCP/IP協議是非常必要的。
至少,需要了解ISO七層協議模型,IP/UDP/TCP/HTTP等常用協議的原理和三次握手機制。
4、明白DCOM/CORBA/XML/WEBServices存在的意義
隨著技術的發展,軟體與網路的無縫結合是必然趨勢,軟體系統的位置無關性是未來計算模式的重要特徵之一,DCOM/CORBA是當前兩大主流的分布計算的中間平台,DCOM是微軟COM(組件對象模型)的擴展,而CORBA是OMG支持的規范。
XML/WebServices重要性不言而喻,XML以其結構化的表示方法和超強的表達能力被喻為互聯網上的「世界語」,是分布式計算的基石之一。
5、不要將軟體工程與CMM分開
大型軟體系統的開發中,工程化的開發控製取代個人英雄主義,成為軟體系統成功的保證,一個編程高手並不一定是一個優秀的程序員。
一個優秀的程序員是將出色的編程能力和開發技巧同嚴格的軟體工程思想有機結合,編程只是軟體生命周期中的其中一環,優秀的程序員應該掌握軟體開發各個階段的基本技能。
如市場分析,可行性分析,需求分析,結構設計,詳細設計,軟體測試等。
6、需求理解能力
程序員要能正確理解任務單中描述的需求。在這里要明確一點,程序員不僅僅要注意到軟體的功能需求,還應注意軟體的性能需求。
要能正確評估自己的模塊對整個項目中的影響及潛在的威脅,如果有著兩到三年項目經驗的熟練程序員對這一點沒有體會的話,只能說明他或許是認真工作過,但是沒有用心工作。
7、模塊化思維能力
作為一個優秀的程序員,他的思想不能局限在當前的工作任務裡面,要想想看自己寫的模塊是否可以脫離當前系統存在,通過簡單的封裝在其他系統中或其他模塊中直接使用。
這樣做可以使代碼能重復利用,減少重復的勞動,也能使系統結構越趨合理。模塊化思維能力的提高是一個程序員的技術水平提高的一項重要指標。
就業方向:
1、網路開發
現在網路已經成為世界通訊的一座橋梁,好像Javascript、PHP、Ruby這幾類開發語言大部分是用作網路開發方面。
2、企業軟體開發
JAVA、C#、VB這幾類開發語言都實現了面向對象開發的目標,更多時候用於企業系統的開發。
3、系統軟體
C語言、C++、Object-C這些軟體更多是用在系統軟體開發,嵌入式開發的方面。
當然,這分類不是絕對,像JAVA、C#、VB很多時候也用於動態網站的開發。在很開發項目都會使用集成開發的方式,同一個項目裡面使用多種開發語言,各展所長,同步開發。
但所以在剛入門的時候,建議先為自己選擇一種合適的開發工具,「專注地投入學習,全力一擊」。
會編程、會計算機語言就能加入互聯網發展大潮中,享受數字經濟發展的紅利,一時間社會上的程序員培訓機構都變得格外火爆。
但是現在,專家的數據分析結果告訴你:若想跟上數字經濟發展的步伐,光會編程可不行,這個行業現在緊缺高端的、綜合型人才。
11月22日下午,清華大學經管學院互聯網發展與治理研究中心與領英聯合發布《中國經濟的數字化轉型:人才與就業》,揭示我國數字人才現狀與趨勢。
報告顯示我國數字經濟發展面臨人才短缺的挑戰,但這種短缺主要體現在擁有中高級專業技能數字人才的比例不高,擁有人工智慧、智能製造等前沿技術的人才更是少之又少。
與美國、英國、加拿大等國家相比,中國的數字人才儲備尚有很大差距。
此外,報告根據對人才需求的數據分析,結果顯示我國數字人才的技能需求不再強調單一編程技能,更加看重技術、管理和領導力等綜合技能。
2015年,我國從事信息傳輸、軟體和信息技術服務相關工作的人數約350萬,但其中中高端人才,特別是前沿技術的數字人才並不多。根據領英中國智庫的研究,在人工智慧領域,美國的從業者數量在85萬人以上,印度15萬,英國14萬,中國只有5萬多人。
報告負責人、清華大學經濟管理學院副院長陳煜波教授表示,我國目前在大數據與人工智慧領域人才缺口明顯。
他解釋說,目前中國85%以上的數字人才分布在產品研發類,而深度分析、先進製造、數字營銷等職能的人才加起來只有不到5%,存在較大缺口,新興技術人才和創新型人才培養方面存在滯後和不足。
這份研究報告的基礎數據來自領英在中國的3600萬個人用戶,這些用戶畢業於1.5萬多所國內外院校,分布在36.4萬家企業,擁有超過2.3萬項技能。
陳煜波研究團隊從中篩選了72萬數字人才,多維度提取用戶畫像並跟蹤其職業軌跡,以此預測不同地區的人才流向、僱傭率、受僱主歡迎的技能等人才趨勢層面的信息。
陳煜波說,根據數據分析結果,整體來看,雖然編程技能和數據分析技能需求占據主導,然而隨著數字產業走向成熟,企業除了強調編程技能,也逐步更加看重人才的技術、管理和領導力等綜合技能。
近年間,項目管理、產品運營等「技術+管理」類技能的需求呈現出明顯的上升趨勢,懂技術、懂管理的人才被認為是「一將難求」。
領英中國代理總裁曾志恆也提醒,如果你有興趣向數字職能轉型,不能僅僅專注於自己的技術能力,溝通和領導力等軟性技能將成為你脫穎而出的關鍵。
陳煜波希望這些研究結果能為教育行業和政府部門提供借鑒。他說,教育行業可根據職位的供需趨勢更好地規劃人才培養的方向,政府也可更好地了解人才流動方向、技術缺口等,以此制定有針對性的引才策略。
程序員崗位職責:
1、對項目經理負責,負責軟體項目的詳細設計、編碼和內部測試的組織實施,對小型軟體項目兼任系統分析工作,完成分配項目的實施和技術支持工作。
2、協助項目經理和相關人員同客戶進行溝通,保持良好的客戶關系。
3、參與需求調研、項目可行性分析、技術可行性分析和需求分析。
4、熟悉並熟練掌握交付軟體部開發的軟體項目的相關軟體技術。
5、負責向項目經理及時反饋軟體開發中的情況,並根據實際情況提出改進建議。
6、參與軟體開發和維護過程中重大技術問題的解決,參與軟體首次安裝調試、數據割接、用戶培訓和項目推廣。
7、負責相關技術文檔的擬訂。
8、負責對業務領域內的技術發展動態進行分析研究。
相關書籍:
很多程序員響應,他們在推薦時也寫下自己的評語。 以前就有國內網友介紹這個程序員書單,不過都是推薦數 Top 9的書。
其實除了前9本之外,推薦數前30左右的書籍都算經典,筆者整理編譯這個問答貼,同時摘譯部分推薦人的評語。
下面就按照各本書的推薦數排列。
1、《代碼大全》 史蒂夫·邁克康奈爾
2、《程序員修煉之道》
3、《計算機程序的構造和解釋》
4、《演算法導論》
5、《重構:改善既有代碼的設計》
6、《設計模式》
7、《人月神話》
8、《計算機程序設計藝術》
9、《編譯原理》(龍書)
10、《活著》
❸ 一個合格的程序員應該讀過哪些書
1、《代碼大全》 史蒂夫·邁克康奈爾
推薦數:1684
「優秀的編程實踐的網路全書,《代碼大全》注重個人技術,其中所有東西加起來, 就是我們本能所說的「編寫整潔的代碼」。這本書有50頁在談論代碼布局。」 —— Joel Spolsky
對於新手來說,這本書中的觀念有點高階了。到你准備閱讀此書時,你應該已經知道並實踐過書中99%的觀念。– esac
Steve McConnell的原作《代碼大全》(第1版)是公認的關於編程的最佳實踐指南之一, 在過去的十多年間,本書一直在幫助開發人員編寫更好的軟體。
現在,作者將這本經典著作全新演繹,融入了最前沿的實踐技術,加入了上百個嶄新的代碼示例, 充分展示了軟體構建的藝術性和科學性。 McConnell匯集了來自研究機構、學術界以及業界日常實踐的主要知識, 把最高效的技術和最重要的原理交織融會為這本既清晰又實用的指南。
無論您的經驗水平如何,也不管您在怎樣的開發環境中工作,也無論項目是大是小, 本書都將激發您的思維並幫助您構建高品質的代碼。
《代碼大全(第2版))》做了全面的更新,增加了很多與時俱進的內容,包括對新語言、新的開發過程與方法論的討論等等。
2、《程序員修煉之道》
推薦數:1504
對於那些已經學習過編程機制的程序員來說,這是一本卓越的書。 或許他們還是在校生,但對要自己做什麼,還感覺不是很安全。
就像草圖和架構之間的差別。雖然你在學校課堂上學到的是畫圖,你也可以畫的很漂亮, 但如果你覺得你不太知道從哪兒下手,如果某人要你獨自畫一個P2P的音樂交換網路圖,那這本書就適合你了。—— Joel
《程序員修煉之道:從小工到專家》內容簡介:《程序員修煉之道》由一系列獨立的部分組成, 涵蓋的主題從個人責任、職業發展,知道用於使代碼保持靈活、並且易於改編和復用的各種架構技術, 利用許多富有娛樂性的奇聞軼事、有思想性的例子及有趣的類比, 全面闡釋了軟體開發的許多不同方面的最佳實踐和重大陷阱。
無論你是初學者,是有經驗的程序員,還是軟體項目經理,《程序員修煉之道:從小工到專家》都適合你閱讀。
3、《計算機程序的構造和解釋》
推薦數:916
就個人而言,這本書目前為止對我影響醉倒的一本編程書。
《代碼大全》、《重構》和《設計模式》這些經典書會教給你高效的工作習慣和交易細節。 其他像《人件集》、《計算機編程心理學》和《人月神話》這些書會深入軟體開發的心理層面。 其他書籍則處理演算法。這些書都有自己所屬的位置。
然而《計算機程序的構造和解釋》與這些不同。 這是一本會啟發你的書,它會燃起你編寫出色程序的熱情; 它還將教會你認識並欣賞美; 它會讓你有種敬畏,讓你難以抑制地渴望學習更多的東西。
其他書或許會讓你成為一位更出色的程序員,但此書將一定會讓你成為一名程序員。
同時,你將會學到其他東西,函數式編程(第三章)、惰性計算、元編程、虛擬機、解釋器和編譯器。
一些人認為此書不適合新手。 個人認為,雖然我並不完全認同要有一些編程經驗才能讀此書,但我還是一定推薦給初學者。 畢竟這本書是寫給著名的6.001,是麻省理工學院的入門編程課程。 此書或許需要多做努力(尤其你在做練習的時候,你也應當如此),但這個價是對得起這本書的。
4、《C程序設計語言》
推薦數:774
這本書簡潔易讀,會教給你三件事:C 編程語言;如何像程序員一樣思考;底層計算模型。 (這對理解「底層」非常重要)—— Nathan
《C程序設計語言》(第2版新版)講述深入淺出,配合典型例證,通俗易懂,實用性強, 適合作為大專院校計算機專業或非計算機專業的C語言教材,也可以作為從事計算機相關軟硬體開發的技術人員的參考書。
《C程序設計語言》(第2版新版)原著即為C語言的設計者之一Dennis M.Ritchie和著名的計算機科學家Brian W.Kernighan合著的 一本介紹C語言的權威經典著作。 我們現在見到的大量論述C語言程序設計的教材和專著均以此書為藍本。 原著第1版中介紹的C語言成為後來廣泛使用的C語言版本——標准C的基礎。
人們熟知的「hello,world」程序就是由本書首次引入的,現在,這一程序已經成為所有程序設計語言入門的第一課。
5、《演算法導論》
推薦數:671
《代碼大全》教你如何正確編程; 《人月神話》教你如何正確管理; 《設計模式》教你如何正確設計……
在我看來,代碼只是一個工具,並非精髓。 開發軟體的主要部分是創建新演算法或重新實現現有演算法。 其他部分則像重新組裝樂高磚塊或創建「管理」層。
我依然夢想這樣的工作,我的大部分時間(>50%)是在寫演算法,其他「管理」細節則留給其他人…… —— Ran Biron
經典的演算法書,被亞馬遜網,《程序員》等評選為2006年最受讀者喜愛的十大IT圖書之一。
演算法領域的標准教材,全球多所知名大學選用
MIT名師聯手鑄就,被譽為「計算機演算法的聖經」
編寫上採用了「五個一」,即一章介紹一個演算法、一種設計技術、一個應用領域和一個相關話題。
6、《重構:改善既有代碼的設計》
推薦數:617
《重構:改善既有代碼的設計》清晰地揭示了重構的過程,解釋了重構的原理和最佳實踐方式, 並給出了何時以及何地應該開始挖掘代碼以求改善。 書中給出了70多個可行的重構,每個重構都介紹了一種經過驗證的代碼變換手法的動機和技術。
《重構:改善既有代碼的設計》提出的重構准則將幫助你一次一小步地修改你的代碼,從而減少了開發過程中的風險。
《重構:改善既有代碼的設計》適合軟體開發人員、項目管理人員等閱讀, 也可作為高等院校計算機及相關專業師生的參考讀物。
我想我不得不推薦《重構》:改進現有代碼的設計。—— Martin
我必須承認,我最喜歡的編程語錄是出自這本書:任何一個傻瓜都能寫出計算機能理解的程序, 而優秀的程序員卻能寫出別人能讀得懂的程序。—— Martin Fowler
7、《設計模式》
推薦數:617
自1995年出版以來,本書一直名列Amazon和各大書店銷售榜前列。 近10年後,本書仍是Addison-Wesley公司2003年最暢銷的圖書之一。 中文版銷售逾4萬冊。
就我而言,我認為四人幫編著的《設計模式》是一本極為有用的書。 雖然此書並不像其他建議一樣有關「元」編程,但它強調封裝諸如模式一類的優秀編程技術, 因而鼓勵其他人提出新模式和反模式(antipatterns),並運用於編程對話中。—— Chris Jester-Young
8、《人月神話》
推薦數:588
在軟體領域,很少能有像《人月神話》一樣具有深遠影響力並且暢銷不衰的著作。
Brooks博士為人們管理復雜項目提供了最具洞察力的見解。 既有很多發人深省的觀點,又有大量軟體工程的實踐。 本書內容來自Brooks博士在IBM公司System/360家族和OS/360中的項目管理經驗。
該書英文原版一經面世,即引起業內人士的強烈反響,後又譯為德、法、日、俄中等多種語言,全球銷量數百萬冊。 確立了其在行業內的經典地位。
9、《計算機程序設計藝術》
推薦數:542
《計算機程序設計藝術》系列著作對計算機領域產生了深遠的影響。 這一系列堪稱一項浩大的工程,自1962年開始編寫,計劃出版7卷,目前已經出版了4卷。
《美國科學家》雜志曾將這套書與愛因斯坦的《相對論》等書並列稱為20世紀最重要的12本物理學著作。 目前Knuth正將畢生精力投入到這部史詩性著作的撰寫中。
這是高德納傾注心血寫的一本書。—— Peter Coulton
10、《編譯原理》(龍書)
推薦數:462
我很奇怪,居然沒人提到龍書。(或許已有推薦,我沒有看到)。 我從沒忘過此書的第一版封面。 此書讓我知道了編譯器是多麼地神奇絕妙。- DB