正如标题写的那样,我有这种想法已经很多年了,但是我从没明说出来过。直到上周,一个初级 Rails 开发课程的学员提到他也有同样的感受,才促使我写了这篇文章。
  我可以说,我根本不愿意写任何测试。因为写测试太令人抓狂了。
  我完全理解这种感觉。而且我知道有这种想法的程序员不在少数。
  一、为什么这些程序员会对写测试这么抓狂?
  我想这是因为他们只专注于提升他们编程的能力,却忽略了学习测试方面的知识。其实道理像在玩一个 RPG 游戏(比如说「上古卷轴」),当你把你角色的弓箭技能点满的时候,你却发现你需要点满单手武器技能才能打通当前的剧情。这时你一定会在心里大喊:「这简直太坑爹了」!是的,试想一下,当你苦思冥想的「远程打击」技能在一场近身肉搏混战中没能发挥什么作用时的心情,你能明白我说的意思。
  其实,在另一种相似的情境里,比如说当你需要学习一门新的编程语言的时候,我们通常也会有这种心态。当你专精于一门语言(像 Ruby),你运用这门语言时,自然会比运用其他语言(比如说 Java 或 PHP)时来得更高效。诚然,你可以在学习新语言时运用你已有的经验,触类旁通。但是,学习新语言的语法,编程范式,IDE 或者理解整个体系依旧是必不可少的。这同样需要花费大量的时间。
  其他类似的情境中,像我们通常要面对不同的开发环境,不同的产品类型(原生的 Windows 桌面应用,浏览器应用和移动端iOS应用),开发人员要游走于前端和后端,甚至当学习两门不同的外语,比如西班牙语和汉语时,我们大都会有同样的心态。
  那么回归到正题,当你舒舒服服地开发着新的功能,突然意识到你需要测试这些功能时(假设这不是一个 TDD 流程),那么这种令人抓狂的情绪必会「如约而至」。这种感觉像你突然置身于一个不知名的沼泽中,只能靠双腿,慢慢地寻找着出路。
  二、当面对这种情况时,你有两个选择。
  第一,任由烦躁和不安的情绪蒙蔽你的心智。这样你可以直接宣布放弃你的测试工作。因为它太难了,根本不值得你浪费时间在上面。或者,你有第二种选择……
  接受事实。承认你现在有关测试方面的知识储备不足,做得很烂。像你当初刚刚开始编程时,代码一样写得很烂。但渐渐地,你的能力逐步得到了提升。可以理解,承认自己效率低下,承认自己并不像自己想象的那么的确很伤自尊。但是这种自我审视,在每个人的职业生涯中,通常是我们面对新事物,并准备开始接受并学习它们时应该有的正常心态。
  我们可能精通一个领域一项技术,而在其他领域其他技术完全是个初学者。你的经验越多,知道得越多,可转移到其他工具的知识越多。毕竟,现在的科技每五年要更新一次。你观察到更高层次的概念,也更轻松指出某些新技术所遵循的模式。但在细节上我们可能仍很薄弱,或者掌握得很慢。尤其在尝试一门新技术的初期,这个过程让人很受伤,感觉像流血般难受。这可能是因为你想掌握的技术太,也可能是因为你使用的编程工具大都“棱角尖锐”。而这些都不可避免。
  即使是为一门新语言配置一个环境,都可以让人感到筋疲力尽,让你觉得自己的工作效率一落千丈。同样,对于测试,事实也是如此
  三、因为测试是一项独立的技术。
  想想你是什么时候开始编程的。是从大学时代起吗?或是比这更早?当时你是否为你的程序设计了自动化测试流程?如果是,你是否把这个流程应用到每一个你在学校开发的程序上?又或者你已经是一个经历过几次职场变迁的老鸟。想想看是不是每一个你工作过的团队都需要经常为自己的产品写测试?通常情况下,答案都是否定的。其实,每个人在其职业生涯中,分配在开发和测试上的时间通常都会有很大差距。大的需要以「年」为单位来计算。是的,以「年」记!像 3 年开发经验 vs 1 年测试经验,或者 7 年开发 vs 4 年测试,6 个月开发 vs 1 个月测试,等等。
  四、 3 比 1,7 比 4。难怪你会抓狂。
  你每天工作 8 小时 (或者更少,欧陆风,你懂的)。你需要在这段时间内不断地切换于编程和测试的工作中(当然,你也可能需要兼顾其他的一些事情,比如像管理,讨论,交流,制定优先目标等等。这些不在的讨论范围内)。这种切换模式的确能令人精神分裂。好比你写字的时候你不能只用惯用手,必须不停地换手。你会发现你一会写得好,一会又写不好,一会写得好,一会又写不好,写得好,写不好,写得好,写不好……
  五、你以为这种折磨有会放过你吗?
  其实它会!但是你对测试,要「不抛弃,不放弃」,要不断地提高你的测试能力,要建立起测试相关的知识体系和架构。真诚地面对这个问题,接受你需要提高自己的能力才能从中发现乐趣的事实。并努力让你测试和编程的水平相当。如果你能做到这些,相信你会发现你的付出将会是「物有所值」的。