软件工程提问回顾与个人总结
软件工程提问回顾与个人总结
项目 | 内容 |
---|---|
这个作业属于哪个课程 | 班级博客 |
这个作业的要求在哪里 | 作业要求 |
我在这个课程的目标是 | 系统地提升软件工程能力 |
这个作业在哪个具体方面帮助我实现目标 | 回顾与总结学到的软件工程知识 |
1. 链接到以前提问题的博客
2. 对曾经提出的问题的解答
1. 为什么单元测试用随机数不好?如果随机性不应该在单元测试中,在哪里更合适?
这个问题是从作业角度出发提出的,但是过去做的作业都是非常小的项目,可以靠开发者用熟悉程度来完全的掌控所有的单元测试。但是对于更大的项目而言,单元测试可能是非常多的,开发人员或者测试人员并不熟知所有的模块和功能,如果出现了不可复现的情况,可能调试起来是非常困难的,所以单元测试不应该出现随机性。
2. 低层次问题应该精通到什么程度?
我认为这个问题需要判断“低层次”的低在何处,对于软件开发而言,原理和底层的技术是最为核心的,而一个问题被称为简单问题,它的底层可能并不简单。我认为精通应该建立在对底层的充分掌握之上,如果对这项技术的所有机理和技术都充分掌握了,再加上多次的反复练习和使用,那么可以称得上是精通。
3. Program Manager管事不管人,那怎样推动团队完成开发呢?
PM管事,而事已经分配给了特定的人,通过关注于具体的任务和项目进度,以任务为导向推进项目进展和团队的开发工作。
3. 在项目的 需求/设计/实现/测试/发布/维护阶段(一共6 个阶段)中都学到了什么“知识点”
需求
需求是一个项目的核心,是项目的意义所在。明确需求是非常重要的,如果没有判断好需求,可能导致做的功能没有用处,甚至整个项目都没有价值。需求分析是应该花费很大功夫的地方,因为这关系这整个团队的未来,是团队领导的核心能力所在。
设计
设计开发影响最大的是可扩展性和可维护性,如果设计不好可能导致之后推倒重来,好的设计应该是便于之后长期的开发和维护工作的,设计将会决定团队的效率和最终软件能够达到的规模。
实现
个人认为实现是软件工程中最简单的部分,大部分的软件工程需求是人人都能完成的,但其流程应当受到软件开发规则的约束,例如代码规范等等,以提高整个团队的开发和维护效率。
测试
测试需要做到两点。一方面是要全面,当用户使用时还有bug可能会导致灾难性的后果,测试需要尽可能考虑所有的情况,避免发布存在bug的版本。另一方面是自动化,代码的修改可能是频繁的,如果在每次改动后都重新进行手工测试,成本是非常高的,测试应当做到自动化以提高效率。
发布
为了提高效率,我们采取了自动化的部署,当master分支变动后,就会自动触发构建和部署,此外我们还配置了CDN,提高了发布和使用的体验。
维护
维护方面没有积累太多的经验,主要是人工的对服务器进行维护,以及人工的收集bug。
5. 结合自己在个人项目/结对编程/团队项目的经历,谈谈自己的理解或心得
个人项目
个人项目阶段没有太多的感触,因为过去做的也大部分都是个人项目。只是这次更多的关注了软件工程的规则和流程,为之后的项目打下基础。
结对项目
结对项目的任务和个人项目是类似的,但是由两个人共同完成。个人认为最大的不同在于加入了沟通成本,沟通需要时间,并且沟通还可能出现差错,也注意到了团队会存在磨合期,沟通是团队开发中非常重要的部分,不良的沟通可能会显著降低效率。
团队项目
在团队项目中也有许多收获,首先认识到了PM的重要性,推进项目的工作应该是团队的核心任务,感到PM的压力比较大,对PM的能力要求也是非常高的。其次就是流程的规范性,因为随着团队人数增加,沟通成本会显著的增加,而一个规范文档可以有效降低沟通成本,如果大家都按照流程操作,产生的疑问会减少,沟通的频次也就能有效的控制住了。
团队项目比较遗憾的一点在于项目的选择上,一开始比较希望能够做一个真正想做的有意义的项目,也有过一些想法,但最终还是为了求稳选择了课程组提供的项目。有好处也有坏处,需求更为稳定了,但是自己的激情感觉不足,希望未来有机会的话还是能够把自己的想法实现了。