一、学期初,实验一中的任务4,大家拟定了5个准备从课程学习中找到答案的问题,通过一个学期的学习,相信大家已经有了答案,请根据自己的学习实践回答自己当初提的问题,并提出一个新的问题。
问题一:通读该书目录包括个人技术流程团队和流程、敏捷流程、软件设计与实现、软件测试等章节,提出软件开发的基本流程是什么,如何快速熟悉并理解构建软件工程开发体系,我上网查阅了软件开发的基本流程:问题定义——>可行性分析——>需求分析——>概要设计——>总体设计等流程。但是没有亲身实践,还是无法理解这些流程的可行性,这些概念仍然是比较抽象,我希望通过这一学期的学习对软件工程的开发流程有着总体上的把握。
当初提出这个问题,现在觉得没有那么抽象了,通过软件工程的每次作业理解了这些流程,并且通过实践使用了各个流程所需要的工具,并在每个阶段完成后产生了相对应的文档。
问题二:我读了《构建之法》P10页佛瑞德·布鲁克斯提到的四个特性复杂性、不可见性、易变性和服从性以及由瓦茨拉夫·拉里奇提出的非连续性,这些特性是由软件本质所决定,软件还有其他特性,但是这非本质、临时的特性并不能决定软件工程的本质问题,那么问题来了,什么是软件工程的本质问题,通过查阅网上的资料找到软件工程的本质内容是:1、软件工程关注于大型程序的构造;2、软件工程的中心课题是控制复杂性;——许多软件的复杂性主要不是由问题的内在复杂性造成的,而是由必须处理的大量细节造成的。3、软件经常化;4、开发软件的效率非常重要;5、和谐地合作是开发软件的关键;6、软件必须有效地支持它的用户;7、在软件工程领域中是由一种文化背景的人替具有另一种文化背景的人创造产品。从这几个方面上来看,软件工程的本质并不是特别通俗易懂。所以想深入理解软件工程的本质问题,并尝试找到解决方法。
现在看来,这个问题通过查阅资料发现软件工程的本质问题也可以理解了,尤其是4、5、6条体会更加深刻。
问题三:我读了《构建之法》P52页,作者有提到软件的模块之间存在存在各种复杂的依赖关系,软件的不可见性和易变性,使得软件之间的依赖关系很难定义清楚,导致软件不易得到及时的维护和修复。我查了有关软件之间的依赖关系的定义:有两个元素A、B,如果元素A的变化会引起元素B的变化,则称元素B依赖(Dependency)于元素A。在类中,依赖关系有多种表现形式,如:一个类向另一个类发消息;一个类是另一个类的成员;一个类是另一个类的某个操作参数,等等。这些是在阐述依赖关系,但是软件之间的依赖关系有哪些?如何合理解决依赖关系带来的问题也是一个难点,尤其是找到那个平衡点,避免出现书中提到的对依赖关系的两种极端态度。
这个问题对应于课本上的面向对象建模部分,对于找到平衡点需要不断的实战经验,并不是轻而易举地能够实现这个平衡点。
问题四:我看了第十三章的内容,该章节讲述了各种测试方法,通过网上查阅发现测试方法还有好多,比如书中未提到的逆向测试、接口测试等,网上可以看到黑白盒测试的优缺点,在通读的过程中体会到每种方法的优缺点,但是我想知道这些方法的适用范围以及有没有使用的先后顺序,以便更加顺利地完成测试工作。
这个问题是对应于课本软件测试部分,这两个方法的适用范围是不一样的,黑盒测试与白盒测试是互补的测试方法,在编码过程中,首先使用白盒测试,其次使用黑盒测试。白盒测试在测试的早期阶段进行,黑盒测试主要用在测试的后期。
问题五:我读了《构建之法》P316页,文中有提到软件测试的概念是指运用一定的流程和工具,验证软件能实现预先设计的功能和特性,工作的流程和结果通常是可量化的,例如软件效能的参数,我觉得这个概念是指软件性能以及效率,上网查阅软件效能的含义,有软件系统效能的评估,评估具有五大要素:评估主体、评估对象、评估目标、评估手段(准则、方法、工具)、评估实施,但是还是觉得这样理解欠考虑,所以希望通过学习了解软件效能的具体含义以及软件效能的参数是什么?最后,我读了第五章团队和流程与第十六章IT行业的创新,我想能否将创新尝试着带入今后的团队合作中去,如何有效地实现团队管理和有效地实现团队的创新,希望自己可以在今后的团队合作中摸索出经验。
通过实际的项目实践以及最后的项目评审体会到了团队的重要性,团队之间的合作必不可少,而且出现矛盾如何解决也是很关键的。
新的问题:本次团队项目是以快速原型方法展开的,但是软件工程方法有很多,如何系统掌握软件工程学习方法、学习思维?做到这些还需要做哪些工作以及项目实践?
二、课程的实践总结和自身的提升:
1、统计你在软工课程实践中,完成了多少行的代码;
完成了大约五千多行代码。
2、软工实践的各次作业分别花了多少时间?累计花了多少个小时在软工实践上?平均每周花多少个小时?(做一个列表)
软工作业 |
花费时间 |
平均每周花费时间 |
实验一 软件工程准备 |
10 |
7.25 |
实验二 软件工程个人项目 |
8 |
7.25 |
实验三 软件工程结对项目 |
8 |
7.25 |
实验四 基于原型的软件需求获取 |
10 |
7.25 |
实验五 软件研发团队组建 |
5 |
7.25 |
实验六 团队项目评审与团队项目选题报告 |
6 |
7.25 |
实验七 团队作业3—团队项目的原型设计与开发 |
8 |
7.25 |
实验八 团队作业4—基于原型的团队项目需求调研与分析 |
10 |
7.25 |
实验九 团队作业5—团队项目需求改进与系统设计 |
9 |
7.25 |
实验十 团队作业6—团队项目系统设计改进与详细设计 |
10 |
7.25 |
实验十一 团队作业7—团队项目设计完善&编码测试 |
8 |
7.25 |
实验十二 实验十二 团队作业8—团队项目用户验收评审 |
5 |
7.25 |
3、哪一次作业让你印象最深刻?为什么?
软件工程作业中结对编程使我印象最深刻,这是首次进行结对编程尝试,期间通过讨论将未解决的问题一一解决,换做以前会自己一个人去想问题的解决方式,比较好费时间,但是两人结对编程可以迅速地找到问题本质所在,切实体会到结对编程提高了写代码的效率,节省了时间。
4、学习和使用的新软件;
visio、IntelliJ IDEA
5、学习和使用的新工具;
process on、墨刀、石墨文档、mockplus
6、学习和掌握的新语言、新平台;
GitHub、博客园
7、学习和掌握的新方法;
快速原型方法、白盒测试与黑盒测试、面向对象设计方法
8、其他方面的提升。
我在软件工程这门课程发现对编程能力、文档书写能力、团队合作能力、逻辑思维能力有很大帮助。
三、你认为目前的课程有哪些问题,你有什么更好的建议:
1、你认为本门课程需要在哪里进行改进,具体措施有哪些,包括:时间进度安排,项目难度等均可;
本课程一直跟着做下来,发现其实老师的时间安排是合理的,这样就可以全面地体会软件工程基本的方法步骤,但是在其中做的时候发现当时自己一直在在挤时间,我希望老师可以根据学生实际情况制定学习计划,项目难度可以接受,综合做下来本门课程这样的安排是为学生着想,至少做完理论部分理解很深刻。
2、你认为助教/老师哪里做的不足,哪里限制太多等;
在查看同学分数的过程中,会看到满分成绩的学生里边好多问题,每个助教虽然给的评分标准是一样的,但是分数的拿捏情况是不一样的。有的同学只是博客形式好看,但是实质性的内容并不是很多,追求形式难免会因小失大。
3、你认为每次项目的评分标准存在哪些问题,你认为的合理评分准则是怎样的(个人/结对/团队算三个)
每次评分我觉得有些助教给分确实很细致,有些还是存在问题,因为有的同学的代码是别人的拷贝下来的,但是博客上看不出来是否是自己的作品,这样的分数其实对于其本人而言是没有意义的。
4、在结对项目中你是否真正体会到了结对的好处,是否真正严格进行了结对编程,双方的工作量是否相同;
结对编程中体会到了结对编程的好处,任务量分下去,每个人只需要负责自己需要负责的那一部分即可,能够腾出更多的时间去完善自己的负责的那一部分代码。在结对编程的时候,双方的工作量是不一样的。
5、你的团队项目是否成功,如果重来一次你是否还会选择这个团队,为什么成功/失败;
我的团队项目是成功的,项目顺利地实现了预期效果,但是重来的一次的话,我只会选择这个团队的某些成员,找合适的人选,因为我想尝试和不一样的人进行合作,以便于自己今后的团队项目管理与发展。
6、总结一下你们团队在做项目时大家的时间安排情况。
每个成员在不同的阶段实践安排不一样,当某一阶段负责该部分内容的成员会占用较多时间,其他成员相对而言较少。一般做项目的时间就是除了上课时间以外的时间,一般会集中在晚上或者下午。
7、对下一届软工课实践教学的建议,或者对于开学初的你,对于大一的你,对于开学初的老师,你有什么想建议和告知的呢?对于后来人的期许。
安排软件工程这门课应该放在大二上开设最为合适,大三下学期就有些晚了,况且大三课业重,时间安排紧张,好多事情需要亲力亲为。对于下一届上软件工程的小伙伴的几句话:一要边学边练习,跟着老师的进度学习理论知识并实践,你会发现好多抽象知识不经意间理解了;二要静下心来遇到问题不慌乱,冷静解决,不可不了了之或者浮躁。
四、你还有什么想说得话。
学习软件工程对于个人能力的提升有很大帮助,以前从来没有在短时间内开发出一个可用的项目,如今做到了,一般只是写可运行的程序,只在命令行下运行的那种形式,同时在团队合作中,不仅体会到任务分工的重要性,而且切实体会到软件工程规范化的做法所带来的好处,不用一上手写代码,最后又全篇进行修改这样的尴尬局面。其次大学期间真的有必要开设这样实践性很强的课程尤其是对于计算机专业而言,没有实践,理论知识相当于纸上谈兵,“纸上得来终觉浅”说的就是这个道理。