张 仕,吴 闻,严宣辉
(福建师范大学 数学与计算机学院,福建 福州 350007)
ACM 国际大学生程序设计竞赛(ACM international collegiate programming contest,简称ACM-ICPC或ICPC)是由美国计算机协会(ACM) 主办的,是一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解决问题能力的年度竞赛[1]。随着计算机专业的快速发展,计算机专业学生人数的急剧增加,就业竞争压力也越来越大。学生为了能够更好地提升自己的能力,提高就业竞争力,以ACM-ICPC为代表的程序设计类竞赛越来越为计算机相关专业学生、老师和学校所重视。福建师范大学从2003年开始组织学生参加ACM-ICPC,并逐步参与了各类省级和国家级程序设计类竞赛,逐渐摸索出一套适应于自身学生、学校层次的以程序竞赛为核心的学生培养体系。
目前,国内部分院校进行了以竞赛为驱动的软件人才培养,利用程序设计竞赛拓展培养思路,深化课程改革[2-4]。然而,现有的教学实践改革并没有形成一套较为完整的,涵盖基础培养、选拔、训练、竞赛考核、集训、退役的管理和培养体系。特别对于一些国内非985、211院校,其学生素质、自觉性和基础都无法与顶尖院校相比,因此,有必要针对特定的学生层次,制定完整的以竞赛为驱动的软件人才培养方法、方案。我们对该方面发展现状归纳为以下几点:
(1)重视与ACM-ICPC为代表的程序设计类竞赛相关课程的建设,但轻视与后继课程的衔接。在现有的一些以竞赛为驱动的教学改革中,着重关注于如何为ACM-ICPC为代表的程序设计类竞赛提供支持,以及如何提高学生在竞赛中解决问题的能力。竞赛与课程教学的衔接主要体现在课程为竞赛提供支持,以便学生能够尽早介入,而对于竞赛后继培养课程的衔接,对学生如何由程序设计能力转向工程创新能力的讨论则略显不足。
(2)重视队员的选拔和训练,轻视队员后继的培养。在现有一些对ACM-ICPC为代表的程序设计类竞赛的讨论中,各个学校老师都非常重视队员的选拔和训练。然而,在实际的操作中,由于各种竞赛的规定,有许多学生最后是没有机会参加现场比赛的。这些二线队员参加了整个训练,程序设计能力、解决问题的能力均得到了极大提高,但是缺少退役后的职业规划、后继培养。
(3)没有把ACM-ICPC为代表的程序设计类竞赛和创业创新竞赛加以贯通。程序设计类竞赛项目与创业创新类竞赛项目的侧重点不同,其中,程序设计类竞赛培养学生解决某一具体局部问题的能力,也就是学生的程序设计能力、对软件算法的理解;而创业创新类竞赛则要求学生具有一定的工程实践、软件应用和创新能力。现有培养体系和研究缺少这两者之间的衔接,特别对学生的指导方面缺少一个连贯的安排。
以ACM-ICPC为核心的学生培养体系建设主要从4个方面展开,主要包括重视基础课程教学衔接、团队的组建(队员选拔)、训练和考核、教学培养体系的支持、工程创新能力等方面展开叙述。这4个方面与现有竞赛相互促进,围绕竞赛展开,具体关系如图1所示。
图1 研究内容的关系
程序设计类竞赛团队队员来自于广大学生,因此,我们首先需要重视程序设计基础课程的教学工作。对于程序设计类的基础性课程,我们将以提高学生动手实践能力为主要抓手,为此,专门开发了程序设计训练平台。通过程序设计训练平台为学生提供平时作业、实验测试、实验考核等形式多样的相关试题,增加学生动手实践的机会,从而培养和提高学生的实战能力。此外在训练平台上设置赛课结合模块,内含丰富的训练题库,为学有余力的学生提供更多的实践机会。
而平时课程考核的方式在实际教学中起到指挥棒的作用,若沿用原有的以理论考核和期末考核为主的学生考核评价机制,那势必会对学生动手能力、创新能力和工程能力的培养起反作用。因此,通过和任课教师共同商议优化相关课程的考核方式,转变软件人才培养过程中的考核方式,改革学生学业评价制度,建立过程性评价和终结性评价相结合的课程考核方式,逐步加大过程性考核、阶段性考核力度,提高平时成绩在课程成绩中的权重。
从2013级学生开始,我校计算机专业部分学生的“程序设计I——C语言程序设计”便通过学校的OJ平台布置作业,每周还额外布置两题供学生练习使用。对2013级使用和未使用OJ平台学习“程序设计I——C语言程序设计”的学生进行横向比较发现,无论是实践考核还是后续课程体现出来的动手能力,使用OJ平台的学生普遍优于未使用OJ平台的学生。
选拔队员除了要注重其平时课程的考核成绩外,还设置多重选拔的方式,特别增设实践动手能力选拔上的一票否决权。
为了能够促进学生广泛参与,我们每年至少举行一次高年级(主要针对二、三年级)程序设计竞赛和一次低年级(针对一年级)程序设计竞赛,为程序竞赛人才的选拔提供良好的支撑。从2003年开始组织学院的程序设计竞赛,到后面发展为学校的程序设计竞赛,该竞赛已经开展了13届。对于初次选拔进入培养预备队伍的学生,则通过设置多次选拔的方式,让学生时刻紧绷不上则下、不进则退的神经。例如,通过设置季度赛等方式为预备队员提供晋级机会,同时也给正式队员危机感,从而实现能上能下的用人机制。
对于队员的考核,除了需要考核日常训练任务的完成情况外,还要求其参加各个季度的晋级赛,从一定程度上实现以赛代考。对于各类竞赛,也将通过设置积分的方式,作为日后代表学校参加高级别竞赛的重要依据,避免大赛前一次性选拔的偏颇性。
日常训练则以队员为主,指导教师和领队老师为辅的方式展开,包括讲座、定期讨论等方式,同时对一些典型题目、典型知识点通过专题训练的形式展开。此外,在日常的训练中让老队员和新队员结对帮扶,从而充分利用老队员在实际训练和比赛中所积累的经验。
当前,计算机类基础能力培养课程由“程序设计I——C语言程序设计”“程序设计II——C++语言程序设计”“数据结构”“算法设计与分析”“高级程序员选讲”形成了一个有效的体系,但是对于ACM队员而言,若待这些课程都学习完成再参与至少需要一年时间的训练和竞赛,那么在工程能力的培养和开拓上必定会有所滞后。为了解决这一问题,从2013级学生开始,在学生学习完程序设计I后,在大一下学期便开设程序设计竞赛入门级选修课程“程序设计与问题求解”,为有兴趣在程序设计上提高并参与竞赛的学生提供一个利用程序求解实际问题的拔高课程。
此外,程序竞赛指导团队在暑假期间还申请学院机房,为有兴趣的新生讲授一些竞赛中常用的知识和方法,例如STL、递归、分治、归纳、动态规划、搜索算法、图论等。具体实现由指导老师讲授一个上午,接着一天半时间由老队员辅导专题训练。“程序设计与问题求解”和暑期的课程通常是一个大浪淘沙的过程,也就是开始时有大量学生参与,最后真正坚持下来的也就剩下30%~50%。
程序设计竞赛是一项具有相当难度的赛事,并不是所有的同学都可以通过努力获得认可,为此,我们形成一个专门指导学生项目开发、创新创业类竞赛指导小组。该小组专门针对经过严格程序设计训练、退役不再参与程序设计类竞赛的学生。这些学生有良好的编程能力和解决问题能力,容易掌握Java EE、.Net程 序设计、软件工程等课程,通过进一步地深入学习,培养和提升这部分学生的工程能力和实践创新能力。
具体到课程体系的优化上(如图2所示),着重于合理设置课程,使之能够为程序设计类竞赛提供支持,并且通过参与训练和竞赛促进相关课程的学习;对于经过严格程序设计训练未取得参与竞赛资格的学生,或退役不再参与程序设计类竞赛的学生,我们将着重研究如何为这些学生设置工程训练类课程,从而使课程的学习和创新创业类竞赛互相促进。从2016年开始,我们又陆续开设了大数据、人工智能等方面的课程。
由于有了良好的程序设计训练,这些学生在学习具体的项目开发类课程时也就有了更强的动手能力。近两年来,从我们程序竞赛团队转入创新创业类竞赛的学生获得了很好的比赛成绩,如2016年的华为杯创新创业类竞赛,我校2013级学生获得了二、三等奖共5项。
计算机科学与技术专业是一个飞速发展的学科领域,其源动力来自于不断创新。因此,创新能力是高质量人才的灵魂。基于此,培养体系还包括加强对经过程序设计类竞赛培养和竞赛退役的优秀软件人才创新创业能力的培养,从根本上提高这部分学生的创新和创业能力。对此,培养体系主要从以下几个方面考虑并付诸实施。
图2 课程设置与竞赛的关系
(1)建立导师制,由导师在专业学习和科技创新方面对学生进行指导。鼓励教师结合自己的科研课题,指导学生进行科技创新活动。该方面措施已经在2012年全面推广,从二年级开始,学生便可参与教师的相关课题,实现了导师制和毕业设计指导的统一。该措施让学生的专业学习和能力拓展具有持续性,目标明确,可以更早介入课题,提高自身实践能力。避免因盲目性学习或频繁更换指导老师和毕业指导老师带来的无所适从。
(2)积极组织课外科技活动,通过大学生创新实验平台的建设,以及学校、省级大学生创新实验项目的申请立项等手段,培养学生的创新意识和创新能力。通过加大对大学生课外科技创新活动的经费投入和政策支持力度,积极组织学生参加各类大学生课外活动,获得多项校级、省级大学生科技创新项目,形成了一个较为完整的省—校—院学生创新创业的支持体系。
(3)以学科竞赛、课外科技创新活动培养学生创新能力。创造条件,积极组织、资助学生参加学科竞赛,依托实验中心,建立大学学生课外科技创新平台、机器人实验创新平台、嵌入式开发创新平台等。该方面措施从2016年暑期开始试行,特别是通过开放实验室、暑期实验室设备外借等为学生提供相关软硬件设备的支持。
(4)通过校企合作培养学生实践能力,将企业的技术应用能力和项目开发经验与学校师资力量相结合,培养学生的实践能力、应用能力与项目开发能力。我们经常性地聘请企业工程师参与学生实践培养环节,还结合校外培训企业的免费公开课为学生提供介入实际项目的机会。对企业而言,也希望通过这种方式发掘一些苗子,加以重点培养,为企业在人才争夺中抢占先机。
(5)开展创业实践活动,提供实践平台。在正常教学中增加实践教学、创业实习环节,开展社会实践活动,鼓励学生参加社会和企业的调查,让学生深入社会、深入企业,对就业市场和创业环境有初步的了解,培养自己的知识应用能力;通过加强校企联合和实践基地建设,让学生的创业活动与企业之间形成良好的互动,推动学生的创业成果尽快产业化。该方面措施已经在2015、2016级的卓越工程师班开展,例如,组织学生参观网龙公司的VR园区等。由于经费的限制,还未能在全院所有计算机类学生中推广。
(6)对于工程、创新类的课程,我们将通过引入公司实际工程项目、以竞赛的方式提出更高的要求,从而鼓励学生更加深入学习。而且,在相关考核上,将充分考虑参与竞赛所获得的成绩,引入以赛代考的方式。从2014级学生开始,我们便允许学生利用竞赛成绩抵部分选修课程的成绩,这也就给学生更多个性化的发展机会。
从已经毕业的2013级学生的培养效果来看,ACM队员的就业情况明显好于其他学生。而2014级和2015级学生在这种培养体系下,有更多的学生对自己的学业和未来发展具有明确的目标,对竞赛培训和校内外实践的参与热情和参与度都很高。
高素质的工程技术人才对国家经济和科技进步起着巨大的推动作用,已成为影响一个国家核心竞争力的重要因素。结合社会需求、专业特色,开展以程序设计和创新竞赛为驱动的软件人才培养改革,提出一套以程序设计竞赛和创新竞赛为手段的、旨在提高学生软件开发能力的培养模式,并在我校ACM现任队员、退役队员以及ACM新晋人员中进行具体实施,取得了良好的效果。我校积极实施卓越工程师培养计划,从2015级和2016级开始,系里专门针对上述模式设立了一个卓越工程师班,其课程设置和培养思路按照这套已经实践过的方式制定,如果能够持续取得较好的效果,将在全院所有计算机类学生中加以推广。
[1]张仕, 吴闻. 基于PCOJ 的数据结构实验教学探索[J]. 计算机教育, 2015(3): 30-32.
[2]皮德常, 吴庆宪. 国际大学生程序设计竞赛与创新人才培养[J].电气电子教学学报, 2008(3): 46-47.
[3]郭嵩山, 王磊, 张子臻. ACM/ICPC与创新型IT人才的培养[J].实验室研究与探索, 2007(12): 193-197.
[4]陈志, 李梦泽. 基于ACM程序设计竞赛的常规教学改革[J]. 电气电子教学学报, 2011(6): 18-21.
[5]严宣辉, 郭躬德. 计算机科学与技术专业工程实践能力培养模式的探索[J]. 福建师范大学学报(自然科学版), 2011(3): 12-15.