1.2 开发团队做的远不仅是开发
加入团队已经有一段时间,小艾逐渐发现,在工作中,似乎每个人都在做不一样的事情,而每个人在团队中的位置都显得不可或缺。一个疑问从小艾的心中冒出来:为什么团队中大家似乎都在做不同的事情?开发团队有多少种角色?测试团队又有多少种角色?测试专家的核心价值究竟在哪里?
凯文的解答从讲述团队分工开始。
细致的分工能提高效率的道理已经在许多需要专门技能的领域得到充分证明。在软件开发领域,分工的作用同样突出。分工的结果是,团队的成员根据分工的结果担当不同的角色,在其位,谋其职。
在一个软件开发团队中,狭义上从事开发任务的成员其实只占其中一部分;开发以外的其他任务,如项目管理、设计、测试等在软件开发过程中同样非常重要。作为测试团队中的一员,小艾有必要了解更多关于测试团队中角色分工的内容。测试在软件开发过程中的重要性,在许多人心目中并不那么突出,但实际上,软件的好坏,在很大程度上是由测试决定的。
1.2.1 术业有专攻
在知识密集型的社会,人是最关键的资源。软件开发的产出和从业人员的技能密不可分。然而,随着软件系统的复杂度越来越高,驾驭软件开发所需的人力资源远远超出单一个体的可承受限度。从这个角度而言,分工是解决个人控制力有限的唯一方法。从经验和效率的角度看,一个团队中的个体在技术和经验上各有千秋,分工能更有效地发挥人的长处。
在一个成熟的开发团队中,细致严密的分工使团队能以更高的效率运作。分工有助于提高效能的奥秘在于,绝大多数情况下,专注的人在效率上要高于注意力分散的人。细致的分工有利于凝聚人的注意力,提高熟练程度的同时减少切换带来的开销。在软件开发团队中,特别是使用了敏捷开发以后,团队的角色分工是非常明确的,每个成员根据各自的角色,专注于开发过程中的相应任务。
电子商务平台是一个涉及多种业务场景的复杂软件系统。软件开发任务的顺利完成,必须依赖于一个角色完善的团队的紧密合作。那么团队中究竟都需要哪些角色分工呢?
小艾所在的开发团队使用Scrum模式敏捷开发,是已经被证实可以提高开发效率的开发方式。按照敏捷开发的团队角色划分方式,Scrum团队的核心角色主要包括产品负责人(Product Owner)、Scrum Master及团队成员(Team)。在Scrum团队的外围还包括客户(Stakeholder)、经理(Manager)等角色 。
团队成员主要负责产品的具体开发。每个团队成员有具体的分工,如架构师、开发人员、测试人员、文档设计人员等。团队成员组成执行团队,这是个自组织、自定向和跨功能的执行团队。执行团队通过直接的行动推进项目的进度,以达到计划的目标。执行团队一般由5~9个各方面的专家组成,团队的组织结构文档贯穿整个开发周期。团队成员都是开发周期里各个领域的专家,他们使用专业的技能完成开发任务。对每种角色,通常都有一套技能集(Skill Set),通过技能集,可以定义一个角色应该具备的能力,反过来也能够判定一个员工是否具备担当某个角色的专业素质。
架构师是对软件开发过程的各个领域都具备一定专业技能的人员,主要任务是把软件开发的需求转化为可以实现的抽象设计和具体设计,并完成相应的设计文档。同时,架构师还需要把业务化的需求转化为技术化的功能性需求及非功能性需求。架构师需要参与软件开发各个阶段,也作为审核人员对详细设计和开发计划进行审查。架构师的技能特点是,具有更高视角,对技术的发展方向能够有全局的把握,对业务也有深刻的认识。可以说,架构师的知识体系兼顾了深度和广度。
开发人员的职责是根据抽象设计和高层次的具体设计进行更细化的具体设计,并按照设计完成编码实现及单元测试任务。在测试阶段,开发人员还有完成问题分析和解决缺陷的任务。由于软件的代码实现都是由开发人员完成的,因此开发人员的开发技能与软件是否以高质量完成有重要的关系。开发人员具有把宏观任务抽象化和把抽象概念具体化的能力,能够以微观的视角完成功能细节的开发。作为开发人员,卓越的理解能力和编码能力是必需的。
测试人员的任务是根据软件设计文档编写测试计划,并按照测试计划对软件进行测试。要完成的测试种类是根据需求定义的,在复杂软件系统的开发团队中,通常包括多种类型的测试人员,分别对各自的领域进行有针对性的测试。测试人员从另一个角度促进软件的开发过程,其工作的重点是发现问题和解决问题,因此,这对测试人员的洞察能力和分析能力提出非常高的要求。测试人员除了掌握测试方法学以外,还需要具有良好的抽象思维能力和逻辑分析能力。
文档设计人员的任务是根据需求文档和设计文档,设计编写交付给用户的说明文档和使用手册。文档对于软件产品的重要作用是不言而喻的,完备的文档是成熟软件产品必须具备的交付成果。一套好的文档在很大程度上决定了软件产品能否顺利被最终用户接受。文档对于开发团队也有重要的意义。清晰细致的技术文档对于产品维护的帮助也是不言而喻的。为了完成文档的设计,对文档设计人员的技能要求丝毫不能马虎。文档设计人员需要具有突出的表达能力和叙述能力,善于把抽象的问题具体化,另外,还需要有一定的艺术才能。
在团队的外围,相关的角色还有客户和经理。
客户是软件产品的直接利益相关者,他们从业务的角度提出对软件产品的需求。从本质上而言,客户是开发软件的根本动力,为软件开发支付相应的费用。在开发过程中,他们需要对软件的进度、是否满足需求进行相应的把关,并参与阶段性的回顾。客户的特点是对业务有深入的理解,能够清晰地理解业务流程。
经理在团队中的任务是控制开发进度、解决团队的资源问题、对团队的运行进行技术性的指导等。根据这三种不同的任务,可以有三个人分别担当不同的经理角色,分别是项目经理(Project Manager)、人事经理(People Manager)及指导经理(Coaching Manager)。通常情况下,也可能是一个成员同时兼顾多个经理角色。经理不直接参与项目,但在项目的外围提供关键的支持,为软件开发营造良好的环境,因而需要有更高的视觉和领导力以完成相应的任务。
作为测试团队的一员,小艾最关心的是测试团队中都有哪些角色分工。可以认为,测试团队的成员都是敏捷开发项目组的测试人员,都具备测试人员的一般技能。
由于软件测试本身就可以作为一个项目来看待,因此测试团队中需要相应的项目组角色。测试负责人(Test Lead)是测试的主要统筹者,需要担当测试项目经理的角色,其任务包括定义测试计划、统筹人员调配、监督测试项目进度等。测试负责人定期向项目团队发布有关测试项目的进度和更新,对测试项目进度负责。作为测试的统筹者,为了顺利完成测试任务,测试负责人需要利用相关的规则结合经验安排测试的执行顺序,降低测试进度受阻或测试检测出严重问题但难以解决的风险。测试负责人的技能要求是综合的,既需要掌握测试的专业技能,又要具备良好的组织能力和协调能力。
测试架构师的职责是定义测试策略,从宏观上定义测试的方向和方法。测试架构师对测试目标的技术特性和业务需求有准确的把握,能为测试团队提供方法论方面的全面建议。在测试计划完成后,测试架构师需要审核计划是否全面覆盖应该包含的验证点,根据经验给出相关的执行建议。作为测试团队的“智囊”,测试架构师应该具有较高的技能水平,包括深入和全面的测试经验,对软件开发和测试的模型有全面的认识,对商业模式及客户的业务需求也有比较深刻的理解。
相对于具有宏观视角的测试架构师,测试工程师以“微观”的视觉专注于具体的测试任务。根据特定的测试场景,测试工程师重点关注其测试的目标业务部分,根据特定业务场景制订该部分的测试计划。由于不同的测试类型之间存在依赖关系,测试工程师得进行团队的直接沟通,使测试计划可以满足这种依赖。测试计划制订完成以后,测试工程师就根据计划执行测试;同时,在测试过程中发现缺陷时,测试工程师还有义务和开发人员一起分析问题的原因并提出解决方案。测试工程师的技能集主要包括设计和执行测试用例的专业技能,良好的业务理解能力和问题分析能力。
测试经理(Testing Manager)从资源调配的角度给不同的测试项目分配资源。通常来说,测试和开发的执行步调是不一致的,因此同一个测试人员有可能同时承担多个子项目的测试任务。在一个敏捷软件开发团队中,对测试人员的多任务处理能力有较高的要求。
在软件开发团队和测试团队中,有些角色对承担者的资历有明确要求,如架构师角色要求对业务和技术有一定的经验。然而,角色的不同仅仅体现分工的不一样,并没有级别的区分。因此,角色并没有贵贱之分。每个角色的技能集都非常明确,相同角色的承担者在技能的层次上也可能存在很大的差异。随着技术和经验的积累,每种角色都可以成长出资历深厚的专家。专家和菜鸟,在某种程度上,仅仅是一种“闻道有先后”的差异。
了解到团队中原来有这么多不同的角色,而不是仅有“程序员”,小艾觉得非常兴奋。在一个完备的团队中,体验不同角色的奥妙,该是一件多么有趣的事情!
1.2.2 好软件由测试决定
进入电子商务平台开发一段时间以来,小艾不时听身边的前辈提及IBM的软件质量不错。似乎每个人都认为自己有清晰的标准衡量软件的好坏,但对于什么样的软件才是好软件,小艾心中并没有明确的界定标准。用"好"来形容软件,显然是一个相当笼统的描述。
软件质量 包括两个相关但截然不同的概念--功能性质量(Functional Quality)和结构性质量(Structural Quality)。功能性质量反映的是软件是否按照设计实现并满足相应功能性需求(Functional Requirements);结构性质量反映的是软件是否满足相关的非功能性需求(Non-Functional Requirements,NFR)。
要评价软件的功能性质量和结构性质量,有一系列衡量指标。有了衡量指标以后,另一个重要的问题就是如何获得这些指标的量化数值。软件测试是验证这些指标的有效方法。通过测试可以在一定程度上模拟真实的使用场景,并得到质量指标的具体水平。如果测试发现某些指标无法达到要求,则需要对系统进行改进,以求通过测试。测试的通过指标是根据质量的需求来定义的,系统通过了测试,可以从量化的角度说明它符合需求。
正确性(Correctness)反映了实现的功能达到设计规范并满足用户需求的程度。这是功能性质量的基本指标。正确性可以通过功能测试来验证。
可靠性(Reliability)衡量在规定的时间和条件下,系统维持其性能水准的程度。这是结构性需求的重要指标。对于企业级的应用系统,对可靠性通常都有很高的要求。可靠性指标可以通过系统可靠性测试获取。
易用性(Usability)反映用户掌握软件操作及理解软件事务所需付出的时间及努力程度。具体的指标诸如界面是否友好,是否有在线帮助,是否提供容易理解的异常信息等。易用性指标通常由功能测试获得。
可移植性(Portability)衡量系统从一个平台转移到另一个平台的容易程度,包括把程序从一种软/硬件环境转移到另一种软/硬件环境的容易程度等。大型软件的安装和部署可能也是一个复杂的过程,高可移植性的系统应该是容易安装和更新的。此外,企业级系统对多国语言的支持程度也是可移植性的一个衡量指标。可移植性在多平台的功能、系统测试、安装测试、多国语言测试中得到验证。
可迁移性(Migratability)衡量系统版本升级的容易程度。大型系统的迁移通常是一件非常复杂的事情,可迁移性需要通过迁移测试来验证。
效率(Efficiency)衡量系统执行某功能所需的计算机资源和时间有效程度,包括功能和性能是否经过优化,是否检验内存泄漏或溢出问题等。效率是系统测试的一个重要检测点。
......