唐四薪,郑光勇
(衡阳师范学院 计算机科学与技术学院,湖南 衡阳 421001)
我国软件行业每年需要大量的程序设计人才,而我国高等教育培养的计算机人才虽然在数量上能满足需求,但在质量上仍然和软件企业的要求有较大差距。例如,很多计算机专业学生毕业后需要再参加社会培训才能从事软件开发行业工作。这说明我国程序设计类课程体系的教学效果仍然不能令人满意,特别是对于学生基础较一般的应用型本科院校。
由于程序设计能力是计算机专业学生的核心能力,因此如何改进教学,高效地培养学生的程序设计能力一直是一个具有重大研究意义的课题[1]。目前大多数教学研究都是对教学方法、教学手段进行改革,但对课程体系结构、培养目标层次这类教学改革的基础性问题研究较少[2-4]。
与我国相比,印度的高等教育毛入学率不及我国,但却培养了大量合格的软件开发人员,说明印度的软件教育比我国成功。有人认为,这是因为印度的母语是英语,因此学习软件开发有语言方面的优势。这种观点实际上并没有意识到问题的关键,我们认为这是由于两国在程序设计人才的定位、培养目标、课程层次侧重点方面的差异而造成的。
我国的高等教育是从精英教育开始的,程序设计教学一开始也是面向精英类学生的,因此培养目标的层次比较高,导致课程体系中高层次的课程比较多,低层次的、应用型的课程不足。随着我国高等教育由精英教育逐步走向大众化教育,虽然也做了一些调整,但仍然存在盲目拔高层次,程序设计课程体系的层次不清晰的问题,这才是引起我国程序设计类课程教学效果不良的真正原因,其主要不足可归结为如下4点。
首先,每个层次的教学目标不够明确,表现在:①课程设置和教学内容没有体现分层的教学目标;②一些高层次的课程或知识点在低层次教学目标尚未达到时就开设,比如学生学数据结构时连代码中大量出现的函数定义都看不懂,导致学生的学习效果不好;③一些应用价值很高的编程技能在高校教学中讲解比较空泛,没有引向深入和重点强化。
其次,根据建构主义学习理论,学生要掌握新知识必须和旧知识联系在一起才能被掌握,这就要求必须厘清程序设计类课程的层次结构,和认知的逻辑顺序,如果课程的层次结构没厘清,学生在构建知识体系时就不能把新知识和已有的旧知识很好地建构在一起。
第三,存在盲目拔高层次的现象,例如,高校数据结构课的大量内容都在讲一些比较高级的数据结构。但实际上,这些高级数据结构可能只在一些科研软件的开发编程中才会用到,而在大部分行业软件的开发中一般都用不到。与此相对的是,在软件公司中,经常要用到的一些技术(比如程序的封装,软件的设计模式)等,在高校开设的课程中又没有系统地讲授。比如,学生在没有学过微观上设计软件的课程——“设计模式”情况下,就去学习宏观上设计软件的课程——“软件工程”,其教学效果当然不可能会好。
最后,没有体现兴趣引导、任务驱动的教学策略。过去,普遍存在教程序设计课程就是教编程语言的误区。例如,学生学习的第一门语言多为C语言或VB,而这两种语言对于初学者来说无法做出比较有实用价值的程序;另一方面,侧重于以语法为重点进行教学,使学生容易陷入繁冗的语法格式等细枝末节而忽略程序设计的本质,忽略程序语言设计者的设计思想,降低了学生对编程的兴趣,不利于学生编程思维的塑造与培养。
总体来说,程序设计类课程体系的设置和教学研究还处在逐渐深化的过程中,存在以下问题和不足:①由于研究者大都是教育工作者,自身缺乏开发大型软件的实践经验,因此对编程学习的层次和路线大多缺乏亲身体会经验;②只是在教学模式上提出了层次阶段模型[5],但并未对编程课程的知识结构进行层次分析,使得将教学模式转换应用到实际教学中还存在难度;③过于强调教学内容的系统性和完备性,对编程中需要掌握的重点技能(如函数设计、问题抽象、团队分工开发等)强化不足[6]。
虽然程序设计课程的教学体系庞大且不断发展变化,但是学习编程的模式和步骤是相对固定的,根据编程需要学习的各个知识面,将其抽象划分为3个方面,称为程序设计课程体系的3个维度,如图1所示。
图1 程序设计课程体系教学的维度和层次划分
维度一:界面编程及用户交互(主要包括Windows界面、Web界面和APP界面等的设计和交互)。
维度二:编程访问外部资源(包括访问文件、数据库编程和Socket网络编程)。
维度三:各种平台下的编程(Windows平台、Linux平台、安卓平台、嵌入式平台)。
划分维度后,根据每个维度的难易程度和学生的兴趣,可以更清晰地规划出学生的学习路径,为更好地编写课程标准和人才培养方案提供参考。对于应用型本科人才培养来说,教学内容的改革应着重放在维度一和维度二上。
接下来,研究程序设计类课程的学习层次,并按照学习层次设置相关课程。依据是编程能力是一种可分层的能力,教编程不是教语言,每种语言都有一些共同的内容,程序设计类课程对语言的依赖性很低,而对几种固定的能力依赖度却很高。程序设计依赖的几种固定的能力可划分为图1所示的5个层次。
第一层次:学会基本语法,基本程序结构。
第二层次:学会程序封装,功能和数据封装(包括使用函数封装程序功能,使用结构体封装数据,使用类封装数据和功能)。
第三层次:学会利用设计模式抽象问题(包括UML建模、类的设计)。
第四层次:学会使用特殊数据结构,设计高效算法(数据结构)。
第五层次:掌握软件开发的过程与方法(软件工程)。
最后,研究初学者学习编程的习得过程,在课程内容设置上,注重分散难点,由浅入深,问题驱动。在实验案例设置上,注重案例的实用性、综合性、趣味性和难易适中性。
依据基于维度和分层课程体系划分,可给出一种一般化的程序设计类培养目标、课程体系安排和课程教学模式,以及可操作的教学模式和程序,对计算机专业程序设计类课程的理论和实验教学的设置提供参考和推广价值。具体的实施步骤如下。
(1)分析程序设计类课程体系的层次和维度,根据层次找到最佳的学习路径,培养目标,根据维度确定最合适的入门点和学习范围。
(2)根据分层教学目标构建课程体系,并重构每层次课程的设置和每门课的教学内容。
(3)分析新构建课程的知识结构,将知识点分类为元知识(基础知识)、硬知识(识记的知识)和软知识(实践类知识),分别设计教学策略和教学方法。
(4)根据上述步骤进行教学实践,再总结出一般的教学过程、教学方法和教学策略,将其用培养方案、课程标准和教材、研究论文等形式表现出来。
对程序设计类课程体系划分维度和层次,并不是要求在开设课程时涉及所有的维度和层次,而应该根据学生的实际水平,或依据社会对专业的人才需求,灵活地选择其中某几个层次和某些维度。以应用型本科院校来说,课程体系的维度可如下设置。
(1)对于偏硬件开发的方向,应侧重学习维度三的内容,即掌握各种平台下的编程(Windows平台、Linux平台、安卓平台、嵌入式平台);在编程层次上,学生达到第二层次就可以。
(2)对于偏网络开发方向(如网络工程专业),可重点加强维度二内容的学习,包括网络编程和Web编程。学生达到第二层次就可以。
(3)对于偏软件开发方向(如软件工程专业),学生至少需达到第三层次。对于维度来说,应主要学习维度一和维度二的内容,包括各种界面和交互的编程,以及编程访问外部资源(包括访问文件、数据库编程和Socket网络编程)。
为了培养适应软件企业需要的编程人才,应用型高校在教学中,应将人才培养目标定位在达到第三层次为宜,对第四、五层次只需有一定的了解即可。因为,第一层次是基础,第二、三层次是重点,教学改革的重点应放在第二、三层次的改革上。
基于分层和维度的方法,进行程序设计课程体系的设置。
(1)对于第一层次,主要是通过编程语言来学习基本语法和基本程序结构,编程语言以开设2~3门为宜,教第2门语言时应注意与第1门语言作对比分析,这样学生才能通过比较几种编程语言的异同对程序设计有更深的体会。在编程语言的选择上可根据专业学习或社会的需要灵活地选择,例如,我校一般选择C++、Java和Python作为第一层次教学的编程语言。
第一层次的课程可以与维度一的课程结合起来开设,如开设“Windows界面编程”“Web编程”等课程。界面编程与数据交互是制作实用程序的基础,且学习界面编程能有效激发学生学习编程的兴趣,界面编程本质上比较简单,适合于尽早开设,按照难易程度,可按照Web编程、Windows编程和安卓编程的顺序进行学习。
(2)对于第二层次,可开设“程序封装方法”,该课程主要内容为函数和面向对象编程,这对于应用型本科院校的学生来说是非常必要的,因为应用型本科学生在学完几门编程语言之后,往往还不能领悟程序封装的方法和作用,导致对数据结构等后续课程的学习比较吃力,因此将程序封装方法单独作为一门课程开设,可起到很好的衔接作用。另一方面,在软件开发行业,能够编写函数是参与团队软件开发的基础,而类作为面向对象编程的核心组件,其本质是对函数和数据进行二次封装,使程序进一步结构化,可见学生掌握了程序封装方法就相当于拥有了进入软件开发行业的敲门砖。
对于维度二,可开设“数据库与Web编程”,将数据库和Web开发结合起来学习更有效果;以及“Socket网络编程”,将访问网络和访问文件的技术结合起来。
(3)对于第三层次,可开设“设计模式”课程,该课程应以任务驱动的方式介绍几种常用的设计模式,以及UML软件建模方法[7]。这样,在学生掌握该层次后,即可适应软件公司程序员或系统架构师的工作需要了。
(4)第四层次,应开设“数据结构”课程,重点讲解几种简单常用的数据结构和算法。需要说明的是,第四层次和第三层次的学习也可同时进行。
(5)第五层次,开设“软件工程”的课程。只有当学生具备了一定的编程经历,才能较好地理解这门课程,因此,这门课程需要在高年级并且经历过程序课程设计或实习后再开设。在该层次中,还需要重视培养学生的软件团队分工开发的技能。
以衡阳师范学院网络工程专业为例,根据课程体系维度和层次的划分方法,对该专业的人才培养方案和课程设置进行了重构。将其程序设计能力的培养目标定位为达到第二层次:其中,第一层次开设C++和Java两门编程语言的课程,第二层次开设程序封装方法的课程。
对于课程设置,以维度一和维度二为主,开设Web编程(含数据库编程的内容)、Socket编程和安卓编程等。并且,还开设了几门先修课程,如数据库原理、计算机网络、Linux操作系统以支撑相关程序设计课程的学习。
经过教学改革的实施,取得了较好的实施效果,学生的学习兴趣和编程自信心都有明显提高,经调查统计,学生专业满意度提高到97.6%,软件中级资格证书的考试通过率提高了25%,就业率提高了5个百分点,并且就业质量也有明显提高。
程序设计课程体系的维度和层次的划分方案在衡阳师范学院计算机类专业进行了初步的实践,取得了较好的成效,较大地提高了程序设计类课程的教学效果,从而提升了应用型院校计算机类专业人才培养的质量。以此项目研究为基础,可以使专业人才培养方案得到完善和改进,同时,将较大地提升学生对学校及专业的认可度,提高毕业生就业率,为我国软件产业的发展作出一定的贡献。