程序員修煉之道 :從小工到專家 (The Pragmatic Programmer: From Journeyman to Master) 程序员修炼之道:从小工到专家

Andrew Hunt、David Thomas

立即出貨

買這商品的人也買了...

產品描述

編輯推薦

《程序員修煉之道:從小工到專家》:
傳承大師智慧領悟技術本真
經典名著翻譯良品典藏不二之選

媒體推薦

如果我在管理一個項目,這本書的作者就是我想要的人……如果辦不到,我就會要讀過他們的書的人。
——Ward Cunningham

作者簡介

Andrew是一位熱切的木匠和音樂家,但奇怪的是,人們更需要作為顧問的他。他的工作領域包括電信、銀行、金融服務、公共服務,以及一些更奇特的領域,比如醫學成像、圖形藝術、Internet服務。
Andrew的專長是把經過驗證的技術與先進的技術混合在一起,創建各種新穎的——但也是實用的——解決方案。Andrew在北卡羅萊納州的羅利市擁有自己的顧問公司。


David喜歡駕駛單引擎飛機飛行,並通過這樣的方式為他的習慣付賬:為各種難題尋找優雅的解決方案,提供諸多領域裡的諮詢服務——航空、銀行、金融服務、電信、交通運輸及Internet。在於1994年移居美國前,David在英國創立了一家通過ISO9001認證的軟件公司,為世界各地的客戶開發成熟、定製的軟件項目。David現在是一位獨立顧問,居住在德克薩斯州的達拉斯。以The Pragmatic ProgrammerLLC的名義,DavidAndrew正在協同工作,把合起來超過四十年的專業經驗帶給美國各地的客戶。


馬維達是《C++網絡編程(捲2)》與《ACE自適配通信環境技術文檔》的譯者,技術興趣為C++網絡編程(ACE)與分佈式對象計算(Internet Communications Engine)。

目錄

前言

1章註重實效的哲學1
1我的源碼讓貓給吃了2
2軟件的熵3
3石頭湯與煮青蛙5
4足夠好的軟件8
5你的知識資產10
6交流14

2章註重實效的途徑19
7重複的危害20
8正交性25
9可撤消性33
10曳光彈36
11原型與便箋40
12領域語言43
13估算48

3章基本工具55
14純文本的威力56
15 shell遊戲60
16強力編輯63
17源碼控制67
18調試69
19文本操縱77
20代碼生成器80

4章註重實效的偏執85
21按合約設計86
22死程序不說謊95
23斷言式編程97
24何時使用異常100
25怎樣配平資源103

5章彎曲,或折斷111
26解耦與得墨忒耳法則112
27元程序設計117
28時間耦合121
29它只是視圖127
30黑板134

6章當你編碼時139
31靠巧合編程140
32算法速率144
33重構149
34易於測試的代碼153
35邪惡的嚮導160

7章在項目開始之前163
36需求之坑163
37解開不可能解開的謎題172
38等你準備好174
39規範陷阱176
40圓圈與箭頭178

8章註重實效的項目181
41註重實效的團隊181
42無處不在的自動化186
43無情的測試191
44全都是寫200
45極大的期望205
46傲慢與偏見208

附錄A資源209
專業協會209
建設藏書庫210
Internet資源212
參考文獻221
附錄B練習解答225
索引249
註重實效的程序員之快速參考指南263

序言

作為評閱者,我得到了提早閱讀你拿在手上的這本書的機會。即使當時還只是草稿,它就已是一本很好的書。Dave ThomasAndy Hunt有話要說,並且知道怎樣去說。我見過他們所做的事情,知道他們所說的將是有效的。我請求讓我來撰寫這篇前言,以便有機會向你解釋其中的原因。
簡而言之,本書將告訴你怎樣以一種你能夠遵循的方式去編程。也許你不認為這是一件困難的事情,但事情卻並非如此。為什麼?原因之一是,並非所有的編程書籍都是由程序員撰寫的。其中有許多是由語言設計者、或是與他們有合作關係的報刊記者編撰而成,意在推銷他們的作品。那些書告訴你怎樣通過某種編程語言進行表達——這當然很重要,但卻只是程序員所做的事情的一小部分。
除了通過編程語言進行表達,程序員還要做些什麼?嗯,這是一個更深入的問題。大多數程序員在解釋他們所做的事情這個問題上都會有困難。編程是一項充滿了各種細節的工作,追蹤這些細節需要專註。時間流逝、代碼出現,你查看它們,那裡全是些語句。如果你不仔細思考,你也許會以為編程不過就是敲入某種編程語言的語句。你當然錯了,但找遍書店的編程專櫃,你卻還是講不出所以然。
在《程序員修煉之道》一書中,DaveAndy將告訴我們怎樣以一種我們能夠遵循的方式編程。他們何以能這樣聰明?他們不也是和其他程序員一樣,專註於各種細節而已嗎?答案是他們在做某件事情時,會把註意力投註在他們在做的事情上——然後他們會試著把它做得更好。
設想你在參加一個會議。或許你在想,這個會議沒完沒了,你還不如去寫程序。而DaveAndy會想,他們為什麼在開會,他們想知道是否可以通過另外的方式取代會議,並決定是否可使某樣事情自動化,以使開會的工作推後。然後他們就會這樣去做。
這就是DaveAndy思考的方式。開會並非是某種使他們遠離編程的事情。開會就是編程,並且是能夠加以改善的編程。我之所以知道他們以這樣的方式思考,是因為這是書中的第二條提示:思考你的工作。
那麼再設想一下,他們這樣思考了幾年。很快他們就會擁有一堆解決方案。現在設想他們在工作中使用這些解決方案,又是幾年;他們還放棄了其中太過困難、或者不能總是產生結果的解決方案。噢,這樣的途徑幾乎定義了“pragmatic”(註重實效)的含義。現在設想他們又用了一兩年來寫下他們的解決方案。你也許會想,這些信息可真是金礦。你想對了。
兩位作者告訴我們他們是怎樣編程的,並且是以一種我們能夠遵循的方式來告訴我們的。但這一陳述的後半部分的含義也許要多於你所想到的。讓我來解釋一下。

文摘

依據你的職業發展、你的項目和你每天的工作,為你自己和你的行為負責這樣一種觀念,是註重實效的哲學的一塊基石。註重實效的程序員對他或她自己的職業生涯負責,並且不害怕承認無知或錯誤。這肯定並非是編程最令人愉悅的方面,但它肯定會發生——即使是在最好的項目中。儘管有徹底的測試、良好的文檔以及足夠的自動化,事情還是會出錯。交付晚了,出現了未曾預見到的技術問題。

發生這樣的事情,我們要設法盡可能職業地處理它們。這意味著誠實和坦率。我們可以為我們的能力自豪,但對於我們的缺點——還有我們的無知和我們的錯誤——我們必須誠實。
責任是你主動擔負的東西。你承諾確保某件事情正確完成,但你不一定能直接控制事情的每一個方面。除了盡你所能以外,你必須分析風險是否超出了你的控制。對於不可能做到的事情或是風險太大的事情,你有權不去為之負責。你必須基於你自己的道德準則和判斷來做出決定。
如果你確實同意要為某個結果負責,你就應切實負起責任。當你犯錯誤(就如同我們所有人都會犯錯誤一樣)、或是判斷失誤時,誠實地承認它,並設法給出各種選擇。不要責備別人或別的東西,或是拼湊藉口。不要把所有問題都歸咎於供應商、編程語言、管理部門、或是你的同事。也許他(它)們全體或是某幾方在其中扮演了某種角色,但你可以選擇提供解決方案,而非尋找藉口。
如果存在供應商不能按時供貨的風險,你應該預先制定一份應急計劃。如果磁盤垮了——帶走了你的所有源碼一而你沒有做備份,那是你的錯。告訴你的老闆我的源碼讓貓給吃了也無法改變這一點。