少兒編程學習的是什麼?讓我們先回顧編程發展歷史
從2014年12月,美國前總統奧巴馬在「編程一小時」活動中寫下自己人生第一行編程代碼開始,青少年編程教育逐步成為公眾關注的熱點。2017年7月,國務院發布《新一代人工智慧發展規劃》,其中特別提到的「在中小學階段設置人工智慧相關課程,逐步推廣編程教育」,給青少年編程教育的重要性一錘定音。提起編程教育,我們最先會想到如Scratch、Python等編程語言。是不是學會這些語言,就是學會了編程?到底學會多少語言,才算是學會了編程?想找到這些問題的答案,我們不妨從編程的發展歷程中探尋。
歷史中的可編程發明
如果被問到「什麼是編程?」,許多人的回答可能是「敲代碼」。坐在電腦前,用鍵盤敲出一行行代碼,這就是我們現在最常看到的別人編程的樣子。
然而,在80年代,計算機工程師編程並不是「敲代碼」,而是「寫代碼」——真的在紙上寫出程序代碼。在紙上寫好的代碼也不能運行,工程師們還需要把程序製作成打孔紙帶,把打孔紙帶輸入計算機,計算機才能讀取程序並運行。從1943年第一台現代電子計算機發明開始,給計算機輸入打孔紙帶就是當時的「編程」方式。直到電子顯示器發明並大規模應用後,純數字化的代碼輸入得以實現,打孔紙帶才退出了「編程」的舞台。
但有趣的是,使用打孔紙帶、紙卡編程的歷史比現代計算機還要早得多。1805年,拿破崙為法國紡織商人、發明家約瑟夫·雅卡爾頒發巨額獎金,嘉獎雅卡爾發明的,極大提升了紡織生產效率的自動化「可設計」織布機。
雅卡爾織布機的走線由一系列串接好的打孔卡片來控制。打孔卡片的每一列對應一根經線,織布機每織一次緯線時,自動根據打孔卡片當前一行每一列是否打孔,來提起或不提起對應的經線。織布機織完一行,把打孔卡片向前拉動,接著根據下一行的打孔來控制經線,這樣就紡織出跟預先設計的一模一樣的花紋。後來的各種計算機的設計,都借鑒了雅卡爾織布機的打孔卡片控制方法。十九世紀英格蘭數學家查爾斯·巴貝奇,是公認的第一個機械式可編程計算機——分析機的發明者。他為了能更快的製作更準確的對數表等數學用表,設計製造了一系列「計算機」。巴貝奇就採用了打孔卡片來為分析機編寫運算程序。他的助手艾達為分析機編寫了完整的三角函數計算、級數相乘計算和伯努利數計算等程序。
我們再向前追溯,還能發現比打孔卡片更早的「編程」裝置。這些裝置中有兩種我們比較熟悉,是音樂盒和自動人偶(automaton)。能自動演奏音樂的音樂盒最早出現在公元9世紀,在19世紀成為大量生產的工業化產品,是當時人們的休閑娛樂用品。音樂盒內部有一個滾筒,滾筒側面安裝有一排發音簧片,每一個簧片被撥動後能發出特定的音高。工匠對照著樂譜,在滾筒上對應行列的位置做出凸起。滾筒轉動時,各個凸起依次撥動簧片,就形成了旋律。在19世紀末,大型音樂盒開始使用更輕便、也更容易更換的打孔圓盤替代了滾筒。
自動人偶最早的記載見於古希臘時期,我國的《列子 · 湯問》中也有記載一位工匠「偃師」給周穆王獻了一個跳舞人偶。有製造結構記載的,和有實物保存的自動人偶都使用了凸輪來「編程」。在故宮博物院,藏有一個由英國工匠製造並贈送給乾隆皇帝的「銅鍍金寫字人鍾」。鍾底部的寫字機械人由發條驅動,能自動用毛筆在紙上寫下「八方向化,九土來王」八個漢字。這樣一套複雜的動作,就是由若干個凸輪轉動來控制人偶的手臂、手腕和頭部同時運動。中文的書寫非常複雜,寫字人鍾無法裝載更多的凸輪來寫出更多文字。字母文字的書寫相對簡單很多,18世紀的瑞士鐘錶匠皮埃爾?雅克德羅製作的「書寫者」自動人偶就可以自由定義書寫內容。雖然理論上我們可以控制自動人偶做出各種各樣的動作,但更換凸輪無疑是一種低效的方式。不過直到今天,人型機器人的動作控制依然是一項複雜的工作。
往更早的歷史中尋找,我們會發現在公元60年,就有一個可編程的發明。這個裝置是古希臘的數學家、工程師希羅發明的「可編程」三輪車。這輛車有兩個驅動輪和一個被動輪。兩個驅動輪分別有獨立的車軸,在車軸繞上繩子,繩子的另一頭由掛在車子桅杆上的重物拉動,驅動輪就轉動起來,帶動車前進。希羅巧妙地在驅動輪車軸上釘了幾根釘子,這樣就可以反繞繩子,而且多次改變繞繩方向。當重物拉動繩子時,兩個驅動輪的不同正轉與反轉的組合就實現小車的前進、後退、左右轉彎。只要預先設計好繞繩方式,希羅就能控制小車按既定路線行走,實現對小車的「編程」。
現代編程技術的發展
希羅的小車、八音盒、雅卡爾織布機這些發明,在其所在年代的還沒有「編程」、「可編程」的概念。但它們在解決各自問題的過程中,都設計出使用了具有通用「編碼」的方式來做自動化控制,用繞繩、滾筒、打孔卡片控制機器按人們的意志運行。今天我們所使用的各種計算機編程語言,就是控制計算機按我們的意志運行的技術工具。
回顧這些帶有「編程」概念的歷史上的發明,我們可以看到,雅卡爾發明織布機是為了改進複雜紋樣紡織的生產效率;巴貝奇設計分析機是為了快速準確的進行複雜數學計算;八音盒和自動人偶為人們提供了便利的娛樂方式。這些發明家都是在探究各自問題的解決方法中,發明了這些裝置所使用的「編程」方法。我們熟知的各種現代計算編程語言,也是因為解決特定的問題而被設計發明。
全球使用最為廣泛的編程語言——C語言由美國貝爾實驗室的肯·湯普遜和丹尼斯·里奇所設計。1969年,湯普遜和里奇正在埋頭研發一種全新的、支持多用戶多任務的操作系統——就是後來的UNIX。第一個版本的UNIX使用彙編語言,在一台DEC PDP-7電腦上開發完成。由於彙編語言極度依賴於硬體,當他們在把UNIX移植到更高級的電腦的過程中,覺得需要一種能夠處理更多數據類型,能像機器語言一樣直接操作存儲器,又具有複雜易用的邏輯結構的編程語言。於是他們在當時的BCPL語言上進行了改進和改造,形成了一門新簡潔、規範又強大的編程語言「C」。1973年,二人用C語言重新編寫了UNIX,形成了UNIX更為標準化的版本。1983年,湯普遜和里奇因發明UNIX系統而獲得計算機科學的最高獎項——圖靈獎。
而另一門與C同樣流行的編程語言Java,在1990年最開始在SUN公司里被設計時(最初的名稱不叫Java),是用於有線電視和嵌入式設備的應用開發。開發小組讓Java能夠方便的實現基於信息傳輸的應用開發,同時能夠快捷的在使用不同處理器的設備上部署。Java的設計理念對於當時的有線電視來說有些過於超前。但是很快,Java就找到了適合它的廣闊天地——互聯網。1995年,SUN正式對外發布了Java,並把Java的特性精簡概括為「WORA」,一次編寫,到處運行(Write Once,Run Anywhere)。從此Java也迅速的流行開來。
到目前為止,全世界已經發展出超過600門的編程語言。從2018年1月的統計數據看,使用量排名前十的編程語言是Java、C、C++、Python、C#、JavaScript、Visual Basic .Net、R、PHP、Perl。這十門語言佔據了50%的使用量,它們普遍具有很強的通用性。比如Java就幾乎覆蓋了桌面軟體、網路服務、嵌入式應用、操作系統、智能手機等絕大多數編程開發場景。但前十名里也有僅在特定領域使用的語言。如果不從事數據相關的工作,你可能幾乎沒機會接觸到R語言。
Python是1991年出現的「老」編程語言,近兩年大數據、機器學習的興起,Python被發現非常適宜這兩個領域的開發需求而獲得了更多的使用量。新的編程語言也不斷出現,從2010年到現在,就有15門全新的編程語言問世。隨著社會環境、科學技術的發展,未來還會有更多的編程語言出現,用以解決全新的問題。
不論是歷史中的可編程發明,還是近代的計算機編程語言發展,我們都能從中發現,新方法、新技術隨著時代前進不斷湧現。除了技術本身,社會環境也在變化。
提煉編程教育的核心價值
十年前沒人會認為手機成為個人應用軟體的主流平台;二十年前人們也無法想像互聯網會接管我們大部分生活需求。在這樣的發展節奏里,一個中學生今天接觸、學習的編程技術,在十年後他步入社會時,很可能有翻天覆地的變化。所以,在中小學開始Scratch、Python等課程,只是編程教育一個小小的開始。我們必須提煉出編程教育的本質。
不論是歷史中的可編程發明,還是近代的計算機編程語言發展,我們都能從中看出,編程技術的目的是駕馭機器、駕馭計算機,讓它們更高效的解決問題。所以我們要讓學生逐步接觸、理解、體驗編程的邏輯操作、演算法、數據結構、工程設計等通用的工程方法與數學知識。這些核心知識是編程語言的靈魂。學生在需要使用新的編程語言時,這些核心知識能夠幫助他們更快的融匯貫通。更重要的是,學生可以脫離編程語言,更純粹的思考如何讓計算機解決問題,也就是讓學生具有「計算思維」。
除掌握編程的核心知識,形成計算思維外,我們也要把學生的視野拓寬。我們在家庭、學校里看到的只有PC(個人計算機)和移動設備,我們還要讓學生看到「大」如太湖之光,「小」如能在人體血管里工作的M3計算機,看到汽車、航空、航天、醫療、軍事、經濟、人工智慧等各種領域的專用計算機,並且看到這些計算機都在解決什麼問題。通過計算機與編程,我們讓學生能夠打開一個全新的視角,來觀察、分析和思考社會的發展進步,以及同時面臨的問題。
原題:追本溯源,探尋編程教育的本質 ,作者劉欣,原文刊載於《中國科技教育》2018年1月刊
推薦閱讀: