【程序員修煉之道】書摘

這本書的確是軟件工程領(lǐng)域一本再經(jīng)典不過的書籍,在尚未開始學(xué)習(xí)編程的時候便聽說過這本書穗泵,大約是從蕭瓜的答案里柴灯。
在剛參加工作后沒多久比現(xiàn)在還要更菜一些的時候初讀了這本書滑负,因為全是形而上學(xué)的東西,再加上各種牛人的推薦與評價至会,當(dāng)時還是感覺這書有丶東西的员凝,而彼時見過的東西不多,各種經(jīng)驗匱乏奋献,使人感同身受健霹、醍醐灌頂?shù)膱鼍安⒉欢啵踔劣幸恍c比如“函數(shù)的得墨忒爾法則”也是理解不了的瓶蚂。記得第一遍讀過之后感覺不過癮糖埋,還想立即再來一遍,并進行“自省”項目窃这,即根據(jù)書中提到的各個點來映射到實際工作開發(fā)中的各個點瞳别,來進行對比和思考。結(jié)果還是不了了之了。

最近由于spirit overview計劃祟敛,又把這本200頁的讀拿出來重讀疤坝,并進行了一些書摘。
這一次馆铁,很明顯感覺可以結(jié)合實際的好建議很多跑揉,最后會列出“行動項”,是受閱讀啟發(fā)埠巨,可以在工作历谍、日常編碼中采取實踐的點,后續(xù)會納入我的時間管理體系辣垒,已經(jīng)有些期待了望侈。


評價與前言

這是我唯一不會出借的一本書。 -- -- Kevin Ruland
這本書里雖只包含了很多看似粗淺樸素的道理勋桶,實則是若干經(jīng)驗的心血總結(jié)脱衙。
原以為那些嚼爛了的東西,不會再有新味道,但是我錯了。-- -- 云風(fēng)

“牛人”其實是備有很多現(xiàn)成代碼的竞阐,完成這個功能只是把之前積累的封閉良好的可以了。
編程大約有三個境界奥帘,新手、高手和高不成低不就的中手仪召。
編程是一種技藝寨蹋,一種需要用心學(xué)習(xí)的技藝。
設(shè)想你在參加一個會議扔茅∫丫桑或許你在想,這個會議沒完沒了召娜,你還不如去寫程序运褪。而Dave和Andy會想,他們?yōu)槭裁丛陂_會玖瘸,他們想知道是否可以通過另外的方式取代會議秸讹,并決定是否可使某樣事情自動化,以使開會的工作推后雅倒。
這就是Dave和Andy思考的方式璃诀。開會并非是某種使他們遠離編程的事情。開會就是編程蔑匣,并且是能夠加以改善的編程劣欢。


正文

注重實效的程序員的特征是什么棕诵?我們覺得是他們處理問題、尋求解決方案時的態(tài)度凿将、風(fēng)格校套、哲學(xué)。他們能夠越出直接的問題去思考牧抵,總是設(shè)法把問題放在更大的語境中笛匙,總是設(shè)法注意更大的圖景。

關(guān)于負責(zé)
在所有弱點中灭忠,最大的弱點就是害怕暴露弱點膳算。
提供各種選擇座硕,不要找蹩腳的借口弛作。
有時,你其實知道他們會說什么华匾,所以還是不要給他們添麻煩吧映琳。
不要說事情做不到;要說明能夠做什么來挽回局面蜘拉。
不要害怕提出要求萨西,也不要害怕承認(rèn)你需要幫助。
在你大聲說出它們之前旭旭,先設(shè)法把蹩腳的借口清除出去谎脯。如果你必須說,就先對你的貓說持寄。

關(guān)于軟件的熵
當(dāng)軟件中的無序增長時源梭,程序員們稱之為”軟件腐爛”。有許多因素會導(dǎo)致稍味,其中最重要的一個開發(fā)項目時的心理(或文化)废麻。你開發(fā)項目時的心理也可能是非常微妙的事情。
不要容忍破窗戶模庐。
如果沒有足夠的時間進行適當(dāng)?shù)男蘩碇蚶ⅲ陀媚景灏阉斊饋怼掂碱;蛟S你可以把出問題的代碼放入注釋怜姿,或是顯示“未實現(xiàn)”消息,或是用虛擬的數(shù)據(jù)加以替代疼燥。

關(guān)于“石頭湯與煮青蛙”的寓言故事:
每個人都會護衛(wèi)他們自己的資源社牲,有時候,這就叫做“啟動雜役”悴了。
這正是拿出石頭的時候搏恤。設(shè)計出你可以合理要求的東西违寿,好好開發(fā)它。一旦完成熟空,就拿給大家看藤巢,讓他們大吃一驚。
人們發(fā)現(xiàn)息罗,參與正在發(fā)生的成功要更容易掂咒。讓他們瞥見未來,你就能讓他們聚集在你周圍迈喉。
做變化的催化劑绍刮。
要記住大圖景,不要因為小事情的累積破壞了士氣和團隊(而這正是常常發(fā)生的)挨摸。
溫水煮青蛙與破窗原理不同孩革,后者是說人們失去與熵戰(zhàn)斗的意愿,是因為他們覺察到?jīng)]有人會在意得运。而青蛙只是沒有注意到變化膝蜈。

關(guān)于足夠好的軟件
現(xiàn)實世界不會讓我們制作出十分完美的產(chǎn)品,特別是不會有無錯的軟件熔掺。時間饱搏、技術(shù)和急躁都在合謀反對我們。
應(yīng)該給用戶以機會置逻,讓他們參與決定你所制作的東西何時已足夠好推沸。
你所制作的系統(tǒng)的范圍和質(zhì)量應(yīng)該作為系統(tǒng)需求的一部分規(guī)定下來。
如果你給用戶某樣?xùn)|西券坞,讓他們及早使用鬓催,他們的反饋常常會把你引向更好的最終解決方案。

編程就像繪畫报慕。如果你不懂得應(yīng)何時止步深浮,所有的辛苦勞作就會遭到破壞。如果你一層又一層眠冈、細節(jié)復(fù)細節(jié)地疊加飞苇,繪畫就會迷失在繪制之中。所以你要知道什么時候止步蜗顽。
不要因為過度修飾和過于求精而毀損完好的程序布卡。繼續(xù)前進,讓你的代碼憑著自己的質(zhì)量站立一會兒雇盖。它也許不完美忿等,但不用擔(dān)心:它不可能完美。

關(guān)于知識資產(chǎn)
你的知識和經(jīng)驗是你最重要的職業(yè)財富崔挖。
管理知識資產(chǎn)與管理金融資產(chǎn)非常相似:

  1. 嚴(yán)肅的投資者定期投資-- --作為習(xí)慣贸街;
  2. 多元化是長期成功的關(guān)鍵庵寞;
  3. 聰明的投資者在保守的投資和高風(fēng)險、高回報的投資之間平衡他們的資產(chǎn)薛匪;
  4. 投資者設(shè)法低買高賣捐川,以獲取最大回報;
  5. 應(yīng)周期性地重新評估和平衡資產(chǎn)逸尖;

即使投資量很小古沥,習(xí)慣自身也和總量一樣重要。
低買高賣是說娇跟,在新興的技術(shù)流行之前學(xué)習(xí)它可能就和找到被低估的股票一樣困難岩齿,但所得到的就和那樣的股票帶來的收益一樣。
每年至少學(xué)習(xí)一種新語言苞俘。不同語言以不同方式解決相同的問題盹沈。通過學(xué)習(xí)若干不同的方法,可以幫助你拓寬你的思維苗胀,并避免墨守成規(guī)襟诸。
學(xué)習(xí)的過程將擴展你的思維瓦堵,使你向著新的可能性和新的做事方式拓展基协。思想的“異花授粉”十分重要;設(shè)法把你學(xué)到的東西應(yīng)用到你當(dāng)前的項目中菇用。

與他人交談可以幫助你建立人際網(wǎng)絡(luò)澜驮。
出去和與你的當(dāng)前項目無關(guān)的人、或是其他公司的人談?wù)劶夹g(shù)惋鸥。
所有閱讀和研究都需要時間杂穷,而時間已經(jīng)很短缺。所以你需要預(yù)先計劃卦绣,讓自己在空閑的片刻時間里總有東西可讀耐量。
P13頁有與人打交道的禮節(jié)與教養(yǎng),可學(xué)滤港。
同時廊蜒,很重要的一點是,要批判地思考你讀到的和聽到的溅漾。

關(guān)于交流
沒有有效的交流山叮,一個好想法就只是一個無人關(guān)心的孤兒。
只有當(dāng)你是在傳達信息時添履,你才是在交流屁倔。你需要了解你的聽眾的需要、興趣暮胧、能力锐借。
WISDOM離合詩----了解聽眾:
What do you want them to learn?
What is their interest in what you've got to say?
How sophisticated are they?
How much detail do they want?
Whom do you want to own the information?
How can you motivate them to listen to you?

有時候问麸,只要簡單地問一句“現(xiàn)在我們可以談?wù)?.....嗎?"就可以了。
我們常常發(fā)現(xiàn)钞翔,與制作文檔的過程相比口叙,我們制作出的文檔最后并沒有那么重要。
鼓勵大家通過提問來交談嗅战,或是讓他們總結(jié)你告訴他們的東西妄田。把會議變成對話,你將能更有效地闡明你的觀點驮捍。誰知道呢疟呐,你也許還能學(xué)到點什么。
除非你生活在真空中东且,你才不需要交流启具。交流越有效,你就越有影響力珊泳。

關(guān)于DRY
不要在系統(tǒng)各處對知識進行重復(fù)鲁冯,不要把任何一項知識分散在多個系統(tǒng)組件中。(國家與各種code的表示)
不能劃入某個明顯的責(zé)任區(qū)域的常用功能和數(shù)據(jù)可能會被實現(xiàn)多次色查。
我們覺得薯演,可靠地開發(fā)軟件、并讓我們的開發(fā)更易于理解和維護的唯一途徑秧了,是遵循我們稱之為DRY的原則:
**系統(tǒng)中的每一項知識都必須具有單一跨扮、無歧義、權(quán)威的表示验毡『獯矗”
這不是你是否能記住的問題,而是你何時忘記的問題晶通。
我們覺得璃氢,這是注重實效的程序員的工具箱里最重要的工具之一。

在以后的開發(fā)過程中狮辽,你可以因為性能原因而選擇違反DRY原則一也。這經(jīng)常會發(fā)生在你需要緩存數(shù)據(jù),以避免重復(fù)昂貴的操作時隘竭。其訣竅是使影響局部化塘秦。對DRY原則的違反沒有暴露給外界。

關(guān)于正交性
突然間动看,你在用一個讓人難以置信的復(fù)雜系統(tǒng)玩耍尊剔,其中每一項改變都會影響所有其他的輸入。
當(dāng)任何系統(tǒng)的各組件互相高度依賴時菱皆,就不再有局部修正這樣的事情须误。要消除無關(guān)事物之間的影響挨稿。

與編寫單個的大塊代碼相比,編寫多個相對較小的京痢、自足的組件更為容易奶甘。
把所需要的任何語境顯示地傳入模塊,代碼就會更易于理解和維護祭椰。

你在把電話號碼當(dāng)作顧客的標(biāo)識符嗎臭家?如果電話公司重新分配了區(qū)號,會怎么樣方淤?不要依賴你無法控制的事物屬性钉赁。

也許會讓人驚訝,正交性也適用于文檔携茂。其坐標(biāo)軸是內(nèi)容和表現(xiàn)形式你踩。

關(guān)于可撤消性
如果某個想法是你唯一的想法,再沒有什么比這再危險的事情了讳苦。
問題在于带膜,關(guān)鍵決策不容易撤銷。(比如數(shù)據(jù)庫表結(jié)構(gòu)的設(shè)計鸳谜,深受其害)
與我們開發(fā)軟件的速度相比膝藕,需求、用戶以及硬件變得更快卿堂。
錯誤由于假定決策是澆在石頭上的-- --同時還在于沒有為可能出現(xiàn)的意外事情做準(zhǔn)備束莫。
要把決策視為是寫在沙灘上的懒棉,而不要把它們刻在石頭上草描。大浪隨時可能到來,把它們抹去策严。

如果在代碼中有著糟糕的封裝穗慕、高度耦合以及硬編碼的邏輯或參數(shù),事情也許就是不可能的妻导。

關(guān)于曳光彈與原型
并不讓人驚奇的是逛绵,曳光彈比費力計算更可取。反饋是及時的倔韭,而且因為它們工作在與真正的彈藥相同的環(huán)境中术浪,外部影響得以降至最低。
曳光代碼并非用過就扔的代碼:你編寫它寿酌,是為了保留它胰苏。
一旦你在系統(tǒng)的各組件間實現(xiàn)了端到端的連接,你就可能檢查你離目標(biāo)還有多遠醇疼,一旦你完全瞄準(zhǔn)硕并,增加功能將是一件容易的事情法焰。

原型制作生成用過就扔的代碼。你可以把原型制作視為在第一發(fā)曳光彈發(fā)射之前進行的偵察和情報搜集工作倔毙。
你可以選擇通過原型來研究任何帶 有風(fēng)險的事物埃仪。以前沒有試過的事物,或是對于最終系統(tǒng)極關(guān)鍵的事物陕赃。任何未被證明的卵蛉、實驗性的、或是疑問的事物么库。任何讓你覺得不舒服的事物毙玻。
原型制作是一種學(xué)習(xí)經(jīng)驗。其價值并不在于所產(chǎn)生的代碼廊散,而在于所學(xué)到的經(jīng)驗教訓(xùn)桑滩。那才是原型所作的要點所在。
為了學(xué)習(xí)而制作原型允睹。
P42有關(guān)于如何制作架構(gòu)原型的具體事項运准,在設(shè)計架構(gòu)時可以參考。

其他注重實效的途徑
每種語言都含有一系列特性-- --所有這些特性都在揭示或遮蔽特定的解決方案缭受。
使用領(lǐng)域語言可以靠近問題領(lǐng)域編程胁澳。

通過學(xué)習(xí)估算,并將此技能發(fā)展到你對事物的數(shù)量級有直覺的程度米者,你就能展現(xiàn)出一種魔法般的能力韭畸,確定它們的可行性。
關(guān)于估算蔓搞,之前還寫過另一篇文章來描述胰丁。
如果結(jié)果證明估算錯了,不要只是聳聳肩走開喂分。找出事情為何與你的猜想不同的原因锦庸。也許你選擇了與問題的實際情況不符的一些參數(shù)。也許你的模型是錯的蒲祈。不管原因是什么甘萧,花一點時間揭開所發(fā)生的事情。如果你這樣做了梆掸,你的下一次估算就會更好扬卷。

關(guān)于基本工具
工具放大你的才干。你的工具越好酸钦,你越是能更好地掌握它們的用法怪得,你的生產(chǎn)力就越高。
讓需要驅(qū)動你的采購。
唯一的途徑是保持基本工具集的“鋒利”與就緒汇恤。
花時間學(xué)習(xí)使用這些工具庞钢,有一天你將會驚奇地發(fā)現(xiàn),你的手指在鍵盤上移動因谎,操縱文本基括,卻不用進行有意識的思考。工具將變成你雙手的延伸财岔。

持久地存儲知識的最佳格式是純文本风皿。純文本并非意味著文本是無結(jié)構(gòu)的,比如markdown匠璧。
大多數(shù)二進制格式的問題在于桐款,理解數(shù)據(jù)所必需的語境與數(shù)據(jù)本身是分離的。
事實上夷恍,在異種環(huán)境中魔眨,純文本的優(yōu)點比其所有的缺點都重要。你需要確保所有各方能夠使用公共標(biāo)準(zhǔn)進行通信酿雪。純文本就是那個標(biāo)準(zhǔn)遏暴。

GUI的好處是WYSIWYG-- --所見即所得。缺點是WYSIAYG-- --所見即全部所得指黎。

選一種編輯器朋凉,徹底了解它,并將其用于所有的編輯任務(wù)醋安。如果你用一種編輯器(或一組鍵綁定)進行所有的文本編輯活動杂彭,你就不必停下來思考怎樣完成文本操縱:必需的鍵擊將成為本能反應(yīng)。編輯器將成為你雙手的延伸吓揪;鍵會在滑過文本和思想時歌唱起來亲怠。這就是我們的目標(biāo)。
對于常見的編輯操作磺芭,與鼠標(biāo)或菜單驅(qū)動的命令相比赁炎,只使用鍵擊效率更高,因為你的手無須離開鍵盤钾腺。
你應(yīng)該能對編輯器編程,讓它執(zhí)行復(fù)雜的讥裤、多步驟的任務(wù)放棒。可以通過宏或內(nèi)建的腳本編程語言(例如己英,Emacs使用Lisp的一個變種)進行這樣的編程间螟。

對于許多開發(fā)者,調(diào)度本身是一個敏感、感性的話題厢破。你可能會遇到抵賴荣瑟、推諉、蹩腳的借口摩泪、甚或是無動于衷笆焰,而不是把它當(dāng)做要解決的難題發(fā)起進攻。
bug是你的過錯還是別人的過錯见坑,并不是真的很有關(guān)系嚷掠。它仍然是你的問題。
在你開始調(diào)試之前荞驴,選擇恰當(dāng)?shù)乃季S方式十分重要不皆。你須要關(guān)閉每天用于保護自我的許多防衛(wèi)措施,忘掉你可能面臨的任何項目壓力熊楼,并讓自己放松下來霹娄。最重要的是,記住調(diào)試的第一準(zhǔn)則:不要恐慌鲫骗。项棠、
如果你目睹bug或見到bug報告的第一反應(yīng)是“那不可能”,你就完全錯了挎峦。一個腦細胞都不要浪費在以“但那不可能發(fā)生”起頭的思路上香追,因為很明顯,那不僅可能坦胶,而且生了透典。
在調(diào)試時小心“近視”。要抵制只修正你看到的癥狀的急迫愿望:更有可能的情況是顿苇,實際的故障離你正在觀察的地方可能還有幾步遠峭咒,并且可能涉及許多其他的相關(guān)事物。要總是設(shè)法找出問題的根源纪岁,而不只是問題的特定表現(xiàn)凑队。

再現(xiàn)(reproduction)bug
不,我們的bug不會真的繁殖(盡管其中有一些可能已經(jīng)到了合法的生育年齡)幔翰。

程序員可以構(gòu)建代碼生成器漩氨。一旦構(gòu)建好,在整個項目生命期內(nèi)都可以使用它遗增,實際上沒有任何代價叫惊。
被動代碼生成器有一個有趣的特性:它們不必完全正確。你需要在你投入生成器的努力和你花在修正其輸出上的精力之間進行權(quán)衡做修。
無論何時你發(fā)現(xiàn)自己在設(shè)法讓兩種完全不同的環(huán)境一起工作霍狰,你都應(yīng)該考慮使用主動代碼生成器抡草。
為了進行通信,每個代碼庫將需要某些公共信息-- --例如蔗坯,數(shù)據(jù)結(jié)構(gòu)康震、消息格式、以及字段名宾濒。要使用代碼生成器腿短,而不是重復(fù)這些信息。
用更簡單鼎兽、語言中立的表示形式來表示它答姥,并為兩種語言成生代碼,常常更簡單谚咬。
你可以用代碼生成器生成幾乎任何輸出:HTML鹦付、XML、純文本-- --可能成為你的項目中別處輸入的任何文本择卦。

關(guān)于偏執(zhí)
循環(huán)常有香蕉問題(我知道怎樣拼寫“banana”敲长,但不知道何時停下來-- --“bananananananananana...”)、籬笆樁錯誤(不知道該數(shù)樁還是數(shù)空)秉继、以及無處不在的off by one錯誤祈噪。

如果它不可能發(fā)生,用斷言確保它不會發(fā)生尚辑。
問問你自己:“如果我移走所有的異常處理器辑鲤,這些代碼是否仍然能運行?”
如果答案是“否”杠茬,那么異常也許就正在被用在非異常的情形中月褥。
異常表示即時的、非局部的控制轉(zhuǎn)移-- --這是一種級聯(lián)的goto瓢喉。

分配某項資源的例程或?qū)ο髴?yīng)該負責(zé)解除該資源的分配宁赤。
以與資源分配的次序相反的次序解除資源的分配。
在代碼的不同地方分配同一組資源時栓票,總是以相同的次序分配它們决左。

關(guān)于解耦
“羞怯”的工作方式有兩種:不要向別人暴露你自己,不要與太多人打交道走贪。
這種編碼風(fēng)格極大地增加了我們的類所依賴的類的數(shù)目佛猛。這為何是一件壞事?因為它增加了系統(tǒng)別的地方的一個無關(guān)改動影響你的代碼的風(fēng)險厉斟。

函數(shù)的得墨忒爾法則規(guī)定挚躯,某個對象的任何方法都應(yīng)該只調(diào)用屬于以下情形的方法:

  1. 它自身;
  2. 傳入該方法的任何參數(shù)擦秽;
  3. 它創(chuàng)建的任何對象;
  4. 任何直接持有的組件對象。
    在實踐中感挥,這意味著你將會編寫大量包裝方法缩搅,它們只是把請求轉(zhuǎn)發(fā)給被委托者。
    否則触幼,你可能就會發(fā)現(xiàn)自己正走在一條通往脆弱硼瓣、不靈活的未來的道路上≈们或者堂鲤,根本沒有未來。

關(guān)于元程序設(shè)計
再多的天才也無法勝過對細節(jié)的專注媒峡。
細節(jié)會弄亂我們整潔的代碼-- --特別是如果它們經(jīng)常變化瘟栖。
將抽象放進代碼,細節(jié)放進元數(shù)據(jù)谅阿。
P118有關(guān)于這種做法的5種好處半哟。
針對你目前的項目,考慮應(yīng)用有多少內(nèi)容可以從程序自身移往元數(shù)據(jù)签餐。所得到的“引擎”看起來會是什么樣寓涨?你能否在不同的應(yīng)用的語境中復(fù)用該引擎?

位于MVC慣用手法之后的關(guān)鍵概念:既讓模型與表示模型的GUI分離氯檐,也讓模型與管理視圖的控件分離戒良。
MVC其實是一種通用的編程技術(shù)。視圖是對模型的一種解釋-- --它無需是圖形化的冠摄∨雌椋控制器更是一種協(xié)調(diào)機制,不一定要與任何種類的輸入設(shè)備有關(guān)耗拓。

黑板方式的編程消除了對太多接口的需要拇颅,從而能帶來更優(yōu)雅更一致的系統(tǒng)。(有點微服務(wù)與流程引擎結(jié)合的意思)
用黑板協(xié)調(diào)工作流乔询,協(xié)調(diào)完全不同的事實和因素樟插,同時又使各參與方保持獨立、甚至隔離竿刁。

關(guān)于編碼
代碼也許能工作黄锤,但卻沒有特別的理由說明它們?yōu)楹文芄ぷ鳌?br> 作為開發(fā)者,我們也工作在雷區(qū)里食拜。每天都有成百的陷阱在等著抓住我們鸵熟。我們應(yīng)該避免造巧合編程-- --依靠運氣和偶然的成功-- --而要深思熟慮地編程。
對于你編寫給別人調(diào)用的代碼负甸,良好的模塊化以及把實現(xiàn)隱藏在撰寫了良好文檔的小接口之后流强,這樣一些基本原則都能對你有幫助痹届。
不要做歷史的奴隸。不要讓已有的代碼支配將來的代碼打月。

重寫队腐、重做和重新架構(gòu)代碼合起來,稱為重構(gòu)奏篙。
但如果你無節(jié)制地撕毀大量代碼柴淘,你可能會發(fā)現(xiàn)自己處在比一開始更糟的位置上。
所以秘通,下次你看到不怎么合理的代碼時为严,既要修正它,也要修正依賴于它的每樣?xùn)|西肺稀。要管理痛苦:如果它現(xiàn)在有損害第股,但以后的損害會更大,你也許最好一勞永逸地修正它盹靴。記住軟件的熵中的教訓(xùn):不要容忍破窗戶炸茧。

從一開始就把可測試性構(gòu)建進軟件中,并且在把各個部分連接在一起之前對每個部分進行徹底的測試稿静。
測試是技術(shù)梭冠,但更是文化。

關(guān)于項目
完美改备,不是在沒有什么需要增加控漠、而是在沒有什么需要去掉時達到的。
找出用戶為何要做特定事情的原因悬钳、而水只是他們目前做這件事情的方式盐捷,這很重要。
需求不是構(gòu)架默勾。需求不是設(shè)計碉渡,也不是用戶界面。需求是需要母剥。

抽象比細節(jié)活得更長久滞诺。
要創(chuàng)建并維護項目詞匯表-- --這是定義項目中使用的專用術(shù)語和詞匯的地方。項目的所有參與者环疼,從最終用戶到支持人員习霹,都應(yīng)該使用這個詞匯表,以確保一致性炫隶。
墨水剛沾上紙面淋叶,就過時了。

有些約束是絕對的伪阶;有些則只是先入之見煞檩。絕對的約束必須受到尊重处嫌,不管它們看上去有多討厭或多愚蠢。另一方面形娇,有些外表上的約束也許根本不是真正的約束锰霜。許多軟件問題都可能具有與之相同的欺騙性筹误。

編寫程序規(guī)范就是把需求歸約到程序員能夠接管的程度的過程桐早。
但你可以確信,一旦他們看到運行的系統(tǒng)厨剪,你就會被各種變更要求淹沒哄酝。
這里有一個挑戰(zhàn):寫一份簡短的描述,告訴別人怎樣系鞋帶祷膳√招疲快,試一試直晨。
把需求搜集搀军、設(shè)計、以及實現(xiàn)視為同一個過程勇皇。
你越是把規(guī)范當(dāng)作安樂毯罩句,不讓開發(fā)者進入可怕的編碼世界,進入編碼階段就越困難敛摘。不要掉進這樣的規(guī)范螺旋中:在某個時刻门烂,你需要開始編碼!

還有一些開發(fā)者兄淫,在有許多已沉沒項目的大海里漂流屯远,不斷抓住最新的時尚,就像是遇到海難的人緊緊抓住飄來的木頭一樣捕虽。每當(dāng)有新的木頭漂過時慨丐,他們都會費力地游過去,希望這一塊會更好泄私。但到最后房揭,不管漂浮物有多好,之些開發(fā)者依然漫無目的地漂流著挖滤。

事實上崩溪,大多數(shù)形式方法會讓你誤入歧途,鼓勵你在對象之間建立靜態(tài)關(guān)系斩松,而這些對象本來應(yīng)該動態(tài)地編織在一起伶唯。
如果你遇到一個項目,其哲學(xué)是“類圖就是應(yīng)用惧盹,其余的只是機械的編碼”乳幸,你知道瞪讼,你看到的是一個浸滿水的項目團隊和一個路途遙遠的家。

因為記憶是隨著你年齡的增長而喪失的第二種東西粹断。(第一種是什么符欠?我忘了。)
鞋匠的孩子沒鞋穿瓶埋。軟件開發(fā)人員常常會使用最糟糕的工具來完成工作希柿。
P193關(guān)于測試什么的具體點。

文檔的表示形式應(yīng)該獨立于其內(nèi)容养筒。

本書正文的最后一小段話讀來竟然有些熱血曾撤。
當(dāng)人們在一段代碼上看到你的名字時,應(yīng)該期望它是可靠的晕粪、用心編寫的挤悉、測試過的和有文檔的,一個真正的專業(yè)作品巫湘,由真正的專業(yè)人員編寫装悲。
一個注重實效的程序員。


行動項

  1. 審視自己開發(fā)項目時的心理尚氛,特別是當(dāng)有厭煩情緒的時候诀诊;
  2. 考慮項目中的“某扇窗戶”是何時破的,是他人的決策所致怠褐,還是管理部門的指示畏梆;
  3. 推新項目或新工具時,自己先在往鍋里扔進石頭給人看效果奈懒,來做催化劑奠涌;
  4. 開發(fā)業(yè)務(wù)系統(tǒng),用戶就在身邊磷杏,要多與之交流使用感受與期望溜畅;
  5. 低買高賣方面,關(guān)注最新的技術(shù)极祸,比如Julia慈格,比如可以參與翻譯工作,或提issue遥金;
  6. 每年至少學(xué)習(xí)一種新語言浴捆;
  7. 空閑時間的閱讀計劃;
  8. 開始寫估算日志稿械;
  9. 代碼生成器选泻,由表結(jié)構(gòu)為源數(shù)據(jù),到thrift,到各marshmallow页眯,到給前端的接口文檔梯捕,到restful,到python(model層的代碼及基本的CRUD)窝撵、java(mybatis與dao層的代碼)各版本傀顾。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碌奉,隨后出現(xiàn)的幾起案子短曾,更是在濱河造成了極大的恐慌,老刑警劉巖道批,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件错英,死亡現(xiàn)場離奇詭異,居然都是意外死亡隆豹,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門茅逮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來璃赡,“玉大人,你說我怎么就攤上這事献雅〉锟迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵挺身,是天一觀的道長侯谁。 經(jīng)常有香客問我,道長章钾,這世上最難降的妖魔是什么墙贱? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮贱傀,結(jié)果婚禮上惨撇,老公的妹妹穿的比我還像新娘。我一直安慰自己府寒,他們只是感情好魁衙,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著株搔,像睡著了一般剖淀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纤房,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天纵隔,我揣著相機與錄音,去河邊找鬼帆卓。 笑死巨朦,一個胖子當(dāng)著我的面吹牛米丘,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糊啡,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼拄查,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了棚蓄?” 一聲冷哼從身側(cè)響起堕扶,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梭依,沒想到半個月后稍算,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡役拴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年诗宣,在試婚紗的時候發(fā)現(xiàn)自己被綠了珠插。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖髓堪,靈堂內(nèi)的尸體忽然破棺而出亿扁,到底是詐尸還是另有隱情猪叙,我是刑警寧澤恐锣,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站部念,受9級特大地震影響弃酌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜儡炼,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一妓湘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧射赛,春花似錦多柑、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至秆麸,卻和暖如春初嘹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沮趣。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工屯烦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓驻龟,卻偏偏與公主長得像温眉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子翁狐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,146評論 25 707
  • 我戒掉了手中的煙 對你的思念如此深 路有多遠思念就有多長 忍住了抽煙的癮类溢,忍不住心里的思念 幸福來的太快,也在短短...
    藍色風(fēng)信子i閱讀 184評論 0 0
  • firewalld(基礎(chǔ)) CentOS7 之后露懒,使用 firewalld 代替了原來的 iptables 防火墻...
    王小二061626閱讀 516評論 0 0
  • 有個說評書的叫方清平闯冷。而我小時候的玩伴也叫清平。和他的認(rèn)識是我們同在一個懈词,回家的路上蛇耀。他住在何家老林的半山腰。而我...
    唯善不爭閱讀 293評論 0 2