软工回顾与总结

软件工程个人博客作业:个人回顾和总结

项目 内容
这个作业属于哪个课程 2020计算机学院软件工程(罗杰 任健)
这个作业的要求在哪里 提问回顾和个人总结
我在这个课程的目标是 进一步提高自己的工程能力,提高自己的团队协作和表达能力
这个作业在哪个具体方面帮助我实现目标 在反思思考中总结自己的所学和问题,正确认识自己
以前提问题的博客 博客链接

一.问题回顾

问题1

  • 问题再述:

    作者在2.1.2指出:单元测试应该准确、快速保证程序基本模块的正确性,之后提成一系列的标准。其中,提到单元测试要注重效率以及单元测试要覆盖所有代码路径及测试API中的每一个方法和每一个参数。在此我有一个疑惑和想法

    大部分软件工程项目都有一定的时间限制,那么我们应该测试到何种地步?如何兼顾测试的效率和覆盖率?是不是所有的API,以及其中的所有细节都要顾及测试到?

    从我个人经验来看,无论是计算机组成课设,OO还是编译课设,几乎每一次作业我都会简要写好设计文档,主要包括大体实现的思路和部分实现细节,一定细致度的思考让我在设计阶段就避免了大部分隐蔽的bug,从而编码和测试相对轻松了许多。所以我在想,可不可以在设计阶段对部分关键细节多下功夫,从而可以减少测试的时间开销,而并不一定需要覆盖到所有的API及其每一个方法及细节。

  • 问题解答

    在经过一学期的软件工程的学习和实践后,我对测试细粒度的必要性有了新的认识。对于本学期个人的小项目来说,我在设计阶段工作做得很足,编码时确实避免许多隐蔽的bug,编码完成后已经几乎保证了正确性,大大减少了测试的工作量。但是对于结队项目和团队项目,随着项目规模增大,我们的工作不再是仅仅完成好自己负责的部分,更要考虑到之后与其他小组的对接,还要考虑到用户使用的便利性(尤其是团队项目,面对较多的用户之时),我们无法预测用户的行为,因此在测试上要保证每一个API和每一个逻辑都要被测试到,这也是团队项目中需要有专门的测试人员来进行细致的测试的原因。

问题2

  • 问题再述:

    作者在4.3节代码规范中,较为详细地介绍了一些编码中的规范,是我们值得学习的。但是在该节中作者提到:"只要有助于程序逻辑的清晰体现,什么方法都可以使用",但是今天,而今天,编写的程序仍然利用这些危险的调用(以C语言为例,如下图所示),因为从来没有人教开发人员避免使用它们。某些人从各处获得某个提示,但即使是优秀的开发人员也会被这弄糟。他们也许在危险函数的自变量上使用自己总结编写的检查,或者错误地推论出使用潜在危险的函数在某些特殊情况下是“安全”的。因此,什么方法都可以使用过于决断,或者缺少“保证正确”的前提。

  • 问题解答

    经过结队项目和团队项目的学习和实践,我深深感觉到代码逻辑的清晰在一个小团队的交流中起到的重要作用,无论是前后端的对接,还是测试成员的测试,清晰的代码逻辑能够大大减少组间工作交接与呼应的难度。确实,为了清晰体现代码的逻辑,应该“不择手段”,但是我们要以安全、正确为前提。所以,我认为书中的这句话仍然过于绝对,但是仍有一定的道理。

问题3

  • 问题再述

    作者给出了三点结队编程的好处,置身事外来看,我觉得是很有道理的。但是作者在3.1节中说的“每个人的工作质量直接影响最终软件的质量”,又在4.5节中说“因为有了”随时的复审和交流,程序各方面的质量取决于一对程序员中各方面水平较高的一位“,似乎有些矛盾。结队编程是否真的能带来如期望搬的好处?是不是能广泛地运用?

    我认为,结队编程能起到互相促进的作用,达到1+1>2的效果,应该是要建立在两人水平相近或者相差不远,或者某人在某方面有特长。这样才能在磨合期后起到一定的相互学习、促进,以及保证开发质量的作用。尽管结队编程强调合作和交流,但是应该是要有分工的,如果两人水平差距过大,那么驾驶员和领航员的分工几乎没有必要,结队编程的意义和必要性受到极大的考验。

    此外,在结对编程中,如何才能更好地分配两个人的工作?如果由于某些原因,你的同伴未能完成相应的任务,可是这个任务必须马上要提交,这时候该怎么做?这又是对结队编程两人水平差异的拷问。

  • 问题解答

    • 从本学期的结队编程项目实践来看,每个人的工作质量确实会直接影响最终软件的质量,这是下限。

    • 随时的复审和交流,程序各方面的质量,确实取决于一对程序员中各方面水平较高的一位,当然,这个质量的上限的决定是要建立在每个人的工作质量都达到一定的要求的基础上,当每个人都完成好基础的需求之后,二人完成基本的交接后才能在程序的改进、优化、复审上下功夫,而这个是绝对软件质量上限的关键因素。

    • 结队编程给项目带来的最直观的好处就是二人的互相监督、互相交流,大大减少了程序出错的概率,提高了编程的效率。但是二人的个人性格、代码风格的不同以及没有真正的面对面编程、网络原因带来的阻碍却仍然存在,使得结队编程的体验并没有那么好。

    • 在两人不能面对面编程且编码风格差异较大时,个人建议采用分工和对接的方式。结队编程的分工取个人所长。

    • 未能完成任务的情况很少出现,因为二人是随时交流和监督的。

问题4

  • 问题再述

    关于和项目经理的的交谈

    作者在第九章提到项目经理最大最独特的贡献是带领团队达成最重要的目标,并保持团队平衡,可见项目经理必然要有较强的交流能力。那么如果我作为一个项目中的程序员,我应该怎么样和项目经理进行好的交流呢?特别是当产品出现问题的时候?

  • 问题解答

    • 在本学期的团队项目中,我深深体会到一位负责、善于交流和有较扎实的技术基础的PM对于团队的重要性。
    • 作为团队一员,当PM来进行项目进度的跟进时,应该将现阶段的进度和遇到的主要问题如实报告给PM,以便方便PM在各小组间进行协调和协助解决项目的瓶颈问题。

问题5

  • 问题再述

    关于9.3节中的Program Manager和Project Manager的区别

    Program Manager的管事不管人是指什么?关于这一点的区分是否是正确的?

  • 问题解答

    • 经过本学期团队项目两个阶段的学习与实践,我对项目经理的工作有了一定的认识。项目经理是执行组织委派其实现项目目标的个人。这是 一个富有挑战且备受瞩目的角色,具有重要的职责和不同的权力。 项目经理要有较强的适应能力、良好的判断能力、优秀的领导能力 和谈判技能,并熟练掌握项目管理知识。项目经理必须能理解项目 的细节,但又能从项目全局的角度进行管理。
    • 管事不管人即是指注重软件项目本身,而不在意实现的人员是谁也不对该项目的工作者进行指派。
    • 对于二者的区别于界限,我仍觉模糊,需要在将来进行更多的团队项目才能理解二者的区别和联系。

二.产生的新问题

问题1

​ 团队项目中期的人员流动的作用在哪里?是必要的吗?

​ 个人看来,一个公司一个团队难免会有人员的流失和新成员的加入,而应对这种变化是一个团队是否能得以继续顺利工作的关键所在。那么在本课程的团队项目的人员流动是否是希望我们去提前体会和应对这种变化呢?

问题2

从我们的团队项目经历来看,我认为这两个PM的区分并不是这么明显,因为我们团队的PM更像是以为Program Manager,因为大家是平等工作、一起决议、并且PM做了具体工作;而其又是一位杰出的Project Manager,因为其管事也管人,带领大家完成工作,也是和外界打交道的代表。

那么Program Manager和Project Manager的区分是否是必要的呢?同一个人可以同时担任这两个角色吗?

三.学到的新知识

经过本学期软工课程的学习,我对项目的各个阶段:需求/设计/实现/测试/发布/维护阶段都有了一定的了解。

  • 需求

    需求的调查可能需要进行大部分的调研工作,不仅仅要了解用户还要了解用户对已有同行的反馈以及市场调研。

  • 设计

    设计对于个人小项目来说,是帮助个人理清思路,避免重复犯错的好办法;对于结队或者团队项目来说,各个小组之间的代码规范设计需要提前进行约定,特别是API和IO部分,这是各个小组工作对接的关键。

  • 实现

    实现的时候需要充分考虑各种逻辑,要注重代码规范,要勤写注释以清晰体现代码的逻辑,方便测试人员和对接工作

  • 测试

    测试要注重正确性和效率,既要有单元测试也要有总体测试,要将测试结果和改进意见撰写成文档以便技术小组进行修改和优化。

  • 发布

    发布阶段要充分了解市场需求,发布在哪里、如何推广都是需要考虑到的。

  • 维护

    一个刚刚发布的项目一定是不完美的,或者说不存在完美的项目,要进行不断的改进。为了方便维护,我们在之前工作中应该要提供给用户反馈的途径,根据用户反馈对项目进行维护:包括修复bug、更新新功能、优化用户体验等等。

四.结合自己在个人项目/结对编程/团队项目的经历,谈谈自己的理解或心得。

  • 个人项目:

    个人项目更像是一次软件工程的初体验,需求分析、设计、实现、测试四大要素基本覆盖,学习到了软件项目的最基本流程。

    但是项目中添加的优化因素体验并不好。在短时间内完成基本需求和附加需求,并完成测试,以及繁重的博客作业,工作量已经很大;对于这门课来说,我认为个人项目的最重要的是帮助同学们了解软件开发的基本流程,虽然算法是后端逻辑的重中之重,但是将其作为为一个类似于算法竞赛的要求放在个人项目中,我认为是非常不合适的。

  • 结队编程:

    虽然没有与队友面对面编程,且由于个人网络原因,导致体验较差,但是仍然体会到结队编程的意义:二人互相监督,互相帮助,互相查错,大大提高了项目的完成效率。

  • 团队项目:

    团队项目让我真正体会到了一个团队合作的项目完整开发流程,体会到了每日开会对于项目的重要性:监督项目进度,相互帮助、督促与push,各小组间工作的交接等等。团队之间的交流、调研工作与调研报告的撰写、技术开发、使用git管理项目、使用issue将大项目划分为各个细小的工作完成、博客撰写。。。。。。团队项目给我带来的收获甚多,这对之后的职业发展有一定的益处。

原文地址:https://www.cnblogs.com/qmxdzy/p/13152177.html