選擇三之一 無窮迴圈
言治骨角者,既切之而復磋之;治玉石者,
既琢之而復磨之,治之已精,而益求其精也。
~ 朱熹, "論語 學而篇 註"

世界不是二元的

軟體是為解決人生中的某些問題而存在:電子郵件和通訊軟體解決人與人聯繫不便的問題,作業系統解決在純硬體上 jserv 過於麻煩的問題,種子解決夜裡寂寞的問題,錢解決所有問題。然而人生的事通常不只有唯一解,這點也能套用在軟體的問題上。

1+1 = 4-2

軟體是從數學發展出來的,而數學有一種麻煩又迷人的特性:同一個東西可以有許多種不同的表示法;軟體也從數學繼承了這個特性。

JS 中不同的迴圈表示法

4-2 != 4-2

程式跟數學式也有一個共同點:用來描述某種事物。有的時候描述的事情不同,最後卻會成為相同的數學式。

假設桌上有四支筆,兩支斷水,兩支正常

  • 描述斷水的筆,可以用總數量減去正常的數量 4-2
  • 描述正常的筆,可以用總數量減去斷水的數量 4-2

不敗選擇:選擇最精確的描述

雖然說是不敗選擇,事實上僅限從 自我解釋能力 self-explaining 角度來看。有時為了其他因素 (效能、資源消耗、共事者的能力) 可能會需要做出不同的決策。

以上面 formap 的例子來看的話

要把整個陣列 arr 印出來

這句話的精確描述應該是 走過 arr 的所有元素,把元素一個一個列出來 ,所以 for 是較佳選擇

把陣列 arr 的內容乘以二後存成 brr

雖然這個也能用 走過 arr 的所有元素,把元素一個一個乘以二後存進 brr 來描述,但還有更精確的:

把 arr 集合透過乘以二的方式產生 brr 集合

f:A→B

這時候選擇 map 就更好了

可讀性

直覺上,程式的自我解釋能力越強,可讀性應該是越高的;但還有更精確的描述

目標讀者要讀懂這段程式碼,所花費的心力及先備知識越少,可讀性越高

所以寫給某些特定領域的數學程式大師的程式碼,把 array mapping 的部份用 map 處理會比較好讀。但是寫給初學程式的新手看時,用 map 只會造成困惑。

最精確的描述?

最精確的描述其實不一定找得到。對於能在有限時間內列舉所有描述法的事情,我們可以肯定能找到:一一舉出描述,留下最精確的一個;也就是 reduce 的概念。很可惜的是,總有些問題的描述法是不可能在有限時間一一列舉的,也許是數量太多,也可能是還有確定存在但你還不知道的描述法;而這就是重構派上用場的時候了。

既然找不到 絕對極值 (最精確的描述),至少還找得到 區域極值 (目前已列舉出的描述中,最精確的那個)。隨著列舉出來的變多,區域極值就會越接近絕對極值。每次找到一個更精確的描述,就透過重構把程式改過去;這個方式我稱之為 科學研究法 或是 暴力演算法

科學家做研究的方式

  1. 就目前擁有的證據及知識提出假說
  2. 透過實驗或其他手段取得新的證據
  3. 檢視新證據
  4. 證據支持假說,回到 2
  5. 既然證據不支持假說,回到 1 重新提出假說

科學研究法 (自稱)

  1. 根據已知的最佳描述法撰寫程式
  2. 透過上網搜尋或其他手段得知不同的描述法
  3. 檢視新描述法
  4. 比現有的還爛,回到 2
  5. 既然比現有的好,回到 1 改寫程式

人生又何嘗不是這樣?

Written by 

熱愛思辨,喜歡透過自我問答來找到可能的答案

Related posts

發表迴響