简评:这是一个有趣的故事。故事的场景有可能你在身上出现过(如果你是个有洁癖的程序员的话)。故事写得很有意思,也很风趣,但最后讲了一个道理。
这个事故似曾相识。
你的代码很优雅。
你有恰到好处的抽象。
你写的模块是模块化了的。
你的系统与外界的接口是经过深思熟虑的,对外部系统没有直接的依赖。
你的测试都是绿的。你的代码覆盖率报告要花一整分钟加载,比率是 97%。
生活很美好。
然后,就发生了这事。
一个产品经理跑进来告诉你,上周你你发布的更新里有个 Bug。当用户往购物车里添加一个项目时,购物车里项目的数量需要几秒钟才能更新过来。之前是即时更新的。
这个产品经理与你说用户的抱怨像潮水般涌来。他问你:你能帮忙看看么?
当然你可以看看。毕竟,这个事情是你干的。这可能是其他的错。但是你决定搞定它。这只是你是那种独当一面的员工。
你把 Git 库最新发布版本的提交拉下来,钻研起来变更日志。你在最新的发布版本里把 HTTP 请求库更新到了最新版本。这事已经被推迟了很长时间。你还记得具体做这个变更的确切的提交。那是个美好的日子。
你切换到那个提交,然后模拟更新购物车的请求。好情况是你在关注点上做了很清晰的分离,所以你很容易就能够通过一个 Build 标志位来切换到模拟服务器端进行测试。
你找到了元凶。看起来你使用的 HTTP 库的更新版本有一个退化。对于某种特定类型的请求,它要花费很长的时间来解析 JSON 请求数据。你的 App 要等到请求被解析完成才来更新界面上的购物车统计数字。架构上还没有支持最终一致性,要加上的话将影响到整个项目。你不能只是更新本地的统计数字之后再同步。你知道这是其他人的错。这就是生活。
你告诉这个产品经理发生了什么事情。他拍了下你的后背。他知道他可以指望你。你知道如何修复吧?
当然。
你考虑了你的选项。
你不能回滚这个改变。很多新代码与 Bug 修复依赖于这个新的库版本。如果只是简单地回滚,你将丢失所有这些变更。
只是简单地 Fork 这个库维护自己分支貌似也不明智。原项目的维护人员有一个巨大的测试框架,那可以基于上千的设备来测试你的修复。你有 3 个设备,其中 2 个还是老版本。也最好能够得到他们的反馈。这毕竟是他们的库,他们对其内部结构了如指掌,你而不是。
所以,你准备:
· Fork 这个库。
· 实现这个修复。
· 对原库发起一个 Pull Request。
· 你与维护者反复地交流,一点点地确认。
· 最终说服维护者接收你的主意是最好的。
· 合并主分支。
· 等待这个库的补丁版本。
· 把库更新到你的代码里。
· 发布一个新版本。
易如反掌。
「好棒,」产品经理说,「你认为这需要花多少时间?」
你知道答案。人们总说工程师不会估计时间。你不是这种工程师。
「2 周,」你毫不犹豫地说。「取决于这个 PR 有多快会被接受,与维护者发布新版本的速度。」
产品经理的脸立马变色了。「2 个星期?2 个星期?」他像要改变什么似的喃喃自语。但你保持安静。产品经理没有意外地勃然大怒了。没有什么可担心的。
「我们的用户要丢失了!他们不会买任何东西,因为他们看不到购物车有更新!我们是一个电商公司!这是不可以接收的!」
你看着他经历 5 阶段的悲伤。你等着接受的时刻来临。没有来。他看起来陷入了讨价还价模式。
「没有你可以修复得更快的办法吗?临时方案?来吧!这是最重要的!」
「好吧,」你说,沉入你的旋转坐椅里。「让我看看。」
你准备迁就一下他。也许一会儿他就让你一个人呆着了。你知道,你会去做其他的事情。
你再次钻研到代码里。这是你的特长。你的手指按着 IDE 快捷键飞舞,就像波寒冬(希腊神话中的海神)自己骑着海的波浪。
啊哈!你发现了。有一个没有文档写出来的方法来为 JSON 解析代码加一个钩子,替换为你自己的实现。
但是,等等。这看起来有点丑陋。这是一个非开放的 API。可能是被错误地暴露出来的。你不想依赖于这个。他们下个版本移除了怎么办?你将需要重做一次。谁想干那事啊?然而这个比维护自己的未经测试的分支更快。但这是丑陋的。
No.
你不愿意让误导的业务决策毁了你的纯洁的殿堂。你是所有神圣事物的守护人,要反对愚昧的大众。那是他们付给你大价钱的原因。你有责任拒绝。
你冲进产品经理的小屋。「答案是 No。没有这么做(临时方案)的整洁的方法,我不相信丑陋的 Hack。对不起。」
他的反应可想而知。
「你在与我说有办法,但是你不想去做,只是因为这不整洁?我们的用户正对我们吼叫着,威胁要切换到竞争对手那里,而你不愿意修复,仅仅因为这(方案)不整洁?」
你无语。
这家伙了解工程么?你在基于比特从无到有地构建虚拟的世界。高度扩展的系统能够抵挡来自于东方集团的所有的黑帽的 DDos 攻击。你是个艺术家,硅片是你的画布。你读过 Clean Code 很多遍,以至于你了解它超过你的 Github 密码。
「是的!」你大声喊着。「我不想让这坨屎污染了我们的代码库!我花了数月的时间来构建这个!每行代码都是我的心血!所有事情根本上运转正常的唯一原因不是因为你 - 尽管是你!是我这样的人在维护软件在运行,是我这样的人在你或者你们的业务特性很长时间以后来清理这些混乱!」
你叫完了。你需要喝点。像这样的家伙是行业的祸害。他们以为昂贵的 MBA 会赋予他们构建伟大软件的洞察力,而我们开发人员则被他们忽视。去他们的。
你趾高气扬地去到自助餐厅。你每天都在那里享受美味可口的食物。以及咖啡。没有限制,美味的,滋养灵魂的咖啡。你应得这个,因为你是一个知识工人。
你拿起一杯 Java,正找个地方坐下来。
这时你注意到了他。
你们公司最牛 B 的工程师。
这家伙是个地道的、专家级的,用上厕所的时间能够写出编译器的,这种类型的工程师。在黑客未出现之前他就是黑客。你想成为这个家伙这样的人。他有些像甘道夫(北欧神话人物)。被每个人同时尊敬着、害怕着。但他是善良的,经常帮助小孩。他乐于听到你说如果搞定那个 PM。毕竟,他是你一样的人。
于是,你坐在他旁边。他正照看着他的咖啡,在阅读 Haskell 抽象数据类型相关的内容。
是的。正好与这个家伙聊聊。
你告诉他这个重要的事情。他耐心地听着。他点着头在几个点上问了些问题。他的身体往后靠,之前就是这样坐着的。你能在他的眼睛里看到它。
你最后说完了。
那是个让人精疲力竭的事情。
你的双肩感觉到轻松了。
我看起来在深入思考,好像他在仔细地组织语言。
你等着大笑。他会大声地说道「That’s my boy!」,然后你们将一起去再倒杯咖啡。他将会讲另外一个类似的故事。
你梦想着这天。你将把你的咖啡杯捣烂在一块,就像胜利后的男人干的那样。至少,在电影里他们是这么干的。当然,那通常是麦芽酒,而不是咖啡。
你等着。。。
等着更多的。。。
他直看着你的眼睛。这看到你内心里去了。多少年与机器打交道使得他的注视很锐利。但他散发着迷人的力量。你目不转睛。
「我们的工作不是喝咖啡、折腾代码。我们的工作是创造能够运行的软件。」
然后,他走开了。
你愣住了一分钟。在胃里边有个感觉。一个空的,令人呕吐的感觉。
你开始重新认识这个感觉。你感觉羞愧。
你辜负了你欠得最多的人。你的客户。
于是你回去你的桌子上。你匆匆搞定这个 Hack,然后发出了新的版本。
你向那个 PM 道歉。事情变得有点失控。他说没事。所有事情都进展顺利,结果也好。
你也 fork 了这个库,实现了正确的修复,发出了主库的 PR。当库的新版本出来时,你总是可以重构的。
喂,产品经理喊你回来改Bug
发表于:2017-01-09
作者:极光日报
来源:
- 周排行
- 月排行
-   高质量的缺陷分析:让自己少写 bug
-   缺陷是什么?
-   从“扁鹊三兄弟”谈缺陷预防
-   如何编写更佳的bug report
-   软件缺陷的描述
-   怎么用Leangoo管理Bug
-   面对Bug的正确姿势
-   实例!软件缺陷数据度量和分析
-   缺陷是什么?
-   高质量的缺陷分析:让自己少写 bug
-   史上最臭名昭著五大软件Bug
-   多种缺陷管理软件简介
-   游戏测试中缺陷的分类
-   消灭Bug秘籍:如何处理大型软件中的错...