Chapter 8

Construction Management

Project scheduling, estimation, and contracts.

Construction Management

Construction management encompasses the planning, coordination, and control of construction projects from inception to completion. This discipline integrates technical knowledge with management skills to deliver projects on time, within budget, and to specified quality standards while ensuring safety.

Project Delivery Methods

Design-Bid-Build (Traditional)

  • Owner contracts separately with designer and contractor
  • Sequential process: design completed before bidding
  • Clear separation of design and construction responsibilities

Advantages: Competitive pricing, clear scope Disadvantages: Longer duration, potential for claims

Design-Build

  • Single entity responsible for both design and construction
  • Overlapping design and construction phases
  • Single point of responsibility

Advantages: Faster delivery, single point of contact Disadvantages: Less owner control, difficult to compare bids

Construction Management at Risk (CMAR)

  • CM provides pre-construction services during design
  • CM guarantees maximum price (GMP)
  • Early contractor involvement

Advantages: Early cost input, collaborative approach Disadvantages: Potential conflicts of interest

Integrated Project Delivery (IPD)

  • Multiparty agreement with shared risk and reward
  • Collaborative decision-making
  • Building Information Modeling (BIM) integration

Cost Estimation

Types of Estimates

TypeAccuracyPurposeBasis
Conceptual-30% to +50%Feasibility$/SF, historical
Preliminary-15% to +30%BudgetMajor quantities
Detailed-10% to +15%BidComplete takeoff
Bid-5% to +10%ContractDetailed pricing

Cost Components

Direct Costs:

Direct Cost=Labor+Material+Equipment\text{Direct Cost} = \text{Labor} + \text{Material} + \text{Equipment}

Labor Cost:

Labor Cost=Quantity×HoursUnit×Hourly Rate\text{Labor Cost} = \text{Quantity} \times \frac{\text{Hours}}{\text{Unit}} \times \text{Hourly Rate}

Productivity:

Productivity=OutputInput=Units InstalledLabor Hours\text{Productivity} = \frac{\text{Output}}{\text{Input}} = \frac{\text{Units Installed}}{\text{Labor Hours}}

Material Cost:

Material Cost=Quantity×Unit Price×(1+Waste Factor)\text{Material Cost} = \text{Quantity} \times \text{Unit Price} \times (1 + \text{Waste Factor})

Equipment Cost:

Equipment Cost=Ownership Cost+Operating Cost\text{Equipment Cost} = \text{Ownership Cost} + \text{Operating Cost}

Indirect Costs (Overhead)

Project Overhead:

  • Field office and supervision
  • Temporary facilities
  • Safety and security
  • Insurance and bonds

General Overhead:

  • Home office expenses
  • Corporate administration
  • Typically 5-15% of direct costs

Markup

Bid Price=Direct Cost+Overhead+Profit+Contingency\text{Bid Price} = \text{Direct Cost} + \text{Overhead} + \text{Profit} + \text{Contingency}

Contingency: Typically 3-10% depending on project risk

Project Scheduling

Work Breakdown Structure (WBS)

Hierarchical decomposition of project scope:

  1. Project
  2. Phases
  3. Work packages
  4. Activities

Critical Path Method (CPM)

Activity Parameters:

  • Duration (D)
  • Early Start (ES)
  • Early Finish (EF) = ES + D
  • Late Start (LS)
  • Late Finish (LF) = LS + D
  • Total Float (TF) = LS - ES = LF - EF

Forward Pass (calculate ES, EF):

ESj=max(EFi) for all predecessors iES_j = \max(EF_i) \text{ for all predecessors } i EFj=ESj+DjEF_j = ES_j + D_j

Backward Pass (calculate LS, LF):

LFi=min(LSj) for all successors jLF_i = \min(LS_j) \text{ for all successors } j LSi=LFiDiLS_i = LF_i - D_i

Critical Path: Activities where TF = 0

Project Duration: EF of final activity

Activity Relationships

TypeNotationDescription
Finish-to-StartFSSuccessor starts after predecessor finishes
Start-to-StartSSSuccessor starts after predecessor starts
Finish-to-FinishFFSuccessor finishes after predecessor finishes
Start-to-FinishSFSuccessor finishes after predecessor starts

Lag: Delay between activities (positive value) Lead: Overlap between activities (negative lag)

Program Evaluation and Review Technique (PERT)

Three-Point Estimate:

te=to+4tm+tp6t_e = \frac{t_o + 4t_m + t_p}{6}

Where:

  • tot_o = optimistic duration
  • tmt_m = most likely duration
  • tpt_p = pessimistic duration

Standard Deviation:

σ=tpto6\sigma = \frac{t_p - t_o}{6}

Project Duration Variance:

σP2=σi2 (for critical path activities)\sigma_P^2 = \sum \sigma_i^2 \text{ (for critical path activities)}

Probability of Completion:

Z=TSTEσPZ = \frac{T_S - T_E}{\sigma_P}

Where TST_S = specified duration, TET_E = expected duration.

Resource Leveling

Objective: Minimize resource fluctuations while maintaining project duration

Methods:

  1. Activity splitting
  2. Float utilization
  3. Duration extension (if necessary)

Schedule Compression

Crashing: Add resources to reduce duration

Crash Cost Slope=CcCnDnDc\text{Crash Cost Slope} = \frac{C_c - C_n}{D_n - D_c}

Where:

  • CcC_c = crash cost
  • CnC_n = normal cost
  • DnD_n = normal duration
  • DcD_c = crash duration

Fast-Tracking: Overlap sequential activities

Contract Administration

Contract Types

Lump Sum (Fixed Price):

  • Fixed total price for defined scope
  • Contractor assumes cost risk
  • Requires complete design

Unit Price:

  • Price per unit of work
  • Quantities may vary
  • Final cost = \sum(Unit Price × Actual Quantity)

Cost-Plus:

  • Reimbursement of actual costs plus fee
  • Owner assumes cost risk
  • Variations: Cost + Fixed Fee, Cost + Percentage, GMP

Payment Terms

Progress Payments:

Payment=Work CompletedRetainagePrevious Payments\text{Payment} = \text{Work Completed} - \text{Retainage} - \text{Previous Payments}

Retainage: Typically 5-10% withheld until completion

Change Orders

Change Order Value=Direct Cost+Overhead+Profit\text{Change Order Value} = \text{Direct Cost} + \text{Overhead} + \text{Profit}

Typical markup on changes: 15-25%

Claims and Disputes

Common claim types:

  • Delay claims
  • Changed conditions
  • Acceleration
  • Scope changes

Project Control

Earned Value Management (EVM)

Key Metrics:

Planned Value (PV): Budgeted cost of work scheduled

PV=BCWSPV = \text{BCWS}

Earned Value (EV): Budgeted cost of work performed

EV=BCWP=%Complete×BACEV = \text{BCWP} = \%\text{Complete} \times \text{BAC}

Actual Cost (AC): Actual cost of work performed

AC=ACWPAC = \text{ACWP}

Budget at Completion (BAC): Total project budget

Cost Performance

Cost Variance:

CV=EVACCV = EV - AC

Cost Performance Index:

CPI=EVACCPI = \frac{EV}{AC}
  • CPI > 1: Under budget
  • CPI < 1: Over budget

Schedule Performance

Schedule Variance:

SV=EVPVSV = EV - PV

Schedule Performance Index:

SPI=EVPVSPI = \frac{EV}{PV}
  • SPI > 1: Ahead of schedule
  • SPI < 1: Behind schedule

Forecasting

Estimate at Completion (EAC):

If future work at budgeted rates:

EAC=AC+(BACEV)EAC = AC + (BAC - EV)

If future work at current CPI:

EAC=BACCPIEAC = \frac{BAC}{CPI}

Combined index:

EAC=AC+BACEVCPI×SPIEAC = AC + \frac{BAC - EV}{CPI \times SPI}

Estimate to Complete:

ETC=EACACETC = EAC - AC

Variance at Completion:

VAC=BACEACVAC = BAC - EAC

To-Complete Performance Index:

TCPI=BACEVBACACTCPI = \frac{BAC - EV}{BAC - AC}

Construction Safety

Key Metrics

Incident Rate:

IR=Number of Incidents×200,000Total Hours WorkedIR = \frac{\text{Number of Incidents} \times 200,000}{\text{Total Hours Worked}}

Experience Modification Rate (EMR): Comparison to industry average

Safety Management

  1. Hazard identification
  2. Risk assessment
  3. Control measures hierarchy:
    • Elimination
    • Substitution
    • Engineering controls
    • Administrative controls
    • Personal protective equipment (PPE)

Real-World Application: Project Schedule Development

Developing a CPM schedule for a building construction project.

Schedule Analysis Example

import math
from collections import defaultdict

# Activity data: (ID, Duration, Predecessors)
activities = {
    'A': {'name': 'Site Preparation', 'duration': 5, 'predecessors': []},
    'B': {'name': 'Excavation', 'duration': 8, 'predecessors': ['A']},
    'C': {'name': 'Foundation', 'duration': 12, 'predecessors': ['B']},
    'D': {'name': 'Underground Utilities', 'duration': 6, 'predecessors': ['B']},
    'E': {'name': 'Structural Steel', 'duration': 15, 'predecessors': ['C']},
    'F': {'name': 'Roofing', 'duration': 8, 'predecessors': ['E']},
    'G': {'name': 'Exterior Walls', 'duration': 10, 'predecessors': ['E']},
    'H': {'name': 'MEP Rough-in', 'duration': 12, 'predecessors': ['D', 'E']},
    'I': {'name': 'Interior Finishes', 'duration': 18, 'predecessors': ['F', 'G', 'H']},
    'J': {'name': 'Final Inspections', 'duration': 3, 'predecessors': ['I']},
}

# Forward pass
es = {}
ef = {}

def get_es(act_id):
    if act_id in es:
        return es[act_id]

    preds = activities[act_id]['predecessors']
    if not preds:
        es[act_id] = 0
    else:
        es[act_id] = max(get_ef(p) for p in preds)

    return es[act_id]

def get_ef(act_id):
    if act_id in ef:
        return ef[act_id]
    ef[act_id] = get_es(act_id) + activities[act_id]['duration']
    return ef[act_id]

# Calculate ES and EF for all activities
for act_id in activities:
    get_ef(act_id)

# Project duration
project_duration = max(ef.values())

# Backward pass
ls = {}
lf = {}

# Find successors for each activity
successors = defaultdict(list)
for act_id, data in activities.items():
    for pred in data['predecessors']:
        successors[pred].append(act_id)

def get_lf(act_id):
    if act_id in lf:
        return lf[act_id]

    succs = successors[act_id]
    if not succs:
        lf[act_id] = project_duration
    else:
        lf[act_id] = min(get_ls(s) for s in succs)

    return lf[act_id]

def get_ls(act_id):
    if act_id in ls:
        return ls[act_id]
    ls[act_id] = get_lf(act_id) - activities[act_id]['duration']
    return ls[act_id]

# Calculate LS and LF for all activities
for act_id in activities:
    get_ls(act_id)

# Calculate float and identify critical path
print(f"CPM Schedule Analysis")
print(f"=" * 70)
print(f"\n{'Activity':<5} {'Name':<22} {'Dur':>4} {'ES':>4} {'EF':>4} {'LS':>4} {'LF':>4} {'TF':>4} {'Crit':<5}")
print("-" * 70)

critical_path = []
for act_id in sorted(activities.keys()):
    tf = ls[act_id] - es[act_id]
    is_critical = tf == 0
    if is_critical:
        critical_path.append(act_id)

    print(f"{act_id:<5} {activities[act_id]['name']:<22} {activities[act_id]['duration']:>4} "
          f"{es[act_id]:>4} {ef[act_id]:>4} {ls[act_id]:>4} {lf[act_id]:>4} {tf:>4} {'YES' if is_critical else '':<5}")

print(f"\nProject Duration: {project_duration} days")
print(f"Critical Path: {' -> '.join(critical_path)}")

# Calculate critical path length
cp_duration = sum(activities[a]['duration'] for a in critical_path)
print(f"Critical Path Duration: {cp_duration} days")

Your Challenge: Earned Value Analysis

Perform earned value analysis for a construction project to assess performance.

Goal: Calculate EVM metrics and forecast final project cost and completion.

Problem Setup

import math

# Project data at month 6 status date
project_status = {
    'budget_at_completion': 2500000,  # $
    'planned_duration': 12,            # months
    'current_month': 6,

    # Work packages with planned and actual progress
    'work_packages': [
        {'name': 'Foundations', 'budget': 400000, 'planned_pct': 100, 'actual_pct': 100, 'actual_cost': 420000},
        {'name': 'Structural', 'budget': 600000, 'planned_pct': 80, 'actual_pct': 70, 'actual_cost': 450000},
        {'name': 'MEP', 'budget': 500000, 'planned_pct': 50, 'actual_pct': 40, 'actual_cost': 230000},
        {'name': 'Exterior', 'budget': 350000, 'planned_pct': 30, 'actual_pct': 25, 'actual_cost': 100000},
        {'name': 'Interior', 'budget': 450000, 'planned_pct': 10, 'actual_pct': 5, 'actual_cost': 30000},
        {'name': 'Sitework', 'budget': 200000, 'planned_pct': 60, 'actual_pct': 55, 'actual_cost': 115000},
    ]
}

BAC = project_status['budget_at_completion']

# Calculate EVM metrics
PV_total = 0
EV_total = 0
AC_total = 0

print(f"Earned Value Management Analysis - Month {project_status['current_month']}")
print(f"=" * 75)
print(f"\n{'Work Package':<15} {'Budget':>10} {'PV':>10} {'EV':>10} {'AC':>10} {'CV':>10} {'SV':>10}")
print("-" * 75)

for wp in project_status['work_packages']:
    pv = wp['budget'] * wp['planned_pct'] / 100
    ev = wp['budget'] * wp['actual_pct'] / 100
    ac = wp['actual_cost']
    cv = ev - ac
    sv = ev - pv

    PV_total += pv
    EV_total += ev
    AC_total += ac

    print(f"{wp['name']:<15} ${wp['budget']:>9,} ${pv:>9,.0f} ${ev:>9,.0f} ${ac:>9,.0f} ${cv:>9,.0f} ${sv:>9,.0f}")

print("-" * 75)
print(f"{'TOTAL':<15} ${BAC:>9,} ${PV_total:>9,.0f} ${EV_total:>9,.0f} ${AC_total:>9,.0f} "
      f"${EV_total-AC_total:>9,.0f} ${EV_total-PV_total:>9,.0f}")

# Calculate performance indices
CV = EV_total - AC_total
SV = EV_total - PV_total
CPI = EV_total / AC_total
SPI = EV_total / PV_total

print(f"\nPerformance Indices:")
print(f"  Cost Variance (CV): ${CV:,.0f}")
print(f"  Schedule Variance (SV): ${SV:,.0f}")
print(f"  Cost Performance Index (CPI): {CPI:.3f}")
print(f"  Schedule Performance Index (SPI): {SPI:.3f}")

# Status interpretation
cost_status = "Under budget" if CPI > 1 else "Over budget"
schedule_status = "Ahead of schedule" if SPI > 1 else "Behind schedule"

print(f"\nProject Status:")
print(f"  Cost: {cost_status} ({abs(1-CPI)*100:.1f}%)")
print(f"  Schedule: {schedule_status} ({abs(1-SPI)*100:.1f}%)")

# Forecasting
EAC_cpi = BAC / CPI  # Assuming current performance continues
EAC_combined = AC_total + (BAC - EV_total) / (CPI * SPI)
ETC = EAC_cpi - AC_total
VAC = BAC - EAC_cpi

print(f"\nForecasting:")
print(f"  Estimate at Completion (EAC): ${EAC_cpi:,.0f}")
print(f"  Estimate to Complete (ETC): ${ETC:,.0f}")
print(f"  Variance at Completion (VAC): ${VAC:,.0f}")

# To-Complete Performance Index
TCPI = (BAC - EV_total) / (BAC - AC_total)
print(f"  To-Complete Performance Index (TCPI): {TCPI:.3f}")

if TCPI > 1.1:
    print(f"  WARNING: Meeting budget will be very difficult (TCPI > 1.1)")
elif TCPI > 1.0:
    print(f"  CAUTION: Improvement needed to meet budget")
else:
    print(f"  Project can meet budget with current performance")

# Schedule completion estimate
months_remaining = project_status['planned_duration'] - project_status['current_month']
estimated_duration = project_status['current_month'] + months_remaining / SPI
schedule_variance_months = estimated_duration - project_status['planned_duration']

print(f"\nSchedule Forecast:")
print(f"  Estimated completion: Month {estimated_duration:.1f}")
print(f"  Schedule variance: {schedule_variance_months:+.1f} months")

What corrective actions would you recommend based on this analysis, and how would you prioritize them?

ELI10 Explanation

Simple analogy for better understanding

Building something big like a school or a bridge is like putting together the world's biggest puzzle while racing against a clock! Construction management is about planning everything perfectly - figuring out what materials you need, who will do each job, when each step should happen, and how much it will all cost. It's like being the director of a movie, but instead of actors, you're coordinating hundreds of workers, trucks, and machines to turn blueprints into real buildings. If you mess up the order or timing, it's like trying to put the roof on before the walls are built!

Self-Examination

Q1.

How is the Critical Path Method used to determine project duration and identify critical activities?

Q2.

What are the main components of a construction cost estimate and how are they developed?

Q3.

What are the key differences between lump sum, unit price, and cost-plus contracts?

Q4.

How does the earned value method track project performance in terms of schedule and cost?

Q5.

What are the primary responsibilities and relationships in a typical construction project organization?