“智商平平”學軟體
金旭亮
前幾天收到了一個在職普通程式員的郵件,在郵件中他說兩次報考我們學校電腦專業研究生,但總是慘敗而回,第1年總分考了250,砸在政治和數學上,努力複習了一年,又是砸在數學上,總分才285……。我幾乎能真切地體會到他那種沮喪和不甘心——為什麼我經過一年的辛苦努力,卻還是原地踏步並在同一個地方跌倒兩次?同樣的疑問我也曾經問過自己無數遍,因為我也是連續考研三次才通過的。
我是一個“智商平平”的人,但還算比較努力,有幸“混入”高校,成了一名講授軟體開發技術的普通教師。任教8年多以來,接觸到了相當數量的學生,有了一些教學經驗,同時我還閱讀了一些有關教育學心理學方面的書籍和文章,一直在思索這樣的一個問題:
“智商平平”的人應該如何自學軟體技術,而我又應該如何教“智商平平”的人學會軟體開發技術?
我覺得“學”與“教”其實是同一個問題的兩個不同側面,都遵循類似的學習與認知規律。
這裡首先要對“智商平平”作個界定。
國外比較重視智商測定,並已發展出了比較成熟的智商測試機制,往往能給某人以一個比較準確的智商測試成績,這些成績可被用於高校招生、企業錄用員工、軍隊徵兵等。但我們中國這一前提就不存在,比如筆者就從未做過智商測試。
儘管無法用數字精確地說明,但我們還是可以憑感覺和觀察來得出一些結論——某些人很聰明,某些人則比較笨……,比如在同樣一所高中裡學習的學生,有的能在全國數學、物理等競賽中屢屢得獎,不用參加高考就能保送到名校,之後順理成章地繼續攻讀研究生,甚至能到國外名校去繼續深造,考試對於他們來說實在是小菜一碟,想得個低分都不容易……,而許多普通學生,哪怕每天只睡幾個小時,日以繼夜地做題,高考也得不了幾分。
記得我高考那年有位兄弟就是個典型例子,當我等正在題海中掙紮的時候,這位老兄卻捧著本《神鵰俠侶》暢遊武俠世界,末了人家高考總分還是名列前茅。更有趣的是這位哥們後來學的是經濟管理方面專業,畢業後工作沒多久突然決定要考研,僅複習半年,就跨專業成為了一名電腦專業研究生……
還有我的一位師兄,在微軟研究院“混”,他讀博的幾年,發論文就象我等編寫幾個小程式業似的,拿博士學位如探囊取物,這位兄弟給我印象最深的地方在於他曾經想出國準備GRE,一天背300多個單詞。我的神啊,我一天能記100個就不錯了,而且第2天還沒準會忘了80個!
只要留心一下,會發現我們可以在身邊找到許多類似的例子,這些例子說明了一點:人與人之間是存在著差異的,各有所長,也各有所短。我覺得大家公認為聰明的人,其智商應該都屬於比較高的,可以合理地假設此人的智商屬於人群中最高的10%(即十裡選一)那一群體,那麼正常情況下,他進入重點大學學習深造應該不成問題,如果是百裡選一,那麼他進入名校應該問題不大。
除了智商偏低的人(應該也有10%),中間約佔80%的應該是“不笨也不聰明”的普通人,而我也屬於這個群體,所以我最關注的也就是“普通人”的學習問題。
軟體行業從業人員中有兩種典型的類型:科研人員與軟體工程師。個人感覺,從事科研工作並取得相應成就的人,應該是屬於人群中那10%的智商最高的群體,而軟體工程師這一工作,則80%的普通人經過訓練都可以勝任,但要達到一流的水平,對其智商的要求也是相當高的。
科研領域取得成就的人,還有那些優秀的軟體工程師,突出的一點是他們的抽象思維能力較高,而體現抽象思維能力水平最直接的標誌,就是數學。我發現電腦科學研究弄到後頭,來來回回擺弄的都是數學;另一方面,對於高水平的軟體系統開發,與數學有很密切聯絡的電腦演算法、資料結構、編譯原理等比較抽象複雜的電腦科學理論的作用也開始突顯。
前段時間,機械工業出版社送給我了一本《深入電腦系統(第2版)》,這本書以程式員的視角從底向上地介紹電腦系統的各個方面,許多人說這是本好書。有趣的是,在新浪微博上我看到有網友說:“這本書太枯燥了,根本看不下去”。我為此也發了一條微博和他一起交流:
覺得技術書枯燥與沒興趣,可能關鍵在於你實際開發經驗不多,所以缺乏理解這些書所需的一些基礎。個人體會,當某本書大多數人說好,而自己覺得很枯燥的,日後很有可能會發現原因在於自己第一次閱讀時還沒有具備看懂它的基礎,無法引發共鳴……
這的確是我親身體會。許多複雜抽象的電腦科學理論,在自己還沒有具備相應的基礎前,別去碰它,否則,收穫的將只有挫折與失望。
舉個例子:還沒有使用程式設計語言親自編程的體驗,《編譯原理》是學不會的;有的人高中數學其實都沒掌握好,卻想通過閱讀《演算法導論》來成長為一名演算法高手,似乎也沒這可能;同樣的,如果沒有足夠的開發設計經驗,卻抱本《設計原本》(The Design of Design: Essays from A Computer Scientist)來啃,我只能對著你長長地歎息一聲……
大家都急,想迅速成功,想迅速達到自己的目標,都等不了了,我也一樣,但世界自有其規律,主觀歸主觀,客觀歸客觀,客觀世界不會“聽從”人的主觀願望,“人有多大膽,地有多大產”註定是一個神話……
很明顯,每個人都應該想辦法弄清楚自己的“家底”,然後選擇最適合自己的學習方式。
時間反向推算30年,那時只有很少數的人可以上大學,這些人絕大多數屬於人群中較聰明的那一族,所以,整個大學教育體制其實偏向於“精英教育”,其主要目的是培養精英和棟樑之才。而21世紀以後,大批的普通智商的學生進入校園,從總體上來說,除了少數名校,大學教育應該轉向“平民教育”。 而中國教育最大的問題也在這:由於眾所周知的原因,很多大學屬於“反應遲緩”並“拒絕改變”的“恐龍”,仍然採用“精英”教育的傳統方式方法教學,這本質上就是將原來只針對少數優秀學生的教育方式與方法給“人為放大”,具體現象之一就是原先的十幾人的小班變成了幾十人甚至是上百人的大班。要知道,近十多年以來中國高等教育的重大變化不僅僅體現在學生規模的激增上,還體現在學生平均智商與素質的“普通化”。
用“放大”的精英模式教育大批的“普通人”,正如沒有劉翔的身體素質,卻按照劉翔的訓練方法訓練,用腳思索都會發現這是不太對頭的。
拿電腦專業來說,近些年來雖然在不斷的調整,但目前仍然是“理論”重於“實踐”。前面也說過,複雜抽象的電腦理論課,絕不是那麼好學與好理解好掌握的,有些課程,真的應該只針對那些比較聰明的學生來講,而即使是所有學生都要學的同一門必修課程,針對不同層次的學生,也應該有不同的講法。
好了,就軟體這個領域,“智商平平”的普通人應該如何有效地學習?
我覺得,“智商平平”的普通人學軟體,在一開始應該避開那些複雜抽象的要求有較高學習能力的電腦科學理論課程,特別是那些要求有實踐作基礎的課,應從能“即時反饋”並能“立即用於開發實踐”的專業課程與開發技術入手。
舉個例子,是否學生要學的第一門程式設計語言必須要是C語言?這個問題就可以討論。我個人覺得,儘管從C入手是經典途徑,已經多年的實踐檢驗,但這並不排斥可以採用其他的方式。比如,能否一開始就直接學Python?諸如Python這類的動態程式設計語言,具有文法簡單、反饋迅速的特點,很有助於學生理解程式設計語言,培養軟體開發的思維方式。我還嘗試過一開始就直接讓學生學習物件導向的程式設計語言(比如C#),哪怕他們沒學過C,但使用Visual Studio這種高度智能化的開發環境,以可視化的方式設計軟體,最終能開發出真正可以在日常使用的軟體,對學生還是有著很強的吸引力,不象C,學了一個學期,學生還只是編寫幾個“黑底白字”的小程式,根本就不知道現在的可視化軟體是怎麼寫出來的,太有挫敗感了。特別是C++,我覺得通過它來給剛學完C的學生講物件導向編程,實在是個杯具,有幾個學生真能在短短的一學期課程中搞得掂C++這麼複雜的程式設計語言,而且還要求他們理解物件導向的思想並能用它寫出真正可用的軟體?我覺得,學完C之後,用Java或C#課程來協助學生掌握物件導向的程式設計語言與思想,要比C++好得多。而且學生通過Java或C#掌握物件導向的基本思想與理論之後,再去學C++就好多了。
電腦科學與技術有很多個子領域,學習順序其實是很重要的。
我個人認為,電腦專業的學生應該在大一,最晚不要拖到大二,就掌握一門主流的程式設計語言和開發工具,Java和C#是兩個好的選擇,為什麼要這麼做?道理很簡單,你掌握了它們,就可以迅速地投身於軟體開發實踐,並且有助於掌握後繼的電腦專業課程理論。
舉個例子,在大一大二就使用Java或C#寫過多線程程式的學生,在學習《作業系統》這門課程時將要輕鬆得多,而能在大學低年級就開始編寫遊戲的學生,往往會對《資料結構》、《人工智慧》、《圖形影像處理》等理論課程感興趣,他就會主動地去學習相關的遊戲開發平台與工具,學習C++這種複雜的程式設計語言就會有強大的動力,因為許多遊戲引擎是採用C++編寫的……。
在“無網不勝”的網路時代,學生掌握了Java、C#或C++之類主流的程式設計語言之後,他就具備了進軍網路開發領域的可能,此時,他再學習《電腦網路》這門課程就水到渠成了,他可以將已具備的軟體開發能力與相關電腦網路理論結合起來,自己開發一個Web伺服器,自己開發一個QQ,自己開發一個網路遊戲,自己寫個互連網工具,自己寫個跑在手機上的應用……,其所獲得的成就感是枯燥的“空對空”理論學習所無法比擬的。
寫到這,不妨作個階段的小結:
軟體技術怎麼學?如果你屬於“智商平平”的普通人,那麼,請從動手編寫小程式入手,在開發實踐的基礎上去學習電腦科學理論。
在具體技術領域的學習上,需要謹慎選擇學習的方式與材料,當此領域內的某本經典著作你怎麼也看不懂或覺得很枯燥時,請另選一本比較淺顯的,或者諮詢一下這個領域內的人,瞭解一下掌握這個領域的技術需要哪些前提,把這些欠缺的東西補上之後,這些書你就看得懂了,甚至是看得津津有味。
這裡談談我的體會。我以前從未覺得有必要去瞭解各種網路通訊協定的細節,但後來有了一些網路應用程式的開發經驗,並且嘗試分析.NET基底類別庫中相關網路組件的設計時,就體會到如果不瞭解網路通訊協定的特點,就難於瞭解為什麼設計者會以這種方式來封裝網路功能。
蔡學鏞先生曾發過一篇微博,推薦大家看看《HTTP: The Definitive Guide》一書,後來我在網上找到了這本詳細介紹HTTP協議各個方面技術細節的書,翻閱之後,對原先的許多有關Web開發的問題有了新的看法,很有收穫。然而,如果某人沒有開發Web應用程式的經驗,恐怕又會說這本書“枯燥”了。
如果閱讀本文的還是在校學生,他們可能說:“老師,我們沒有選擇課程與學習方式的餘地,學校安排了這麼多的必修課程,不硬著頭皮去啃,我怎麼畢業啊?”
而另一些已經工作的朋友則會說:“每天都有那麼多的工作,很難有這個時間和精力按照你所說的方法去學習。”
這確實是個問題,但我也沒解決辦法,因為我們所處的環境我們沒有選擇權。在這裡,我只是向大家描繪一下:我認為合理的軟體技術學習方式應該是怎樣的。而且我也看到了,正是因為違背了這些教育與學習的基本原則,中國大學才被國民“千夫所指”。這麼多年來,中國大學在“培養真正的精英與棟樑之才”方面國民是不滿意的(不然為什麼會有錢學森的“世紀之問”並引發廣泛共鳴?)。事實證明,中國大學這麼些年來,精英沒培養出來,大批的普通學生也沒教育好,他們中的許多直到畢業也沒有能掌握一些必要的職業技能,高不成低不就的,找工作困難,另一方面,IT企業許多崗位缺人卻同樣找不到能勝任工作要求的人才,整個一“死迴圈”……
莫談國事,還是聊聊“笨”與“聰明”的問題。
前面我說過了,整個人群總可以劃分為10%比較聰明的,10%比較“笨”的,餘下80%的“普通人”。其實所謂“比較聰明”的人,主要體現在他反應快,記憶力強,抽象思維水平高,學習能力強,掌握新知識、新技能的速度快,投入少而收益大,……,但這並不意味著許多知識與技能只有聰明人才能掌握。
對於佔80%的普通人而言,絕大多數聰明人所掌握的知識與技能也是完全可以掌握的,只不過需要更長的時間、更多的精力和更強的毅力,套句老話,就是要“笨鳥先飛”。
如果把智商高的那批人比作兔子,普通人比作烏龜,那麼從理論上講,兔子能到的地方,只要給與足夠的時間,烏龜也是能爬到那的。當然,由於人的生命有限,對於那些從不偷懶的兔子,烏龜要達到這些兔子所到達的地方,是不可能的。然而老天比較公平,人性也有弱點,本身跑得快又不偷懶的兔子,在兔子這一群體中比例並不高,許多兔子往往會由於看到那麼多的烏龜落在自己的後面,他們做事的方法那麼低效那麼笨,素質也差,就充滿了優越感,往往會變得浮燥,不願再辛勤努力了,結果他們最終也沒有取得大的成就。相反,烏龜就沒有任何驕傲的資本,烏龜中的那些上進的人,往往具有很強的堅持精神,不停地爬呀爬的,而且在爬的過程中他們會不斷地動腦筋想點子,怎樣爬得更快?結果大家都知道,有些烏龜,爬到了許多兔子所沒能到達的地方。
金庸先生的名著《射鵰英雄傳》其實是一個經典的“龜兔賽跑”故事,比較“笨”的郭靖,其最終的成就比“聰明”的楊康要大得多,而小說中所描寫的郭靖的學藝過程與心理活動和體驗,實在是太切合實際了。我推薦所有的“烏龜”們好好地讀讀《射鵰英雄傳》,重點看看郭靖的成長過程。我有時在想,金庸先生是怎樣的一個人,能將一個“笨人”的故事講到這般的精彩?我覺得說金庸先生屬於“跑得快的兔子”行列大家應該不會有異議,但我必須同時指出,他絕對是一隻不偷懶的兔子,想想看,有幾隻偷懶的“兔子”能寫出14部雅俗共賞的小說?更關鍵的是,這些小說部部不同,每部都有自己的風格,創新、創新,還是創新,絕不重複昨天的成功,結果讓金庸先生在武俠小說領域成為他人難以企及的高峰……。
所以,即使是天才,不努力,也是廢材,即使“智商平平”,堅持下去,也能爬得很遠,但對於那些勤奮努力的天才,我想,大家一定會懷著敬意地提到他們的名字……
這就是“聰明”與“笨”的辯證法。
=========================================================================
附錄:
這個學期我給本校成教學院“高中起點大專班”的學生講授《C#物件導向程式設計》課程,為此,我設計了一套針對零物件導向編程基礎的學生(但要求他們學過C語言)學習物件導向技術的教案,今天發布前兩講《C#程式設計語言與.NET物件導向程式設計概述》和《C#程式設計語言基礎》。
欲作其事,先正其意。因此《概述》一講中我分析了當前電腦教育的現狀,介紹了軟體技術的學習方法;而在《C#程式設計語言基礎》一講中,我針對學生幾乎沒有寫過程式的現狀,我採用了現場編程示範和現場上機練習的教學方式,要求學生內建膝上型電腦,跟著教師同步地在課堂上鍵入代碼,然後馬上現場完成一些小的編程任務的方式,有問題及時反饋,現場解決,同時留了課後作業。
我希望這些課程能協助學生邁入軟體開發的大門。
後續的課程教案將陸續發布,可供講授《C#物件導向程式設計》課程的教師參考,也可以作為C#的初學者的自學資料。
請點擊以下連結下載教案及相關源碼(在部落格園)。
1 《C#程式設計語言與.NET物件導向程式設計概述》
2 《C#程式設計語言基礎》