Meta降本增效大招之:弃用产品

news2024/11/28 22:32:36

今晚无意间进入去哪儿技术沙龙的直播间,听到他们要删除50%的代码和停掉50%的服务。我就想起Meta公司最近写的这篇博客:Automating product deprecation。

这篇博客对于效能平台的建设非常具有指导意义。文章最后有原文链接和我个人的总结。

这是一个系列博客。请关注我,我会连载这个系列。

译文:

在Meta,我们通过构建和交付许多不同的产品不断进行创新和尝试,这些产品包含了成千上万的独立功能。作为健康的技术生命周期的一部分,一些产品或功能将不可避免地被弃用。比如,我们在2015年推出了一款叫“Moments”的照片分享应用,后来在2019年停止服务。那么,我们该如何高效、安全地删除与Moments相关的所有代码和数据,而不对Meta的其他产品和服务造成不良影响?

在这个三部分组成的博客系列中,我们将讨论从复杂的产品组合中删除产品时涉及的复杂性,以及Meta为驱动这个过程而构建的框架,即我们的系统代码和资产删除框架(SCARF)。SCARF对Meta产生了重要影响。去年,它删除了存储在21个不同数据系统中1280万种不同数据类型的PB级未使用数据。在过去五年中,它删除了超过1亿行代码。

第一篇文章将介绍在大型组织安全地弃用产品时面临的复杂性,以及我们开发的内部工作流程工具。第二篇文章将解释SCARF如何自动删除死代码以及支持其的基础设施。第三篇文章将讨论SCARF的编排,以安全地识别和删除各种数据系统中的未使用数据类型。

失败模式

如果没有详细的指南来确定何时以及如何删除产品或功能,可能会出现一些失败模式。想象一下,为了某个每隔几年举办一次的大型活动而启动具体时限的功能。将所有相关的代码和数据保留到下一次大型活动是否有意义?大多数情况下,与其多年维护未使用的代码,不如在下次大型活动时重新开发。

尝试清理的工程师可能会发现这是一项非常耗时的工作。正确识别与产品相关的所有代码和数据,并仅针对这些特定的代码和数据进行删除是一个费力的过程。仍在使用的表或共享用例仍需要的代码可能会被错误地包含在删除范围内。例如,某些表可能在产品之间共享。假设在成为独立应用之前,Moments可能是作为Facebook照片功能的扩展而诞生的。

最重要的是,任何清理工作只能删除已经停用或完全未使用的内容,这一点至关重要。删除正在生产中使用的内容可能会给用户糟糕的体验。像Facebook这样大型产品中功能的高度互相关联性使这种情况成为一个非常现实的可能。

我们是如何解决这个问题的?

Meta开发了一些手册来描述如何安全地弃用产品。这些手册阐述了如何通知用户并给他们时间下载数据、如何安全地禁用产品以及何时最终删除底层代码和数据。它们描述了如何以及何时执行产品或功能的弃用,但实际上删除产品或功能的代码和数据是工程问题的工程解决方案。我们构建的工程解决方案并不是要取代这些指南,而是使工程师能够更安全、更高效地完成产品弃用流程。

在这篇文章中,我们将描述Meta的SCARF以及它如何指导工程师完成此清理过程。在后续文章中,我们将讨论它的局限性以及如何通过我们的自动死代码和数据删除平台来缓解这些局限性。首先,我们介绍Meta的内部工具套件,这些工具是为了协调这两个系统而开发的,以指导工程师删除具有复杂依赖关系的大型产品。

引入工作流程管理

为了简化删除产品的任务,Meta在SCARF中内置了产品弃用工作流管理工具,帮助工程师安全高效地删除产品的死代码和未使用数据。该工具让工程师了解并拆分他们在弃用期间将经历的步骤,并协调SCARF的操作,使自动化符合工程师的指导。

确定弃用范围

了解产品的其他组件何时使用一段代码或数据非常重要,而检测其他产品代码中何时引用资产对于安全弃用(区分内部和外部依赖)至关重要。比如,我们不想在两个不同的产品之间留下无效的网络链接,因为这可能导致糟糕的用户体验。弃用产品的工程师必须仔细考虑产品外部边界中的每一个此类依赖。

为了避免这些复杂性,工程师通过确定项目范围、递归添加应该删除的任何资产以及标记应该切断的依赖关系来启动弃用。比如,如果Moments与Facebook应用的共享功能集成,则必须断开这种依赖,因为Facebook共享功能本身可能不在删除范围内。

2f00c4629718ed89f1b93619c18c7b0c.png

但是,如果共享功能是Moments独有的,那么这将改变删除的范围,因为我们也想删除该组件。随着项目的进展,将新资产添加到项目范围中需要进一步分析以发现内部和外部依赖关系的新边界。当工程师发现需要删除的额外组件时,这些依赖关系预计会随着时间的推移而变化。或者,我们可以识别实际上是共享组件且不应该删除的代码。试图从一开始就确定这个边界是非常困难的,因此我们允许开发者随着弃用的进展重新定义边界,以反映这种不断增长的理解。

在大型产品中,组件图、其内部和外部依赖以及相关数据资产可能非常复杂。SCARF简化了这个问题,只要求工程师在边界做出“标记依赖”或“添加到项目”的决定。然后,它在内部计算项目内所有内容的正确删除顺序。

d977c5bb94e9761a43055d105c965759.png

创建删除路线图

一旦确定了要删除的未使用资产集合,SCARF将分析内部和外部依赖性并创建删除路线图,概述安全删除所有内容的正确步骤顺序。路线图每天都会随着变更而刷新,无论是删除目标资产还是通过“标记”和“添加”操作修改组件图。该路线图是工作流管理工具最重要的功能之一。

如果没有指导,工程师可能会尝试通过删除整个代码目录来一次性删除所有内容,而不考虑外部系统的依赖,而外部系统的依赖无法以原子方式提交。另一个例子包括在读取和写入数据的代码之前删除数据,这可能导致创建必须再次清理的新数据。弃用必须交错进行,以适应这些不同的要求,这意味着每次弃用都必须以协调的、多步骤的过程执行。

关键的实现细节是业务逻辑的编码,使产品和应用程序能够在Meta的系统中运行。通过对用户如何与产品互动以及这些产品如何与其他Meta服务通信进行编码,我们可以确保上游资产总是在其依赖项之前被删除。例如,通常一个产品将包含跨多个存储库的多种不同语言的代码。工程师需要删除他们的移动代码(Java、Objective-C),以便释放和删除他们的服务器端GraphQL定义。删除这些GraphQL定义就可以删除业务逻辑;删除业务逻辑可以删除数据模式定义,从而可以删除未使用的数据。

下图是一个假设示例,展示了在工程师的删除路线图中呈现的信息类型。

37ccda421b51dde2d50bf85178520f85.png

这个顺序一开始并不明显!这些系统边界之间的联系通常比同一语言中的两个类之间的联系更弱;并且该联系通常只能由工程师在对其代码变更请求进行连续测试期间发现。SCARF对这些系统间边界的编码支持删除路线图,从而使工程师能够安全地错开他们的删除操作。

为分析提供动力

SCARF的工作流管理工具由静态和动态分析相结合的详细指标提供支持。关于代码的信息是从SCARF的统一代码依赖关系图中收集的,关于数据的信息是从SCARF的数据资产使用分析中收集的。这些机制将在我们后续的博客文章中有更详细的讨论。

这些指标为工作流管理工具提供了一个非常重要的属性:如果可以找到资产的指标,则该资产正在使用中,并且应该阻止自动删除。相应地,任何没有可用指标的资产都可以自动删除。有了这些指标,SCARF就可以向工程师准确解释到底是什么阻碍了自动化,以及他们必须手动执行哪些步骤才能使自动化继续进行。

这种完整性属性允许SCARF自动开始删除未使用的代码和数据,同时向工程师展示哪些事情必须手动处理。在该过程的每一步中,工程师和自动化都会共同努力完成弃用。

一旦工程师根据这些信息采取行动并根据删除路线图删除了更多死代码和未使用数据,SCARF的持续索引和分析将检测这些更改并自动触发它可以进行的任何代码/数据清理。最后,工作流管理工具将更新其删除路线图,以识别下一组需要手动干预的项目,并重复该过程。

4a37a43d9ef5116f3e82d7e60ba11a0e.png

自动化就足够了吗?

SCARF强调的一些使用信号(例如仍在接收流量的API端点)如果被忽略,并不一定会导致编译错误,对于是否应该停止自动删除更主观。如果产品的某个端点每天收到一个请求,我们是否应该立即删除它?我们已经确定该端点属于我们要删除的产品,因此我们知道它最终应该被删除,但何时正确删除它的答案最终取决于业务决策。此外,我们知道错误是可能发生的,自动化也不会100% 完美。因此,SCARF需要谨慎行事,因为错误的删除可能导致不可恢复的错误或数据丢失。

相应地,SCARF提供了覆盖阻止自动化采取行动的信号的功能。在上面的例子中,工程师可能会决定我们希望继续删除API端点,尽管流量很小。这在清理内部产品、工具和服务时非常有价值。内部工具的构建和弃用的节奏通常比外部产品快得多,SCARF可以帮助确定每个内部用户工具,需要询问他们是否同意删除该工具。

此功能在工程师和自动化之间创建了反馈循环。我们的自动化会突出显示使用信号;然后,工程师对这些使用信号进行分类(通过修改代码来删除它们,或者如果适用,将信号标记为不足以阻止删除);那么我们的自动化就可以继续推进SCARF项目了。

为了进一步加快工程师手动更改的速度,SCARF还提供了即时代码更改功能。SCARF提出了一种通过有针对性的代码更改来断开依赖关系的方法,工程师可以从一组预定义的可选方法中选择一个来断开依赖。更改可以立即预览,并可以立即生成更改请求以供其他工程师审核。

在工程师完成大部分删除路线图并删除入口点、客户端代码、服务器代码和范围内的任何其他资产后,他们将留下未使用的数据表,这些数据表现在可以由SCARF自动清理。我们将在未来的博客文章中更详细地解释这种自动化。

与 Meta 上的其他工具集成

SCARF的用途不仅仅是产品弃用。当通知工程师关于单个资产的日常维护或升级工作时,我们会提供弃用作为一个选项。例如,当要求开发者迁移旧的内部API时,我们可以为他们提供一个选项,将调用方或受影响的产品弃用并导入SCARF。在许多情况下,弃用某些东西可能比执行简单的升级需要更多工作,但弃用意味着将来不需要进行维护。一旦移除某些内容,未来的维护成本就会为零。

译完

原文链接:https://engineering.fb.com/2023/10/17/data-infrastructure/automating-product-deprecation-meta/

我的总结:

  1. 1. 弃用产品是降本增效的一种手段。

  2. 2. 如何以及何时执行弃用,是一个产品运营问题。

  3. 3. 如何让工程师能够更安全、更高效地完成产品弃用流程是一个工程问题。SCARF框架就是为了解决此问题。其实放在国内,可能是效能平台的一个功能。

  4. 4. 工程师在弃用产品的过程中可能会出现的问题:

    1. 1. 工程师无法轻松地确定弃用的范围;

    2. 2. 弃用的步骤可能取决于业务代码的逻辑,也就是弃用步骤是视情况而定的。

  5. 5. 弃用产品的内容包括:代码、数据。

  6. 6. 这个框架的内容如下:

    1. 1. 打弃用标记:工程师可以通过工具,或者在平台上对要进行删除的资产(代码、文档等等)和要断开的依赖关系进行标记;

    2. 2. 分析依赖关系以确定弃用范围:SCARF通过分析依赖关系,确认弃用范围;

    3. 3. 输出弃用路线图:SCARF将分析内部和外部依赖性并自动创建删除路线图,概述安全删除所有内容的正确步骤顺序。其中可能有些步骤必须手动执行。路线图不是静态的,它会随外部条件变化而变化。

    4. 4. 在工程师删除代码后,未使用的数据表,可以由SCARF自动清理。

下一篇将介绍如何自动删除无用代码。请记得关注我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1218442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机的基础知识汇总

文章目录 51单片机之点灯51单片机之灯的亮灭交替51单片机之灯的流水灯51单片机之数码管数字显示51单片机之数码管数字的流水灯51单片机之数码管数字的0-7显示51单片机之蜂鸣器的鸣叫与关闭51单片机之DS1302时钟设置51单片机之读出温度传感器温度代码模块化汇总主函数main.c 延时…

XD6500S— LoRa SIP模块

XD6500S是一系列LoRa SIP模块,集成了射频前端和LoRa射频收发器SX1262系列,支持LoRa和FSK调制。收发器SX1262系列,支持LoRa和FSK调制。LoRa技术是一种扩频协议,针对LPWAN 应用的低数据速率、超远距离和超低功耗通信进行了优化。通信…

【Mysql】Mysql内置函数介绍

🌈欢迎来到Python专栏 🙋🏾‍♀️作者介绍:前PLA队员 目前是一名普通本科大三的软件工程专业学生 🌏IP坐标:湖北武汉 🍉 目前技术栈:C/C、Linux系统编程、计算机网络、数据结构、Mys…

Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化

Jupyter Notebook的下载安装与使用 Jupyter简介下载与安装启动与创建NotebookJupyter基本操作 在计算机编程领域,有一个很强大的工具叫做Jupyter。它不仅是一个集成的开发环境,还是一个交互式文档平台。对于初学者来说,Jupyter提供了友好的界…

阿里云ESSD云盘、高效云盘和SSD云盘介绍和IOPS性能参数表

阿里云服务器系统盘或数据盘支持多种云盘类型,如高效云盘、ESSD Entry云盘、SSD云盘、ESSD云盘、ESSD PL-X云盘及ESSD AutoPL云盘等,阿里云服务器网aliyunfuwuqi.com详细介绍不同云盘说明及单盘容量、最大/最小IOPS、最大/最小吞吐量、单路随机写平均时延…

LayoutLMv3 : 基于统一文本和带Masking图像的文档AI预训练【论文翻译】

文章目录 专业名词统计文档智能多模态预训练模型LayoutLMv3:兼具通用性与优越性LayoutLMv3 : 基于统一文本和带Masking图像的文档AI预训练ABSTRACT1 INTRODUCTION2 LAYOUTLMV32.1 Model Architecture(模型架构)2.2 Pre-training O…

向量以及矩阵

0.前言 好了那我们新的征程也即将开始,那么在此呢我也先啰嗦两句,本篇文章介绍数学基础的部分,因为个人精力有限我不可能没一字一句都讲得非常清楚明白,像矩阵乘法之类的一些基础知识我都是默认你会了(还不会的同学推…

QTableWidget 设置列宽行高大小的几种方式及其他常用属性设置

目录 效果: 1.列宽、行高自动分配 2.固定值 3.随内容分配列宽 随内容分配行高 4.水平方向标签拓展剩下的窗口部分,填满表格 5.列宽是自动分配的,但是第一列可手动调整宽度,而表格整体的列宽仍是自动分配的。第二、三列办法调…

休闲娱乐 - 挂耳咖啡

公司有一个小的茶歇间,平时去喝个咖啡、放松身心、锻炼下身体。咖啡机是现磨咖啡豆的,喝喝就习惯了。 而我旁边一位同事习惯每天早上来自己泡一杯挂耳咖啡,再配上牛奶,感觉挺高级的。 关于挂耳咖啡就查了一下资料,介绍…

UE基础篇六:音频

导语: 通过实现一个小游戏,来学会音频,最后效果 入门 下载启动项目并解压缩。通过导航到项目文件夹并打开SkywardMuffin.uproject来打开项目。 按播放开始游戏。游戏的目标是在不坠落的情况下触摸尽可能多的云。单击鼠标左键跳到第一朵云。 游戏很放松,不是吗?为了强调…

【C++面向对象】15. 模板

文章目录 【 1. 函数模板 】【 2. 类模板 】 模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是指创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都使用了模板的…

php接口api数据签名及验签

api数据签名作用&#xff1a;通过使用签名可以验证数据在传输过程中是否被篡改或修改。接收方可以使用相同的签名算法和密钥对接收到的数据进行验证&#xff0c;如果验证失败则表明数据被篡改过 1、数据发送方进行接口签名并传输签名字段 <?php // 请求URL $url "h…

利用回溯绕过正则表达式

目录 利用strpos的特性拿到flag 利用回溯绕过正则表达式 利用回溯次数绕过正则表达式并且实现文件上传 使用回溯绕过正则表达式waf拿到flag 本篇会讲解三个实验来分别绕过正则表达式&#xff0c;python的正则表达式和Javascript的正则表达式大致相同如果有正则表达式不太懂…

String字符串性能优化的几种方案

原创/朱季谦 String字符串是系统里最常用的类型之一&#xff0c;在系统中占据了很大的内存&#xff0c;因此&#xff0c;高效地使用字符串&#xff0c;对系统的性能有较好的提升。 针对字符串的优化&#xff0c;我在工作与学习过程总结了以下三种方案作分享&#xff1a; 一.优…

MySql 数据库初始化,创建用户,创建数据库,授权

登录MySQL&#xff08;使用管理员账户&#xff09; mysql -u root -p 设置用户 -- 创建用户并设置密码 CREATE USER user_name% IDENTIFIED BY user_password;-- 删除用户 drop user user_name; 设置数据库 -- 创建数据库 CREATE DATABASE database_name;-- 删除数据库 DR…

web前端开发网页设计课堂作业/html练习《课程表》

目标图&#xff1a; 代码解析&#xff1a; 代码解析1<table border"3" align"center"><输入内容(的) 边界"3px" 位置"居中">2<tr><td colspan"7" align"center">课程表</td><t…

YOLOv8改进 | 如何在网络结构中添加注意力机制、C2f、卷积、Neck、检测头

一、本文介绍 本篇文章的内容是在大家得到一个改进版本的C2f一个新的注意力机制、或者一个新的卷积模块、或者是检测头的时候如何替换我们YOLOv8模型中的原有的模块&#xff0c;从而用你的模块去进行训练模型或者检测。因为最近开了一个专栏里面涉及到挺多改进的地方&#xff…

Python | 机器学习之PCA降维

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《人工智能奇遇记》&#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 目录结构 1. 机器学习之PCA降维概念 1.1 机器学习 1.2 PCA降维 2. PCA降维 2.1 实验目的 2…

Linux(多用户下)查看cuda、cudnn版本、查看已经安装的cuda版本相关命令

查看已经安装的CUDA多个版本 linux 中cuda默认安装在/usr/local目录中&#xff1a; -可以使用命令&#xff1a; ls -l /usr/local | grep cuda查看该目录下有哪些cuda版本&#xff1a; 如果输出&#xff1a; lrwxrwxrwx 1 root root 21 Dec 17 2021 cuda -> /usr/loc…

Python windows安装Python3环境

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …