项目 | 内容 |
---|---|
课程班级博客链接 | [班级博客] |
这个作业要求链接 | [作业要求] |
我的课程学习目标 | (1)在团队项目的开发过程中,练习结对编程。(2)复习并掌握Github协作开发程序的操作方法。 |
这个作业在哪些方面帮助我实现学习目标 | (1)在团队交流和阅读对方程序过程中,两两合作,练习结对编程。 (2)提交项目原码,以及复审同伴项目代码的过程中,掌握Github协作开发程序的操作方法。 |
结对方学号-姓名 | 201871010110-李华 |
结对方本次博客作业链接 | [结对方作业链接] |
[班级博客]:https://edu.cnblogs.com/campus/xbsf/2018CST | |
[作业要求]:https://www.cnblogs.com/nwnu-daizh/p/14604444.html | |
[结对方作业链接]:https://www.cnblogs.com/LH-18110/p/14651541.html |
-
任务1
-
要求:阅读《现代软件工程—构建之法》第3-4章内容,理解并掌握代码风格规范、代码设计规范、代码复审、结对编程概念
-
代码风格规范:主要是文字上的规定。
-
代码风格规范原则:简明、易读、无二义性
-
缩进:4个空格(可读性)。
-
行宽:行宽必须限制,一般为100个字符。
-
括号:在复杂的条件表达式中,用括号可以清楚地表示逻辑优先级。
-
断行与空白的{}行:没有确定的"{"、"}"来判断程序的结构,在多层控制嵌套时,不容易看清结构和对应关系。
-
分行:不要将多个变量定义在一行上。
-
命名:在变量名中不要提到类型或其他语法方面的描述;避免过多的描述;如果信息可以从上下文得到,那么此类信息就不必写在变量名中;避免可要可不要的修饰词。
-
下划线:下划线用来分隔变量名字中的作用域标注和变量的语义。
-
大小写:由多个单词组成的变量名,如果全部都是小写,很不易读,一个简单的解决方法是用大小写区分它们。
-
注释
-
-
-
代码设计规范:牵涉到程序设计、模块之间的关系、设计模式等方方面面的通用原则。
-
函数:程序设计语言中的绝大部分功能,都在程序的函数中实现。
-
goto:函数最好有一个单一的出口,为了达到这一目的,可以使用goto。只要有助于程序逻辑的清晰体现,什么方法都可以使用,包括goto。
-
错误处理:
-
参数处理:在debug版本中,所有参数都要验证其正确性。
-
断言
-
-
如何处理c++中的类:
-
类
-
class vs. struct
-
公共/保护/私有成员
-
数据成员
-
虚函数
-
构造函数
-
析构函数
-
new和delete
-
运算符
-
异常
-
类型继承
-
-
-
代码复审:看代码是否在代码规范的框架中正确地解决了问题。(自我复审、同伴复审、团队复审)
-
代码复审的目的:
-
找出代码的错误。
-
发现逻辑错误,程序可以编译通过,但是代码的逻辑是错误的。
-
发现算法错误。
-
发现潜在的错误和回归性错误--当前的修改导致以前修复的缺陷又重新出现。
-
可能需要改进的地方。
-
-
代码复审的核查表
-
概要部分
-
设计规范部分
-
代码规范部分
-
具体代码部分
-
效能
-
可读性
-
可测试性
-
-
-
结对编程:
-
为什么要结对编程:
-
在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强。两人合作,还有相互激励的作用,工程师看到别人的思路和技术,得到实时的讲解,受到激励,从而努力提高自己的水平,提出更多的创意。
-
对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
-
-
不间断地复审:
-
开发中的复审包括:设计复审、代码复审、测试技术复审和文档复审。
-
在结对编程过程中,代码被不断的复审,可以避免牛仔式的编程,可以帮助团队成员建立集体拥有代码的意识。
-
-
-
-
任务2
-
符合要求的博客评论(评论要点包括:博文结构、博文内容、博文结构与PSP中“任务内容”列的关系、PSP中“计划共完成需要的时间”与“实际完成需要的时间”两列数据的差异化分析与原因探究,将以上评论内容发布到博客评论区。)
-
符合要求的代码核查表(克隆结对方项目源码到本地机器,阅读并测试运行代码,参照《现代软件工程—构建之法》4.4.3节核查表复审同伴项目代码并记录)
-
结对方项目仓库中的Fork、Clone、Push、Pull request、Merge pull request日志数据
-
-
任务3
-
需求分析陈述
-
遗传算法是具有"生成+检测"(generate-and-test)的迭代过程的搜索算法。基本过程如下:
-
1)编码初始化:设置进化代数计数器t=0,设置最大进化代数T,随机生成M个个体作为初始群体P(0)。
-
2)个体适应度计算:计算群体P(t)中各个个体的适应度。
-
3)选择运算:根据个体的适应度评估,将选择算子作用于群体。选择的目的是把优化的个体直接遗传到下一代或通过配对交叉产生新的个体再遗传到下一代。
-
4)交叉运算:将交叉算子作用于群体。遗传算法中起核心作用的就是交叉算子。
-
5)变异运算:将变异算子作用于群体。即是对群体中的个体串的某些基因座上的基因值作变动。群体P(t)经过选择、交叉、变异运算之后得到下一代群体P(t1)。
-
6)终止条件判断:若t=T,则以进化过程中所得到的具有最大适应度个体作为最优解输出,终止计算。
-
编码:需要将问题的解编码成字符串的形式才能使用遗传算法。最简单的一种编码方式是二进制编码,即将问题的解编码成二进制位数组的形式。
-
-
遗传算法有3个最基本的操作:选择,交叉,变异。
-
选择:选择一些染色体来产生下一代。一种常用的选择策略是 “比例选择”,也就是个体被选中的概率与其适应度函数值成正比。
假设群体的个体总数是M,那么那么一个体Xi被选中的概率为f(Xi)/( f(X1) + f(X2) + …….. + f(Xn) ) 。比例选择实现算法就是所谓的“轮盘赌算法”( Roulette Wheel Selection ) -
交叉:2条染色体交换部分基因,来构造下一代的2条新的染色体。
-
变异:在繁殖过程,新产生的染色体中的基因会以一定的概率出错,称为变异。变异发生的概率记为Pm 。
-
适应度函数 :用于评价某个染色体的适应度,用f(x)表示。有时需要区分染色体的适应度函数与问题的目标函数。适应度函数与目标函数是正相关的,可对目标函数作一些变形来得到适应度函数。
-
-
-
描述结对的过程,提供两人在讨论、细化和编程时的结对照片(非摆拍)。
-
提供此次结对作业的PSP。
-
PSP各个阶段 | 各阶段计划用时(min) | 各阶段实际用时(min) |
---|---|---|
计划 | 60 | 66 |
明确需求和其他因素,估计各个阶段所用时 | 60 | 66 |
开发 | 465 | |
需求分析 | 40 | 60 |
生成设计文档 | 20 | |
设计审核 | 20 | |
代码规范 | 15 | |
具体设计 | 25 | |
具体编码 | 290 | |
代码复审 | 40 | |
测试 | 15 | |
报告 | 130 | |
测试报告 | 70 | |
计算工作量 | 35 | |
事后总结,并总结过程改进计划 | 25 |
-
小结感受:两人合作真的能够带来1+1>2的效果吗?通过这次结对合作,请谈谈你的感受和体会。
- 在两人合作过程中,在某些程度上说,确实可以达到1+1>2的效果。两人首先交流各自的想法,再结合自己的想法,融合贯通,加深对项目的理解。在代码编写以及代码复审过程中,在一人编写后,另一人进行后期检查,将一些不必要出现的错误改正。在此次结对编程过程中,虽然我和小伙伴进行了需求分析,但是还是由于某些原因,而无法进展后续工作。所以,还是首先要提高自己的能力。