开发“你帮我助”软件的体会总结
这里从两个方面讨论自己开发软件的体会。第一部分会概括自己的初始计划、实际开发与计划之间发生了的不一致、会根据这些不一致进行反思、并会概括自己制定计划的体会。第二部分会讨论自己从哪些方面实现了面向对象方法学的概念,并会讨论自己用面向对象方法的体会。
1. 计划
学了一个学期的软件工程之后,本人的主要收获可以概括成一句话:开发一个软件应该是一个很严格的过程,需要先制定计划,然后严格按照此计划设计并实现软件。Boehm的软件工程基本原理的第一条毕竟是 “用分阶段的生命周期计划严格管理”。考虑到这一点,本人开发 “你帮我助” 软件之前对自己制定了计划,开发的过程中也尽量按照这个计划进行了工作。计划的小总结如下:
2小时:了解需求,建立对象模型
1小时:学习怎么做GUI(之前没有做过)
1小时:总体设计
10小时:编码和单元测试
1小时:综合测试
1小时:写代码注释
3小时:画用例图、顺序图、类图
1小时:写文档
1小时:发布在GitHub上,确认无误
总共:21个小时
上述计划是基于软件工程生命周期的八个阶段建立的,但根据情况做了很大的调整。
开发软件过程中记录了每个阶段的耗时:
阶段 | 耗时 | 预测 |
---|---|---|
了解需求,建立对象模型 | 2小时 | 2小时 |
学习怎么做GUI | 1小时 | 1小时 |
决定怎么保存物品与用户信息 | 2小时 | 不在计划中 |
其余设计 | 2小时 | 1小时 |
编码和单元测试 | 14小时 | 10小时 |
写代码注释 | 1:30小时 | 1小时 |
画用例图,类图 | 3小时 | 3小时,但预测包括顺序图 |
写文档 | 30分钟 | 1小时 |
综合测试 | 1小时 | 1小时 |
发布在GitHub上 | 30分钟 | 1小时 |
画顺序图 | 30分钟 | 计划中跟别的图一起画 |
确认无误 | 3小时 | 不在计划中 |
总共 | 31小时 | 21小时 |
总体设计最终分了两个阶段,第一个阶段是决定并安排怎么把物品信息与用户信息保存在程序之外,第二个阶段是其余设计(设计软件结构)。
把综合测试往后推了很多,因为其与写注释、画图等没有任何关系,且本人当时很累,决定了第二天(睡觉了以后)做测试更合理。
最后还花了一段时间确认软件运行时不出现任何问题,但此过程中发现了当不在文件夹里面包括Excel表格,程序由于命名方式不同而无法读入普通用户信息。这个问题本身其实很容易解决,但后面还是做了第二轮综合测试确认没有其他的被漏掉的问题,总共花了3个小时。
根据计划与实际情况之间的区别进行反思:
首先,本人低估了总体设计的时间。原因在于第一次开发小软件时只花了1个小时左右进行设计,并且这次的功能是上一次的功能的扩展,所以本人以为这次的设计也会比较快。只不过,很快就发现了这次软件远远比上一次复杂,所以设计阶段也长很多。后面一定会注意给设计阶段分配更多的时间。
其次,综合测试做得不够严格,漏掉了一个比较容易被发现的问题。后面应该更精确地制定测试计划,并按照渐增式测试方法进行测试(这次在综合测试中直接把所有已测好的模块一起测试了,没有做到渐增式测试,下次可以改进此过程)。
体会:
本人这学期学到了的软件工程知识很多跟软件的生命周期及其不同阶段有关。我们上课时大概花了半个学期的时间讨论每个阶段的任务、方法、工具等。就因为有了这些知识,这次开发软件前能够制定比较合理的计划。但是,因为缺乏了实践经验,所以开发系统过程中还是出现了很多与计划的不一致。通过这次的软件开发,自己觉得积累了很多经验,下次开发软件会制定与实际情况更结合的计划,并会更严格地按照计划进行工作。
2. 面向对象
这学期的第二最大收获是:应该尽可能用面向对象的方法。本人设计并实现 “你帮我助” 软件的过程中也尽力用到了面向对象的原理与方法。下面提到一些例子:
- 做分析的时候自己做了的第一步是建立对象模型。
- 软件设计的过程中按照面向对象设计的准则进行了设计,觉得自己比较好地实现了模块化、强内聚及弱耦合,但没有很好地实现可重用。
- 本人设计过程中用到了 “任务管理子系统” 和 “数据管理子系统” 的概念。
体会:
- 在分析阶段画对象模型一开始很难,因为之前从来没有画过对象模型。当时因为每次对自己画了的模型不满意而重新开始了三遍。只不过,两个小时之后做出来了一个让我比较满意的对象模型,并同时感觉自己从面向对象的角度进行分析的能力在这两个小时之内提高了很多。当时画的对象模型后面在设计阶段用了很多,并且最后画类图的时候也是基于对象模型画的。
- 设计软件时本人的目的之一就是做到模块化、强内聚和弱耦合。最终在软件中很好地实现了这些概念。自己也发现因为用到了这些概念,虽然在设计阶段比较难一些,但是编码的时候很轻松。原因在于,编码时可以一个一个写各个模块的代码(由于模块化),每次写一个模块的时候可以完全集中于实现其功能,很少需要考虑其他模块的影响(由于弱耦合),并且,每个模块的功能也很好理解(由于强内聚),所以程序很容易实现。
- 数据管理子系统模块本人在第一次开发 “你帮我助” 小软件时已经用到了,这次跟上次的区别仅在于:上次只需读入并存储物品信息,而这次不仅有物品信息,也有用户信息。但概念是一致的。
任务管理子系统上次开发小软件没有用到,这次特别注意了在程序中加两个control函数(一个在main.py, 一个在administrator.py),以便管理整个程序的流程。本人的体会是,这样设计的程序清楚很多。几乎所有的函数都是被控制函数调用的,且每次一个功能实现完毕了以后,也就返回到这个控制函数。总体感觉通过加了任务管理子系统整个程序就变了更 “简单易读”。
结语:
由于开发软件的过程中尽可能地用到了这学期学到了的软件工程知识(主要包括面向对象方法和软件的生命周期计划的制定),所以才开发出来了一个比较成功的软件。
开发软件时出现了的意外基本上都是因为经验的缺乏而导致的,但通过这次工作就积累了很多实践经验,现在感觉自己不仅理解软件工程的知识,但也能够在项目当中使用这些知识。