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.


