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

一、结对编程感受

结对现场:

3436:

本次结对编程主要在宿舍和新主楼公共区域线下进行,使用一台电脑完成了设计、编码和单元测试的编写。

设计阶段,首先对代码风格进行了沟通和统一,包括缩进,分支的{}书写,变量命名的规范(约定所有类使用 Pascal 形式,属性、变量和方法使用 Camel 形式)。我觉得这种约定不仅可以让代码风格统一美观,还能够让 “领航员” 更容易发现 “驾驶员” 的问题。在单元测试阶段满足覆盖率要求的过程中,我感受到合理的抽象和代码复用能够极大便利正确性的验证。

特别地,我觉得结对编程中两个人的沟通,有助于保持两人持续的专注,消减编码时期的枯燥,避免摸鱼从而提高效率。

3377:

结对编程虽然只能够使用一台设备进行编程,看似编码效率只有常规方式的一半(甚至达不到一半,因为在结对编程的编码过程中有更多的讨论、修改),但是从项目整体耗时来看,在我的体感中,结对编程比常规方式效率不会差太多。我觉得可能是因为结对编程能够极大地减少团队的沟通成本,具体来说,能够减少撰写和阅读文档、传递代码复审意见、消除理解分歧上耗费的时间。在本次系统实现中,我们没有对每个方法都书写非常细致的文档,只对总体设计撰写了一个粗糙的框架,不过当项目规模增大时,可能文档还是必要的,避免出现一段时间以后自己看不懂自己代码的情况。

在整体耗时几乎不会增加的前提下,结对编程得到的代码质量和可靠性却有了显著的提高。在编码过程中,队友就指出了我随手写下的一些 bug。

在具体编码的过程中,我们交替担任 ”驾驶员“ 和 ”领航员“,我从队友身上学到了一些良好的代码书写习惯。

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

先上 UML 类图:

本次作业主要抽象出 DirFile 两个类,分别管理文件夹和文件的属性和方法,此外构造自己的 MyFileSystem 类以实现官方包中的 FileSystem 接口。Dir 类不仅管理自己的基本信息,为了能够灵活进行目录间切换等功能,还需要存储一个父目录的引用变量。

算法实现上主要有一下难点和设计:

  • 目录 size 属性的计算,我们采取了缓存式的设计,避免每次访问时都需要重新递归计算,那样可能会耗费大量的时间。具体来说,就是在每次对文件进行写入、修改时,更新上层目录的大小。这里在具体实现上还要注意不能够无脑递归,否则在极限情况下会爆栈,更合理的做法应该是使用循环获取上层目录并且完成更新,这点会在压力测试 中详细阐述。
  • 绝对路径的获取:原始的设计是在每个 DirFile 中存储一个绝对路径,但是在极限深度下,会出现 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的更多相关文章

  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. vscode & peacock extension

    vscode & peacock extension https://marketplace.visualstudio.com/items?itemName=johnpapa.vscode-p ...

  2. C-Sharp 调用命令行

    https://stackoverflow.com/questions/1469764/run-command-prompt-commands 带控制台 string strCmdText = &qu ...

  3. .gitignore规则不生效

    .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 解决方法就是先把本地缓存删除(改变成未track状态),然后再提交 ...

  4. Puppeteer: 虚拟键盘

    文档 main.js const pptr = require('puppeteer'); const gotoUrl = 'http://127.0.0.1:5500/index.html'; (a ...

  5. linux驱动系列之程序反汇编

    摘抄网页:http://www.169it.com/article/330129798173630299.html 参考网页:http://www.cppblog.com/liu1061/articl ...

  6. JQuery:JQuery基本语法,JQuery选择器,JQuery DOM,综合案例 复选框,综合案例 随机图片

    知识点梳理 课堂讲义 1.JQuery快速入门 1.1.JQuery介绍 jQuery 是一个 JavaScript 库. 框架:Mybatis (jar包) 大工具 插件:PageHelper (j ...

  7. IHttpClientFactory 踩过的坑

    public class BasicUsageModel : PageModel { private readonly IHttpClientFactory _clientFactory; publi ...

  8. 详细探秘Linux 和 Window 双系统访问Windows 磁盘需要输入密码问题解决过程分析

    将要讲很多的内容真正产生作用的配置就只有下面这一句而已.如果你只是想要解决问题看这一句就行了,后面都没有必要在看下去了. 将allow-active标签中的auth_admin_keep 改为 yes ...

  9. docker 上传到docker hub 采坑

    前面是仓库名称 后面可以命名img名字 docker push gaodi2345/wj:docker_gui

  10. Django中文文档-模型Models(二):Meta选项、模型属性、模型方法

    元数据(Meta)选项 使用内部的class Meta 定义模型的元数据,例如: from django.db import models class Ox(models.Model): horn_l ...