近期的人机大战抢占了头条,被阿法狗击败的人类棋手李世石,被无情地黑成了“Google高级软件测试工程师”(少数无良媒体甚至丧心病狂地去掉了「高级」二字)。

    11年入坑时先踩的就是软件测试岗,借机写几笔关于测试的思考。

    一、关于测试

    测试活动贯穿了整个人类文明,不论被测对象是石斧石刀还是卫星导弹;只要生产活动依旧存在,测试都是不可或缺的。

    测试一个最基本的动机:为产品质量做背书维基词条中「背书」的解释是,“为某人某事允诺保证,提高可信度;原意指在支票等背后签名表示支付、收到或同意转让等”。

    把支票改成提测单,就可以形象理解为什么说测试是一种背书行为了:即通过测试活动,对交付的产品给出质量结论,同时替生产主体承担质量事故的风险。

    除了服务上述核心目标外,不同领域的测试职责也会发散,如互联网岗位可能兼顾产品用研、需求优化、研发工作流改进、用户反馈跟踪等。

    随着社会发展,各领域都细分出独立的测试方法(如药物验收的双盲测试),催生出强势的测试主体(如FDA),以及测试劳务分工(如软件测试的离岸外包)

    图:全球搜索 “Software Testing” 关键字的热点区域:

    二、软件测试的岗位分析

    软件测试是可以快速入门,但又需要持续深度积累的岗位。人才分布上也是金字塔型,即大量的基层岗位需求、狭窄的上升通道。

    测试不是最优的职场起点,尤其对于刚走进社会的少年们,容易促生焦虑和对工作及自身价值的质疑:

    1. 研发活动本质上是一种建设行为,即“做一个伟大的产品取悦自己”(某团队招聘标语),完成工作本身会收获不小的成就感。而测试工作是对他人的作品抛否定观点(Bug/Defect),乐趣要少一些;且这是一种挑战行为——从人的动物本能来看,提出挑战/面临挑战都是伴随压力的。
    2. 即便测试具有一定程度的不可或缺性,其价值是依附于研发活动的,这也造成了岗位天然的弱势状况。一个团队被划分成多个阶级、且会表现在收入上,是很影响士气和认同感的事情。

    当然大公司好一些,会通过种种精巧的研发管理来弱化上述的冲突。另外积极方面看,是可以很好锻炼执行力和一些软素质,这些是可以长期受益的方面。

    从塔底慢慢成长的过程是非常煎熬的,我思索了这么几条路:

    1. 强化测试方向的专业技能,成为测试专家
    2. 强化管理能力、执行能力,成为测试团队或项目的 Leader/Manager/Director
    3. 强化开发能力,成为多角色/全栈型人才,或转型 Dev/DevQA
    4. 拓宽领域知识,转型从事某领域的 IT Consulting

    第一条应该是最正统的测试技术通道路线,而且在整个职业发展过程的沉没成本是最小的。但比较受制于供需关系,大多数公司和项目对测试资源的需求都是比较初级的。

    第二、四条对技术和专业能力的需求降低,而沟通能力、管理能力和机遇都是相对更重要的。后续向传统领域转型的机会也更多,但挑战也较大。

    第三条是较稳妥的全面技术路线;且有一些研发技能后,较符合传统的「一技傍身」诉求。缺点是投入高、要持续自我学习;职业积累期比较合适的一个选择。

    没有理论上最优的选择,只有最适合自身的选择。生活有太多精彩都是不能事先预料的,选好一条道路,坚持走下去。

    三、软件测试的能力图谱

    《三体3:死神永生》

    翻阅坐标数据是歌者的工作,判断坐标的诚意是歌者的乐趣。
    歌者知道自己做的不是什么大事,拾遗补阙而已,但这是一件必须做的事,且有乐趣。

    判断坐标的诚意有一些可遵循的规律,比如群发的坐标往往都没有诚意。但这些规律都是很粗略的,要想真正有效地判断坐标的诚意,主要靠直觉,这一点种子上的主核做不到,甚至母世界的超核也做不到,这就是低熵体不可取代之处。歌者有这种能力,这不是天赋或本能,而是上万个颗粒的时间积累起来的直觉。一个坐标,在外行看来就是那么一个简单的点阵,但在歌者眼中它却是活的,它的每一个细节都在表达着自己,比如取点的多少,目标星星的标注方式等等,还有一些更微妙的细节…

    歌者和一个测试工程师的工作内容简直是如出一辙,只是测试没机会向开发或者产品狗们扔光粒和二向箔而已

    测试的一些可以锻炼习得的通用素质:

    • 需求理解能力/问题领域建模,以便胜任「验证型测试」
    • 一定程度的完美主义,可以敏锐把握缺陷
    • 很好的学习能力,以便对领域知识/技术知识的快速抽象和基本掌握
    • 问题评估和表达
    • 责任心,避免问题逃逸

    推荐阅读:

    四、职业回顾

    职场起步的前一两年,是作为一个庞大软件开发工程师团队中的少数几个测试角色开始的。测试岗在4个月试用期的培训计划和开发岗一样,从编码规范、C、Linux/Shell、测试基础、Git、Java、Android 的练习题目,到一个协同开发项目,及最后的转正答辩课题;完全的脱产培训、并有导师指导。

    现在回想这段际遇真是满眼泪水:对于公司而言、4个月的研发团队支出权当一笔投资(毕竟研发主力都是校招学生);对于科班出身的小伙伴而言、4个月试用期可能也只是一个温和的过渡期,逐步适应工作状态;但是对于我这种非科班出身又顶着测试岗 Title 的边缘角色,这四个月是无比珍贵的补齐基本技能的时期。

    最初的一两年,经常会犹豫要不要离开IT行业,原因就是如上文提到的种种焦虑;生活上也因为工作状态而倍感阴郁。

    有两个拐点激发了兴趣和信心,第一个是当时的组长建议学习 Python/Shell,并安排了一些配置部署、和 SCM 脚本开发的需求;另一个是被几个 Geek 好友带进了 Vim 这个深坑,进而慢慢的熟悉了 Linux 和一些 GNU packages. 开发能力开始随着项目实践和工具带来的生产力提高而慢慢强化了,工作内容也脱离测试、开始主要参与 Web 项目和一些杂七杂八的脚本开发工作。

    到了鹅厂又重回测试通道,少部分精力在测试理论建设及专项课题预研,主要方向是在工具及平台开发。

    五、其它

    此前做了一个小的练手项目,从 GTAC / Google Test Blog 爬取会议摘要/文章文本,然后查找测试术语的词频,借以分析出测试的热点方向:https://github.com/yaohui-wyh/Software_Testing_Trends.

    目前的样本较小、且数据分析手段比较简单,给出的结论不具参考性。不过方向还是有些意思的,期待后续推动成为开源项目。