iT邦幫忙

4

軟體開發應該做到“無緒”

無緒 (Cluelessness) 由 Martin Rinard 提出。他在演講時指出:

在開發和維護軟體系統時,應該避免讓開發人員深入了解系統。

因為人的大腦可以處理的資訊有限。若要建立一個日益變大的應用程式,就必須學習「如何讓每個開發人員在不了解整個應用程式的情況下,也能完成軟體開發」。


“無緒” 並不是一個貶義詞。它用來區別兩種層次的理解水平。

  1. 淺層理解:指對事物的了解程度僅限於掌握使用方法即可。
  2. 深層理解:指對掌握了事物背後的原則、規律、原理。

在日常生活中的“無緒”

生活中我們通常只需要用到 淺層理解。例如,刷牙不需要知道化學式。不需要理解冰箱原理就可以冷凍食品。當然,也有一些人需要了解更深入的內容。像是冰箱的維修人員就要了解較深入的領域知識。但即便如此,維修人員所需要的知識仍屬於 淺層理解,因為他們也不需要了解事物背後的每個小細節和原理。

當然也可以學習每件事物背後的知識原理,但是必要性與 CP 值通常不大。因此大多數人在日常生活中只需要 淺層理解 就足夠了。

軟體開發中的“無緒”

在軟體開發中,“無緒” 也表示大部分的時間中,開發人員只需要 淺層理解 就足以應付工作。這裡的 淺層理解 並不是指開發人員不需要懂得編寫程式。以下舉個例子來說明軟體開發中的 淺層理解深層理解 之間的差異。

「電子商務網站」:

某天 PM 告知下一個專案是「電子商務網站」。那麼,實作這個網站有兩種做法:

實作方法一:

在專案初始階段:  
我需要打開 HTTP 協定的文件,解析 HTTP 傳輸格式、
研究如何實現 POST、GET 請求....等等。  
此外還要閱讀 RFC 文件,並實現文件中的各項內容。  
全部都搞定後才能開始打造「電子商務網站」。

實作方法二:

在專案初始階段,在作業系統中下載並安裝 Apache、PHP、MySQL,  
設定妥當後即開始打造「電子商務網站」。

相信 實作方法二 才是大家熟悉開發的方式,因為現代軟體都是基於組件組裝出來的,沒有人需要獨自從頭到尾完成所有內容。在一個作業系統上安裝 Web 服務並開始編寫 HTML,對現在的開發人員來說是易如反掌。但事實上光是 Web 服務就已經複雜到極點,應該沒人敢說自己了解 Web 服務的所有內容。這一現象正是 淺層理解 的體現,讓開發人員在大部分的時間中,只需要掌握系統、框架、程式庫的使用方法,即可以將現成的組件應用到自己的應用程式,或是在組件上堆疊自己的應用程式。

設計原則中的“無緒”

我們的目標是找到一種軟體開發的實踐方式:讓開發人員不用深入了解所有組件或者模組的實現原理,僅用最少的知識就可以很好地完成自己所需要的功能。這種開發方式被稱為「選擇性無緒(selective cluelessness)」。

選擇性無緒 的思維,正好符合軟體設計原則的 緊湊性當一個程式具有緊湊性時,即具有「易於理解、使用、組合」等特性。這些特性讓使用者幾乎可以不用閱讀文件,即可自然而然的使用這些程式。但是要注意的是,緊湊性並不等同於「容易學習」。

以下提供一個緊湊與不緊湊的範例:

原生的 JavaScript 的 Date 物件是不緊湊的:

// 時間格式轉換
var now = new Date();  
var year = now.getFullYear();  
var month = ("0" + (now.getMonth() + 1)).slice(-2);  
var day = ("0" + (now.getDate() + 1)).slice(-2);  
var hour = ("0" + (now.getHours() )).slice(-2);  
var minute = ("0" + now.getMinutes() ).slice(-2);  
var second = ("0" + now.getSeconds() ).slice(-2);  
year + '/' + month + '/' + day + ' ' + hour + ':' + minute+ ':' + second;  

moment.js 的 moment 物件是緊湊的:

// 時間格式轉換
moment().format('YYYY/MM/DD HH:mm:ss');

若程式設計得當,維護人員就可以使用 淺層理解 來學習你的程式。若程式設計得不夠緊湊,維護人員往往需要將頭腦切換成 深層理解 的模式來探索你的程式碼,並學習是如何運作的。

因此編寫程式的過程中,應該時時刻刻想著如何讓你的程式變得 “無緒”,讓使用者可以用最少的力氣學習你的程式。這樣的設計思維適用於「函式、類別、模組、類別庫、架構、框架以及系統」的情境。也就是 Martin Rinard 所說的:

軟體設計要盡可能做到 “無緒”。讓開發人員可以在對系統很少了解的前提下,仍然可以完成開發的工作

延伸閱讀

文章內容整理自以下書籍並加以歸納與簡化:


尚未有邦友留言

立即登入留言