西方老师.2021.软考高级-信息系统项目管理师 | 完结

6 阅读8分钟

进度管理是信息系统项目管理师(高级)考试中的核心考点,无论是上午理论题、下午案例分析题,还是论文写作,进度管理相关内容几乎每年必考。

一、关键路径法(CPM)

1.1 基本原理

关键路径是指网络图中从起点到终点最长路径,决定了项目的最短工期。关键路径上的活动总时差为0,任何延误都会直接影响项目总工期。

1.2 计算方法

  • 正推法:计算最早开始时间(ES)和最早完成时间(EF)

    • ES = max(紧前活动的EF)
    • EF = ES + 活动工期
  • 逆推法:计算最晚开始时间(LS)和最晚完成时间(LF)

    • LF = min(紧后活动的LS)
    • LS = LF - 活动工期
  • 总时差计算:TF = LS - ES = LF - EF

1.3 Python代码实现

python

复制

class CriticalPathCalculator:
    def __init__(self, activities):
        """
        activities: 字典,格式 {'活动名': {'duration': int, 'predecessors': []}}
        """
        self.activities = activities
        self.es = {}  # 最早开始时间
        self.ef = {}  # 最早完成时间
        self.ls = {}  # 最晚开始时间
        self.lf = {}  # 最晚完成时间
        self.tf = {}  # 总时差
        
    def forward_pass(self):
        """正推法计算最早时间"""
        # 初始化
        for act in self.activities:
            self.es[act] = 0
            self.ef[act] = 0
        
        # 按照拓扑顺序遍历
        for act in self.activities:
            preds = self.activities[act]['predecessors']
            if preds:
                self.es[act] = max([self.ef[p] for p in preds])
            else:
                self.es[act] = 0  # 起点活动
            
            self.ef[act] = self.es[act] + self.activities[act]['duration']
    
    def backward_pass(self):
        """逆推法计算最晚时间"""
        # 确定项目总工期
        project_duration = max(self.ef.values())
        
        # 初始化
        for act in self.activities:
            self.lf[act] = project_duration
        
        # 逆序遍历
        for act in reversed(list(self.activities.keys())):
            # 找出该活动的所有紧后活动
            successors = [a for a in self.activities 
                         if act in self.activities[a]['predecessors']]
            
            if successors:
                self.lf[act] = min([self.ls[s] for s in successors])
            else:
                self.lf[act] = project_duration
            
            self.ls[act] = self.lf[act] - self.activities[act]['duration']
    
    def calculate_slack(self):
        """计算总时差"""
        for act in self.activities:
            self.tf[act] = self.ls[act] - self.es[act]
    
    def get_critical_path(self):
        """获取关键路径上的活动"""
        return [act for act in self.activities if self.tf[act] == 0]
    
    def analyze(self):
        """执行完整分析"""
        print("=== 关键路径法分析 ===\n")
        
        # 执行计算
        self.forward_pass()
        self.backward_pass()
        self.calculate_slack()
        
        # 输出结果
        project_duration = max(self.ef.values())
        critical_path = self.get_critical_path()
        
        print(f"项目总工期:{project_duration}天")
        print(f"关键路径:{' → '.join(critical_path)}\n")
        
        print("活动时间参数表:")
        print(f"{'活动':<8} {'工期':<6} {'ES':<6} {'EF':<6} {'LS':<6} {'LF':<6} {'时差':<6}")
        print("-" * 50)
        
        for act in sorted(self.activities.keys()):
            print(f"{act:<8} {self.activities[act]['duration']:<6} "
                  f"{self.es[act]:<6} {self.ef[act]:<6} "
                  f"{self.ls[act]:<6} {self.lf[act]:<6} {self.tf[act]:<6}")
        
        print(f"\n关键路径上的活动:{', '.join(critical_path)}")
        return {
            'duration': project_duration,
            'critical_path': critical_path,
            'activities': self.activities,
            'es': self.es, 'ef': self.ef,
            'ls': self.ls, 'lf': self.lf,
            'tf': self.tf
        }


# 示例使用
def example_cpm_analysis():
    # 定义活动和依赖关系
    activities = {
        'A': {'duration': 3, 'predecessors': []},
        'B': {'duration': 4, 'predecessors': ['A']},
        'C': {'duration': 2, 'predecessors': ['A']},
        'D': {'duration': 5, 'predecessors': ['B', 'C']},
        'E': {'duration': 2, 'predecessors': ['D']}
    }
    
    calculator = CriticalPathCalculator(activities)
    result = calculator.analyze()
    
    return result


# 运行示例
if __name__ == "__main__":
    example_cpm_analysis()

引用

1.4 关键路径识别

根据总时差为零的原则,我们可以识别出关键路径。上面的代码会自动计算所有活动的时差,并输出关键路径上的活动列表。

二、工期压缩技术

当项目进度滞后时,项目经理需要采用技术手段缩短工期。信息系统项目管理师考试中主要考察以下技术:

2.1 赶工

定义:通过增加资源投入来缩短活动工期

特点

  • 适用于关键路径上的活动
  • 直接缩短活动工期
  • 通常会增加项目成本(加班费、额外人员费用)
  • 存在边际效应递减

2.2 快速跟进

定义:将原计划串行执行的活动改为并行执行

特点

  • 不增加资源,但改变活动逻辑关系
  • 通常会增加返工风险
  • 成本增幅小于赶工
  • 适用于可分解的活动

2.3 工期压缩决策模型

python

复制

class ScheduleCompressionAnalyzer:
    def __init__(self, activities):
        """
        activities: 格式 [{'name': '活动A', 'duration': 10, 'is_critical': True, 
                         'crash_cost_per_day': 2000, 'max_crash_days': 3}]
        """
        self.activities = activities
    
    def recommend_compression(self, target_reduction_days, budget_limit):
        """
        推荐工期压缩方案
        """
        recommendations = []
        
        # 筛选关键路径活动
        critical_activities = [a for a in self.activities if a['is_critical']]
        
        print(f"=== 工期压缩分析 ===")
        print(f"需要缩短:{target_reduction_days}天")
        print(f"预算限制:{budget_limit}元\n")
        
        for activity in critical_activities:
            if activity['max_crash_days'] > 0:
                cost = activity['crash_cost_per_day'] * activity['max_crash_days']
                if cost <= budget_limit:
                    recommendations.append({
                        'activity': activity['name'],
                        'possible_reduction': activity['max_crash_days'],
                        'total_cost': cost
                    })
        
        if not recommendations:
            print("没有可行的赶工方案")
            return None
        
        # 按成本效益排序
        recommendations.sort(key=lambda x: x['total_cost'])
        
        print("推荐的赶工方案:")
        print(f"{'活动':<10} {'可缩短(天)':<12} {'总成本(元)':<12}")
        print("-" * 36)
        
        for rec in recommendations:
            print(f"{rec['activity']:<10} {rec['possible_reduction']:<12} "
                  f"{rec['total_cost']:<12}")
        
        return recommendations


def example_compression_analysis():
    # 示例场景:项目需要缩短5天,预算2万元
    activities_list = [
        {'name': 'A', 'duration': 10, 'is_critical': True, 
         'crash_cost_per_day': 2000, 'max_crash_days': 3},
        {'name': 'B', 'duration': 8, 'is_critical': True,
         'crash_cost_per_day': 3000, 'max_crash': 2},
        {'name': 'C', 'duration': 6, 'is_critical': False,
         'crash_cost_per_day': 1500, 'max_crash_days': 2}
    ]
    
    analyzer = ScheduleCompressionAnalyzer(activities_list)
    analyzer.recommend_compression(target_reduction_days=5, budget_limit=20000)


if __name__ == "__main__":
    example_compression_analysis()

三、进度偏差分析(挣值管理)

挣值管理(EVM)是信息系统项目管理师考试中必考的计算题内容。通过对比计划价值(PV)、挣值(EV)和实际成本(AC),可以定量分析项目绩效。

3.1 核心指标

指标公式含义
计划价值(PV)计划完成工作的预算成本应该完成多少工作
挣值(EV)实际完成工作的预算成本实际完成了多少工作
实际成本(AC)实际消耗的成本花了多少钱

3.2 偏差和绩效指标

进度相关指标:
  • 进度偏差(SV)  = EV - PV

    • SV > 0:进度超前
    • SV = 0:按计划
    • SV < 0:进度落后
  • 进度绩效指数(SPI)  = EV / PV

    • SPI > 1:进度超前
    • SPI = 1:按计划
    • SPI < 1:进度落后
成本相关指标:
  • 成本偏差(CV)  = EV - AC

    • CV > 0:成本节约
    • CV = 0:按预算
    • CV < 0:成本超支
  • 成本绩效指数(CPI)  = EV / AC

    • CPI > 1:成本节约
    • CPI = 1:按预算
    • CPI < 1:成本超支

3.3 Python代码实现

python

复制

class EarnedValueAnalyzer:
    def __init__(self, pv, ev, ac):
        """
        pv: 计划价值
        ev: 挣值
        ac: 实际成本
        """
        self.pv = pv
        self.ev = ev
        self.ac = ac
    
    def calculate_metrics(self):
        """计算挣值管理指标"""
        # 偏差指标
        self.sv = self.ev - self.pv  # 进度偏差
        self.cv = self.ev - self.ac  # 成本偏差
        
        # 绩效指数
        self.spi = self.ev / self.pv if self.pv != 0 else 0  # 进度绩效指数
        self.cpi = self.ev / self.ac if self.ac != 0 else 0  # 成本绩效指数
        
        # 预测指标(假设典型偏差)
        self.bac = 100  # 完工预算(需要根据实际情况设置)
        self.eac = self.ac + (self.bac - self.ev) / self.cpi if self.cpi != 0 else 0
        self.etac = self.eac / (self.ac / self.ev) if self.ev != 0 else 0
        
        return self
    
    def generate_report(self):
        """生成分析报告"""
        print("\n=== 挣值管理分析报告 ===\n")
        
        # 基础数据
        print("【基础数据】")
        print(f"计划价值(PV):{self.pv}万元")
        print(f"挣值(EV):{self.ev}万元")
        print(f"实际成本(AC):{self.ac}万元\n")
        
        # 偏差分析
        print("【进度分析】")
        print(f"进度偏差(SV)= {self.sv}万元")
        print(f"进度状态:{'✓ 进度超前' if self.sv > 0 else '✗ 进度落后' if self.sv < 0 else '按计划'}")
        print(f"进度绩效指数(SPI)= {self.spi:.2f}")
        print(f"进度效率:{'✓ 高于计划' if self.spi > 1 else '✗ 低于计划' if self.spi < 1 else '符合计划'}\n")
        
        # 成本分析
        print("【成本分析】")
        print(f"成本偏差(CV)= {self.cv}万元")
        print(f"成本状态:{'✓ 成本节约' if self.cv > 0完成本超支'}")
        SPI < 0.8 时:采取**赶工**或**快速跟进**
- SPI > 1.2 时:检查是否存在质量问题或范围蔓延

**代码示例:进度纠偏建议生成器**

示例使用

def example_corrective_action():

场景:进度落后5万,成本超支3万

advisor = ScheduleCorrectiveActionAdvisor(sv=-5, cv=-3, spi=0.9, cpi=0.95)
advisor.print_recommendations()

if name == “main”:
example_corrective_action()

五、考试备考策略

5.1 计算题备考要点

  1. 掌握核心公式

    • 正推法:ES = max(紧前活动EF), EF = ES + 工期
    • 逆推法:LF = min(紧后活动LS), LS = LF - 工期
    • 时差计算:TF = LS - ES
    • 挣值管理:SV = EV - PV, SPI = EV / PV, CV = EV - AC, CPI = EV / AC
  2. 多画图练习

    • 手绘10个以上不同复杂度的网络图
    • 熟练计算所有活动的时间参数
  3. 使用代码工具辅助理解

    • 运行本文提供的Python代码
    • 验证手工计算结果
    • 加深对计算逻辑的理解

5.2 论文写作建议

进度管理论文可以从以下几个角度展开:

  1. 案例背景

    • 描述一个进度紧张的项目
    • 说明项目特点(工期紧、任务复杂、资源有限)
  2. 问题分析

    • 使用CPM找出关键路径
    • 通过挣值分析发现进度滞后
    • 分析滞后原因(资源不足、需求变更、技术难点)
  3. 解决方案

    • 使用赶工技术缩短关键路径活动工期
    • 采用快速跟进调整活动逻辑关系
    • 实施资源平衡优化资源分配
  4. 经验总结

    • 如何制定科学的进度计划
    • 如何通过挣值管理实现早期预警
    • 如何平衡进度、成本、质量三重约束

六、总结

进度管理是信息系统项目管理师考试的核心考点。通过本文的梳理,你应该掌握:

  1. 关键路径法(CPM):能够计算ES、EF、LS、LF、TF,识别关键路径
  2. 工期压缩技术:理解赶工和快速跟进的适用场景和成本影响
  3. 挣值管理(EVM):熟练运用SV、CV、SPI、CPI进行进度和成本偏差分析
  4. 实战代码工具:使用Python代码验证计算、生成分析报告、提供纠偏建议

这些工具不仅有助于备考,在实际项目管理工作中也能发挥重要作用。