高效程序设计的七个习惯
2017-05-12文艾陈卫卫
文艾+陈卫卫
(解放军理工大学 指挥信息系统学院,江苏 南京 210007)
摘 要:分析大学生难以掌握程序设计技能的问题,提出学生的程序设计习惯是导致上述问题的关键因素。根据程序设计和教学方面的经验,总结出高效程序设计的七个习惯,并说明实践过程,最后指出这些习惯可有效提高学员的程序设计效率。
关键词:程序设计;习惯;编码;迭代
1 背 景
程序设计是计算机及相关专业学生必须掌握的一门重要技能。然而,从历年毕业生的学习情况来看,能够较好地掌握程序设计能力的学生只是一小部分,还有相当一部分学生无法顺利地设计程序,甚至不会编程,其中不乏高分学生。为何同样的课程设置、同样的教材,甚至同一个教师,学习结果有如此差异?针对上述问题,已有很多研究和解决方案[1-3]。笔者从学生个体差异的角度进行分析,认为智力不是上述问题的关键因素,因为对同一所大学的学生来说,除特别突出者,绝大部分学生处在同一水平,而每个学生在程序設计学习和实践过程中的个人习惯,才是导致上述现象的关键因素。
为此,笔者根据程序设计开发和教学方面的经验,总结出高效程序设计的七个习惯,并利用学院的本科生导师制,将这些习惯的养成贯穿到人才培养的各个方面。
2 高效程序设计的七个习惯
高效程序设计的七个习惯分别是:①先找轮子;②从最简出发;③让程序先跑起来;④友好编码;⑤即时验证;⑥无损迭代;⑦定期备份。
2.1 先找轮子
在进行程序设计之前,不要急于开始编码,而是要尽可能地找到与设计目标相对应的实现,称之为“轮子”。在互联网上,程序设计的资源非常丰富,尤其随着开源运动的蓬勃发展,小到一个简单的Hello World程序,大到操作系统,都有开源实现。对于初学者,先找到轮子,就可以站在巨人的肩膀上,快速进入某个专业领域。比如,设计一个分布式文件系统,如果从零开始,会非常复杂,如果能找到MFS(一个开源的分布式文件系统),就可以从使用、设计到编码实现,全方位地进行学习和借鉴,会大大节省时间,并迅速累积经验;又如,JPEG图片的编码和解压功能,如果从零开始实现,不但需要掌握JPEG算法原理,还要考虑实现的效率,在时间和可行性上是不可接受的,如果能找到JPEG的开源实现,然后在此基础上进行修改,适配需求,就会大大节省时间。
2.2 从最简出发
设计一个复杂程序的时候,不要试图一次实现整个程序,应该先实现其最核心的功能,然后进行多次迭代,形成最终的版本。程序从本质上讲,就是逻辑的组合,一次实现这些复杂的逻辑,对开发者来说,可能无法把控,有时即便实现了,稳定性也无法保证。在实现之前,可以先对这些逻辑进行分解,确定哪些是核心、是不可再分的,哪些可以后续进行组合,再按照先核心、后外围的顺序进行开发。比如,要实现一个聊天软件,其最核心的功能就是网络通信,因此,可以先实现Server端和Client端的网络通信,然后在此基础上定义消息、完善功能。又如,用硬件语言实现CPU时,如果先对指令进行分类,然后实现代表指令,构建数据通路,后续的指令就可以线性添加,不需要改变数据通路和状态机,只需要改变控制信号,这样整个CPU的复杂逻辑就可以实现。
2.3 让程序先跑起来
无论是设计程序还是学习代码,让程序跑起来都是第一要义。如果是设计程序,一开始就让程序跑起来,可以及时对程序逻辑进行验证,从而避免错误的累积;如果是学习代码,让程序跑起来可以直接观察程序的运行状态和输出结果,必要时还可以进行调试,这样可以快速理解代码的含义和设计机制。
2.4 友好编码
友好编码是指编写代码时,要遵守一定的编码规范,具体来说包括文件、目录、变量、函数的命名规则、代码缩进与对齐、注释风格等。不同的语言有不同的规定,例如C语言的代码风格和Java语言就有所区别,即使是同一种语言,也可能有多种风格,应尽量选取大多数人遵循的风格。再如,在Linux平台下设计C程序,就可以参照内核代码或者平台软件(如GCC)的代码风格。
2.5 即时验证
即时验证是指对代码进行一定修改后,要及时验证,有效防止错误的累积。由于修改前的代码已经过验证,因此,修改后如果出现错误,可以根据提示信息,比照修改的代码部分,迅速定位。即时验证包括语法验证和语义验证。一般来说,一旦做出代码修改,就应立即进行语法验证,即重新编译、链接代码;而一旦完成某个逻辑功能的修改,应立即进行语义验证,运行相应的测试用例。
2.6 无损迭代
无损迭代是指在扩展功能时,要注意新增代码不能影响原有代码的稳定性。在具体实施中,功能的增加尽可能采用代码追加的方式实现,而不是重构代码,这样虽然可能导致代码冗余,但是程序的原有功能没有改变,新增功能即使有问题,也可以迅速定位。
2.7 定期备份
定期备份的重要性不言而喻,最重要的是要形成习惯并长期坚持。此外,备份的对象不仅包括代码,也应包括开发环境等;备份的存储对象,不仅在本机,也可实时备份到移动设备或者网络;为了方便版本管理,可以利用git等优秀工具;对于非常重要的代码和文件,除了使用git进行备份外,还应进行完全备份。
上述习惯对于高效程序设计有非常重要的作用,具体体现在以下几个方面。
(1)加速程序开发。先找到轮子可以让程序开发基于已有的实现,而不需要从零开始编码。
(2)减少出错。让程序先跑起来可以检查程序的语法错误,同时可以动态调试程序,减少出错;即时验证可以立即验证程序的语法和语义错误,将错误限定在最近一次修改中,便于快速定位错误。
(3)确保复杂程序的可靠性。从最简出发使程序的逻辑遵循从简单到复杂的顺序,确保每个简单程序的正确性,确保最终复杂程序的可靠性;无损迭代可以使程序在添加新功能后,原有功能的可靠性不受影响。
(4)提升协作效率。友好编码可以使程序的编码遵循统一风格,提升团队协作开发的效率。
(5)确保开发进程的可靠性。定期备份可以确保整个开发进行中所需资源的可靠性,避免资源丢失后的重复劳动。
3 实践结果
近年来,笔者共随机选取22人参加高效程序习惯的养成实践,结果表明学员掌握程序设计技能的时间大幅缩短,且程序设计的水平相对普通学员普遍较高。参与该实践的学员中,获得毕业设计良好以上的有20人次,获得全国软件大赛一等奖9人次、二等奖7人次,还获得多项大学程序竞赛奖。在2013年,有学员作为江苏高校的唯一代表,获得第三届中科杯全国软件大赛一等奖(一等奖覆盖率不到千分之三),是当时军队院校参赛以来的最好成绩;在2014年,学员获得第五届蓝桥杯全国软件大赛团队赛选拔赛一等奖(一等奖覆盖率不到百分之五),也是当时军队院校参赛以来的最好成绩;在2015年,参与实践的4名本科合训学员作为军队唯一代表,参加首届全国高校云计算应用创新大赛,面对与全国14支985、211大学的博士、硕士团队的竞争,他们沉着应战,获得大赛最高奖项——特等奖,新华日报、解放军报、网易新闻等对此进行了报道。由于上述学员均来自“本科生导师制”随机分配的学员,并未择优选取,因此样本具有普遍性。
4 结 语
实践结果表明,高效程序开发的七个习惯可以帮助学生在有限的时间内,快速掌握程序设计技能,提升独立解决问题的能力。要实现高效程序设计,仅仅明白上述七个习惯远远不够,重要的是将它们转化成程序设计中不易改变的习惯。因此,研究如何让学员更高效和牢固地养成上述习惯是下一步工作的方向。
第一作者简介:文艾,男,讲师,研究方向为云计算、大数据开发,hdfsha@126.com,
参考文献:
[1]丁金凤. 基于计算思维的程序设计类课程教学实践[J]. 计算机教育, 2012(15): 65-68.
[2]陈杰华. 程序设计课程中强化计算思维训练的实践探索[J]. 计算机教育, 2009(20): 84-85.
[3]刘振华. 计算机应用型本科人才程序设计能力培养[J]. 计算机教育, 2010(12): 38-40.
(编辑:孙怡铭)