结对编程_stage2
| 项目 | 内容 |
|---|---|
| 这个作业属于哪个课程 | 2021春季软件工程(罗杰 任健) |
| 这个作业的要求在哪里 | 结对项目-第二阶段 |
| 我在这个课程的目标是 | 从实践中学习软件工程相关知识(结构化分析和设计方法、敏捷开发方法、软件测试、软件项目管理、软件开发工具和环境等),培养合作开发能力 |
| 这个作业在哪个具体方面帮助我实现目标 | 实践结对编程,学习在 CI 中进行单元测试 |
| GitLab 项目地址 | 2021_Minyi_Xiao-Yulong_Xu_pair_work |
| 学号后四位 | 3377 3436 |
一、结对编程感受
3436:
本次结对编程跟上次类似,主要在寝室及新主楼公共区域线下进行。首先在设计阶段,两人一起一条条的看指导书,边讨论大体的解决方法,将整体框架商讨好后,由我先写好设计文档的框架(包括要有哪些类,方法及属性),然后一起对设计文档进行商讨修改。
因为有了第一次结对的经验,这次的初步设计还算顺利,但当讨论区各种问题频出,指导书也进行相应修改,才发现我们的设计做的不够细,有很多地方细节没考虑到,导致后来还大改了一次设计。
3377:
如果不是结对编程,面对这么多的边界情况和如此规模的系统,我无法想象需要怎么样和队友合作,才能够达成一致。
二、项目总体设计和实现思路
先上 UML 类图:

顶层接口 MetaFile 完成对所有文件(包括链接)和目录的归一化管理;AbsFile 继承这个接口,负责管理硬链接和狭义上的文件。
一个使用了单例模式的 Manager 类完成两个大系统之间的交互。具体地,Manager 类有以下特点和职能:
- 只能有一个实例
- 构造方法是
private的,由该类自身创建自己的唯一实例 - 通过
getManager()方法将唯一实例交付给MyUserSystem和MyFileSystem Manager类存有一个静态属性time,用于对指令流计数Manager类同时使用两个静态属性存储MyFileSystem和MyUserSystem的实例引用,MyFileSystem和MyUserSystem也都存有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的更多相关文章
- 结对编程--基于android平台的黄金点游戏
游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...
- 结对编程-地铁续(有种上个学期OO的既视感)
我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...
- 结对编程项目——四则运算vs版
结对编程项目--四则运算vs版 1)小伙伴信息: 学号:130201238 赵莹 博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...
- 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结
1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...
- 结对编程—黄金点游戏WinForm单机版
本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...
- Week4 结对编程
1.照片 1.1 结对编程参与者:李文涛.黎柏文 1.2 展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...
- 结对编程——关于Fault、Error、Failure程序设计
一.问题描述: 构造程序,分别是: •不能触发Fault •触发Fault,但是不能触发Error •触发Error,但是不能产生Fai ...
- GUI、模块化与结对编程(homework-03)
摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...
- BJDP结对编程活动
7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1. 金锐分享单元测试的Mocking技术,20 mins 2. 伍 ...
随机推荐
- uniapp 修改meta:viewport
onLoad(options) { this.setViewport(`width=device-width, initial-scale=1.0`); }, onUnload() { this.se ...
- 「NGK每日快讯」2021.2.7日NGK公链第96期官方快讯!
- 为什么NGK推出的DEFI项目这么火热?
进入到2020年的下半年,DeFi的锁仓量基本上是以日破新高的态势,不断的成为一个独角兽.DeFi逐渐形成一个独角兽的同时,也在不断的给区块链生态赋能,源源不断进行金融价值输送.所以加密货币体量的不断 ...
- 09、IO流—File类与IO流
目录 一.File类 基本认识 实用方法 获取功能 重命名功能(包含剪切) 判断功能 创建.删除文件 实际小案例 二.IO流 1.认识IO流 2.IO流基类介绍 字节流基类介绍 字符流基类介绍 三.节 ...
- Python数据结构与算法_搜索插入位置(07)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5输出 ...
- ArrayList的简单实现
class AList<E>{ //属性:数组和实际元素个数 private Object[] data; private int size; //构造函数:有参.无参 public AL ...
- 前端axios传递一个包含数组的对象到后台,后台可以用String接收,也可以用List集合接收
前端代码: data() { return { listQuery: { date: [], } }}, //查询列表信息getList() { if (this.listQuery.date == ...
- LayUI之数据表格扩展
1.点击一行 选中 以下代码需要在表格渲染完成时加载. 1)当单击表格行时,把单选按钮设为选中状态 //当单击表格行时,把单选按钮设为选中状态 $(document).on("click&q ...
- 使用Docker创建MongoDb服务
使用Docker创建MongoDb服务 1.先拉mongodb镜像 docker pull mongodb:4.2.5 2.创建映射目录 创建mongo映射目录,用于存放后面的相关东西. mkdir ...
- 记录vue springboot 跨域采坑
vue配置 域名src\main.js要与config\index.js一样 var axios = require('axios')axios.defaults.baseURL = 'http:// ...