结对编程感想

写在前面

  本博客为笔者在完成软件工程结对编程任务后对于编程过程、最终得分的一些感想与经验分享。此外笔者还对于本课程的结对编程部分提出了一些建议。

Tips Link
作业要求博客 2019年软件工程基础-结对项目作业
笔者的总结博客 [2019BUAA软件工程]结对作业

对结对编程过程的感想

  经过长达两周的结对编程,结合《构建之法》中对结对编程的描述以及这两周的亲身经历,笔者对于结对编程的过程有了以下的感想。

  • 两人合作,更易解决问题
      在编程的过程中,笔者两人一同遇到了许多的困难:从编程语言的使用,到算法的设计,再到代码的实现。相较于单人编程,两人同时对问题进行思考,通过讨论发现两人解决问题的漏洞,互补双方解决问题的方法,有效地解决问题。比如,在笔者同伙伴一起编写单词链搜索函数时对于每个代码分支,递归调用都进行了类似一人推演一人审核的模式,有效地突破了程序中的难点。

  • 相互学习,共同进步
      在进行结对编程时,每人都有一段时间负责在对方编程的过程中在旁边进行审核。在“旁审”队友编程的过程中,笔者从队友的编程方式吸取了许多有用的部分,比如算法实现的思路,代码编写习惯等。将这些优点融入到自己的编程中,优化了自己的编程方式。

  • 同时编程,降低沟通难度
      结对编程要求两人同时在一起进行开发。笔者与队友在大多数时间里是按照结对编程的要求一同编程。很明显能感觉到,自己很熟悉在这段时间的编写的代码,即使是对方在掌控键盘编写。在一定程度上,减少了两人阅读对方代码,询问如何使用对方代码时消耗的时间。相较之下,程序有一部分代码并不是两人一起编写的,在使用仅由对方编写的代码时常会产生许多的疑惑,需要在沟通上花费不少的时间。

  • 时间规划上存在难度
      结对开发的两人并不是一直能够抽出时间一同编程。时间的碎片化也增加了两人一同使用大块时间进行编程的难度。就笔者两人而言,在这两周中基本上只有晚上有可能同时有时间结对编程。而白天常常会是一人有空而另一人有事的情况。因而结对编程时,对于时间上的规划存在一定的难度。但是如果是在类似于公司的环境中进行结对编程,这个问题应当会减轻很多。

  • 工程量较大时,进度较难推进
      结对编程和分工开发就好比单线程与多线程。当任务的工作量较大,并且各模块的开发任务能分解为并行度较高的子任务的时候,很明显进行分工“多线程”开发的效率会高一些。再基于上一条,在面对工作量较大的任务,结对编程很有可能会在推进开发进度上出现困难。在笔者结对编程的前期,两人编程的效率是比较可观的,很快就完成了基本功能。但随之而来的测试、优化、回归测试、GUI绘制等等任务使得本来时间就不太富裕的结对编程出现的进度推进上的困难。最终笔者两人将部分任务的任务进行了分工开发,缓解结对任务的压力。


对最终成绩的感想

重要的不只有代码

  实话说,对于自己最后的得分能够位于前列的事情我是十分惊喜的。我们编写的程序在进行公共测试时的表现并不太理想,公测的最终得分在班级中应该是排在中间偏上的水准。但最终能够脱颖而出,主要靠的是博客部分的得分。在分析最终排名靠前的同学的得分后,我发现大家在测试时的得分其实都差不多,只有少数小组在测试时取得了先当出色的成绩。这说明大家在解决问题时所采用的方法以及最终的取得效果其实都差不多。而最后拉开差距的则是博客部分的完成情况。
  在开发的过程中,无论怎么强调代码质量的重要性都是不为过的,毕竟代码质量是一个项目的根本。但除此之外,开发的其他环节也不应当被忽视。比如说,开发中各种文档的编写。在笔者进行结对编程时完成的而总结博客就相当于从宏观角度对整个开发流程的总结和反思。笔者在进行结对编程工作的同时就已经开始了博客的撰写。每过一段时间就会对博客中的一些内容进行更新。在写博客的过程中,笔者能够对编程的过程进行一定的反思,使得编程工作的目标更为明确。除此之外,在真正的开发流程中还有例如API文档等“中间文档”。这些文档在开发过程中起到了润滑剂的作用,让团队中每一个“齿轮”能紧密的咬合,使整个团队能够正常地运作。当然,这些文档的作用往往会体现在最终的代码质量当中。


对于课程的建议

  • 结对编程题目的改善
      本次结对编程的题目是解决最短单词链问题,分为有单词环和无单词环两种情况。根据课程组给出的作业要求,笔者认为完成本题目的重点应当在与对算法的优化方面。在无单词环的情况,由于英文字母数量的限制,搜索的复杂度并不大,不同搜索算法的差距不易体现。笔者在这一步分尝试采取了深度搜索和动态规划两种方法来解决问题。最终两种方法取得了相近的效果(肉眼不可见的差距)。
      在有单词环的情况,该问题相当于NP问题,而最终评测是要求程序给出确定解。于是无法采用启发式算法解决问题,仅能通过优化确定算法来提高性能。而这种方法带来的效益是相当有限的。当然也有个别小组采取了相当有效的优化操作,但绝大部分组的优化效果甚微(包括笔者的小组)。笔者认为该部分若改成“在最短时间内给出最长的单词链”这样的评判标准的话,大家就会在这一部分有更多的操作空间。
      除此之外,笔者认为本次结对编程的题目缺少一定的开放性。这主要体现在开发过程中在用户体验等其他方面缺少设计的开放性,大家除了算法的方面几乎没有操作的余地。而最后的程序评测也主要参考程序通过的测试点和性能,少了些程序其他的方面的评价。

写在后面

  • 应课程组要求附上笔者“黄衫”照片:


[2019BUAA软件工程]结对编程感想的更多相关文章

  1. [2019BUAA软件工程]结对作业

    Tips Link 作业链接 [2019BUAA软件工程]结对作业 GitHub地址 WordChain PSP表格 psp2.1   预估耗时(分钟) 实际耗时(分钟) Planning 计划 60 ...

  2. 11061160_11061151_Pair Project: Elevator Scheduler软件工程结对编程作业总结

    软件工程结对编程作业总结 11061160  顾泽鹏 11061151  庞梦劼 一.关于结对编程 这次的软工任务既不是单打独斗的个人任务,也不是集思广益的团队项目,而是人数为两人的结对编程.两个人合 ...

  3. 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结

    1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...

  4. 软件工程结对编程-2017282110264&2017282110249

    0 小组成员 李世钰 / 2017202110264 王成科 / 2017282110249 1 项目 GitHub 地址 && 演示地址 GitHub: https://github ...

  5. 结对编程的感想&收获

    关于结对编程的感想.感受,见我的另一篇随笔——<构建之法>结对编程   感想 下面我来谈谈本次结对编程的收获以及发现的问题 收获 ①这是我人生中第一次做UI界面设计,刚拿到这个题目还是比较 ...

  6. C#【结对编程作业】小学数学习题助手

    一.软件成品展示 软件本体下载(包括程序及其更新日志,源码工程包,UML图,API接口文档,算法介绍文档,算式计算excel实例,浅查重程序) 链接: http://pan.baidu.com/s/1 ...

  7. 2021S软件工程——结对项目第三阶段

    2021S软件工程--结对项目第三阶段 2021春季软件工程(罗杰 任健) 项目地址 1020 1169 1 实践反思 1.1 问题分析 两人习惯不一致 没有具体制定时间节点 写完代码才开始" ...

  8. 【BUAA软工】结对编程作业

    项目 内容 课程:2020春季软件工程课程博客作业(罗杰,任健) 博客园班级链接 作业:BUAA软件工程结对编程项目作业 作业要求 课程目标 学习大规模软件开发的技巧与方法,锻炼开发能力 作业目标 完 ...

  9. [2019BUAA软工助教]结对编程 - 小结

    [2019BUAA软工助教]结对编程 - 小结 一.评分规则 博客 博客共五十分 序号 要求 分值 1 在文章开头给出Github项目地址 1 2 在开始实现程序之前,在下述PSP表格记录下你估计将在 ...

随机推荐

  1. kvm企业级虚拟化环境部署

    由于要做毕设了,不得不要搭建Linux环境,自己做的课题是ELK日志分析相关.因此要大干一场,一下子计划采用近10台机器来做试验,但由于我这里只有三台物理机,所以我就搞起了虚拟化kvm.在Linux里 ...

  2. 3.8Python数据处理篇之Numpy系列(八)---Numpy的梯度函数

    目录 目录 前言 (一)函数说明 (二)一维数组的应用 (三)多维数组的应用 目录 前言 梯度函数,其中的梯度也就是斜率,反映的是各个数据的变化率.在numpy中只有一个梯度函数. (一)函数说明 ( ...

  3. CSRF 漏洞原理详解及防御方法

    跨站请求伪造:攻击者可以劫持其他用户进行的一些请求,利用用户身份进行恶意操作. 例如:请求http://x.com/del.php?id=1 是一个删除ID为1的账号,但是只有管理员才可以操作,如果攻 ...

  4. oracle数据库用户基本操作

    每个数据库都有一系列的用户,为了访问数据库,用户必须使用用户名等信息先连接上数据库实例,oracle数据库提供了多种方式来管理用户安全.创建用户的时候,可以通过授权等操作来限制用户能访问的资源以及一些 ...

  5. 踏得网互联网新技术垂直搜索服务和分享 - HTML5动效/特效/动画搜索

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/iefreer/article/details/34917729 当前主流搜索引擎在解决互联网技术创意 ...

  6. day15 Python函数递归,轻易不要用递归,容易搞出来内存溢出

    古之欲明明德于天下者,先治其国:欲治其国者,先齐其家:欲齐其家者,先修其身:欲修其身者,先正其心:欲正其心者,先诚其意:欲诚其意者,先致其知,致知在格物.物格而后知至,知至而后意诚,意诚而后心正,心正 ...

  7. 乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很 ...

  8. 如何用css实现"等高布局"。

    有时候为了让网页实现美观,在不知道高度的情况下,我们要用css实现等高布局效果,传统的方法, 我们可以用javascript实现,但是由于需求决定或者其他的情况下,我们只能用css实现,其方法主要是采 ...

  9. CVE-2018-14424 use-after-free of disposed transient displays 分析报告

    漏洞描述 GDM守护进程不能正确的取消导出在D-Bus 接口上已经被销毁的display对象,这造成本地用户可以触发UAF,从而使系统崩溃或造成任意代码执行. 调试环境 gdm版本: 3.14.2(通 ...

  10. Oracle 在函数或存储过程中执行sql查询字符串并将结果值赋值给变量

    请看黄色部分 --区县指标 THEN TVALUE_SQL := 'SELECT TO_CHAR(' || CUR_ROW.MAIN_FIELD || ') FROM ' || CUR_ROW.END ...