结对编程_stage1
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2021春季软件工程(罗杰 任健) |
这个作业的要求在哪里 | 结对项目-第一阶段 |
我在这个课程的目标是 | 从实践中学习软件工程相关知识(结构化分析和设计方法、敏捷开发方法、软件测试、软件项目管理、软件开发工具和环境等),培养合作开发能力 |
这个作业在哪个具体方面帮助我实现目标 | 实践结对编程,学习在 CI 中进行单元测试 |
GitLab 项目地址 | 2021_Minyi_Xiao-Yulong_Xu_pair_work |
学号后四位 | 3377 3436 |
一、结对编程感受
结对现场:
3436:
本次结对编程主要在宿舍和新主楼公共区域线下进行,使用一台电脑完成了设计、编码和单元测试的编写。
设计阶段,首先对代码风格进行了沟通和统一,包括缩进,分支的{}
书写,变量命名的规范(约定所有类使用 Pascal 形式,属性、变量和方法使用 Camel 形式)。我觉得这种约定不仅可以让代码风格统一美观,还能够让 “领航员” 更容易发现 “驾驶员” 的问题。在单元测试阶段满足覆盖率要求的过程中,我感受到合理的抽象和代码复用能够极大便利正确性的验证。
特别地,我觉得结对编程中两个人的沟通,有助于保持两人持续的专注,消减编码时期的枯燥,避免摸鱼从而提高效率。
3377:
结对编程虽然只能够使用一台设备进行编程,看似编码效率只有常规方式的一半(甚至达不到一半,因为在结对编程的编码过程中有更多的讨论、修改),但是从项目整体耗时来看,在我的体感中,结对编程比常规方式效率不会差太多。我觉得可能是因为结对编程能够极大地减少团队的沟通成本,具体来说,能够减少撰写和阅读文档、传递代码复审意见、消除理解分歧上耗费的时间。在本次系统实现中,我们没有对每个方法都书写非常细致的文档,只对总体设计撰写了一个粗糙的框架,不过当项目规模增大时,可能文档还是必要的,避免出现一段时间以后自己看不懂自己代码的情况。
在整体耗时几乎不会增加的前提下,结对编程得到的代码质量和可靠性却有了显著的提高。在编码过程中,队友就指出了我随手写下的一些 bug。
在具体编码的过程中,我们交替担任 ”驾驶员“ 和 ”领航员“,我从队友身上学到了一些良好的代码书写习惯。
二、项目总体设计和实现思路
先上 UML 类图:
本次作业主要抽象出 Dir
、File
两个类,分别管理文件夹和文件的属性和方法,此外构造自己的 MyFileSystem
类以实现官方包中的 FileSystem
接口。Dir
类不仅管理自己的基本信息,为了能够灵活进行目录间切换等功能,还需要存储一个父目录的引用变量。
算法实现上主要有一下难点和设计:
- 目录
size
属性的计算,我们采取了缓存式的设计,避免每次访问时都需要重新递归计算,那样可能会耗费大量的时间。具体来说,就是在每次对文件进行写入、修改时,更新上层目录的大小。这里在具体实现上还要注意不能够无脑递归,否则在极限情况下会爆栈,更合理的做法应该是使用循环获取上层目录并且完成更新,这点会在压力测试 中详细阐述。 - 绝对路径的获取:原始的设计是在每个
Dir
和File
中存储一个绝对路径,但是在极限深度下,会出现 JVM 堆空间不够的情况。因此,考虑在整个文件系统层面维护一个当前路径的变量,在需要输出绝对路径时,将当前路径和相对路径进行拼接即可。 - 路径解析:构造了一个
FileSearchStatus
类,封装逐层解析时的各个状态变量。
压力测试
对于目录 size
属性的计算,尽管我们认识到了应该采用记忆化的方式存储size
,但是对于 size
的更新处理非常粗糙,具体来说,某个目录大小变化时,递归更新上层目录的 size
。我们采用以下测试代码对其进行压力测试:
@Test
public void pressureTest() throws FileSystemException {
int max = 1024;
StringBuilder path = new StringBuilder();
for (int i = 0; i < max; i++) {
path.append("b/");
}
for (int i = 0; i < 100; i++) {
mfs.makeDirectoryRecursively(path.toString());
mfs.changeDirectory(path.toString());
}
mfs.touchFile("tt");
}
在运行过程中我们发现了爆栈的现象。通过 JProfiler 粗略看出 updateSize()方法调用树层次过深。
因此我们修改更新 size
的方法,将递归更新改为循环寻找父目录并更新。我们对修改后的代码再次测试,并没有爆栈;查看调用树,可以发现已经没有 updateSize() 了。
三、PSP 表格记录
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少时间 | 10 | 20 |
Development | 开发 | 635 | 765 |
· Analysis | · 需求分析 (包括学习新技术) | 60 | 40 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 15 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 5 | 5 |
· Design | · 具体设计 | 15 | 20 |
· Coding | · 具体编码 | 360 | 330 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 300 |
Reporting | 报告 | 45 | 60 |
· Test Report | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 5 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 20 | 30 |
合计 | 765 | 845 |
总体来说,编码上的进展出乎意料的快,但是后续测试修改花费了比预期多很多的时间,大体是由于撰写设计文档和设计复审阶段思考不够,对压力测试的挑战认知不清,导致后续小规模重构。此外,单元测试的经验不足也大大增加了测试耗时。
结对编程_stage1的更多相关文章
- 结对编程--基于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. 伍 ...
随机推荐
- vscode & peacock extension
vscode & peacock extension https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-p ...
- C-Sharp 调用命令行
https://stackoverflow.com/questions/1469764/run-command-prompt-commands 带控制台 string strCmdText = &qu ...
- .gitignore规则不生效
.gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 解决方法就是先把本地缓存删除(改变成未track状态),然后再提交 ...
- Puppeteer: 虚拟键盘
文档 main.js const pptr = require('puppeteer'); const gotoUrl = 'http://127.0.0.1:5500/index.html'; (a ...
- linux驱动系列之程序反汇编
摘抄网页:http://www.169it.com/article/330129798173630299.html 参考网页:http://www.cppblog.com/liu1061/articl ...
- JQuery:JQuery基本语法,JQuery选择器,JQuery DOM,综合案例 复选框,综合案例 随机图片
知识点梳理 课堂讲义 1.JQuery快速入门 1.1.JQuery介绍 jQuery 是一个 JavaScript 库. 框架:Mybatis (jar包) 大工具 插件:PageHelper (j ...
- IHttpClientFactory 踩过的坑
public class BasicUsageModel : PageModel { private readonly IHttpClientFactory _clientFactory; publi ...
- 详细探秘Linux 和 Window 双系统访问Windows 磁盘需要输入密码问题解决过程分析
将要讲很多的内容真正产生作用的配置就只有下面这一句而已.如果你只是想要解决问题看这一句就行了,后面都没有必要在看下去了. 将allow-active标签中的auth_admin_keep 改为 yes ...
- docker 上传到docker hub 采坑
前面是仓库名称 后面可以命名img名字 docker push gaodi2345/wj:docker_gui
- Django中文文档-模型Models(二):Meta选项、模型属性、模型方法
元数据(Meta)选项 使用内部的class Meta 定义模型的元数据,例如: from django.db import models class Ox(models.Model): horn_l ...