项目 | 内容 |
---|---|
课程班级博客链接 | 班级博客 |
这个作业要求链接 | 作业要求 |
我的课程学习目标 | 运用科学高效的方法学习软件工程的理论和知识 |
这个作业在哪些方面帮助我实现学习目标 | 掌握软件项目个人开发流程,掌握Github发布软件项目的操作方法 |
结对方学号-姓名 | 201871010202-曹盼盼 |
结对方本次博客作业链接 | 结对方博客链接 |
本项目Github的仓库链接地址 | Github仓库地址 |
(1)体验软件项目开发中的两人合作,练习结对编程(Pair programming)。
(2)掌握Github协作开发程序的操作方法。
第3章(软件工程师的成长)的理论和知识点主要有:评价软件工程师水平的主要方法、技能的反面、TSP对个人的要求、软件工程师的思维误区等;第4章(两人合作)的理论和知识点主要有:代码规范、极限编程、两人合作的不同阶段、影响他人的技巧。
代码风格规范
代码设计规范
代码复审
名 称 | 形 式 | 目 的 |
---|---|---|
自我复审 | 自己 vs. 自己 | 用同伴复审的标准来要求自己。不一定最有效,因为开发者对自己总是过于自信。如果能持之以恒,则对个人有很大好处 |
同伴复审 | 复审者 vs. 开发者 | 简便易行 |
团队复审 | 团队 vs. 开发者 | 有比较严格的规定和流程,用于关键的代码,以及复审后不再更新的代码。 覆盖率高——有很多双眼睛盯着程序。但是有可能效率不高(全体人员都要到会) |
复审的目的在于:
(1)找出代码的错误。如:
a. 编码错误,比如一些能碰巧骗过编译器的错误。
b. 不符合项目组的代码规范的地方。
(2)发现逻辑错误,程序可以编译通过,但是代码的逻辑是错的。
(3)发现算法错误,比如使用的算法不够优化。
(4)发现潜在的错误和回归性错误——当前的修改导致以前修复的缺陷又重新出现。
(5)发现可能改进的地方。
(6)教育(互相教育)开发人员,传授经验,让更多的成员熟悉项目各部分的代码,同时熟悉和应用领域相关的实际知识。
4 结对编程
(1)对项目博文作业进行阅读并进行评论,评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。
(2)克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录。
(3)依据复审结果尝试利用github的Fork、Clone、Push、Pull request、Merge pull request等操作对同伴个人项目仓库的源码进行合作修改。
(1)平台基础功能:实验二 任务3;
(2)D{0-1}KP 实例数据集需存储在数据库;
(3)平台可动态嵌入任何一个有效的D{0-1}KP 实例求解算法,并保存算法实验日志数据;
(4)人机交互界面要求为GUI界面(WEB页面、APP页面都可);
(5)查阅资料,设计遗传算法求解D{0-1}KP,并利用此算法测试要求(3);
(6)附加功能:除(1)-(5)外的任意有效平台功能实现。
需求分析陈述:
采用动态规划算法、回溯算法求解D{0-1}背包问题的程序。正确读入实验数据文件的有效D{0-1}KP数据;能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图; 能够对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位);任意一组D{0-1} KP数据的最优解、求解时间和解向量可保存为txt文件或导出EXCEL文件。
软件设计说明:
输入输出文件;能够绘制任意一组D{0-1}KP数据以重量为横轴、价值为纵轴的数据散点图; 对一组D{0-1}KP数据按项集第三项的价值:重量比进行非递增排序;用户能够自主选择动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位)。
软件实现及核心功能代码展示:
针对任务三运用动态规划算法、回溯算法求解指定D{0-1} KP数据的最优解和求解时间(以秒为单位),主要设计函数有动态规划求解,回溯法求解,以及输出最优解;动态规划,对每一件物品遍历背包容量,当背包可容纳值大于等于当前物品,与之前已放进去的物品所得价值进行对比,考虑是否需要置换;用回溯法求解需要构造解的子集树。对于每一个物品i,对于该物品只有选与不选2个决策,总共有n个物品,可以顺序依次考虑每个物品,这样就形成了一棵解空间树:基本思想就是遍历这棵树,以枚举所有情况,最后进行判断,如果重量不超过背包容量,且价值最大的话,该方案就是最后的答案。在搜索状态空间树时,只要左子节点是可一个可行结点,搜索就进入其左子树。对于右子树时,先计算上界函数,以判断是否将其减去(剪枝)。
测试运行:
代码片段:
文件打开与数据预处理: file=open('D:\Course\软件工程\实验二 任务3data_set\idkp1-10.txt','r') file1=open('D:\Course\软件工程\实验二 任务3data_set\i.txt','w') string=file.read().strip() ss=string.split('\n') s=[] for i in ss: i.rstrip(',') i.rstrip('\n') i.rstrip('.') if i.startswith('*') or i.startswith('The') or i.startswith('IDK') or i=='' : continue else: s.append(i[:-1]) print(s) file1.write("\n".join(s)) file.close() file1.close()
散点图绘制: fig,ax=plt.subplots() ax1=plt.subplot(1,1,1) for i in range(0,len(s)-1,2): x=list(map(int,s[i].split(','))) y=list(map(int,s[i+1].split(','))) ax1.scatter(x,y) plt.show()
动态规划: def bag(n,c,w,v): res=[[-1 for j in range(c+1)] for i in range(n+1)] for j in range(c+1): res[0][j]=0 for i in range(1,n+1): for j in range(1,c+1): res[i][j]=res[i-1][j] if j>=w[i-1] and res[i][j]<res[i-1][j-w[i-1]]+v[i-1]: res[i][j]=res[i-1][j-w[i-1]]+v[i-1] return res
回溯法: def backtrack(i): global bestV,curW,curV,x,bestx if i>=n: if bestV<curV: bestV=curV bestx=x[:] else: if curW+w[i]<=c: x[i]=True curW+=w[i] curV+=v[i] backtrack(i+1) curW-=w[i] curV-=v[i] x[i]=False backtrack(i+1)
PSP2.1 | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
---|---|---|---|
lanning | 计划 | 10 | 20 |
· Estimate | · 估计这个任务需要多少时间,并规划大致工作步骤 | 10 | 20 |
Development | 开发 | 330 | 520 |
· Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
· Design Spec | · 生成设计文档 | 30 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 30 | 50 |
· Coding | · 具体编码 | 120 | 220 |
· Code Review | · 代码复审 | 30 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 30 | 80 |
Reporting | 报告 | 40 | 60 |
· Test Report | · 测试报告 | 15 | 20 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结 ,并提出过程改进计划 | 15 | 30 |
通过分析估计和实际消耗时间,发现在具体设计环节耗时最多,需求分析和具体设计阶段的实际用时比预期长了许多,主要是因为需求分析阶段需要完成查阅资料等工作,比较花费时间,而具体编码阶段需要复学学习算法等内容,并且还要学习项目中需要用到的以前未掌握的知识和技术。
本次实验主要是通过完成软件工程结对项目,体验软件项目开发中的两人合作,练习结对编程(Pair programming),并掌握Github协作开发程序的操作方法。对于此次的项目设计,我有很多地方还很不完善,本次结对编程项目是基于实验二个人项目的基础上完成,还需要查阅大量资料来学习遗传算法,以及熟悉web界面的设计。本次实验中,通过阅读和学习《构建之法—现代软件工程》第3-4章内容,理解和掌握了代码风格规范、代码设计规范、代码复审、结对编程概念;并在实验过程中通过实践,掌握了Github的fork、 clone、push、pull request 、merge pull request等的相关操作。此次结对编程项目使我初步感受到了结对编程的一些优势,但是毕竟是初次尝试,过程中也出现了一些小问题。结对编程减轻了个人的一部分工作量,而且让我深刻感受到在开发过程中思路更加开阔,也更不容易出错,也提高了相互的合作交流,虽然本次项目完成结果不完善,但是我认为还是优于一个人的,达到了一定的效果(1+1>2)。