Donald Knuth 對技術與程式設計的看法 (All Questions Answered 摘要)

更新於 發佈於 閱讀時間約 9 分鐘


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教授認為,全球範圍內真正具備電腦思維的人才稀缺,導致長期以來程式設計師一直供不應求,因此矽谷不太可能出現蕭條。
  • 優秀程式設計師的特質:他認為優秀程式設計師具備兩大特質:
    1. 處理非均勻結構(non-uniform structure)的能力,就像律師處理不同事實一樣。
    2. 抽象層次之間跳躍的能力,能夠同時從宏觀和微觀層面理解程式。
  • Fourth語言:他稱讚Fourth是一種「很棒的方式,能在小空間內打包大量邏輯」,並指出PostScript是其最大後代。這種語言體現了「建立自己的小電腦並用自己的語言編寫」的哲學。
  • 程式設計教育:Knuth教授強調教育的關鍵在於讓程式設計變得有趣。他建議應該提供工具和獎勵,讓學生從中獲得樂趣。他還提到,作為一名教師,他會花時間教學生寫作,因為良好的寫作能力對程式設計師非常重要。「當然,寫作技能對文學式程式設計很重要...寫作非常重要。」
  • 最喜歡的演算法:Knuth教授最喜歡的演算法是歐幾里得演算法(Euclid's algorithm),它可追溯到西元前三四百年。他發現其背後的數學原理引人入勝。
  • P/NP問題:Knuth教授將P/NP問題描述為「最具挑戰性的理論問題」,並提到存在百萬美元的獎勵。他提出了一種可能性,即可能存在一個多項式時間的解,但我們永遠無法知道其具體形式或程度。
  • 寫書工具:他使用EmacsTeX來創作他的書籍,並開發了許多自訂的Emacs工具,例如「色彩模式」(color mode)來幫助管理資料庫。
  • 程式正確性(Program Correctness):Knuth教授承認程式正確性是一個巨大的研究領域,但強調即使證明了程式正確,也可能存在檢查器或規範本身的bug。
  • TeX的重寫:他表示不會重寫TeX,因為他認為「穩定性優於糟糕的功能」。他從過去的經驗中學到,一個穩定的系統,即使不持續改進,也比頻繁更新但導致不穩定的系統更好。
留言
avatar-img
留言分享你的想法!
avatar-img
Will 進步本
6會員
247內容數
歡迎來到「Will 進步本」!我們將探索計算機科學、商用英文和生成式AI。從基礎到前沿,共同學習和交流,拓展知識視野,啟發創新思維
Will 進步本的其他內容
2024/07/10
青春期少年的心理可以分成兩個系統——一個是「動力系統」,另一個是「控制系統」。用汽車打比方,動力系統就好像是油門,控制系統則好像是方向盤和煞車。
Thumbnail
2024/07/10
青春期少年的心理可以分成兩個系統——一個是「動力系統」,另一個是「控制系統」。用汽車打比方,動力系統就好像是油門,控制系統則好像是方向盤和煞車。
Thumbnail
2024/07/09
2024/07/09
2024/07/08
兒童在六歲左右會經歷一次重要的大腦發育變化,使他們從“發現式學習”轉向“掌控式學習”。在這種轉變過程中,傳統的學徒制可能是最適合的學習方法。然而,現代的學校教育體制下,專注力成了最重要的能力。
Thumbnail
2024/07/08
兒童在六歲左右會經歷一次重要的大腦發育變化,使他們從“發現式學習”轉向“掌控式學習”。在這種轉變過程中,傳統的學徒制可能是最適合的學習方法。然而,現代的學校教育體制下,專注力成了最重要的能力。
Thumbnail
看更多
你可能也想看
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
2025 vocus 推出最受矚目的活動之一——《開箱你的美好生活》,我們跟著創作者一起「開箱」各種故事、景點、餐廳、超值好物⋯⋯甚至那些讓人會心一笑的生活小廢物;這次活動不僅送出了許多獎勵,也反映了「內容有價」——創作不只是分享、紀錄,也能用各種不同形式變現、帶來實際收入。
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
嗨!歡迎來到 vocus vocus 方格子是台灣最大的內容創作與知識變現平台,並且計畫持續拓展東南亞等等國際市場。我們致力於打造讓創作者能夠自由發表、累積影響力並獲得實質收益的創作生態圈!「創作至上」是我們的核心價值,我們致力於透過平台功能與服務,賦予創作者更多的可能。 vocus 平台匯聚了
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
本書大多數的內容都以 OO 的概念出發,詳列了許多設計的臭味道,也有大量的例子。個人雖然不會這樣寫程式,但仍是覺得受益良多,至少在 code review 時能更清楚知道該怎麼描述問題。不過,即便不是用 OO 的概念,有些章節還是可以帶來一些想法,用 OO 概念寫程式的人更不該錯過這本好書。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
觀察者模式透過主題訂閱/訊息通知的機制,極度增強系統的可擴展性、靈活性以及降低組件間的耦合度。概念直觀簡單,是非常實用的設計模式。
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
Thumbnail
CSS 的繼承性是開發網頁樣式時的一個重要概念,它使得樣式設計更加靈活和高效,有助於提高程式碼的可讀性、一致性和可重用性,並加快開發速度,從而提供更好的開發體驗。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
軟體系統的發展歷程大多相似,首重解決基本需求、提供操作介面,進而提升安全性、擴充功能、優化操作。
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
列出一套完整的程式 程式設計有許多種方法,不過通常會先列出清單的再逐一執行,這樣會加快程式設計的速度。設計通常會採取順推的辦法。所以順推的程式設計方式就是經歷觀念溝通、系統分析、資料統合、權限管理、頻率與時間、後台管理、畫面設計等等階段後,將框架設計完了以後,先列出一套完整的程式,將所有使用者都確
Thumbnail
程式設計中不可或缺的一部分 介面是使用者與程式互動的媒介,因此介面的設計會影響使用者的體驗和感受。一個清晰明白、易懂的介面,可以讓使用者輕鬆地使用程式,並獲得良好的使用體驗。 需要與程式設計師密切溝通 設計師需要了解程式的功能和需求,並根據使用者的習慣和需求進行設計。設計師和程式設計師之間的溝
Thumbnail
程式設計中不可或缺的一部分 介面是使用者與程式互動的媒介,因此介面的設計會影響使用者的體驗和感受。一個清晰明白、易懂的介面,可以讓使用者輕鬆地使用程式,並獲得良好的使用體驗。 需要與程式設計師密切溝通 設計師需要了解程式的功能和需求,並根據使用者的習慣和需求進行設計。設計師和程式設計師之間的溝
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
資料的統合 在程式設計中,其他人通常關心是否注意到執行的細節。作為程式設計師,主要應該關心的是程式的表現,但往往忽略了很多細節,這些細節可以決定程式的好壞。程式的好壞很大程度上取決於資料的統合,也就是資料是否被正規化。 不同類型的資料在系統中呈現一致 正規化可能對一些人來說聽起來很抽象,有些人
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
系統的分析與規劃 在談到程式設計時,首要的是進行系統的分析與規劃。程式設計的起點通常是系統分析與規劃,這涉及到如何分析和設計系統的大原則和方向。為了達到預期效果,重要的是擁有對產業的清晰邏輯認識和深入了解。 進行深入了解 若要進行系統分析,必須對企業的設計和程式設計的對象進行深入了解,以充分理
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News