结对项目第三阶段——总结

项目 内容
这个作业属于哪个班级 2021春季软件工程 (罗杰 任健)
项目地址 2021_alige_homeworks / pair_works / 2021_Yuxuan_Wu-Yuhao_Yan_pair_work
结对成员 严宇皓 3201 吴昱宣 3256

一、结对项目实践反思

结对项目到此就快完成了。回顾我们这两次的结对项目作业,在收获的同时,也暴露出不少问题。

出现的问题

1. 分而治之。在第一次作业时,我们自认为任务比较简单,于是只是两人一起做了简单的架构分析,随后就采取了“分而治之”的方法,各写一部分代码。然而这么做实质上和一个人做没什么区别。事实也证明了这一点。两人分治完成后,我们不得不花大量的时间debug,最后合计所花的时间,可能也不会比不分治的方法少很多。但正所谓吃一堑长一智,有了这次的经验我们才体会到结对的好处。

2. 意见分歧。虽然整体架构我们是事先商量好的,但是对方在具体实现时则可能与自己想象中有些出入。例如在第一次作业时我认为查找路径需要定义一个临时的目录类tmp来完成进入和查找目录的操作,但我的结对伙伴则直接用成员变量currentDirectory来完成此操作,这就使得我在debug时常常忘记恢复currentDirectory,从而引入新的bug。虽然最后意见分歧的问题并没有造成什么大影响,但这个问题显然延长了我们的完成时间。

需求分析的实践体会

需求分析对于这两次作业来说是非常重要的。第一次作业架构设计比较明确,因此总体来说第一次作业的需求分析我们做得还是比较好的。也没有因为需求分析带来什么问题。

第二次作业比较复杂,我们讨论了很长时间才开始编码。然而,人算不如天算,虽然我们做好了需求分析,但反复无常的指导书强制让我们体验了一把需求分析没做好的滋味。由于指导书的反复更改,我们也不得不多次更改我们现有的编码来适应指导书的变化。第二次作业初期的bug,相当一部分都是因为指导书描述不清或者对指导书理解有误而造成的(比较典型的有软硬链接、修改时间等问题)。

第二次作业让我深深体会到需求分析的重要性。因为拜此所赐,从第二次作业布置开始到第二次作业截止为止,我几乎什么也没干过,时间全用在了这次作业上。

架构设计的实践体会

我们很明白架构设计的重要性,每次作业的一开始我们也会着重讨论架构的设计。虽然第二次作业指导书被反复修改,所幸大的架构并不是很受影响。除了前面提到的(因为指导书修改)需求变动造成的bug以外,几乎没有bug是因为架构设计不当造成的。我们在这方面的一个典型例子是,第一次作业我们将数据块和文件绑定在一起,而第二次作业我们果断地改进了上一次的架构,把数据块用一个单独的类来抽象,这就使得处理硬链接方面简单很多。

进度、质量和沟通管理实践体会

在进度方面我们还是比较认真负责,不存在摸鱼的现象。质量主要通过单元测试和二人共同编程(虽然第一次没有)来控制。我认为编码过程中沟通是非常重要的,我们就这样发现了许多潜在的bug。因为二人理解不一致而造成的bug在上面“出现的问题”部分已有举例,此处不再赘述。

对于私下里向助教求助的问题,助教很耐心地向我们解答了,尤其是在第一次作业解决了我们的一个大问题——官方包的使用。一开始我们直接使用官方包的java源码,结果提交评测之后显示非常奇怪的错误。咨询了刘乾助教之后他及时地帮我们解决了该问题。如果这个问题不能及时解决,不仅评测不能通过,并且可能会被查重机制判为抄袭。

建议

在结对编程前一定要商讨好相应的架构,虽然不一定要商讨规范,但是如果能商讨规范则尽量商讨。商讨越详细,相应的效率越高,还可以避免许多本不应该有的bug。

如果想采取分治行动,应该双方各完成一个模块后互相查阅,以便于及时了解对方的特点。同时对于比较复杂的功能则不建议进行分治。这样做既能提高效率,又能一定程度上保留结对编程的优势,不至于完全变为“分治”编程。

二、CI体验感想

CI对于提高代码质量、加强代码管理有很大帮助。类似提交评测,我们可以在每次提交时自动触发回归测试,同时执行其他的一些指令,这样保证了代码的质量,同时提高了工作的效率。

总的来说本次结对编程中CI体验还算不错。

三、结对编程感想

总体感想

我们在这次结对中线上与线下相结合,线下主要是商讨架构等问题、完成代码的编写;线上主要是完成单元测试、bug修复等问题。结对中虽然意见会有分歧,但最后经过进一步的协商、修改,分歧也会得到解决。相较于个人编程,结对编程最大的优点在于工作效率的提高(无论是编码速度还是减少bug方面),但带来的新的问题就是前面多次提到过的意见分歧的问题。关于推广结对编程效果的方法,前面(实践反思的“建议部分”)已有叙述。

队友评价

这是严宇皓对于吴昱宣的评价:

总的来说还是比较负责地和我一起完成了结对作业,基本没有摸鱼的现象。但是在编码过程中有些地方考虑不是很全面,时常出现考虑不周、漏写情况的现象,另外在写单元测试时针对特殊情况的数据较少。希望以后在完成相应任务时能够细致地阅读相应要求,作出全面、细致的考虑,这样自己的能力也会强很多。

这是吴昱宣对于严宇皓的评价:

我觉得唯一的不足就是在一些细节方面的问题(最多的是各个元素的命名),最后由于我的强迫症以及原有的checkstyle检查,我对这些细节进行了完善。总得来说比较大腿,尤其是让我学会了全面地编写单元测试,以及配置CI。另外,对于bug的敏锐程度他确实比我强。

软件工具

主要使用的软件工具有IDEA和git,IDEA没什么好说的,用于编写java程序。git主要用于版本控制和项目管理,由于git的存在,二人可以通过push和pull快速同步进度,提高了效率。

感悟与吐槽

结对编程让我感受到协作的重要性,在这个过程中我也摸索出自己的一套交流和协作的方法。

我想吐槽的是第二次作业中的指导书。指导书的反复修改(或者说issue区有一堆指导书没考虑的问题)给我们带来了很大的麻烦。可能助教觉得指导书的修改只不过是把某些不准确的描述准确化了而已,或是把某些有误的、不全面的描述修正了而已,不会对我们的代码造成大规模影响。但这显然是不对的,有的架构也许改动不大,但有的也许就需要重构。我知道的有好几位同学上一周就跟我一样,除了处理第二次作业几乎就没干过别的事。希望以后助教在出指导书前能够好好审核,如果不能为大家提供一个较为准确的指导书,就应该考虑布置这样的作业是否合理了。

posted @ 2021-04-07 11:45  6yyh6  阅读(103)  评论(4编辑  收藏  举报