編程哲學(四):把控間接性
來自專欄業餘程序員的個人修養
間接性
計算機領域有句名言:
「計算機科學領域的任何問題都可以通過增加一個間接的中間層來解決」。但是過多的間接性反而會造成不好的影響,所以人們進行了這樣補充,
...except for the problem of too many layers of indirection.[1]
間接性指的是,為了達成某個目的,我們可以先做另外一件事情,
然後再繞過來解決原始的問題。間接性在編程工作中很常見,實際在不知不覺中,我們已經使用了它。
計算過程是存在於計算機里的一類抽象事物,在其演化進程中,這些過程會去操作一些被稱為數據的抽象事物。人們創建出一些稱為程序的規則模式,以指導這類過程的進行。從作用上看,就像是我們在通過自己的寫作魔力去控制計算機里的精靈似的。[2]
可見,程序符號不同於它們所操縱的計算過程,
編寫程序是間接性的一種體現,程序只是軟體功能的一種符號表示。我們應該選取合適的符號,用以描述目標系統的軟體功能。
在數學史上,區分符號以及對符號的解釋,卻花費了很長時間。
人們總是不由自主的把符號解釋為日常生活中熟悉的概念。
這是整個十九世紀數學的最深刻的教訓之一。[3]
表達能力
我們經常處於一種表達能力受限而不自知的狀態。
為了得到編程語言相關的種種商業好處,
經常把自己局限在某個特定編程語言範圍之內。我們只用這種語言去「描述」心中想做的「事情」,
結果我們能「描述」的「事情」,
就慢慢局限在了該語言善於「描述」的「事情」範圍之中了。除此之外,寫出易讀的代碼,顯然和寫作水平有關,
好的表達方式,可以把長篇大論平白直敘的「流水賬」,改造成結構清晰發人深省的「文學作品」。
因此,我們應該多從文學作品中學習經驗,
訓練自己怎樣把事情說清楚,以及在每個層面上把問題展開成什麼樣的細節程度。只有在這種情況下,封裝信息和隱藏細節才突然有了意義。
扁平化
重複未必是有問題的,重複的描述細節才有問題。
某些代碼顯得無比冗餘啰嗦,
我們才想到要把它們放在更為細節的層次上。通常我們會先去構建一些粒度較大的「磚塊」,
再用這些「磚塊」去搭建主流程,簡化主流程的描述方式。然而,過多的細節層次也是不恰當的,它增加了我們的描述複雜度。
在大型項目中,這些「磚塊」本身也會包含很多的細節,由更小的「磚塊」組成。閱讀代碼的人,必須經常在不同的層次中上下跳躍,才能理解我們到底想要表達什麼。這時候,識別出可復用的代碼才是關鍵。
通過分析問題本身的數學結構,或者理解項目相關的業務背景,
我們可以看到具有邏輯完整性的模式和工具。把它們提取出去獨立放在其他的地方,
可以幫助我們減少當前項目的描述層次,使之扁平化。參考
- Indirection
- 計算機程序的構造與解釋 - P1
- 哥德爾.艾舍爾.巴赫_集異璧之大成 - P117
推薦閱讀: