胡 平 汪 军 刘 涛 严 楠
(安徽工程大学计算机与信息学院,安徽 芜湖 241000)
1.新工科的内涵
2017年2月,教育部在复旦大学召开了高等工程教育发展战略研讨会,探讨面向未来的新工科建设,以满足新形势下的人才需求[1]。之后,随着复旦共识、天大行动、北京指南等一系列宣言的发布,更加速了新工科在全国各高校的落地。2019年4月,教育部启动一流本科专业建设“双万计划”——2019年至2021年建设1万个左右国家级一流本科专业点和1万个左右省级一流本科专业点。同时,要求高校主动适应新一轮科技革命和产业变革,着力深化专业综合改革,优化专业结构,积极推进新工科建设。
对新工科具体内涵的理解可能因人而异,但大多赞同以下观点——新工科是指在新一轮科技革命、产业变革以及生产模式转型背景下,面向当前新经济形势和未来国家发展需要,运用新兴技术建设和发展一批新型工科,或改造和升级一批传统工科,以培养具有较强实践应用、创新思维以及跨界整合能力[2],较好满足工业界用人需求的应用型技术人才。
2.全栈软件工程师的技能要求
全栈(Full Stack)即全技术栈,其包含了一款软件产品从需求分析、UI/UX、架构、技术选型、算法、性能、安全、开发、测试、上线及维护的一切技术,其中的每一个环节都对应着众多的可选开源技术。全栈工程师目前已成为软件企业最青睐的人,因此,以全栈软件工程师为培养导向来组织和实施相关课程群的教学无疑是契合新工科内涵的较好途径之一。
要培养全栈软件工程师,必须先让学生了解课程群中具体包含哪些技术栈以及它们之间的衔接关系。因此,除了课程的知识点传授和必要的能力培养外,教师还应向学生介绍课程群中各门课程在整个技术领域中所处的位置(特别是各门课程之间的承上启下关系),以便学生选择自身感兴趣的技术方向并在课程结束后制定适合其自身的学习路线。图1给出了Java技术方向下的全栈软件工程师的典型学习路线。
图1 全栈软件工程师学习路线(以Java方向为例)
1.立足工业界需求
表1 2019年10月TIOBE指数排名前5的编程语言
高校的根本任务是培养社会和企业需要的专业技术人才。对于计算机和软件相关专业,对工业界需求,就不得不提TIOBE指数排行[3]。该指数基于全世界有经验的工程师、开设的课程以及第三方软件厂商的数量,并通过Google、Bing、Wikipedia等主流搜索引擎计算得到的——本身就具有强烈的工程属性和工业色彩,因此较为客观地反映了当前绝大多数软件企业和从业者所用技术的流行趋势。表1所示为2019年5月TIOBE指数排名前5的编程语言。
以多年来稳居TIOBE指数排行第一的Java为例,其支持从消费类电子产品到超级计算机、从智能移动终端应用到企业级分布式计算等各种场景,已成为网络环境下软件开发的首选技术之一。因此,国内高校的计算机和软件相关专业通常都有多门专业基础、方向课程及其实践环节直接与Java相关(或以Java作为知识点的实现和验证语言),具体如面向对象程序设计、数据结构、Web程序设计(JSP)、智能移动终端软件开发(Android)、大数据与云计算(Hadoop)、企业级软件开发技术(JavaEE)、软件设计与体系结构等。
2.从实践者视角组织知识点
要立足新工科和全栈软件工程师,就必须从工程应用和实践者视角组织课程知识点。对于当今的软件规模和复杂度,软件开发不仅仅是“语法+API+算法”,更是语言、平台、标准和规范的总和,这一点可以通过目前各种主流开发技术的官网文档所含内容之多得到印证。另一方面,随着开源思潮逐渐成为趋势,各种开源社区的蓬勃发展反过来进一步加快了相应开发技术的发展。教师必须意识到,即使是课程群中最为基础的程序设计类课程,也几乎不可能将其所含全部知识点在一门课程中覆盖。因此,教师在组织课程内容时,不应追求大而全,而应着重介绍所涉及的核心知识。
以Java为例,由于Java的发展一直非常活跃,例如JDK的发布周期由原来的数年变为半年、JavaEE和Android平台不断引入新特性、流行的开源框架层出不穷等。目前,一些高校的Java程序设计课程仍然花费较大篇幅讲授那些工业界早已不再使用或有其它更好替代方案的技术,如AWT组件、Applet、遗留容器等,这与新工科的内涵要求背道而驰。
我们认为,软件开发相关课程群的教学内容不应追求大而全,而应结合行业发展、与时俱进,多介绍目前在工程实践中广泛使用的知识,使得学生毕业时不仅能较好满足企业相关岗位的技术需求,同时也具备今后自主、高效学习该技术领域未来新知识的能力。
以笔者所在学校的Java程序设计和面向对象程序设计(C++)为例,课程涵盖了目前在工业界中使用最为广泛的JDK8和C++11的全部语法特性,包括Lambda表达式与函数式编程、泛型容器与模板库、正则表达式、反射与注解等。此外,课程还以专题形式介绍了主流IDE的使用、API文档和源码查阅、编程规范与最佳实践、全栈软件工程师学习路线等带有强烈工程和工业色彩的内容。
当前,全国很多高校的专业正在进行教育部工程教育专业认证,其核心是考察学生各方面能力的培养与达成情况。因此,课程群不应仅仅局限于学生理解和掌握知识点,而更应该通过知识点使得学生具备相应的能力。
1.从语法/API过渡到分析/设计
软件项目的成功实施离不开经验丰富的系统分析和设计人员,底层的设计比上层的编程更为重要——若底层设计考量充分,即使上层某个模块的代码写得很糟糕,最坏情况也只是重写该模块。反过来,糟糕的设计不仅会增加上层各模块的编程难度,更为严重的是,需求的一点点变更(软件项目的需求变更是频繁且无法避免的)都可能引起现有代码的大面积重写,从而大大增加了项目失败的风险。因此,在有了一定的编程经验之后,教师应引导学生关注GoF设计模式和软件分层架构等更高层面的知识,这对于学生今后在企业中学习和使用各种开源框架也是大有好处的。
我们在各个课程中适当安排了一些设计模式及主流开源框架实现原理等方面的内容,并通过实际案例引导学生对软件设计层面的理解,为其今后进入软件从业人员金字塔上层提供可能。
2.遵循惯例约定,强调最佳实践
良好规范与最佳实践对于开发软件项目极其重要,同一软件项目的每个参与者都必须遵守一致的编程规范,原因在于:第一,软件企业通常会在第二轮面试中让求职者现场编程,而从一个人编写的代码就能判断出其是否受过正规的训练;第二,软件工程师经常需要接手他人编写的代码;第三,软件的测试与维护人员往往不是代码的最初编写者;第四,最好的注释就是代码本身——遵循规范并具有良好自说明性的代码几乎不需要注释。
另一方面,随着各种开源框架在分布式企业级项目开发中的广泛使用,近年来,在软件开发领域流行一句名言——约定优于配置、配置优于编程。惯例和约定不是企业对开发人员制定的可遵循可不遵循的代码书写规范,遵守惯例和约定是成为一名优秀的软件工程师所必须具备的素质之一。良好的编程规范和最佳实践通常是跨语言的,制定并在教学的各个环节中遵循已被实践证明的、有利于提升代码质量的编程规范与最佳实践不仅能显著提升代码质量,而且可以使得学生提前适应企业的用人需求。教师在课件制作、板书、编程演示、实验指导等环节涉及到的各种标识符命名、代码缩进以及代码风格,都要注意遵守规范而不要图方便——防止学生潜移默化,从一开始就养成不好的习惯。
以笔者所在学校为例,教师在课前专门介绍了知名软件企业所遵循的编码规范与最佳实践,例如阿里巴巴于2017年9月正式发布的阿里巴巴Java开发手册。在实际编写代码过程中,为强制学生遵循规范并改正不好的编程习惯,我们在实验机房安装了相关的代码规约扫描插件,例如阿里巴巴于2017年10月发布的P3C插件——IDE会自动扫描项目源码是否满足指定的规范,并给出相应提示和建议。
3.践行OBE理念
当前,以面向产出、成果导向为代表的教育理念已逐渐深入人心,衡量教学效果的方式已从传统的评价教师是否教得好转变为评价学生是否学得好。因此,在设置课程内容和知识点时,必须始终以学生为中心,充分考虑学生的认知习惯和接受能力。
我们认为,课程内容依照先感性再理性、先表象再原理,同时要求学生在课下主动阅读官方文档无疑是较好的方式。通过官方文档中类似于Quick Start(快速入门)的内容,可以让学生对一种技术有一个概览性的认识——该技术是什么、能做什么、以及该技术的简单示例。若要以该技术开发实际项目,则还需要继续阅读其Reference/Guide(参考/指南)——与该技术的高级主题相关的文档及最佳实践。
相比之下,快速入门内容简单,学生通过其中可实践的示例,能够快速掌握一门技术最基本的用法,但其缺点也很明显——很难指导实际项目的开发。而参考/指南虽扩展和延伸度都较为深入,但学生阅读这样的内容,不仅需要花费大量的时间,而且往往会因为没有实际项目经验而不自知地偏离学习主线。因此,教师在组织课程内容时要注意在快速入门和参考指南之间合理平衡。
以上改革举措已在我校计算机与信息学院的计算机科学与技术、软件工程、数据科学与大数据、物联网工程等专业开设的面向对象程序设计(C++)、Java程序设计、数据结构、数据库原理与应用、Web程序设计、智能移动终端软件开发(Android)、软件设计与体系结构、数据挖掘等课程推行,从4年来的实施效果看,学生对专业课的学习主动性及工程实践能力有了明显改观,并取得了一定的成绩,具体如表2所示。
表2 实施改革4年来取得的成绩
目前,我院的计算机科学与技术、软件工程专业正在积极申报国家工程教育专业认证。下一步,我们将对标工程认证的毕业要求十二条以及教育部的“金课”建设标准,进一步调整优化课程群内容设置及教学手段,并结合MOOC、智慧课堂等平台全面提升教学质量。