Day 01 「科学 v.s. 数学」前言

笔者从业数年,面试过不少程序开发者。每当问到对方是否有做单元测试时,绝大多数的面试者总会说:
「我知道测试很重要,但我们没时间写测试。」
「我知道测试可以避免不必要的错误,但我们没时间写测试。」
「我知道测试可以加速开发,但我们没时间写测试。」

罗兰夫人
罗兰夫人,图片截自网路

『没时间啊,没时间,天下古今几多之罪恶假汝之名而行!』

你都不测,你怎麽知道你做的功能是对的?你怎麽知道你的新修改没有把旧功能搞坏?你怎麽好意思告诉老板你「做完」了?

「我们有 QA 呀!」

我们来看看一间公司,如果 RD 只开发,QA 只测试,会发生什麽事情?QA説,我的工作就是抓 bug,我要尽可能地多抓 bug,这样才能显示我的工作能力好。所以 bug 越多越好。

RD 呢?RD 説,我的工作就是写程序,所以我收到需求就「热热写,快快送」,顶多自己手动稍微测一下,反正 QA 会细测,有错他会跟我说。我所有的工作要尽可能地快速经手,这样才能显示我的工作能力好。虽然这样 bug 会变多,但我无妨,那不是我的 KPI。

有发现吗?一间公司,如果 RD 只开发,QA 只测试,造成的後果就是「没有人有动机去避免 bug 产生」,接着就是品质无法得到保证。

品质不是选项

软件管理常见的取舍,都是在「时间」、「成本」、「品质」当中挑选两项,并且时常把「你只能满足其中两项」挂在嘴边。然而,事实真的是这样吗?在我看来,「品质」不应该是选项,因为品质一旦牺牲了,你会直接失去消费者的信任,这下你时间再快,成本再低都没用。

软件管理
软件管理三元素,图片截自网路

真要我说,你应该要首先先让品质维持在一定程度以上,然後再视情况在另外两个因素中选一个才对。为什麽不说品质要高,而是「一定程度以上」呢?你知道的,哪有人写程序没 bug 的?只是多或少,好不好抓,及抓到好不好修的差别而已。这,就是测试可以发挥的地方了!

是科学还是数学?

很多人都说电脑科学是数学,但也有很多人不这麽想。数学跟科学都追求正确,但方法不同。数学要求你「证明」,透过一些逻辑的交错应用,来证明一件事 100% 是对的,无论日换星移,这件事都不会变。但科学不同,科学追求正确的方法是「实验」。科学家先针对一个现象提出一个假说,经过巧妙的安排,试图重现这个现象。几十年几百年过去,无数次的实验结果,都没人推翻这个假说,那我们就相信这个假说是正确的。

对此,Uncle Bob 曾说:「电脑科学是科学,不是数学。给你一段程序码,要你证明他的正确性成本太高了,几乎办不到,但你可以做实验验证他,并且无数次不断重复这个实验,当你实验次数够多,大家就相信这段程序码是对的了。」

这里的实验,就是「测试」。

这就是我们为什麽要测试。我们给出一段程序,我告诉老板它是对的,老板凭什麽相信你说他是对的?因为 CI/CD 工具的仪表板上明明白白显示出,过去这段程序码跑过无数次测试,从来没有出错过,因此他应该要相信这段程序码是对的。

测试要自动化

测试有分很多种,而一切软件工程的根源,就是最基础也最单纯的「单元测试」了。Martin Fowler 曾经拿单元测试与整合测试比较,并给出他认为的定义:「能够独立於所有其他服务或元件而独立运行的测试,就是单元测试,而不管是不是有使用 mock 或 stub 技术...单元测试关注『我们的功能跑起来情况如何』,而整合测试关注『我们的功能与其他元件合作跑起来情况如何』。」

如此一来单元测试定义就简单多了:「验证我手上敲的程序的表现跟我脑中想像的是否一致」。

如果写程序的人都能够附上能佐证正确性的单元测试,那麽确保功能性就简单多了,因为现代的 CI/CD 工具太厉害了,可以随时随地触发,你甚至不用盯着萤幕看,结果出来他会自动通知你。事到如今,能阻碍你写测试的只剩下「你写得多快」了。至於要怎麽快,那就要看你做得多好了。对此,Uncle Bob 都说了:「你唯一能把事情做快的方法,就是把它做好。」

内容列表

本系列文章围绕着单元测试,将会包含以下软件工程概念:

  • 单元测试的基本概念
  • 单元测试与依赖
  • 单元测试的进阶应用
  • 单元测试与重构
  • 单元测试驱动开发 (TDD)
  • 单元测试与 Clean Architecture
  • 单元测试与流程管理

读者从上述列表中不难看出,大家平常常听到的诸多软件工程实践,大多都与单元测试有关。应该说,他们大部分都必须建立在单元测试之上,才能有比较好的发挥。

本系列文章中,需要时都会有程序码辅助理解。读者可以直接下载下来阅读原始码,或是参考着练习。搭配文章一起服用,可达到理论与实践并重的成效。作者期待的效果是,读者未来在掌握诀窍後,在工作上真正能靠它来「加速」,如此一来,想要写测试,就不用非得老板多给时间不可了。

谜之声:「那我们就开始吧!」

Reference

  1. 范例程序码下载点:https://github.com/bearhsu2/ithelp2021.git

<<:  Day 01-Workshop Google Cloud Platform Get-Started

>>:  住建部谈青年买不起租不好房,你在租房还是已购房?

[Day09] still placeholder

写在前面 still placeholder still placeholder still pla...

Day05 | Dart基本介绍 - class、factory

类别 前面说到 Dart 是一个支援OOP的程序语言(附注*),而不同於JS的Prototype-b...

{DAY 22} Pandas 学习笔记part.8

前言 这篇文章主要会提到资料分组 会继续利用kaggle上的开源资料进行更多的pandas练习 Ka...

用资料结构看 evernote - 修改前 - DAY 10

前言 介绍完了资料结构的基本,就用来实际解决一下,自己在记事方面的结构调整。 今天会先整理出自己平常...

Day06-条件判断与列表渲染

v-指令最後一章,就是v-if系列还有v-show, v-show 和v-if不一样的地方在接收到f...