本书《独角兽项目:数字化转型时代的开发传奇》是运维名著《凤凰项目:一个IT运维的传奇故事》的姊妹篇,从软件开发人员的角度继续讲述无极限零部件公司的故事。玛克辛是开发主管兼架构师,因公司工资系统事故而被“流放”去做凤凰项目的文档工作。在这样一家刚刚度过百年华诞的老牌公司里,在电子商务已然风生水起的当下,玛克辛能否拯救那个已令数百名开发人员深陷其中的项目?作者在本书中提出“五大理念”,并相信有了这五个理念,企业就能打破壁垒、力排万难,在数字化洪流中力挽狂澜。

第一部分 9 月 3 日~9 月 18 日

尽管她十分注重细节,一心想把事情做好,但是也已经意识到了错误和熵是生活的一部分。她看到了恐惧文化所造成的破坏性影响。在这种文化中,错误的行为通常会受到惩罚,替罪羊会被解雇。惩罚失败和“枪杀信使”只会让人们掩盖自己的错误。最终,所有创新的欲望都会被彻底磨灭。

在技术领域,这司空见惯。当需要向市场快速交付功能、抓住市场机遇或赶上竞争对手时,长时间的工作就会演变成没完没了的工作。在这种情况下,睡在办公桌下要比回家后再马上赶回来容易得多。尽管在盛行的文化中,长时间工作有时被美化了,但玛克辛认为这是某些事情变得非常糟糕的征兆。

当你雇用水管工或木匠时,你希望他们自带工具。但是在一个拥有众多开发人员的软件组织中,整个团队需要使用通用的工具来提高生产力。

第 2 章 9 月 5 日,星期五

玛克辛喜爱编程,而且在这方面做得很棒,但她知道有比代码更重要的东西:使开发人员能够高效工作的系统。这样他们就可以快速而安全地编写高质量的代码,并从妨碍他们解决重要业务问题的事情中解脱出来。

有 100 多名开发人员远远没有达到他们该有的生产力水平。他们艰难地执行常规构建,在开会上花费大把的时间,或者一直在等待他们所需的东西。莎拉的讲话听起来就像一位将军告诉你赢得战争有多么重要,然后却发现所有的士兵都已经被困在港口 3 年了。

第 3 章 9 月 8 日,星期一

仅仅感到忙碌还不行,因为这并不意味着她实际上做了什么有意义的事情。

她喜欢看到别人发挥聪明才智,以及表现出让这个应用程序变得更好的意愿。作为项目的所有者,她把确保每位贡献者都能拥有很高的生产力视为自己的首要职责。

她能够以专注、流动和快乐的状态来创造东西。她的工作很快得到了反馈。人们可以做自己想做的事情,而不需要依赖很多人。这就是伟大的架构所能实现的。她被流放到公司最具战略意义的部门,整个公司的存亡有赖于此。然而,数以百计的工程师都“瘫痪”着,不能做那些本该完成的事情。

第 4 章 9 月 11 日,星期四

开发人员总是把功能特性放在首位,而从来没有清理过产生的技术债务

在职业生涯中,她从未把所有的测试和部署工作甩给别人去做。“如果你无法获取关于如何使用程序的反馈,又怎能创造出有价值的东西呢?”她想。

第 5 章 9 月 11 日,星期四

这就是有效的人际网络的意义所在——你可以召集一群积极的人来解决一个大问题,即使这个团队看起来一点也不像官方组织。

第 6 章 9 月 12 日,星期五

技术故障在整个组织中蔓延,就像海水不断涌进一艘正在沉没的潜水艇一样。

所有这些系统之间的相互纠缠再次让玛克辛的认知力大打折扣。孤立地理解系统的任何部分都是很困难的。

当红衫军在奋力抢救威胁到整艘船的猛烈引擎大火时,舰桥上的军官们还在继续掩盖着自己的错误。有些人甚至利用这次灾难为自己谋取政治利益,经常是为了惩罚那些被认定有失职行为的工程师或整个部门。

每个经理都坚持成为沟通计划的一部分。为什么?因为他们希望首先听到任何坏消息,这样就不会显得脱离大众,并且可以对任何消息进行粉饰。

信任的缺乏和太多嘈杂的信息让事情进展得越来越慢。

“没有持续构建,我们就像一个没有装配线的汽车制造商,任何人都可以做他们想做的一切,而不管工厂的目标是什么。”他继续说,“我们需要在构建或测试过程中发现问题,而不是在部署期间或生产环境上。

第 7 章 9 月 18 日,星期四

在紧耦合和交织的系统中,几乎不可能改变任何东西,因为你不能只改变代码的一个区域,而是必须改变 100 个甚至 1000 个区域。即使最小的变更也会在系统的远端造成难以预料的影响,也许是你从未听说过的影响。

你已经把自己困在一个再也不能轻松解决实际业务问题的工作系统里了。你不得不每天解谜,试图找出该如何进行你的小变更,而交织的系统会阻碍你的每一步。

代码中的局部性使系统保持松耦合,使我们能够更快地交付功能特性。团队可以快速而独立地开发、测试,并把价值传递给客户。在我们的组织中,局部性允许团队在不必与团队之外的人进行沟通和协调的情况下做出决策,而不需要获得远离工作的远端权威或委员会的批准,因为他们没有做出正确决定的相关基础。

你应该能够通过改变一个文件、一个模块、一个服务、一个组件、一个 API 调用、一个容器、一个应用程序,或其他任何东西来创造价值!这就是为什么将横切关注点放在一个地方如此重要,比如日志记录、安全性或重试策略。你只需要集中修改一个地方就可以了。

关于局部性和简单性的第一理念。我们需要做好设计,使系统以及构建它们的组织具有局部性。此外,做任何事情都需要简单性。我们要把复杂性控制在内部,无论是在我们的代码中、组织中,还是在流程中。外部世界已经够复杂的了,所以我们不能容忍复杂性存在于自己可以控制的事物中!我们必须让我们的工作变得容易。

第二理念是专注、流动和快乐。这是关于我们日常工作的感觉。我们的工作是以无聊和等待别人为我们做事为标志吗?我们是否盲目地在整体系统的一小块上工作,只有在部署的时候才看到工作的结果,而这时一切都会崩溃,随之而来的是救火、惩罚和筋疲力尽?还是说,我们小批量地工作——理想情况下是单件流——可以快速且持续地得到工作反馈?这样我们就能保持专注和流动,不断挑战、学习、发现,精通自身领域,甚至变得快乐。

第三理念是改进日常工作。反思丰田安灯拉绳教给我们的东西,必须重视对日常工作的改进,而不是日常工作本身。第四理念是心理安全,我们要让谈论问题变得安全,因为解决问题需要预防,预防需要诚实,而诚实需要摆脱恐惧。在制造业,心理安全与人身安全同样重要。最后,第五理念是以客户为中心,我们要无情地质疑某样东西对客户是否真的重要,比如他们是否愿意付钱给我们,还是只对我们的职能筒仓有价值?

大多数人没有足够的勇气说出他们的想法或做正确的事情。无论同意与否,他们只会说‘是’。但这也许创造了一个机会。

质量保证工作正在发生变化。我们不能一直在事后再进行测试。我们需要参与到游戏中去,这意味着我们应该进入开发团队。开发团队实际负责交付功能特性,但也要对结果的质量负责。其他任何事情都是在浪费我们的时间。

第二部分 9 月 23 日~11 月 9 日

如果程序的其他任何部分都可以随时更改你所依赖的数据,那么预测程序的行为几乎是不可能的。

成为一切事物的中心可能很有趣,但肯定是不可持续的。沿着这条路走下去,等待你的只有无尽的叫醒电话、疲惫、愤世嫉俗和精疲力竭。

技术债务本质上谈不上好坏——它之所以发生,是因为我们在日常工作中总是在做出权衡取舍的决定。

为了赶工期,有时我们会走捷径,或跳过编写自动化测试,或为某个非常具体的情况将代码写死,即便我们知道长期这样是行不通的。有时我们可以容忍每天的应急措施,比如手动创建环境或手动执行部署。在没有意识到这对我们未来的生产力有多大影响时,我们就犯了严重的错误。

如果始终必须与其他 8 个团队合作,那么没有人能完成任何一项工作。

一个世纪以前,当大规模生产使工业发生革命性变化时,领导者的角色是设计和分解工作,并证实工作由大量可互换的工人正确完成。这些工人靠手工劳动而不是脑力劳动来换取报酬。工作被原子化、标准化和优化了。工人们几乎没有能力改善他们所在的系统。

这就是为什么第三理念是改进日常工作。正是这种能动性让我们通过学习来改变和改进我们的工作方式。正如斯蒂芬·斯皮尔博士所说:‘无知是所有问题的根源,唯一能克服它的是学习。’

“出现错误时,我们会问‘是什么原因导致的’,而不是‘是谁导致的’。我们承诺尽一切努力让明天比今天更好。正如约翰·奥斯帕先生所说,每个事故都是一次学习的机会,一次未经同意的计划外投资。“想象一下这样的场景:你所在的组织中,每个人都可以做决定,每天都在解决重要的问题,并把他们学到的东西教给其他人。”

他知道自己不能直接影响每个人的日常工作。然而,史蒂夫可以强化和塑造他想要的价值观和规范,而他也有效地做到了。

第 10 章 9 月 29 日,星期一

之所以痛苦,是因为合并的规模太大了。为了减少痛苦,他们需要更频繁地进行合并,这样合并的规模就会变小,产生的冲突也会更少。

我们甚至不再需要警卫了。我们太喜欢做囚徒了,认为那些栅栏是为了保护我们的安全而设。

这与第三理念恰恰相反,不是改进我们的工作流程,而是盲目地遵循。现在,这个流程完全禁锢了我们,吸走了日常工作中的所有快乐,让我们离第二理念越来越远。

第 12 章 10 月 13 日,星期一

过去的障碍是得到环境——没有人能得到环境,就算得到了,也总有不称心的地方。然后障碍变成了测试,只有当开发完成所有功能特性时才开始测试,而且发现和修复缺陷将花费几周时间,而不是现在的几小时或几天。现在,障碍显而易见变成了部署。他们现在能够快速地将功能特性准备好,但是仍然需要等待几周,运维才能将代码部署到生产环境中。

第 13 章 11 月 6 日,星期四

不管发现了什么,我们都理解并相信每个人都已经全力以赴,只是受限于他们当时所知道的、他们的技能和能力、可用的资源和手头的情况。

“我们先来整理一条时间线,收集线索。为了有所帮助,玛克辛将我们的生产遥测和日志以及聊天室记录整合在了一起,以便提供一个讨论框架。我们的目标是使最接近问题的人能够分享他们所看到的,这样就可以使我们的系统更安全。唯一的规则是,你不能说‘我应该做 X’或‘如果早知道,我就会做 Y’。事后诸葛亮总是明智的。在危机中,我们永远不知道真正在发生什么,而且我们需要为未来做准备。在未来,我们对世界的理解也会同样不完美。”

在接下来的 1 小时里,玛克辛和整个团队整理出了一条非常详细且生动的事件时间线。她再一次惊叹,鉴于日常工作中存在不足和风险,任何事物能在生产环境中运行简直都是奇迹。日志文件的滚动速度快到根本无法阅读,配置设置分散在几十个位置,潜在的故障点隐藏在几乎每个角落和缝隙中,意外也潜伏在每个角落……

“通常,首先需要了解我们的客户是谁,包括当前已有的和期望得到的。然后,我们需要对客户群进行细分,这样就可以知道每个人具体都有什么问题。一旦知道了这一点,就可以根据市场规模了解我们需要解决其中的哪些问题,以及解决这些问题的难易程度,等等。这样,我们就可以考虑定价和包装、优惠品开发和更多的战略性问题,比如产品组合的整体盈利能力及其如何影响战略目标的实现。“我需要每个产品经理都能精通这些。”玛吉继续说,“几乎所有伟大的产品组织都会创建用户画像,这样每个人都能更好地理解和维系所开发产品的用户。这就是我们做了这么多 UX 和人种学研究的原因。对于这些用户画像,我们要明确他们的目标和愿望,找出他们日常问题的来源,并描述他们如何完成日常工作。如果我们做得很好,最终就可以在我们期望的业务成果框架内构建出一组用户故事。我们应该在市场上测试和验证所有这些设想,从中不断学习。”

他说,他认为把问题想清楚很重要。对他来说,把事情写下来可以加强逻辑上的严谨性,而这对领导者来说非常重要。“如果你没有考虑到所有可能的结果,怎么能让一家公司沿着一条战略路径一直走下去呢?”

第三部分 11 月 10 日~现在

团队的名字有助于建立整个团队而非个人的身份标识,而且强化了团队目标比个人目标更重要的观念。

第 15 章 11 月 25 日,星期二

混沌工程是在生产环境中对软件系统进行实验的学科,目的是建立对系统承受动荡和意外情况能力的信心。

有时,很难知道谁在为哪个团队工作,因为人们在团队之间不停奔走。正如埃瑞克所预言的那样,当每个人都清楚目标是什么时,团队就会自我组织起来,以最好地实现这些目标。

惊群问题在计算机科学中是指,如果许多进程在等待一个事件,事件发生后这些进程被唤醒,但只有一个进程能获得 CPU 执行权,其他进程又得被阻塞,从而造成严重的系统上下文切换代价。

她认为我们付钱给开发人员只是为了让他们敲键盘,而不是让他们用头脑思考并达成业务成果。我们应该付钱让员工学习,因为这是我们取胜的方式。你能想象在工作场所禁书吗?

但是对于如此关键的任务,我们不应该依赖外部服务。当它们不工作或断开我们的调用时,我们需要优雅地进行处理。

第 16 章 12 月 5 日,星期五

现金牛(cash cow)指拥有高市场占有率及低预期增长的业务。

“第一视野是你成功的现金牛业务,其中的客户、业务和运营模式是众所周知和可预测的。对你来说,就是你的制造和零售业务,分别占收入的 60% 和 40%。这两项业务的年收入都超过 10 亿美元,却正在遭受竞争对手和颠覆者的猛烈攻击。

“几乎所有业务都会随着时间的推移而衰退,因为任何盈利的业务都会吸引竞争对手。以交易成本降价销售的经济逻辑是不可抗拒和不可避免的。”他说,“这就是第二视野系列业务如此重要的原因,因为它们代表了公司的未来。它们会将公司的能力介绍给新客户,占领相邻的市场,或采用不同的业务模型。这些努力不一定有利润,但能让我们发现高增长领域。雄心勃勃的领导者正是从这里创造出了下一代的第一视野业务。对你们来说,当第二视野业务收入达到 1 亿美元时,这种转变就已经实际发生了。

“你们可能已经猜到了,第二视野业务想法来自于第三视野,而后者的重点是学习速度,以及可供探索的大量创意。在这里,重中之重是原型创意,要能尽快回答关于市场风险、技术风险和业务模型风险的三个问题:创意是否解决了真正的客户需求?技术上可行吗?增长引擎是否在经济效益上可行?如果任何一个问题的答案是否定的,就需要改进或扼杀这个创意。“如果答案是肯定的,就要持续发展这一创意,直到可以成功将其转化为第二视野业务。之后,业务构建者将接手过去。”他停顿了一下,说,“你们明显的问题是,几乎没有第二视野业务,更没有第三视野业务。

“史蒂夫,你的直觉很有用。你知道需要探索第二视野中的机会。你知道第一视野和第三视野天差地别。”他说,“第一视野里的业务发展来自于流程和一致性、规则和合规性,以及官僚化体制,它们造就了非凡的韧性。这些机制让公司能够在几十年内持续地将出色的产品和服务交付给客户。“相反,在第三视野中,你必须走得快,必须不断尝试,必须允许打破统治第一视野的所有规则和流程。”他继续说道,“就像玛吉说的,这是一个快速迭代的过程,要广泛下注,在成功的尝试上加倍投入,直到它们最终演变成第二视野业务。这是新方法形成和被熟练掌握的地方,可能帮助组织生存到下一个世纪。

“史蒂文·斯皮尔博士观察到,你早一天进入市场,往往就可以获得超过数百万美元的额外收入。如果你是第一个进入市场的公司,将获得整个产品类别 50% 的收益。第二名获得 25%,第三名获得 15%。对于再后来的加入者而言,则绝对是在浪费时间和金钱。“速度非常重要。更准确地说,从创意到交付市场的前置时间很重要。不管你处于哪个视野中,现在都是软件时代。几乎所有的商业投资都涉及软件。这意味着我们必须提高开发人员的生产力,正如玛克辛出色完成的那样。”

埃瑞克看了看表,开始收拾东西。“我要告诉你们最后一个警示。第一视野和第三视野经常互相冲突。”他意味深长地向莎拉示意,“如果不加以控制,第一视野的领导者将耗光公司的所有资源。他们会正确地意识到自己是公司的命脉,但这只是暂时的。人们会本能地将利润最大化,从现有业务中榨取资金,而不是进行再投资。这是‘价值管理’的论点,与‘增长管理’对立。史蒂夫,如果你想发展,必须保护好第二视野和第三视野,任何由此产生的经验都必须传播到整个公司。”

第 17 章 12 月 12 日,星期五

霍尔原则(Hoare principle):“写代码有两种方法:写得非常简单,显而易见没有 bug;写得非常复杂,没有显而易见的 bug。”

既然裁员目标已经设定,每个人都将首先捍卫自己的地盘,努力保住自己的那份蛋糕。一旦分配达成一致,每个人都会提出一份名单,列出要淘汰的人员。然后他们必须决定是莎莉比山姆更重要,还是山姆比莎莉更重要。

为了避免亏损,我们不得不出售一些资产来变现。但这就像卖掉家具来支付抵押贷款一样。最终,能卖的东西都卖光了,你也无法再为日常运营提供资金,这意味着解雇更多的员工。“另一个极端是,你可以选择建立一个成长型的公司。就像我说的,如果不成长,你就会慢慢死掉。

更简单的做法是按照董事会的指示行事。但正确的做法是确保让创新项目得到机会。虽然感觉很糟糕,但是站在领导者的角度上看,进一步削减开支毫无疑问是正确的,因为它创造了一条通向长期增长的潜在道路。

许多企业了解这三个视野,但仍然无法适当地投资于下一代创新。换句话说,他们在核心上投资不足,因为受到了非核心业务的控制。“核心是组织的核心能力,是客户愿意付钱换取的能力,也是使投资者奖励的能力。”他说,“非核心是其余的一切,包括员工餐厅、办公楼之间的摆渡车,以及公司运营必须要做的成千上万件事。它们通常很关键,比如人力资源、薪酬系统和电子邮件。但是我们的客户不会因为我们为员工提供出色的薪酬服务而付钱给我们。

“没有恰当地管理好非核心,被摩尔先生称为大公司的杀戮场(killing ground)。那些被非核心压得喘不过气的公司无法正确地投资于核心业务。公司转型需要好的策略,但也需要无情的专注和坚韧。”

“我希望你和技术团队深入思考第五理念,找出可以摆脱负担的非核心,将自己从数十年的技术债务中解脱出来。想象一下,没有这些事情的拖累,你们能做什么。尽管短期内可能会更痛苦,但从长期来看,你们会发现一些意想不到的、至关重要的好处。

想象一下,你可以让几十年的技术债务消失,可以摆脱建立在糟糕业务流程之上的糟糕自动化。”他说,“想象一下,如果你能有意识地、主动地选择放弃什么,然后把时间和精力花在需要的地方,会是什么感觉。迪克知道,简单能提高效率,复杂则会降低效率。你们的内部系统和流程目前会在多大程度上阻碍你们完成工作?

第 19 章 1 月 13 日,星期二

史蒂夫通过宣布他将亲身参与,实实在在地做出表率来减少学习新东西时的尴尬。领导者必须以身作则,示范他们期望的行为模式。