依赖跟踪
依赖跟踪确保任务关系可见性,及早识别阻塞问题,并实现更好的资源规划和风险缓解。
何时使用
- 多团队项目和程序
- 复杂的技术集成
- 跨组织倡议
- 识别关键路径项目
- 资源分配计划
- 防止进度延迟
- 新团队成员入职
指令
1. 依赖映射
# 依赖映射和跟踪
class DependencyTracker:
DEPENDENCY_TYPES = {
'Finish-to-Start': '任务B不能开始,直到任务A完成',
'Start-to-Start': '任务B不能开始,直到任务A开始',
'Finish-to-Finish': '任务B不能完成,直到任务A完成',
'Start-to-Finish': '任务B不能完成,直到任务A开始'
}
def __init__(self):
self.tasks = []
self.dependencies = []
self.critical_path = []
def create_dependency_map(self, tasks):
"""创建视觉依赖网络"""
dependency_graph = {
'nodes': [],
'edges': [],
'critical_items': []
}
for task in tasks:
dependency_graph['nodes'].append({
'id': task.id,
'name': task.name,
'duration': task.duration,
'owner': task.owner,
'status': task.status
})
for blocker in task.blocked_by:
dependency_graph['edges'].append({
'from': blocker,
'to': task.id,
'type': 'Finish-to-Start',
'lag': 0 # 天数任务间
})
return dependency_graph
def analyze_critical_path(self, tasks):
"""识别最长链的依赖任务"""
paths = self.find_all_paths(tasks)
critical_path = max(paths, key=len)
return {
'critical_items': critical_path,
'total_duration': sum(t.duration for t in critical_path),
'slack_available': 0,
'any_delay_impacts_schedule': True,
'monitoring_frequency': 'Daily'
}
def identify_blocking_dependencies(self, tasks):
"""找到阻碍其他工作的项目"""
blocking_tasks = {}
for task in tasks:
blocked_count = sum(1 for t in tasks if task.id in t.blocked_by)
if blocked_count > 0:
blocking_tasks[task.id] = {
'task': task.name,
'blocking_count': blocked_count,
'blocked_tasks': [t.id for t in tasks if task.id in t.blocked_by],
'status': task.status,
'due_date': task.due_date,
'risk_level': 'High' if blocked_count > 3 else 'Medium'
}
return blocking_tasks
def find_circular_dependencies(self, tasks):
"""检测循环依赖链"""
cycles = []
for task in tasks:
visited = set()
if self.has_cycle(task, visited, tasks):
cycles.append({
'cycle': visited,
'severity': 'Critical',
'action': '立即解决'
})
return cycles
def has_cycle(self, task, visited, tasks):
visited.add(task.id)
for blocker_id in task.blocked_by:
blocker = next(t for t in tasks if t.id == blocker_id)
if blocker.id in visited:
return True
if self.has_cycle(blocker, visited, tasks):
return True
visited.remove(task.id)
return False
2. 依赖管理看板
依赖跟踪仪表板:
项目:平台迁移Q1 2025
---
关键路径(阻塞进度):
任务:数据库迁移
ID: TASK-101
负责人:数据团队
持续时间:20天
状态:进行中(50%)
截止日期:2025年2月28日
被阻塞:模式验证(TASK-95)- 今天到期
阻塞:6个下游任务
风险等级:高
行动项目:
- 与数据团队每日站立会议
- 模式验证必须在EOD之前完成
- 准备回滚计划
---
任务:API合同最终确定
ID: TASK-102
负责人:后端团队
持续时间:10天
状态:待定(阻塞)
依赖于:数据库迁移(TASK-101)
阻塞:前端实现(TASK-103)、测试(TASK-104)
松弛时间:0天(关键)
早期开始:2025年3月1日
行动项目:
- 现在开始起草规范
- 与前端团队审查
- 准备替代方案
---
高风险依赖:
依赖:第三方集成
从:支付服务API(供应商)
到:结账系统(TASK-150)
类型:外部/不可控
状态:风险(供应商报告延迟)
缓解:模拟服务实现,确定替代供应商
升级负责人:产品经理
---
按团队依赖:
后端团队:
- 数据库迁移 → API开发
- 模式设计 → 数据层实现
外部:等待支付网关API文档
前端团队:
- API合同 → UI实现
- 设计系统 → 组件开发
依赖于后端:API合同规范(计划2月20日)
DevOps团队:
- 基础设施配置 → 测试环境
- Kubernetes设置 → 暂存部署
外部:云提供商配额批准
3. 依赖解决
// 处理和解决依赖问题
class DependencyResolution {
resolveDependencyConflict(blocker, blocked) {
return {
conflict: {
blocking_task: blocker.name,
blocked_task: blocked.name,
reason: '检测到循环依赖'
},
resolution_options: [
{
option: '并行工作',
description: '确定可以进行的独立部分',
effort: '中等',
timeline: '可以节省5天'
},
{
option: '移除/推迟阻塞者',
description: '推迟非关键需求',
effort: '低',
timeline: '立即'
},
{
option: '创建临时交付物',
description: '提供部分结果以解锁下游',
effort: '高',
timeline: '可以节省8天'
}
]
};
}
breakDependency(dependency) {
return {
current_state: dependency,
break_strategies: [
{
strategy: '移除不必要的依赖',
action: '重构以消除需求',
risk: '如果验证,风险低'
},
{
strategy: '模拟/桩外部依赖',
action: '创建临时实现',
risk: '中等 - 确保兼容性'
},
{
strategy: '并行开发',
action: '做出假设,稍后验证',
risk: '中等 - 可能需要重做'
},
{
strategy: '增加资源',
action: '并行工作流',
risk: '风险低但成本高'
}
]
};
}
handleBlockedTask(task) {
return {
task_id: task.id,
status: 'Blocked',
blocker: task.blocked_by[0],
time_blocked: task.calculateBlockedDuration(),
actions: [
'通知团队阻塞',
'如果关键路径则升级',
'确定替代工作',
'安排解决会议',
'跟踪阻塞关闭日期'
],
escalation: {
immediate: task.is_critical_path,
owner: task.program_manager,
frequency: '直到解决的每日站立'
}
};
}
}
4. 依赖仪表板指标
关键指标:
关键路径健康:
- 关键路径上的项目:12
- 风险项目:2(17%)
- 已完成:4(33%)
- 进度正常:6(50%)
- 落后:2(17%)
依赖状态:
- 总依赖:28
- 已解决:18
- 活跃:8
- 风险:2
- 循环:0(好!)
阻塞影响:
- 当前被阻塞的任务:3
- 团队成员空闲:2
- 被阻塞的工作量(人小时):24
- 阻塞估计成本:$2,400
升级:
- 打开:1(数据库迁移依赖)
- 本周已解决:0
- 平均解决时间:2.3天
最佳实践
✅ 要做
- 规划初期映射依赖
- 每周更新依赖跟踪
- 识别和监控关键路径项目
- 主动沟通阻塞者
- 为关键依赖制定应急计划
- 将复杂依赖分解为小块
- 分开跟踪外部依赖
- 立即升级被阻塞的关键路径项目
- 移除不必要的依赖
- 为风险依赖建立缓冲时间
❌ 不要做
- 忽视外部依赖
- 未解决循环依赖
- 假设依赖会“解决”
- 跳过关键路径的日常监控
- 仅在状态会议中沟通问题
- 创建太多依赖(耦合系统)
- 忘记记录依赖理由
- 避免升级被阻塞的关键工作
- 计划100%利用率(无依赖缓冲)
- 将所有依赖视为同等优先级
依赖管理提示
- 在跟踪工具中按风险等级颜色编码
- 每周审查被阻塞/风险项目
- 保持更新的依赖图
- 阻塞后1天内升级
- 为风险依赖建立15-20%的缓冲