快轉到主要內容

寫程式最難的問題是抵抗邪惡尼哥的誘惑 - Terry Davis談軟體開發

· 民國115年丙午年
·
切換繁體/簡體
分類 人文藝術 自由軟體議題
標籤 TempleOS
目錄

Terry Davis - The Hardest Question In Programming

這是Google面試的時候會問你的問題。 你必須回答。

文字稿翻譯
#

你必須回答:這是邪惡尼哥的誘惑,還是上帝的神聖智慧?

這就是問題所在。呃,我就說到這裡吧。

你知道Google會問面試問題,而我在工作上遇到的問題就是:這是邪惡尼哥的誘惑嗎?

這對我們的使命宣言來說,是不是太黑魔法了?我們開發這個系統的使命是成為現代版的Commodore 64。

這是黑魔法嗎?這就是……這是……這是黑魔法。

問題是:這是黑魔法嗎?這是你在程式設計中可能遇到的最困難的問題。

這就是最難的問題。這就是程式設計中最難的問題。

對於未來十個世紀的聖殿來說,這是不是有太多黑魔法了?

(自創字niggerlicious和voodoo我不知道怎麼翻譯,Google建議這個是「邪惡尼哥在誘惑你」,我就採用了)

釋義
#

有人認為以上Terry Davis這段意義不明的話,意思是在說:你的程式碼是否太複雜了,以至於無法達成原本的目的,未來的人是否會看不懂。

(注意:本文的標題有略做誇張化修改,這句話不是Terry Davis直接的意思)

我們在寫程式的時候應該要注意不要把事情複雜化,要用就用最簡單的方案。

影片裡面,Terry Davis在解的問題是一個HolyC的迴圈。

他的目標是在一個for迴圈中,使用switch語句來列印數字,但有一個特殊要求:要在數字3到6的區間前後加上括號[]

預期的輸出結果應該是類似這樣的:

0 1 2 [ 3 4 5 6 ] 7 8 9

他拿這個例子出來說,是因為在影片中的程式碼他嘗試這樣寫:

switch [i] {
    case 0: ... break;
    case 1: ... break;
    case 2: ... break;
    start:       // 標籤
       '[';      // 他想在進入 case 3 之前印出左括號
    case 3: ... break;
    case 4: ... break;
    case 5: ... break;
    case 6: ... break;
    end:         // 標籤
       ']';      // 他想在 case 6 結束後印出右括號
       break;
    case 7: ...
}

問題在於switch的底層運作機制涉及到C語言底層的分支表(Jump Table)運作問題。當i等於3的時候,程式會直接跳轉到case 3的記憶體位址。這代表寫在case 3上方的程式碼會被跳過。CPU不會經過那裡,而是直接走到case 3。這段夾在case中間的程式碼,在C語言邏輯中稱作Dead Code。除非用非常髒的goto指令,否則不可能過去。

一般來說,如果要實現在數字3到6的區間前後加上括號[]的功能,大多數程式設計師會寫一堆if (i==3) print("[")或者把迴圈拆開。但Terry Davis認為這破壞了switch語句的對稱性和簡潔性。

此外,他在想的是,系統的編譯器應該要怎樣實作才可以解決這個看似簡單的邏輯問題。為什麼程式碼在人類直覺看上去的邏輯,跟機器實際運作的結果不一樣?如果只是為了解決印出括號順序的問題,就得修改編譯器的底層,把事情弄得更複雜。

因此影片中這麼一大串玩意,其實指的就是程式設計原則的問題。

Terry Davis在開發TempleOS的時候一直強調軟體程式碼簡潔的重要性,確保未來的人能看懂。他還有另外一句名言:

An idiot admires complexity, a genius admires simplicity.

相關文章


此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。

(留言板載入中)這是Giscus留言板,需要Github帳號才能留言。支援Markdown語法,若要上傳圖片請善用外部圖床。您的留言會在Github Discussions向所有人公開。

Click here to edit your comments.

(留言板載入中)這是Disqus留言板,您可能會看到Disqus強制投放的廣告。為防止垃圾內容,有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。若要上傳圖片請善用外部圖床網站。