项目 内容
这个作业属于哪个课程 2021春季软件工程(罗杰 任健)
这个作业的要求在哪里 结对项目-第二阶段
我在这个课程的目标是 从实践中学习软件工程相关知识(结构化分析和设计方法、敏捷开发方法、软件测试、软件项目管理、软件开发工具和环境等),培养合作开发能力
这个作业在哪个具体方面帮助我实现目标 实践结对编程,学习在 CI 中进行单元测试
GitLab 项目地址 2021_Minyi_Xiao-Yulong_Xu_pair_work
学号后四位 3377 3436

一、结对编程感受

3436:

本次结对编程跟上次类似,主要在寝室及新主楼公共区域线下进行。首先在设计阶段,两人一起一条条的看指导书,边讨论大体的解决方法,将整体框架商讨好后,由我先写好设计文档的框架(包括要有哪些类,方法及属性),然后一起对设计文档进行商讨修改。

因为有了第一次结对的经验,这次的初步设计还算顺利,但当讨论区各种问题频出,指导书也进行相应修改,才发现我们的设计做的不够细,有很多地方细节没考虑到,导致后来还大改了一次设计。

3377:

如果不是结对编程,面对这么多的边界情况和如此规模的系统,我无法想象需要怎么样和队友合作,才能够达成一致。

二、项目总体设计和实现思路

先上 UML 类图:

顶层接口 MetaFile 完成对所有文件(包括链接)和目录的归一化管理;AbsFile 继承这个接口,负责管理硬链接和狭义上的文件。

一个使用了单例模式的 Manager 类完成两个大系统之间的交互。具体地,Manager 类有以下特点和职能:

  • 只能有一个实例
  • 构造方法是 private 的,由该类自身创建自己的唯一实例
  • 通过 getManager() 方法将唯一实例交付给 MyUserSystemMyFileSystem
  • Manager 类存有一个静态属性 time,用于对指令流计数
  • Manager 类同时使用两个静态属性存储 MyFileSystemMyUserSystem 的实例引用,MyFileSystemMyUserSystem 也都存有 Manager 的实例引用,使得二者可以间接访问彼此的一些属性。比如 MyFileSystem 需要查询当前用户时,只需要调用 manager.getCuUser() 方法,而 manager.getCuUser() 会调用myUserSystem.getCuUser(),从而返回当前用户名。

重定向的实现:

  • 硬链接直接持有一个文件类的引用,而软链接除了基本的 MetaFile 元信息只存储一个绝对路径。
  • 对于硬链接的文件操作,可以直接调用 AbsFile 中的接口,硬链接完成了对这些接口重写。
  • 软链接不直接存储文件或者目录,而是存储路径,则文件目录进行各种删除、移动、恢复操作时,不需要额外操作软链接,就能够保证文件系统的一致性。缺点是当需要进行软链接重定向时,都需要从根目录开始根据绝对路径进行寻址,实现较为复杂,且异常的抛出非常繁琐。

困难很多,总体可以归结为系统的规模较大,以至于无论设计还是编码的过程都很漫长,且难以直视全貌,容易在边界情况上出问题,就连复盘都很困难。而隐藏在系统规模表面之下的,首先是难以找到合适的协作模式,但更大的问题是设计和架构的缺陷在规模增加时会迅速暴露。

三、PSP 表格记录

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 10 20
· Estimate · 估计这个任务需要多少时间 10 20
Development 开发 785 1615
· Analysis · 需求分析 (包括学习新技术) 60 210
· Design Spec · 生成设计文档 30 30
· Design Review · 设计复审 (和同事审核设计文档) 15 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 5 5
· Design · 具体设计 15 120
· Coding · 具体编码 420 810
· Code Review · 代码复审 120 210
· Test · 测试(自我测试,修改代码,提交修改) 120 210
Reporting 报告 45 60
· Test Report · 测试报告 20 20
· Size Measurement · 计算工作量 5 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 20 30
合计 840 1695

总体来说,由于系统复杂度的增加,产生了许多边界问题。如果不在设计阶段把边界情况完全吃透,导致架构与期望不符,就需要通过大量补丁完善系统;然而指导书本身更新了多次(非常感谢助教学长们的辛勤付出,澄清了数十条理解容易产生歧义的地方),且我们的能力不足以设计阶段把边界情况全部吃透,因此还是不可避免地进行了许多小重构和打补丁,同时产生了很多不敢处理的冗余实现(或许测试驱动开发在这个问题上表现好一些,不至于基本不敢修改不知道什么时候写下的看似无意义的代码)。

关于实践时间远远高于预估时间的的原因,初始的想法是:题目本身的设计容错比较低,一旦设计和标程存在少许差异,就容易产生大量补丁;但经过编程实践以及复盘以后,我认为并不是这样,归根结底还是初始的设计太烂了,如果有一个比较好的设计,即使和标程存在差异,也不需要进行如此多的特判,也就不会在编码和测试上花费远远高于预估的时间

结对编程_stage2的更多相关文章

  1. 结对编程--基于android平台的黄金点游戏

    游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...

  2. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  3. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

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

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

  5. 结对编程—黄金点游戏WinForm单机版

    本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...

  6. Week4 结对编程

    1.照片 1.1  结对编程参与者:李文涛.黎柏文 1.2  展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...

  7. 结对编程——关于Fault、Error、Failure程序设计

    一.问题描述:         构造程序,分别是:         •不能触发Fault         •触发Fault,但是不能触发Error         •触发Error,但是不能产生Fai ...

  8. GUI、模块化与结对编程(homework-03)

    摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...

  9. BJDP结对编程活动

    7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1.      金锐分享单元测试的Mocking技术,20 mins 2.      伍 ...

随机推荐

  1. Dart: List排序

    var list = <Item>[ Item(title: "item 1", isTopping: true), Item(title: "item 2& ...

  2. CSS 阴影效果

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 「NGK每日快讯」12.14日NGK公链第41期官方快讯!

  4. 备战春招!开源社区系统 Echo 超全文档助力面试

    博主东南大学硕士在读,寒假前半个月到现在差不多一个多月,断断续续做完了这个项目,现在终于可以开源出来了,我的想法是为这个项目编写一套完整的教程,包括技术选型分析.架构分析.业务逻辑分析.核心技术点分析 ...

  5. 不使用的大对象为什么要手动设置null,真的有效吗?

    本文转载自不使用的大对象为什么要手动设置null,真的有效吗? 导语 在我们开发过程中,对于大的对象使用过后,为了help gc ,我们会手动将大对象置为null,背后的原理是什么,是不是最佳的实践. ...

  6. RocketMQ同一个消费者唯一Topic多个tag踩坑经历

    最近做的项目的一个版本需求中,需要用到MQ,对数据记录进行异步落库,这样可以减轻数据库的压力,同时可以抗住大量的数据落库.这里需要说明一下本人用到的MQ是公司自己在阿里的RokectMQ的基础上进行封 ...

  7. while(1)和system("pause")区别

    我们在调试时,有时候会用到这两个语句. 1.显而易见,第一个是一个循环函数,占cpu.占内存: 2.system("pause")是一个系统调用,占内存,不占cpu;这个开销还是有 ...

  8. jar下载慢,maven配置国内仓库

    使用 maven 下载 jar 包速度会很慢,原因是 maven 默认的仓库地址是国外的,所以速度很慢,解决这个问题我们只需要修改 maven 仓库地址即可 maven 下载 jar 包时会优先去 ~ ...

  9. 一篇文章彻底弄懂Android-MVVM

    转: 一篇文章彻底弄懂Android-MVVM 在学习一个技术之前,我们首先要搞清为什么要用它.用它以后会有什么好处,这样我们才能有兴趣的学习下去. 一.为什么要用MVVM? 我为什么要用这个什么MV ...

  10. CentOS安装libxml2报undefined reference to `gzopen64'

    主要是记录一下安装时候踩的坑 CentOS在make libxml2的时候,会报这个错误 ./.libs/libxml2.so: undefined reference to `gzopen64' c ...