测试是消除恐惧的最好办法
曾经有幸聆听过跆拳国家队卢教练的一次讲座,讲述了如何从零开始组建队伍,建队的第一天就确立了四到五年内夺冠的目标,又如何三年内问鼎世界冠军的历程。其中有一句话让我印象深刻:“训练是消除恐惧的最好办法”。
在软件开发这个看起来理性的行业,很少能听到人们谈及恐惧。但事实上,停滞不前的计划、矛盾重重的协作、累积的技术债务……,很多都源于对未知的恐惧。因此,当我听到这句话时,不禁自问:在软件开发中,消除恐惧最好的办法是什么呢?
当然是测试——自动化测试。在测试驱动开发中,测试为我们注入坚定的信心,帮助我们不断探索未知需求,改进设计方案,以迭代方式完成软件开发。
测试不只是考试
很多人由于对测试的误解难以掌握TDD。说起测试时,人们往往把它看作某种考试,用来证明软件是否达到了某个分数线。然而,这只是测试在TDD中的一个方面,作为设计工具,测试的价值远不止于此。 如果以“训练——测试”的类比来看。竞技运动中有各种不同的训练。
-
以赛代练 通过频繁的比赛来调整和保持状态。这是看起来最“节省”和直接了当的方式。但显然有前提条件:1. 比赛足够频繁;2. 输掉比赛的损失不那么巨大。 在软件开发中,相似的方式就是“生产环境测试”,“让用户测试”,或者说就是不测试的委婉说法。如果产品的发布足够频繁,质量问题的损失不那么巨大,也许可以采用这种方式。 但就像在比赛中应用全新的战术或临场改进技术动作一样,依靠“生产环境测试”来改进系统也会面临格外的压力和阻力。
-
热身赛 热身赛是为了调整状态,熟悉场地,熟悉对手,熟悉比赛规则。这种训练的目的是为了在正式比赛中发挥最佳状态。 对比软件开发,相似的测试概念是“验收测试”、“回归测试”等等。这种测试比较接近于考试。更容易发现问题,但却不那么直接提高解决问题的能力。
-
战术训练 为了增进团队内部的协作默契,常常会对在比赛中所运用的战术进行集体操练。 在软件开发中,体现在“功能测试”、“接口测试”、“集成测试”等。这类测试更关注于系统功能场景,专注于系统各部分间的协作。
-
技术动作训练 为了提高个人的技术动作,进行反复的练习。 在软件开发中,“单元测试”与之类似。针对单独模块,关注专项能力的提高和固化。
-
体能、力量等素质训练 身体素质是支撑所有技战术的根基。尽管训练的内容与比赛项目看似无直接关联,实则是高水平竞技的根本保障。 在软件开发领域,与之相仿的是针对非功能需求的单元测试,以及在自动化测试保障下频繁重构带来的演进式架构。就如同身体素质和力量对于竞技比赛的重要性一样,质量内建的代码也是赋予软件竞争力的基石。

消除恐惧的最好办法
初学运动项目的爱好者往往会急于投入对抗性练习,这确实会带来直接的体验和快感。但如果想在这个领域长期的取得进步,那就不能指望这种“菜鸡互啄”式的对抗,而是要进行系统的训练。 训练的价值在于有有目标地提升技能水平,并将这些技能内化为肌肉记忆。这样才能在瞬息万变的赛场上应对自如。 冠军级运动员步入赛场时,支撑他的信心不是来自几天前赢了某场练习赛,而是多年来的汗水和不懈的训练。
同样的,初次接触自动化测试的开发人员已开始都会更容易被验收测试、端到端测试所吸引。然而要构建专业的系统,需要不断提高系统排错和可扩展能力,并通过各层级的自动化测试将其固化在软件中。这样才能从容应对变换的业务需求和技术变革。 专业开发者自信地发布系统,进行设计变更,他的信心来自于千锤百炼、随着每次代码变更进行的测试和重构。