我接受了图灵社区的访问,围绕我的新书《软件测试实战:微软技术专家经验总结》和测试人员职业发展,展开了 讨论。以下是采访全文。
简介:史亮,东南大学计算机软件与理论专业博士,研究领域为软件分析与测试。2006年加入微软(中国)有限公司,任职软件开发测试工程师,负责微软在线业务与商业智能产品的测试工作。2011年调至微软总部,从事Microsoft Office 2013的测试工作。2012年与淘宝测试工程师高翔合著了《探索式软件测试实践之路》一书。2014年,独自出版了《软件测试实战:微软技术专家经验总结》。目前,史亮正从事下一代Microsoft Office产品的研发工作。
图灵访谈:您从什么时候开始编程?是什么让你决定走上计算机这条路?
史亮: 1997年,我进入东南大学计算机系,开始正式学习软件开发。因为时间久远,我已经记不清当时选择计算机专业的原因。也许只是懵懂地认为计算机行业有更好的发展前景,幸运的是整个行业在随后的十余年时间有爆发式的增长。
在攻读博士学位时,我阅读了《C++设计新思维——泛型编程与设计模式之应用》(Andrei Alexandrescu著,侯捷、於春景译)。这本书引起了我对于软件设计的热情。此后,我阅读了许多软件开发的书籍,并通过实验性项目实践了很多编程技术。从某种意义上,这本书是我职业发展的转折点。这并不是因为它提供了我日常使用的技术,而是它激发了我的兴趣,让我有动力去深入钻研。在学习和实践的过程中,新问题又引出新的动力,这样的激励循环帮助我持续成长。
图灵访谈:软件测试的魅力何在?您为什么选择测试一行而不做开发?
史亮: 2006年,我即将离开校园。在通讯软件MSN Messenger上,大学本科同学尚云飞建议我到北京来工作。当时,他与我的另一位同学宋显祖在微软亚洲工程院工作。在他们的热心帮助下,我获得了去北京面试微软测试开发工程师(Software Development Engineer in Test,简称SDET)的机会。随后就加入微软,并工作至今。回顾往事,当年那次聊天令我的人生发生了改变。在此之前,我从没有仔细考虑过离开家乡到异地工作。李笑来老师(《把时间当作朋友》等书的作者)在演讲中曾说:“改变我们人生的关键事件都是无法预期的偶然事件。”果然如此!
在工作后,我逐步体会到软件测试所面临的困难,而这些有挑战的问题就是测试魅力的根源。其中,根本性的困难是,随着软件行业的高速发展,“软件的复杂度已经超越了人的理解能力”(我在《软件测试实战》第一章有详细的讨论)。为了应对挑战,测试人员需要综合发展自身能力,以实施有针对性、聚焦风险、丰富多样、注重实用的测试。在此过程中,他需要解决一系列复杂问题,这对他的能力成长很有帮助。
图灵访谈:您在国内和国外都有相当丰富的测试经验,您能对比一下国内国外两种环境下的测试实践的特点吗?
史亮:我认同语境驱动测试(Context Driven Testing)的观点:测试实践的价值来自于它的语境。除了测试人员的态度和能力,软件项目和测试团队对测试实践有最大的影响。测试人员需要根据项目语境(项目环境、产品元素、质量标准、产品质量等)选择一组相互支持的测试实践。
我的切身体会是,国内外的工作风格确实有所差别,但是测试实践主要取决于产品、项目和团队。而且,随着国内大型企业的国际化,其文化氛围和工作方式与国外企业并没有太大的差别。在具体工作中,测试人员总需要研究产品(《软件测试实战》第7章),研究项目(《软件测试实战》第8章)并融入团队(《软件测试实战》第9章)。只要采用积极的态度来面对职业发展,测试人员在各种环境中都可以获得成长。
图灵访谈:国内有一些企业认为相比于开发者,软件测试人员能力差一些也可以,您认同这种看法吗?这种想法形成的原因是什么?
史亮:这里,所谓“能力差一些”大多指“编程的能力差一些”。在一些软件项目中(国内外皆有),测试人员的主要工作是手工测试,因此对编程能力没有很高的要求。但是,测试是获取信息的技术调查,需要多种能力,例如:
可见,测试人员需要多种能力才能胜任测试工作。其能力集合与开发人员有重叠,但不尽相同。不能单纯用“编程能力”的强弱来评价测试人员的水平。
其实,无论主管是否要求,测试人员都可以主动学习编程技术,并应用于实际工作。在测试中,许多活动提供了自动化的机会,例如产品部署、环境配置、机械性的测试执行、信息收集、报表生成等。合理地运用开发技术,构建合适的工具,能够明显提高测试效率。
平心而论,项目主管更看重编程工作有现实因素。软件项目的目标是交付能够赢得竞争的软件,而编程是产生软件的最直接的活动,开发人员的水平对软件质量有最直接的影响。测试人员的工作虽然重要,但不能直接产生代码,所以容易被低估。测试人员应该正视这种情况,但不必怀忧丧志。作为一个专业人员(professional),他应该通过每天的努力来推动职业发展。
图灵访谈:您与淘宝测试工程师高翔合著了《探索式测试实践之路》一书的过程中有没有发现一些测试理念的分歧,这样的分歧来源自哪里?最后你们是如何解决的?
史亮:我和高翔通过彼此的博客发现双方都对探索式测试有浓厚的兴趣,于是经常交换意见和分享经验,自然成为好友。后来,我们一起合作撰写了《探索式测试实践之路》 一书,以分享所学所知。因为我们都高度认同语境驱动测试和探索式测试的思想,所以并没有根本性的分歧。我们的主要差别在于如何论述探索式测试的实践。
下图是测试专家James Bach提出的概念模型,以展示不同测试方法的风格,其中最左侧是严格脚本化的测试,最右侧是高度机动的自由式探索。高翔在论述探索式测试时,更着力于自由式探索并提出了一批他总结出的测试模型,我则没有特别喜好的方法,较宽泛地介绍了一些技术和工具。从某个角度,我们的论述内容构成了深度与广度的互补。
图灵访谈:有人说Microsoft算是在软件测试方向上偏传统的,您认同吗?您能向我们介绍一下其他互联网公司如Facebook、Google以及Amazon的测试风格吗?
史亮:我并没有在其他互联网公司工作过,虽然阅读过一些报道,但是不能提供更多的信息。因此,难以置喙。我阅读过原版的《Google软件测试之道》(中文版由人民邮电出版社引进)。该书较生动地介绍了一些谷歌的测试实践,部分内容很有启发性,值得一读。
正如我之前提到的,测试实践主要取决于产品、项目和团队。在很长的一段时间内,微软最知名的产品都是发布周期为2~3年的套装软件,如Windows和Office。这些产品的测试实践很成熟,成为微软测试的代表。《微软的软件测试之道》(Alan Page, Ken Johnston, Bj Rollson著)较好地总结了相关方法和经验。
随着互联网成为新的计算平台,商业社会的运作已经深度依赖于互联网服务,因此互联网服务的开发和测试成为新的热点。而且,智能手机和平板电脑主导了移动计算的发展,基于App Store发布的移动应用成为用户的新宠。相比之下,套装软件显得不那么“时髦”。因此,微软的测试给人以“传统”的印象。
但是,如果仔细观察,不难发现微软的产品已经发生了深刻的变化,且还在持续演变中。伴随而来的是软件开发和测试方式的转变。以下是一些例子。
我相信,随着微软业务模式的转变,微软的软件研发会持续演化。在此过程中,好的思想和经验会被传承下去,而新语境势必催生出新的实践,并让一些在其他公司获得成功的方法在微软得到应用。此外,微软拥有许多有特点的项目,项目组之间的交流经验会催生出一批优秀的实践。
图灵访谈:手动测试和自动测试各自的优缺点是什么?微软在实践上是如何结合这两种测试方法的?
史亮:微软是一家大型企业,拥有多种类型的项目。不同的项目对于测试提出了不同的要求,因此项目小组往往会采用不同的测试策略。一般而言,微软要求测试人员具备较高的技术水平,能够熟练地开发自动化测试和测试工具。在许多项目组,测试人员需要编写大量的代码来测试产品,也需要花费相当的时间来手工测试产品。通常,第一线的测试人员最了解产品和技术,他们会主动探索各种技术,以发展出多样性的测试策略。
在此,我介绍一些我的个人观点(《软件测试实战》的第5章对详细地讨论了测试开发)。
首先,测试活动是相辅相成的。测试专家Jonathan Kohl将不同的测试活动比喻为不同的交通方式,每种方式都有优点与不足。
我喜欢走着上班。我很享受风景、运动,以及一边漫步一边思考问题的时光。在户外新鲜的空气中,在远离电脑的思考中,我获得了一些极好的想法。沿途的观察激发了灵感,将我引向创造性的解决方案。
但是步行是缓慢的,如果我驻足观赏可爱的动物或享受日出霞光映红的山脉,我很可能会迟到。所以,在赶时间的时候,我会搭乘公共交通。虽然公共汽车或列车仍旧伴随着步行,但是我能用快得多的速度及时地到达目的地。我极少驾车上班,因为这让我无暇去观察并思考。但是,当别人驾车时,我能够从旅途中获得很多。例如,最近我坐城铁去上班,在路上发现了以前从未注意到的河谷峭壁。我曾经多次经过河谷,但是直到坐上轻轨的那天,在没有步行或驾车分心的情况下,我才能用全新的角度观察到新的景色。
-- Jonathan Kohl, Man and Machine
在以上隐喻中:
可见,手工测试和自动化测试并不是相互排斥的。如果综合它们的优点,就可能开发出更具威力的测试策略,以实现单独的手工测试或自动化测试不能达到的效果。
第二,测试是为了获得产品质量信息的技术调查,任何有助于周密调查的方法都是有价值的。在罪案侦查中,刑侦人员会利用多种方法,从各个信息源收集情报。他们会利用高精密的仪器提取证据,也会大范围走访以获得线索,更重要的是,他们会反复思考当前的情报,以随时调整调查方向。与之类似,测试人员也需要综合运用多种技术和工具,去探究新的信息,并根据新发现及时调整测试方向。在调查过程中,学习、分析、推断、反思等思维活动是必不可少的,而这些是无法自动化的。
第三,利用自动化测试,测试人员可以实施更有效的技术调查。以下是一个案例。
模糊测试是一种修改输入数据来暴露软件缺陷的方法。如果产品需要读取复杂的文档,测试小组可以使用文件模糊器,对原始文档进行随机修改,生成大量的模糊文档。然后,模糊测试框架启动产品,令它读取这批被篡改的文档,并严密监控可能的异常情况。在测试结束后,测试人员分析测试日志中记录的错误,以识别安全缺陷。模糊测试是一种暴力测试方法,一轮模糊测试会使用数万个甚至更多的模糊文件。如果运用得当,模糊测试可以发现许多手工测试或简单的自动化测试无法发现的问题,这对于提高软件的安全性极具价值。例如Microsoft Office团队在开发Office 2013时,通过模糊测试发现并修改了2100多个缺陷。
可见,新的测试挑战要求测试人员重新思考自动化测试的使命,用创新思维去充分利用计算资源,以提出更具威力的测试策略。
图灵访谈:从测试人员的个人发展角度来看,您更鼓励他们参与什么样的测试工作(手动测试、自动化测试,还是测试用例的设计)?
史亮:我建议测试人员多方面的发展。一个测试新人需要避免的思维误区是用某个职务头衔限制自身能力的发展。例如,我在测试论坛中发现一些测试人员常讨论“白盒测试工程师”、“黑盒测试工程师”和“性能测试工程师”等职位。一部分人认为它们是相互排斥的,即做白盒工程师就不用考虑用户情景,做黑盒工程师就不要考虑代码实现,做性能工程师就只要钻研性能测试工具。其实,这些名词只是某些公司所设定的职位而已,只代表他们对工程师的要求,并不体现软件行业对高水平测试人员的期望。实际上,国内外的高水平科技企业都要求工程师能够独当一面,能够独立完成一个领域的大部分任务。对于测试人员而言,他需要能够独立完成一个产品或组件的测试。无论测试活动是白盒测试、黑盒测试还是性能测试,只要工作需要,他就应该有能力完成。因此,为了长远地发展职业生涯,测试人员不应该被头衔所约束,而是要积极地拓展自己的知识储备。
图灵访谈:对在线服务的测试和对传统软件的测试有什么不同?
史亮:一般说来,互联网应用与客户端软件有如下不同。
不过,目前的趋势是客户端软件也在“云端化”,客户端软件的测试人员需要更多地借鉴互联网应用的测试实践。
客户端软件不会和互联网应用一模一样,但是它们将拥有更多的相似之处。在高速发展的软件业,技术工作者需要“拥抱变化”,向同行学习一些新技术,做一些恰当的尝试,会收获好的成果。
图灵访谈:在《软件测试实战》的结尾,您总结了很多帮助测试工程师高效学习的方法,其中提到了“耐心”、“坚持”和“知行合一”。您能总结一下一位优秀的测试工程师应该具备的性格特点吗?
史亮:我认为任何性格特征的测试人员都可以获得成功,而且从团队建设的角度,一个由不同性格成员所构成的团队往往更有活力。
获得个人成功并不容易,我认为最重要的基础是对项目、对自己负责任的态度。对项目负责,测试人员需要提供高质量的测试服务来帮助项目成功;对自己负责,测试人员应该以专业人员(professionals)自居,坚持专业主义(professionalism),追求精湛的技艺和卓越的成果。好的态度会推动持续的努力,努力将获得项目成功和技能成长,它们会激发热情,而热情会燃起更积极态度。这样的激励循环将帮助测试人提升能力,并发展出适合自身特点的职业之路。
图灵访谈:测试过程中,工程师需要对产品和业务有相当地了解,是不是说测试工程师在某些方面对于产品的了解甚至超过了产品经理?
史亮:对于复杂的软件,任何人都不可能掌握全部的信息。测试人员的主要任务是通过技术调查提供产品的质量信息,为项目的关键决策提供支持。一方面,技术调查要求测试人员掌握产品和业务的知识,另一方面,深入的调查会帮助他更深刻地理解产品和业务。所以,在许多问题上,测试人员的理解超过产品经理是很自然的情况。
《软件测试实战》第7章“研究产品”从静态分析、动态分析、业务研究等方面入手,讨论了如何从测试视角来研究产品。所谓“优秀的测试”并不是使用最前沿、最高级的测试技术,而是根据产品和项目的实际情况选择恰当的测试方法。所以,测试人员需要在整个项目过程持续地调研,并将研究成果应用于当前的测试。
图灵访谈:未来办公软件产品将会朝什么方向发展?Office系列产品在未来是否会出现重大革新?
史亮:微软的整体战略是“Mobile First, Cloud First” (移动优先,云端优先)。在Microsoft Office方面,该战略大致有如下表现。