追觅宣布聚焦四大主营业务方向,并调整部分探索阶段业务,这看起来是公司经营层面的新闻,但对技术管理者来说,它是一次典型的“资源重排”信号。只要有探索业务被调整,就会有服务下线、环境回收、代码处置、数据迁移和团队重新分工。业务聚焦不是战略口号,而是技术架构、研发流程和组织协作的一次联动调整。这篇博客重点不是评价追觅的决策,而是整理一套技术团队在“公司宣布聚焦主营业务、调整探索业务”之后可以执行的方法论:怎么评估一项探索业务是否该收缩,怎么把它安全地下线,怎么让资源真正倾斜到主营业务,以及怎么用数据确认调整没有造成系统性故障。
1. 先拆解业务调整:从战略宣布到技术动作
1.1 战略收缩为什么会传导到技术层
当公司宣布聚焦四大主营业务方向,探索阶段业务被调整,技术团队真正要面对的是一连串问题:原有服务是否继续跑?数据要保留多久?域名和证书谁处理?依赖这些服务的内部系统如何切换?团队里负责探索业务的人如何转岗或参与新项目?如果只等业务方发指令,技术侧会处于被动状态。更好的做法是在消息公布后,第一时间把“战略调整”翻译成技术工作包:资产盘点、归属确认、停止投入、数据保留、服务下线、团队迁移。每个工作包都要有负责人和验收标准。
这里有一条关键原则:业务聚焦的决定一旦公开,技术侧要做的不是马上删代码,而是先建立“当前状态基线”。没有基线就无法判断调整是否成功。比如,调整前探索业务每月消耗多少云成本、多少个发布窗口、多少个在线告警,这些数字要提前留底。等调整结束后再对比同样口径的数据,才能说资源是否真的被释放出来。
1.2 探索阶段业务和主营业务在技术管理上的差别
探索阶段业务往往意味着需求不稳定、架构实验性强、没有严格的 SLA、也没有长期维护承诺。这样做的目的是以较低成本验证市场,而不是立刻追求稳定。主营业务则相反,用户量大、链路复杂、故障影响范围广、变更审批更严格。两者混在同一套 CI/CD、同一套监控、同一个数据库时,一旦调整探索业务,就容易影响主营业务。
所以调整的第一步不是“砍需求”,而是把探索业务从主营业务的技术边界上剥离清楚。比如确认网络隔离、数据库实例、消息队列、网关路由是否已经分开。如果没有分开,需要先做技术债登记,再决定能否快速下线。如果探索业务和主营业务共用同一个会员体系、同一个订单表,那么“下线”就不仅是关闭一台服务器,而是先要把共享数据依赖拆开,否则会拖住主营业务。
1.3 调整前应该先拿到一份“技术资产地图”
很多公司调整业务时,业务方给出一张产品清单,但技术侧缺少对应关系:域名对应哪个服务、服务依赖哪个数据库、数据库归哪个团队、是否有定时任务、是否有外部接口在调用。缺了这份地图,下线时会频繁踩到“还有调用方”的坑。建议在调整开始前,用半天时间生成一份资产清单,记录服务名、负责人、环境、依赖、调用方、数据存储、关键配置。
下面是一个 JSON 示例,可以接入 CMDB 或内部服务目录。这段结构并不复杂,重点是把原来存在几个人脑子里的信息变成可查询的记录。
{ "service": "explore-order-service", "status": "active", "owner_team": "exploration-lab", "environments": ["prod", "staging"], "dependencies": { "databases": ["mysql-8.0", "redis-6.2"], "middleware": ["rabbitmq", "kafka"], "external_apis": ["payment-api"] }, "inbound_callers": ["app-gateway", "report-center"], "sla": "best-effort", "cost_monthly_usd": 1200, "last_release_time": "2025-06-01T10:00:00Z", "data_retention_policy_days": 180 }JSON 字段解释:service 是服务唯一标识;owner_team 是技术负责人团队;inbound_callers 是调用方,这个字段决定下线前要通知谁;cost_monthly_usd 可以替换成公司内部成本单位;data_retention_policy_days 是数据保留天数。生成资产地图之后,所有讨论都要基于这份地图,而不是凭记忆。如果是个人学习项目,可以简化这个步骤;但在生产环境中,缺少资产地图就贸然下线,风险非常高。
2. 用评分卡决定探索业务的去留,而不是看谁嗓门大
2.1 为什么业务调整不能只开会
当公司决定“聚焦四大主营业务”,会有一批探索业务被讨论。常见场景是会议室里争论要不要继续投,有人说还有机会,有人说亏损太多。技术负责人如果只是感情用事,最后很可能把团队拖进一个既没有资源、又无法盈利的项目。更稳妥的方式是用评分卡,把战略匹配、技术复用、市场验证、资源消耗四个维度拆成可打分的问题,所有人都基于同一套标准讨论。
这套评分卡的核心价值不是算出一个“绝对正确”的分数,而是把模糊讨论变成具体问题。比如“战略匹配度”看起来抽象,但一旦要求每个人给出 0 到 5 分并说明依据,讨论就会从“我觉得这个项目不错”变成“这个项目距离四大主营业务的核心能力有多近”。
2.2 四维评分卡:战略匹配、技术复用、市场验证、资源消耗
| 评估维度 | 问题 | 打分范围 | 说明 |
|---|---|---|---|
| 战略匹配度 | 该业务是否直接支持四大主营业务之一 | 0-5 | 5 分表示是主营业务的核心功能;0 分表示完全无关 |
| 技术复用度 | 该业务的技术资产能否沉淀到其他业务 | 0-5 | 高分意味着即使业务关闭,组件和代码还能复用 |
| 市场验证度 | 是否有真实用户、真实付费或明确增长趋势 | 0-5 | 高分是已经有外部验证,低分是停留在内部假设 |
| 资源消耗 | 团队、服务、云成本、维护时间总和 | 1-5 | 5 分表示消耗很低的轻量业务,1 分表示消耗很大的重资产业务 |
评分之后,可以按权重计算总分。权重不一定要固定:不同公司、不同阶段,权重应该调整。比如现在强调聚焦,战略匹配度的权重可以给到 40%,技术复用 20%,市场验证 20%,资源消耗 20%。如果一家公司正处于现金流紧张阶段,资源消耗的权重可以提高到 30%,这样更偏向低耗业务。
2.3 用一个 Python 脚本把评分变成建议
下面的脚本用于把评分卡变成决策建议。它不替代人的判断,只负责让讨论结果可见。输入是每个项目的评分和权重,输出是“继续投入”“观察三个月”“收缩下线”三类建议。
# 示例脚本,仅用于说明决策辅助思路 from dataclasses import dataclass @dataclass class Project: name: str strategy: int # 1-5 reuse: int # 1-5 validation: int # 1-5 cost: int # 1-5,这里5表示成本低 def score_project(p: Project, weights: dict) -> float: return (p.strategy * weights["strategy"] + p.reuse * weights["reuse"] + p.validation * weights["validation"] + p.cost * weights["cost"]) def suggest(score: float) -> str: if score >= 4.0: return "继续投入" if score >= 3.0: return "观察三个月" return "收缩下线" weights = {"strategy": 0.4, "reuse": 0.2, "validation": 0.2, "cost": 0.2} projects = [ Project("探索项目A", strategy=4, reuse=3, validation=2, cost=2), Project("探索项目B", strategy=2, reuse=2, validation=1, cost=1), Project("探索项目C", strategy=5, reuse=4, validation=4, cost=3), ] for p in projects: s = score_project(p, weights) print(f"{p.name}: {s:.2f} - {suggest(s)}")这段脚本本身没有公司业务数据,落地时需要替换成真实项目名称和评分。它的意义是让每个项目都被清晰计算,而不是在会议上凭印象拍板。注意cost是反向指标,给的是“成本低=高分”,避免权重计算后两难。
2.4 常见坑:沉没成本、光环效应和口头共识
第一个坑是沉没成本。错误现象:因为团队已经投入一年,不愿意承认业务失败,继续投入。为什么会错:已经投入的资源是沉没成本,不能作为未来决策依据,业务评估只应看未来价值和机会成本。推荐做法:在评分卡里增加“再投入一个周期是否能改变结果”问题,并要求给出证据。
第二个坑是光环效应。错误现象:因为某个业务和技术大牛绑定,所有人都给出高评分。为什么会错:光环效应让评估对象从业务变成个人,会掩盖真实用户数据。推荐做法:匿名评分,尤其是战略匹配和技术复用两维度。
第三个坑是口头共识。错误现象:会议上口头达成“先观察”,过一个月还是没人负责。为什么会错:没有把决议写入可追踪的工单,没有负责人和截止日期。推荐做法:记录决策理由,分配 owner,并设置下一次 review 时间。
3. 把业务下线变成工程流程,而不是删库跑路
3.1 先冻结“新需求”,再进入下线流程
探索业务被判定收缩后,第一步不能是立刻删服务器,而是冻结新需求。冻结的意思是停止功能开发、停止测试新特性、停止增加外部依赖,但保留必要的安全和数据支持。这样可以避免一边下线一边还在出现新变更,导致状态无法收敛。冻结的状态要写进 README 或配置中心,并在发布平台上禁用发布权限。
注意:探索业务下线不能由一个人独自完成,至少要有产品、技术、运维、数据四方确认,再执行删除动作。
冻结之后,代码库也不要立即删除。建议在当前主干上创建archive/explore-order-service-20250630分支,作为最终版本保存。后续如果要做技术复盘,或者团队希望从里面抽取可复用代码,都还有依据。
3.2 梳理下线时间线:阶段、负责人、验收标准
建议把下线分成五个阶段:冻结、资产盘点、降流量、停止写数据、归档删除。
| 阶段 | 核心动作 | 责任人 | 验收标准 |
|---|---|---|---|
| 冻结 | 禁止新需求、禁用生产发布 | 产品负责人 | 变更记录停止新增 |
| 盘点 | 确认服务、依赖、数据、调用方 | 技术负责人 | 资产清单完整 |
| 降流量 | 网关摘除流量,观察错误率 | 运维负责人 | 错误率不上升、调用方无异常 |
| 停写 | 停掉写入任务,导出数据 | 数据负责人 | 数据备份完成并校验 |
| 归档 | 下线服务、回收环境、清理权限 | 运维负责人 | 服务不可访问,日志保存完整 |
每个阶段至少要等观察周期稳定后再进入下一阶段。降流量阶段建议观察至少 48 小时,重点看依赖该服务的调用方有没有出现错误告警。如果没有问题,再执行停止写入。如果观察期间出现异常,可以立即回切流量,减少影响面。
3.3 用 Bash 脚本自动生成依赖检查结果
下线前最怕遗漏调用方。下面脚本模拟检查某个服务被哪些命名空间的 Deployment 引用,只做辅助作用。实际生产要接入 CMDB 或 API 网关调用链数据,但这能体现思路。
#!/bin/bash # 检查目标服务被哪些负载引用 TARGET_SERVICE=$1 NAMESPACES=$(kubectl get ns -o jsonpath='{.items[*].metadata.name}') echo "搜索调用方... 目标服务: $TARGET_SERVICE" for ns in $NAMESPACES; do kubectl get deploy -n "$ns" -o json | python3 -c " import json, sys, os try: data = json.load(sys.stdin) except Exception: sys.exit(0) target = os.environ.get('TARGET') for item in data.get('items', []): deps = json.dumps(item['spec']['template'].get('spec', {}).get('containers', [])) if target in deps: print('发现引用:', item['metadata']['namespace'], '/', item['metadata']['name']) " 2>/dev/null || true done这段脚本在真实环境里会漏掉配置中心、服务网格、DNS 外部调用,所以只能作为第一轮扫描。完整检查要结合网关访问日志、消息队列 consumer group、数据库连接来源等数据一起判断。建议把脚本加入 CI 任务,每天扫描一次,形成一个“下线依赖清单”。
3.4 数据保留策略:能删的是服务,不能删的是证据
业务下线后,数据不能随着服务一起删。通常要考虑三件事情:用户数据合规、财务审计、模型成长留存。建议给每个数据库表设一个保留期限。比如订单流水保留 90 天用于纠纷,用户行为日志匿名化后保留 180 天用于分析,原始监控指标保留 7 天。
| 数据类别 | 保留期限 | 存储位置 | 删除方式 |
|---|---|---|---|
| 用户核心数据 | 按合规要求 | 冷存储 | 到期后脱敏删除 |
| 业务流水 | 90 天 | 对象存储 | 过期删除 |
| 日志 | 30 天 | 日志系统 | 按索引滚动清理 |
| 源代码和文档 | 长期 | Git 仓库 | 归档分支,禁止强制覆盖 |
对象存储生命周期策略可以这样写:
lifecycle_rule: id: "explore-order-data-retention" status: enabled filter: prefix: "explore-order-service/" expiration: days: 90如果实际项目没有对象存储,也可以用定时任务扫描数据库中的归档表,到期的数据统一转冷存储或脱敏。重点是要有一个自动执行机制,不能依赖“下次有人记得清理”。
3.5 下线后还要做一次“技术复盘”
不要以为服务删掉就算结束。建议在下线完成一周内提交一份复盘:当初为什么投入?验证假设是什么?市场反馈如何?哪些技术资产可以复用?下次如何更早判断?复盘不是追责,而是把经验沉淀成评估清单。如果团队能坚持做三次以上下线复盘,就会形成一套内部方法论,下一次调整速度会快很多。
4. 让资源真正集中到主营业务:架构和团队都别浪费
4.1 业务聚焦会不会造成技术平台重复建设
公司聚焦四大主营业务,最大的技术风险是四个业务各搞一套独立平台。表面上资源是集中了,实际上每一个业务都在重复做权限、支付、通知、审批。更合理的方式是先把公共服务层独立出来:身份认证、组织权限、消息推送、文件存储、审计日志。四大主营业务在这些公共能力之上开发差异化功能。
这里要有一个取舍:不是所有能力都要立刻中台化。如果四个业务里只有两个用到某个能力,过早抽成公共平台反而会增加沟通成本。判断标准是,至少两个业务使用、API 边界稳定、后续三个月有二次演进计划,才值得抽成公共组件。
4.2 公共组件怎么分组和排优先级
公共能力也要分优先级。建议优先做四个业务都在用的高频能力,而不是做内部“平台产品化”。可以列出当前四大主营业务的能力要求,分别标记是核心差异能力还是公共支撑能力。
| 能力域 | 业务 A | 业务 B | 业务 C | 业务 D | 优先级 |
|---|---|---|---|---|---|
| 用户认证 | 使用 | 使用 | 使用 | 使用 | P0 |
| 支付结算 | 使用 | 使用 | 不需 | 使用 | P0 |
| 推荐算法 | 核心 | 核心 | 无关 | 使用 | P1 |
| 客服工单 | 使用 | 不需 | 使用 | 不需 | P1 |
| 多语言 | 不需 | 使用 | 不需 | 使用 | P2 |
P0 是必须公共化,P1 是按需沉淀,P2 是暂缓。这里的“公共组件”不一定要新建一个中台部门,也可以在现有团队中抽出虚拟小组,一个季度一个能力逐步收编。
4.3 研发资源重新分配:从“项目负责人制”过渡到“能力负责人制”
过去的探索业务往往是一两个全栈工程师负责一个完整小产品,这种模式在做验证时很快,但很难沉淀深度能力。聚焦主营业务后,建议把团队重新拆成三类:面向客户的前端产品组、面向业务场景的应用后端组、面向公共能力的基础平台组。
这个结构不能拍脑袋搬,要看团队规模。10 人以内不建议硬拆平台组,20 人以上可以考虑。关键判断是:一项能力被两个以上业务使用时,才值得设专项负责人。否则,公共组件负责人会变成一个“天天开会、写不好代码”的协调角色。
4.4 资源集中后,如何避免“四个业务同时插入同一组件”的冲突
公共组件一旦被多个业务依赖,最大的风险是互相影响。一个组件发布新版本,业务 A 测试通过,业务 B 可能因为参数差异直接挂掉。这里给一个常规做法:公共组件版本管理使用语义化版本,每个业务锁版本;业务要升级公共组件时,先在 staging 环境跑兼容性测试;公共组件在收编旧代码时,把旧接口标记 deprecated,而不是直接删除。
common-components: auth-service: version: 2.1.0 deprecations: - path: /v1/login suggestion: /v2/sso migration_plan: phase: "30% traffic"这样可以让主营业务之间的公共能力达到“共享但不互相拖累”。如果公共组件出现故障,要把“影响哪个业务、哪个版本、是否需要回滚”写到告警卡片上,而不是让每个业务自己查。
5. 调整效果怎么验证,矛盾怎么排查
5.1 聚焦之后要盯哪些指标
业务调整后,不能只开“战略会”就结束。技术侧要观察四类指标:交付速度、系统稳定性、成本、团队可持续性。
| 指标 | 建议观察方式 | 异常信号 |
|---|---|---|
| 交付速度 | 主干网 CD、发布频率、需求闭环时长 | 发布频率下降且不是因为需求变少 |
| 系统稳定性 | 错误率、P99 延迟、告警数量 | 错误率上升,尤其主营业务之间相互影响 |
| 成本 | 云资源账单、人力时数 | 总成本没有下降,反而增加 |
| 团队可持续性 | 离职率、加班时长、Code Review 质量 | 核心骨干长期疲劳,Review 流于形式 |
建议每周生成一次调整周报,把以上指标和前四周做对比。周报不需要写大段分析,只要让决策者看到数字趋势。如果连续两周出现异常,就需要进入排查流程。
5.2 用 PromQL 或 SQL 检查服务是否真的不再被调用
如果业务调整后,探索业务已经下线,理论上不应该再出现线上调用。可以用网关日志 SQL 快速检查。例如在 ClickHouse 中查询宿主为某个已下线服务的请求:
SELECT count() AS request_count FROM gateway_access_log WHERE service_name = 'explore-order-service' AND event_date >= today() - 7 HAVING request_count > 0;如果返回结果大于 0,说明仍有调用方未切换或配置残留。这个查询是验证下线的第一步,生产环境还需要结合 DNS、配置中心、消息队列等进行交叉验证。也可以用 PromQL 检查目标服务的 QPS 是否为 0:
sum(rate(http_requests_total{service="explore-order-service"}[5m]))实际生产环境的依赖检查不能只靠手动脚本,要叠加网关访问日志、配置中心和服务网格的数据。
5.3 常见问题排查:团队动荡、故障上升、交付变慢
| 问题现象 | 可能原因 | 检查方式 | 解决方案 |
|---|---|---|---|
| 调整后 App 首页错误率上升 | 公共组件升级未兼容业务旧参数 | 看错误日志、对比两个版本请求参数 | 回滚公共组件,或增加兼容转换层 |
| 探索业务数据缺失 | 下数据库时未确认备份完整性 | 检查备份文件校验和 | 从冷存储恢复,严格执行备份校验 |
| 主营业务交付变慢 | 资源被“虚拟项目”占走 | 看工时统计、迭代计划 | 砍掉非主营业务需求,重排优先级 |
| 团队出现离职潮 | 调整目标不透明,人不知道自己做什么 | 访谈、匿测问卷 | 明确岗位方向,安排技术能力盘点 |
这些排查项里,最容易被忽略的是“调整目标不透明”。技术调整经常只通知了技术负责人,基层工程师不知道业务为什么收缩、自己接下来做什么。结果就是团队氛围变差、离职率上升。建议在调整宣布后一周内,每个技术小组都做一次目标对齐会,讲清楚谁负责哪块、哪些工作停止、哪些工作继续。
5.4 调整失败后如何回滚
不是所有收缩决定都不可恢复。为了减少风险,建议在下线前保留一组“回滚开关”:代码分支保留、镜像保留 tag、数据库保留快照、DNS 域名保留指向冷备。如果三个月后市场出现反转,可以在 24 小时内把服务恢复到一个可用版本,而不是重新开发。
但“保留回滚开关”不等于无限期保留。要给回滚窗口设置期限,比如 90 天,超期后正式归档。否则,已下线的服务会变成新的技术债,云资源重新被各种冷备环境占满。
6. 下一次业务调整,团队可以提前准备好的检查清单
6.1 公司战略公开前,技术侧能做什么
很多业务调整不是完全没有预兆。一般在宣布前,公司内部会有新业务探索停滞、营收压力上升、人才盘点等信号。技术团队平时就要维护 CMDB、依赖地图、成本账单,这样一旦战略变化,能在一周内给出资产清单,而不是临时翻日志。建立“业务调整预案”,把下线的标准阶段提前写好,也能大幅减少慌乱。
比较好的做法是每个季度做一次“探索业务健康度盘点”,把不活跃的探索项目列出来,先打上 maintain 标签,避免它们长期占用资源。到了真正需要聚焦主营业务时,这些项目就已经处于可下线状态。
6.2 业务调整执行清单
这里给一个通用清单,可以打印或贴到团队文档:
- 是否已经明确哪些业务属于四大主营业务,哪些探索业务被调整?
- 是否有技术侧联系人参与决策,而不是只拿到结果?
- 探索业务是否已经冻结新需求?
- 资产盘点是否覆盖服务、数据库、消息队列、定时任务、外部调用方?
- 数据保留期限是否与合规和审计对齐?
- 是否已经降流量并观察至少 48 小时?
- 是否完成数据备份和校验?
- 是否已回收开发、测试、生产环境的权限?
- 是否已检查 DNS、证书、支付回调等外部配置?
- 是否已提交技术复盘?
这个清单也可以作为评审会材料。每次下线动作完成后,在对应项打勾,缺任何一项都不能进入下一阶段。
6.3 给技术领导者的三条建议
第一条,把业务调整看成一个“项目”而不是一个“通知”,用项目管理方式跟踪,每个动作都有负责人和验收标准。第二条,把决策写进数据,把资源变化也写进数据。调整结束后,至少要能回答“我们省下了多少成本、腾出了多少人、稳定性有没有下降”。第三条,不要追求一次性完美,业务聚焦是一个反复收敛过程,每次调整都要让团队更有信心面对下一次。