项目 内容
这个作业属于哪个课程 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. 闲着蛋疼看下a++的过程

    赋值过程 int a = 1; int b = a++; x86 反汇编: int a = 1; 00D06428 C7 45 F8 01 00 00 00 mov dword ptr [a],1 i ...

  2. flutter 自定义TabBar

    这里有个工作示例 import 'dart:async'; import 'package:flutter/material.dart'; import 'package:rxdart/subject ...

  3. 一文读懂Servlet

    1 Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet. 开发一个Servlet程序,只需两步: 编写一个类,实现Servl ...

  4. Tawk.to工具使用攻略--如何让访客通过tawk.to联系时先填写邮箱、联系方式等信息

    Tawk.to工具使用攻略--如何让访客通过tawk.to联系时先填写邮箱.联系方式等信息 您在使用tawk.to的时候,是否遇到当访客联系您时,您未能及时查看到tawk.to的消息,后续想要再联系访 ...

  5. 可以设置过期时间的Java缓存Map

    前言 最近项目需求需要一个类似于redis可以设置过期时间的K,V存储方式.项目前期暂时不引进redis,暂时用java内存代替. 解决方案 1. ExpiringMap 功能简介 : 1.可设置Ma ...

  6. 采用lua脚本获取mysql、redis数据以及jwt的校验

    一.安装配置Openresty 1,安装 wget https://openresty.org/download/ngx_openresty-1.9.7.1.tar.gz # 下载 tar xzvf ...

  7. 浮动引发的高度塌陷问题及其解决方法(BFC相关概念及性质)

    浮动引发的高度塌陷问题 高度塌陷问题的产生 BFC(Block Formatting Context)的引入 元素开启BFC后的特点 开启BFC的元素不会被其他浮动元素所覆盖 开启BFC的元素不会发生 ...

  8. R语言低级绘图函数画个温度计

    x <- 1:2 y <- runif(2,0,100) par(mar=c(4,6,2,6)) plot(x,y,type="n",xlim=c(0.5,2.5),y ...

  9. 将MacOS Catalina 降级为 Mojave

    1.下载Mojave https://apps.apple.com/cn/app/macos-mojave/id1398502828?ls=1&mt=12 2.更改U盘格式和名称 3.制作U盘 ...

  10. POJ-3268(来回最短路+dijkstra算法)

    Silver Cow Party POJ-3268 这题也是最短路的模板题,只不过需要进行两次求解最短路,因为涉及到来回的最短路之和. 该题的求解关键是:求解B-A的最短路时,可以看做A是起点,这就和 ...