当我们创立 KeepFlow 时,我们面对着每一个技术团队在起点都会面对的选择:为客户开发软件,还是打造归自己所有的软件。代理商这条路更安全。客户在交付时付款,收入可预期,而一个项目一旦上线,它就成了别人的问题。我们刻意选择了更难走的那条路。KeepFlow 做出的每一款产品,我们都自始至终地拥有——我们打造它,我们运营它,并在它存在的整个期间与每一个决定长久相伴。

这不是一句品牌口号。它切实地改变了工程的运作方式,而其中的种种,我们花了好一阵子才真正体会透彻。以下就是“拥有”对你构建方式所做的一切。

当关系不在交付时终结

客户工作最典型的特征,是它有一个结尾。你界定一个项目的范围,把它做出来,交付出去,关系随之结束。此后那份软件遭遇什么——在真实负载下浮现的 bug、性能悬崖、那个永远没被打上的安全补丁——如今都归别人了。你已经转向了下一份合同。

拥有你自己的产品,则抹去了这个结尾。没有交接,没有哪个时刻会让代码不再是你的问题。这听上去像一副担子,某些日子里它确实是。但它也抹去了软件中最大的那个捷径之源:那份“反正处理后果的不会是我”的笃定。当没有出口时,抄一条近路并不是在省时间——而是在给自己放一笔带息的债,而还债的正是你自己。

每一个 bug 都是你的 bug

最直接的影响落在问责上,而且它一点也不抽象。KeepFlow 产品里的每一个 bug,都是我们的 bug。每一次性能退化,都显现在我们自己的数字里。每一位沮丧的用户,都是对我们所做工作的一份直接判决。没有别人可以把工单甩过去。

这推倒了大多数软件组织耗费巨大精力去维护的一堵墙——写软件的人与运营软件的人之间的那堵墙。在 KeepFlow,这是同一批人。构建了某项功能的工程师,就是那个在生产环境里盯着它、在它凌晨三点告警时响应、并读着用户对它评价的人。

这套安排在设计上就令人不适,而这正是它的用意所在。当发布代码的人就是被它半夜叫醒的人,围绕质量的那些激励,就不再是你得靠流程去强制推行的东西。没有人愿意在凌晨三点调试自己抄的那条近路。第一次就把它做对的压力,来自工作的结构本身,而非来自一份政策文件。

为漫长的一生、而非为截止日期而构建

客户项目围绕截止日期来组织。自有产品则围绕漫长的一生来组织,而这个差别会伸进那些表面看来一模一样、结果却截然相反的技术决策之中。

当你构建的是一个你将运营数年的东西时,几乎每一个选择的算计都会反转过来:

  • 你会预先在可观测性上投入,因为凌晨两点盯着仪表盘的正是你自己,而一个你看不进去的系统,就是一个你运营不了的系统。
  • 你会写下那些在截止日期压力下你会忍不住跳过的测试,因为两年后回来改动这段代码的正是你自己,那时你早已忘了它是怎么运作的。
  • 你会选择乏味而经过验证的技术,而非那个激动人心的新框架,因为你正签约要把这个决定维护上很长一段时间,而一旦热度散去,新奇之物往往会摇身变成一份负债。

这些选择没有一个能帮你在本季度更快地发布。可一旦你的时间视野以年、而非以周来衡量,它们就全都显然是正确的。客户工作很少奖励它们,因为做出这个权衡的人,并不是那个继承其代价的人。而“拥有”,把这两个人合成了同一个人。

反馈闭环合拢了

还有一个更微妙的好处,我们花了更久才注意到:当你拥有这款产品时,从一位用户的问题到它的修复之间的那个闭环会急剧缩短,因为中间不再横着一纸合同。

在代理商工作里,了解到关于用户的某件事,往往是一场谈判的开端。你注意到一个摩擦点,可要对它有所动作,就意味着一份变更请求、一场界定范围的对话、一份新的工作说明书——而等这一切尘埃落定,那份洞见早已过期。这套经济账主动地劝阻你去践行所学,因为每一处改进都可计费,因而都会引发争执。

而当产品是你自己的,注意到与修复它,是同一个动作。一位工程师读了一条客服会话,认出了三则投诉背后的那个共同模式,当天下午就把修复发布了出去——没有审批链,没有账单,没有关于“这算不算在范围内”的争论。离问题最近的人,既有理解它的上下文,也有解决它的权限。数月之下,这些微小而畅通无阻的改进不断累积,正是这一点,把一款人们勉强忍受的产品与一款人们赖以为生的产品区分开来。

它也改变了我们一开始去构建什么。因为我们运营着自己做出的一切,所以在任何用户上报之前,我们就先一步感受到自己缺失的功能。我们产品中好几处最锋利的东西,最初都源于我们中某个人在同一个团队里运营另一款产品时撞上的一点恼火。当你自己最挑剔的客户,是任何客户简报都买不来的一种调研。

不追逐潮流

这个行业里有一种诱惑,就是把最新的东西当成最好的东西——在任何当红的框架上推倒重建,去追逐那个正在四处流传的架构模式。我们努力抵抗它,而“拥有”让这件事更容易,因为我们会切身承受自己所追逐的每一股潮流的全部代价。一次今年时髦的重写,是我们此后五年要背负的一份维护负担。

我们转而构建的,是企业每天赖以运转的基础设施:必须给出答复的客户支持、必须准确无误的反欺诈、必须迅捷的内容审核,以及人们伸手就用、却不去想底下是什么的工具。那一类软件靠的是缓慢地赢得信任,靠的是那些乏味的德行——可靠、一致、准时现身并正常运作。这些德行并不来自新奇,它们来自对某样东西上心得足够久,久到把它做对,然后留下来,让它一直如此。

这就是我们打造自己产品的全部缘由。不是因为它更容易——它并不容易——而是因为与自己的决定长久相伴,是我们所知的、做出好决定的最可靠的方式。