代码改变世界

新的产品,新的挑战(图灵访谈)

2014-06-18 11:48  liangshi  阅读(1153)  评论(2编辑  收藏  举报

我接受了图灵社区的访问,围绕我的新书《软件测试实战:微软技术专家经验总结》和测试人员职业发展,展开了 讨论。以下是采访全文

 

 

简介:史亮,东南大学计算机软件与理论专业博士,研究领域为软件分析与测试。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发布的移动应用成为用户的新宠。相比之下,套装软件显得不那么“时髦”。因此,微软的测试给人以“传统”的印象。

但是,如果仔细观察,不难发现微软的产品已经发生了深刻的变化,且还在持续演变中。伴随而来的是软件开发和测试方式的转变。以下是一些例子。

  • 必应的一些在线服务已经做到每日部署(daily deployment),即代码签入之后,如果成功通过编译和自动化测试,可以在24小时内部署到产品环境,整个流程(代码编译、自动测试、服务部署、在线监控)不需要人工操作。其自动化水平与其他互联网领军企业相当。
  • Visual Studio是强大的集成开发环境,提供了非常丰富的功能。目前,Visual Studio团队能够做到每年发布一个新版本(如Visual Studio 2012、Visual Studio 2013和即将到来的Visual Studio 2014)和3个重要更新(如Visual Studio 2013 Update 1、2、3)。对于如此复杂的产品,能够做到持续交付,说明Visual Studio团队拥有较高的研发和管理水平。
  • Windows团队已经将Windows重要版本的发布周期从3年压缩到1年左右,例如Windows 8.1的研发用时约1年,Windows 8.1 Update 1的研发用时约半年。
  • OneNote团队在多个平台(Windows桌面、Windows Store、Windows Phone、Mac、iPad、iPhone、Android、Web)上推出了产品,并公布了OneNote API,使第三方应用可以将内容发布到云端的OneNote笔记本。其产品覆盖桌面应用、平板应用、手机应用、Web应用、Web服务等,且在持续发布中保持了较高的质量。

我相信,随着微软业务模式的转变,微软的软件研发会持续演化。在此过程中,好的思想和经验会被传承下去,而新语境势必催生出新的实践,并让一些在其他公司获得成功的方法在微软得到应用。此外,微软拥有许多有特点的项目,项目组之间的交流经验会催生出一批优秀的实践。

图灵访谈:手动测试和自动测试各自的优缺点是什么?微软在实践上是如何结合这两种测试方法的?

史亮:微软是一家大型企业,拥有多种类型的项目。不同的项目对于测试提出了不同的要求,因此项目小组往往会采用不同的测试策略。一般而言,微软要求测试人员具备较高的技术水平,能够熟练地开发自动化测试和测试工具。在许多项目组,测试人员需要编写大量的代码来测试产品,也需要花费相当的时间来手工测试产品。通常,第一线的测试人员最了解产品和技术,他们会主动探索各种技术,以发展出多样性的测试策略。

在此,我介绍一些我的个人观点(《软件测试实战》的第5章对详细地讨论了测试开发)。

首先,测试活动是相辅相成的。测试专家Jonathan Kohl将不同的测试活动比喻为不同的交通方式,每种方式都有优点与不足。

我喜欢走着上班。我很享受风景、运动,以及一边漫步一边思考问题的时光。在户外新鲜的空气中,在远离电脑的思考中,我获得了一些极好的想法。沿途的观察激发了灵感,将我引向创造性的解决方案。

但是步行是缓慢的,如果我驻足观赏可爱的动物或享受日出霞光映红的山脉,我很可能会迟到。所以,在赶时间的时候,我会搭乘公共交通。虽然公共汽车或列车仍旧伴随着步行,但是我能用快得多的速度及时地到达目的地。我极少驾车上班,因为这让我无暇去观察并思考。但是,当别人驾车时,我能够从旅途中获得很多。例如,最近我坐城铁去上班,在路上发现了以前从未注意到的河谷峭壁。我曾经多次经过河谷,但是直到坐上轻轨的那天,在没有步行或驾车分心的情况下,我才能用全新的角度观察到新的景色。

-- Jonathan Kohl, Man and Machine

在以上隐喻中:

  • 手工测试是步行。在漫游产品的过程中,测试人员可以观察到丰富的细节,能够随时暂停预定的测试路线,对感兴趣的局部进行细致的测试。其不足是推进的速度较慢,有时不能在短时间内完成长距离的旅行(覆盖更多的测试目标)。
  • 自动化测试是驾车。其优点是速度快,能在短时间内测试大量的内容,其不足是自动化测试只做规定的检查,会忽视其他所有细节。即便软件出现一望即知的问题,只要测试代码没有做相应的检查,自动化测试就会放过它。其实,自动化测试更像地铁,可以将大量乘客快速准时地送到目的地,但是所有旅客都无法观察到地面的风景。
  • 计算机辅助测试是他人驾车。自动化测试或测试工具完成繁重的工作,带着测试人员快速地漫游产品。在测试过程中,测试人员监控产品的表现,如果发现问题,他可以“下车”调查。该策略综合了手工测试和自动化测试的优点,利用软件工具来提高测试效率、丰富测试手段,让测试人员能够更好地观察、思考与行动。

可见,手工测试和自动化测试并不是相互排斥的。如果综合它们的优点,就可能开发出更具威力的测试策略,以实现单独的手工测试或自动化测试不能达到的效果。

第二,测试是为了获得产品质量信息的技术调查,任何有助于周密调查的方法都是有价值的。在罪案侦查中,刑侦人员会利用多种方法,从各个信息源收集情报。他们会利用高精密的仪器提取证据,也会大范围走访以获得线索,更重要的是,他们会反复思考当前的情报,以随时调整调查方向。与之类似,测试人员也需要综合运用多种技术和工具,去探究新的信息,并根据新发现及时调整测试方向。在调查过程中,学习、分析、推断、反思等思维活动是必不可少的,而这些是无法自动化的。

第三,利用自动化测试,测试人员可以实施更有效的技术调查。以下是一个案例。

模糊测试是一种修改输入数据来暴露软件缺陷的方法。如果产品需要读取复杂的文档,测试小组可以使用文件模糊器,对原始文档进行随机修改,生成大量的模糊文档。然后,模糊测试框架启动产品,令它读取这批被篡改的文档,并严密监控可能的异常情况。在测试结束后,测试人员分析测试日志中记录的错误,以识别安全缺陷。模糊测试是一种暴力测试方法,一轮模糊测试会使用数万个甚至更多的模糊文件。如果运用得当,模糊测试可以发现许多手工测试或简单的自动化测试无法发现的问题,这对于提高软件的安全性极具价值。例如Microsoft Office团队在开发Office 2013时,通过模糊测试发现并修改了2100多个缺陷。

可见,新的测试挑战要求测试人员重新思考自动化测试的使命,用创新思维去充分利用计算资源,以提出更具威力的测试策略。

图灵访谈:从测试人员的个人发展角度来看,您更鼓励他们参与什么样的测试工作(手动测试、自动化测试,还是测试用例的设计)?

史亮:我建议测试人员多方面的发展。一个测试新人需要避免的思维误区是用某个职务头衔限制自身能力的发展。例如,我在测试论坛中发现一些测试人员常讨论“白盒测试工程师”、“黑盒测试工程师”和“性能测试工程师”等职位。一部分人认为它们是相互排斥的,即做白盒工程师就不用考虑用户情景,做黑盒工程师就不要考虑代码实现,做性能工程师就只要钻研性能测试工具。其实,这些名词只是某些公司所设定的职位而已,只代表他们对工程师的要求,并不体现软件行业对高水平测试人员的期望。实际上,国内外的高水平科技企业都要求工程师能够独当一面,能够独立完成一个领域的大部分任务。对于测试人员而言,他需要能够独立完成一个产品或组件的测试。无论测试活动是白盒测试、黑盒测试还是性能测试,只要工作需要,他就应该有能力完成。因此,为了长远地发展职业生涯,测试人员不应该被头衔所约束,而是要积极地拓展自己的知识储备。

图灵访谈:对在线服务的测试和对传统软件的测试有什么不同?

史亮:一般说来,互联网应用与客户端软件有如下不同。

  • 互联网应用运行在云端,客户端软件运行在用户计算机上。对于云端服务,运营团队只要发布新版本就可以立即覆盖所有用户,所以部署缺陷修复变得很容易。这推动项目团队以更快地速度开发并测试软件。反观客户端软件,许多用户并不经常更新软件,这推动项目团队花较多的时间来稳定产品,以减少错误。
  • 互联网应用大多是“服务器—浏览器”端,其中服务端的所有代码都运行在受监控的环境中。项目团队可以通过服务日志等了解用户行为和软件行为,这为分析用户习惯、发现程序错误、优化系统性能等提供了重要资料。这些信息常常是内部测试所不能提供的,对项目团队提高产品质量有很大帮助。反观客户端软件,项目团队通常无法访问其运行环境,也很难收集到丰富的用户反馈。这样的信息缺口要求测试小组更努力的测试、更积极地与用户交流,但很难到达互联网项目的效果。
  • 互联网应用往往拥有涉及多个软件系统的工作流,每个系统往往有不同的实现技术和测试策略。这要求测试人员掌握更多的方法和工具,并准备复杂的测试环境。客户端软件常常只有一个进程,测试人员只需要深入了解它,就可以胜任工作,且搭建测试环境比较简单。

不过,目前的趋势是客户端软件也在“云端化”,客户端软件的测试人员需要更多地借鉴互联网应用的测试实践。

  • 许多客户端软件已经做到持续更新。例如,一些软件会自动下载更新,然后提示用户更新。有些软件甚至会自动安装更新,所以用户每次启动都是该软件的最新发布版。在智能手机和平板电脑上,App Store也会提示用户更新应用,而且在用户允许的情况下,有些App Store会自动安装新版本的应用。此外,有些应用的显示内容是HTML渲染的结果,只要服务器推送新的HTML页面,应用的内容就会变化。从某种角度,此类应用与互联网应用的浏览器端没有什么差异。
  • 许多客户端软件已经可以持续收集质量信息。成熟的App Store都向开发者提供了丰富的质量信息,包括用户下载次数、购买次数、用户评价、软件崩溃信息、软件错误信息等。这都有助于开发者提高应用质量。此外,许多软件会使用遥测(telemetry)技术,在用户允许的情况下,向服务端发送运行数据。这让客户端软件的项目团队也能获得丰富的质量数据。
  • 许多客户端软件都需要访问互联网服务。我回忆了一下日常使用的软件,大部分都要与某些服务器通讯——这也是大多数用户的普遍情况。未来,纯粹的“单机软件”会愈来愈少,客户端软件与互联网服务的结合会更紧密。因此,相关测试人员也需要掌握一些互联网服务的测试技术。

客户端软件不会和互联网应用一模一样,但是它们将拥有更多的相似之处。在高速发展的软件业,技术工作者需要“拥抱变化”,向同行学习一些新技术,做一些恰当的尝试,会收获好的成果。

图灵访谈:在《软件测试实战》的结尾,您总结了很多帮助测试工程师高效学习的方法,其中提到了“耐心”、“坚持”和“知行合一”。您能总结一下一位优秀的测试工程师应该具备的性格特点吗?

史亮:我认为任何性格特征的测试人员都可以获得成功,而且从团队建设的角度,一个由不同性格成员所构成的团队往往更有活力。

获得个人成功并不容易,我认为最重要的基础是对项目、对自己负责任的态度。对项目负责,测试人员需要提供高质量的测试服务来帮助项目成功;对自己负责,测试人员应该以专业人员(professionals)自居,坚持专业主义(professionalism),追求精湛的技艺和卓越的成果。好的态度会推动持续的努力,努力将获得项目成功和技能成长,它们会激发热情,而热情会燃起更积极态度。这样的激励循环将帮助测试人提升能力,并发展出适合自身特点的职业之路。

图灵访谈:测试过程中,工程师需要对产品和业务有相当地了解,是不是说测试工程师在某些方面对于产品的了解甚至超过了产品经理?

史亮:对于复杂的软件,任何人都不可能掌握全部的信息。测试人员的主要任务是通过技术调查提供产品的质量信息,为项目的关键决策提供支持。一方面,技术调查要求测试人员掌握产品和业务的知识,另一方面,深入的调查会帮助他更深刻地理解产品和业务。所以,在许多问题上,测试人员的理解超过产品经理是很自然的情况。

《软件测试实战》第7章“研究产品”从静态分析、动态分析、业务研究等方面入手,讨论了如何从测试视角来研究产品。所谓“优秀的测试”并不是使用最前沿、最高级的测试技术,而是根据产品和项目的实际情况选择恰当的测试方法。所以,测试人员需要在整个项目过程持续地调研,并将研究成果应用于当前的测试。

图灵访谈:未来办公软件产品将会朝什么方向发展?Office系列产品在未来是否会出现重大革新?

史亮:微软的整体战略是“Mobile First, Cloud First” (移动优先,云端优先)。在Microsoft Office方面,该战略大致有如下表现。

  • 除了Windows和Windows Phone,Office套件会进入其他主流移动平台,包括iPhone、iPad和Android等。目前,OneNote已经在这些平台上发布了相应版本。
  • Office套件会和微软的云服务(OneDrive、SharePoint Online等)深度集成,让用户可以随时随地通过Office应用来访问存放在云端的信息。
  • Office365(Office套件与云服务的集合)会在商业智能、团队协作、业务管理等领域持续发力。 未来,移动计算与云计算会深度集成,Office产品也需要“与时俱进”。