1.關(guān)心你的技藝
Care About Your Craft
如果你不在湖能否漂亮的開(kāi)發(fā)出軟件,你又為何要耗費(fèi)生命去開(kāi)發(fā)軟件呢?
2.思考!你的工作
Think! About Your Work
關(guān)掉自動(dòng)駕駛儀,接管操作。不斷地批評(píng)和評(píng)估你的工作。
3.提供各種選擇,不要找蹩腳的借口
Provide Options, Don't Make Lame Excuses
要提供各種選擇,而不是找借口。不要說(shuō)事情做不到;說(shuō)明能夠做什么。
4.不要容忍破窗戶
Don't Live with Broken Windows
當(dāng)你看到糟糕的設(shè)計(jì)、錯(cuò)誤的決策和糟糕的代碼時(shí),修正它們。
5.做變化的催化劑
Be a Catalyst for Change
你不能強(qiáng)迫人們改變。相反,要向他們展示未來(lái)可能會(huì)怎樣,并幫助他們參與對(duì)未來(lái)的創(chuàng)造。
6.記住大圖景
Remember the Big Picture
不要太過(guò)專注于細(xì)節(jié),以至忘了查看你周圍正在發(fā)生什么。
7.使質(zhì)量成為需求問(wèn)題
Make Quality a Requirements lssue
讓你的用戶參與確定項(xiàng)目真正的質(zhì)量需求。
8.定期為你的知識(shí)資產(chǎn)投資
Invest Regularly in Your Knowledge Portfolio
讓學(xué)習(xí)成為習(xí)慣。
9.批判地分析你讀到的和聽(tīng)到的
Critically Analyze What You Read and Hear
不要被供應(yīng)商、媒體炒作、或教條左右。要依照你自己的看法和你的項(xiàng)目的情況去對(duì)信息進(jìn)行
分析。
10.你說(shuō)什么和你怎么說(shuō)同樣重要
It's both What You Say and the Way You Say it
如果你不能有效地向他人傳達(dá)你的了不起的想法,這些想法就毫無(wú)用處。
11.不要重復(fù)你自己
DRY - Don't Repeat Yourself
系統(tǒng)中的每一項(xiàng)知識(shí)都必須具有單一、無(wú)歧義、權(quán)威的表示。
12.讓復(fù)用變得容易
Make It Easy to Reuse
如果復(fù)用很容易,人們就會(huì)去復(fù)用。創(chuàng)造一個(gè)支持復(fù)用的環(huán)境。
13.消除無(wú)關(guān)事物之間的影響
Eliminate Effects Between Unrelated Things
設(shè)計(jì)自足、獨(dú)立、并具有單一、良好定義的目的的組件。
14.不存在最終決策
There Are No Final Decisions
沒(méi)有決策是澆鑄在石頭上的。相反,要把每項(xiàng)決策都視為是寫在沙灘上的,并為變化做好
計(jì)劃。
15.用曳光彈找到目標(biāo)
Use Tracer Bullets to Find the Target
曳光彈能通過(guò)試驗(yàn)各種事物并檢查它們離目標(biāo)有多遠(yuǎn)來(lái)讓你追蹤目標(biāo)。
16.為了學(xué)習(xí)而制作原型
Prototype to Learn
原型制作是一種學(xué)習(xí)經(jīng)驗(yàn)。其價(jià)值并不在于所產(chǎn)生的代碼,而在于所學(xué)到的經(jīng)驗(yàn)教訓(xùn)。
17.靠近問(wèn)題領(lǐng)域編程
Program Close to the Problem domain
用你的用戶的語(yǔ)言進(jìn)行設(shè)計(jì)和編碼。
18.估算,以避免發(fā)生意外
Estimate to Avoid Surprises
在著手之前先進(jìn)行估算。你將提前發(fā)現(xiàn)潛在的問(wèn)題。
19.通過(guò)代碼對(duì)進(jìn)度表進(jìn)行迭代
Iterate the Schedule with the Code
用你在進(jìn)行實(shí)現(xiàn)時(shí)獲得的經(jīng)驗(yàn)提煉項(xiàng)目的時(shí)間標(biāo)度。
20.用純文本保存知識(shí)
Keep Knowledge in Plain Text
純文本不會(huì)過(guò)時(shí)。它能夠幫助你有效利用你的工作。并簡(jiǎn)化掉時(shí)和測(cè)試。
21.利用命令shell的力量
Use the Power of Command Shells
當(dāng)圖形用戶界面無(wú)能為力時(shí)使用shell。
22.用好一種編輯器
Use a Single Editor Well
編輯器應(yīng)該是你的手的延伸;確保你的編輯器是可配置、科擴(kuò)展和可編程的。
23.總是使用源碼控制
Always Use Source Code Control
源碼控制是你的工作的時(shí)間機(jī)器--你能夠回到過(guò)去。
24.要修正問(wèn)題,而不是發(fā)出指責(zé)
Fix the Problem, Not the Blame
bug是你的過(guò)錯(cuò)還是別人的過(guò)錯(cuò),并不是真的很有關(guān)系--它仍然是你的問(wèn)題,它仍然需要
修正。
25.調(diào)試時(shí)不要恐慌
Don't Panic When Debuging
做一次深呼吸,思考什么可能是bug的原因。
26.“Select”沒(méi)有問(wèn)題
"Select" Isn't Broken
在OS或編譯器、甚或是第三方產(chǎn)品或庫(kù)中很少發(fā)現(xiàn)bug。bug很可能在應(yīng)用中。
27.不要假定,要證明
Don't Assume It - Prove It
在實(shí)際環(huán)境中--使用真正的數(shù)據(jù)和辯解條件--證明你的假定。
28.學(xué)習(xí)一種文本操縱語(yǔ)言
Learn a Text Manipulation Language
你用每天的很大一部分時(shí)間處理文本,為什么不讓計(jì)算機(jī)替你完成部分工作呢?
29.編寫能編寫代碼的代碼
Write Code That Writes Code
代碼生成器能提高你的生產(chǎn)率,并有助于避免重復(fù)。
30.你不可能寫出完美的軟件
You Can't Write Perfect Software
軟件不可能完美。保護(hù)你的代碼和用戶,使它(他)們免于能夠預(yù)見(jiàn)的錯(cuò)誤。
31.通過(guò)合約進(jìn)行設(shè)計(jì)
Design with Contracts
使用合約建立文檔,并檢驗(yàn)代碼所做的事情正好是它聲明要做的。
32.早崩潰
Crash Early
死程序造成的危害通常比有問(wèn)題的程序要小得多。
33.用斷言避免不可能發(fā)生的事情
Use Assertions to Prevent the Impossible
斷言驗(yàn)證你的各種假定。在一個(gè)不確定的世界里,用斷言保護(hù)你的代碼。
34.將異常用于異常的問(wèn)題
Use Exceptinos for Exceptional Problems
異常可能會(huì)遭受經(jīng)典的意大利面條式代碼的所有可讀性和可維護(hù)性問(wèn)題的折磨。將異常保留給
異常的事物。
35.要有始有終
Finish What You Start
只要可能,分配某資源的例程或?qū)ο笠矐?yīng)該負(fù)責(zé)解除其分配。
36.使模塊之間的耦合減至最少
Minimize Coupling Between Modules
通過(guò)編寫“羞怯的”代碼并應(yīng)用得墨忒耳法則來(lái)避免耦合。
37.要配置,不要集成
Configure, Don't Integrate
要將應(yīng)用的各種技術(shù)選擇實(shí)現(xiàn)為配置選項(xiàng),而不是通過(guò)集成或工程方法實(shí)現(xiàn)。
38.將抽象放進(jìn)代碼,細(xì)節(jié)放進(jìn)元數(shù)據(jù)
Put Abstractions in Code, Details in Metadata
為一般情況編程,將細(xì)節(jié)放在被編譯的代碼庫(kù)之外。
39.分析工作流,以改善并發(fā)性
Analyze Workflow to Imporve Concurrency
利用你的用戶的工作流中的并發(fā)性。
40.用服務(wù)進(jìn)行設(shè)計(jì)
Design Using Services
根據(jù)服務(wù)--獨(dú)立的、在良好定義、一致的接口之后的兵法對(duì)象--進(jìn)行設(shè)計(jì)。
41.總是為并發(fā)進(jìn)行設(shè)計(jì)
Always Design for Concurrency
容許并發(fā),你將會(huì)設(shè)計(jì)出更整潔、具有更少假定的接口。
42.使視圖與模型分離
Separate Views from Models
要根據(jù)模型和視圖設(shè)計(jì)你的應(yīng)用,從而以低廉的代碼獲取靈活性。
43.用黑板協(xié)調(diào)工作流
Use Blackboards to Coordinate Workflow
用黑板協(xié)調(diào)完全不同的事實(shí)和因素,同時(shí)又使各參與方保持獨(dú)立和隔離。
44.不要靠巧合編程
Don't Program by Coincidence
只依靠可靠的事物。注意偶發(fā)的復(fù)雜性,不要把幸運(yùn)的巧合與有目的的計(jì)劃混為一談。
45.估算你的算法的階
Estimate the Order of Your Algorithms
在你編寫代碼之前,先大致估算事情需要多長(zhǎng)時(shí)間。
46.測(cè)試你的估算
Test Your Estimates
對(duì)算法的數(shù)學(xué)分析并不會(huì)告訴你每一件事情。在你的代碼的目標(biāo)環(huán)境中測(cè)定它的速度。
47.早重構(gòu),常重構(gòu)
Refactor Early, Refactor Often
就和你會(huì)在華園里除草、并重新布置一樣,在需要時(shí)對(duì)代碼進(jìn)行重寫、重做和重新架構(gòu)。要
鏟除問(wèn)題的根源。
48.為測(cè)試而設(shè)計(jì)
Design to Test
在你還沒(méi)有編寫代碼時(shí)就開(kāi)始思考測(cè)試問(wèn)題。
49.測(cè)試你的軟件,否則你的用戶就得測(cè)試
Test Your Software, or Your Users Will
無(wú)情地測(cè)試。不要讓你的用戶為你查找bug。
50.不要使用你不理解的向?qū)Тa
Don't Use Wizard Code You Don't Understand
想到可以生成大量代碼。在你把它們合并進(jìn)你的項(xiàng)目之前,確保你理解全部這些代碼。
51不要搜集需求--挖掘它們
Don't Gather Requirements - Dig for Them
需求很少存在于表面上。它們深深地埋藏在層層假定、誤解和政治手段的下面。
52.與用戶一同工作,以像用戶一樣思考
Work with a User to Think Like a User
要了解系統(tǒng)實(shí)際上將如何被使用,這是最好的方法。
53.抽象比細(xì)節(jié)活得更長(zhǎng)久
Abstractions Live Longer than Details
“投資”于抽象,而不是實(shí)現(xiàn)。
54.使用項(xiàng)目詞匯表
Use a Project Glossary
創(chuàng)建并維護(hù)項(xiàng)目中使用的專用術(shù)語(yǔ)和詞匯的單一信息源。
55.不要在盒子外面思考--要找到盒子
Don't Think Outside the Box - Find the Box
在遇到不可能解決的問(wèn)題時(shí),要確定真正的約束。問(wèn)問(wèn)你自己:“它必須以這種方式完成嗎?
它真的必須完成嗎?”
56.等你準(zhǔn)備好再開(kāi)始
Start When You're Ready
你的一生都在積累經(jīng)驗(yàn)。不要忽視反復(fù)出現(xiàn)的疑惑。
57.對(duì)有些事情“做”勝于“描述”
Some Things Are Better Done than Described
不要掉進(jìn)規(guī)范的螺旋
58.不要做形式方法的奴隸
Don't Be a Slave to Formal Methods
如果你沒(méi)有把某項(xiàng)技術(shù)放進(jìn)你的開(kāi)發(fā)時(shí)間和能力的語(yǔ)境中,不要盲目地采用它。
59.昂貴的工具不一定能制作出更好的設(shè)計(jì)
Costly Tools Don't Produce Better Disigns
小心供應(yīng)商的炒作,行業(yè)教條,以及價(jià)格標(biāo)簽的誘惑。要根據(jù)工具的價(jià)值判斷它們。
60.圍繞功能組織團(tuán)隊(duì)
Organize Teams Around Fucntionality
不要把設(shè)計(jì)師與編碼員分開(kāi),也不要把測(cè)試員與數(shù)據(jù)建模員分開(kāi)。按照你構(gòu)建代碼的方式構(gòu)建
團(tuán)隊(duì)。
61.不要使用手工流程
Don't Use Manual Procedures
shell腳本或批文件會(huì)一次次地以同一順序執(zhí)行同樣的指令。
62.早測(cè)試,常測(cè)試,自動(dòng)測(cè)試。
Test Early. Test Often. Test Automatically
與呆在書架上的測(cè)試計(jì)劃相比,每次構(gòu)建試運(yùn)行的測(cè)試要有效得多。
63.要到通過(guò)全部測(cè)試,編碼才算完成。
Coding Ain't Done 'Til All the Tests Run
就是這樣。
64.通過(guò)“蓄意破壞”測(cè)試你的測(cè)試。
Use Saboteurs to Test Your Testing
在單獨(dú)的軟件副本上故意引入bug,以檢驗(yàn)測(cè)試能夠抓住它們。
65.測(cè)試狀態(tài)覆蓋,而不是代碼覆蓋
Test State Coverage, Not Code Coverage
確定并測(cè)試重要的程序狀態(tài)。只是測(cè)試代碼行是不夠的。
66.一個(gè)bug只抓一次
Find Bugs Once
一旦測(cè)試員找到一個(gè)bug,這應(yīng)該是測(cè)試員最后一次找到它。此后自動(dòng)測(cè)試應(yīng)該對(duì)其進(jìn)行
檢查。
67.英語(yǔ)就是一種編程語(yǔ)言
English is Just a Programming Language
像你編寫代碼一樣編寫文檔:遵守DRY原則、使用元數(shù)據(jù)、MVC、自動(dòng)生成、等等。
68.把文檔建在里面,不要栓在外面
Build Documentation In, Don't Bolt It On
與代碼分離的文檔不太可能被修正和更新。
69.溫和地超出用戶的期望
Gently Exceed Your Users' Expectations
要理解你的用戶的期望,然后給他們的東西要多那么一點(diǎn)。
70.在你的作品上簽名
Sign Your Work
過(guò)去時(shí)代的手藝人為能在他們作品上簽名而自豪。你也應(yīng)該如此。
檢查清單
---------------------------
71.要學(xué)習(xí)的語(yǔ)言
厭倦了C、C++和JAVA?試試CLOS、Dylan、Eiffel、Objectve C、Prolog、Smailltalk或TOM。它們每一種都有不同的能力和不同的“風(fēng)味”。用其中的一種或多種語(yǔ)言在家里開(kāi)發(fā)一個(gè)小項(xiàng)目。
72.WISDOM離合詩(shī)
What do you want them to learn? 你想讓他們學(xué)到什么?
What is their interest in what you've got to say? 他們對(duì)你講的什么感興趣?
How sophisticated are they? 他們有多富有經(jīng)驗(yàn)?
How much detail do they want? 他們想要多少細(xì)節(jié)?
Whom do you want to own the information? 你想要讓誰(shuí)擁有這些信息?
How can you motivate them to listen to you? 你如何促使他們聽(tīng)你說(shuō)話?
73.怎樣維持正交性
·設(shè)計(jì)獨(dú)立、良好定義的組件。
·使你的代碼保持解耦。
·避免使用全局?jǐn)?shù)據(jù)。
·重構(gòu)相似的函數(shù)。
74.應(yīng)制作原型的事物
·架構(gòu)
·已有系統(tǒng)中的新功能
·外部數(shù)據(jù)的結(jié)構(gòu)或內(nèi)容
·第三方工具或組件
·性能問(wèn)題
·用戶界面設(shè)計(jì)
75.架構(gòu)問(wèn)題
·責(zé)任是否得到了良好定義?
·寫作是否得到了良好定義?
·耦合是否得以最小化?
·你能否確定潛在的重復(fù)?
·接口定義和各項(xiàng)約束是否可接受?
·模塊能否在需要時(shí)訪問(wèn)所需數(shù)據(jù)?
76.調(diào)試檢查清單
·正在報(bào)告的問(wèn)題是底層bug的直接結(jié)果,還是只是癥狀?
·bug真的在編譯器里?在OS里?或者是在你的代碼里?
·如果你向同事詳細(xì)解釋這個(gè)問(wèn)題,你會(huì)說(shuō)什么?
·如果可疑代碼通過(guò)了單元測(cè)試,測(cè)試是否足夠完整?如果你用該數(shù)據(jù)運(yùn)行單元測(cè)試,會(huì)發(fā)生什么?
·造成這個(gè)bug的條件是否存在于系統(tǒng)中的其它任何地方?
77.函數(shù)的得墨忒耳法則
某個(gè)對(duì)象的方法應(yīng)該只調(diào)用屬于以下情況的方法:
·它自身
·傳入的任何參數(shù)
·它創(chuàng)建的對(duì)象
·組件對(duì)象
78.怎樣深思熟慮地編程
·總是意識(shí)到你在做什么。
·不要盲目地編程。
·按照計(jì)劃行事。
·依靠可靠的事物。
·為你的假定建立文檔。
·不要只是測(cè)試你的代碼,還要測(cè)試你的假定。
·維尼的工作劃分優(yōu)先級(jí)。
·不要做歷史的奴隸。
79.何時(shí)進(jìn)行重構(gòu)
·你發(fā)現(xiàn)了對(duì)DRY原則的違反。
·你發(fā)現(xiàn)事物可以更為正交。
·你的知識(shí)擴(kuò)展了。
·需求演變了。
·你需要改善性能。
80.劈開(kāi)戈?duì)柕纤菇Y(jié)
在解決不可能解決的問(wèn)題時(shí),問(wèn)問(wèn)你自己:
·有更容易的方法嗎?
·我是在解決正確的問(wèn)題嗎?
·這件事情為什么是一個(gè)問(wèn)題?
·是什么使它如此難以解決?
·它必須以這種方式完成嗎?
·它真的必須完成嗎?
81.測(cè)試的各個(gè)方面
·單元測(cè)試
·集成測(cè)試
·炎癥和校驗(yàn)
·資源耗盡、錯(cuò)誤及恢復(fù)
·性能測(cè)試
·可用性測(cè)試
·對(duì)測(cè)試自身進(jìn)行測(cè)試
以上內(nèi)容摘自《程序員修煉之道》