source: Donald E. Knuth: All Questions Answered
Knuth教授對多個技術和程式設計議題發表了見解。- 詞彙大小(Word Size):對於新機器最佳原生詞彙大小的提問,Knuth教授的答案是64位元。他指出:「我設計的MMIX電腦就是64位元字長,因為John Hennessy叫我這樣做,我在做的時候發現了許多許多很好的理由。」他認為64位元提供足夠的位址空間,且具有如8x8布林矩陣等優雅的特性。
- 三進位算術(Ternary Arithmetic):有聽眾問及波蘭電腦為何使用三進位(負3)。Knuth教授解釋那不是負3,而是平衡三進位(balanced ternary),使用-1, 0, +1的數字。他認為平衡三進位有許多優點,例如易於截斷和取負數,只是因為製造二進位晶片更容易才未普及。
- 「最佳駭客」(Best Hack):當被問及他研究過最好的「駭客」(巧妙的程式技巧)時,他提到了Bill Gosper在MIT的Hackmem備忘錄中提到的一個四指令程式,可以將二進位數轉換為具有相同數量1位元的下一個最大數。
- 書籍中的錯誤:Knuth教授公開承認他的書籍中有錯誤,並鼓勵讀者向他報告。他會為首次報告的每個錯誤支付2.56美元。他已發出超過2,000張支票,平均每張超過8美元。
- 排序演算法的效率:對於線性時間排序的可能性,他解釋這取決於定義。如果排序基於鍵的比較,根據資訊理論是不可能的。但如果利用其他特殊屬性(如鍵的有限大小),則可能實現線性時間排序,例如基數排序(radix sort)。
- 現代軟體程式碼:Knuth教授認為今天的商業軟體程式碼可能會讓讀者感到驚訝,因為它們可能只是呼叫許多函式庫,需要查閱大量參考資料。他對開源的一些目標表示贊同,但批評了許多系統傾向於「從頭再來」。
- 電腦科學的未來研究方向:當被問及如果沒有電腦,電腦科學研究會走向何方時,Knuth教授風趣地表示這會讓他的寫書更容易。對於量子電腦,他認為這是一個非常不同的思維方式,可能需要不同背景的程式設計師。
- 摩爾定律與程式設計:Knuth教授認為摩爾定律(Moore's Law)的發展速度快於人們想出充分利用電腦能力的方法。「摩爾定律比我們能想出事情來做它的速度還要快。」他指出記憶體速度未能跟上處理器速度,導致記憶體參考成本增加。他現在使用「MEMS」(記憶體參考次數)作為衡量演算法成本的粗略單位。
- 未充分利用的演算法:Knuth教授認為許多演算法(如基於「Matroid」理論的演算法)尚未找到應用。他鼓勵人們從簡單的方法入手,探索其特殊案例。
- 程式設計是藝術還是科學:Knuth教授認為程式設計是藝術與科學的結合。他將「藝術」定義為「尚未充分理解以致於不能自動完成的事情」,而「科學」則是「我們理解得足夠好可以程式設計的東西」。他相信:「每年它變得更像一門科學,我們理解得越來越多,但藝術仍然不斷超越,遙遙領先。」
- 演化演算法(Evolutionary Algorithms)/基因演算法(Genetic Algorithms):Knuth教授認可這類演算法在某些問題上的強大能力,例如他書中提出的優化美式足球比賽鏈路的問題,一個遺傳演算法找到了更好的解。但他認為這類方法並非萬能,無法解決所有複雜問題。
- 演算法專利:Knuth教授堅決反對演算法專利。「我認為為演算法申請專利是一個大錯誤,就像數學一樣。」他認為演算法是數學物件,本質上不應受到專利保護。
- 自我複製程式(Self-Reproducing Programs):他提到這是過去的一個熱門話題,是遞歸定理(recursion theorem)的一個有趣應用。
- 人腦的記憶容量與運作:他對人腦的巨大記憶容量和緩慢的運作週期感到驚訝。他推測大腦可能通過某種基因演算法進行大規模並行處理,不斷產生假設並選擇最佳者。
- 程式碼維護(Software Maintainability):Knuth教授認為維護程式的最佳方式是良好地解釋程式。他推崇文學式程式設計(Literate Programming),將程式視為一篇供人閱讀的文獻,由簡單的模組組成複雜的整體。他開發的CWEB工具支援這種方法,使得程式碼可以像超文本一樣被瀏覽。他甚至將經典遊戲「冒險」(Adventure)的Fortran原始碼轉換為CWEB版本作為範例。
- Google搜尋引擎:他提到Google搜尋引數十億網頁的速度令人印象深刻。
- 文字基礎的程式設計之外:他承認人們一直在尋找能讓程式設計更簡單的「魔法子彈」,但程式設計問題本質上非常微妙。
- 程式碼格式化與風格:Knuth教授的程式碼風格源自ACM出版物,他認為關鍵不在於具體縮排或分行,而是將程式視為「文學作品」。「關鍵思想是將程式視為供人閱讀的文學作品,並將其分解為模組,使其易於理解模組之間的連接。」他的一個主要風格特點是使用巨集(macro calls)來嵌入程式碼片段,而非傳統的副程式呼叫。
- 程式語言大戰:Knuth教授認為程式語言之間的「戰爭」自他十歲時就已存在,至今仍在持續。「這至少從我十歲起就是如此。」
- 成為電腦科學家的原因:他之所以成為電腦科學家,是因為他作為大學二年級學生看到IBM的程式設計手冊中的「愚蠢」程式,認為自己可以做得更好。「我當時想,天哪,那些是專業人士,而我只是一個二年級學生,我可以做得比那更好。」
- 程式碼除錯與正確性:Knuth教授表示自己從未聲稱程式沒有bug,只是「檢查它們直到沒有bug」。他強調檢查程式碼的重要性,並指出許多人傾向於「試驗、運行、然後修改直到能用」。他提及Bob Floyd在1960年教會他如何「知道我的程式是正確的」。
- 分散式計算的挑戰:儘管存在大量閒置的處理能力,但將其用於分散式計算仍面臨挑戰。除了技術和演算法問題,還涉及多文化合作、法律和隱私問題。Knuth教授個人偏愛獨立機器,以避免病毒。
- H-1B簽證與程式設計人才短缺:Knuth教授認為,全球範圍內真正具備電腦思維的人才稀缺,導致長期以來程式設計師一直供不應求,因此矽谷不太可能出現蕭條。
- 優秀程式設計師的特質:他認為優秀程式設計師具備兩大特質:
- 處理非均勻結構(non-uniform structure)的能力,就像律師處理不同事實一樣。
- 在抽象層次之間跳躍的能力,能夠同時從宏觀和微觀層面理解程式。
- Fourth語言:他稱讚Fourth是一種「很棒的方式,能在小空間內打包大量邏輯」,並指出PostScript是其最大後代。這種語言體現了「建立自己的小電腦並用自己的語言編寫」的哲學。
- 程式設計教育:Knuth教授強調教育的關鍵在於讓程式設計變得有趣。他建議應該提供工具和獎勵,讓學生從中獲得樂趣。他還提到,作為一名教師,他會花時間教學生寫作,因為良好的寫作能力對程式設計師非常重要。「當然,寫作技能對文學式程式設計很重要...寫作非常重要。」
- 最喜歡的演算法:Knuth教授最喜歡的演算法是歐幾里得演算法(Euclid's algorithm),它可追溯到西元前三四百年。他發現其背後的數學原理引人入勝。
- P/NP問題:Knuth教授將P/NP問題描述為「最具挑戰性的理論問題」,並提到存在百萬美元的獎勵。他提出了一種可能性,即可能存在一個多項式時間的解,但我們永遠無法知道其具體形式或程度。
- 寫書工具:他使用Emacs和TeX來創作他的書籍,並開發了許多自訂的Emacs工具,例如「色彩模式」(color mode)來幫助管理資料庫。
- 程式正確性(Program Correctness):Knuth教授承認程式正確性是一個巨大的研究領域,但強調即使證明了程式正確,也可能存在檢查器或規範本身的bug。
- TeX的重寫:他表示不會重寫TeX,因為他認為「穩定性優於糟糕的功能」。他從過去的經驗中學到,一個穩定的系統,即使不持續改進,也比頻繁更新但導致不穩定的系統更好。