一、先搞懂大项目多团队的“乱”根源
做过10人以上团队项目的人都懂,当产品拆成好几个团队,各管一块功能,最容易出两个问题:要么你做的登录和我做的支付连不上,要么大家都盯着自己的小任务,没人管整个产品的核心功能能不能用。
比如之前做过一个电商APP,拆成了四个团队:商品、订单、支付、用户。商品团队做商品详情页,订单团队做下单流程,结果上线前才发现,商品的“库存锁定”没给订单接口留字段,订单团队只能临时改,拖了一周上线。还有一次,四个团队都在赶自己的迭代任务,没人管APP的整体卡顿问题,最后用户投诉一堆,才回头补优化。
其实不是大家不认真,是之前的Scrum只适合小团队,一个产品负责人管一个团队,大家盯着同一个产品待办列表(就是Scrum里的Backlog)。但大项目拆成多团队后,每个团队都有自己的Backlog,没人管整个产品的全局需求,各做各的就乱了。
二、LeSS框架到底是啥?(不用记术语,懂逻辑就行)
之前的Scrum是“一个团队管一个产品”,那大项目拆成多个团队,能不能让多个团队管同一个产品?LeSS就是干这个的——把小团队的Scrum逻辑放大,让多个团队一起做同一个大产品,核心就是“两个统一”:统一的产品负责人,统一的产品待办列表(也就是我们说的系统级Backlog)。
2.1 LeSS的核心规则(说人话版)
别被LeSS的官方文档吓住,核心就三条: 第一,所有团队都是“特性团队”,不是“模块团队”。啥意思?之前的电商团队是模块团队:商品团队管商品模块,订单管订单模块。特性团队是,每个团队都能独立做一个完整的功能(特性),比如“商品详情页+库存锁定”这个功能,一个团队就能从前端到后端全做完,不用拆给两个团队。 第二,整个产品只有一个产品负责人,不是每个团队一个。产品负责人要盯着整个产品的核心目标,比如“今年要让用户下单转化率提升20%”,所有团队的任务都要围绕这个目标。 第三,所有团队共享同一个系统级Backlog,每个团队从这个大列表里挑自己要做的任务,不用自己建小列表。
2.2 为什么LeSS能解决“乱”的问题?
还是拿电商项目举例,之前的模块团队会有“接口不兼容”的问题,因为两个团队各管各的模块,没人管两个模块的衔接。而特性团队自己做一个完整的功能,从前端到后端全搞定,就不会有这个问题。另外,统一的产品负责人盯着全局目标,不会出现大家都做小任务、没人管核心功能的情况。
三、系统级Backlog怎么设计?(附完整示例)
系统级Backlog不是把所有团队的任务堆在一起,是要按“产品目标→特性→任务”的逻辑分层,每个层级的任务都要清晰,让每个团队都能看懂自己要做啥。
3.1 系统级Backlog的三层结构
第一层是产品目标,比如“今年Q4电商APP下单转化率提升20%”,所有任务都要围绕这个目标。 第二层是产品特性,也就是能给用户带来价值的完整功能,比如“商品详情页显示实时库存”“下单页支持地址自动填充”,这些特性要能独立上线,能给用户带来明确的好处。 第三层是具体任务,也就是每个特性拆成的可执行的小任务,比如“商品详情页的实时库存接口开发”“前端调用库存接口并渲染”。
3.2 完整示例(技术栈:Java+Vue3+MySQL)
先说明技术栈:后端用Java的SpringBoot框架,前端用Vue3,数据库用MySQL,所有特性团队都用这个技术栈,方便大家协作。
我们做一个电商APP的系统级Backlog,围绕产品目标“Q4下单转化率提升20%”来设计,用JSON格式来表示(因为JSON是结构化的,大家都能看懂)。
{
"productGoal": "Q4电商APP下单转化率提升20%", // 第一层:产品目标
"systemBacklog": [ // 第二层:产品特性列表
{
"featureId": "F001",
"featureName": "商品详情页显示实时库存", // 特性名称:用户能看到的完整功能
"featureDescription": "用户进入商品详情页时,实时显示商品当前的可购买库存,库存为0时显示“暂时售罄”", // 特性描述:给用户带来的价值
"priority": "高", // 优先级:影响转化率的核心特性,优先级高
"tasks": [ // 第三层:特性拆成的具体任务
{
"taskId": "T001-01",
"taskName": "后端开发实时库存接口",
"taskDescription": "开发SpringBoot接口,查询MySQL库存表,返回商品的实时可购买库存",
"estimate": "2人天", // 任务预估时间
"assigneeTeam": "特性团队A" // 负责的特性团队
},
{
"taskId": "T001-02",
"taskName": "前端开发库存显示逻辑",
"taskDescription": "Vue3前端调用实时库存接口,在商品详情页渲染库存,库存为0时显示“暂时售罄”",
"estimate": "1人天",
"assigneeTeam": "特性团队A"
}
]
},
{
"featureId": "F002",
"featureName": "下单页支持地址自动填充",
"featureDescription": "用户在下单页选择所在城市后,自动填充该城市的常用地址,减少用户输入时间",
"priority": "高",
"tasks": [
{
"taskId": "T002-01",
"taskName": "后端开发地址查询接口",
"taskDescription": "开发SpringBoot接口,查询MySQL地址表,返回指定城市的常用地址列表",
"estimate": "2人天",
"assigneeTeam": "特性团队B"
},
{
"taskId": "T002-02",
"taskName": "前端开发地址选择逻辑",
"taskDescription": "Vue3前端调用地址接口,用户选择城市后自动填充地址,支持修改",
"estimate": "1人天",
"assigneeTeam": "特性团队B"
}
]
},
{
"featureId": "F003",
"featureName": "支付页增加优惠券自动抵扣",
"featureDescription": "用户进入支付页时,自动匹配可使用的优惠券,直接抵扣订单金额,减少用户操作",
"priority": "中",
"tasks": [
{
"taskId": "T003-01",
"taskName": "后端开发优惠券匹配接口",
"taskDescription": "开发SpringBoot接口,根据订单金额、商品类型匹配用户可用的优惠券,计算抵扣金额",
"estimate": "3人天",
"assigneeTeam": "特性团队C"
},
{
"taskId": "T003-02",
"taskName": "前端开发优惠券显示逻辑",
"taskDescription": "Vue3前端调用优惠券接口,在支付页显示抵扣后的金额,支持切换优惠券",
"estimate": "2人天",
"assigneeTeam": "特性团队C"
}
]
}
]
}
3.3 系统级Backlog的更新规则
系统级Backlog不是写好就不变的,要每周更新一次: 第一,产品负责人要检查所有特性的优先级,比如发现“支付页增加优惠券自动抵扣”对转化率的影响比之前想的大,就把它的优先级从“中”改成“高”。 第二,每个特性团队要把自己完成的任务标成“已完成”,没完成的任务更新预估时间,比如特性团队A的“后端开发实时库存接口”本来预估2人天,结果遇到问题,要改成3人天,就要在Backlog里更新。 第三,每周要加新的特性,比如产品负责人发现“商品详情页增加用户评价”能提升转化率,就把这个特性加到Backlog里。
四、特性团队怎么工作?(附协作示例)
特性团队的核心是“能独立完成一个完整的特性”,所以每个团队的成员要覆盖全栈:至少有一个后端开发、一个前端开发、一个测试,不用每个团队都有架构师、产品经理,这些角色可以跨团队共享。
4.1 特性团队的日常工作流程
还是拿特性团队A做“商品详情页显示实时库存”这个特性举例,流程是这样的: 第一步,产品负责人把这个特性分给特性团队A,团队成员一起拆解任务,也就是我们之前Backlog里的T001-01和T001-02。 第二步,后端开发先写实时库存接口,写完后自己测试,然后给前端开发。 第三步,前端开发调用接口,写显示逻辑,写完后和后端一起联调,确保接口能正常调用,显示逻辑没问题。 第四步,测试人员测试整个特性:比如库存有100时显示“库存100”,库存为0时显示“暂时售罄”,库存更新后(比如有人买了一个),前端能实时显示最新库存。 第五步,整个特性测试通过后,产品负责人验收,没问题就可以上线。
4.2 特性团队的协作示例(技术栈:Java+Vue3+MySQL)
我们把特性团队A做“商品详情页显示实时库存”的具体代码写出来,让大家更清楚。
首先是后端的实时库存接口(SpringBoot):
@RestController
@RequestMapping("/api/product")
public class ProductController {
@Autowired
private ProductService productService;
// 实时库存接口:根据商品ID返回实时库存
@GetMapping("/stock/{productId}")
public ResponseEntity<Integer> getRealTimeStock(@PathVariable Long productId) {
// 调用Service层查询MySQL库存表,返回实时库存
Integer stock = productService.getRealTimeStock(productId);
return ResponseEntity.ok(stock);
}
}
然后是前端的库存显示逻辑(Vue3):
<template>
<div class="product-detail">
<h1>{{ productName }}</h1>
<!-- 显示实时库存,库存为0时显示售罄 -->
<p class="stock">
库存:{{ stock > 0 ? stock : '暂时售罄' }}
</p>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue';
import axios from 'axios';
// 商品ID,假设从路由参数获取
const productId = 123;
const stock = ref(0);
// 组件挂载时调用后端接口获取实时库存
onMounted(async () => {
try {
const response = await axios.get(`/api/product/stock/${productId}`);
stock.value = response.data;
} catch (error) {
console.error('获取库存失败', error);
}
});
</script>
这个例子里,特性团队A自己做了后端接口、前端逻辑、测试,整个特性独立完成,不用和其他团队衔接,就不会出现之前的接口不兼容问题。
五、应用场景、优缺点、注意事项
5.1 应用场景
LeSS框架和系统级Backlog适合什么项目? 第一,大项目,拆成3-8个团队的项目最合适(LeSS的官方建议是最多8个团队,再多的话产品负责人管不过来)。 第二,产品的核心目标清晰,能拆成多个独立的特性,比如电商APP、社交APP、企业管理系统这些产品,都适合。 第三,团队成员能覆盖全栈,每个团队至少有后端、前端、测试,不用依赖其他团队的特定角色。
5.2 技术优缺点
优点
第一,解决了多团队的接口不兼容问题,特性团队自己做完整的特性,不用和其他团队衔接。 第二,解决了多团队的目标不统一问题,统一的产品负责人盯着全局目标,所有任务都围绕目标。 第三,提高了团队的责任感,每个团队对自己做的特性负全责,从开发到上线都是自己管。
缺点
第一,对特性团队的要求高,每个团队都要有全栈能力,小团队可能做不到。 第二,产品负责人的压力大,要盯着整个产品的全局目标,还要管理系统级Backlog,能力不够的话会乱。 第三,团队规模不能太大,最多8个团队,再多的话产品负责人管不过来,特性团队的协作也会变复杂。
5.3 注意事项
第一,不要为了LeSS而LeSS,小项目(1-2个团队)就用原来的Scrum,不用搞LeSS。 第二,特性团队的技术栈要统一,比如都用Java+Vue3,不然团队之间的代码不兼容,协作更麻烦。 第三,系统级Backlog不能太复杂,每个特性要清晰,任务要可执行,不然团队看不懂,不知道要做啥。 第四,产品负责人要定期和所有团队沟通,比如每周开一次所有团队的同步会,了解每个团队的进度,解决遇到的问题。
六、文章总结
大项目拆成多团队,最容易出现接口不兼容、目标不统一的问题,LeSS框架就是解决这个问题的——让多个特性团队管同一个产品,共享同一个系统级Backlog,统一的产品负责人盯着全局目标。
系统级Backlog的核心是分层设计,从产品目标到特性再到具体任务,每个层级都清晰,让每个团队都能看懂自己要做啥。特性团队的核心是能独立完成一个完整的特性,不用和其他团队衔接,从开发到测试到上线都是自己管。
最后要提醒大家,LeSS不是万能的,要根据自己的项目情况来用,小项目不用搞,大项目符合条件的话,用LeSS能让多团队的协作更顺畅,产品上线更顺利。
Comments