管团队这几年,我最大的教训
我刚带团队那会儿,干了一件特别蠢的事——把自己当成了队里技术最强的那个人。
哪个服务出问题了,我冲最前面排查;哪个方案有争议,我拍板定;谁请假了,我顶上去。那段时间特别充实,充实到什么程度呢?每天加班到十一点,周末也得盯着群消息。我老婆说我跟手机过日子算了。
后来有一次我发烧请了两天假,结果团队差点炸了——线上出了个中等故障,三四个人在群里讨论了一下午没结论,最后还是我躺床上打了几个电话才搞定。那次之后我彻底想明白了一件事:我这种干法,不是在管团队,是在害团队。
团队真正的竞争力,从来不是leader有多牛,而是你离开之后这帮人还能不能正常运转。要做到这一点,你得花心思去搭一套制度——不是那种写在文档里没人看的制度,而是大家日常真的在用、且用起来不别扭的制度。
我折腾了几年,踩了不少坑,慢慢摸索出五个模块,今天聊聊。
Owner精神
最开始我的分工方式很原始——leader派活,大家干。效率看上去还行,但有个致命问题:所有人都等着我安排,没人主动思考"这块业务下一步该往哪走"。等于我是一个人的大脑,连接了十双手。
后来我改了规则。每个人圈一块自己的领域,明确是"Owner"。
举个真实例子:我们组有个同事叫老陈,负责网络这块。主责的意思不是说网络相关的活儿都他干——而是说网络这个领域,技术选型他来定,方案他来出,出了故障他来组织排查。功劳是他的,锅也是他的。年终述职的时候,他讲的是"网络这块今年我做了什么、解决了什么问题、明年打算怎么优化",而不是"领导让我做了什么"。
这个转变看起来很小,但效果非常明显。老陈开始主动研究SDN方案了,主动找其他团队对齐网络规范了,甚至开始主动排查一些潜在风险——因为这块是他的,他比任何人都上心。
当然,光有主责会出另一个问题:老陈休假了怎么办?老陈离职了怎么办?所以我们同时搞了"Backup"——每个Owner配一到两个Backup成员,平时跟着Owner干,慢慢熟悉业务。一来降低了单点风险,二来等Backup成员成长起来,就能独立接手新的领域。
另外,固定分工之外还得有个弹性机制。我们时不时会冒出来一些临时项目,比如安全加固、性能优化专项之类的,如果大家都只守着自己的领域,这些跨领域的事就没人牵头。所以我们搞了个"虚拟小组"的机制——遇到临时项目,从各领域抽人组成小组,定好目标和周期,干完就解散。大家轮流参与不同项目,对整个系统的理解也更深了。
%%{init: {
'theme': 'base',
'themeVariables': {
'background': '#ffffff',
'primaryColor': '#F3F6FC',
'primaryBorderColor': '#3B82F6',
'primaryTextColor': '#1E293B',
'lineColor': '#94A3B8',
'secondaryColor': '#FEF3C7',
'tertiaryColor': '#F1F5F9',
'fontFamily': 'system-ui, -apple-system, sans-serif',
'fontSize': '14px',
'edgeLabelBackground': '#ffffff',
'nodeBorder': '2px',
'mainBkg': '#ffffff'
},
'flowchart': {
'curve': 'basis',
'padding': 20,
'nodeSpacing': 60,
'rankSpacing': 60,
'useMaxWidth': true
}
}}%%
flowchart TD
%% 定义样式类(用 Mermaid 原生类语法,更简洁)
classDef decision fill:#FEF3C7,stroke:#F59E0B,stroke-width:2px,color:#92400E,font-weight:bold,radius:8px;
classDef operation fill:#E0F2FE,stroke:#3B82F6,stroke-width:2px,color:#1E3A8A,radius:8px;
classDef startEnd fill:#F1F5F9,stroke:#64748B,stroke-width:2px,color:#1E293B,radius:20px;
classDef subGroup fill:#F8FAFC,stroke:#CBD5E1,stroke-width:1px,stroke-dasharray:4 4,radius:12px;
A((日常固定岗位)) --> B{临时项目启动?}
B -- 是 --> C[识别项目所需技能]
B -- 否 --> J[维持日常分工与协作]
J --> A
C --> D[从各Owner领域抽调成员]
D --> E[组建“虚拟小组”]
E --> F[明确目标与交付周期]
F --> G[敏捷执行项目]
G --> H{项目完成?}
H -- 否 --> G
H -- 是 --> I((小组解散,成员回归原岗位))
I --> A
%% 应用样式
class B,H decision;
class C,D,E,F,G,J operation;
class A,I startEnd;
%% 自定义连线样式(用 linkStyle 覆盖)
linkStyle 0 stroke:#94A3B8,stroke-width:2px;
linkStyle 1 stroke:#10B981,stroke-width:2.5px;
linkStyle 2 stroke:#94A3B8,stroke-width:1.5px,stroke-dasharray: 4 4;
linkStyle 3 stroke:#94A3B8,stroke-width:2px;
linkStyle 4 stroke:#94A3B8,stroke-width:2px;
linkStyle 5 stroke:#94A3B8,stroke-width:2px;
linkStyle 6 stroke:#94A3B8,stroke-width:2px;
linkStyle 7 stroke:#10B981,stroke-width:2.5px;
linkStyle 8 stroke:#94A3B8,stroke-width:1.5px,stroke-dasharray: 4 4;
linkStyle 9 stroke:#94A3B8,stroke-width:2px;
%% 额外:给“虚拟小组”等关键节点加个组框(视觉分组)
subgraph Group1 [项目执行阶段]
direction TB
E
F
G
H
end
style Group1 fill:#F8FAFC,stroke:#CBD5E1,stroke-width:1px,stroke-dasharray:4 4,color:#475569,font-size:12px,font-weight:bold;
轮值分享
这方面我之前也做得不好。最早的时候,组里技术分享就是随机性的——谁想起来就讲一讲,想不起来就算了。结果就是,永远是那两三个技术好的人上台讲,其他人默默当观众。时间一长,这几个人讲倦了,观众也听腻了。
后来我定了死规矩:技术分享轮流来,每两周一次,按名单轮,轮到谁谁讲,不许缺席。这个"不许缺席"很重要——很多人不是不想分享,是有轻微的社交恐惧,总觉得自己讲的东西不够高大上,怕被笑话。强制轮值以后反而放开了,因为反正都得讲,不如讲点自己真正踩过的坑。
我还加了一条:分享内容必须来自实战,不许拿网上的架构图念PPT。你可以讲最近解决的一个线上问题,可以讲你调研一个新技术的心得,可以讲你踩过的什么坑——但必须是你自己的东西。
每次分享完,讲的人要写一篇文档存进知识库。这个动作看起来多余,但其实非常关键。口头分享听完就散了,三个月以后谁也不记得了;写成文档以后,新人入职的时候可以自己翻,遇到类似问题也可以搜。
还有一个我觉得特别重要的制度:故障复盘。
我见过很多团队处理故障的方式——先恢复服务,然后开个会,气氛沉重,追问"谁干的"。这种方式只会让所有人都害怕出问题,出问题了第一反应是捂着不说,小问题拖成大问题。
我们的做法是:复盘会只做两件事,第一,找到根因(用5-Whys连续追问);第二,产出改进措施。改进措施必须落地——要么更新操作手册,要么写个自动化脚本,要么加个监控告警。如果复盘完没有任何实质性的产出,等于白开。
%%{init: {
'theme': 'base',
'themeVariables': {
'background': '#ffffff',
'primaryColor': '#EFF6FF',
'primaryBorderColor': '#3B82F6',
'primaryTextColor': '#1E293B',
'lineColor': '#94A3B8',
'secondaryColor': '#FEF3C7',
'tertiaryColor': '#F1F5F9',
'fontFamily': 'system-ui, -apple-system, "PingFang SC", sans-serif',
'fontSize': '14px',
'edgeLabelBackground': '#ffffff',
'nodeBorder': '2px',
'mainBkg': '#ffffff'
},
'flowchart': {
'curve': 'basis',
'padding': 24,
'nodeSpacing': 40,
'rankSpacing': 50,
'useMaxWidth': true
}
}}%%
graph LR
%% 定义样式类
classDef stage fill:#F8FAFC,stroke:#CBD5E1,stroke-width:1px,stroke-dasharray:4 4,color:#475569,font-weight:bold,font-size:13px;
classDef action fill:#EFF6FF,stroke:#3B82F6,stroke-width:2px,color:#1E3A8A,radius:8px;
classDef decision fill:#FEF3C7,stroke:#F59E0B,stroke-width:2px,color:#92400E,radius:8px;
classDef loop fill:#EDE9FE,stroke:#8B5CF6,stroke-width:2px,color:#5B21B6,stroke-dasharray:3 3,radius:8px;
subgraph A[🔴 故障发生与响应]
direction LR
A1[生产故障发生] --> A2[🚨 应急响应与恢复]
end
subgraph B[🔍 根因分析与复盘]
direction LR
B1[执行 5-Whys 分析] --> B2[📝 组织无指责复盘会议]
end
subgraph C[📚 知识固化与沉淀]
direction LR
C1[识别根本原因与改进点] --> C2[📄 更新 SOP 文档]
C1 --> C3[⚙️ 开发自动化脚本]
C1 --> C4[📖 形成知识库案例]
end
subgraph D[🚀 能力提升与闭环]
direction LR
D1[👥 团队分享与培训] --> D2[📊 建立监控与预防机制]
end
%% 核心流转连线(加粗强调)
A2 ==>|触发| B1
B2 ==>|产出| C1
C2 --> D1
C3 --> D1
C4 --> D1
D2 -.->|经验反哺| A1
%% 应用样式(类名对应上面定义)
class A,B,C,D stage;
class A1,A2,B1,B2,C1,C2,C3,C4,D1,D2 action;
%% 循环反哺线单独设样式(紫色虚线,类loop)
class D2 loop;
%% 子图样式(通过 style 指令微调背景)
style A fill:#FEF2F2,stroke:#F87171,stroke-width:2px,color:#991B1B
style B fill:#EFF6FF,stroke:#60A5FA,stroke-width:2px,color:#1E3A8A
style C fill:#F0FDF4,stroke:#34D399,stroke-width:2px,color:#065F46
style D fill:#F5F3FF,stroke:#A78BFA,stroke-width:2px,color:#5B21B6
而且复盘会上绝对不追个人责任。这个原则说起来简单,执行起来需要leader带头——你自己遇到问题的时候也坦然讲出来,大家才会觉得这是安全的。
多维考核
考核制度是个很微妙的东西。你考核什么,团队就会往什么方向使劲。
我之前看过一个特别典型的反面案例:某团队leader觉得团队产出不够,开始在周会上统计每个人的代码提交行数。结果你猜怎么着?一个月之后,代码量涨了三倍,但质量直线下降——有人把一个方法拆成三个,有人把注释写得比代码还长,有人开始大量复制粘贴。因为制度告诉他"行数=产出",他当然会想办法把行数搞上去。
所以考核制度的设计,你必须想清楚你想鼓励什么行为。
我们用的是OKR加KPI的组合。OKR管方向——比如"提升平台资源利用率",这是一个需要动脑子的挑战目标,没有标准答案,需要团队自己想办法。KPI管底线——代码质量不能低于多少,按时交付率不能低于多少,线上事故数不能超过多少。底线达不到,OKR完成度再高也不行。
但光看这些硬指标还不够。我还加了几个软性维度:方案设计有没有考虑扩展性和容错、遇到陌生问题的排查能力、知识贡献(文档和分享)、对业务结果的责任感。
| 维度 |
定义 |
示例 |
作用 |
| 目标(O) |
方向性的挑战 |
“提升云平台资源利用率” |
激发使命感 |
| 关键结果(KR) |
可量化的路标 |
“资源利用率提升30%” |
衡量业务价值 |
| KPI |
基础工作底线 |
代码质量、按时交付率 |
保障日常稳定 |
graph TD
%% 定义样式类(移除不兼容的 radius,改用 fill/ stroke 控制风格)
classDef goal fill:#FFF3E0,stroke:#FF9800,stroke-width:3px,color:#4E342E,font-weight:bold;
classDef kr fill:#E3F2FD,stroke:#1E88E5,stroke-width:2px,color:#0D47A1;
classDef kpi fill:#F5F5F5,stroke:#9E9E9E,stroke-width:1.5px,stroke-dasharray:4 4,color:#616161;
KPI1["📊 代码质量指标"]
KPI2["📊 需求准时交付率"]
KPI3["📊 线上事故数"]
O["🎯 目标(O):<br>提升平台资源利用率"]
KR1["🔑 关键结果1:<br>资源利用率提升30%"]
KR2["🔑 关键结果2:<br>投诉工单下降60%"]
%% 连线(去掉注释,保持索引干净)
KPI1 -.->|支撑| O
KPI2 -.->|支撑| O
KPI3 -.->|支撑| O
O -->|驱动| KR1
O -->|驱动| KR2
KR1 -.->|反馈| O
KR2 -.->|反馈| O
%% 应用样式
class O goal;
class KR1,KR2 kr;
class KPI1,KPI2,KPI3 kpi;
%% 连线样式(索引按顺序:0~6)
linkStyle 0 stroke:#9E9E9E,stroke-width:1.5px,stroke-dasharray:5 5;
linkStyle 1 stroke:#9E9E9E,stroke-width:1.5px,stroke-dasharray:5 5;
linkStyle 2 stroke:#9E9E9E,stroke-width:1.5px,stroke-dasharray:5 5;
linkStyle 3 stroke:#4CAF50,stroke-width:3px;
linkStyle 4 stroke:#4CAF50,stroke-width:3px;
linkStyle 5 stroke:#FF9800,stroke-width:2px,stroke-dasharray:4 4;
linkStyle 6 stroke:#FF9800,stroke-width:2px,stroke-dasharray:4 4;
这些东西不太好量化,但可以通过日常观察来评估。我的做法是,平时多跟团队成员一对一聊,了解他们在做的事情、遇到的困难、自己的想法。考核不是到了年底才开始做的,是平时就在积累素材。
梯队建设
我最怕的事情之一,就是团队里某个关键岗位的人突然要走。
曾经有一个同事,在组里干了三年,负责核心服务的运维。他做事非常靠谱,但也是唯一一个熟悉这套系统的人。他提离职的那天,我整个人是懵的——他的工作量、他脑子里的经验、他跟其他团队建立的各种协作关系,这些东西没法通过交接文档在一两周内转移给新人。
从那以后,我开始认真搞梯队建设。
核心岗位必须有Backup,这个是硬要求。每个Owner至少安排一个Backup跟着学,能独立处理日常问题。关键时刻Owner不在,系统能正常运转。
然后是识别和培养高潜成员。每半年我会做一次全面的评估,重点关注这几个特质:自驱力——不推不动和推了也不动是有区别的;技术基本功——不能只会照着文档操作;沟通能力——跟其他团队打交道能不能把事儿说清楚;分享意愿——愿意把自己的经验输出给团队。
对高潜成员,我会给更大的空间。让他们主导一些重要项目,安排对外技术分享,把有挑战性的任务交给他们。成长这个东西,光靠"学"是不够的,得真刀真枪干才能练出来。
内部轮岗也很有用。让A跟着B做一个季度的项目,然后B再跟着A做。这种交叉接触能让大家对整个系统有更全面的理解,也为未来可能的岗位调整做准备。
%%{init: {
'theme': 'base',
'themeVariables': {
'background': '#ffffff',
'primaryColor': '#F0F4FF',
'primaryBorderColor': '#4A6CF7',
'primaryTextColor': '#1E293B',
'lineColor': '#94A3B8',
'secondaryColor': '#FEF3C7',
'tertiaryColor': '#F0FDF4',
'fontFamily': 'system-ui, -apple-system, "PingFang SC", sans-serif',
'fontSize': '14px',
'edgeLabelBackground': '#ffffff',
'nodeBorder': '2px'
},
'flowchart': {
'curve': 'basis',
'padding': 24,
'nodeSpacing': 50,
'rankSpacing': 60,
'useMaxWidth': true
}
}}%%
graph TD
%% 样式类定义
classDef level1 fill:#FEF3C7,stroke:#F59E0B,stroke-width:3px,color:#92400E,font-weight:bold;
classDef level2 fill:#FDE68A,stroke:#D97706,stroke-width:2px,color:#78350F;
classDef level3 fill:#E0F2FE,stroke:#3B82F6,stroke-width:2px,color:#1E3A8A;
classDef level4 fill:#D1FAE5,stroke:#10B981,stroke-width:2px,color:#065F46;
classDef mechanism fill:#F3E8FF,stroke:#8B5CF6,stroke-width:2px,color:#5B21B6,stroke-dasharray:4 4;
subgraph 梯队层级
direction TB
L1[🧠 高级专家/架构师<br>战略规划与架构决策]
L2[💎 核心骨干<br>模块负责人与技术攻坚]
L3[🛠️ 中级工程师<br>独立执行与日常维护]
L4[🌱 初级工程师<br>在指导下成长]
end
subgraph 培养机制
direction TB
M1[🎯 高潜识别与定制培养]
M2[🔄 关键岗位备份计划]
M3[🚀 内部轮岗与影子项目]
M4[📢 对外技术分享<br>与影响力建设]
end
%% 晋升/成长主路径(粗实线,橙色→蓝→绿→黄表示成长方向)
L4 -->|👆 轮岗与备份| L3
L3 -->|👆 承担挑战项目| L2
L2 -->|👆 参与架构决策| L1
%% 培养机制对各层级的支撑(虚线,紫色)
M1 -.->|支撑| L4
M1 -.->|支撑| L3
M1 -.->|支撑| L2
M2 -.->|支撑| L3
M2 -.->|支撑| L2
M3 -.->|支撑| L4
M3 -.->|支撑| L3
M4 -.->|支撑| L2
M4 -.->|支撑| L1
%% 应用样式类
class L1 level1;
class L2 level2;
class L3 level3;
class L4 level4;
class M1,M2,M3,M4 mechanism;
%% 自定义连线样式
linkStyle 0 stroke:#F59E0B,stroke-width:3px;
linkStyle 1 stroke:#3B82F6,stroke-width:3px;
linkStyle 2 stroke:#10B981,stroke-width:3px;
linkStyle 3,4,5 stroke:#8B5CF6,stroke-width:2px,stroke-dasharray:4 4;
linkStyle 6,7 stroke:#8B5CF6,stroke-width:2px,stroke-dasharray:4 4;
linkStyle 8,9 stroke:#8B5CF6,stroke-width:2px,stroke-dasharray:4 4;
linkStyle 10,11 stroke:#8B5CF6,stroke-width:2px,stroke-dasharray:4 4;
%% 子图样式微调
style 梯队层级 fill:#F8FAFC,stroke:#CBD5E1,stroke-width:2px,color:#475569
style 培养机制 fill:#FAF5FF,stroke:#D8B4FE,stroke-width:2px,color:#6B21A8
经验沉淀
最后说一个我觉得很多团队都忽视的事情。
很多团队不是没有经验——上线踩过的坑、故障排查的思路、跟其他团队对接踩过的各种弯路,这些东西每天都在发生。但问题是,这些经验全在个人的脑子里,人一走就全没了。
我的组里有一个新人,入职第一天我就跟他说:你在这个组待一年,你解决过的每一个问题、踩过的每一个坑,最好都有记录。不一定写成特别正式的文档,哪怕是在wiki里写几行关键信息也行。因为这些信息对你来说可能是"我当然知道",但对下一个接手的人来说,可能是"我找了一天也没找到"的救命线索。
经验的沉淀有一个逐步升级的过程,我总结成五个阶段:
- 标准化——先统一规范。代码怎么写、部署怎么做、文档怎么记,先有个统一标准。没有标准,后面的所有沉淀都是空谈。
- 流程化——把常见操作写成SOP。上线流程、故障处理流程、迁移流程,全部固化成文档。新人照着做就行。
- 工具化——把SOP里的手工操作变成脚本。人手动的环节越少,出错的概率越低。
- 自动化——把脚本集成到流水线里。提交代码自动检查、自动构建、自动部署。减少人为干预。
- 产品化——把内部好用的组件封装成公共产品,让其他团队也能复用。这个做到后面就很有成就感了。
%%{init: {
'theme': 'base',
'themeVariables': {
'background': '#ffffff',
'primaryColor': '#F0F4FF',
'primaryBorderColor': '#4A6CF7',
'primaryTextColor': '#1E293B',
'lineColor': '#94A3B8',
'secondaryColor': '#FEF3C7',
'tertiaryColor': '#F0FDF4',
'fontFamily': 'system-ui, -apple-system, "PingFang SC", sans-serif',
'fontSize': '14px',
'edgeLabelBackground': '#ffffff',
'nodeBorder': '2px'
},
'flowchart': {
'curve': 'basis',
'padding': 24,
'nodeSpacing': 40,
'rankSpacing': 60,
'useMaxWidth': true
}
}}%%
graph LR
%% 样式类定义(从浅蓝到深蓝递进)
classDef step1 fill:#E3F2FD,stroke:#42A5F5,stroke-width:2px,color:#0D47A1,radius:10px,font-weight:bold;
classDef step2 fill:#BBDEFB,stroke:#1E88E5,stroke-width:2px,color:#0D47A1,radius:10px,font-weight:bold;
classDef step3 fill:#90CAF9,stroke:#1976D2,stroke-width:2px,color:#0D47A1,radius:10px,font-weight:bold;
classDef step4 fill:#64B5F6,stroke:#1565C0,stroke-width:2px,color:#FFFFFF,radius:10px,font-weight:bold;
classDef step5 fill:#1E88E5,stroke:#0D47A1,stroke-width:3px,color:#FFFFFF,radius:12px,font-weight:bold;
classDef feedback fill:#FFF3E0,stroke:#FF9800,stroke-width:2px,color:#E65100,radius:20px,font-weight:bold;
Step1["① 标准化<br>统一规范与约定"]
Step2["② 流程化<br>固化操作步骤为 SOP"]
Step3["③ 工具化<br>将 SOP 转化为辅助脚本"]
Step4["④ 自动化<br>集成工具形成自动化流水线"]
Step5["⑤ 产品化<br>提炼为可复用公共组件"]
%% 主演进路径(粗箭头递进)
Step1 ==>|演进| Step2
Step2 ==>|演进| Step3
Step3 ==>|演进| Step4
Step4 ==>|演进| Step5
%% 反馈闭环(橙色虚线,带标签)
Step5 -.->|🔄 反馈与迭代升级| Step1
%% 应用样式
class Step1 step1;
class Step2 step2;
class Step3 step3;
class Step4 step4;
class Step5 step5;
%% 闭环线特殊样式
linkStyle 4 stroke:#FF9800,stroke-width:2.5px,stroke-dasharray:6 4;
这五个阶段不是一次走完的,是慢慢迭代的。先从最痛的地方开始标准化,跑通了再往下一步推。别想着一口吃成胖子。
总结
说了这么多,其实归根到底就一句话:好的管理是让团队可以不需要你。
这不是说要把自己搞成可有可无的人——而是说,你最大的价值不是亲自干每一件事,而是搭建一套机制,让团队在没有你的时候也能运转良好。做到了这一点,你才有精力去思考更大、更远的事情。
当然,这些制度不是一天建成的,也不是一成不变的。我在执行过程中也在不断调整——有些制度推行不下去,说明要么时机不对,要么设计本身有问题,得回头看。别怕改,制度是为团队服务的,不是用来供奉的。