首页 理论教育 软件敏捷重构实践-软件实践教学模式的敏捷重构

软件敏捷重构实践-软件实践教学模式的敏捷重构

时间:2023-11-20 理论教育 版权反馈
【摘要】:编码、测试和发布是软件生命周期中非常重要的几个阶段,也是直接产生用户价值的几个环节。与传统的软件开发过程相比,敏捷软件开发过程非常重视编码、测试和发布环节,把“编码—测试—发布”视为一个完整的迭代实施周期。在编码、单元测试、集成测试的基础上,修改测试列表中的NOK项和POK项后,再次进行回归测试,最后就可以发布成某个功能点所对应的软件版本,该版本应该是仅包含该功能点的可以运行的版本。

软件敏捷重构实践-软件实践教学模式的敏捷重构

编码(Coding)、测试(Testing)和发布(Releasing)是软件生命周期中非常重要的几个阶段,也是直接产生用户价值的几个环节。编码过程直接决定了软件产品的功能和性能。测试过程直接决定了软件产品的质量。发布过程直接决定了软件产品能否到达客户。

与传统的软件开发过程相比,敏捷软件开发过程非常重视编码、测试和发布环节,把“编码—测试—发布”视为一个完整的迭代实施周期。一个用户故事可以用一个迭代实施周期完成,也可以通过对迭代实施周期循环多次来完成。譬如,第一个迭代周期完成了Sprint Backlog 0,第二个迭代周期在前一个基础上做增量开发ΔIncrement01,从而完成Sprint Backlog 1。公式如下:

Sprint Backlog 0=Coding+Testing+Releasing

Sprint Backlog 1=Sprint Backlog 0+ΔIncrement01

……

在编码过程中,敏捷开发注重结对编程。传统的编码方式都是采取单独编码方式,即每个开发人员负责一个子模块或者子系统,编码质量仅由有限次的代码走查或者同行评审来保证,有些甚至连代码走查的流程都没有,只要代码能够编译通过就可以直接进入受控库。敏捷开发推荐的结对编程,其实是对效率和质量的双重提升,至少可以产生以下收益:

●敏捷团队成员知识共享,取长补短,降低学习成本,提升编码能力。

●有效地采用最佳的解决编码问题的方案。

●及时发现编码形式错误和逻辑错误,减少BUG,提升编码质量,降低返工成本。

当然,凡事都有两面性,结对编程也存在一些弊端,比如:

●具有不同编码习惯的团队成员结对编程,可能会有矛盾或冲突,影响结对效果。

●结对可能会谈论与工作无关的事项,影响工作效率。

●能力较弱的一方可能会懒惰,产生依赖能力较强的一方的想法,影响结对效果。

因此,敏捷开发并没有强制实施结对编程,而是提供了一种实践方法以便开发团队按需选择。如果团队评估下来感觉结对编程利大于弊,那么就果断实施,反之则弃之。

结对编程的最佳实践——师徒制度

师徒制度是以“师傅带徒弟”的形式进行结对编程。如图3-11所示,师徒制度的前提条件是师傅和徒弟都需要拥有自己的编程设备,师傅只在必要的时候与徒弟结对,以解决关键问题。

图3-11 师徒结对编程示意图

师徒制度中,师傅的责任在于对项目全面负责,包括项目进度、项目质量、项目成本、交付时间和文档管理等;以及提升项目组成员的编程水平,包括通过面对面沟通等形式,促使成员对自身的编码习惯、编码技巧、编码逻辑进行反思与改进。师傅的权力在于,有权指派具体的任务给成员、有权干预成员编码设计与实现等。

师徒制度的日常工作方式如下所示:

早:召开简短的技术会议。(www.xing528.com)

①用20分钟完成当天的工作计划及实现方法。

②确定“关键技术点”(即“结对编程点”)。

中:实施结对编程。

①师傅解答徒弟的问题。为了保证师傅本人的产出效率,应遵循以下时间管理规则:师傅随时可以打断徒弟;徒弟只能预约师傅(待师傅有空时才集中回答问题)。

②利用琐碎时间随时查看和评审徒弟的代码。

晚:集成并确认。

①每天至少集成一次以确认当日交付成果。

②结对总结经验,尤其是做得不好的地方和有待改进的地方。

师徒制度的代码审查要点:

①师傅审查徒弟的代码。

责任心+能力:随意搭配代码审查人员往往会导致审查失败,“责任心+能力”是代码审查有效性的基本保障。

②保证每天审查代码。

效率:每天的代码量是有限的,若能保持思路的连续性,则代码审查的效率就会很高;同时,代码不过夜也保证了日常编程的效率和每日集成的运行。

③每次5~10分钟。

效率:对每个徒弟的代码,每天审查5~10分钟;若每天看代码,则5分钟即可发现很多问题。

④每次解决1个关键问题。

效率:无论发现多少问题,均只解决1个最关键的问题,否则徒弟不一定能理解并吸收,结对效果会大打折扣。

⑤师傅带徒弟演变成师兄带师弟。

效率:针对徒弟出现的共性问题,充分利用讲解时间,召集其他徒弟一起听;若高级徒弟的代码质量已经大幅提高,则可鼓励其带新加入的徒弟。

测试环节保证了开发的每一个方法(函数)、每一个功能点都能够通过测试。这就意味着,每当对一个方法进行编码后,都需要编写单元测试用例对该方法进行单元测试;每当对一个功能点编码后,都需要编写集成测试用例对该功能点进行集成测试。理想情况下,编写的测试用例都应该是自动化测试脚本。例如,在Android环境下通常用JUnit框架做单元测试,在C#环境下通常使用NUnit框架做单元测试,在C++环境下通常使用CppUnit框架做单元测试。

在编码、单元测试、集成测试的基础上,修改测试列表中的NOK(全部不通过)项和POK(部分通过)项后,再次进行回归测试,最后就可以发布成某个功能点所对应的软件版本,该版本应该是仅包含该功能点的可以运行的版本。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈