查看原文
其他

【封面文章】面向计算生态的Python 语言入门课程教学方案

2017-08-11 嵩天 黄天羽 礼欣 计算机教育

2017年《计算机教育》第8期 封面文章


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++、VisualBasic(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 所示。

(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.





【校长专访】勇做职业院校信息化人才培养的排头兵——深圳信息职业技术学院孙湧校长专访

【校长专访】勇做职业院校信息化人才培养的排头兵——深圳信息职业技术学院孙湧校长专访

【特别推荐】媒体认知中的人工智能技术教学方法探究

【封面文章】基于Dais-CMX模型机的斐波那契数列指令集设计

【封面文章】无线网络实验教学中MATLAB和OPNET协同仿真策略研究

【封面文章】软件服务外包相关专业大学生创业调查报告

【封面文章】以计算思维为切入点的递归算法教学改革

【目录】《计算机教育》2017年第7期

【特稿】李未院士:任清华兼职教授的几点感想

【校长专访】互联网+ 一体化人才培养模式驱动职业教育改革创新——大连东软信息学院温涛校长专访

【目录】2017年第6期


计算机教育一个有用的公众号长按,识别二维码,加关注

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存