简评:这是一个有趣的故事。故事的场景有可能你在身上出现过(如果你是个有洁癖的程序员的话)。故事写得很有意思,也很风趣,但后讲了一个道理。
  这个事故似曾相识。
  你的代码很优雅。
  你有恰到好处的抽象。
  你写的模块是模块化了的。
  你的系统与外界的接口是经过深思熟虑的,对外部系统没有直接的依赖。
  你的测试都是绿的。你的代码覆盖率报告要花一整分钟加载,比率是 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 抽象数据类型相关的内容。
  是的。正好与这个家伙聊聊。
  你告诉他这个重要的事情。他耐心地听着。他点着头在几个点上问了些问题。他的身体往后靠,之前是这样坐着的。你能在他的眼睛里看到它。