软件工程提问与个人总结
内容说明
项目 | 内容 |
---|---|
这个作业属于哪门课程 | 软件工程(罗杰) |
这个作业的要求在哪里 | 提问回顾与个人总结 |
之前的提问博客
对博客之前提出的问题的解答
1、第二章中提到单元门测试应该由作者负责。可某些情况下,功能的开发者本身就忽视了一些问题,所谓盲区。在他编写的单元测试中,即使代码覆盖率达到100%,也是很难发现这些问题的。
在我实际上的单元测试时,我发现只要把握好入口和出口的条件,单纯的从功能的实现上进行测试,是可以测试出自己代码的错误的。设计测试矩阵也是防止覆盖不够全面的一个方法。
2、在软件工程师的成长中,通过项目的锻炼可以做到对成熟的领域熟悉乃至精通,但是如何做到对于全新的功能或项目做到有思路,有大概路线?
在这次的团队项目中,前端的部分功能我之前也没有接触过。在实际的实现中,还是先去调研现有的项目采用的方法,在针对自己的项目选择合适的实现路径。现在我认为,当软件工程师接触了足够多的项目,是能够对全新的功能选择合适的技术栈来实现的。
3、在结对编程中,领航员的工作定位实际上有些模糊,如何避免领航员比较闲或者无法给出良好建议?
在我们结对编程作业中,领航员实际上处于不断地复核写过的代码与对于新模块的设计中。我和同伴的分工使得领航员更多地负责模块的设计工作。这样虽然在领航员与驾驶员角色互换之中可能出现双方的设计出现冲突或者代码风格不太统一的问题,但是磨合的时间越长,效果越好,效率越高。
4、相较于瀑布模型,迭代式开发对可拓展性要求更高。如何保证迭代式开发能够在最初的版本就完成一个可拓展性较高的版本?
这个问题我到现在也没有完全解决。我认为这和设计软件架构的成员,或者说开发组的leader的水平有很大关系,没有固定的方法论可言。从个人经验来讲,迭代式开发实现的功能的最小集越精简与核心越有利于后续的拓展。很难保证alpha版本的功能在Beta或者gamma版本不被修改,因此能做的就是提炼核心功能并在设计上减少各模块的耦合度。
5、敏捷编程聚焦于最重要的任务,缺少细致的规划,是否会导致在后续的版本出现bug后难以回溯修复?
现在我认为这个问题主要取决于测试工作和设计文档是否完整。如果测试工作做的比较好,保证每一次迭代几乎没有bug,那么只要需求没有改变,后续版本的bug就可以保证与之前的版本无关。如果改动了先前的设计,回归测试对此有很大帮助,重新运行一遍之前的单元测试,可以发现大多数后续版本改动导致的bug。
6、客户的需求在实际情况下并不稳定,甚至经常中途更改需求,如何挖掘客户可能会产生的潜在需求并准备一些预案?
作为软件的开发人员,这个问题实际上是无解的,你永远不知道客户可能又提出什么离谱的需求。但是如果是作为团队的PM,我认为可以保持与客户的不断沟通,并引导客户说出他们的核心需求。作为开发测试与客户之前的桥梁,PM应该尽可能准备多套方案和客户协商,引导客户需求走向对团队有利的方向。
原来的问题是否还有不明白
没有了。
是否产生了新的问题
没有了。
各阶段都学到了什么知识点
-
需求阶段
发掘深层次需求。用户需求往往都在于浅层,从需求理论上来讲,需求分为基本需求,期望需求和兴奋需求。对于一个产品来说实现基本需求是必须的,如果能更多地实现期望需求和兴奋需求则能大幅度提升用户的满意度。
-
设计阶段
一定要定义好前后端的接口,并给出实例。定义接口要把数据类型等等说详细了,除此之外还要分配好不同的错误哪些该前端处理,哪些该后端处理。
-
实现阶段
实现不是越精巧或者越在代码上优秀越好,只要能实现功能,笨一点的实现方法是挺适合的。
-
测试阶段
不要对开发人员自己的单元测试抱有太大信息,一般只能勉强完成功能,接口的单元测试最好和一个完整的模块测试配合起来。
-
发布阶段
写好一个发布手册,来告诉后续的项目管理者你的项目在线上是怎么部署的。
-
维护阶段
数据库密码一定要复杂,另外如果要开放远程连接最好不要给写权限,远程的写对于数据库来说非常危险。
自己的理解和心得
一个学期的软件工程,结对编程时间比较短,印象不太深刻,团队编程感受还是比较深。我在团队中主要负责开发部分,后端的接口框架和前端的功能都参与了实现。后端工作是在django的基础上实现了restful API接口,前端就什么都做了。
先从个人方面来说,技术上来讲自然是边做边学有了一些收获。前端实现的可拖拽连线的界面还是比较考验我自学的能力。但最重要的还是让我学会了如何和同伴合作进行编程:多个人的模块如何组合,出了问题如何合作解决,怎样设计git管理规范,比较难的实现怎么商讨解决。其实在团队项目中,90%都是简单工作,但量很大,共同完成量很大的简单工作并组合起来不出问题并不简单。此外,我在前期的项目中有时候会自己一个人单独蛮干,后来发现这样并不是很好,一个人是不可能解决所有问题,需要给同伴足够的耐心,互相磨合。
从团队方面来讲,我认为组建团队时团队的分工是很重要的。进入团队之前,每个成员的技术背景都不一样,选择合适的人到合适的位置可以大幅度减少技术学习的成本。团队成员之间,可以分成几个小组在开发过程中,我们组两个人是一个小组,负责一个模块。这样便于频繁交流,也防止一个人走偏。
总体来说,这个学期的软件工程上让我对于软件工程有了全新的认识,软件工程不仅仅是坐下了完成程序设计和实现。我最大的收获在于对如何将上游的需求变为一个软件产品有了一个总体的认识并切身参与了团队的软件项目,和团队一起进步。