《程式設計師修煉之道》筆記(一)

2022-06-06 01:24:15 字數 3978 閱讀 1715

這幾天開始看《程式設計師修煉之道》,也許不少人看了書的標題,第一時間會覺得這是雞湯一類的書。但至少以我自己的感受來看,這是很棒的書,現代人文主義不是提倡自我意識嘛,自己感覺好的就是好的。況且人家也是經過了時間和口碑的雙重考驗的,真心值得好好閱讀。

作者在再版的序中寫道:

寫完《程式設計師修煉之道》至今已有十年。在這十年中,軟體產業發生了翻天覆地的變化。……從表面上看,軟體世界似乎陷入了瘋狂的狀態。但如果你深入繁雜表象的背後,會發現變化其實並不大。2023年的那些通用開發原則,在2023年同樣有效(很可能到2023年還會有效)……

大師就是這樣,能從繁雜的表象背後看到事物的本質。就像任正非說的:不管是不是網際網路思維,你造的汽車首先應該是汽車。

書中的內容多是兩位作者對多年經驗的敏銳抽象和昇華,對我這個只有一年多經驗的程式設計師來說,要全部理解是不可能的,而好書也不是讀一次就夠的。這裡就先記錄一些有點感觸的內容:

第一章 注重實效的哲學

下面是作者在開篇提到的注重實效的程式設計師的特徵:主要體現在處理問題、尋求解決方案時的態度、風格、哲學

1. 能夠超越出直接的問題去思考,總是設法把問題放在更大的語境中,設法注意更大的圖景。沒有這樣更大的語境,你又怎能注重實效。

2. 對所做的每件事負責,因為負責,注重實效的程式設計師不會坐視他們的專案土崩瓦解或者慢慢腐爛。

3. 勇於接受變化。大多數人發現自己很難接受變化,有時是出於好的理由,有時只是因為固有的惰性。

4. 擁有廣泛的知識和經驗基礎。

5. 善於交流。

從「程式設計師修煉之道」突然談到「注重實效的程式設計師」,咋看有點突兀,但如果看看原書的標題 the proagmatic programmer,就不會有這種誤會了。越往後看本書,越能體會到作者提到的這幾個特徵的必要性。處理問題、尋求方案時的態度、風格、哲學,這些對我們在軟體開發中的行為是潛移默化而影響深遠的。

1. 我的原始碼讓貓給吃了

a.在所有弱點中,最大的弱點就是害怕暴露弱點。

b.不管是在職業生涯、還是專案、日常工作,為你自己和你的行為負責,是注重實效的哲學的一塊基石,注重實效的程式設計師對自己的職業生涯負責,而且不害怕承認無知或錯誤。即使在最好的專案中,儘管有徹底的測試、良好的文件和足夠的自動化,出錯是難免的事情。一旦發生這樣的事情,我們要設法盡可能職業地處理他們,要誠實坦率。我們可以為自己的能力自豪,但對於自己的缺點、無知和所犯的錯,我們必須誠實。

c.責任是你主動承擔的東西。在作出承諾之前,盡可能的分析風險是否超出了自己的控制,對於不可能做到的事情或風險太大的事情,你有權不去負責。但如果你確實同意為某個結果負責,就應切實負起責任。但你犯錯誤或是判斷失誤是,就誠實地承認它,並設法給出各種選擇。不要責備別人活別的東西,不要拼湊藉口。遇到問題時,提供各種選擇,不要找蹩腳的藉口(provide options, don』t make lame execuses)

「我的原始碼讓貓給吃了」便是乙個蹩腳的藉口。要做到坦然地暴露弱點,確實很難,但這是必要地,有一句很簡練的話:be human。我們要明白自己是普通人,而不是某種完美的物種,我們有失誤、疲倦、膽怯,允許這些發生並正視這一切,同時努力成為更好的人。而說到責任,作者首先教我們的是正確評估事情的風險和自己的能力,如果風險超過了自己的控制,有權不去承擔。這真是再「實效」不過了。

2. 軟體的熵

熵是乙個物理學概念,指的是某個系統中「無序」的總量。當軟體的無序性增長時,稱為「軟體腐爛」。而造成軟體腐爛的原因主要是:開發專案時的心理(或文化)。軟體開發同樣受「破窗理論」影響,低劣的設計、錯誤的決策、糟糕的**都是軟體領域的破窗戶。一旦窗戶開始破裂,情況就會迅速惡化,不要對其置之不理,發現乙個就修復乙個,如果臨時沒有時間,就「用木板把它訂起來」,比如注釋、顯示「為實現」訊息,或用假資料(dummy data)加以替代。

對於這一點挺有體會,我見過有的軟體,編譯器給出了1000多個警告而置之不理。但話說回來,這又怎麼處理,當看到前人留下的1000多個警告的時候,我們嘗試過處理一下自己就近的,但馬上就會覺得無助。只能小心別讓自己增加更多的警告。當若干年前第一條警告出現的時候,窗戶已經開始破裂,直到膨脹到無法收拾的地步。

3. 足夠好的軟體

a.欲求更好,常會把好事變糟——李爾王

b.我們沒辦法做到十分完美,但可以訓練自己,編寫出足夠好的軟體,對你的使用者、對未來的維護者、對你的內心安寧來說足夠好。但「足夠好」絕不是編寫不整潔或糟糕的**

c.如何編寫出足夠好的軟體:

1) 讓使用者參與權衡

軟體開發過程會受到各種約束,比如市場人員有需要信守的承諾,終端使用者也許已經基於交付日期制定了各種計畫,公司也會有現金流方面的約束。如果無視這些約束,一味地增加新特性或一次次潤飾**,這不是有職業素養的做法。但許諾不可能兌現的承諾,為趕上最後期限而削減基本的工程內容,同樣不是有職業素養的做法。

使質量成為需求問題。常常需要權衡足夠好與完美,許多使用者寧願在今天用上有一些「毛邊」的軟體,也不願等待一年後的多**版本。今天的了不起的軟體常常比明天的完美軟體更可取。而且讓使用者提前使用,他們的反饋可以把你引導向更好的解決方案。

2) 知道何時止步

藝術家們會告訴你,如果你不懂得應何時止步,所有的辛苦勞作就會遭到毀壞。比如繪畫,畫家需要不時得後退,用批判的眼光觀察自己的作品,以確定下一步,但如果你一層又一層地疊加細節,就會迷失在繪畫中。程式也是這樣,不要過度修飾和過於求精二損毀完好的程式。

區分完美主義與強迫症真是一件困難的事情。在現實生活中,兩者都可能帶來問題。還好作者提示「如果無視這些約束,一味地增加新特性或一次次潤飾**,這是不有職業素養的做法」,讓我們懂得權衡並知道何時止步。同樣地我想到最近發生在自己身上的一件事,遇到技術上的困難沒有請教別人,耗費了很多時間才自己搞出來,這同樣不是有職業素養的做法。

4. 你的知識資產

a.你的知識和經驗是最重要的職業財富,但它們是有時效的資產。隨著你的知識價值的降低,對你的公司和客戶來說,你的價值也在降低。

b.怎樣經營管理知識資產,與金融資產類似:

1) 定期投資。即使投資量很小,習慣自身也和總量一樣重要。

2) 多元化是長期成功的關鍵。你知道的不同的事情越多,你就越有價值。但作為底線,你需要知道你目前所用的技術的各種特性,同時不要就此止步

3) 在保守的投資和高風險、高回報的投資之間取得平衡。不要把所有的技術放在乙個籃子裡。

4) 低買高賣,以獲取最大回報。在新興技術流行之前學習它就可能和找到被低估的**一樣困難,但所得到的就和那樣的**帶來的一樣。

5) 周期性地重新評估和平衡資產。

知識如同財富,需要用心經營,這聽起來挺功利的,但對於技術性的知識來說,確實應該採納作者的這些建議。

5. 交流

交流的重要性自不必作者多說,在交流技巧方面,作者建議考慮wisdom原則:

what do you want them to learn

what is theirinterest in what you』re got to say

howsophisticated are they

how muchdetail do they want

whom do you want toown the information

how can youmotivate them to listen to you

總體來說,就是首先要了解交流的物件,並能夠站在對方的角度想問題,同時要經常跳出事情本身來看看大局

程式設計師修煉之道 一

最近兩周突然就忙了起來,需求乙個接著乙個,短時間內還不能完全適應的我有些手足無措心力交瘁,不過通過加班總歸是緩了過來。所幸產出的 經過 的review之後沒啥大問題,遂打算抽點時間總結一下近期的工作經驗。由於本人挺喜歡 程式設計師修煉之道 這本書 現在第二版已經由雲風翻譯完成 個人認為裡面提到的不少...

程式設計師修煉之道閱讀筆記(一)

書的第一章的名字叫注重實效的哲學。其實不像很多人想的那樣,程式設計師並不是乙個冷冰冰的枯燥的集體。反而,程式設計師是更多善於思考的乙個集體,不僅僅是對工作,對於人生 世界,程式設計師都有屬於自己的解釋。所以才會有這麼多的程式設計師的紛爭,從大了講有自由與封建 開源 閉源 之爭 往具體處說,又有諸如u...

程式設計師修煉之道

在所有的弱點中,最大的弱點就是害怕自己暴露弱點。j.b bossuet,politics from holy writ,1709 provide options,don t make lame excuses 提供各種選擇,不要找蹩腳的藉口 don t live with broken window...