别叫我「开发」,叫我「软件工程师」

2020/06/14 TDD 共 1878 字,约 6 分钟
拔菜集

记得前些年在一个项目的动员大会上,我被叫上去做了一个即兴的英文演讲。具体说了什么我已经忘记了,只记得我总结了一句:Don’t call us developer,call us engineer.

我老板对此似乎印象深刻,很久以后有一次我说:「我们的开发……」,他打断我:「你不是说应该叫工程师吗?」

此篇讲几个很多人习以为常的编程大法,然后让 TDD 告诉你,这些方法是多么的 LOW 。

祈祷式编程:天哪 ~ 他在 DEBUG 自己刚写的代码!

(DEBUG:在 IDE 上启动程序,一行行跟哪里有问题。)

每次看到一个程序员在 DEBUG ,尤其是在 DEBUG 自己刚写的代码时,我的胃就会有一种不适感。

DEBUG 是为了看程序每一步执行的结果,用于定位问题。这边的悖论在于:你若不知道这一行代码执行的结果,你刚才敲下那行代码时,脑子里在想什么?

你当然要争辩了:「谁敲它了?我这不是 copy paste 的吗?」很有勇气的回答。

这边隐含着一种很常见的写代码的方法:copy paste 一段代码,或者试着写一段代码,祈祷它是工作的,然后很有责任心地把它运行起来,看祈祷是否成真。

而 TDD 则是完全相反的一种写代码方法:先想清楚要什么结果,然后写一段代码实现它。

这种在《高效能人士的七个习惯》里提到的以终为始思维,应用在写代码上,会带来什么好处呢?

  • 写完就基本测完了。
  • 基本不需要 DEBUG。定位问题快。

比起写完还要吭呲吭呲测试半天,甚至需要 QA 帮助自己测试半天的人,你的速度和质量,都是胜出一筹的(这不就是加薪的理由吗?)。

比起一行行 DEBUG 代码的人,不说速度吧,至少对眼睛好一点?

当然,想要过上「不 DEBUG」 的生活,不是那么容易的,最重要的一点,你得学会

囫囵吞枣式编程:还没写完,没法测。

假设完成一个功能需要 200 行代码,当开发完成 199 行代码的时候,他会在早会上告诉你:我还没写完,没法测。

假设装修公司在给你装修房子,工期 20 天,他们告诉你:现在才第 19 天,你不能来看装修的情况。你会不会想用板砖呼他?

你当然想在每一天,甚至每一秒,都验收一下他们完成的工作;写代码不也一样吗?

最不济的,当天写的代码,当天就得验收完。如何对代码验收?

  • 通过代码评审。
  • 有测试。

TDD 就厉害了,你每一行(不是每一天)的代码,都有测试。怎么做到?就是拆,把需求拆成 N 个很小的场景,每个小场景先写一个测试,而你的代码,就是实现这个小场景。

装修的例子来说,就是分解成很小的场景:先铺上这一平米的地板,它的验收测试是要平整;然后下一个场景。客户随时可看可验收,而不是制造一个黑盒给你的客户,这是基本的良心。

当你有了一个个小的场景,而每个场景都有一个单元测试时,你的某个失败的单元测试,就可以把问题定位到 10 行代码以内了。

为什么还要 DEBUG?

一把梭编程:斐波那契 BUG 数列

「优秀」的开发团队总是能让自己很忙,修好 1 个 BUG 的同时,会带来 2 个 BUG 。2 个变 3 个,3 个变 5 个……

为啥呢?因为今天的代码无法集成昨天的代码,或者我写的代码无法集成你的代码。

什么叫集成?

不是把代码 merge 到一起就叫集成,那叫一把梭,赌它没有 BUG。

把代码 merge 到一起,并且彼此都有足够完整的测试覆盖,让那些自动化的测试快速告诉我们:merge 到一起的代码仍然是工作的,这才叫集成。

我们先不谈团队,就谈个体:如何确保新写的代码能够集成 1 小时前写的代码?

当然是:1 小时前写的代码,和现在新写的代码,都有足够的测试覆盖了几乎所有的场景。

怎么保证这 1 个小时写的代码,它的 5 个场景都被测试覆盖?

当然是:把 1 个小时分成 5 个 10 分钟。每 10 分钟只实现 1 个场景,然后就提交。

这就是「持续集成」大法:把任务拆到 10 分钟的级别,写一个测试,实现它,提交;然后下一个 10 分钟,写下一个测试,实现它,跑所有单元测试,确保这 10 分钟的代码跟前 10 分钟的代码是能够集成的。如此反复。

团队的成员如果能用这样的工作方法,已经秒杀 90% 的所谓 DEVOPS 团队了。

回到基本功

为啥我要提到 DEVOPS?因为我想顺便提个醒。

教练们在无限拔高 DEVOPS,有一正一邪两个原因:

  • 正者:DEVOPS 是个好东西。上面说的持续集成,就是 DEVOPS 不可或缺的一个实践。
  • 邪者:「敏捷」已经收割不了韭菜了,「DEVOPS」才能收割韭菜。

请君识之。拥抱层出不穷的 BUZZ WORD 的同时,做好朴实的工程实践,基本功决定一切。

我在敲这篇文章的时候,好几次地想:十几年之后,我仍然花那么些时间,絮絮叨叨地讲十几年前就该是「常识」的东西,也不知是我的悲哀,还是这个行业的悲哀?

一个被后浪拍的工程师,于一个闷热的下午。

文档信息

Search

    Table of Contents