嵩天+黃天羽+禮欣
摘 要:首先分析計算機技術發(fā)展的幾個重要階段,闡述不同程序設計語言與不同發(fā)展階段的關系,提出將Python語言作為我國高校各專業(yè)程序設計入門語言的建議;其次從產(chǎn)業(yè)需求及對計算技術運用角度闡述計算生態(tài)的價值和作用,提出將“理解和運用計算生態(tài)”作為Python語言課程教學理念;最后介紹一套適用于各類型專業(yè)、靈活性強、具有鮮明時代性的Python語言入門課程教學方案。
關鍵詞:程序設計;Python語言;計算思維;大學計算機;計算生態(tài)
0 引 言
2016年,教育部高等學校大學計算機課程教學指導委員會發(fā)布了《大學計算機基礎課程教學基本要求》(簡稱《基本要求》)[1]?!痘疽蟆方Y合信息技術發(fā)展及國內(nèi)高校開展教學情況,建議將C、VB和Python作為首門程序設計課程的教學語言,課時48~64學時。近2年來,國內(nèi)一批高校逐步開設了Python語言,成為教學改革熱點。20世紀90年代以來,編程語言從Pascal、C經(jīng)歷了VB、C#、Java,發(fā)展到今天的Python,很容易讓任課教師產(chǎn)生一個認識——Python僅僅是編程語言的同質(zhì)更迭。本文試圖說明這種認識的片面性,并闡述Python語言進入高校教學體系的必然性[2]和教學方案。
1 程序設計語言的時代適應性
1.1 計算機技術的時代性
第一階段“計算機系統(tǒng)結構階段”(1946—1981年)。這個階段計算機技術主要圍繞計算機系統(tǒng)結構設計開展,服務于科學計算和商業(yè)數(shù)值計算,產(chǎn)生了超級計算機等不同類型的計算機系統(tǒng)。與這個時期計算機有限的計算性能和功能相對應,程序設計需要在程序邏輯和系統(tǒng)結構之間、處理能力和存儲容量之間、計算和通信之間尋找優(yōu)化和折中。這個階段的計算需求催生了執(zhí)行高效的C語言(1972年)。
第二階段“計算機網(wǎng)絡和視窗階段” (1982—2007年)。這個階段以TCP/IP協(xié)議標準化為標志。計算機技術主要圍繞網(wǎng)絡技術、視窗技術、多媒體技術發(fā)展,計算機技術提供滿足個人計算需求的視窗應用和網(wǎng)絡服務。網(wǎng)絡帶來的跨平臺需求產(chǎn)生了Java語言(1995年)。由于微軟Windows操作系統(tǒng)在個人計算機領域的高度普及,“所見即所得”的開發(fā)需求產(chǎn)生了Visual C++、Visual Basic(1991年)等視窗編程語言。
第三階段 “復雜信息系統(tǒng)階段”(2008年—)。這個階段以安卓開源移動操作系統(tǒng)的發(fā)布為起點,一批新的計算概念和技術幾乎同時提出并顯著推動了計算技術的升級換代。雖然概念眾多,很難有任何一個技術領域獨領風騷,任何系統(tǒng)都需要不間斷地完善才能提供更加安全可靠及更佳用戶體驗的功能。面對復雜的功能性和緊迫的迭代周期,計算機需要更高抽象級別的程序設計語言來表達高層次編程邏輯。一批腳本類型、高效表達高層次編程邏輯的編程語言相繼誕生,包括Swift、Go、Ruby、R、Lua、Python等。其中,Python(2008年3.0版本)已經(jīng)成為這個階段的主流編程語言。
第四階段 “人工智能階段”(2010年—)。隨著深度學習、開源硬件、智能機器人、在線搜索引擎、量子計算等技術的發(fā)展,未來某個時期將會出現(xiàn)人工智能主導計算的技術階段。2016—2017年間出現(xiàn)的AlphaGo、無人駕駛汽車、自然語言翻譯等應用進展預示了未來階段的逐步臨近。計算機將逐步接管人類所有非創(chuàng)造性工作,計算機技術將進入一個未知的新階段。
1.2 編程語言的適用性比較
計算機技術發(fā)展具有鮮明的時代性,程序設計語言發(fā)展也有類似特性。這里,以我國高校最常講授的編程語言為例,如C、VB、Java、C++、Python、Matlab等,闡述各語言的歷史定位和發(fā)展前景,綜合比較見表1。
C語言最初用于編寫UNIX操作系統(tǒng),因此,該語言既表達基本程序邏輯,又表達軟件對硬件的高效利用,如指針、精細到字節(jié)的數(shù)據(jù)類型等。編寫與硬件緊密相關的程序是該語言的歷史使命,因此,講解該語言將重點培養(yǎng)學生對計算機系統(tǒng)結構的抽象能力。C語言適合計算機類專業(yè)學生學習。
編寫Windows視窗應用是VB語言的歷史使命。該語言在基本程序邏輯外,主要表達視窗系統(tǒng)中事件、控件和視窗體系下人機交互的關系。因此,該語言將重點訓練學生視窗交互邏輯的理解。然而,隨著移動互聯(lián)網(wǎng)的快速發(fā)展,視窗應用已經(jīng)逐步被以Web為基礎的應用所取代,該語言的發(fā)展前景暗淡。至今,已經(jīng)比較難找到學習該語言明顯的受益群體。與該語言類似的語言還有VB.Net、VF.Net、C#等。
Java語言以運行時和跨平臺為技術創(chuàng)新,同時,純面向?qū)ο笳Z言具有更高層次的代碼封裝能力,也為編程中更大規(guī)模庫的構建提供了基礎。Java語言主要訓練學生通過“類”的概念理解計算問題中對象及對象間的主客體關系。此外,Java語言成為Android平臺的首選開發(fā)語言,因此,軟件類學生比較適合學習該語言。盡管Java語言現(xiàn)在十分流行,但其在移動互聯(lián)網(wǎng)應用領域的份額逐漸被以HTML5為代表的前端腳本語言所替代,該語言未來的應用空間將逐漸變窄。
C++語言目標是取代C語言成為適合多人協(xié)作編寫大規(guī)模程序的高效編程語言。從幾十年發(fā)展來看,該語言的確成為軟件工業(yè)中“大規(guī)模程序”的主流語言,但其復雜的語法和繼承自C語言對系統(tǒng)結構的抽象使該語言僅成為專業(yè)人士的小眾語言。C++適合計算機類和軟件類專業(yè)同學學習,但并不適合作為入門語言教學。
Matlab嚴格來說是一個工具而不是編程語言,其主要優(yōu)勢在于對數(shù)據(jù)的處理。Matlab天然以矩陣為數(shù)據(jù)的基本單元,通過友好的用戶界面、相對簡潔的編程邏輯和大量的工具箱極大簡化了數(shù)據(jù)處理的難度,成為工程領域重要的計算軟件。Matlab適合信息類專業(yè)學生學習,其工具箱可以簡化工程分析的復雜性。至今,Matlab仍然具有重要的使用價值,但不適合作為編程語言入門內(nèi)容,因為嚴格來說,它不是一門通用的編程語言。
Python語言產(chǎn)生于1991年,受限于上世紀90年代程序設計語言理解的局限性,并未成為國際關注的主流編程語言。直到2008年,Python 3.0系列摒棄了之前版本的各種弊端,采用非兼容方式升級,奠定了當下流行的實質(zhì)基礎。Python語言誕生于復雜信息系統(tǒng)時代,它不僅有簡潔的語法,更關注高層次程序邏輯,而將低層次邏輯通過封裝其他語言代碼(如C、C++)或集成第三方庫方式實現(xiàn)。Python語言設計初衷是更快速更高效解決問題,因此,該語言將訓練學生抽象問題和設計算法的能力,這正是計算思維培養(yǎng)的核心。作為入門編程語言,Python適合所有專業(yè)。
1.3 將Python作為程序設計的入門語言
在復雜信息系統(tǒng)時代,信息技術分工更加精細,面向問題求解的高層次邏輯表達是信息技術應用的主要矛盾。從程序設計語言的設計初衷和計算思維訓練焦點來看,符合計算機技術發(fā)展的編程語言將能更好地引領學生真正進入信息時代。因此,我們提出如下建議,“將Python語言作為我國高校各專業(yè)程序設計入門語言”,主要有以下3個原因。
第一,Python語言符合計算機技術發(fā)展階段。在新工科建設背景下,程序設計語言課程不僅要兼顧歷史,更要面向未來。在計算機技術發(fā)展階段變化明顯的背景下,選擇更符合未來應用預期的教學內(nèi)容是教學改革的方向。只有面向未來的教學內(nèi)容才值得進行大范圍、深刻的教學改革
第二,Python語言教學將最有可能保護學生對程序設計的學習熱情。十幾年的程序設計教學實踐并未在非計算機或軟件類專業(yè)培養(yǎng)出大批合格的具備程序設計能力的學科人才。C、Java、VB都是非常難以理解的程序設計語言,因為這些語言除了基本程序邏輯外,都加入了額外的計算概念,如C語言的指針、Java的面向?qū)ο?、VB的視窗交互等。實際上,以往程序設計入門課程并未純粹訓練學生分析問題、解決問題的程序設計邏輯,而將大量學時用于編程語言所附加功能的教學上,學生在未理解基本程序邏輯前提下再去理解較高級的計算概念,學習曲線陡峭,難以保持學習熱情。Python具有相當簡潔的語法,對程序邏輯設計比較純粹,學習曲線平滑,有助于保護學生學習熱情,將能夠為進一步加深程序設計理解和運用奠定更好的學習基礎。
第三,Python語言教學將能夠激發(fā)學生的創(chuàng)新性。C、Java、VB等傳統(tǒng)程序設計語言受限于概念和語法的復雜性,很難在有限學時內(nèi)引導學生開展創(chuàng)新性程序設計訓練。Python語言有十萬余第三方庫,其中部分庫適合初學者進行程序設計探索。以北京理工大學某次教學實踐為例,在最初12個學時里,學生可以嘗試利用turtle庫繪制各類型玫瑰花,如圖1所示。創(chuàng)新是新思想的源泉,Python語言能夠讓學生結合特定編程模式探索思維空間的新事物。
2 Python教學理念:理解和運用計算生態(tài)
2.1 軟件產(chǎn)業(yè)模式和計算生態(tài)的價值
20世紀80年代前,軟件開發(fā)和使用近乎處于全封閉狀態(tài),與其他工業(yè)產(chǎn)品類似,它通過商業(yè)渠道分發(fā)和銷售。隨后,以Richard Stallman為代表的一批早期軟件工程師在1983年啟動了GNU項目,開始了“自由軟件”的探索之路。從Stallman設想的由少數(shù)人參與的“大教堂模式”到Linus Torvalds實踐的由幾千人共同參與的“集市模式”[3],自由軟件理念的改變不僅是開發(fā)模式的改變,也驗證了以“共識原則”和“社會利他(egoboo)原則”組織軟件開發(fā)的可行性和高效性,為隨后自由軟件發(fā)展奠定了可操作的開發(fā)原則。
經(jīng)過近30年的發(fā)展,軟件領域在創(chuàng)新模式、開發(fā)模式和商業(yè)模式方面都發(fā)生了翻天覆地的變化,已經(jīng)與傳統(tǒng)工業(yè)截然不同。軟件領域所帶來的最大不同在于軟件領域已經(jīng)逐步建成了由全球工程師自發(fā)組織維護的、覆蓋信息技術幾乎所有領域的、由協(xié)議保護但免費獲得的“開源軟件”體系,建成了良性發(fā)展的計算生態(tài)。
在計算生態(tài)的影響下,軟件產(chǎn)業(yè)的創(chuàng)新模式從“刀耕火種”且產(chǎn)權獨有的發(fā)展模式向 “避免重復造輪子”但產(chǎn)權清晰的開源軟件利用模式轉(zhuǎn)變。這種轉(zhuǎn)變以快速集成已有軟件功能為方式,突出問題的解決和產(chǎn)品快速迭代,不局限于軟件開發(fā)的封閉性。這種模式極大地推動了信息技術的創(chuàng)新和發(fā)展。例如,AlphaGo在全球產(chǎn)生巨大影響力的同時,其背后的TensorFlow技術同期開源,并快速應用于機器翻譯、自動駕駛、唇語識別等多個領域。這種快速創(chuàng)新受益于計算生態(tài),也代表了軟件領域新的產(chǎn)業(yè)模式。
計算生態(tài)是“生態(tài)”概念在計算機技術中的對應,廣義指在計算機技術空間內(nèi),由軟件、硬件、開發(fā)模式和設計理念構成的統(tǒng)一整體,各組成部分相互影響、相互制約、協(xié)同發(fā)展。本文所闡述的計算生態(tài)特指在程序設計領域構建的支撐計算機技術發(fā)展的生態(tài)體系,即以開源項目為組織形式,充分利用“共識原則”和“社會利他原則”組織人員,在競爭發(fā)展、相互依存和迅速更迭中完成信息技術更新?lián)Q代并形成技術自我演化路徑的有機模式。
計算生態(tài)沒有頂層設計,而是以程序功能為單元自發(fā)組織和發(fā)展,具備3個特點:競爭發(fā)展、相互依存和迅速更迭,結合具體應用場景計算生態(tài)也被稱為生態(tài)圈、編程生態(tài)等。以Python語言為例,全球有超過十萬個第三方庫,由公司、個人工程師等開發(fā),以開源形式免費共享,具備以下顯著的生態(tài)特點。
(1)競爭發(fā)展。對于重要的計算需求,存在2個及以上第三方庫支持,形成了相互競爭的發(fā)展態(tài)勢。例如,urllib、requests、scrapy等第三方庫都提供網(wǎng)絡爬蟲功能;隨著競爭深入,requests庫成為簡單頁面爬取的主流工具,scrapy庫成為可靠爬蟲框架,urllib被逐步淘汰。
(2)相互依存。以“避免重復造輪子”為理念,第三方庫在技術上存在廣泛依存的關系,例如,中文分詞jieba庫,其內(nèi)部使用了os、logging、marshal、math、hashlib等眾多第三方庫。第三方庫之間也存在逐級封裝的依存關系,例如,數(shù)據(jù)處理pandas庫基于并擴展了numpy庫。
(3)快速更迭。已經(jīng)出現(xiàn)的第三方庫在競爭中快速發(fā)展,不斷迭代滿足用戶的最新需求,活躍的第三方庫更新周期與商業(yè)軟件產(chǎn)品更新周期相當或更短。由于社區(qū)龐大且開放,新的應用快速出現(xiàn),計算生態(tài)發(fā)展迅速。
計算生態(tài)不同于傳統(tǒng)API(應用程序接口)。前者由工程師結合需求自發(fā)創(chuàng)建,沒有頂層設計,沒有規(guī)劃和約束,唯一驅(qū)動力是興趣和對需求的滿足;而API往往由單一公司或組織進行頂層設計和全局規(guī)劃,如Windows API等。
隨著產(chǎn)業(yè)模式向互聯(lián)網(wǎng)思維和集成創(chuàng)新方向的演化,計算生態(tài)有效支撐了新產(chǎn)品的研發(fā)、原型和商業(yè)模式。產(chǎn)業(yè)界越來越多地依靠計算生態(tài)推動變革,而高校只對基本技術和技能的訓練不能很好地順應業(yè)界發(fā)展。應該看到,計算生態(tài)是當代信息技術發(fā)展最重要的支撐,它幫助信息技術快速演進和發(fā)展、推動創(chuàng)新不斷產(chǎn)生、為普及最新技術鋪平道路。在新工科建設大背景下,將計算生態(tài)引入程序設計課程教學不僅將改革教學內(nèi)容,還能改變學生的創(chuàng)新意識,培養(yǎng)創(chuàng)新思維。
2.2 “理解和運用計算生態(tài)”的教學理念
針對Python語言教學,我們提出了“理解和運用計算生態(tài)”的教學理念。之所以在Python程序設計教學中引入計算生態(tài),主要因為Python具有龐大的計算生態(tài)圈,十萬多個第三方庫覆蓋幾乎所有技術領域,受眾面廣泛,很多功能能夠引起學生共鳴。其他語言或者只有大量API或者生態(tài)規(guī)模較小且初學困難。在當代所有編程語言中,Python語言獨特的黏性使其成為最適合開展面向計算生態(tài)教學的編程語言。
“理解和運用計算生態(tài)”指在Python語言程序設計入門課程中引入計算生態(tài)相關的教學內(nèi)容,顯式地讓學生產(chǎn)生對計算生態(tài)概念的認知,以指導后續(xù)程序設計實踐。該教學理念包括如下兩層含義:
(1)理解計算生態(tài)。讓學生廣泛感知計算生態(tài)的存在,并認識到計算生態(tài)的價值和作用。針對入門課程,可以結合一些基礎且零散的Python標準庫或第三方庫開展教學。如講解random庫,介紹隨機數(shù)的概念和應用;講解jieba庫,介紹中文分詞的方法和原理;進一步可以結合math庫,講解數(shù)學運算函數(shù)的使用,并且引導學生用Python程序?qū)崿F(xiàn)math庫中的一些功能。通過這種方式打開學生視野,使其理解計算生態(tài)在程序設計中的作用和基本使用方法。
(2)運用計算生態(tài)。面向能力培養(yǎng),圍繞一系列第三方庫培養(yǎng)學生掌握某一方面的基礎能力。如講解requests庫、beautifulsoup庫和re庫,培養(yǎng)學生掌握Web爬取和信息提取的能力;講解numpy庫、matplotlib庫和pandas庫,培養(yǎng)學生掌握數(shù)據(jù)處理和展示的能力。系列第三方庫的教學將提升學生對計算生態(tài)的理解和認識,形成有用的實戰(zhàn)能力。
3 面向計算生態(tài)的Python語言入門課程教學方案
3.1 Python語言入門課程教學方案
筆者參與編寫了2016年教育部教指委《基本要求》中Python語言教學方案,并于2017年出版了相關教材[4],2013—2017年在北京理工大學進行了7次教學實踐,以“理解和運用計算生態(tài)”為理念,構建了一套相對成熟的Python語言入門課程教學方案。需要注意的是,盡管強調(diào)計算生態(tài),Python語言入門課程也需要同時重視對Python基礎語法和基本編程思路的培養(yǎng)。基本編程方法、Python語法和計算生態(tài)培養(yǎng)3者同等重要。
Python語言入門課程教學方案分為3個部分,建議48學時或更多,作為第一門程序設計類課程,教學方案如圖2所示。
該方案中“Python語言基本語法”部分主要講解程序的基本編程方法及Python語言基本語法相關的內(nèi)容,在前32或48學時內(nèi)講授?!袄斫庥嬎闵鷳B(tài)”部分主要講解零散的第三方庫,配合Python語言基本語法,可以講授turtle庫、math庫、random庫、PIL庫等,通過有趣且實用的案例保護學生對程序設計的學習興趣,在第4—32或第4—48學時內(nèi)講授,該階段不建議講解更多庫?!癙ython語言基本語法”和“理解計算生態(tài)”這兩部分內(nèi)容相互融合、相互支持、相輔相成,通過講解部分庫可以構造有趣的實例,語法學習的逐步深入也助于對庫的理解和學習?!斑\用計算生態(tài)”部分講解面向能力的系列庫,建議圍繞5個方向進行教學。
(1)文本分析方向。通過分詞jieba和自然語言處理NLTK庫講解,形成處理中文、英文等文本并進行分析的基本能力。
(2)數(shù)據(jù)處理方向。講解多維數(shù)據(jù)表示numpy庫和數(shù)據(jù)展示matplotlib庫,形成表示數(shù)據(jù)、繪制數(shù)據(jù)展示圖及開展深入數(shù)據(jù)運算的基本能力。
(3)網(wǎng)絡爬蟲方向。講解Web爬取requests庫、HTML解析beautifulsoup(bs4)庫和正則表達式re庫,形成爬取數(shù)據(jù)、分析并提取網(wǎng)頁數(shù)據(jù)的基本能力。
(4)機器學習方向。講解數(shù)據(jù)處理pandas庫和機器學習算法集scikit-learn庫,形成清洗數(shù)據(jù)并進行機器學習分類、聚類和回歸分析的基本能力。
(5)圖形繪制方向。講解圖形繪制的turtle庫和GUI設計的qt5庫,形成基本的GUI實現(xiàn)和圖形創(chuàng)意設計的基本能力。
3.2 教學方案的靈活運用
面向計算生態(tài)的Python語言入門課教學方案適合面向各本科專業(yè)開設,其中,“Python語言基本語法”和“理解計算生態(tài)”兩部分內(nèi)容適用于所有專業(yè),“運用計算生態(tài)”部分建議結合專業(yè)特點來設計,靈活運用方式如圖3所示。
對于計算機類專業(yè),建議選擇網(wǎng)絡爬蟲方向,引導專業(yè)學生理解互聯(lián)網(wǎng)、網(wǎng)絡數(shù)據(jù)組織、搜索引擎、正則表達式等概念。
對于媒體藝術類專業(yè),建議選擇圖形繪制方向,理解程序設計對圖形藝術繪制的支持。
對于信息類專業(yè),建議選擇機器學習方向,引導學生學習并應用基本的機器學習方法,用數(shù)學化、概率化和工程化思路解決問題。這部分內(nèi)容相對較難,需要視學生基礎來適當調(diào)整,也可以選擇網(wǎng)絡爬蟲或數(shù)據(jù)處理方向。
對于經(jīng)管類專業(yè),建議選擇數(shù)據(jù)處理方向,加強學生對數(shù)據(jù)的敏感性,通過股票數(shù)據(jù)分析等實例強化學生對專業(yè)的理解。
對于人文類專業(yè),建議選擇文本分析方向,為后續(xù)文本統(tǒng)計分析的專業(yè)需求奠定初步基礎。
北京理工大學從2013年開始的7次教學實踐覆蓋經(jīng)管類、信息類、計算機類、媒體藝術類等20余個專業(yè),先后選擇教學方案中網(wǎng)絡爬蟲、圖形繪制和數(shù)據(jù)處理等方向,實際教學效果表明學生可以在32學時內(nèi)基本掌握程序設計方法并保持較高的熱情學習,結課后有相當比例學生持續(xù)開展Python編程,教學效果良好。結合上述教學方案,我們在中國大學MOOC[5]平臺先后開設了7門Python語言MOOC課程,包括入門課程Python語言程序設計、Python網(wǎng)絡爬蟲與信息提取、Python數(shù)據(jù)分析與展示、Python機器學習應用、Python科學計算三維可視化、Python游戲開發(fā)入門、Python云端系統(tǒng)開發(fā)入門等。
4 結 語
將“理解和運用計算生態(tài)”作為Python語言入門課程教學理念,在北京理工大學信息、管理、人文、車輛、軟件、計算機等11個學院20余個專業(yè)采用選修課和必修課進行試點,教學效果突出,學生響應積極且熱烈,初步說明了面向計算生態(tài)的Python語言入門課程教學方案的有效性。
2016年,北京理工大學將Python語言作為全校公共基礎課重要的入門必修課程,寫入修訂的培養(yǎng)方案;更為重要的,北京理工大學在“雙一流”“新工科”建設的大背景下,將Python語言寫入計算機類、軟件類、信息類等專業(yè)5年發(fā)展計劃,將進一步探索利用Python語言和計算生態(tài)推動建立專業(yè)課程改革的新模式。
參考文獻:
[1] 教育部高等學校大學計算機課程教學指導委員會. 大學計算機基礎課程教學基本要求[J]. 北京: 高等教育出版社, 2017.
[2] 嵩天, 黃天羽, 禮欣. Python語言: 程序設計課程教學改革的理想選擇[J]. 中國大學教學, 2016(2): 42-47.
[3] Raymond E S. 大教堂與集市[M]. 衛(wèi)劍釩, 譯. 北京: 機械工業(yè)出版社, 2014.
[4] 嵩天, 禮欣, 黃天羽. Python語言程序設計基礎[M]. 2版. 北京: 高等教育出版社, 2017.
[5] 中國大學MOOC[EB/OL]. [2016-06-30]. http://www.icourses.cn.
(編輯:彭遠紅)