在进入正题以前,我们来想象一下人类祖先在石器时代后期开始种植农产品的情景。最早发现农作物可以种植的人类祖先可能不小心把种子掉在地上,第二年春天雨季后发现长出了植物并结出果实,而秋天的收获激励他们有意识地在下一年去重复这一过程,他们挖坑埋种子的工具是石质的。经过很多很多年的进步,人类经历了农业革命、铜器时代、工业时代,直到现在的信息时代;播种农作物的工具由石质发展成铁质、钢质,由铲发展到犁,由牛拉的单犁发展到机械化拖拉机拉的多排犁;农作物种植的过程也由根据节气听天由命发展成机械灌溉、大棚种植和基因工程等现代种植方法。然而不管它怎样发展,有三样东西贯穿始终,那就是人、工具、方法或过程。
同样,一个工程系统也是由人、流程和工具组成的。人在这个系统中是最重要的因素,因为流程是由人来制定的,工具是由人来使用和操作的。但这并不是说,系统中只有人就够了,流程和工具都不需要了。流程可以帮助避免因人的主观因素而产生的错误,工具可以比人工手动成百上千倍的提高效率,所以人、流程和工具在一个工程系统中缺一不可。工程在计算机软件领域是指采用系统的流程来设计、开发和传递产品及服务。卓越工程是指在工程上能达到杰出和优异。既然软件开发也是工程范畴的,那么开发团队的成长也就离不开优秀的人才,简捷有效的流程和高效率工具这三个卓越工程系统中的重要因素。当然开发团队的成长还包括沟通、团队协作、团队文化和 团队士气等等。我在这里只从工程系统中的三个重要因素来谈。
优秀的人才组成优秀的团队
一个团队的建立需要有合适的成员加入。从招聘开始就对人才进行严格的挑选,微软的招聘哲学是“要最好中最好的”。那么什么样的人会加入我们的团队?正直诚实、有责任心、尊重他人、对客户和技术有热情、自我完善、敢于接受大的挑战、有想象力和创造力等等。当然以上是基本素质,我们也要看设计、编程和测试等能力,这是因为我们是软件开发团队,软件开发的基本能力是非常必要的。
微软招人看重的是个人能力和团队协作精神,学历并不是最重要的。我在微软亚洲工程院工作的时候,曾邀请一位美国团队资深架构师为工程师们做讲座,他在自我介绍中提到他没读完本科,我开玩笑说微软的架构师好像都没读完大学(大家都知道比尔·盖茨先生没读完本科就从哈佛出来创办微软,他退休前的职称就是总架构师)。我举这个例子不是想让大家都从大学辍学,我也认识一些微软架构师不但读完本科还拥有硕士或博士学位,我想说的是学历可以说明一个人在学校取得的成绩,但不能代替工作能力以及在工作中能获得的成果。
微软员工入职后会参加入职培训和其它一些培训,但培训本身并不能使员工马上适应工作。员工入职后的前三个月通常会有一个“良师益友(Mentor)”,由有经验的老员工担任,帮助新员工熟悉工作。员工会被安排一些具体任务来“导入”以后需要做的工作。员工以后的职业学习和成长也是由培训,向其他人学习和工作中的锻炼组成的。工作中的锻炼占绝大部分,向其他人学习次之,培训只占一小部分,培训中的内容如果不通过工作中实践很难变成自己的东西,所以在工作中的锻炼成长最重要。当然向其他人学习,包括向“职业良师益友(Career Mentor)”学习有很大益处。“职业良师益友”是一些愿意帮助别人的资深员工,他们可以给员工的职业发展出谋划策或用自身做榜样。这些是员工入职初和以后成长的一个基本模式,每个员工的道路不尽相同,但有一点是相同的,那就是员工作为自己职业发展的驱动者要自己寻找锻炼的机会,经理提供帮助和指导,公司提供支持。
我刚加入服务器与开发工具事业部中国团队时,第一个向我汇报的员工对编程很有激情,他从 12 岁就学会用 BASIC 语言编程,大学时主修计算机,之前在一家外企公司做了两年软件开发工程师。一进入我的团队,就被分配到一个全新项目组,所以我们没能为他指定一位项目上的“良师益友”。但他并没有因此而退却,主动向美国团队要了资料,又找了相关的书来读,很快就上手开始修漏洞了。他还把所学到的知识整理、编写成文发表在 MSDN 杂志上,让更多的人来了解这项技术。没人期望一个还处在熟悉一项技术过程中的工程师写成这样一篇文章,并能发表在 MSDN 这样重要的期刊上,当然也包括我。在写这篇文章的过程中他既锻炼了自己,也展示了其自学能力,
最重要的是他给自己创造了成长的机会,通过给自己不断地创造成长机会,他很快成为一个技术骨干,大家有问题都会去问他。
我们中国开发团队大多由年轻人组成,是微软分布式开发中的新生力量。我们通常会向美国团队 “借用”几个资深工程师来这里帮助招聘和训练本地员工。当然,我们也会把优秀的中国员工送到总部做短期融合培训,主要是和美国团队一起工作,了解公司文化和产品开发流程,以及与美国同事建立良好合作关系,便于以后开展工作。今年三月,我在组建 WinForms(Windows Forms, .NET 平台的一部分)团队时,就有三名本地员工前往雷德蒙进行短期培训,之后加入的新员工也通过阅读各类资料、动手实践来掌握 WinForms 的开发测试,如调查并修补漏洞,分析并写测试用例等。美国资深测试主管也受邀来上海帮助员工增加在这个领域的知识,熟悉开发流程和提高技术能力。同时,员工之间也定期交流各自的学习心得共同提高。当然,在共同发开产品的过程中,与美国同事之间频繁的视频、电话会议也帮助我们年轻的工程师们更快接手更多新工作。目前,拥有一名经理,一名项目经理,三名软件开发工程师,三名软件开发测试工程师和七名外包软测试工程师的 WinForms 团队已初具规模,承担了 WinForms 全部主要测试任务,并且可以开始修补漏洞和新功能的调研工作。这个团队能在很短的时间内承担起重要的任务,有成为一个优秀的团队潜力,虽然还有很长的一段路要走,但为今后成长为优秀的团队奠定了扎实的基础。
简捷有效的流程
人是有思维的、有创造力的,可是在做一些具体事务时却容易出一些低级的错误。这时流程会帮助减少这样的错误来保证产品的质量。流程如果太繁琐会降低效率;没有流程,质量又没法保证。所以要有一个平衡,要建立一套对产品开发最合适的流程也就是简捷有效的流程。我想大家对软件产品开发的周期,例如市场调查、产品需求、计划、产品设计、产品实现、测试、调试、修补漏洞、质量过关、产品发布已有了解,在此不多谈了。我想以产品实现和测试的流程为例来说明这段流程对软件质量保证的重要性。
我在雷德蒙工作时,曾有个兄弟团队的资深软件开发工程师干过这样一件事。产品开发进入修补漏洞的后期,在这个阶段只有重要的漏洞才能去修补,而且代码提交前要经过伙伴测试(Buddy Test),这样做的目的是要保持产品质量的稳定性,可他过于自信了,在没有经过伙伴测试就把代码提交了。结果他的提交使第二天的每日构建(Daily Build)通不过多个重要的测试用例,兄弟团队也没法儿用它进行其它测试,白白浪费了一天时间。这件事对这位仁兄来说肯定是个教训,也说明流程是有作用的,不按流程做会导致一些影响很坏的错误。
在开发团队中会有很多软件开发工程师,他们都要提交代码,尽管他们会很认真的编写代码,有时也难免出错。我们常用代码评审(Code Review)这一流程中的重要步骤来保证代码的正确性。一个工程师写的代码会由另一个或几个工程师包括软件开发测试工程师来做复审。这样,代码经过多双眼睛的审核,正确性会较高。有些开发团队会要求软件开发工程师提交代码时,要先把提交放入提交排队系统,这个系统会对每个提交做必要的测试,测试通过后系统才会正式提交代码。经过这样一个流程,代码出错的可能性进一步降低。伙伴测试和提交排队系统有异曲同工之效,都是在代码进入源代码管理控制系统前对提交的代码进行必要的测试来保证代码的正确性。伙伴测试会花费软件开发测试工程师的时间,提交排队系统也需要工程师花时间来维护,各有千秋。我带领的 CLR/Silverlight 上海团队与相应的美国队伍共拥有七、八十位软件开发工程师,提交代码要通过一个提交排队系统,提交前要经过代码评审。
另外也可以采用伙伴构建(Buddy Build)或滚动构建(Rolling Build)。伙伴构建是指一个工程师提交代码前或后由另一工程师帮忙做构建来验证提交代码没有构建问题。滚动构建是由一个计算机系统自动完成的,它周期性地同步源代码管理控制系统中的当前源代码后进行构建验证,也可以自动做一些测试,有问题它会自动发邮件给相关人员。WinForms 上海团队组建不久开始建立流程,因为只有几个软件开发工程师,所以正在考虑采用每日构建(Daily Build)和滚动构建(Rolling Build)。
每日构建(Daily Build)出来后,软件开发测试工程师会针对它进行一系列的测试包括版本验证测试(Build Verification Test)和临时手动测试(Ad hoc manual Test),另外还会不同周期地做全面自动测试(Full Automation Test),压力测试(Stress Test),性能测试(Performance Test),安全测试(Security Test)等等。这些大多都是事先根据测试计划写好的自动测试,同时会把在测试中发现的问题记录下来,软件开发工程师会相应地进行调试解决,项目经理会对所有发现的问题做 Triage(会审),Triage 这个英文词的原意是一个根据伤员的伤病情况来决定先给谁后给谁处理伤病的流程,这个词在这里的意思也就很容易理解了。
测试在产品开发中对质量把关起到至关重要的作用,在整个流程中是必不可少的环节。这也是为什么微软在甄选软件开发测试工程师时也会很严格,软件开发测试工程师能力并不会比软件开发工程师差,只是在软件开发中分工不同,侧重点不同。 我带领的 CLR/Silverlight 团队和 WinForms(Windows Forms, .NET 平台的一部分)团队各自有一套简捷的流程来进行开发测试,虽不完全一样,但都是很有效的。总之,流程是为了保证产品质量而设的,定然不能缺少,但也不能太过复杂,否则会降低效率,也会影响人的创造力和能动性。
高效率的工具
工具的使用在人类历史发展中起到关键作用,一个时代通常因使用某种工具为标志。例如石器时代的标志是石制工具,铁器时代是铁质金属工具,信息时代是以现代通讯设备和计算机为标志。总之,工具使人们的生产效率大大提高,是人类革命性进步的重要组成部分。同样,在软件开发中,也离不开工具。
在软件开发中,最常用的工具是集成开发环境(IDE)和源代码管理控制系统,集成开发环境包括编辑器(Editor)、编译器(Compiler)、链接器(Linker)和调试器(Debugger)等。Visual Studio Professional(专业版)就是这样的集成开发环境。源代码管理控制系统是一套客户端 - 服务器(Client-Server)系统,服务器存储源代码,它可以支持多个客户端提交代码并管理控制源代码的版本,它还可以在没有冲突的情况下自动合并客户端和服务器有差异的同一文件,在有冲突的情况下允许客户端手动解决冲突。这样一个系统会使一个开发团队的多名工程师有效地提交代码,而不用担心提交的代码会把别人的修改覆盖掉。另外值得一提的是 Visual Studio 2008 整合的代码分析工具,它可以自动找出代码中的错误,包括常见的缓冲区溢出等,虽然它也会找出一些并非是错误的地方,但能找出一定百分比的错误也会使这一工具受到青睐。
代码中的漏洞也被叫作虫(Bug),软件开发测试工程师如果发现问题会记录到数据库(Bug Database)中。微软的 Product Studio 就是这样的一个产品,它是一个团队协作的工具,软件开发测试工程师把发现漏洞(Bug)纪录在 Product Studio,项目经理会对 bug 做 triage,软件开发工程师会改动代码修复漏洞。有时开发团队也会用 Product Studio 来管理工作任务,把任务象 bug 一样来管理。Product Studio 对提高团队协作效率有很大贡献。 这么多的工具,开发人员在用不同工具时,需要切换,不是很方便。Visual Studio Team System 2008(VSTS 2008)把以上的这些工具集成在一起,开发团队中的项目经理,软件开发工程师,软件开发测试工程师都用同一个工具 VSTS 来进行日常工作,这好像制造业采用了流水线设备,比以前车间里用不同工具制造出产品的部件再用其它工具组装出产品,效率有极大的提高。这样的一些工具常把流程也做在其中,人员在使用工具时也就按照流程来做了,这是今后开发工具发展的一个重要方向。
CLR/Silverlight 团队建立一年多了,队员对各种工具的使用已经非常娴熟了。WinForms 团队虽然只有几个月,大家对各种工具的使用也上手了。目前两个团队都开始使用 Visual Studio Team System 2008 ,我相信随着 VSTS 的不断改进,我们的高效工具会使团队的效率达到最佳。
结束语
年轻的中国开发团队经过严格的人员挑选组队、人员培训、对技术和领域知识的掌握、高效工具的使用、简捷有效的流程的建立以及不断的经验积累,相信一定会成长为一支优秀的开发团队。
作者简介:徐鹏阳,现任微软中国研发集团服务器与开发工具事业部部门经理,带领 CLR/Silverlight 和 WinForms 两个研发团队。自 1995 年初加入微软以来,先后参与了 Microsoft SQL Server 7.0,2000,2005,Windows Vista 和 Silverlight 1.0 的研发和发布。
本文经微软中国和作者独家授权刊发,原文发表在微软中国研发集团服务器与开发工具事业部的团队博客: blogs.msdn.com/stbcblog 。
志愿参与 InfoQ 中文站内容建设,请邮件至 editors@cn.infoq.com 。也欢迎大家到 InfoQ 中文站用户讨论组参与我们的线上讨论。
评论