自 Dijkstra 於 1965 年發表 “Programming Considered as a Human Activity” 以來,程式設計師的性格特質一直被視為值得深入探究的議題。軟體工程師的基本建材是人類智力(Human Intellect),主要工具則是自己。因此,了解自身心智特質如何影響程式設計品質,是精進技藝不可或缺的一環。

33.1 個人性格是否和本書話題無關?#

程式設計的高度內省性(Inwardness)使得個人性格格外重要。你無法被強迫成為好的程式設計師——工作本質上是無法被監督的,因為沒人真正知道你在做什麼。

研究一再顯示,程式設計師之間在完成時間、除錯速度、程式碼大小、錯誤率等方面,存在著 10:1 的差距(Sackman et al. 1968; Curtis 1981; DeMarco and Lister 1985)。

你無法改變智力,但你可以改變性格——而性格才是造就卓越程式設計師的決定性因素。

33.2 聰明和謙虛(Intelligence and Humility)#

超高智商與優秀程式設計之間的關聯其實很鬆散。沒有人真正聰明到足以完全理解一個複雜程式。Dijkstra 在 1972 年圖靈獎演講 “The Humble Programmer” 中主張:程式設計的核心挑戰,就是彌補我們有限的腦容量

  • 最優秀的程式設計師承認自己的腦袋很小,因此謙虛地尋找補償方法
  • 最差的程式設計師拒絕接受這個事實,自負使他們無法進步

許多良好的程式實踐本質上都是為了降低認知負擔

  • 系統分解(Decomposition)使系統更易理解
  • 程式碼審查與測試是對人類易犯錯的補償
  • 保持子程式短小以減輕大腦負荷
  • 使用問題域語言而非底層實作細節來撰寫程式
  • 採用慣例(Conventions)來解放腦力

33.3 求知慾(Curiosity)#

技術環境每 5 到 10 年就會大幅更迭。若你對技術缺乏好奇心,很快就會被淘汰。以下是培養求知慾的具體行動:

建立對開發過程的自覺#

如果你的工作只有短期任務而無法提升技能,你應該感到不滿。在競爭激烈的軟體市場中,你現有知識的一半會在三年內過時

勇於實驗#

寫短程式來測試語言特性,用原型(Prototype)來驗證概念。有效程式設計的關鍵之一,是學會快速犯錯,並從每次錯誤中學習

閱讀與學習#

  • 閱讀問題解決(Problem Solving)相關書籍
  • 研究成功的專案與優秀程式設計師的程式碼
  • 克服文件恐懼症(Documentation Phobia),定期瀏覽語言與函式庫文件
  • 每兩個月讀一本好的程式設計書籍,很快就能與大多數人拉開差距

專業發展階梯#

點擊展開:程式設計師的四個層級
  1. Level 1 入門(Beginning):能使用一種語言的基本功能
  2. Level 2 進階(Introductory):能使用多種語言,精通至少一種
  3. Level 3 專精(Competency):對語言或環境有深入專業知識;許多人止步於此
  4. Level 4 領導(Leadership):認知到程式設計有 85% 是與溝通,只有 15% 是與電腦溝通;為人類讀者撰寫清晰的程式碼

身為初學者或中級者並非罪過。真正的問題在於:當你知道如何改進時,你停留在原地多久了?

33.4 誠實(Intellectual Honesty)#

知識上的誠實(Intellectual Honesty)是專業程式設計師成熟的標誌,具體表現為:

  • 不懂就承認不懂,不假裝自己是專家
  • 坦然承認錯誤——拒絕承認只會讓別人知道你既犯了錯又不誠實
  • 試著理解編譯器警告,而非壓制訊息
  • 在編譯之前就清楚理解程式的邏輯,而非「編譯看看會怎樣」
  • 提供真實的進度報告與時程估算

時程估算不可談判#

估算反映的是客觀事實,不是可以協商的數字。當管理層施壓要求縮短時程時,正確的回應是:

「我能告訴你開發需要多久——這是我的工作。至於這個成本是否值得投入——那是你的決定。我們可以協商的是功能範圍、效能目標、開發策略,然後重新估算。」

33.5 交流與合作(Communication and Cooperation)#

真正優秀的程式設計師懂得與人合作。撰寫可讀的程式碼是團隊合作的一部分。程式設計首先是與另一個程式設計師溝通,其次才是與電腦溝通。

33.6 創造力和紀律(Creativity and Discipline)#

有些程式設計師認為標準與慣例會扼殺創造力,但事實恰好相反。想像一個每頁字型、顏色、版面都不同的網站——那是混亂,不是創意。

「形式即是解放」(Form is liberating)。米開朗基羅設計西斯汀禮拜堂天花板時,將其劃分為對稱的幾何形式與三個柏拉圖式區域。沒有這種自我施加的結構與紀律,300 個人物將只是混亂而非藝術傑作。

不要在無關緊要的地方浪費創造力。在非關鍵領域建立慣例,將創造力集中在真正重要的地方。

33.7 懶惰(Laziness)#

懶惰有三種層次:

  1. 真正的懶惰:拖延不愉快的工作,花數小時做無關的事來逃避一個小任務——這幾乎從不有益
  2. 開明的懶惰(Enlightened Laziness):盡快完成不愉快的工作以擺脫它——養成立即處理小任務的習慣
  3. 長期的懶惰(Long-term Laziness):寫工具來自動化不愉快的工作,使你再也不用手動執行——這是最有生產力的一種

不要把忙碌(Hustle)等同於生產力。程式設計中最重要的工作是思考,而思考時人看起來並不忙碌。如果一個程式設計師總是看起來很忙,那他可能沒有善用最有價值的工具——自己的大腦。

33.8 不如你想像中那樣起作用的性格因素#

堅持不懈(Persistence)#

在軟體開發中,堅持通常是**固執(Pigheadedness)**而非美德。當某個方法行不通時,更好的做法是:

  • 嘗試重新設計
  • 採用替代的編碼方式
  • 除錯卡住超過 15 分鐘時,暫時放下讓潛意識處理
  • 為自己設定參數:「如果 30 分鐘內這個方法沒成功,我就花 10 分鐘腦力激盪其他方案」

經驗(Experience)#

在軟體開發中,實作經驗的價值比許多其他領域來得小:

  • 基礎知識變化極快,10 年前畢業的人可能從未接觸過後來才廣為人知的基本觀念
  • 如果你無法擺脫舊語言或舊機器上的思維習慣,經驗反而是阻礙
  • 「5 年 C 程式設計經驗」這種要求毫無意義——如果一兩年內還學不會,再多三年也不會有差別

工作 10 年,你獲得的是 10 年的經驗,還是 1 年的經驗重複 10 次?你必須持續反思才能獲得真正的經驗。

狂熱式程式設計(Gonzo Programming)#

通宵程式設計的英雄主義是失敗的配方。那些徹夜奮戰的時刻雖然令人興奮,但接下來你得花好幾週修正在狂熱中製造的缺陷。熱情不能替代專業能力

33.9 習慣(Habits)#

好習慣之所以重要,是因為你作為程式設計師的大部分行為都是無意識的。你上次認真質疑自己的格式化風格是什麼時候?很可能是剛開始程式設計的那一年。

  • Bill Gates 說過,任何將來會變優秀的程式設計師,在最初幾年就已經展現出來了
  • 好習慣要一開始就養成——當你還在主動思考時,選擇正確的做法
  • 你無法用「沒有習慣」來取代壞習慣;要用新的好習慣來替換舊的壞習慣

養成在編碼前先用虛擬碼撰寫類別、在編譯前仔細閱讀程式碼的習慣。壞習慣會隨著新習慣的建立而自然消失。

更多資源#

  • Dijkstra, “The Humble Programmer” (1972):探討程式設計對心智能力的依賴,強調掌握複雜性是程式設計的本質任務
  • Weinberg, The Psychology of Computer Programming (1998):「無我程式設計」(Egoless Programming)概念的經典著作
  • Pirsig, Zen and the Art of Motorcycle Maintenance (1974):對「品質」的深入探討,對軟體開發心理學有深刻啟發
  • Curtis, Tutorial: Human Factors in Software Development (1985):45 篇論文的合集,涵蓋心智模型、問題解決、語言特性、錯誤診斷等主題

要點#

  • 個人性格直接影響你撰寫程式的能力
  • 最重要的特質是謙虛、求知慾、知識上的誠實、創造力與紀律,以及開明的懶惰
  • 卓越程式設計師的特質幾乎與天賦無關,而與持續自我提升的承諾息息相關
  • 令人意外的是,原始智力、經驗、堅持不懈和勇氣,其害處與益處一樣多
  • 許多程式設計師不主動學習新知,而是依賴工作中的偶然接觸。若你願意投入少量時間閱讀與學習,幾個月或幾年後就能顯著超越大多數人
  • 好性格主要是好習慣的問題——養成正確的習慣,其餘的自然水到渠成