周 頔, 盛歆漪, 王 骏
(江南大学 数字媒体学院,江苏 无锡 214122)
随着社会知识结构与内容的更新速度越来越快,保持自身良好社会综合竞争力的唯一方法就是不断顺应需求、更新自己的知识储备。这一点,对从事电子信息科技类工作的人员来说显得尤为重要。因为正如摩尔定律所说,信息科技领域的知识每隔一段时间基本就会进行一次彻底的更新。顺应这种市场的要求,现代本科教育中越来越强调自我学习能力的培养。在现在的大学教育过程中,与其说目的是教会学生某些具体的专业技能,不如说更核心的目的是帮助学生建立起正确的本专业思维方式,并培养出学生把握本专业信息、不断更新自身知识的能力。在这种大环境下,非指导性教学方式在教学过程中就显示出越来越重要的用处。
非指导性教学,是由人本主义代表人物罗杰斯所提出的“以教师和学生构成平等对话关系”为核心的一种重要教学方法。在这种教学方法中,教师被要求采取友好、真诚、开放的态度来对待学生。而学生则具有充分的思考自主权和行动选择权,在教师的帮助下建立起良好的自制力,明确自己的兴趣点,最终培养出自我探索的能力[1-2]。这种方式在以强调实际动手能力著称的大学计算机及其相关专业的教学中显得尤为重要。
对于大学计算机及其相关专业来说,包括C、C++、Java、JavaScript、C#等在内的程序设计类课程等始终是教学中的一块重要内容,这些课程为大学计算机专业及相关专业的课程的展开打下了扎实的知识基础。从课程内容上讲,这类课程涉及复杂的语法知识,加之知识点琐碎,概念抽象,所以从某个方面上讲,这类课程具有文科类语言课程的特点(如需要花费较多的精力来讲授语法规则)。另一方面,这类课程注重学生的逻辑思维能力和动手编程能力,在教学过程中要求学生乐于动脑,勤于动手,具有典型的工科类课程的特点。目前从国内外同类课程的教学现状来看,现有的大多数教学方法多强调教师在课堂上对知识点的讲授,没有重视发挥学生的主观能动性,更没有强调学生的自我学习过程。因此给教师的教学实践提出了难题。
为了能够在高校的程序设计课程中更好地推广非指导性教学方法,笔者在实际教学工作中进行了尝试。我们认为,为了在这类课程中更好的使用非指导性教学方法以取得更好的教学效果,需要特别注意两个方面。一是要求授课教师对程序设计教学的内容和重要性有着更加透彻的理解,二是很好的掌握非指导性教学方法在程序设计课程中的应用方式[3-4]。
程序设计的最终目的是要让计算机来解决实际问题,而解决问题的关键则取决于两个方面:采用何种方法步骤来解决问题,以及采用何种媒介(语言)让计算机知晓用户的意图并按设定的方法最终解决问题。前者指算法,后者指的就是各种编程语言。简单来说,程序设计语言就是人与计算机之间沟通的工具,而且这种工具的使用必须符合一定的规则,也就是各种程序设计语言中的语法结构和语法规则等。因此,对于程序设计的教学,可以理解为是一个将“人类思维”方式转变成清晰的、直接的、简洁的“机器思维”方式的过程。
目前国内许多高校在程序设计课程的教学中,都将主要精力放在某种具体语言的语法细节介绍上。这种教学方式在一定程度上脱离实际应用的需求,而且很容易造成学生对编程的兴趣缺失。笔者在教学实践中也发现了这一问题。有很多学生在学习初期对课程有着较为深厚的兴趣,他们也愿意向教师提出各种各样的问题。但是随着课程教学的深入和课程知识点难度的提高,他们的原先所具有的学习兴趣慢慢消失了。究其原因,我们认为,对于编程语言的学习,其侧重点不应该放在具体的语法细节上,而应该放在正确编程思想的建立上。因为学生未来学习工作过程中可能遇到的程序设计语言的种类和数量是无法预计到的,而不同的编程语言在语法细节上多多少少存在各种差异,唯一没有差异的就是隐藏在各种程序设计语言背后的编程思想。也就是程序中的数据必须以不同类型长度进行存储(数据类型)、现实中的任何问题都可以抽象为三种逻辑结构(选择,循环,直到)、为了问题的解决可将大问题拆分成若干小问题(函数)等等这些在任何程序设计语言中都通用的思维方式[5-6]。因此,程序设计的教学,首先就要引导学生正确理解与体会到以下的编程思想并且建立必要的编程技能:
(1)分而治之的理念:为了清晰描述现实生活中的问题尤其是大而复杂的问题时,往往需要通过将大问题切分成小问题的方式来解决。如何将一个完整的大问题分割成若干个既独立又可以互通信息的小问题,是为了提高程序的编写效率与正确率的必要手段。实际上,分而治之的理念再往下延伸就是组件化与模块化。即,通过编程课程的教学,要让学生养成清晰的编程习惯,要将各个功能相对独立的代码分开编写,而不能所有功能代码都混到一起,降低代码的可读性和复用率。而且从这个理念出发,还要学会用“搭积木”的方法来解决实际问题,即在自己的程序中调用现有的功能模块,站在前人的基础上提高问题解决的效率和正确率。
(2)三种逻辑结构解决任何问题的理念:程序设计语言中,顺序结构、选择结构、循环结构是三种基本的逻辑结构。虽然现实生活中的很多问题看上去千头万绪而且曲折复杂,但是这些复杂的流程都可以通过程序设计语言中的这三种基本逻辑结构的合理组合来表达出来。普通人群在解决这些问题时的思维方式往往带有一定的模糊性,并且缺乏严格的条理性。而编程课程则需要教会学生将模糊的“人类思维”转变成条理清晰结构严谨的“机器思维”流程,从而将千头万绪的实际问题用这三种逻辑结构的组合抽象并描述出来。
(3)调试代码的能力:代码调试是程序设计中的一个重要环节,也是被一些程序设计初学者忽略的地方。在编程课程中,除了培养学生撰写可读性强、扩充性好、易于复用的优质代码的编程习惯以外,还有一个重要的任务就是培养查找程序中的错误、修改错误的调试能力。在以往的教学中经常可以发现学生面对程序错误束手无措,只会叫老师帮忙解决的现象。而对于一个合格的编程人员来说,修改程序中的语法错误、查找程序中的逻辑错误,都是必备的能力素质。因此引导学生自己调试程序也是编程课程中的一个重要环节。
(4)查找资料、甄别资料的能力:程序设计语言的发展具有速度快、种类多、更新迅速的特点,因此在学习编程的过程中不能闭门造车。尤其是在教学过程中建立了模块化程序设计的理念之后,需要具有查找并借鉴前人优秀资料及代码的能力。另外,除了知道去哪儿查资料、怎么查资料,还需要培养学生鉴别资料的能力。即在众多良莠不齐的文献中,能迅速找到自己所需要的高质量的资料。这些基本技能的培养不仅助于学生综合素质的提高,而且也是学生以后进入职场的必备。
非指导性教学具有一些基本的特征和原则:(1)极大的依赖于个体的自身成长,需要通过自身的努力,克服各种障碍。不以直接教授为主要手段,而应该通过某些方法使学生的学习得以容易地开展。比如诱导学生独立思考、澄清问题、帮助总结讨论后的结论等。但整个过程中应该让学生处于主要位置,教师只起到辅助作用。(2)学生是以维持自己的构造或是强化自己的构造心理来学习的,因此要注意在真诚、理解、接受的气氛中用“同化”来影响学习的过程。(3)教师不应该主要教学生怎样学,而应该提供学习的资源和手段,创造学习的气氛,然后由学生自己决定怎样学。也就是说,在非指导性教学方法中,教师并不是指导者,而是顾问。
落实到程序设计课程中,非指导性的教学方式就可具体化为以下几种方式:
(1)开放性的命题。用编程手段解决某一个具体工程问题,一般来说,其方法本身就是不唯一的。也就是说,同样是解决这一个问题,不同的人写出的程序都不会完全相同。因此,教师在编程课程中应该多使用这些处理方案不唯一,也就是“开放性”的命题来让学生解决,鼓励学生百花齐放,采用不同的方案。
(2)以团队为单位解决问题。除了前期的一些基础简单问题,到了程序设计课程的后期,应该特别强调团队合作解决问题的方式。这首先是因为当学生进入社会后会发现几乎所有的软件的开发工作都不可能是由某一个人独立完成的,而是由一个团队来进行的,所以极有必要在校期间就培养学生如何进行团队合作、了解团队不同分工之间的沟通方式等。其次,以团队为单位解决问题也有利于创造互相学习的氛围,激励学生的自主与互助,符合非指导性教学方式的原则与初衷。
(3)比较式的评价。当学生就开放性的命题提出各种不同的编程解决方案后,教师应该组织引导学生通过对比来认识各种编程方法和解决方案的优劣,而不能简单地以“对”和“不对”来进行评价。对于程序来说,效率高、复用率高、移植性好、扩展性好等等特点往往是不能兼得的,而且不同的应用场合对这些程序特点的侧重需求往往也是不同的。因此可以将学生写出的这些程序进行一定范围内的比较,引导他们认识哪种应用场合应该采取哪种解决方案。而且在对比和评价的过程中,应该让学生不受束缚、毫无顾忌地发表观点进行讨论,就算讨论没有结论也不重要,因为探索的过程本身就已经让学生进行了创造性的学习和研究。
本文从实际教学的经验出发,针对目前国内在程序设计课程中存在一些问题,在教师自身对程序设计教学的理解以及非指导性教学方法在程序设计课程中的应用方式这两方面,对如何在程序设计类课程中引入非指导性教学法进行的阐述和探讨。本文工作对实际教学及相关方面的理论研究均有重要的参考价值。
[1]吴启迪.“非指导性”教学思想下的课堂教学模式研究 [D].哈尔滨:哈尔滨师范大学,2012.
[2]张晓英.浅谈罗杰斯的“非指导性教学”模式[J].和田师范专科学校学报,2006,26(2):67-68.
[3]周川.简明高等教育学[M].南京:河海大学出版社,2002.
[4]沈显生.教师备课规范化要求探讨[J].中国大学教学,2009(1):79-81.
[5]谭浩强.C程序设计[M].北京:清华大学出版社,2010.
[6]蔡学镛.编程ING:人人都能学会编程设计[M].北京:电子工业出版社,2012.