作者归档:admin

《微信背后的产品观》中张小龙给了研发同学 3 点建议

一直说要把《微信背后的产品观》这本书看完,一直没顾得上,这次临时出差到厦门的路上带上了,动车上的时间把书看完了,去的时候看了一遍,回的时候看了一遍,看完,写下这篇文章。

这本与其说是书,不如说是演讲实录。书的内容来源自张小龙在 2012 年的那次著名的 8 小时演讲,2016 年被整理成书稿,在 2021 年决定出版。好的内容是经得起时间考验的,在 9 年之后出版,在 12 年后的今天来看也不过时,甚至部分观点会刷新我们的一些认知。

以下是我在读这本书的过程感受比较强烈的三个观点或建议。

1 如果解决方案非常复杂,一定是问题错了。

这是从一个开发能力很强很全面的在朋友圈抱怨:「觉得微信的代码越来越复杂了,开始搞不定了」,张小龙在下面评论说:「如果一个问题的解决方案太复杂,一定是问题本身错了。事实上就是这样子的。

一个好的问题不应该导致解决方案太复杂。

从研发的角度来看,引申出来有 3 点:

1. 如果解决方案非常复杂,一定是问题错了或者是需求有问题

很多时候,我们在面对一个问题时,容易陷入复杂的解决方案中或者限入为了解决问题而解决问题。但其实当一个解决方案变得非常复杂时,我们应该反思问题的提法是否正确,需求是否是真正的需求。一个好的问题应该能够用一个相对简洁优雅的方案去解决。

陷入困境时我们要学会换个角度或者跳出问题来思考问题。当感到解决方案过于复杂时,不妨退一步问问自己,是不是对需求或问题有误解,有没有更本质更简单的诉求。化繁为简,用简单的方法解决问题,是一种智慧。

2. 优秀的工程师其实可以帮助产品经理矫正需求

产品经理提出的需求,研发同学往往会无条件去满足。但优秀的工程师,应该具备产品思维,有能力去审视和质疑需求背后的逻辑,去引导产品经理矫正需求。

一味地满足需求,只会让产品变得复杂和庞大。优秀的工程师应该成为产品经理的思想伙伴,而不仅仅是执行者。在开发过程中提出合理化建议,做有价值的事,把控产品的定位和走向,这是更高境界的工程师素养。

3. 写代码只是其次,思考和讨论产品也是重要的工作

作为研发同学,不能把自己局限在写代码上。思考产品,了解用户,参与需求讨论,才能真正驱动产品的进步。

代码只是工具,而洞察需求,理解人性,思考产品形态,决定产品体验,这些应该是每一个研发同学的内功。要把自己的视野拓展到产品层面,主动去思考为什么做这个功能、用户会喜欢吗、还能怎么改进体验。唯有这样,才能成为真正优秀的工程师。

2 抽象方能化繁为简

这个观点应该是大部分场景下面,研发同学都认同的。

当面对大量繁杂的需求时,与其逐一满足,不如试图提炼出其中的共性和本质,将之抽象为更少量、更高层次的需求。这个过程就是「抽象」。

以订阅内容为例,如果把各类内容提供方(如企业、个人、媒体等)的形形色色的诉求都一一满足,系统必然会变得非常复杂。但若能抽象出一个统一的账号体系和内容载体,就能用一套接口来服务各方,大大简化了系统。

抽象的层次越高,派生出的子需求就越多。比如将 100 个需求抽象、归纳为 10 个,甚至 1 个,则原本的 100 个需求都可以被这 10 个或 1 个「母需求」所覆盖。

要做好抽象,关键是要找准需求的共性、本质之处,即所谓的不变量,而非沉陷于各自差异化的细枝末节。唯有升维思考,才能在更高层次上对繁复的事物进行归纳和简化。

通过「以简御繁」「归一化」的抽象思路,可以大大降低系统复杂度,提升开发和管理效率。同时让产品对用户更加友好,使用更加简单统一。

这种化繁为简的抽象思维,是一种非常重要的思考方式和设计原则,对于管理大型复杂系统、满足多元需求有重要指导意义。不仅开发人员要掌握,其他非技术人员也很有必要学习这种思维方式。

3 改变旧世界的意愿

在书中,改变旧世界的意愿是在气质篇的第一篇,从其定义上更多的是一些日常记录的点。

在「改变旧世界的意愿」这一点上,张小龙提到了自己:「对于对iPhone5的唯一期待是,像iPad(3G)一样,不支持电话功能。这样,我少了电话费,但你可以用kik跟我短信,用 googlevoice跟我通话,用 facetime 跟我视频。」

做一个产品,意愿是很重要的。我们有没有去一个改变旧世界的意愿

作为一个研发团队的管理者,改变旧世界的意愿是一个团队管理中的核心逻辑。上次和小帅聊天,也有聊到我们在团队管理岗上,我们始终应该改变点什么

「改变旧世界」的意愿,本质上是一种创新驱动和价值追求。它意味着不满足于现状,主动去探索和尝试新的可能性,并以之来重塑既有的产品形态、技术架构乃至商业模式。这种意愿需要从管理者开始,成为团队的共识和愿景,并指引技术决策和项目实践的方向。

技术管理者需要与团队一起,去思考如何用技术的力量去创造更多的附加价值,解决用户和业务的痛点。要审视自己的产品定位和技术路线,看是否还有优化和颠覆的空间。同时要放眼行业前沿和未来趋势,去探索下一个风口和变革点。唯有确立了明确的变革方向和价值诉求,才能凝聚共识,激发动力。

事实上,很多时候阻碍我们「改变旧世界」的,恰恰是技术和架构层面的「旧世界」。长期累积下来的历史债务,割裂的系统,低效的架构,过时的技术栈,都成为了创新的桎梏。团队往往需要耗费大量时间和精力在修修补补和「打补丁」上,而无暇去思考和实现变革。

这就需要技术管理者下定决心,带领团队去正视和解决技术债务。要客观评估既有系统的健康度,识别出最急需重构和升级的部分。同时要重新思考整个技术架构,看如何通过解耦、重构、引入新技术等手段,来提升系统的灵活性、可扩展性和创新友好度。只有在架构层面打好基础,才能为变革扫清障碍。

除了对技术、架构、债务的改变,「改变旧世界」的意愿,还需要适配研发团队的现状和组织形态。如果团队长期处于产品需求的压力之下,缺乏思考和探索的时间;如果组织过于层级化和官僚化,创新的想法很难被听到和采纳;如果绩效考核过于短视和功利,大家不愿承担变革的风险,那么这种意愿就很难真正落地。

技术管理者需要为团队争取一定的自主权和探索空间。在项目排期和任务分配上,要预留出一定比例的「创新时间」或者技术时间,鼓励大家尝试新的 idea。同时要优化组织架构和流程,让信息和想法能够更顺畅地在团队中流动,减少决策链路,提升反应速度。绩效评估也要将创新和长期价值纳入考量,为「改变」提供合理的回报。

从技术管理者自身来说,站在产品和技术实现交汇的点上,对产品的认知和对实现细节的认知让研发管理可以更高效,更合理的决策技术方案和产品规划,从而更好地引领技术团队实现产品价值和商业目标。

作为管理者,要具备产品视角和技术视角的双重思维,一方面深入了解业务需求和用户痛点,另一方面洞悉技术方案的可行性和优劣。要善于在两个视角之间切换和权衡,找到既能满足需求,又能控制成本和风险的平衡点。也要能跳出具体实现,从更宏观的层面去思考技术战略和产品演进路径,看清下一步的发力点和布局方向。

在具体的实践过程中,技术管理者需要深入了解产品需求的来龙去脉。不能仅停留在需求文档上,而要主动与产品经理甚至客户沟通,理解需求背后的业务逻辑、用户痛点和产品价值。唯有对需求有了全面的认知,才能在技术选型、架构设计、任务拆分等环节做出正确的决策。

同时,技术管理者要对技术实现有足够的了解。这并不意味着要事无巨细地参与到每一行代码中,而是要对关键技术难点、潜在风险、优化方向等有把握。要与技术骨干保持频繁的讨论,时刻掌握开发进度和问题。只有将宏观的需求理解和微观的实现细节结合起来,才能站在全局的高度去调配资源、优化流程、控制质量。

管理者要营造产品和研发的良性互动。鼓励研发团队主动了解业务,引导产品经理关注技术价值,提倡双方同理共情、互相成就。打造一种「产品驱动研发,研发反哺产品」的良性循环,激发团队斗志,凝聚团队向心力。

小结

以书中提到的微信 4.0.1 和 4.2 发布时的文案作为本篇文章的结尾:

很喜欢这句话:如你所知,微信不只是一个聊天工具;如你所见,微信,是一个生活方式。

你曾经在微博上虚掷光阴
如今又在微信里蹉跎岁月
你以为通过手机就连接了世界,
其实只是躲在屏幕后面获取了安全感。
是时候放下手机,和朋友面对面了!
如若不能,试试微信视频通话
少发微信,多和朋友见见面!

备份之道:企业如何构筑防灾屏障

2017 年 1 月 31 日晚上,GitLab.com 运维人员在深夜进行数据库维护时,由于疲劳操作失误,使用 rm -rf 命令错误地删除了约300GB的生产环境数据。在意识到错误并尝试恢复时,只有 4.5GB 的数据得以保留。GitLab.com 官方在 2 月 1 日凌晨 1 点左右完成了数据恢复,网站恢复正常访问。恢复过程中使用的是故障发生前 6 个小时的备份数据,因此在这 6 个小时内的数据丢失。尽管 GitLab.com 声称拥有五重备份机制,包括常规备份、自动同步、LVM 快照、Azure 备份和 S3 备份,但在这次事件中,所有备份均未能有效防止数据丢失。

2023 年 10 月 23 日,语雀服务出现了一次重大故障,中断时间超过 7 小时。具体来说,这次故障的起因是在执行系统升级操作期间,新的运维升级工具出现了 bug,导致华东地区生产环境的存储服务器被误下线。由于存储系统使用的机器类别过于陈旧,无法直接将其上线,这导致了恢复过程时间延长。尽管语雀的工程师们立刻进行了恢复工作,但由于数据量大,恢复方案有限,恢复过程耗时 4 小时,数据检验耗时耗时 2 小时。

在这些个案例中我们看到了什么问题?

备份不可用,恢复方案有限,恢复备份数据长,数据丢失等等,有点平时说起来很强大很完善,真有大事就扛不住了。

所以,今天聊聊备份,不局限于数据备份。

作为一名从业多年的老兵,我们深知备份的重要性,它事关系统的安全、业务的连续性和数据的完整性,可以说是任何系统不可或缺的一部分。

行业内有一句话:「备份不做,日子甭过

1 为什么需要备份

我们为什么需要去做备份呢?主要有以下几点原因:

1.保证数据安全:在信息时代,数据已经成为企业和个人最宝贵的资产之一。而各种硬件故障、人为错误、网络攻击、自然灾害等都可能导致数据丢失或损坏。定期备份数据,可以最大限度地降低数据丢失的风险,即使遇到问题,也可以从备份中恢复数据,将损失降到最低。

2.防范风险,确保业务连续性:对于企业来说,IT 系统的可用性直接关系到业务的正常运转。一旦关键系统发生故障,没有可用的备份,就可能导致业务中断,带来巨大的经济损失和声誉影响。而有了完善的备份和灾备机制,即使发生故障,也可以快速恢复系统,确保业务连续性。

3.满足合规性要求:在某些行业,比如金融、医疗、政府部门等,由于涉及敏感数据和关键业务,往往有严格的合规性要求,需要有完善的备份存档机制。定期备份数据、留存备份一定时间都是合规性的硬性规定。没有备份,可能面临违规处罚的风险。

4.提高竞争力:在当今数字化时代,数据已经成为企业的核心竞争力。拥有完善的备份和容灾能力,意味着企业能够更好地保护和利用数据,从数据中提炼价值,增强市场竞争力。同时,这种能力也能提升客户信任,赢得更多业务机会。比如信息产品安全等级资格认证三级认证需要:本地备份与恢复+异地数据实时备份+本地业务高可用

2 备份什么

看到备份这个词,马上能想到的就是数据备份,数据库备份这些,这些固然重要,但如果你作为一个企业的技术负责人所考虑的备份就不仅仅是这些了,以下是常见的需要备份的内容。

2.1 业务数据

业务数据是备份的重中之重。

对企业来说,最需要备份的就是各种业务数据:

  1. 数据库:销售数据、客户数据、财务数据……这些数据通常存储在 Oracle、MySQL 等数据库中,是企业的核心资产,必须优先备份。如果用的是云数据库,云数据库虽然有一定的冗余,但我们仍需有自己备份数据逻辑。
  2. 文件数据:合同、报表、设计图、多媒体素材等形式多样的非结构化数据,也包含了大量的业务信息,切不可轻视。
  3. 应用数据:ERP、CRM、OA 等业务系统中的数据,与业务流程紧密相关,也需要专门备份。

2.2 系统数据

系统数据是保证业务连续性的关键

除了业务数据,我们还要备份各种系统层面的数据:

  1. 操作系统:Windows、Linux 的系统盘,包含了服务器的重要配置,一定要定期备份,特别有一些特殊的配置,最好是有一个内部的 DevOps 系统来承接。
  2. 虚拟机:很多业务系统部署在虚拟机上,备份整个虚拟机可以实现快速恢复,如果用的是云服务,境像的备份是一个标准操作。

2.3 配置数据

配置数据是还原系统的关键

系统的各种配置也需要备份,主要包括:

  1. 应用配置:各个业务系统的配置参数,如果丢失,恢复系统将非常困难。如果应用配置是存储在一个配置信息中,那就需要对这个系统做备份,包括上面的数据备份。
  2. 网络配置:交换机、路由器、防火墙等网络设备的配置,对维持业务连续性至关重要。
  3. 安全配置:防病毒、访问控制等安全系统的配置,攸关企业信息安全。

2.4 代码、文档和日志

代码、文档和日志主要是对研发团队来说的,对于软件企业或开发部门,代码和文档是核心资产,日志是问题定位,监控审计的利器:

  1. 源代码:软件的生命线,必须做好版本管理和备份。
  2. 开发文档:需求、设计、接口等文档,是沟通和维护的基础。
  3. 日志:系统和应用的各种日志数据,虽然不直接服务于业务,但对问题定位和事后审计很有价值
    1. 系统日志:记录了系统的运行状况和重大事件。
    2. 应用日志:反映了业务系统的运转细节和潜在问题。
    3. 审计日志:涉及敏感操作和数据访问,对合规和安全审计非常重要。

2.5 第三方服务

我们很多应用会调用第三方提供的服务,如支付、短信、社交登录、地图等。虽然这些服务由第三方负责运维,但作为调用方,我们也需要做一些防范:

  • 服务冗余:对于关键服务,不要依赖单一供应商,要有备选方案。比如支付可以同时接入支付宝和微信支付,短信可以同时使用两家供应商等。这样即使一家出问题,也可以快速切换。
  • 数据备份:有些第三方服务可能会存储我们的业务数据,比如客服系统中的客户对话记录。这部分数据最好在自己的系统中也保留一份,定期从第三方服务同步,这样即使第三方服务数据丢失,我们也不会受太大影响。
  • 接口契约:和第三方服务的调用要有明确的接口契约,包括接口规范、SLA等。这些内容要备份保存,一旦第三方服务变更接口或者停止服务,我们可以据此追究责任。
  • 替代预案:要评估每个第三方服务的可替代性,制定替代预案。一旦服务长时间不可用,我们要能够快速启动替代方案,比如临时切换到备用供应商,或者使用本地降级方案等。

除此之外,对于调用第三方服务的 API 密钥、账号密码等敏感信息,要安全备份,防止丢失。

以上就是企业需要备份的主要内容。当然,具体到每个企业,还要根据自身业务特点和 IT 架构来定制备份方案。我们需要全面梳理数据资产,评估数据的重要性和变更频率,搭建分层的备份体系。

3 如何备份

3.1 备份的 3-2-1 原则

在备份领域,有一个著名的 3-2-1 原则,包括:

  • 至少保留 3 个副本
  • 使用 2 种不同的存储介质
  • 将 1 个副本存放在异地

这个原则看似简单,却涵盖了备份的关键要点:

  • 多副本可以应对副本损坏的风险,是冗余的基本保证;
  • 多介质可规避单一介质故障的影响,比如同时使用磁盘和磁带;
  • 异地存放可以防范本地灾难,是灾备的必要手段。

在实践中,我们要根据数据的重要性和预算,灵活采用 3-2-1 原则。比如增加副本数量、类型,利用多个异地机房,甚至上云备份等。

3.2 备份的分类和技术

备份主要可以分为几类:

  1. 完全备份与增量备份

    1. 完全备份每次对整个数据集做一个完整的备份,优点是恢复简单,缺点是备份时间长、空间占用大
    2. 增量备份则是在上一次完全备份的基础上,只备份变化的数据,备份时间短,空间利用率高,但恢复时需要依次应用所有的增量包,略显复杂。
  2. 物理备份与逻辑备份

    1. 物理备份在底层复制数据文件,对文件系统/磁盘做快照,优点是简单高效,缺点是与平台/格式绑定,缺乏可读性。
    2. 逻辑备份是从上层应用备份数据,比如 SQL dump,优点是与存储解耦,可读性好,易于编辑和跨平台迁移,缺点是备份恢复速度慢。
  3. 冷备份、温备份与热备份:这主要是指备份过程对业务的影响程度。

    1. 冷备份需要暂停业务,关闭数据库,确保数据一致性,适用于允许一定业务中断窗口的场景。
    2. 温备份是在业务运行中备份,会有一定的性能影响,需要控制备份速度和资源占用。
    3. 热备份可以实时同步备份,几乎不影响业务,但实现起来最复杂,对软硬件要求也最高。

除了上述分类,备份领域还有很多技术手段,比如:

  • 复制:全量复制、增量复制、双向复制等
  • 连续数据保护 CDP:通过记录数据修改日志来连续备份
  • 去重:备份时过滤重复数据,节省存储空间
  • 压缩:减小备份的体积,传输和存储更高效

3.3 灾备预案与流程

除了备份技术本身,做好灾备还需要全局的规划。我们要制定完善的灾备预案与流程,主要包含:

  1. 灾备需求与目标设定:不同的系统有不同的可用性要求,核心系统当然需要更高的可用性。我们要评估每个系统的重要性,制定恰当的灾备目标,权衡投入产出。常见的指标有 RTO(恢复目标时间)和 RPO(恢复点目标),前者是最大恢复时长,后者是允许丢失的最大数据量。指标设定要务实,太低达不到,太高又成本太大。

  2. 编写灾备预案文档:灾备预案文档需要明确定义灾难等级、各种场景下的应急流程、通知上报机制、系统恢复步骤、人员角色分工、联系方式等各个细节。使得整个应急响应有章可循,文档要定期评审和更新。

  3. 灾备演练与测试:光有预案还不行,必须落到实处。要定期组织演练,模拟各种场景,让团队熟悉灾备流程。比如模拟机房断电、网络中断等场景,检查应急预案的可行性,评估 RTO、RPO 的达成情况。演练中发现的问题要及时修正预案或改进系统。

  4. 灾备监控和验证:除了演练,平时也要做好灾备系统的监控,确保灾备系统是随时可用的。比如监控备份的成功率、备份存储的容量使用率等,一旦发现异常要立即处理。

此外,我们还要定期做数据恢复验证,确保备份的数据确实是可用的。俗话说「备份是无用的,恢复才是关键」,定期做恢复测试是验证备份有效性的重要手段。

3.4 云灾备和异地多活

随着云计算的兴起,灾备也有了新的手段。很多公有云平台提供了灾备和备份服务,比如 AWS 的 S3、Glacier,阿里云的 HBR、OSS 等。将备份放到云上是个不错的选择,一是降低了本地存储的投入,二是借助了云的地理分布优势,备份天然就是多地域的。

此外,云平台还提供了跨可用区、跨地域的数据复制功能,以及多活架构支持。利用这些服务,可以打造「异地多活」的架构,也就是在多个地理位置部署服务,互为备份,同时对外提供服务。这样即便一个数据中心发生灾难,其他活跃的数据中心也可以无缝接管服务,实现了很高的可用性。当然,异地多活对技术水平要求极高,网络延迟、数据一致性都是不小的挑战。

4 备份的小结

总结来说,可以分为如下的几个点:

  1. 全面规划:灾备不是某个部分的事,而是一个系统工程,需要全局统筹规划。
  2. 分级备份:根据数据重要性分级备份,核心数据要更频繁备份,也要留存更长时间。
  3. 自动化:备份和恢复要尽可能自动化,减少人工操作可能带来的错误。
  4. 实时监控:对备份全程监控,确保备份连续性和及时发现问题。
  5. 定期演练:演练不可少,且要尽可能模拟真实场景,检验预案的有效性。
  6. 云灾备:合理利用云服务,可以显著提升灾备水平,但切忌过度依赖。
  7. 专人负责:安排专人负责灾备,统筹协调,并持续优化灾备体系。

备份灾备是一个复杂的课题,需要持续的投入和改进。做好灾备,并不一定能避免所有灾难,但可以最大限度地降低损失。它不是锦上添花,而是雪中送炭。对个人、对企业而言,灾备都是系统安全、可靠的基石,是我们必须重视、持之以恒去做好的功课。

备份之路,道阻且长。

以上

关于研发效能在组织层面的一些思考和总结

组织结构决定了信息流动、资源分配和决策过程的效率。在研发效能的提升中,扁平化的管理层级、跨功能的团队配置以及灵活的人员动态管理,都能够促进创新和加速决策过程。

最近在思考关于软件研发效能的事情,而其中关于组织层面有一些想法和总结,如下:

康威定律和逆康威定律

在 1968年,梅尔·康威在《Datamation》杂志发表文章《How Do Committees Invent?》,探讨了组织结构和系统设计的关系。其中一句话后来被总结为康威定律:「任何组织所设计的系统架构,都不可避免的反映为该组织沟通结构的副本。

康威在开发早期电子计算机系统的组织中观察到,组织的真实沟通路径(即价值创造架构)与最终的软件架构之间存在强相关性。这种同态力将软件架构和团队结构塑造成相同的「形状」。也就是说,构建软件需要理解团队沟通路径,以更加实际地考虑什么样的软件架构是可行的。如果理论上的系统架构与组织模型不符,就需要对其中之一做出改变。

当组织结构变化时,系统架构就会被影响,身在局中的我们感触非常深刻,本来负责 A 业务,调整后负责 B 业务,原来的工作就不想动了;本来在重构某块技术,想把历史的债务还清先,调整后也没有了动力。

作为一个技术人面对这种情况,有时也无能为力,调整后大量的时间是投入在当前的业务中,而看到的历史问题不在你的工作边界之中,只能看着历史债务越集越多,直到某一天,雪崩。

特别是后端,作为业务核心的技术部分,一个 24×7 要在线的,其稳定性,可用性都是非常重要的。

如何通过系统化的机制保障后续架构的稳定演进,并且不会随着组织结构的频繁变动而频繁变动?

要想抵抗组织结构对系统架构的影响,一种办法是适度隔离,比如采用内部开源的方式,让系统脱离具体业务组织而存在,代码由核心小组统一维护。这种虚拟组织不会随业务变动而变动,适用于底层框架、中间件等非业务模块。

但对于业务属性较高的模块,内部开源并不可行。因为其开发和维护需要对业务有深入理解,跨部门的认知成本太高。这时就需要换一个思路:利用康威定律,通过优化团队架构来引导系统架构,减少沟通和认知成本,实现理想的、高内聚低耦合的架构闭环。这就是逆康威定律的应用。

逆康威定律是 2015 年微服务兴起之际,ThoughtWorks 技术总监 James Lewis 提出的概念,即组织要根据他们想得到的软件架构来设计团队结构,而不是期望团队盲从一个被设计好的团队结构。

其中的核心观点在于,将软件架构看作一个独立的概念,认为它可以被孤立设计,然后交由任何团队来实现,这从根本上就是错误的。软件架构和团队结构的差异在所有架构类型中比比皆是,无论是客户端-服务端、SOA 还是微服务架构。这也是为什么为了让团队聚焦,单体架构需要拆分的原因。

通过逆康威定律的应用,我们可以先设计出理想的软件架构,然后根据这个架构来调整和优化团队结构。这样做的好处是可以更好地匹配业务需求,提高系统的内聚性和可维护性,减少不必要的沟通和协调成本。

具体来说,我们可以采取以下措施:

  1. 根据业务领域划分微服务,每个微服务由一个独立的团队负责开发和维护。这样可以让团队对自己的服务有更清晰的认知和掌控,减少跨团队沟通。
  2. 建立跨团队的架构治理机制,制定统一的架构原则、接口规范、质量标准等,确保微服务之间的一致性和互操作性。
  3. 加强团队内部的自治和责任心,鼓励团队自主决策、快速迭代、持续改进。同时赋予团队端到端的交付职责,避免因职责割裂导致推诿扯皮。
  4. 建设公共的技术平台和工具链,提供标准化的开发、测试、部署、监控等功能,减轻团队的基础设施负担,提高研发效率。
  5. 营造开放协作的文化氛围,打破部门墙,鼓励团队之间主动沟通和知识共享,形成学习型组织。

康威定律揭示了组织结构与系统设计的同构关系,而逆康威定律则为我们指明了一条突破之路:从组织架构入手,持续优化团队分工,才能推动系统架构向理想方向演进。这需要我们在组织设计上投入更多思考,用系统思维来对待研发效能问题。

团队的认知负载

认知负载是指在特定时间内,工作记忆中的信息负荷。对于个人而言,认知负载就是大脑需要同时处理的信息量。当我们将视角拓展到团队层面时,认知负载就变成了团队在执行任务时所承担的信息处理总量。

一个团队的认知负载并不等于团队成员认知负载的简单加总。团队协作过程中产生的交流、同步、协调等活动,都会带来额外的认知负载。同时,团队成员之间知识和技能的差异,也会影响到认知负载在团队内部的分配。

团队的认知负载也是影响软件研发效能的重要因素。

当系统复杂度超出团队的认知极限时,就会导致生产力下降、质量恶化等问题。

控制认知负载的关键,在于团队内部的”通晓全局”程度,即每个成员对系统的整体理解。

那如何判断团队是否处于认知过载状态?

可以从任务执行、团队氛围、个人状态三个维度来观察。

从任务执行的角度看,如果团队在面对新需求时响应速度明显变慢,对变更的适应能力下降,出现更多交付物质量问题,需要更多的返工和修复,这就是认知过载的典型信号。团队投入了更多的时间和精力,但产出的绩效却在下降,说明认知资源已经难以支撑高质量高效率的工作。

从团队氛围的角度看,如果团队成员之间的沟通变得低效和困难,产生更多的误解和冲突,知识共享和协作的意愿下降,整个团队的创新能力和解决问题的能力下降,团队士气低落,抱怨和消极情绪在蔓延,这也提示团队正在经历认知过载。当团队的认知资源捉襟见肘时,成员往往会降低对他人和整体的关注,转而专注应对自己的工作压力。

从个人状态的角度看,如果团队成员普遍感到疲惫和倦怠,对工作失去热情和主动性,工作与生活难以平衡,出现失眠、健康问题等身心状况,这往往是认知过载的结果。当个人长期处于高认知负荷状态,既要应对本职工作,又要参与大量协调和沟通,还要不断学习新知识,就很容易产生持续的压力感,陷入职业倦怠。

团队认知过载不是孤立的问题,而是会从任务执行、团队氛围、个人状态等方面综合反映出来。作为团队管理者,需要保持敏锐的洞察力,及时捕捉这些危险信号,采取针对性的优化措施,从而保障团队的可持续发展。

为了降低认知负载,我们可以从组织设计和架构设计时都做一些考虑。

在组织设计时,可以考虑如下几点:

  1. 适度聚焦。每个团队应该有明确的、聚焦的职责范围,避免过度分散精力。职责范围要与团队的认知能力相匹配,既不能太窄导致产能不足,也不能太宽导致认知过载。
  2. 职责自治。团队对自己的职责范围应该有较大的自主权,可以独立做出决策和优化。过多的外部依赖会增加认知负载。
  3. 边界清晰。团队之间、系统模块之间应该有清晰的边界和接口,减少耦合和认知依赖。
  4. 知识共享。鼓励团队之间主动分享知识和经验,建立共同的认知基础。但要注意,知识共享不等于职责共担。
  5. 弹性冗余。在关键领域,适当保留一定的冗余和备份,避免单点依赖。这样可以在保证产出的同时,降低认知负载的风险。

在架构设计时,可以考虑如下几点:

  1. 模块化和解耦。将系统划分为逻辑清晰、职责单一的模块,并通过松耦合的方式连接,减少模块之间的认知依赖。每个团队只需深入理解自己负责的模块。
  2. 接口驱动。通过定义清晰、稳定的接口规范,将模块的内部实现和外部用途解耦。调用方只需了解接口,而无需关心内部细节。
  3. 领域建模。从业务领域出发,识别出稳定的核心业务概念和流程,并据此设计系统模型。让软件架构尽量贴近真实世界,减少认知转换。
  4. 约定优于配置。通过制定统一的架构原则、编码规范、工具约定等,在团队之间形成一致的认知基础,减少沟通成本。
  5. 演进式架构。架构不是一成不变的,而是随着业务和技术的发展而不断演进的。因此要为变化留出空间,通过持续重构等手段,让系统在可控的范围内优化,避免大规模的推倒重来。

通过对认知负载的有效管理,我们可以显著提升团队的工作效率和整体协同能力。

认知负载,说到底是对人的真正尊重。而尊重,恰恰是最好的管理。

三种常见的团队组织

业务交付团队

业务交付团队,是组织中最主要和基础的团队组织。

业务交付团队是围绕清晰目标和职责,匹配持续变化的业务价值交付任务,形成独立高效工作流的长期、稳定、跨职能团队。

一个业务交付团队通常对应一条单一、完整的价值交付流,可以是一个产品、服务、功能集合、用户故事或用户画像等。团队拥有端到端的能力,能够独立完成从概念到交付的全部工作,快速、安全地持续创造用户价值,而无需依赖其他团队。

业务交付团队要尽可能贴近最终用户,通过生产环境实时监控,获得快速反馈,并据此迅速响应变化和问题。团队规模适中,由高素质的跨职能成员组成,保持长期稳定性,而不是随项目起起落落。

组织内通常存在多种业务交付团队,各自负责不同的业务流,如特定用户、业务领域、地理区域、产品条线等。无论承接何种业务流,团队都应围绕明确的待办事项和优先级开展工作,确保工作流的清晰和聚焦。

一个高效能的业务交付团队应该是这样的:

  • 他们的工作就像一条流水线,特性开发的各个环节衔接顺畅,没有太多卡壳和浪费
  • 团队时刻关注用户反馈和业务变化,能够灵活调整开发计划和优先级
  • 他们勇于尝试新事物,通过小步快跑的试错方式来推动改进,并善于从成功和失败中吸取教训
  • 团队内部各司其职、协同高效,很少需要跟其他团队交接工作
  • 他们交付的速度又快又稳,代码质量也有保障,还能兼顾技术升级和团队成员的健康
  • 团队会投入时间优化系统架构和代码,「修修补补」以防「房子」越来越破
  • 他们懂得借助专业团队的力量,定期跟架构、基建、工具等团队沟通,补齐短板,让自己更专注
  • 团队成员有足够的自主权,在技能上精益求精,工作目标明确,从而获得成就感和价值感

业务交付团队是组织的一线力量和价值核心,其他辅助型团队如技术智囊团和基建平台等,都是为了补齐能力短板、降低认知负载,让业务交付团队得以更高效地运转和创新。这种以业务交付为中心的团队组织模式,是相对于传统的职能式、项目式组织的一种进化。

组建长期、稳定、高度自治的业务交付团队,打造清晰的端到端业务流,是实现快速、频繁、可靠价值交付,适应快速变化的关键所在,代表了现代软件开发组织的进化方向。

平台团队

平台团队的目标是赋能业务交付团队,使其能够高度自治地交付工作。平台团队提供的内部服务,使业务交付团队无须开发底层服务,降低了认知负荷。这里的平台是指其作为公司内部的基础产品,向开发团队提供自服务的 API、工具、服务、知识和支持。借助平台,业务交付团队获得了自主性,可以更快地交付产品特性,减少开发过程中的各种协调、沟通。

业务交付团队可以方便地使用平台团队提供的自服务的网站门户和/或编程API(而非厚厚的使用手册)。「方便使用」是采纳平台的基本要求,并且平台团队必须将他们所提供的服务视为一种产品,无论这些服务是被内部还是外部用户所使用,要具有可信赖的、易用的、量身定做的特征。

平台团队可以提供不同级别的服务,但如果所有业务交付团队都要求高等级服务(如零停服务时间、自动扩缩容、自动修复),平台团队则难以支持。为避免人人都要求高等级服务,可以为这些内部基础设施和服务定价,向使用团队收费。

作为基础设施工程团队,平台团队需要聚焦于开发团队的工作流,以及应用和基础设施的改变如何影响用户。为了帮助开发团队用户更高效地使用平台,平台团队需要做到:

  1. 把内部平台视为线上/生产系统,计划和管理维护时间
  2. 引入软件产品管理和服务管理技术

一个高效能的平台团队应该有以下行为和产出:

  • 与业务交付团队密切协作,理解其需求
  • 依赖快速原型,尽早引入业务交付团队以获得快速反馈
  • 重点关注服务的可用性和可靠性,将平台视为产品,定期回访用户以确认服务是否满足需求
  • 自己也应是所提供服务的用户,与业务交付团队并肩战斗
  • 明白新的内部服务将像创新曲线那样被逐步引入,而非一蹴而就

平台团队和传统的基础设施团队略有不同,突破了传统基础设施团队与业务团队之间的隔阂,通过提供自助式的平台服务,赋能业务团队快速构建和交付应用。与传统基础设施团队相比,平台团队更加贴近业务,团队成员除了技术能力外,还需要具备产品管理、用户体验设计等技能。

专业系统团队

在软件开发过程中,有一些模块或逻辑涉及高深专业领域知识而显得特别复杂,开发和维护都需要相关领域的资深专家(人也特别贵),对于这样的专业系统,我们通常会单独构建团队,称为为「专业系统团队」。

专业系统团队的成员都是某个领域的能手,精通子系统涉及的核心技术。比如 AI 算法模型、视频编解码、特定数学模型、实时交易算法、财务报表系统、人脸识别引擎等,都是典型的复杂子系统,需要专业系统团队来专门负责。

组建专业系统团队的主要目的,是为了给使用这些核心子系统的业务团队减负。本来这些「绝世武功」需要专业系统团队的「武林高手」倾囊相授,现在业务团队只管安心用就行了,不必自己还得练上几年。这样不仅能让每个团队专注自己最擅长的事情,也能节省组织的时间和成本。

需要注意的是,专业系统团队和传统的「组件团队」有本质区别。后者的设立往往是为了让多个团队共用同一个组件,而专业系统团队纯粹是为了「解决疑难杂症」,和代码复用无关。

那么,一个高效能的专业系统团队应该是什么样的呢?

  • 在子系统的设计开发阶段,专业系统团队要和相关业务团队齐心协力,共同定义需求、制定计划、开发功能、测试验证,即「同进同出、战略合作」。到了后期子系统逐渐稳定了,专业系统团队就可以相对独立,专注于系统演进、接口优化等核心工作,和其他团队的互动会少一些。
  • 有了专业系统团队的加持,子系统的开发质量和速度都要明显好于单靠业务团队的情况。这可以作为考核专业系统团队绩效的一个重要指标。
  • 专业系统团队的工作安排要以服务好业务团队为宗旨。要紧贴一线,及时响应需求,灵活调整计划,按业务优先级来排期交付。

一些观点

  • 并非所有的沟通和协作都是有价值的。
  • 保持团队规模的相对稳定。
  • 在实现软件交付之前,先统一团队语言和共同协作方式。
  • 团队的代码所有权并非是在划分地盘。团队对代码的责任,不应该是「这是我的地盘,别人不能进来」,而应该是「这是我负责打理的一亩三分地,要让它生机勃勃」。
  • 软件设计不是非黑即白的选择题,而是一种平衡,如在选择架构时,不是要在单体架构和微服务架构之间做出选择,而是要适配团队的最大认知负载。

以上。