实 训 报 告
课程名称: |
软件工程 |
实训项目: |
余力的总结报告 |
实训时间: |
2019.3.1--2019.6.6 |
实训班级: |
16信计 |
实训人员: |
余力 |
总 份 数: |
1份 |
指导教师: |
吴世枫 |
数学与系统科学 学院 工业中心203 实训室
2019 年 6 月 11 日
广东技术师范大学实验报告
学院: |
数学与系统科学学院 |
专业: |
信息与计算科学 |
班级: |
16信计 |
成绩: |
|
|||||||
姓名: |
余力 |
学号: |
2016034643040 |
组别: |
|
组员: |
林志达、陈烨权、戚景晓、李震明、卢凯欣 |
|||||||
实验地点: |
工业中心203 |
实验日期: |
2019.3.1—2019.6.6 |
指导教师签名: |
吴世枫 |
|||||||||
实训 (1) 项目名称: 简单算24点微信小游戏
软件工程个人总结报告
摘要
这次的软件工程项目是一次团队合作的体现,在创作工程中,我们互相帮助,积极讨论,最终开发出了这个项目。这次合作有利于加深同学间的友谊,有利于为以后的项目开发提供帮助,为实习或工作打下基础,是一次很好的锻炼机会。加上前期做过的个人作业,以及python练习,使我在这次课程中收获良多。
关键词:软件工程;团队合作;个人总结
目录
目录. 7
一、回顾一个学期的学习. 9
1.1 回顾. 9
1.2 课程总结. 9
1.2.1 代码数. 9
1.2.2 时间汇总. 9
1.2.3印象深刻的作业. 10
1.2.4周平均时间. 10
1.2.5学习使用新软件. 10
1.2.6学习使用新工具. 10
1.2.7学习使用新语言新平台. 10
1.2.8学习使用新方法. 11
1.2.9其他方面的提升. 11
二、团队项目实践的经验总结与分析. 11
三、对下一届实践的建议和告知. 11
3.1 对下一届实践的建议和告知. 11
3.2 中途是否换队员. 12
四、软件工程的发展阶段. 12
4.1 萌芽阶段. 12
4.2 磨合阶段. 12
4.3 规范阶段. 12
4.4 创造阶段. 12
五、如何证明自己学会了软件工程?. 13
六、图文创意. 16
七、附录. 18
7.1 第二次作业——Python基础和软件工程. 18
7.2 个人PSP作业1. 18
7.3 个人PSP (四则运算)升级作业. 24
参考文献. 33
致谢. 34
这个学期是我们第一次团队做一个项目,在此之前都是一个人大包大揽,所以这一次对我们是个不小的挑战。
而经过一个学期的学习,我在进行后台开发和代码规范这块有了不小的进步,通过团队合作,使得原本很难完成的目标变得轻松。而对于黑盒测试,代码完善这块还是没有达到预期。由于小组的分工合作不同,所以接触到测试的部分很少,没有得到锻炼的机会。
分工不同,负责的部分也不一样,加上之前的个人作业,我写了大约800至1000行代码。
作业 |
实际投入(天) |
时间(min) |
第一次作业--软件工程 |
2 |
360 |
第二次作业—Python基础 |
1 |
60 |
第三次作业--团队第一次展示 |
5 |
1000 |
第四次作业--Python基础测试 |
3 |
600 |
第五次作业—效能分析 |
4 |
1000 |
个人PSP作业1 |
5 |
1200 |
个人PSP作业2(升级) |
3 |
600 |
第六次作业--结对项目需求分析 |
5 |
1200 |
第七次作业—选题报告 |
2 |
600 |
第七次作业—需求规格说明书 |
3 |
800 |
确定题目及分工 |
1 |
300 |
第八次作业—系统设计任务分配 |
2 |
500 |
第九次作业—测试报告用户使用 |
3 |
800 |
个人总结 |
3 |
400 |
团队总结 |
5 |
1000 |
TOTAL |
47 |
10420 |
大概的作业分布如上,具体时间基本忘记了,因为有一些过去了较长时间,后期的也不太好计算了。
体系结构吧,我们首先要熟悉JavaScript,要准备好每一个选项及界面要写些什么,才能写代码规范,写完之后面对大量代码,我们要准备注释,把每个函数和变量的功能都要写清楚,才能让小组其他人看明白,这是耗时最长也是最难的一项,印象深刻。
花了多长记不得了,有时上别的课都在想该怎么做,甚至睡觉都在想,一天可能得有7-8个小时,尤其是到了后期,大家紧迫起来饭都不想吃,就想赶紧完成任务
原型设计时使用的Axure,用于编写Python的Anaconda,Spider。
微信小程序开发工具。
Javascript,wxss,Json,wxml,python。
学会了一些后台开发的方法,学会了一些关于代码规范的方法。
团队凝聚力提升了,对软件工程有了一定的了解。为以后的项目创作打下了基础。
因为个人作业是刚开始上课时做的,所以难免有些生疏,遇到不会的地方也不知道想谁请教,因为每个人都有自己的思路,不容易看懂别人的,所以我就上网查阅资料,对比了下已有的版本,最后得出了成果。到了结对项目时就轻松了,毕竟有队友一起讨论问题,不会那么吃力。两个人分工合作,也开始逐渐熟悉了这门课程。
随后就是团队项目,六个人在一组,最大的问题就是沟通不便,由于我们几个也不太活跃,女生那边我们也没怎么过问,导致团队任务进展缓慢,等到大家一起讨论时,又各有个的意见,统一起来也很难,我们只能折中考虑,比如一开始大家本来要做账本,几乎就达成一致了,到最后时刻还是改成了做游戏,而在分工环节出现几个人争一个任务的情况,不过还好妥协了,最终还是把它完成了。
如果是刚上大一,学这门专业或类似的,如果有兴趣,我建议还是认真学,大一就开始接触上手,免得到了大三都没怎么打过代码的情况下就开始做大项目,那时就会很吃力,我们专业就是如此,认真学的人少,真正打过几千行代码的人更少,所以尽量早学,早熟练,这对你将来的实习及毕业论文都有帮助。
确实到了大学时刻不能放松,要是真想高中老师说的那样,等到了毕业就会碌碌无为,工作都找不到,只会呆在宿舍对着电脑,屁股都不动一下。老师说软件工程主要的不是代码,而是设计,这也有道理,因为这也是我们遇到的问题,毕竟学计算机的设计这方面确实会差一些,我们组的设计这块都是由女生完成的,她们确实有想法,做出的界面真的很棒,而我们几个男生看到要写什么需求分析就头疼,但这却是最基本的。没有这些报告,用户就无法得知你的项目是干嘛的,怎么用,你的项目得不到用户的亲睐就会被淘汰,所以这些前期准备工作看似繁琐,实则最为关键,所以新生一定要重视这些步骤,不要到后面什么都没有,就会失去兴趣,项目就做不下去了。
至于换队员问题,我想说其实大家都是一样的,都不想做!除非你是那种非常想要carry的,想要队员都能起到作用的,这种如果遇到抱大腿的队员就建议你换了吧,或者自己独自离开;但现实是大多数人都想要抱大腿,所以会出现一个组全是抱大腿心态组成的队员,这种就建议你们互相帮助,没有必要换队员,做好自己该做的,不会就组内之间讨论,可能最后成果差强人意,但至少任务完成了嘛。
再一点,你要换队员可能别的组并没有要换的,因为并非每个组都会出现需要换队员这种情况,所以出现分歧还是要多沟通,尽量解决,换队员可能会导致双方关系闹得很僵,也不太利于今后的发展;且新人来还要熟悉任务,训练默契,要花费较长时间,不利于任务进度,所以个人建议不要轻易换队员。
每个团队刚开始都处于这个阶段,我们组在这个阶段停留了相当长的时间,我们一开始就很少交流,女生那边还好,男生这边要做什么很久都没定。幸好组长站了出来,他组织了一次正式的讨论,确定了我们组要做什么,以及最初的分工。因为此时还有一些个人作业,所以刚开始的任务还算轻松。
在这个阶段就出现了很多想法,大家渐渐融入这个团队后开始有了自己的想法。本来一开始定的做记账软件,换成了24点游戏,做着做着发现微信小程序那些东西我们都不了解,要学起来很麻烦,一度想换回做记账…不过还是妥协了。做的时候也有很多意见,归根结底就是老师的要求不清楚,每个人都只记住了其中几点,沟通起来很困难。就在这种跌跌撞撞的情况下我们度过了这个阶段。
在这个阶段女生的力量功不可没,他们确实比我们男生积极,做了很多版本,发现了许多问题,发出来让我们一起讨论,我们也渐渐接受了这种模式,团队之间虽然交流还是很少,但每个人都认真做着自己的任务,偶尔有一些问题需要集体讨论外,每个人都可以独立完成手头的工作了,这是突飞猛进的进步。
我感觉我们团队还没有完全到达这个阶段,毕竟之前存在的很多问题都还没有解决,比如沟通,后期的分工合作等等,每个人都是已完成任务为标准去做项目,而不是全身心投入在里面,所以想要完全到达创造阶段还是有些困难的。我们小组在不断摸索,寻求解决任务最好的方法。我们到了目前阶段,虽然还不完美,但是以当前完成的任务来看,算是很满意了。
我们目前已经完成了一个程序,是一个24点微信小游戏,并已成功上线,测试过的效果还不错,但还没有用户体验过,因为我们也没做什么宣传。大体上的功能都可以实现,界面也比较美观。
我们的项目是经过了需求分析,效能分析,规格说明,测试报告等一系列铺垫工作而完成的。虽说到后期有一些设计理念变化,与之前预计的需求分析有所出入,但总体的框架结构并没有太大变化,具体进度可以在易知大学的项目里查看。
我们的项目代码可由微信小程序开发工具进行查看,必要时我们可以对其进行修改,目前来说它大致分为三部分:计时区、练习区、排行榜,每个部分都对应了几个方面的代码。所有代码均已上传到github上,这是我们团队最重要的成果。
大标题:
背景图:
一些操作图标:
https://www.cnblogs.com/HardenMVP/p/11003836.html
我对这门课的理解就是进行团队合作,运用所学过的语言,各自分工,创造出一个项目。
我想要学会一些做软件的技巧,不要拿到一个项目不知道从何下手,还想学会如何用python编写代码,毕竟之前没有接触过这门语言。因为做软件是一个大工程,可能一个团队一个学期都弄不完,所以我是真心想学到一些技巧的。Python也很好用,希望我能掌握好它。
学完这门课之后,我希望我能对软件开发感兴趣,想知道一个好的软件是经过什么样的步骤而面世的,我能在开发过程中做些什么。目前我擅长的部分还不清楚,毕竟以前没有做过
https://www.cnblogs.com/HardenMVP/p/10574484.html
1、GitHub项目地址:https://github.com/HardenMVB/3.14
2、PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 |
90 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
90 |
Development |
开发 |
1720 |
2070 |
· Analysis |
· 需求分析 (包括学习新技术) |
200 |
250 |
· Design Spec |
· 生成设计文档 |
50 |
60 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
10 |
10 |
· Design |
· 具体设计 |
30 |
40 |
· Coding |
· 具体编码 |
1300 |
1600 |
· Code Review |
· 代码复审 |
50 |
30 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
60 |
60 |
Reporting |
报告 |
100 |
100 |
· Test Report |
· 测试报告 |
60 |
60 |
· Size Measurement |
· 计算工作量 |
10 |
10 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
30 |
合计 |
|
1880 |
2260 |
3、解题思路
拿到题目后,先想它能实现哪些功能,再想代码能分成几个部分实现,分层次处理。本题中基础功能就是整数的四则运算,非负数,接着就是加入真分数的部分。
这两个功能完成后就可以考虑一些其他功能,比如如果出现假分数,如何转化成真分数,如何约分,以及判断题目有无重复等等。
4、设计实现
先建立命令控制模块,可以控制输入的题目数量以及数值范围。再创建一个函数,用来生成随机数与运算符(+ , - , × , ÷ ),再设计一个函数用来将假分数转换为真分数。接着生成表达式,进而生成题目和对应的答案,以及查找有无重复。
最后将题目及答案写入文件中,结果会在文件中显示出来。
5、代码说明
1.命令控制模块
def get_Parameter():#命令行控制模块
parser = argparse.ArgumentParser()
parser.add_argument(‘-n‘, help=‘设定题目数量‘,type=int)
parser.add_argument(‘-r‘, help=‘设定数值范围‘,type=int)
return parser.parse_args()
2.建立一个类用以生成随机数与运算符
class com(object):
def __init__(self, r):#初始化
self.r=r
def get_Arithmeticl(self):#获得随机数字与符号
symbol=[]
numerical=[]
syb=0
n=1
m=0
i=random.randint(1, 3)
for x in range(i):
sy=random.choice([‘+‘,‘-‘,‘ב,‘÷‘])
if sy==‘+‘or sy==‘-‘:
syb +=10**(i-x-1)
else :
syb += 2 * (10 ** (i - x - 1))
symbol.append(sy)
if self.r < 10:
n = int(10 / self.r)
if n==1:
while m <= i:
numerical.append(Fraction(random.randint(1, self.r), random.randint(1, self.r)))
m+=1
else:
while m <= i:
nu = Fraction(random.randint(1, self.r * n), random.randint(1, self.r * n))
if nu<=self.r:
numerical.append(nu)
m += 1
return symbol,syb,numerical,i
3.识别运算符和分数的转换
def get_Calculate(a,b,c):#四则运算
if c==‘+‘:
results=a+b
elif c==‘-‘:
results=a-b
elif c==‘ב:
results=a*b
else:results=a/b
return results
def get_Conversion(fraction):#假分数转化真分数
if fraction.numerator%fraction.denominator==0:
return ‘%d‘%(fraction.numerator/fraction.denominator)
elif fraction.numerator>fraction.denominator:
a=int(fraction.numerator/fraction.denominator)
b, c = fraction.numerator - a * fraction.denominator, fraction.denominator
return ‘%d%s%d%s%d‘ % (a,‘’‘,b,‘/‘,c)
else:
b, c = fraction.numerator, fraction.denominator
return ‘%d%s%d‘ % (b,‘/‘,c)
4.生成算式列表和查重
def get_Formula(n,r):#生成题目和答案列表
Exercises,Answers,Exercises1,Exercises2=[],[],[],[]
x=1
while x<n+1:
symbol, syb, numerical,i = com(r).get_Arithmeticl()
results = numerical[0]
judge = True
for y in range(i):
calculate=get_Calculate(results,numerical[y+1],symbol[y])
if calculate>=0:#判断算式是否合法
answer=calculate
else:
judge=False
break
if judge:#查重
try:
num=Answers.index(answer)#第一个重复答案的索引
if operator.eq(Exercises1[num],symbol) and operator.eq(Exercises2[num],numerical):
pass
except ValueError as e:#可以写入
Answers.append(answer)
Exercises1.append(symbol)
Exercises2.append(numerical)
Exercises.append(‘%d. %s‘%(x,set_Formula(symbol,numerical,syb)))
x+=1
else:pass
return Exercises,Answers
5.写入文件
def text_save(filename, data):#filename为写入文件的路径,data为要写入数据列表.
file = open(filename,‘a‘)
file.seek(0)
file.truncate() # 清空文件
for x in data:
x=‘%s\n‘%(x)
file.write(x)
file.close()
print(‘%s文件保存成功‘%filename)
6.main函数
def main():
args = get_Parameter()
if args.n:
n = args.n
if args.r:
r = args.r
Exercises, Answers = get_Formula(n, r)
for x in range(n):
Answers[x] = ‘%d. %s‘ % (x + 1, get_Conversion(Answers[x]))
print(‘本次共生成题目%d道\n题目数值范围为0-%d‘ % (n, r))
text_save(‘Exercises.txt‘, Exercises)
text_save(‘Answers.txt‘, Answers)
6、测试运行
7、效能分析
8、收获
在这次实践中,我体会到了软件工程的不易。想要一个人真正做好一个项目是要花费大量时间的,想要一周完美的写好这个项目有点困难,还是有很多漏洞没有处理;做出的程序也不完整,有很多功能没有实现。
这也体现出了团队的重要性,一方面会有人监督,帮你找出错误,另一方面分工合作,花费的时间也会减少。不过我还是从这次项目中学到了很多技巧,希望下一次的项目可以完成的更好。
https://www.cnblogs.com/HardenMVP/p/10615157.html
1、Github项目地址:https://github.com/HardenMVB/3.28
2、PSP
PSP2.1 |
Personal Software Process Stages |
预估耗时(分钟) |
实际耗时(分钟) |
Planning |
计划 |
60 |
90 |
· Estimate |
· 估计这个任务需要多少时间 |
60 |
90 |
Development |
开发 |
1650 |
2050 |
· Analysis |
· 需求分析 (包括学习新技术) |
200 |
300 |
· Design Spec |
· 生成设计文档 |
50 |
60 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
30 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
30 |
· Design |
· 具体设计 |
60 |
50 |
· Coding |
· 具体编码 |
1200 |
1500 |
· Code Review |
· 代码复审 |
60 |
50 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
40 |
30 |
Reporting |
报告 |
90 |
60 |
· Test Report |
· 测试报告 |
50 |
10 |
· Size Measurement |
· 计算工作量 |
20 |
20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
20 |
30 |
合计 |
|
1800 |
2200 |
3、解题思路
拿到题目后,先想它能实现哪些功能,再想代码能分成几个部分实现,分层次处理。本题中基础功能就是整数的四则运算,非负数,接着就是加入真分数的部分。
这两个功能完成后就可以考虑一些其他功能,比如如果出现假分数,如何转化成真分数,如何约分,以及判断题目有无重复等等。
4、设计实现
先建立命令控制模块,可以控制输入的题目数量以及数值范围。再创建一个函数,用来生成随机数与运算符(+ , - , × , ÷ ),再设计一个函数用来将假分数转换为真分数。接着生成表达式,进而生成题目和对应的答案,以及查找有无重复。
最后将题目及答案写入文件中,结果会在文件中显示出来。
5、代码说明
1、命令行控制模块
def get_Parameter():#命令行控制模块
parser = argparse.ArgumentParser()
parser.add_argument(‘-n‘, help=‘设定题目数量‘,type=int)
parser.add_argument(‘-r‘, help=‘设定数值范围‘,type=int)
return parser.parse_args()
2、生成随机数和运算符
def get_num_sym(i,r):#获取数值列表和符号列表
nlist=[] #数值列表
slist=[] #符号列表
kh=0 #判断怎么加括号
jian=0 #判断是否是减数运算
for m in range(i+1): #根据i的值遍历输出数值列表
nlist.append(Fraction(random.randint(1, r), random.randint(1, r)))
for x in range(i):
sy=random.choice([‘+‘,‘-‘,‘ב,‘÷‘])
if sy==‘+‘or sy==‘-‘
kh +=10**(i-x-1)
else :
kh += 2 * (10 ** (i - x - 1))
slist.append(sy)
if sy==‘-‘:
l=1
return nlist,slist,kh,i,jian
3、分数转换及运算
def calculate(a,b,s):#计算单元,a,b是数,s是符号
ans=0
if s==‘+‘: #加法运算
ans=a+b
elif s==‘-‘: #减法运算
a,b=max(a,b),min(a,b) #防止结果为负数
ans=a-b
elif s==‘ב: #乘法运算
ans=a*b
else:ans=a/b #除法运算
return ans
4、生成题目及答案
def gett(n,r): #用于生成题目和答案列表
E,A,E1,E2=[],[],[],[]
global j,k
x=1
while x<n+1: #循环生成题目和答案列表
i=random.randint(1, 3) #随机获取符号数目
num,slist,kh,i,jian=get_num_sym(i,r)
num1=num
legal = True
if jian==1: #用于防止减法运算出现负数
if num[0]<num[1]:
num1[0],num1[1]=num[1],num[0]
if i>=2 and calculate(num[0],num[1],slist[0])<num[2]:
num1[0],num1[1],num1[2]=num[2],num[0],num[1]
j=1
if i>=3 and calculate(calculate(num[0],num[1],slist[0]),num[2],slist[1])<num[3]:
num1[0],num1[1],num1[2],num1[3]=num[3],num[0],num[1],num[2]
k=1
ans=num1[0]
for y in range(i):
cal=calculate(ans,num[y+1],slist[y])
if cal>=0:
ans=cal
else:
legal=False
break
if legal: #判断算式是否重复
try:
num=A.index(ans) #第一个答案的索引
except ValueError as e: #可以写入
A.append(ans)
E1.append(slist)
E2.append(num1)
E.append(‘%d. %s‘%(x,writet(slist,num1,kh)))
x+=1
else:pass
return E,A
5、写入文件
def savet(fname, d):#fname为写入文件的路径,d为要写入的数据列表
file = open(fname,‘a‘)
file.seek(0)
file.truncate() #清空
for i in range(len(d)):#循环写入文件fname
s = str(d[i]).replace(‘[‘,‘‘).replace(‘]‘,‘‘)
s = s.replace("‘",‘‘).replace(‘,‘,‘‘) +‘\n‘
file.write(s)
file.close()
print(‘%s文件已保存‘%fname)
6、main函数
def main():#主函数
args = get_Parameter()
if args.n:
n=args.n
print(‘共生成%d道题目‘%n)
if args.r:
r=args.r
print(‘均为%d以内的四则运算‘%r)
E, A=gett(n,r)
for x in range(n):#循环生成答案列表
A[x]=‘%d. %s‘%(x+1,fens(A[x]))
savet(‘Exercises.txt‘,E)
savet(‘Answers.txt‘,A)
end = time.clock()
print(‘运行时间: %s ‘%(end-start))
if __name__ == ‘__main__‘:
main()
6、测试运行
7、效能分析
8、改进
程序一开始出现多元式子时,只计算第一个和最后一个的结果,于是我改进了程序,使得能计算出每个数的值。
此程序中我没有使用循环将出现负数结果的式子删除,而是简单的把此式子的被减数与减数交换,使之计算出正值。
9、收获
在这次实践中,我体会到了软件工程的不易。想要一个人真正做好一个项目是要花费大量时间的,想要一周完美的写好这个项目有点困难,还是有很多漏洞没有处理;做出的程序也不完整,有很多功能没有实现。
这也体现出了团队的重要性,一方面会有人监督,帮你找出错误,另一方面分工合作,花费的时间也会减少。不过我还是从这次项目中学到了很多技巧,希望下一次的项目可以完成的更好。
邹欣.构建之法:现代软件工程(第三版)[M].北京:人民邮电出版社,2017:384-392
小组成员:陈烨权,林志达,卢凯欣,戚景晓,李震明
指导老师:吴世枫
原文:https://www.cnblogs.com/HardenMVP/p/11018737.html