面向计算生态的Python语言入门课程教学方案
2017-09-01嵩天黄天羽礼欣
嵩天+黄天羽+礼欣
摘 要:首先分析计算机技术发展的几个重要阶段,阐述不同程序设计语言与不同发展阶段的关系,提出将Python语言作为我国高校各专业程序设计入门语言的建议;其次从产业需求及对计算技术运用角度阐述计算生态的价值和作用,提出将“理解和运用计算生态”作为Python语言课程教学理念;最后介绍一套适用于各类型专业、灵活性强、具有鲜明时代性的Python语言入门课程教学方案。
关键词:程序设计;Python语言;计算思维;大学计算机;计算生态
0 引 言
2016年,教育部高等学校大学计算机课程教学指导委员会发布了《大学计算机基础课程教学基本要求》(简称《基本要求》)[1]。《基本要求》结合信息技术发展及国内高校开展教学情况,建议将C、VB和Python作为首门程序设计课程的教学语言,课时48~64学时。近2年来,国内一批高校逐步开设了Python语言,成为教学改革热点。20世纪90年代以来,编程语言从Pascal、C经历了VB、C#、Java,发展到今天的Python,很容易让任课教师产生一个认识——Python仅仅是编程语言的同质更迭。本文试图说明这种认识的片面性,并阐述Python语言进入高校教学体系的必然性[2]和教学方案。
1 程序设计语言的时代适应性
1.1 计算机技术的时代性
第一阶段“计算机系统结构阶段”(1946—1981年)。这个阶段计算机技术主要围绕计算机系统结构设计开展,服务于科学计算和商业数值计算,产生了超级计算机等不同类型的计算机系统。与这个时期计算机有限的计算性能和功能相对应,程序设计需要在程序逻辑和系统结构之间、处理能力和存储容量之间、计算和通信之间寻找优化和折中。这个阶段的计算需求催生了执行高效的C语言(1972年)。
第二阶段“计算机网络和视窗阶段” (1982—2007年)。这个阶段以TCP/IP协议标准化为标志。计算机技术主要围绕网络技术、视窗技术、多媒体技术发展,计算机技术提供满足个人计算需求的视窗应用和网络服务。网络带来的跨平台需求产生了Java语言(1995年)。由于微软Windows操作系统在个人计算机领域的高度普及,“所见即所得”的开发需求产生了Visual C++、Visual Basic(1991年)等视窗编程语言。
第三阶段 “复杂信息系统阶段”(2008年—)。这个阶段以安卓开源移动操作系统的发布为起点,一批新的计算概念和技术几乎同时提出并显著推动了计算技术的升级换代。虽然概念众多,很难有任何一个技术领域独领风骚,任何系统都需要不间断地完善才能提供更加安全可靠及更佳用户体验的功能。面对复杂的功能性和紧迫的迭代周期,计算机需要更高抽象级别的程序设计语言来表达高层次编程逻辑。一批脚本类型、高效表达高层次编程逻辑的编程语言相继诞生,包括Swift、Go、Ruby、R、Lua、Python等。其中,Python(2008年3.0版本)已经成为这个阶段的主流编程语言。
第四階段 “人工智能阶段”(2010年—)。随着深度学习、开源硬件、智能机器人、在线搜索引擎、量子计算等技术的发展,未来某个时期将会出现人工智能主导计算的技术阶段。2016—2017年间出现的AlphaGo、无人驾驶汽车、自然语言翻译等应用进展预示了未来阶段的逐步临近。计算机将逐步接管人类所有非创造性工作,计算机技术将进入一个未知的新阶段。
1.2 编程语言的适用性比较
计算机技术发展具有鲜明的时代性,程序设计语言发展也有类似特性。这里,以我国高校最常讲授的编程语言为例,如C、VB、Java、C++、Python、Matlab等,阐述各语言的历史定位和发展前景,综合比较见表1。
C语言最初用于编写UNIX操作系统,因此,该语言既表达基本程序逻辑,又表达软件对硬件的高效利用,如指针、精细到字节的数据类型等。编写与硬件紧密相关的程序是该语言的历史使命,因此,讲解该语言将重点培养学生对计算机系统结构的抽象能力。C语言适合计算机类专业学生学习。
编写Windows视窗应用是VB语言的历史使命。该语言在基本程序逻辑外,主要表达视窗系统中事件、控件和视窗体系下人机交互的关系。因此,该语言将重点训练学生视窗交互逻辑的理解。然而,随着移动互联网的快速发展,视窗应用已经逐步被以Web为基础的应用所取代,该语言的发展前景暗淡。至今,已经比较难找到学习该语言明显的受益群体。与该语言类似的语言还有VB.Net、VF.Net、C#等。
Java语言以运行时和跨平台为技术创新,同时,纯面向对象语言具有更高层次的代码封装能力,也为编程中更大规模库的构建提供了基础。Java语言主要训练学生通过“类”的概念理解计算问题中对象及对象间的主客体关系。此外,Java语言成为Android平台的首选开发语言,因此,软件类学生比较适合学习该语言。尽管Java语言现在十分流行,但其在移动互联网应用领域的份额逐渐被以HTML5为代表的前端脚本语言所替代,该语言未来的应用空间将逐渐变窄。
C++语言目标是取代C语言成为适合多人协作编写大规模程序的高效编程语言。从几十年发展来看,该语言的确成为软件工业中“大规模程序”的主流语言,但其复杂的语法和继承自C语言对系统结构的抽象使该语言仅成为专业人士的小众语言。C++适合计算机类和软件类专业同学学习,但并不适合作为入门语言教学。
Matlab严格来说是一个工具而不是编程语言,其主要优势在于对数据的处理。Matlab天然以矩阵为数据的基本单元,通过友好的用户界面、相对简洁的编程逻辑和大量的工具箱极大简化了数据处理的难度,成为工程领域重要的计算软件。Matlab适合信息类专业学生学习,其工具箱可以简化工程分析的复杂性。至今,Matlab仍然具有重要的使用价值,但不适合作为编程语言入门内容,因为严格来说,它不是一门通用的编程语言。
Python语言产生于1991年,受限于上世纪90年代程序设计语言理解的局限性,并未成为国际关注的主流编程语言。直到2008年,Python 3.0系列摒弃了之前版本的各种弊端,采用非兼容方式升级,奠定了当下流行的实质基础。Python语言诞生于复杂信息系统时代,它不仅有简洁的语法,更关注高层次程序逻辑,而将低层次逻辑通过封装其他语言代码(如C、C++)或集成第三方库方式实现。Python语言设计初衷是更快速更高效解决问题,因此,该语言将训练学生抽象问题和设计算法的能力,这正是计算思维培养的核心。作为入门编程语言,Python适合所有专业。
1.3 将Python作为程序设计的入门语言
在复杂信息系统时代,信息技术分工更加精细,面向问题求解的高层次逻辑表达是信息技术应用的主要矛盾。从程序设计语言的设计初衷和计算思维训练焦点来看,符合计算机技術发展的编程语言将能更好地引领学生真正进入信息时代。因此,我们提出如下建议,“将Python语言作为我国高校各专业程序设计入门语言”,主要有以下3个原因。
第一,Python语言符合计算机技术发展阶段。在新工科建设背景下,程序设计语言课程不仅要兼顾历史,更要面向未来。在计算机技术发展阶段变化明显的背景下,选择更符合未来应用预期的教学内容是教学改革的方向。只有面向未来的教学内容才值得进行大范围、深刻的教学改革
第二,Python语言教学将最有可能保护学生对程序设计的学习热情。十几年的程序设计教学实践并未在非计算机或软件类专业培养出大批合格的具备程序设计能力的学科人才。C、Java、VB都是非常难以理解的程序设计语言,因为这些语言除了基本程序逻辑外,都加入了额外的计算概念,如C语言的指针、Java的面向对象、VB的视窗交互等。实际上,以往程序设计入门课程并未纯粹训练学生分析问题、解决问题的程序设计逻辑,而将大量学时用于编程语言所附加功能的教学上,学生在未理解基本程序逻辑前提下再去理解较高级的计算概念,学习曲线陡峭,难以保持学习热情。Python具有相当简洁的语法,对程序逻辑设计比较纯粹,学习曲线平滑,有助于保护学生学习热情,将能够为进一步加深程序设计理解和运用奠定更好的学习基础。
第三,Python语言教学将能够激发学生的创新性。C、Java、VB等传统程序设计语言受限于概念和语法的复杂性,很难在有限学时内引导学生开展创新性程序设计训练。Python语言有十万余第三方库,其中部分库适合初学者进行程序设计探索。以北京理工大学某次教学实践为例,在最初12个学时里,学生可以尝试利用turtle库绘制各类型玫瑰花,如图1所示。创新是新思想的源泉,Python语言能够让学生结合特定编程模式探索思维空间的新事物。
2 Python教学理念:理解和运用计算生态
2.1 软件产业模式和计算生态的价值
20世纪80年代前,软件开发和使用近乎处于全封闭状态,与其他工业产品类似,它通过商业渠道分发和销售。随后,以Richard Stallman为代表的一批早期软件工程师在1983年启动了GNU项目,开始了“自由软件”的探索之路。从Stallman设想的由少数人参与的“大教堂模式”到Linus Torvalds实践的由几千人共同参与的“集市模式”[3],自由软件理念的改变不仅是开发模式的改变,也验证了以“共识原则”和“社会利他(egoboo)原则”组织软件开发的可行性和高效性,为随后自由软件发展奠定了可操作的开发原则。
经过近30年的发展,软件领域在创新模式、开发模式和商业模式方面都发生了翻天覆地的变化,已经与传统工业截然不同。软件领域所带来的最大不同在于软件领域已经逐步建成了由全球工程师自发组织维护的、覆盖信息技术几乎所有领域的、由协议保护但免费获得的“开源软件”体系,建成了良性发展的计算生态。
在计算生态的影响下,软件产业的创新模式从“刀耕火种”且产权独有的发展模式向 “避免重复造轮子”但产权清晰的开源软件利用模式转变。这种转变以快速集成已有软件功能为方式,突出问题的解决和产品快速迭代,不局限于软件开发的封闭性。这种模式极大地推动了信息技术的创新和发展。例如,AlphaGo在全球产生巨大影响力的同时,其背后的TensorFlow技术同期开源,并快速应用于机器翻译、自动驾驶、唇语识别等多个领域。这种快速创新受益于计算生态,也代表了软件领域新的产业模式。
计算生态是“生态”概念在计算机技术中的对应,广义指在计算机技术空间内,由软件、硬件、开发模式和设计理念构成的统一整体,各组成部分相互影响、相互制约、协同发展。本文所阐述的计算生态特指在程序设计领域构建的支撑计算机技术发展的生态体系,即以开源项目为组织形式,充分利用“共识原则”和“社会利他原则”组织人员,在竞争发展、相互依存和迅速更迭中完成信息技术更新换代并形成技术自我演化路径的有机模式。
计算生态没有顶层设计,而是以程序功能为单元自发组织和发展,具备3个特点:竞争发展、相互依存和迅速更迭,结合具体应用场景计算生态也被称为生态圈、编程生态等。以Python语言为例,全球有超过十万个第三方库,由公司、个人工程师等开发,以开源形式免费共享,具备以下显著的生态特点。
(1)竞争发展。对于重要的计算需求,存在2个及以上第三方库支持,形成了相互竞争的发展态势。例如,urllib、requests、scrapy等第三方库都提供网络爬虫功能;随着竞争深入,requests库成为简单页面爬取的主流工具,scrapy库成为可靠爬虫框架,urllib被逐步淘汰。
(2)相互依存。以“避免重复造轮子”为理念,第三方库在技术上存在广泛依存的关系,例如,中文分词jieba库,其内部使用了os、logging、marshal、math、hashlib等众多第三方库。第三方库之间也存在逐级封装的依存关系,例如,数据处理pandas库基于并扩展了numpy库。
(3)快速更迭。已经出现的第三方库在竞争中快速发展,不断迭代满足用户的最新需求,活跃的第三方库更新周期与商业软件产品更新周期相当或更短。由于社区庞大且开放,新的应用快速出现,计算生态发展迅速。
计算生态不同于传统API(应用程序接口)。前者由工程师结合需求自发创建,没有顶层设计,没有规划和约束,唯一驱动力是兴趣和对需求的满足;而API往往由单一公司或组织进行顶层设计和全局规划,如Windows API等。
随着产业模式向互联网思维和集成创新方向的演化,计算生态有效支撑了新产品的研发、原型和商业模式。产业界越来越多地依靠计算生态推动变革,而高校只对基本技术和技能的训练不能很好地顺应业界发展。应该看到,计算生态是当代信息技术发展最重要的支撑,它帮助信息技术快速演进和发展、推动创新不断产生、为普及最新技术铺平道路。在新工科建设大背景下,将计算生态引入程序设计课程教学不仅将改革教学内容,还能改变学生的创新意识,培养创新思维。
2.2 “理解和运用计算生态”的教学理念
针对Python语言教学,我们提出了“理解和运用计算生态”的教学理念。之所以在Python程序设计教学中引入计算生态,主要因为Python具有庞大的计算生态圈,十万多个第三方库覆盖几乎所有技术领域,受众面广泛,很多功能能够引起学生共鸣。其他语言或者只有大量API或者生态规模较小且初学困难。在当代所有编程语言中,Python语言独特的黏性使其成为最适合开展面向计算生态教学的编程语言。
“理解和运用计算生态”指在Python语言程序设计入门课程中引入计算生态相关的教学内容,显式地让学生产生对计算生态概念的认知,以指导后续程序设计实践。该教学理念包括如下两层含义:
(1)理解计算生态。让学生广泛感知计算生态的存在,并认识到计算生态的价值和作用。针对入门课程,可以结合一些基础且零散的Python标准库或第三方库开展教学。如讲解random库,介绍随机数的概念和应用;讲解jieba库,介绍中文分词的方法和原理;进一步可以结合math库,讲解数学运算函数的使用,并且引导学生用Python程序实现math库中的一些功能。通过这种方式打开学生视野,使其理解计算生态在程序设计中的作用和基本使用方法。
(2)运用计算生态。面向能力培养,围绕一系列第三方库培养学生掌握某一方面的基础能力。如讲解requests库、beautifulsoup库和re库,培养学生掌握Web爬取和信息提取的能力;讲解numpy库、matplotlib库和pandas库,培养学生掌握数据处理和展示的能力。系列第三方库的教学将提升学生对计算生态的理解和认识,形成有用的实战能力。
3 面向计算生态的Python语言入门课程教学方案
3.1 Python语言入门课程教学方案
笔者参与编写了2016年教育部教指委《基本要求》中Python语言教学方案,并于2017年出版了相关教材[4],2013—2017年在北京理工大学进行了7次教学实践,以“理解和运用计算生态”为理念,构建了一套相对成熟的Python语言入门课程教学方案。需要注意的是,尽管强调计算生态,Python语言入门课程也需要同时重视对Python基础语法和基本编程思路的培养。基本编程方法、Python语法和计算生态培养3者同等重要。
Python语言入门课程教学方案分为3个部分,建议48学时或更多,作为第一门程序设计类课程,教学方案如图2所示。
该方案中“Python语言基本语法”部分主要讲解程序的基本编程方法及Python语言基本语法相关的内容,在前32或48学时内讲授。“理解计算生态”部分主要讲解零散的第三方库,配合Python语言基本语法,可以讲授turtle库、math库、random库、PIL库等,通过有趣且实用的案例保护学生对程序设计的学习兴趣,在第4—32或第4—48学时内讲授,该阶段不建议讲解更多库。“Python语言基本语法”和“理解计算生态”这两部分内容相互融合、相互支持、相辅相成,通过讲解部分库可以构造有趣的实例,语法学习的逐步深入也助于对库的理解和学习。“运用计算生态”部分讲解面向能力的系列库,建议围绕5个方向进行教学。
(1)文本分析方向。通过分词jieba和自然语言处理NLTK库讲解,形成处理中文、英文等文本并进行分析的基本能力。
(2)数据处理方向。讲解多维数据表示numpy库和数据展示matplotlib库,形成表示数据、绘制数据展示图及开展深入数据运算的基本能力。
(3)网络爬虫方向。讲解Web爬取requests库、HTML解析beautifulsoup(bs4)库和正则表达式re库,形成爬取數据、分析并提取网页数据的基本能力。
(4)机器学习方向。讲解数据处理pandas库和机器学习算法集scikit-learn库,形成清洗数据并进行机器学习分类、聚类和回归分析的基本能力。
(5)图形绘制方向。讲解图形绘制的turtle库和GUI设计的qt5库,形成基本的GUI实现和图形创意设计的基本能力。
3.2 教学方案的灵活运用
面向计算生态的Python语言入门课教学方案适合面向各本科专业开设,其中,“Python语言基本语法”和“理解计算生态”两部分内容适用于所有专业,“运用计算生态”部分建议结合专业特点来设计,灵活运用方式如图3所示。
对于计算机类专业,建议选择网络爬虫方向,引导专业学生理解互联网、网络数据组织、搜索引擎、正则表达式等概念。
对于媒体艺术类专业,建议选择图形绘制方向,理解程序设计对图形艺术绘制的支持。
对于信息类专业,建议选择机器学习方向,引导学生学习并应用基本的机器学习方法,用数学化、概率化和工程化思路解决问题。这部分内容相对较难,需要视学生基础来适当调整,也可以选择网络爬虫或数据处理方向。
对于经管类专业,建议选择数据处理方向,加强学生对数据的敏感性,通过股票数据分析等实例强化学生对专业的理解。
对于人文类专业,建议选择文本分析方向,为后续文本统计分析的专业需求奠定初步基础。
北京理工大学从2013年开始的7次教学实践覆盖经管类、信息类、计算机类、媒体艺术类等20余个专业,先后选择教学方案中网络爬虫、图形绘制和数据处理等方向,实际教学效果表明学生可以在32学时内基本掌握程序设计方法并保持较高的热情学习,结课后有相当比例学生持续开展Python编程,教学效果良好。结合上述教学方案,我们在中国大学MOOC[5]平台先后开设了7门Python语言MOOC课程,包括入门课程Python语言程序设计、Python网络爬虫与信息提取、Python数据分析与展示、Python机器学习应用、Python科学计算三维可视化、Python游戏开发入门、Python云端系统开发入门等。
4 结 语
将“理解和运用计算生态”作为Python语言入门课程教学理念,在北京理工大学信息、管理、人文、车辆、软件、计算机等11个学院20余个专业采用选修课和必修课进行试点,教学效果突出,学生响应积极且热烈,初步说明了面向计算生态的Python语言入门课程教学方案的有效性。
2016年,北京理工大学将Python语言作为全校公共基础课重要的入门必修课程,写入修订的培养方案;更为重要的,北京理工大学在“双一流”“新工科”建设的大背景下,将Python语言写入计算机类、软件类、信息类等专业5年发展计划,将进一步探索利用Python语言和计算生态推动建立专业课程改革的新模式。
参考文献:
[1] 教育部高等学校大学计算机课程教学指导委员会. 大学计算机基础课程教学基本要求[J]. 北京: 高等教育出版社, 2017.
[2] 嵩天, 黄天羽, 礼欣. Python语言: 程序设计课程教学改革的理想选择[J]. 中国大学教学, 2016(2): 42-47.
[3] Raymond E S. 大教堂與集市[M]. 卫剑钒, 译. 北京: 机械工业出版社, 2014.
[4] 嵩天, 礼欣, 黄天羽. Python语言程序设计基础[M]. 2版. 北京: 高等教育出版社, 2017.
[5] 中国大学MOOC[EB/OL]. [2016-06-30]. http://www.icourses.cn.
(编辑:彭远红)