APP下载

以计算思维为核心的程序设计入门类课程教学研究*

2018-08-01王勇刚

中国教育信息化 2018年14期
关键词:程序设计编程模块

王勇刚

(云南大学 旅游文化学院,云南 丽江 674199)

程序设计类课程是计算机类专业学生必修的核心课程。在计算机类专业中一般作为学生入门级的课程,地位非常重要。该课程对于计算机类学生后续专业课程知识的学习起着举足轻重的作用,但往往也是这门课程将计算机类专业的学生挡在了门外。这很大程度上都源于只重视某门程序设计语言本身的语法讲解和应用。尽管有些教师研究了一些比较好的教学方法,能使大部分学生学好一门程序设计语言,但遇到其它类型的程序设计语言时绝大部分学生很难达到无师自通的水平。因此,有些学校的人才培养方案中开出多门程序类的课程,以求学生能掌握更多的程序设计工具,可结果却事与愿违。

一、程序设计入门级课程教学中遇到的问题

1.语言繁多,难以抉择

目前许多高校普遍开设了各种高级程序设计语言课程,如 Pascal、C、C++,甚至部分高校开设了 Java、C#、Lisp、Prolog等程序设计语言课程[1]。这些语言中哪一门课程作为入门级的程序设计课本身就存在很大的分歧。Java作为入门级教学语言就存在不少争议[2],有人认为C作为入门级语言已经滞后[3],等等。笔者认为无论哪种语言,它们都有相通之处——计算思维。其目的都是要培养学生分析问题、解决问题的编程能力。而这种能力的培养,不同程序设计语言只是方式方法上略有不同。例如命令式的书写方式、面向对象的设计方法、函数式程序设计、逻辑式程序设计等。笔者所在的学校就以《Java程序设计》作为大一新生的入门级程序设计课程。

2.应用型本科与职业教育的区别

笔者所在的学校以培养应用型人才为目标,但又不同于职业教育。主要区别在于高职教育岗位迁移能力和发展后劲不足,而应用型本科教育过度强调系统理论学习,实践能力不足[4]。其主要原因就是应用型本科类的专业教学实践时间远不及职业教育。因此计算思维的能力培养显得尤为重要。

3.课程体系的把握不到位

一个专业的人才培养方案以及由此而确定的专业课程是一个完善的体系,各门课程前后往往有着密切的联系。但是各门课程的授课教师往往只是对本门课程研究比较深入,而忽略了课程之间的联系。这就使得学生在学习程序设计语言课程时视野狭窄,看不到它在今后的学习甚至是工作中会有哪些更深入的应用。当然有限的课时以及入门级的学生还不具备学习这些知识的能力,但要通过这门课程的学习使学生具有初步的了解,从而提高学生的学习兴趣。

4.很多好的教学方法对于刚入门的学生效果欠佳

《沉浸式项目教学法在JAVA课程中的应用》中强调学生的专注度,通过激发学生的兴趣引导学生进行全身心的投入[5]。《多元化考核方式在Java程序设计课程中的应用研究》中介绍通过多种有效考核的方式,以能力考核为重点,来激励学生学习[6]。《“案例驱动+项目导向”的Java程序设计课程教学模式研究》中以项目驱动的方式来组织教学[7]。《Java程序设计课程开放式教学》中通过课程第一堂课组织、核心课程网站建设、优秀学生上台展示演讲、软件大赛引导、校企联合实训、系统大作业训练等形式,采用开放式的形式组织教学[8]。《CDIO工程教育模式下的主动式项目驱动学习——以“Java程序设计”课程为例》中强化实践教学,增强职业能力,培养合格的软件工程师为目标[9]。以上这些方法对于刚入学的大一新生来说都很难实施,因为学生连打字都还不娴熟,又如何要求他们有能力去达到这些教学方法中的要求呢?《基于计算思维的Java程序设计课程教学实践》中虽然强调了计算思维的重要性,但也只是通过强化实践训练来达到教学目标,可结果并不乐观[10]。《基于计算思维的Java程序设计教学改革》中同样也只是强调实例强化突破教学瓶颈[11]。《以“计算思维”为导向的程序设计入门类课程改革探索》中提出了“流程图+算法设计”的方法,结合图形形象思维以提高学生的编程能力,但也并未对计算思维的过程进行梳理[12]。

二、应对之策

1.问题分析

首先,大一刚入学的新生大部分未深入接触过计算机,对计算机的认知比较粗浅,一开始就学习程序设计这类核心难度较大的专业课程,本身就是一道难以逾越的学习屏障。其次,各种创新教学方法的提出,针对学生进行创新能力的培养,笔者认为这都高出了新生能够认知和接纳的范围。创新能力是基于专业基础知识能力的,没有扎实的基础空谈创新能力,都是无本之源。此外,一个企业级的专业人才是在本行业进行长期实践的过程中逐步成长起来的,仅仅依靠项目驱动式教学的方式来提高学生的实践应用能力,只能是杯水车薪、效果甚微。最后的结果就是学生只是了解了一些零散的知识,没有形成有效的计算思维能力,实践能力更是苍白乏力。

2.解决之道

君子务本,本立而道生。首先,要针对新生的特点和课程在教学体系中的地位,确定教学目标及教学内容的取舍。其次,学生计算机知识能力还停留在“零”的水平,高大上的东西还只能远观而不可亵玩。此外,学生以前形成的学习思维方式与计算思维方式有很大的区别,思维方式的转变与形成,成为本门课程教学需要突破的关键问题。

对程序设计类课程而言,编程能力是计算思维和技能化知识的综合体现。计算思维正确与否也必须经过实践的检验[13]。而计算思维是运用计算机科学的基础概念进行问题求解、系统设计以及人类行为理解等涵盖计算机科学之广度的一系列思维活动[14]。

笔者以《Java程序设计》课程教学为例,通过多年的实践摸索提出一种基于计算思维的分模块教学方法。该方法的特点是重计算思维梳理,按计算机解决问题的步骤,分模块依次进行教学,再辅以简单的程序设计案例题,以数学思维和计算思维两种方式相融合进行解题,以此来提高学生对数学思维和计算思维的认知,并迅速完成数学思维到计算思维的转变与形成。

三、具体措施

1.教学内容的取舍

该专业人才培养方案将《Java程序设计》作为新生入门级程序设计语言课程,没有任何的先修课程作为辅助,后续课程主要有Java Web、Android应用开发、J2EE等。鉴于此,本门课程的培养目标为培养学生的计算思维和编程能力。教学内容从过程控制开始,到面向对象的程序设计方法为止,主要以命令行的形式组织教学。而Java机制下的其它应用任务交由后续相关课程去完成,但必须让学生清楚地了解到后续课程的相关要求。

2.计算思维的梳理——模块划分

很多教师在进行程序课程教学的时候,往往一开始就从简单的语法规则入手,附加一些程序案例,想让学生通过潜移默化的过程慢慢地从中领悟计算思维的方式,并形成一定的程序设计能力。基本上所有的教程书籍也都是以这样的方式来组织的。笔者以程序设计解决实际问题的流程入手,一开始就给学生梳理计算思维的全过程,然后分模块各个击破,最终达到教学目标的要求,能培养学生较强的程序设计语言的迁移能力,使他们了解无论使用何种编程语言,其过程都是类似的。

(1)程序设计的流程分析

程序设计的目的就是编写程序控制计算机,让它来为人类解决实际问题,其流程如图1所示。

图1 程序设计的一般流程

(2)模块划分

在程序设计的流程分析中,分析问题、抽象事物、描述数据三个方面融入到了编程实践的过程中,与程序设计的具体实施紧密相连,因此它们是贯穿于编程实践的过程中。模块的划分如表1所示。

表1 授课内容模块划分

模块的划分根据程序设计的基本流程进行,其特点与笔者通过文献检索或者访问交流中了解的内容相比,有以下特点:

①任何一门语言其涉及面都很广泛,如果作为新生入门级的程序设计课程不应该也不可能全方位的讲解。

因此从培养学生计算思维能力的角度入手,在内容的取舍上,笔者立足于面向过程的流程控制编程能力的培养和面向对象的控制台应用技术能力的培养两方面。其它应用领域的内容放在扩展认知中,即只是蜻蜓点水般地给学生提一提,留下悬念,并指导其在今后的专业学习中什么时候或哪些地方可以学到、用到。

例如,在讲解数据如何存储、存储在哪里的时候,首先,从最简单的单变量数据存储开始,让学生编写一个小程序,将Java提供的所有基本类型都申请一个变量,从键盘输入一个原始数据,然后将其输出,并告之内存空间是存放数据的地方。此处不对数据进行任何的处理,只是让学生知道如何输入一个简单数据,如何存储在内存变量中,又如何将其进行控制台输出。此后,一般教师的做法就会讲解基本运算、基本控制语句等内容,但笔者却不是如此,而是马上向学生提出几个问题:除了内存中可以存放数据,哪些地方还可以存放数据呢?一个变量只能存储一个简单的数据,那么如何存储一系列数据呢?Java程序设计语言提供了这样的方式来操作,其它语言肯定也要提供这样的操作,其做法会有什么不同呢?这些问题马上就把学生引入到了计算思维的领域中来,而问题的回答不会深入地去讲解如何解决这些问题,而是引导学生将来在哪些课程中会接触到。于是就在扩展认知中提出。之后,顺理成章地进入到批量数据的存储模块。马上讲解数组是如何定义存储数据的,如何把里面的数据读取显示出来。同样以一个简单的程序来实践数组的定义、数据输入、数据显示操作。实践完成后又立即抛出一些问题:数组空间可以有多大?内存有多大?存不下了该怎么办?一台电脑可以存多少数据?一台电脑可以直接接入多少外存?多个电脑是否可以存放同一应用中的数据等等,这些问题就会引导学生去了解现在有哪些技术是用来解决这些问题的,让学生对将来的专业学习有一个清醒的体系认识,了解这些技术都与程序设计有关。

②模块的划分并不是以Java程序设计语言本身的结构进行,而是根据程序设计的基本流程进行。

程序设计处理的对象是数据,自然要解决的问题就是数据如何描述,之后如何存储、如何处理、如何输出。因此不论哪种程序设计语言都要想办法解决这些问题,只是方式方法略有不同。所以,首先从程序设计语言提供的基本处理操作入手,了解表达式、语句等一系列最底层的操作,并告之无论哪种程序设计语言一开始都是如此。之后引入流程控制的三种结构。然后讲解将复杂的操作分成不同模块进行处理。之后又引入封装技术,将复杂的数据和模块分类表示,从而引入面向对象的处理方式。按照这样的流程一步一步地将知识传授给学生,而不是单单介绍Java程序设计语言是如何做的。

③计算思维直接就从划分的模块过程中完美地体现出来。

模块的划分直接以程序设计的流程来进行,而这个流程也直接反应了计算思维的过程。计算机处理的任何对象都可以看成是数据的某一种形式。而任何数据在计算机中都有一个最原始的表示形态,其存储只是存在不同方式、不同位置等差别。对数据的处理也都是由最基本的语句指令通过不同的流程控制结构进行模块划分和封装之后来进行,一切的处理过程最终都将回归到计算机提供的指令系统来完成。按照这样的方式,学生对计算思维的过程很容易就有了一个简单明了的印象,并对程序设计的底层编程能力有了一个全面的认知和掌握,也使得各种程序语言工具之间的迁移能力有了显著的提高。自从按照这样的方法进行程序设计语言课程的教学后,后续课程教学的教师反馈给笔者的信息是学生学习能力相比以前有了很大的改观。

④所有教学实践案例都以最简单的形式进行,并未像其它教师一样采用项目驱动式或者大型案例系统的方式组织。

笔者在网络上检索的“趣味编程100例”和“奥数网”上大量的题目作为学生实践应用的案例。这些题目都比较简短,但都能充分体现学生最底层的程序设计处理能力,并且大量题目都能体现数学推理与计算思维之间的区别与联系,从而使学生能够更好地理解数学思维与计算思维的方式方法,并最终能让学生充分掌握计算思维的应用。

3.两种思维方式解题举例

学生一直以来接触的都是数学思维的培养,而计算思维虽然与之有很大的联系,但又有巨大的差别,因此笔者在组织教学的过程中经常用这两种思维方式来指导学生进行编程实践。以下例举一个具体的实例来与大家进行分享。

例题:有甲、乙、丙三人同时同地出发,绕一个花圃行走,乙、丙二人同方向行走,甲与乙、丙相背而行。甲每分钟走40米,乙每分钟走38米,丙每分钟走36米。在途中,甲和乙相遇后3分钟和丙相遇。问:这个花圃的周长是多少米?

学生遇到这样的题目,不自主地肯定是以数学思维的方式来解答,笔者就顺应学生已有的思维方式来进行。

首先,假设周长为L,甲与乙相遇的时间为t。从而得到甲与乙相遇时周长可表示为:L=(V甲+V乙)×t。甲与乙相遇时周长可表示为:L=(V甲+V丙)×(t+3)。 其中:V甲、V乙、V丙分别表示甲乙丙的速度。之后换算得到求t的表达式:t=(3V甲+3V丙)÷(V乙-V丙),最后得到 L的值。 编程实现后,就让学生思考,这样的方式还需要自己去进行推导,换算相应的表达式,那么有没有更好的方式让计算机自己去求解呢?

然后,提出用计算思维方式去求解这道题目。同样假设周长为L,甲与乙相遇的时间为t,并将t赋值为1,即假定两人相遇至少要花1分钟的时间。然后利用这个时间t去计算甲与乙相遇时走过的路程,再计算t+3分钟后甲与丙走过的路程,最后利用循环结构判断这两个路程是否相等,若不等则将t的值增1,继续循环,若相等则循环结束,从而得到的t就表示甲乙两者相遇所用的时间,之后计算出花圃的周长。程序如下:

以上通过编写程序求解简单问题的两种思维方法清晰明了地给学生展现了数学思维方式和计算思维方式的不同。学生通过这样的简单应用案例,从中更容易接受和掌握计算思维在程序设计过程中的体现。相比文中开始部分提及的各种教学方法,更适合入门级学生对程序设计语言课程的了解和掌握。

本文提出的基于计算思维程序设计的教学方法更注重帮助学生对该思维方式的疏通和引导,通过简单程序设计应用解题,直接将传统的思维方式和计算思维方式的解题过程对比,使学生轻而易举地掌握计算思维的过程,并明确地了解与传统思维方式的差别。通过两年的教学实践和高年级教师的教学反馈,验证了该方法更适合新生入门级程序设计课程的教学。

猜你喜欢

程序设计编程模块
28通道收发处理模块设计
“选修3—3”模块的复习备考
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
基于Visual Studio Code的C语言程序设计实践教学探索
纺织机上诞生的编程
从细节入手,谈PLC程序设计技巧
高职高专院校C语言程序设计教学改革探索
PLC梯形图程序设计技巧及应用