第1860篇:技术领导力的修炼——从个人贡献者到带团队做AI项目的跨越
第1860篇:技术领导力的修炼——从个人贡献者到带团队做AI项目的跨越
去年我带着一个4人团队做完了一个完整的AI项目。
项目结束后做复盘,发现那三个月里,技术决策本身花了我不到20%的时间,剩下80%在做另外一些事:协调需求、拆解任务、做code review、处理团队成员之间的分歧、跟业务方沟通、帮团队成员解决各种卡住的问题……
这让我意识到:做技术Leader和做个人贡献者,是两件完全不同的事情,需要完全不同的能力集合。
这篇文章聊聊这个转变,以及在AI项目场景里的特殊挑战。
为什么AI项目的技术Leader特别难做
技术Leader这件事本来就不容易,AI项目让它更难了一层。
原因一:不确定性更高,决策难度更大
传统软件项目,大多数技术决策有相对明确的对错(用什么数据库、用什么架构模式)。AI项目的很多决策没有标准答案:用哪个embedding模型?chunk size设多大?要不要上Agent框架?这些问题需要在高度不确定性下做判断。
作为Leader,你既要给团队方向感,又不能假装你有所有答案。这个平衡很难拿捏。
原因二:成员能力水平不均等
AI工程是个相对新的领域,团队成员的能力差异可能很大:有人对LLM应用已经有一年以上的实践,有人是刚刚开始转型的Java工程师。如何给不同能力水平的成员分配合适的任务,同时让整个团队的能力都在提升,是个持续的挑战。
原因三:技术和业务的边界模糊
AI项目的"技术质量"和"业务效果"高度耦合。RAG的召回率是技术指标,但它直接影响的是用户满意度这个业务指标。作为技术Leader,你需要同时理解技术和业务两个维度,这比纯做技术要复杂很多。
第一个跨越:从"自己做好"到"让团队做好"
个人贡献者的价值来自于自己的产出:代码写得好、问题解决得快、技术方案设计得合理。
技术Leader的价值来自于团队的产出:团队整体的代码质量、团队解决问题的效率、团队技术方案的整体水平。
这个转变听起来很简单,但在实践中有很多具体的陷阱:
陷阱一:什么都自己做
很多技术人员成为Leader之后,遇到难题还是习惯性地自己冲上去解决。这短期内让问题解决得很快,但长期来看:团队成员没有机会面对难题、解决难题,成长不了。而且你的时间全花在具体的技术问题上,没有时间做Leader应该做的事情。
更好的做法:
把难题当作培养机会。当团队遇到一个你能快速解决但团队成员也能解决(可能要花更长时间)的问题时,把问题给团队成员去解决,你扮演顾问角色——给方向、提问题、在他们卡住时提供线索,而不是直接给答案。
陷阱二:没有标准,靠感觉做Code Review
个人贡献者做Code Review,靠的是自己的审美和经验。但作为Leader带团队,需要把"好代码的标准"显式化,而不是每次Review都基于你当天的感觉。
把这些标准写成文档,Code Review时对照检查,而不是凭感觉。
陷阱三:信息不透明
有些Leader习惯把信息"过滤"之后再传递给团队,觉得某些信息团队不需要知道。
这在短期内减少了沟通成本,但长期会造成团队对项目状态的认知偏差,也会让团队成员觉得自己只是"执行机器"而不是有主人翁意识的团队成员。
第二个跨越:建立技术决策框架
一个人做决策和带着团队做决策,最大的不同在于:带着团队做决策需要让决策过程透明,让团队成员理解和接受决策,而不只是执行决策。
AI项目中常见的技术决策类型和决策方式:
/**
* AI项目技术决策框架(示例)
*/
public enum DecisionType {
ARCHITECTURE_DECISION {
// 架构决策:影响全局,需要全团队讨论,Leader最终拍板
// 决策应该记录为ADR(Architecture Decision Record)
@Override
public String getProcess() {
return "需求调研 → 方案起草 → 全团队评审 → 修改完善 → Leader确认 → 记录ADR";
}
},
MODEL_SELECTION {
// 模型选型:影响较大,需要POC数据支撑,不能仅凭感觉
@Override
public String getProcess() {
return "明确评估维度 → 小规模POC → 量化结果对比 → 团队讨论 → 基于数据决策";
}
},
IMPLEMENTATION_DETAIL {
// 实现细节:由负责该模块的工程师决策,Leader备案即可
@Override
public String getProcess() {
return "工程师自主决策 → PR描述中说明选择原因 → Code Review时补充意见";
}
},
ROLLBACK_DECISION {
// 线上问题回滚:需要快速决策,一般由值班负责人直接决定
@Override
public String getProcess() {
return "值班工程师评估 → 超过5分钟未解决立即升级 → Leader授权回滚";
}
};
public abstract String getProcess();
}
/**
* ADR(架构决策记录)模板
* 每个重要的技术决策都应该有这样一份记录
*/
@Data
@Builder
public class ArchitectureDecisionRecord {
private String id; // ADR-001, ADR-002...
private String title; // 简短描述决策内容
private LocalDate date;
private String status; // Proposed / Accepted / Deprecated / Superseded
private String context; // 决策背景:为什么需要做这个决策
private String decision; // 决策内容:我们决定做什么
private String rationale; // 决策理由:为什么这么决定
private List<String> alternatives; // 考虑过的其他方案
private String consequences; // 决策后果:这个决策会带来什么影响
private List<String> relatedADRs; // 相关的其他ADR
/**
* ADR示例:RAG检索策略选型
*/
public static ArchitectureDecisionRecord ragRetrievalStrategy() {
return ArchitectureDecisionRecord.builder()
.id("ADR-003")
.title("RAG系统采用混合检索策略(向量+BM25)")
.date(LocalDate.now())
.status("Accepted")
.context("""
我们的知识问答系统需要从企业文档库中检索相关内容。
初始版本使用纯向量检索,在测试中发现对专有名词(产品代号、
专业术语)的检索精度不足,召回率仅有72%。
""")
.decision("""
采用混合检索策略:向量检索(语义相似度)+ BM25关键词检索,
通过RRF算法融合两路结果,再用Cross-Encoder进行重排序。
""")
.rationale("""
1. 向量检索擅长语义理解,BM25擅长精确匹配,两者互补
2. 我们的业务文档中有大量专有名词,仅靠语义检索会丢失很多精确匹配
3. POC数据:混合检索+重排序将召回率从72%提升至91%
4. 延迟增加约200ms(可接受范围内)
""")
.alternatives(Arrays.asList(
"纯向量检索:召回率72%,不满足要求",
"纯BM25关键词检索:对同义词和语义变体效果差",
"加入知识图谱:成本和复杂度过高,效果提升未经验证"
))
.consequences("""
正面:检索质量显著提升,为下游生成提供更好的上下文
负面:需要维护BM25索引,增加了系统复杂度;延迟略有增加
风险:BM25索引需要和向量库保持同步,需要注意数据一致性
""")
.relatedADRs(Arrays.asList("ADR-001(向量数据库选型)", "ADR-002(Embedding模型选型)"))
.build();
}
}ADR的价值不只是记录决策本身,更重要的是记录了为什么这么决定。三个月后当团队成员问"为什么当时用了混合检索",你不用凭记忆解释,直接看ADR就行。
第三个跨越:管理AI项目特有的不确定性
AI项目有一个传统软件项目没有的挑战:技术不确定性是真实的,不是借口。
在传统软件项目里,如果工程师说"这个功能不确定能不能实现",通常是在找借口——大多数软件功能只是时间问题,不是能不能的问题。
AI项目里,"这个效果不确定能不能达到"是真实的技术挑战。RAG的准确率能不能达到业务要求的85%,在没做实验之前真的不知道。
作为Leader,如何在这种不确定性下给团队和业务方一个可信的预期?
我用的方法是"范围承诺":
不要承诺:"这个功能的准确率会达到90%"
要承诺:"基于我们的POC数据和行业经验,我们的最佳估计是达到80-90%。
我们会在第2周完成第一轮测试,届时给出更精确的数字。
如果测试结果低于75%,我们会重新评估方案,在第3周给出应对策略。"这种承诺方式:
- 给出了你最好的估计(不是"不知道")
- 设置了观测点(第2周的测试结果)
- 给出了风险触发条件(低于75%)
- 承诺了风险应对的时间(第3周)
业务方通常可以接受这种有边界的承诺,比"我不确定"或者"肯定没问题"都要好。
第四个跨越:培养团队的AI工程能力
作为Leader,你的职责之一是让团队整体的能力在你的带领下成长。
AI工程能力的培养,有几个我觉得特别有效的方式:
1. 任务分配时刻意安排"拉伸性挑战"
每个任务都有"舒适区工作"(团队成员完全有把握的工作)和"拉伸区工作"(需要学新东西才能完成的工作)。
好的任务分配应该让团队成员有足够多的拉伸区工作,但又不是全部都是拉伸(那会让人崩溃)。一个参考比例是:70%舒适区、30%拉伸区。
2. 建立团队内部的技术分享节奏
每两周一次的内部技术分享(每次30分钟),由一名团队成员分享他最近学到的或者实践中遇到的有意思的技术问题。
这个活动的价值有几层:
- 分享者在准备的过程中会把知识整理得更系统
- 团队整体的知识面会逐步统一
- 建立了分享文化,长期来看对团队氛围很有价值
3. 代码Review当作教学场合
不要把Code Review只当成质量把关。把它当作教学机会:当发现一个更好的实现方式时,不只是说"这里要改成X",而是解释"这里为什么要改成X,改完之后有什么好处"。
这样的Review可能花的时间更长,但团队成员真正学到了东西,下次就不会犯同样的问题。
关于"技术活儿干多少"的平衡
一个常见的问题:做了Leader,还应该自己写多少代码?
没有标准答案,但几个原则:
保持技术判断力需要的最低限度的编码
如果你完全脱离代码,你对技术实现细节的判断力会退化,很难做出合理的技术决策。建议每周至少有一些时间自己动手,哪怕只是做一些原型验证或技术探索。
不要承担关键路径上的工作
关键路径上的工作(会阻塞团队进度的工作)不要自己揽,因为一旦你作为Leader被其他事情牵走,整个项目就卡住了。
做别人做不了的事情
你作为技术Leader的独特价值在于:系统架构决策、跨团队沟通、关键技术风险评估,这些是需要你的经验和视角才能做好的事情。把时间投在这里,比自己写业务代码更有价值。
最后:技术领导力是可以刻意培养的
很多人以为技术领导力是天赋,有的人天生适合,没有的人怎么学也学不会。
我不这么认为。
技术领导力是一系列可以刻意练习的能力:有效沟通、结构化思维、风险判断、团队激励……每一个都有它的学习路径。
但学习的方式和学技术不一样。技术学习靠读文档、刷题、写代码。领导力的学习靠反思和刻意实践:每次沟通之后复盘效果,每次决策之后复盘过程,每次团队问题之后复盘自己的处理方式。
如果你有机会带团队,不管是正式的还是非正式的,把每一次带队经历当成学习机会,认真复盘,认真改进。
假以时日,这个能力会成为你职业竞争力中最难以被复制的部分。
