结对编程收获
这次结对编程真的是一次很锻炼人的经历,过程中充满了波折,最终也有不少收获,下面就从具体技术和一般开发经验两个方面谈谈我这次的收获。
具体技术上,这次采用的是Qt与C++,我曾经有过一些Qt经验,但只是自己写着玩玩,代码都不长。这次写Qt我最大的感受是,想成为一个入门的程序员,第一件事就是要懂得如何简明扼要地描述自己遇到的问题或者需要的技术,扔到百度上搜索,找到合适的解答。更成熟一点的程序员还要能用英语描述自己的问题并扔到 google 上找答案。在这个时代,技术总是不断更新的,作为程序员一定要培养学习新东西的能力,对于新技术要能够独立得迅速掌握,这样才能不被时代out。
我感觉在上了软工课以及这学期在各个场合用了一些以前很少用过的框架之后,我学习新东西的能力大幅提升,最重要的是我不再畏惧未知的技术,能够耐心地阅读各种库的使用方法。这次我在代码中使用了两个对我来说很陌生的库,一个是定时器 QTimer 类,另一个是 xml 文件读写工具 QXmlStreamReader 类和 QXmlStreamWriter 类,其中后者的使用更为复杂,我有了这学期以前的经验,很快在网上找到了我需要的技术解答并掌握了这几种库的使用方法,也很快调试成功。这应该算我这学期很大的进步之一。
技术上还有一个很重要的问题就是代码规范,这一点其实涵盖了代码的各个方面,从基本的变量命名到代码的整个架构,都需要规范。架构上,代码的规范可以参考设计模式中的内容,详见我的读书笔记,这次我想说的是一些更基本的问题。
首先是变量和函数命名,这次的UI包括了一大堆 QLabel 、 QLineEdit 以及 QHBoxLayout 、 QVBoxLayout 等控件与布局对象,我一上来的命名还算比较规范,能够一眼看懂这个控件代表的是什么,但随着各种相似的对象越来越多,我很难再在原来的命名方式内增加一个新的对象名而不搞混。当我意识到这个问题,我立刻狠下心把所有的变量按统一标准全部改名,比如显示算式的标签叫做 labelExp,显示答案的标签叫做 labelAns ,用户输入精度的文本框叫做 editPrecision ,点击后产生随机算式的按钮叫做 buttonGenerate ,用这种控件类型加名字的方式统一命名,变量瞬间清晰了不少。函数命名方面我一直的习惯都很好,统一采用驼峰法,因为Qt库函数都是首字母小写(这点不如安卓函数首字母大写科学),我这次统一采用首字母小写的驼峰法。函数命名这一点有很多组就做得非常不好,有函数用驼峰法有函数用下划线,颇有php风范。
其次,变量到底定义为局部变量还是 QMainWindow 类成员变量一定要考虑好,窗体对象的生存周期在Qt的UI编程里是一个很重要的问题,我因为一开始没有规划好每个对象的建立方式(成员变量还是局部变量,建立在堆上还是栈上),出了不少问题,好几次重写相关代码。这里我给出我最终的经验总结:对可能会修改的对象定义为成员变量,对绝对只用一次的对象设为局部变量;所有 QMainWindow 类内定义的对象全部建立在堆上,所有主函数新定义的对象全部建立在栈上(这两条主要是考虑了Qt的父子对象关联与析构方式)。这方面的规范对于今后的Qt编程至关重要。
还有一些细节问题比如页面切换方式等,给我的进程制造了一些障碍,但与上述的两点比都是小问题,详见我结对编程作业总结博客中的 bug 分析部分。
下面讲讲这次我这次收获的一般开发经验。这次作业工程中邓老师有句话让我印象深刻:标准是要靠抢的。以前我自己报过经济学类课程,其中很重要的一个问题就是标准,先抢到标准制定权的人往往能抢得先机。软件开发中也是这个道理,先发出sdk接口的组,只要质量基本令人满意,便很有机会垄断整个行业。
这次作业刚开始时。同学们一直等着老师和助教发布接口标准,但是老师和助教都静观其变,当同学们意识到这个问题需要自己解决的时候,已经比较晚了,然后各种乱七八糟的接口开始被发到了群里,根本没有一个统一的标准,以至于UI组的对接十分困难,对接几个组就需要写几份代码。我觉得我在这个问题上就过于乐观了,我以为所有人都能打成共识最终使用 xml 格式传递数据,于是在写自己的存取错题文件功能时用的都是 xml 文件解析库,结果最终没有人用这种方式,都是普通文件或者字符串。的确他们的这种方式非常没有远见,使core不具有好的可移植性,但是毕竟我没有在群里提这个问题,仅仅主观觉得大家都会这么做,结果我做了很多无用功。这个经历给我好好上了一课,我现在深刻地体会到团队项目中标准真的真的很重要,而且想让自己占得先机,标准是要抢的。
并且,这次作业中多了许多交流合作与信息沟通的成分,无论是组内沟通还是UI、core交流,都是在大家以往的编程经历中从未出现过的。信息交流在真正的团队开发中是十分重要的,其重要性绝不亚于个人码代码的能力,这次作业中的接口标准、彼此需要实现的功能,都是非常需要沟通的内容,缺少了必要的信息沟通会严重耽误整个项目的进展。
而针对二人结对编程方面的收获,我个人的体会主要是在别人面前写代码(边分析边写)会让思维更清晰,降低出错率。至于其他理论上结对编程具有的功能我在另一篇博客里都写了,这次由于我的队友的编程能力较欠缺,很难体现出其他结对写代码的效果,希望老师以后在分组和评分的时候能够考虑到这样的问题。
最后,一句话概括一下我这次的收获:无论是从个人技术方面还是团队合作开发方面,规范与标准都是至关重要的。