201971010116-姜婷 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2022年春软件工程课程班(2019级计算机科学与技术) |
这个作业要求链接 | 实验三 软件工程结对项目 |
本次课程学习目标 | 1.体验软件项目开发中的两人合作,练习结对编程(Pair programming)。 2.掌握Github协作开发软件的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | 1. 利用git第一次实现了协作开发,感觉不错 2. 结对编程,完成了更多的内容 3. 对自己的代码规范有了更多的启发和反省 |
结对方学号-姓名 | 201971010259-张圆圆 |
结对方本次博客作业链接 | 201971010259-张圆圆 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告 |
本项目Github的仓库链接地址 | Knapsack-0-1 |
一、任务1 阅读《现代软件工程—构建之法》第3-4章内容
1.1 第三章 软件工程师的成长
- 软件工程师如何成长?
- 积累软件开发相关知识
- 积累问题领域的知识和经验
- 对通用的软件设计思想和软件工程思想的理解。
- 提升职业技能
- 实际成果
- 软件开发的工作量和质量怎么衡量?
- 项目/任务有多大
- 花了多长时间
- 质量如何
- 是否按时交付
- TSP对团队成员的要求:
- 交流
- 说到做到
- 接受团队赋予的角色并按角色要求工作
- 全力投入团队的活动
- 按照团队流程的要求工作
- 做好准备工作
- 理性的工作
- 软件工程师的思维误区:
- 分析麻痹
- 不分主次,相解决所有的依赖问题
- 过早优化,无视这个模块对全局的重要性
- 过早扩大化/泛化
解决大问题固然让人感觉美妙,但是把小问题真正解决好,也不容易
1.2 第四章 两人合作
- 代码规范分为两部分
- 代码风格规范
- 代码风格的原则是:简明、易读、无二义性。Tab键在不同的情况下会显示不同的长度,严重干扰阅读体验。
- 代码设计规范
- 函数原则:只做一件事,并且要做好。
- 代码复审的定义:看代码是否在代码规范的框架内正确地解决了问题。
二、任务2 两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
2.1 博文评价:
- 结对方博客链接:201971010259-张圆圆 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告
- 结对方Github项目仓库链接:Knapsack-0-1
- 评价内容:博客的结构很完整,每个部分都写的很棒,是学习和借鉴的目标。内容充实,书写认真,能从其中看出仔细认真的态度,是值得学习临摹的一篇博客。整个页面美化也很到位,看起来丰富多彩,目录的设置也使得跳转观看更方便。
- 博文结构:结构清晰完整,每个部分都写得很清楚,把握了每个细节。
- 博文内容:从开始到结尾每一部分都完成了博客要求。整个项目也实现了所有需求,代码结构完整,运行逻辑清楚。
- 博文结构与PSP中“任务内容”列的关系:博客的内容几乎与PSP内容对应。
- PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究:第一次做项目,对项目流程还不熟悉,不能对自己的时间做到合理把握,也不够了解自己现在的能力导致时间规划不够准确。
2.2 项目克隆
克隆结对方项目源码到本地机器,阅读并测试运行代码

图1 clone结对方实验二项目
// 终端编译运行
javac Main.java
java Main

图2 idea运行eclipse项目
项目中动态规划法输出结果不正确。在运行过程中发现,由于编写了绝对地址导致在编译错误。在编程过程中应当减少绝对地址的使用以提高代码的可移植性。
String filePath = "D:\\2021-2022\\大三下\\软件工程经济\\Git\\0-1\\0-1-knapsack\\res\\beibao"+fileId+".in";

图3 动态规划法结果有误
2.3 代码核查表
项目 | 内容 | |
---|---|---|
概要部分 | 代码符合需求和规格说明么? | 是 |
代码设计是否考虑周全? | 是 | |
代码可读性如何? | 较好 | |
代码容易维护么? | 是 | |
代码的每一行都执行并检查过了吗? | 是 | |
设计规范部分 | 设计是否遵从已知的设计模式或项目中常用的模式? | 是 |
有没有硬编码或字符串/数字等存在? | 否 | |
代码有没有依赖于某一平台,是否会影响将来的移植? | 依赖eclipse开发环境,无法在idea中运行 | |
开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以通过调用而不用全部重新实现? | 否 | |
有没有无用的代码可以清除? | 有很多重复性的代码 | |
代码规范部分 | 修改的部分符合代码标准和风格么? | 符合 |
具体代码部分 | 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? | 有 |
参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 | 无错误,字符长度,从0开始计数 | |
边界条件是如何处理的?switch语句和default分支是如何处理的?循环有没有可能出现死循环? | 没有死循环 | |
有没有使用断言来保证我们认为不变的条件真的得到满足? | 没有 | |
对资源的利用,是在哪里申请,在哪里释放的?有无可能存在资源泄露?有没有优化的空间? | 有可能,存在优化空间 | |
数据结构中有没有用不到的元素? | 无 | |
效能 | 代码的效能如何?最坏的情况是怎么样的? | 是 |
代码中,特别是循环中是否有明显可优化的部分? | 是 | |
对于系统和网络的调用是否会超时?如何处理? | 是 | |
可读性 | 代码可读性如何?有没有足够的注释? | 是 |
可测试性能 | 代码是否需要更新或创建新的单元测试? | 是 |
2.4 仓库commit日志数据
结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据

图4 仓库fork记录
三、任务3 采用两人结对编程方式,设计开发一款{0-1}KP 实例数据集算法实验平台
3.1.需求分析
- 正确存储并读取数据
- 将{0-1}KP 实例数据集存储在mysql数据库中,使用数据时从数据库读取实验数据文件的有效{0-1}KP数据; - 排序
- 对任意一组{0-1}KP数据按重量比进行非递增排序 - 算法求解
- 用户自主选择贪心算法、动态规划算法、回溯算法,遗传算法求解指定{0-1} KP数据的最优解和求解时间(以秒为单位) - 保存结果
- 将任意一组{0-1} KP数据的最优解、和解向量可保存为Excel表格 - 保存日志数据
- 可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据 - 实现人机交互界面为GUI界面
- 通过Android Studio 构建APP框架的方式和web页面访问的方式实现人机交互界面 - 绘制散点图
- 对任意一组{0-1}KP数据绘制以重量为横轴、价值为纵轴的数据散点图 - 用户登录界面(扩展部分)
- 用户成功输入用户名、密码、验证码后即可使用app或进入web界面
3.2 功能设计与实现
3.2.1. 散点图绘制

图5 app散点图绘制

图6 web散点图绘制
3.2.2. 数据集存储数据库
{0-1}KP 实例数据集需存储在数据库

图7 app数据库数据读入

图8 web页面数据库数据读入

图9 web页面背包数据集查看
3.2.3. 求解算法,并保存日志数据
人机交互界面要求为WEB页面平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据

图10 app贪心算法求解

图11 web页面背包问题选择页面

图12 web动态规划法求解

图13 app日志纪录保存

图14 web页面日志查看
3.2.4. 遗传算法
遗传算法求解{0-1}KP

图15 app遗传算法求解
3.2.5. 注册页面

图16 app注册页面

图17 web注册页面
四、PSP消耗时间
PSP2.1 | 任务内容 | 计划共完成需要的时间(h) | 实际完成需要的时间(h) |
---|---|---|---|
Planning | 计划 | 2 | 4 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 1 | 3 |
Development | 开发 | 120(5天) | 216(9天) |
Analysis | 需求分析(包括学习新技术) | 3 | 10 |
Design Spec | 生产设计文档 | 2 | 1.5 |
Design Review | 设计复审(和同事审核设计文档) | 5 | 5 |
Coding Standard | 代码规范(为目前的开发指定合适的规范) | 0.5 | 0.58 |
Design | 具体设计 | 2 | 2 |
Coding | 具体编码 | 72 | 96 |
Code Review | 代码复审 | 40 | 5 |
Test | 测试(自我测试,修改代码,提交修改) | 12 | 15 |
Reporting | 报告 | 3 | 6 |
Test Report | 测试报告 | 1 | 1 |
Size Measurement | 计算工作量 | 1 | 1 |
Postmortem & Process Improvement Plan | 事后总结,并提出过程改进计划 | 0.5 | 0.5 |
五、描述结对的过程,提供两人在讨论、细化和编程时的结对照片

图18 github仓库讨论

图19 互相询问进度
六、项目仓库
- 多次commit的记录

图20 commit记录
- src文件夹

图21 项目src文件夹
- Github项目仓库根目录下项目代码规范文档

图22 代码规范文档
七、小结
在上一次的项目设计中,结对双方使用高级语言不同,且之前的学习方向不同,所掌握的编程技术不同。为实现“领航员”与“驾驶员”角色的轮流切换,商议决定项目设计包含两部分:利用java语言实现app设计,利用Python语言实现html设计。其中app实现功能较为全面,但web页面设计功能并不全面,且web在路由跳转方面并没有做到很好。在本次结对编程实验中app显示——驾驶员为张圆圆,web设计中——驾驶员为姜婷。角色切换过程中,互相学习,互相监督,提高项目效率、代码质量。
通过这次的互相结对对程序编写的团体合作有了进一步的了解,熟悉了git在软件开发中的作用。但是这次我觉得我没能控制好个人情感,在结对开发过程中我对有些问题过于偏执,导致项目进程缓慢。之后我应该与队员之间好好交流,互相理解,做好沟通。在结对过程中能感受到1+1>2,这是一次很好的学习机会!
本文作者:Jiokie
本文链接:https://www.cnblogs.com/Jiokie/p/16089877.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步