很多人推薦了這麼一篇學術論文,題為“The Camel Has Two Humps”(駱駝有雙峰)。它提出了下面的方法,能在電腦科學專業的學生接觸到一個程式或者一門程式語言之前,判斷出他們當中哪些人適合學習程式設計,哪些人不適合。
所有教授程式設計的老師都發現,他們的教學結果呈現出“雙峰”現象。似乎他們的學生中有兩類人:一類是會程式設計的;另一類是不會程式設計的。這兩類人有著各自獨立的貝爾曲線。對於程式設計的教學,基本上所有的研究都集中在“教”上:變換語言,變換應用領域,使用一個IDE,引入激勵機制,等等。但這些統統都不奏效,“雙峰”現象依然存在。於是,我們發明了一種測試,通過它可以在授課之前把這兩類人區別開來。我們挑選“雙峰”中會程式設計的那些人。可能你現在還無法相信,但是在你看完之後,一定會相信的。我們還沒完全搞明白為什麼這種方法奏效,但我們有一些不錯的理論支援。
我不曾想到,一個擅長程式設計的人和不擅長的人在這麼早就可以被分辨出來。Dan Bricklin曾經在他的文章中提到過這個話題,文章的名字是“Why Johnny Can’t Program”(為什麼Johnny不會程式設計)。但是,對於那些教授電腦科學的人來說,這些顯然已不是祕密。
自20世紀50年代電子計算機被發明以來,儘管世界已經發生了翻天覆地的變化,但有些東西卻始終沒變。特別是,大部分人學不會程式設計:每所大學的計算機學院都有30%~60%的新生在第一門程式設計課程上不及格。有經驗的教師很清楚這種情況,但都已經心力憔悴了。一些聰明的年輕教師堅信過去的做法一定有問題,於是苦苦地探索著真相。自20世紀60年代這個課題被提出以來,已經差不多有兩代人為此付出了努力。
你也許覺得,他們提出的用於鑑定程式設計天賦的測試會很複雜。其實不然。請看下面,第一道題是這樣的:
請看清下面的語句,並在正確答案的旁邊做上標記。
int a = 10;
int b = 20;
a = b;
a和b現在的值應該是:
[ ] a = 20 b = 0
[ ] a = 20 b = 20
[ ] a = 0 b = 10
[ ] a = 10 b = 10
[ ] a = 30 b = 20
[ ] a = 30 b = 0
[ ] a = 10 b = 30
[ ] a = 0 b = 30
[ ] a = 10 b = 20
[ ] a = 20 b = 10
可以想見,專業程式設計師對此會不屑一顧。但是,別忘了,這個測試是給那些生平從未接觸過程式碼的學生設計的。另外的12道題與上面這道題的風格一樣。
這個試卷的作者們認為,學習電腦科學的最主要障礙是:
1.賦值和序列
2.遞迴、迭代
3.併發
按照這樣的順序,我們首先測試初學者最先會遇到的障礙:賦值。測試的結果把學生清楚地分成3組:
· 44%的學生對賦值的原理形成了一個穩定的思維模型(即使是錯的)。
· 39%的學生一頭霧水,對於賦值的原理仍然琢磨不透。
· 8%的學生交了白卷。
這個測試做了兩次。第一次是在學習之前,第二次是在開課三週之後。比較兩次測試的結果,最讓人吃驚的是:這3組學生的格局幾乎沒有發生任何變化。要麼你在第一次碰到賦值(程式設計中的第一個障礙)的時候就在心中立即形成了一個模型,要麼你永遠學不會。
作者們發現,學習程式設計能否成功與是否形成了穩定的思維模型有著莫大的關聯。
很顯然,Dehnahdi的測試並不能完美區分出會程式設計和不會程式設計的人。然而,如果存在這樣一個招生測試,讓那些有穩定分數的人才會被錄取,這樣的話,兩極分化的現象就會發生改變。在所有的61人中有32人(52%)不及格;而如果只在那個形成了穩定思維模型的組裡計算,27人中只有6人(22%)不及格。我們可以自信滿滿地說,我們有一個能在上課前就可以預測哪些學生會成功的測試方法,並且這種方法具有很高的準確性。據我們所知,這是到目前為止第一個能夠預測成功的測試方法。
我強烈建議大家把這篇文章完整地讀一遍。我曾經認為這會是一篇晦澀難懂的學院派論文,其實不然,它更像是一篇博文,充滿了有趣的觀點,就像下面這兩段:
我們確實經歷了一段時間,才有勇氣相信我們自己的結論。儘管意識到目前的資料還不充分,我們的結論還只能算是一種推測,但在我們看來,第一次測試就區分出來了3個組,其中的決定因素是他們對無意義事物的態度。
形式邏輯證明,進而用一種叫程式語言的形式系統來表達,通過執行某種特別的計算得出結果,這其實是完全沒有意義的。為了編寫一個計算機程式,你必須做出妥協,賦予程式某種意義。但不管你想要這個程式做什麼,計算機都會按照這些沒有意義的規則執行,並且得到一些沒有意義的結果。在測試中,那些有穩定思維模型的人都體現出了在這方面的先天接受能力,他們都有能力看見規則背後的數學計算問題,並且無論怎樣都能夠遵循那些規則。另一方面,那些沒有穩定思維模型的人總是找不到頭緒。而那些交白卷的人知道這是一件無意義的事,所以他們拒絕去做。
每個人都應該知道怎樣使用計算機,但並不是每個人都需要成為一名程式設計師。然而,對於相當多的電腦科學的學生來說,似乎怎麼也教不會他們程式設計,這還是有些令人擔憂的。很顯然,不是所有人都像我們這樣痴迷於沒有意義的規則和結論。但對我而言,有何不可呢?
本文摘自《程式設計師的修煉》