201971010233-潘晴 实验三 结对项目—《{0-1}KP 实例数据集算法实验平台》项目报告
项目 | 内容 |
---|---|
课程班级博客链接 | 2019级卓越工程师班 |
这个作业要求链接 | 实验三 软件工程结对项目 |
我的课程学习目标 | 1.掌握软件项目结对开发流程 2.掌握Github发布软件项目的操作方法 |
这个作业在哪些方面帮助我实现学习目标 | 1.对于人机交互界面GUI界面有了了解和实现,同时也对于遗传算法有了深入了解,并用运此算法尝试解决实际问题。 2.理解了团队协作、分工的重要性 |
结对方学号-姓名 | 201971010230-孟姣姣 |
结对方本次博客作业链接 | https://www.cnblogs.com/MJJBQ/p/16055538.html |
本项目Github的仓库链接地址 | https://github.com/MJJBQ/software |
任务一
阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念。
1. 代码风格规范
- 代码风格的原则是:简明,易读,无二异性。
- 缩进:4个空格
- 行宽:需要限制,可为100字符
- 括号:在复杂的条件表达式中,用括号表示逻辑优先级
- 分行:多行语句需要分行
- 命名:“匈牙利命名法”,能方便程序员看到变量的类型。
- 下划线问题:用来分割变量名字中的作用域标注和变量的语义。
- 大小写问题:变量名由多个单词组成时,为方便区分,可使用大小写区分。
- 注释:解释程序
2. 代码设计规范
- 函数:原则是,只做一件事,但是要做好。
- goto:使函数有单一的出口,有助于程序逻辑的清晰体现。
- 错误处理:对已发生和可能发生的错误处理。
- 参数处理:在DeBug版本中,所有参数验证其正确性。在正式版本中,从外部传递过来的参数要验证其正确性。
- 断言:验证正确性
3. 代码复审
-
代码复审的定义:看代码是否在“代码规范”的框架内正确地解决了问题。
-
复审的形式:
-
自我复审:自己vs自己。
-
同伴复审:复审中vs开发者(软件工程中最基本的复审方法)。
-
团队复审:团队vs开发者。
-
4.结对编程
-
在结对编程模式下,一对程序员肩并肩地、平等地、互补地进行开发工作。两个程序员并排坐在一台电脑前,面对同一个显示器,使用同一个键盘,同一个鼠标一起工作。他们一起分析,一起设计,一起写测试用例,一起编码,一起单元测试,一起集成测试,一起写文档等。
-
结对编程中的两个角色:
-
驾驶员:控制键盘输入的人。
-
领航员:起到领航、提醒的作用。
-
-
结对编程的好处:
-
在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。
-
对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
-
在心理上, 当有另一个人在你身边和你紧密配合, 做同样一件事情的时候, 你不好意思开小差, 也不好意思糊弄。
-
在企业管理层次上,结对能更有效地交流,相互学习和传递经验,能更好地处理人员流动。因为一个人的知识已经被其他人共享。
-
结对编程让两个人所写的代码不断地处于“复审”的过程,可以避免牛仔式的编程。同时,结对编程避免了“我的代码”还是“他的代码”的问题,使得代码的责任不属于某个人,而是属于两个人,进而属于整个团队,这样能够帮助建立集体拥有代码的意识,在一定程度上避免了个人英雄主义。
-
总之,如果运用得当,结对编程能得到更高的投入产出比。
-
任务二
两两自由结对,对结对方《实验二 软件工程个人项目》的项目成果进行评价
- 对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
- 克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
- 代码复审的核查表
项目 内容 概要部分 代码符合需求和规格说明么? 符合 代码设计是否考虑周全? 是 代码可读性如何? 可读性好 代码容易维护么? 容易维护 代码的每一行都执行并检查过了吗? 是 设计规范部分 设计是否遵从已知的设计模式或项目中常用的模式? 是 有没有硬编码或字符串/数字等存在? 否 代码有没有依赖于某一平台,是否会影响将来的移植? 否 开发者新写的代码是否用已有的Library/SDK/Framework中的功能实现?在本项目中是否存在类似的功能可以通过调用而不用全部重新实现? 是 有没有无用的代码可以清除? 无 代码规范部分 修改的部分符合代码标准和风格么? 符合 具体代码部分 有没有对错误进行处理?对于调用的外部函数,是否检查了返回值或处理了异常? 无错误 参数传递有无错误,字符串的长度是字节的长度还是字符的长度,是从0开始计数还是从1开始计数 无,字符串的长度是字符的长度,从0开始计数 循环有没有可能出现死循环? 无 有没有使用断言来保证我们认为不变的条件真的得到满足? 有 有没有优化的空间? 有 数据结构中有没有用不到的元素? 无 效能 代码的效能如何?最坏的情况是怎么样的? 效能较好 对于系统和网络的调用是否会超时?如何处理? 否 可读性 代码可读性如何?有没有足够的注释? 可读性较好;有 可测试性 代码是否需要更新或创建新的单元测试? 否
任务三
采用两人结对编程方式,设计开发一款{0-1}KP 实例数据集算法实验平台
1. 需求分析
本项目要求设计开发一款{0-1}KP 实例数据集算法实验平台,该平台具有实例数据读写、示例数据排序、使用不同算法求解0-1背包问题、以及日志记录等功能。除此之外,该平台还必须具备以下要求:
- {0-1}KP 实例数据集需存储在数据库;
- 平台可动态嵌入任何一个有效的{0-1}KP 实例求解算法,并保存算法实验日志数据;
- 人机交互界面要求为GUI界面(WEB页面、APP页面都可);
- 查阅资料,设计遗传算法求解{0-1}KP,并利用此算法测试要求;
- 附加功能:除(1)-(4)外的任意有效平台功能实现。
2.软件设计分析
3.软件实现及核心功能代码展示
-
遗传算法代码如下:
public void solve() { init(); int i; int k; // 初始化种群 initGroup(); // 计算初始化种群适应度,Fitness[max] for (k = 0; k < scale; k++) { fitness[k] = evaluate(oldPopulation[k]); // System.out.println(fitness[k]); } // 计算初始化种群中各个个体的累积概率,Pi[max] countRate(); for (t = 0; t < MAX_GEN; t++) { evolution(); // 将新种群newGroup复制到旧种群oldGroup中,准备下一代进化 for (k = 0; k < scale; k++) { for (i = 0; i < LL; i++) { oldPopulation[k][i] = newPopulation[k][i]; } } // 计算种群适应度 for (k = 0; k < scale; k++) { fitness[k] = evaluate(oldPopulation[k]); } // 计算种群中各个个体的累积概率 countRate(); } }
4.程序运行
- 欢迎截面图
- 主界面
- 数据展示功能
- 散点图绘制功能
- 问题求解和日志记录功能
- 数据库存储
5.描述结对的过程,提供两人在讨论、细化和编程时的结对照片
6.PSP展示
PSP2.1 任务内容 计划共完成需要的时间(h) 实际完成需要的时间(h) Planning 计划 1 0.5 - Estimate - 估计这个任务需要多少时间,并规划大致工作步骤 1 0.5 Development 开发 30 60 - Analysis - 需求分析(包括学习新技术) 10 11 - Design Spec - 生产设计文档 1 0.5 - Design Review - 设计复审(和同事审核设计文档) 1 2 - Coding Standard 代码规范 1 1 - Design - 具体设计 3 6 - Coding - 具体编码 12 25 - Code Review 代码复审 3 5 - Test - 测试(自我测试,修改代码,提交修改) 5 8 Reporting 报告 3 2 - Test Report - 测试报告 2 1 - Size Measurement - 计算工作量 1 0.5 - Postmortem & Process Improvement Plan - 事后总结 ,并提出过程改进计划 0.5 1 小结感受
两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
通过此次结对项目的完成,我认为两人合作真的能够带来1+1>2的效果。两个人对于问题的分析和理解会更加深入,不会像一个人考虑时那么片面,结对编程能提供更好的设计质量和代码质量,两人合作能有更强的解决问题的能力。两个人在一起会相互学习,传递经验,取长补短;配合工作能够提高工作效率,结对工作能带来更多的信心。两人共同协作,可以更有效的解决问题,更好的完成项目开发。