日期:2023-01-23 阅读量:0次 所属栏目:学前教育
中图分类号:G642
1 程序设计语言类课程的教学现状及问题
计算机学科知识结构更新快,其中,程序设计语言在短短的几十年间经历了较大变化。语言类课程是计算机学科的专业基础课程,其学习效果直接影响其他后续课程。当前语言类课程教学主要面临以下问题。
1.1 课程体系设置单一
国内高校计算机专业的程序设计语言类课程大多是过程式或者面向对象的命令式编程语言,课程体系设置单一。不可否认,这类语言无论是从学科性还是有用性上讲,都是合适的。然而,程序设计语言不仅仅是这类命令式语言,它还包括如ML、Haskell这样经典的函数式编程语言,或者如兼顾面向对象和函数式的Scala语言等。从某种意义上讲,函数式编程能够更大程度地锻炼计算思维[1]。在多核并行程序设计已经被推到前沿的今天,命令式编程语言天生的缺陷使得构造并行编程模型变得非常复杂,而函数式编程在经历数十年的发展之后,终于不再局限于实验室的理论研究。事实上,如果不懂得函数式编程,Google不可能创造出MapReduce。
1.2 教学过程僵化
程序设计语言类课程的传统讲授是按照编程语言类教材的典型撰写次序,先讲常量、变量、数据类型等,再讲表达式、语句等,再比较复杂的语言特点,这些花费了较多时间,最后可能不再有多余的时间剖析该语言的内建库函数或者类,更少涉及该门课程与后续课程的衔接关系。这种传统的讲授方式针对第一门程序设计语言课程的教学,特别对那些没有接触过编程语言的学生来讲,可能是一种较好的方式[2]。然而,对于第二门程序设计语言的授课,按照这种按部就班的教学过程推进教学进度时,由于在较长一段教学活动中所讲授的都是孤立的语法点,学生看不到一个较为完整的应用实例,也不了解这门课程与其他课程之间的贯通,容易产生厌学的心理,也很难体会程序语言的设计艺术。
1.3 重编程技能,轻计算思维
针对程序设计语言类课程实践性特别强的特点,许多教改措施都是针对如何提高学生的工程应用实践技能的[2-3],如采用案例化、任务驱动、项目驱动等方式。编程技术固然重要,然而计算思维比单纯技术更加重要。培养学生以计算机的方式进行思考和解决问题,让他们认识到程序是思想的表现形式,最终能够通过语言来表达思考与设计,并能理解这门语言设计和实现的长处、不足、限制等。为了达到这个目标,需要引导学生深入理解编程语言本身。
2 教学改革措施
2.1 增设函数式编程语言课程
函数式编程模型早在面向对象概念出现之前就已经存在了,它的核心是lambda演算。由于其语法不如命令式语言的语法直观易懂,许多初次接触函数式编程的人常常不知所措,会觉得难以理解。然而,这种难以理解性与熟悉程度相关。近20年的课程改革中,因为种种原因,程序设计语言类课程体系几乎完全抛弃了函数式程序设计语言。如今,多核时代的兴起,函数式程序代码的简洁性使得它在并发应用领域绽放光彩。虽然实用性是我们应当考虑的一个方面,但是从培养学生计算思维以及从编程语言本身的研究方面,增设函数式编程语言课程是很有必要的。
常用的函数式编程语言或者具备函数式编程语言特点的编程语言包括Haskell、ML、OCaml 、Scala等。依据需要可以选择不同的函数式编程语言:如果倾向于编程语言本身的理解,可以选择纯函数式的ML、Haskell,或者OCaml;如果倾向于并行分布式程序的开发,可以选择结合了面向对象和函数式特点的Scala语言,它兼容Java。此外,Java 8的lambda表达式也是一个不错的学习函数式编程的选择。
2.2 适当调整讲授内容的次序
以Java程序设计语言的教学为例,按照常规教材的编写次序,Java的教学内容通常是先讲变量、类型、表达式和语句,然后是数组,接着是类和对象、继承等。在实践中我们对讲授内容的次序进行了调整:在对Java语言作了初步介绍之后,紧接着讲解对象的创建和使用,见表1。表1第2行的内容不再放在讲解了类的定义之后。这个调整出于两方面的考虑:一方面,让学生尽快建立对象的概念,知道怎么使用对象;另一方面,数组在Java程序设计语言中视为对象,因此,讲解了如何使用对象之后有利于数组的讲解。而类的定义涉及较多语法知识,在讲解了如何使用对象、变量、类型、表达式和语句之后,引导学生考虑这个问题――我们能不能按照自己的设计来创建对象呢,于是开始讲解类的定义,见表1第5行。
为了讲解如何使用对象,首先选择两个常用的Java内建类――字符串String和System,针对已经学习了C语言程序设计的学生,从教学效果上看,尽管学生还没有接触到Java的各种语法规则,但是他们仍然接受了“对象”这个知识点的讲授。更重要的是,他们建立了对象的初步印象,了解了Java与C的不同,并在一定程度上激发了学生的学习兴趣。
由于Java程序需要使用标准输出流的方法System.out.print()用于输出程序的运行结果,学生就问:Java程序怎么输入呢?此时,对输入输出流进行较为完整的讲解显然不合适,在讲解使用对象时,我们进一步讲解如何使用Java的字符缓冲输入流类BufferedReader,直接给出如下板书:
BufferedReader br = new BufferedReader(
//BufferedReader需要一个Reader类型的参数 //InputStreamReader就是一个Reader
new InputStreamReader(
//InputStreamReader需要一个InputStream类型的参//数,System.in就是一个InputStream
System.in));// System.in用于接受键盘的输入
br.readLine(); //BufferedReader的readLine
//方法读入一行
以上这段代码稍显复杂,学生在课余可以仔细研究并进行试验。实践表明,这些Java常用内建类的使用在教学初期给出时,不但没有造成学生的困惑和畏惧,反而提升了学生的学习热情。
2.3 引导学生深入理解程序设计语言
程序?O计语言类课程对于培养学生的计算思维非常重要,需要学生深入理解程序设计语言本身的设计与实现,而不仅仅是学习单纯的语法。
通常学生因其视野的局限性和课时的限制,无法深入学习一门程序设计语言。教师在授课时应该找机会引导学生去深入理解。通常,语言设计和实现者提供了API文档和源码,这些是深入理解一门编程语言最直接也是非常好的参考资料。如果学生能够养成查看API的习惯,无疑能够促进对语言的认识和理解。以引用类型变量的讲解为例,假设变量p引用的是一个Person类型的对象,变量s引用的是一个String字符串对象。System.out.print(p)输出结果是代表对象地址的哈希码,而System.out.print(s)输出了一个字符串。这是为什么呢?同时,有学生就会提出疑问:System.out.print(p)是否可以直接输出p所引用的Person对象的成员值,如姓名和年龄等,而System.out.print(s)是否可以输出这个字符串对象的地址哈希值?在这个过程中,可以引导学生逐步查找对应的API,如图1所示。最后可以进一步查看Object类和String类对应方法的实现源码。知道了这个思路后,学生豁然开朗,开始着手解决问题。
在教学实践中,我们常常鼓励学生按照这种方法去找解决思路,而不是直接给出答案。得益于Java的开源,在Java程序设计语言的教学活动中,我们也鼓励学生查看javac编译器或者JVM的即时编译器的实现源码。学生通过这种学习方式,在长期使用一门程序设计语言后,最终能够驾驭语言,表达类似计算机方式的思考与设计。
3 结 语
在兼顾学科性和社会有用性方面,我们一直致力于计算机专业程序设计语言类课程的教学改革。结合教学实践以及对计算机专业程序设计语言类课程如何开展教学的长期思考,我们针对存在的问题,给出了相应的解决办法,并作了初步尝试,取得了一定的效果。程序设计语言类课程的教学任重道远,我们应该投入热情,积极摸索和实践,总结经验教训,使程序设计语言类课程体系更趋于合理,不断提高教学质量。
本文链接:http://www.qk112.com/lwfw/jiaoyulunwen/xueqianjiaoyu/218017.html