原文連結: 計算機科學中的形式與內容

計算機科學中的形式與內容

MARVIN MINSKY

麻省理工學院,麻薩諸塞州劍橋市

Project MAC 與電機工程系

計算機協會雜誌 (Journal of the Association for Computing Machinery),第 17 卷,第 2 期,1970 年 4 月

[由於我們無法讀取 1970 年的 DECtape,本文是從 JACM OCR 而來。如果您發現任何明顯的印刷錯誤,請發送給我。但不要告訴我關於指數的問題,無論是 Macintosh 98 還是 2001 的 MS Word 在轉換為 html 時都無法正確呈現它們。]

摘要:對形式主義的過度關注正在阻礙計算機科學的發展。本文針對三個領域討論了形式與內容的混淆:計算理論、程式語言和教育。

關鍵詞和短語:教育、程式語言、編譯器、程式設計理論、啟發式、初等教育、計算機科學課程、自擴展語言、「新數學」

CR 分類:1.50, 3.66, 4.12, 4.29, 5.24

當今計算機科學的問題在於過度關注形式而非內容。

不,這樣開頭是錯的。以任何先前的標準來看,計算機科學的活力都是巨大的;還有哪個知識領域曾在二十年內取得如此大的進步?此外,計算理論或許在某種程度上包含了形式科學,因此這種關注並非完全錯誤。儘管如此,我仍將論證,對形式主義的過度關注正在阻礙我們的發展。

在進入正題之前,我想記錄下我的同事、學生和我從這次圖靈獎中獲得的滿足感。圍繞著理解智慧的一系列問題,曾經是哲學問題,但現在是科學問題,對 Alan Turing 來說至關重要,他以及其他幾位思想家——特別是 Warren S. McCulloch 和他年輕的同事 Walter Pitts——進行了許多早期分析,這些分析既促成了計算機本身的誕生,也促成了人工智慧新技術的發展。透過認可這個領域,這個獎項應該聚焦於我科學家族其他成員的工作——特別是 Ray Solomonoff、Oliver Selfridge、John McCarthy、Allen Newell、Herbert Simon 和 Seymour Papert,他們是我十年工作中關係最密切的同事。Papert 的觀點貫穿了這篇文章。

本文分為三部分,分別闡述了計算理論、程式語言和教育中形式與內容的混淆。

  1. 計算理論

要建立一個理論,需要對主題的基本現象有深入的了解。在計算理論中,我們對這些現象的了解還遠遠不夠,無法非常抽象地教授這門學科。相反,我們應該更多地講授我們現在完全理解的具體例子,並希望從中能夠猜測和證明更普遍的原則。我這樣說並不是因為對那些可能正確但尚未證實的事情持保守態度。我認為我們許多看似常識的信念是錯誤的。我們對時間與記憶體之間可能的交換、時間與程式複雜度之間的權衡取捨、軟體與硬體、數位與類比電路、序列與平行計算、關聯式與定址記憶體等等,都存在錯誤的觀念。ƒ

與物理學進行類比是很有啟發性的,在物理學中,大部分基礎知識可以組織成一系列相當簡潔的守恆定律。當然,這只是一種描述方式;人們可以使用微分方程、最小作用量原理、平衡定律等等。例如,能量守恆可以解釋為定義了各種形式的位能和動能之間的交換,例如高度和速度平方之間,或者溫度和壓力-體積之間。人們可以將量子理論的發展建立在位置和動量的確定性之間,或者時間和能量之間的權衡取捨之上。這並沒有什麼特別之處;任何具有合理平滑解的方程都可以被視為定義了其變量之間的某種權衡取捨。但是有很多方法來表述事物,過於依賴某種特定的形式或定律是有風險的,以至於讓人相信它是唯一的原則。參見 Feynman [1] 關於此的論文。

儘管如此,認識到交換往往是一門科學的構想,如果量化它們是它的誕生。在計算領域,我們有什麼具有這種特性的東西呢?在遞迴函數理論中,我們有 Shannon [2] 的觀察,即任何具有 Q 個狀態和 R 個符號的圖靈機都等價於一個具有 2 個狀態和 nQR 個符號的機器,以及一個具有 2 個符號和 n'QR 個狀態的機器,其中 n 和 n' 是小數。因此,狀態-符號乘積 QR 在機器分類中具有近乎不變的性質。不幸的是,人們不能將這個乘積等同於一個有用的機器複雜度度量,因為這反過來又與機器的編碼過程的複雜度存在權衡取捨——而這種權衡取捨似乎過於難以捉摸,無法實際應用。

讓我們考慮一個更基本但仍然令人費解的權衡取捨,即加法和乘法之間的權衡。計算一個 3 X 3 行列式需要多少次乘法?如果我們將其展開為六個三項式,我們需要十二次乘法。如果我們使用分配律提取因子,這可以減少到九次。在這種情況下以及 n X n 的情況下,最小次數是多少,以及如何證明它?重要的不是我們需要答案。而是我們不知道如何判斷或證明提出的答案是正確的!對於一個特定的公式,也許可以使用某種窮舉搜索,但那無法建立一個普遍規則。我們的首要研究目標之一應該是發展方法來證明特定的程序在各種意義上是計算上最小的。

關於乘法本身的一個驚人發現在 S.A. Cook [3] 的論文中被提出,該論文使用了 A.L. Toom 的一個結果,正如 Knuth [4] 所討論的那樣。考慮計算十進制數乘法的普通演算法:對於兩個 n 位數,這需要 n 平方次單位數乘積。通常認為這是最小的。但是假設我們將數字分成兩半,使得乘積為 N = (#A+B)(#C+D),其中 # 代表乘以 10n/2。(左移操作被認為成本可忽略不計。)那麼可以驗證

N = ##AC + BD + #(A+B)(C+D) - #(AC+BD)。

這只涉及三次半長度乘法,而不是人們可能認為需要的四次。對於大的 n,這種簡化顯然可以對較小的數字反覆應用。代價是加法次數不斷增加。透過綜合這個想法和其他想法,Cook 證明了對於任何 e 和足夠大的 n,乘法需要的乘積次數少於 n*(1-e) 次,而不是預期的 n 平方次。同樣,V. Strassen 最近證明,要乘以兩個 m x m 矩陣,乘積的數量可以減少到 log2*m 的數量級,而人們一直認為這個數量必須是立方的,因為結果中有 n 平方項,每一項似乎都需要一個單獨的內積,包含 m 次乘法。在這兩種情況下,普通的直覺長期以來都是錯誤的,錯得如此離譜,以至於顯然沒有人去尋找更好的方法。我們仍然沒有一套足夠的證明方法來精確確定在矩陣情況下,乘法和加法之間的最小權衡交換是什麼。

乘法-加法交換本身可能看起來並不至關重要,但如果我們不能徹底理解如此簡單的事情,我們在處理任何更複雜的事情時都可能會遇到嚴重的麻煩。

考慮另一個權衡取捨,即記憶體大小和計算時間之間的權衡。在我們的書 [5] 中,Papert 和我提出了一個簡單的問題:給定一個任意的 n 位元字詞集合,需要多少次記憶體引用才能判斷出其中哪個字詞與任意給定字詞最接近(以相同的位元數衡量)?由於有很多方法可以編碼「庫」集合,有些方法比其他方法使用更多記憶體,因此更精確地陳述這個問題是:記憶體大小必須如何增長才能實現記憶體引用次數的給定減少?這一點是顯而易見的:如果記憶體足夠大,只需要一次引用,因為我們可以使用問題本身作為地址,並將答案儲存在該地址的暫存器中。但是如果記憶體剛好足夠儲存庫中的資訊,那麼就必須搜索整個庫——而我們不知道任何有價值的中間結果。這無疑是資訊檢索的一個基本理論問題,但似乎沒有人知道如何為這個基本的權衡取捨設定一個好的下限。

另一個是序列-平行交換。假設我們有 n 台計算機而不是只有一台。我們能將哪些種類的計算加速多少?對於某些計算,我們肯定可以獲得 n 倍的加速。但這種情況很少見。對於其他計算,我們可以獲得 log n 的加速,但很難找到任何這樣的計算或證明它們的性質。而對於大多數計算,我認為,我們幾乎無法獲得任何加速;這是在存在許多高度分支的條件語句的情況下,因此對可能的分支進行前瞻通常是浪費的。我們對此幾乎一無所知;大多數人抱著肯定不正確的樂觀態度認為,平行化通常是加速大多數計算的一種有利方式。

這些只是關於計算權衡取捨的一些了解甚少的問題。沒有篇幅討論其他的,例如數位-類比問題。(一些關於局部計算與全局計算的問題在 [5] 中有概述。)我們對數值計算和符號計算之間的交換知之甚少。

在今天的計算機科學課程中,很少關注關於這些問題的已知知識;幾乎所有的時間都用於形式化的句法語言類型分類、失敗主義的不可解性理論、關於系統程式設計的民間傳說,以及通常是「邏輯設計優化」的瑣碎片段——後者通常是在啟發式程式設計的藝術遠遠超過那些被嚴酷地教授和測試的特殊情況「理論」的情況下——以及幾乎肯定在學生畢業前就會過時的關於程式設計風格的呼籲。即使是那些看似最抽象的關於遞迴函數理論和形式邏輯的課程,似乎也忽略了少數已知的關於證明編譯器事實或程式等價性的有用結果。大多數課程將人工智慧領域的工作成果,有些已經有十五年歷史,視為一系列外圍的特殊應用,而它們實際上代表了對真實計算問題進行經驗和理論探索的最大體系之一。除非所有這些對形式的關注被對計算中實質性問題的關注所取代,否則一個年輕的學生最好避免大部分計算機科學課程,學習程式設計,盡可能多地掌握數學和其他科學知識,並研究人工智慧、複雜性和優化理論的當前文獻。

  1. 程式語言

即使在程式語言和編譯器領域,也過於關注形式。我說「即使」是因為人們可能會覺得這是一個形式理應是主要關注點的領域。但讓我們考慮兩個斷言:(1)語言的語法變得過多,(2)語言的描述使用了過多的語法。

編譯器對表達式、斷言和描述的意義關注不夠。使用上下文無關文法來描述語言片段,無論是在規範還是實現上,都帶來了統一性的重要進步。但是,儘管這在簡單情況下效果很好,但在更複雜的領域嘗試使用它可能會阻礙發展。使用文法來描述涉及執行以及指定過程的自我修改或自擴展語言存在嚴重問題。人們無法從語法上——也就是靜態地——描述一個正在變化的語言的有效表達式。當然,語法擴展機制必須被描述,但如果這些是用現代模式匹配語言(如 Snobol、Convert [6] 或 Matchless [7])給出的,那麼解析程式和語言描述本身之間就不需要有區別。未來的計算機語言將更關心目標,而較少關心程式設計師指定的過程。下面的論點有點極端,但鑑於今天對形式的關注,這種過度強調不會造成傷害。(下面的一些想法歸功於 C. Hewitt 和 T. Winograd。)

2.1. 語法通常是不必要的。人們可以比通常意識到的用少得多的語法生存下來。許多程式設計語法都與抑制括號或強調作用域標記有關。有一些替代方案一直未被充分利用。

請不要認為我反對在人機介面上使用中綴和運算符優先級等裝置。它們有它們的位置。但它們對整個計算機科學的重要性被如此誇大,以至於開始腐蝕年輕一代。

考慮一下熟悉的平方根演算法,正如它可能用現代代數語言編寫的那樣,忽略諸如數據類型聲明之類的事情。要求計算 A 的平方根,給定初始估計 X 和誤差限制 E。

DEFINE sqrt(A, X, E): if abs(A - X*X) < E then X else sqrt(A, (X + (A /X))/2, E)

在 LISP 的一個版本中(參見 Levin [8] 或 Weissman [9]),同樣的過程可能寫成:

(DEFINE (sqrt A X E) (IF (less(ABS(minus(A times(X X)) E) THEN X ELSE (sqrt A quotient(plus(X quotient(A X)) 2) E)) )

在這裡,函數名稱緊跟在它們的括號內。對於人類來說,寫出所有括號的笨拙是顯而易見的;不必學習所有約定,例如 (X + A / X) 是 (+X (/ A X)) 而不是 (/ X A) X),其優點卻常常被忽視。

具有明確分隔符的語法是反動的,還是未來的潮流,還有待觀察。它對於編輯、解釋以及由其他程式創建程式具有重要優勢。LISP 的完整語法可以在一個小時左右學會;解釋器緊湊且不太複雜,學生通常可以透過閱讀解釋器程式本身來回答關於系統的問題。當然,這不會回答關於一個真實、實用實現的所有問題,但任何可行的語法規則集也不會。此外,儘管該語言笨拙,但許多前沿工作者認為它具有出色的表達能力。幾乎所有透過建立和修改假設來解決問題的程序都是用這種或相關語言編寫的。不幸的是,語言設計者通常不熟悉這個領域,並傾向於將其視為「符號操作技術」的一個專門體系而加以摒棄。

透過使用縮排和其他位於語言本身之外的佈局裝置,可以在這種「語法弱」的語言中做很多事情來闡明表達式的結構。例如,可以使用屬於輸入預處理器的「延遲」(postponement) 符號將上述內容重寫為:

DEFINE (sqrt A X E) V. IF V THEN X ELSE V. LESS (ABS V ) E. A (*X X).

 SQRT A V E.
   / V 2.
     + X (/ A X)

其中點表示“)(",V 表示「在此處插入下一個可用表達式,該表達式在其 V 被(遞迴地)替換後可用」。縮排是可選的。這透過兩個簡單的裝置獲得了通常作用域指示符和約定的大部分效果,這兩個裝置都可以透過讀取程式來輕鬆處理,並且由於子表達式通常在每行上都是完整的,因此易於編輯。

為了理解延遲運算子的能力和局限性,讀者應該使用他們喜歡的語言和演算法來看看會發生什麼。會有許多選擇,關於延遲什麼、強調哪些參數等等。當然,V 並非所有問題的答案:人們還需要一個用於列表片段的延遲裝置,而這需要它自己的分隔符。無論如何,這些只是朝著更圖形化的程式描述系統邁出的步驟,因為我們不會永遠局限於僅僅是符號串。

另一個說明性的裝置,由 Dana Scott 提出,是使用替代的括號來表示從右到左的函數組合,這樣當人們想更自然地表示一個量在計算過程中的變化時,可以寫成 <<h>g>f 而不是 f(g(h(x)))。這允許不同的「重音」,如在 f(<h (x) >g) 中,可以讀作:「計算 f 應用於你先計算 h(x) 然後將 g 應用於它的結果。」

這個觀點或許透過類比比透過例子更能說明。語言設計者在他們對語法的狂熱關注中,變得過於以句子為導向。有了像 V 這樣的裝置,人們可以構建更像是段落的物件,而無需完全退回到流程圖。

今天的高級程式語言在風格靈活性方面提供的表達能力很小。人們無法在不改變演算法本身的情況下很好地控制思想呈現的順序。

2.2 效率與理解程式。編譯器是做什麼的?通常的答案類似於「從一種語言翻譯到另一種語言」或「獲取一個演算法的描述並將其組裝成一個程式,填補許多小細節。」對於未來,需要一個更宏大的視角。大多數編譯器將是「根據其效果的描述來產生一個演算法」的系統。現代圖片格式系統已經是這種情況;它們完成了所有的創造性工作,而用戶僅僅提供所需格式的例子:在這裡,編譯器比用戶更專業。模式匹配語言也是很好的例子。但是除了一些這樣的特殊情況外,編譯器設計者在編寫好程式方面進展甚微。識別公共子表達式、優化內循環、分配多個暫存器等等,只會帶來效率上的微小線性改進——而編譯器甚至在這些方面也做得很少。自動儲存分配可能更有價值。但真正的回報在於分析演算法本身的計算內容,而不是程式設計師編寫它的方式。例如,考慮:

DEFINE FIB(N): if N = 1 then 1, if N = 2 then 1, else FIB (N–1) + FIB(N–2).

評估步驟分支樹
評估步驟分支樹

這個斐波那契數列 1, 1, 2, 3, 5, 8, 13, ... 的遞迴定義可以提供給任何像樣的演算法語言,並將導致圖 1 所示的評估步驟的分支樹。

可以看到,機器將完成的工作量隨 N 呈指數增長。(更精確地說,它經歷了 FIB(N) 次定義的評估。)有更好的方法來計算這個函數。因此,我們可以定義兩個臨時暫存器並在

DEFINE FIB (N A B): if N = 1 then A else FIB(N-1, A+B ,A).

中評估 FIB(N, 1, 1),這是單遞迴的,避免了分支樹,甚至可以使用

      A = 0
      B = 1

LOOP SWAP A B if N=1 return A N = N-1 B = A+B Goto LOOP

任何程式設計師一旦看到分支評估中發生的情況,很快就會想到這些。這是一個「過程值」遞迴 (course-of-values recursion) 可以轉換為簡單迭代的情況。今天的編譯器甚至無法識別這種轉換的簡單情況,儘管指數級的減少超過了局部程式碼「優化」可能帶來的任何收益。抗議說這種收益很少見或者說這些事情是程式設計師的責任是沒有用的。如果節省編譯時間很重要,那麼可以刪除這些能力。例如,對於用模式匹配語言編寫的程式,這種簡化確實經常進行。透過為 BNF 系統編譯一個高效的樹解析器,通常比執行蠻力的分析-綜合 (analysis-by-synthesis) 更有利。

誠然,這種轉換的系統理論是困難的。一個系統必須非常聰明才能檢測哪些轉換是相關的以及何時使用它們是有利的。由於程式設計師已經知道他的意圖,如果提議的演算法伴隨著(甚至被替換為)一個合適的目標聲明表達式,問題通常會更容易。

為了朝這個方向發展,我們需要關於分析和綜合程式的知識體系。在理論方面,現在有很多關於演算法和模式的等價性研究,以及關於證明程序具有所述屬性的活動。在實踐方面,W.A. Martin [10] 和 J. Moses [11] 的工作說明了如何製作系統,這些系統對特定數學技術的符號轉換有足夠的了解,能夠顯著補充其用戶的應用數學能力。

程式歸約問題 (program-reduction problem) 在一般情況下是遞迴不可解的,這一事實沒有實際後果。無論如何,人們期望程式最終在這項活動中遠遠超過人類的能力,並以形式上純化的形式利用大量的程式轉換。這些轉換不容易直接應用。相反,可以預期其發展將遵循我們在符號積分中看到的路線,例如 Slagle [12] 和 Moses [11] 中的那樣。首先開發了一組簡單的形式轉換,對應於積分表的基本條目。在此基礎上,Slagle 建立了一套啟發式技術,用於將實際問題進行代數和分析轉換,轉換成那些已經理解的元素;這涉及一套可以說是使用「模式識別」的表徵和匹配程序。在 Moses 的系統中,匹配程序和轉換都得到了如此精煉,以至於在大多數實際問題中,在 Slagle 程式性能中起重要作用的啟發式搜索策略變成了對 Moses 系統中包含的確定知識及其熟練應用的次要補充。一個啟發式編譯器系統最終將需要比符號積分系統更普遍的知識和常識,因為它的目標更像是製造一個完整的數學家,而不是一個專門的積分器。

2.3 描述程式設計系統。無論一種語言如何被描述,計算機都必須使用一個程序來解釋它。應該記住,在描述一種語言時,主要目標是解釋如何用它編寫程式以及這些程式的含義。主要目標不是描述語法。

在語法規則、範式、Post 產生式以及其他此類方案的靜態框架內,人們獲得了相當於具有公理、推理規則和定理的邏輯系統。因此,設計一個無歧義的語法就相當於設計一個每個定理只有唯一證明的數學系統!但在計算框架中,這完全離題了。人們有一個額外的成分——控制——它位於邏輯系統的通常框架之外;一組額外的規則,指定何時使用推理規則。所以,對於許多目的來說,歧義是一個偽問題。如果我們將程式視為一個過程,我們可以記住我們最強大的過程描述工具是程式本身,它們本質上是無歧義的。

透過一個程式來定義一個程式語言並不存在悖論。當然,這個程序性定義必須被理解。人們可以透過用另一種語言編寫的定義來實現這種理解,這種語言可能不同、更熟悉或比被定義的語言更簡單。但使用同一種語言通常是實用、方便且恰當的!因為要理解這個定義,人們只需要知道那個特定程式的運作方式,而不需要了解該語言所有可能應用的所有含義。正是這種特殊化使得自舉 (bootstrapping) 成為可能,這一點常常讓初學者以及明顯的權威人士感到困惑。

使用 BNF 來描述表達式的構成可能會阻礙新語言的發展,這些新語言將引用、自修改和符號操作平滑地整合到傳統的演算法框架中。這反過來又阻礙了朝著解決問題、面向目標的程式設計系統的進展。矛盾的是,儘管現代程式設計思想是因為過程難以用經典數學符號描繪而發展起來的,但設計者們卻在恰恰需要程式的情況下,轉向了一種早期的形式——方程式。在第 3 節,關於教育的部分,可以看到在教學中也存在類似的情況,其後果可能更為嚴重。

  1. 學習、教學與「新數學」

教育是計算機科學家混淆形式與內容的另一個領域,但這次混淆涉及他的專業角色。他認為他的主要職能是為新舊教育方案提供程式和機器。這很好,但我相信他有更複雜的責任——制定和傳達教育過程本身的模型。

在下面的討論中,我簡要地勾勒了(與 Seymour Papert 共同發展的)這種信念所源自的觀點。以下陳述是我們觀點的典型代表:

– 幫助人們學習就是幫助他們頭腦中建立各種計算模型。 – 這最好由一位老師來完成,這位老師的頭腦中有一個合理的模型,了解學生頭腦中的內容。 – 出於同樣的原因,學生在調試自己的模型和程序時,應該對自己正在做的事情有一個模型,並且必須知道好的調試技術,例如如何制定簡單但關鍵的測試案例。 – 了解一些計算模型和程式設計對學生會有幫助。例如,調試 [註 2] 本身的概念就是一個非常強大的概念——與我們文化遺產中關於天賦、才能和資質所助長的無助感形成對比。後者鼓勵「我不擅長這個」,而不是「我怎樣才能讓自己在這方面做得更好?」

這些聽起來像是常識,但它們並不是任何流行教育方案的基本原則之一,例如「操作性強化」(operant reinforcement)、「發現式學習」(discovery methods)、視聽協同作用 (audio-visual synergism) 等。這不是因為教育工作者忽視了心智模型的可能性,而是因為在思想過程模擬工作開始之前,他們根本沒有有效的方法來描述、構建和測試這些想法。

我們不能在這裡離題去回答那些認為將心智與程式進行比較過於簡單化(如果不是不敬,或猥褻)的懷疑論者。我們可以將這些批評者引向 Turing 的論文 [13]。對於那些認為答案不可能存在於任何機器,無論是數位的還是其他的機器中的人,可以爭論 [14] 說,機器在變得智能時,很可能也會有同樣的感覺。關於這個領域的一些概述,參見 Feigenbaum 和 Feldman [15] 以及 Minsky [16];在這個快速發展的領域,只有透過閱讀當代關於人工智慧的博士論文和會議論文,才能真正跟上最新進展。

有一個基本的實用觀點支持我們的主張。孩子需要模型:為了理解城市,他可能會使用有機體模型:它必須吃、呼吸、排泄、防禦等等。這不是一個很好的模型,但足夠有用。他可以透過與引擎的比較來理解真實有機體的新陳代謝。但是要為他自己建模,他不能使用引擎、有機體、城市或電話交換機;除了帶有程式及其錯誤的計算機之外,沒有任何東西能起作用。最終,程式設計本身在早期教育中甚至會變得比數學更重要。儘管如此,我選擇數學作為本文其餘部分的主題,部分原因是我們對它理解得更好,但主要是因為對程式設計作為一門學術科目的偏見會引起太多的抵制。我想,任何其他科目也可以,但數學問題和概念最清晰,最少受到高度情緒化問題的混淆。

3.1 一個幼兒的數學肖像。

想像一個五到六歲之間,即將進入一年級的小孩。如果我們推斷今天的趨勢,他的數學教育將由指導不善的老師進行,部分由程式設計不佳的機器進行;兩者都無法對「正確」和「錯誤」答案之外的東西做出太多反應,更不用說對孩子的行為或言論做出合理的解釋,因為兩者都不包含好的兒童模型,或好的兒童智力發展理論。孩子將從簡單的算術、集合論和一點幾何學開始;十年後,他將對實數的形式理論了解一點,對線性方程了解一點,對幾何學了解更多一點,而對連續和極限過程幾乎一無所知。他將成為一個對分析性思維興趣不大、無法將十年經驗應用於理解他新世界的青少年。

讓我們更仔細地看看我們的小孩,這是一幅綜合了 Piaget 和其他兒童心智建構觀察者工作的複合圖景。

我們的孩子將能夠說「一、二、三…」至少到三十,可能到一千。他會知道一些更大數字的名稱,但例如,他無法理解為什麼一萬是一百個一百。除非他最近對此非常感興趣,否則他在倒數方面會有嚴重的困難。(擅長倒數會使簡單的減法更容易,也許值得一些練習。)他對奇數和偶數沒有太多感覺。

他可以非常可靠地數四到六個物體,但對於十五個散落的物體,他每次數的結果不會相同。他會對此感到惱火,因為他非常確定每次都應該得到相同的數字。因此,觀察者會認為孩子對數字概念有很好的理解,只是在應用上不太熟練。

然而,按照成人標準,他數字概念的重要方面將一點也不穩固。例如,當物體在他眼前重新排列時,他對其數量的印象會受到幾何排列的影響。因此,對於:

圓圈比方塊多
圓圈比方塊多

他會說「圓圈比方塊多」,但當我們將排列改變為:

圓圈比方塊少
圓圈比方塊少

孩子會回答「圓圈比方塊少」。當然,他(在他自己的腦海中)回答的是一個關於大小的不同問題,非常正確,但這正是問題的關鍵:在這種情況下,數字的不變性對他幾乎沒有約束力。儘管在被提問時他表示知道事物的數量不會僅僅因為它們被重新排列而改變,但他無法有效地利用它進行推理。同樣,當水從一個玻璃杯倒入另一個玻璃杯時(圖 2(a)),他會說高罐子裡的水比矮胖罐子裡的多。他對平面面積的估計會很差,以至於我們無法找到一個他將圖 2(b) 中較大面積視為較小面積四倍的環境。順便說一句,當他成年後,給他兩個容器,一個在所有維度上都是另一個的兩倍大(圖 2(c)),他會認為那個容器大約能裝另一個的四倍:他可能永遠不會獲得更好的體積估計。

圓2
圓2

至於數字本身,我們對他腦子裡的東西知之甚少。根據 Galton [17] 的說法,一百個孩子中有三十個會將小數字與他們身體意象前方空間中的確定視覺位置聯繫起來,以某種奇特的方式排列,例如圖 3 所示的方式。他們可能在成年後仍然保留這些,並可能以某種模糊的半意識方式使用它們來記住電話號碼;他們可能會為歷史日期等形成不同的空間視覺表徵。老師們從未聽說過這樣的事情,如果一個孩子談論它,即使是擁有自己「數字形式」的老師也不太可能以認可的方式回應。(我的經驗是,需要一系列精心設計的問題,這些成年人中的一個才會回答:「哦,是的;3 在那邊,稍微靠後一點。」)當我們的孩子學習列式加法時,他可能會透過將舌頭抵住某些牙齒來記錄進位,或者使用其他一些晦澀的裝置來臨時記憶,沒有人會知道。也許有些方法比其他方法更好。

圓3,4
圓3,4

他的幾何世界與我們的不同。他不能清楚地看到三角形是剛性的,因此不同於其他多邊形。他不知道一個 100 條線近似的圓與一個圓是無法區分的,除非它非常大。他不會畫透視立方體。他最近才意識到正方形放在角上就變成了菱形。這種感知上的區別在成年人中仍然存在。因此,正如 Attneave [18] 所指出的,在圖 4 中我們看到,正方形與菱形的印象受到場景中其他對齊方式的影響,顯然是透過決定我們選擇哪個對稱軸來用於主觀描述。

我們的孩子對封閉性的拓撲概念理解得很好。為什麼?這在經典數學中是一個非常複雜的概念,但就計算過程而言,也許並不那麼困難。但是我們的孩子幾乎肯定會對圖 5 中的情況感到困惑(參見 Papert [19]):「當巴士開始繞湖行駛時,一個男孩坐在遠離水的一側。在旅途中的某個時刻,他會在靠湖的一側嗎?」

水

這種困難很可能會持續到孩子的八歲,也許與他在其他抽象雙重反轉方面的困難有關,例如減去負數,或者與理解連續性的其他後果有關——「在旅途的哪個點上那個屬性會改變?」

我們的肖像在發展心理學文獻中有更詳細的描繪。但還沒有人建立起足夠的兒童計算模型,來看看這些能力和局限性如何聯繫在一起,形成一個與他能如此有效完成的其他事情相容(也許是其結果)的結構。然而,這樣的工作已經開始,我預計未來十年在這些模型上將取得實質性進展。

如果我們對這些事情了解更多,我們也許能幫助孩子。目前,我們甚至沒有好的診斷方法:他表面上學習對形式化問題給出正確答案的能力,可能只表明他已經開發了一些孤立的庫例程。如果這些例程因為使用不相容的數據結構或其他原因而無法被他的核心問題解決程式調用,我們可能會得到一個高分通過考試但永遠不會思考得很好的人。在計算出現之前,關於思想本質的觀念共同體太過薄弱,無法支持一個有效的學習和發展理論。行為主義者的有限狀態模型、弗洛伊德主義者的液壓和經濟類比,以及格式塔主義者的帽子裡變出兔子的洞見,都沒有提供足夠的成分來理解如此複雜的課題。它需要一個由相關但更簡單問題的已調試理論和解決方案組成的基底。現在我們有了大量關於思考的思考的這樣明確定義和實現的想法;只有一小部分在傳統心理學中有所體現:

符號表 純過程 分時 函數調用 函數參數 記憶體保護 分派表 錯誤訊息 追蹤程式 斷點 語言 閉合子例程 下推列表 中斷 通信單元 公共儲存 決策樹 硬體-軟體權衡取捨 序列-平行權衡取捨 時間-記憶體權衡取捨 條件斷點 異步處理器 編譯器 間接地址 宏 屬性列表 數據類型 哈希編碼 微程式 格式匹配 解釋器 垃圾回收 列表結構 前瞻 診斷程式 執行程式

這些只是通用系統程式設計和調試中的一些想法;我們還沒有提到語言、人工智慧、計算機硬體或其他高級領域中更多具體相關的概念。所有這些如今都作為一種奇特而複雜的工藝——程式設計——的工具。但正如天文學在克卜勒定律之後取代了占星術一樣,在機器智能過程的經驗探索中發現原理應該會引導出一門科學。

回到我們的孩子,我們的計算思想如何幫助他建立數字概念?作為嬰兒,他學會了識別某些特殊的配對配置,例如兩隻手或兩隻鞋。很久以後,他學會了一些關於三的概念——也許這段長長的間隔是因為環境中沒有很多固定的三元組:如果他碰巧找到三枚硬幣,他很可能很快就會丟失或得到一枚。最終,他會找到一些能夠處理五六樣東西的程序,他將不再受制於尋找和丟失。但對於超過六七樣東西,他將仍然受制於遺忘;即使他的口頭計數完美無瑕,他的枚舉程序也會有缺陷。他會漏掉一些項目,而把另一些數了兩次。我們可以透過提出更好的程序來幫助他;把東西放進盒子裡幾乎是萬無一失的,劃掉它們也是如此。但對於固定的物體,他將需要一些心智分組程序。

首先應該嘗試了解孩子正在做什麼;眼動研究可能會有所幫助,問他可能就足夠了。他可能正在用一些不可靠的、近乎隨機的方法選擇下一個項目,沒有好的方法來追蹤已經數過的。我們可能會建議滑動一個游標:發明容易記住的組;畫一個粗略的網格。

在每種情況下,構造可以是真實的,也可以是想像的。在使用網格方法時,必須記住不要重複計算跨越線條的物體。老師應該展示提前計劃是好的,如圖 6 所示,扭曲網格以避免歧義!從數學上講,重要的概念是「每個正確的計數程序都會產生相同的數字」。孩子會明白任何滿足以下條件的演算法都是正確的:(1)數了所有物體,(2)沒有把任何物體數兩次。

圖6
圖6

也許這個程序性條件看起來太簡單了;即使是成年人也能理解它。無論如何,這不是今天普遍稱為「新數學」並在我們小學教授的數字概念。下面的論戰討論了這一點。

3.2 「新數學」。這指的是近期一些小學試圖模仿專業數學家形式主義成果的嘗試。在對早期教育廣泛關注的浪潮中,許多學校倉促採用了這種方法,我認為由於幾種形式與內容的錯位,這種方法總體上是糟糕的。這些錯位給老師和孩子都帶來了問題。

由於形式主義的方法,老師在處理表述問題方面將無法給予孩子太多幫助。因為當她訓練他諸如空集與虛無之間的區別,或者「數碼」3+5 與作為數字八的「常用名」的數碼 8 之間的區別時,她自己也會感到不安全,希望他不會問分數 8/1 的常用名是什麼,這可能不同於有理數 8/1,也不同於有序對 (8,1)。她會對討論平行線保持沉默。因為她知道,平行線通常不相交,但(她聽說過)如果延伸得足夠遠,它們可能會相交,因為不是有一次在一些俄羅斯數學家的實驗中發生過類似的事情嗎?但老師的問題就說到這裡:現在讓我們從孩子的角度考慮三類反對意見。

發展性反對意見:堅持讓孩子將知識保持在一個簡單有序的層級結構中是非常糟糕的。為了檢索他需要的東西,他必須有一個多重連接的網絡,這樣他才能嘗試多種方法來做每件事。他可能無法將第一種方法與問題的需求相匹配。現階段強調「形式證明」是破壞性的,因為尋找證明和理解證明所需的知識遠比證明中提到的知識複雜得多(且用處不大)。理解幾何學所需的知識網絡是由範例、現象以及對它們之間異同的觀察構成的網。人們在兒童身上找不到證據表明這樣的網絡像邏輯系統的公理和定理那樣有序,或者孩子即使擁有這樣的格狀結構也能使用它。在理解了一個現象之後,為它建立一個形式系統,以便更容易地理解更高級的東西,可能非常有價值。但即便如此,這樣一個形式系統也只是眾多可能模型中的一個:新數學的作者們似乎將他們的公理-定理模型與數系本身混淆了。就算術公理而言,我現在要論證,這種形式主義對於理解更高級的東西往往弊大於利。

從歷史上看,「新數學」中使用的「集合」方法源於形式主義者試圖從近乎有限的集合論中推導出連續統的直觀屬性。他們在這個絕技(或者像一些程式設計師會說的「hack」)上部分成功了,但方式如此複雜,以至於如果遵循這個模型,直到高中階段才能認真地討論實數。拓撲學的思想被推遲到更晚。但是六歲的兒童已經有了發展良好的幾何和拓撲思想,只是他們幾乎沒有能力操作抽象符號和定義。我們應該從孩子的強項出發進行建設,而不是試圖用他還無法處理的結構取代他已有的東西來削弱他。但這正是數學家的做法——當然是世界上最糟糕的闡述者——他們會想:「你可以教給孩子任何東西,只要你把定義弄得足夠精確就行了」,或者「如果我們第一次就把所有的定義都弄對了,以後就不會有任何麻煩了。」我們不是在用 Fortran 編寫一個空機器:我們在干預一個理解不深的龐大系統,這個系統的特點是在其正常的啟發式行為中使用多重定義的符號。

直覺性反對意見:「新數學」強調數字可以等同於所有能一一對應的集合的等價類的觀點。然後有理數被定義為整數對的等價類,並引入了一大堆形式主義來阻止孩子將有理數等同於商或分數。函數通常被視為集合,儘管有些教科書將它們呈現為帶有表面演算法風格的「函數機器」。

「變數」的定義是另一個涉及名稱、值、表達式、子句、句子、數碼、「指示運算」等等的極其複雜的迷宮。(事實上,在實際問題解決中存在如此多不同種類的數據,以至於現實生活中的數學家通常不給它們形式上的區分,而是使用整個問題背景來解釋它們。)在追求這種形式主義執念的過程中,課程從未呈現出任何關於真實數學現象或過程,無論是離散的還是連續的;關於其符號語法所涉及的代數;或關於幾何學的連貫圖景。那些時不時被「證明」的「定理」,例如「一個數 x 只有一個加法逆元 -x」,是如此平凡和顯而易見,以至於老師和學生都無法理解證明的目的。「官方」證明會將 y 加到 x + (-y) = 0 的兩邊,應用結合律,然後是交換律,然後是 y + (-y) = 0 定律,最後是等式公理,來證明 y 必須等於 x。孩子的頭腦更容易理解更深層次的想法,比如「在 x + (-y) = 0 中,如果 y 小於 x,就會有剩餘;而如果 x 小於 y,就會剩下一個負數——所以它們必須完全相等。」孩子不被允許使用這種順序加連續性的思維,大概是因為它使用了「更高級的知識」,因此不屬於「真正的證明」。但在孩子需要的思想網絡中,這個連結具有同等的邏輯地位,並且肯定具有更大的啟發式價值。再舉一個例子,學生被迫清楚地區分加法的逆運算和距離的相反方向——這種區分似乎完全違背了融合這些概念的看似可取的做法。

計算性反對意見:程序的概念,以及從學習如何測試、修改和調整程序中獲得的知識,可以轉移到孩子的許多其他活動中。傳統的學術科目,如代數和算術,其發展意義相對較小,尤其是當它們在直觀幾何方面較弱時。(哪種學習可以「轉移」到其他活動的問題是教育理論中的一個基本問題:我再次強調我們的猜想,即程序和調試的概念在其可轉移性方面將被證明是獨一無二的。)在代數中,正如我們已經指出的,「變數」的概念很複雜;但在計算中,孩子可以很容易地將「x+y+z」視為描述一個程序(任何用於加法的程序!),其中「x」、「y」和「z」指向其「數據」。函數作為程序很容易掌握,如果想像成有序對就很難。如果你想要一個圖形,描述一個繪製圖形的機器;如果你有一個圖形,描述一個可以讀取它以查找函數值的機器。兩者都是簡單而有用的概念。

我們不要陷入文化陷阱:集合論的數學「基礎」在今天的數學家中很受歡迎,因為那是他們(在大學裡)攻克並掌握的。這些科學家通常不熟悉計算,也不熟悉 Post-Turing-McCulloch-Pitts-McCarthy-Newell-Simon 等理論家族,這些理論在孩子們長大後將變得重要得多。集合論並不像邏輯學家和出版商所說的那樣,是數學唯一真正的基礎;它是一個對於研究超限數相當不錯的觀點,但對於理解實數則平淡無奇,對於學習算術、代數和幾何則相當不合格。

總結我的反對意見,「新數學」強調形式主義和符號操作的使用,而不是學科的啟發式和直觀內容。孩子被期望學會如何解決問題,但我們並沒有教給他我們所知道的,無論是關於學科本身還是關於問題解決的方法。[註 3]

作為一個例子,說明對形式(在這種情況下,算術公理)的關注如何扭曲人們對內容的看法,讓我們來審視一下那種奇怪的強制觀念,即堅持認為加法最終只是兩個量的運算。在新數學中,a+b+c 必須「真正」是 (a+(b+c)) 或 ((a+b)+c) 中的一個,而 a+b+c+d 只有在多次應用結合律之後才有意義。現在,這在許多情況下是愚蠢的。孩子已經對把幾個集合放在一起意味著什麼有了很好的直觀理解;混合五種顏色的珠子和混合兩種一樣容易。因此,加法已經是一個 n 元運算。但聽聽書本試圖證明事實並非如此的說法:

「加法總是……對兩個數進行的。乍一看這可能不合理,因為你經常將一長串數字相加。對自己做個實驗。試著同時加上數字 7、8、3。無論你如何嘗試,你都不得不選擇其中的兩個數,將它們相加,然後將第三個數加到它們的和上。」——摘自九年級教科書

一座塔的高度是透過按特定順序將其各層兩兩相加得到的結果嗎?一個物體的長度或面積是透過這種方式由其各部分產生的嗎?他們為什麼要引入他們的集合和一一對應,然後又錯失了要點?顯然,他們已經說服自己相信,他們為代數選擇的公理具有某種特殊的真理性!

讓我們考慮一些在小學裡不怎麼討論的重要而優美的思想。首先考慮級數 1/2 + 1/4 + 1/8 +… 解釋為面積,可以得到一些有趣的重組想法,如圖 7 所示。

圖7
圖7

一旦孩子知道如何做除法,他就能計算並理解極限過程的一些量化方面 .5, .75, .875, .9375, .96875,並且可以學習關於折疊、切割、流行病和人口的知識。他可以學習 x = px + qx 其中 p + q = 1,從而理解稀釋;他可以學習 3/4, 4/5, 5/6, 6/7, 7/8, … 以 1 為極限,並開始理解這些事情的許多豐富多彩且符合常識的幾何和拓撲後果。

但在新數學中,有理數、商和分數之間的句法區別被推到了極致,以至於要比較 3/8 和 4/9 哪個更大,人們不被允許計算並比較 .375 和 .444。相反,孩子們被迫進行交叉相乘。現在,交叉相乘非常巧妙,但它有兩個問題:(1)沒有人能記住由此產生的條件語句應該朝哪個方向分支,(2)它沒有告訴你數字之間相距多遠。順序的抽象概念非常優雅(另一套關於顯而易見事物的公理),但孩子們已經對順序理解得相當好,並且想知道數量。另一個執念是關心數基。讓孩子們清楚地理解 223 是「二百」加「二十」加「三」是好的,我認為這應該盡可能簡單化而不是複雜化。我不認為這個想法如此豐富,以至於應該訓練年幼的孩子用幾種基數進行算術!因為這個貧乏的概念幾乎無法轉移到其他事物上,而且它有可能對那些已經為 6 + 7 = 13 而煩惱、現在發現 6 + 7 = 15 的學生的脆弱算術能力造成毀滅性的打擊。此外,儘管對數基如此關注,我在我孩子的書中卻沒有看到對哪怕幾個非平凡推論的關注——那些可能證明這種關注合理性的概念,例如:

為什麼只有一種方法可以寫出一個十進制整數? 為什麼「棄九法」(casting out nines) 有效? 如果我們使用非冪次的數,例如 a + 37b + 24c +11d +. . 而不是僅僅使用 10 的冪次,會發生什麼?

如果他們不討論這些問題,他們必定有另一個目的。我的猜測是,整個大驚小怪是為了讓孩子們更好地理解乘法和除法的程序。但從發展的角度來看,這可能是一個嚴重的錯誤——無論是在舊的還是「新的」數學課程的策略中。充其量,長除法的標準演算法是笨拙的,大多數孩子永遠不會用它來探索數字現象。而且,儘管理解它的工作原理有些趣味,但寫出整個過程表明教育者相信孩子每次都應該理解這個可怕的東西!這是錯誤的。重要的思想,如果有的話,是重複減法;其餘的只是一個聰明但非必要的程式設計技巧。

如果我們能教,也許透過死記硬背,一個實用的除法演算法,那很好。但無論如何,讓我們給他們小型計算器;如果那太貴了,為什麼不用計算尺呢?不必過於詳細地解釋那些裝置究竟是如何工作的;重要的是進入實數!新數學對整數的關注如此狂熱,以至於讓我想起了數字命理學。

柯西-戴德金-羅素-懷特海集合論形式體系是一項偉大的成就——是繼歐幾里得之後一系列證明中的又一個,表明許多數學思想可以從少數原語推導出來,儘管途徑漫長而曲折。但孩子的問題在於根本無法掌握這些思想;他需要了解現實。就他可用的概念而言,整個集合論的形式體系無法與一個更古老、更簡單,也可能更偉大的思想相提並論:直觀實數線的無限不循環小數表示。

邏輯學家的目標和教育者的目標之間存在真正的衝突。邏輯學家想要最小化思想的多樣性,並且不介意一條漫長而狹窄的路徑。教育者(正確地)想要讓路徑變短,並且不介意——事實上,更喜歡——與許多其他思想的聯繫。而且他幾乎完全不關心連結的方向。

至於更好地理解整數,我認為,無數讓小孩子畫一一對應圖的練習不會有幫助。毫無疑問,這將有助於他們學習有價值的演算法,不是針對數字,而是針對繪製不交叉路徑等重要的拓撲和程序問題。正是那種現在完全被偶然處理的問題,我們應該關注。

因此,計算機科學家對教育負有責任。並非像他所想的那樣,因為他將不得不為教學機器編寫程式。當然也不是因為他是「有限數學」的熟練使用者。他知道如何調試程式;他必須告訴教育工作者如何幫助孩子們調試他們自己的問題解決過程。他知道程序如何依賴於它們的數據結構;他可以告訴教育工作者如何為孩子們準備新思想。他知道為什麼使用雙重目的的技巧,這些技巧會在以後調試和擴展程式時困擾人們,是不好的。(因此,可以透過將小數字與任意顏色相關聯來吸引孩子們的興趣。但是像這樣的技巧可能會如何影響他們以後將數字概念應用於面積、體積或價值的嘗試?)計算機科學家是必須研究這些問題的人,因為他們是程序概念的所有者,這是教育工作者長期以來一直在尋找的秘密。

[註 2] Turing 非常擅長調試硬體。他會保持電源開啟,以免失去對事物的「感覺」。今天每個人都這樣做,但現在電路都工作在三伏或五伏,情況就不同了。

[註 3] 在對新數學教科書的精闢而有趣的討論中,Feynman [20] 探討了區分事物與其自身的後果。「把球的圖片塗成紅色,」一本書說,而不是「把球塗成紅色」。「我們應該把球圖像出現的整個方形區域塗色,還是只塗球圓圈內的部分?」Feynman 問道。(要「把球塗成紅色」大概就得是「把球集合所有成員的圓圈內部塗色」或者類似的東西。)