一、具体情况概要
结对编程成员:1759221周文豪、1731519张杨
结对编程项目:小学老师要每周给同学出300道四则运算练习题
项目实现所用编程语言:Python3
项目预计完成时间:2-3小时
项目实际完成时间:3小时(编程)+1小时(问题分析+实验报告等)
二、结对编程概要
定义:结对编程(Pair Programming)是软件开发过程中所使用的一种技术,两名程序开发人员共享同一台工作站。其中一个扮演驾驶者(Driver)的角色,进行代码编写,另一个扮演观察员(Observer)或导航员(Navigator)的角色,对代码进行评测。
现状:结对编程的概念已经存在很长一段时间,已经有许多公司认同这种编程方式,但也有许多公司表示他们不考虑采用。原因是结对编程需要花费的时间可能比个人编程更长,但产生的 bug 比个人编程少;它需要公司付出多一倍的人力,但编程的效率会比个人编程高。所以这是一个比较有争议的编程方式,不同公司的需求不同,对结对编程的看法就不一样。
正因为结对编程有其自身优缺点鲜明的特点才会有争议,因此在结对编程开始之前我和张杨先了解其优缺点:
优点:
1、互相鼓励,不容易心态爆炸
2、互相监督,不易偷懒
3、互相学习编程技巧,能力互补
4、多双眼睛,少点 bug 等等...
缺点:
1、与合不来的人一起编程容易发生争执
2、一山不容二虎,开发者之间可能就某一问题发生分歧,造成不必要的内耗
3、开发人员可能会在工作时交谈一些与工作无关的事,分散注意力,造成效率低下 等等...
在了解结对编程优缺点以后我和张杨对结对编程有了更充分的认识,在接下来的编程中会尽量有意识的避免发生影响效率的事,即使出现分歧也会迅速探讨并得出结论继续编程。
三、源码
import random import os os.chdir("/home/hao/Documents") f=open('arithmetic.txt','a') x=0 z='=' var=1 while var == 1: a = random.randint(1, 100) b = random.randint(1, 100) c = random.randint(1, 100) d = random.choice('+-*/') e = random.choice('+-*/') if d == '+' and e == '+': if a + b + c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '+' and e == '-': if a + b - c <= 100 and a + b - c >= 0: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '+' and e == '*': if a + b * c <= 100: f.write(str(a)+d+str(b)+e+str(c)+z+'\n') x += 1 elif d == '+' and e == '/': if b % c == 0 and a + b / c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '-' and e == '+': if a - b + c <= 100 and a - b + c >= 0: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '-' and e == '-': if a - b - c <= 100 and a - b - c >= 0: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '-' and e == '*': if a - b * c <= 100 and a - b * c >= 0: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '-' and e == '/': if b % c == 0 and a - b / c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '*' and e == '+': if a * b + c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '*' and e == '-': if a * b - c <= 100 and a * b - c >= 0: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '*' and e == '*': if a * b * c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '*' and e == '/': if (b % c == 0 or a % c == 0) and a * b / c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '/' and e == '+': if a % b == 0 and a / b + c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '/' and e == '-': if a % b == 0 and a / b - c <= 100 and a / b - c >= 0: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '/' and e == '*': if (a % b == 0 or (a * c) % b == 0) and a / b * c <= 100: f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x += 1 elif d == '/' and e == '/': if b!=c and b!=1 and c!=1: if (a%b==0 and (a/b)%c==0) or (a%c==0 and (a/c)%b==0): f.write(str(a) + d + str(b) + e + str(c) + z + '\n') x+=1 if x == 300: break f.write('\n') f.close()
四、运行结果
(1)程序编译成功截图
(2)在txt文件里的输出片段截图
五、遇到的问题
已解决问题和细节:
1、在开始的时候,我们在百度上搜索出来等号并不是运算符,出于严谨考虑,最后我们决定出的四则运算题是有三个数字和两个运算符(加减乘除)的混合运算题
2、通过多个随机函数来取多个不同的随机数避免了题目的重复
3、可定制:输出的题目都保存在了txt文件里,可以直接打印,且输出每三百题之间留有间隔
4、因为服务对象是小学生,所以我们确保出的每道题目中的除法都没有余数,同时也意味着不支持分数
5、加减时的最终结果一定大于等于0且小于等于100(中间结果可能大于100或小于0)
未解决问题和细节:
1、通过反复测试发现随机出的题中,有些种类混合运算题如连乘题(a*b*c)出现的概率过于低(因为结果要在100以内),暂时还无法平衡混合运算题中各种题目出现的概率
2、由于水平有限,我们并不能在题目里加上括号
3、可拓展性仍需商榷
六、思考及反思
编程完以后我和张杨认真思考了一下我们写的程序得出以下结论
(1)优点是:经过编程时的反复测试得出严谨性较高的判断条件,基本保证不会出现错题
(2)缺点是:判断条件太多显得整段程序比较low,可读性不高,计算量偏大,写完以后发现可以通过switch语句优化程序
(3)可扩展性:以后我们可以写一个客户端,让学生可以在客户端上做题并判断对错,且每个人做的题目都不会重复
七、心得体会
通过这次作业,切实体验到了结对编程的过程,我们发现,在我们得出设计思路,并将它们初次转化成代码后,其实只完成了一部分。由于个人的疏忽,输入的错误,以及设计思路的偏差,往往会让我们的程序出现bug,修改bug会消耗我们大量的时间。而结对编程的好处就在于此,由于身边有个领航员角色的存在,在编写代码时,一旦出现输入错误,就会有人及时的提醒。不仅如此,在设计代码时,有个同伴可以一起讨论,融合两个人不同的见解和观点,我们往往可以得出更加准确且更加高效的设计思路。就我们本次实验的编程而言,有了领航员的存在,我们在完成代码后,几乎没有花什么时间在修改bug上,这提高了我们编程的效率,而且我们二人一起讨论出来的编程思路,也使得我们的代码功能更全面,更严谨。所以我们认为,结对编程的优势主要就在于设计思路的共享,还有及时修改自己在编程时犯下的小错误,这些错误在另一个人眼中会十分明显。而且两人轮流编程,不会太过疲惫,结对编程可以很大程度上提高编程效率,因此十分适合敏捷开发。如果未来我们从事软件开发的工作,我们会十分乐于进行结对编程,因为这会极大的改善我们的编程体验。