TechLead
Lesson 14 of 30
5 min read
Project Management

Risk Management

Master risk identification, assessment, response planning, and monitoring with probability-impact matrices, risk registers, and contingency planning

What Is Project Risk?

A risk is an uncertain event or condition that, if it occurs, has a positive or negative effect on a project's objectives. Most people think of risks as negative (threats), but risks can also be positive (opportunities). Effective risk management does not eliminate uncertainty — it prepares the team to handle it.

Studies show that organizations with mature risk management practices complete 70% of projects on time and budget, compared to only 35% for organizations without. Risk management is the difference between proactive leadership and reactive firefighting.

Risk Identification Techniques

Technique Description When to Use
BrainstormingTeam generates risks freely without judgmentInitial risk identification workshop
ChecklistsReview predefined risk categories from past projectsSupplement to brainstorming; ensures coverage
SWOT AnalysisExamine Strengths, Weaknesses, Opportunities, ThreatsStrategic project assessment
Expert InterviewsConsult subject matter experts and experienced PMsComplex or unfamiliar domains
Assumption AnalysisChallenge every assumption — failed assumptions become risksPlanning phase
Pre-MortemImagine the project has failed — what caused it?Project kickoff

Risk Assessment: Probability x Impact Matrix

Once risks are identified, each is assessed on two dimensions: probability (how likely is it?) and impact (how bad would it be?). The combination determines the risk level and response priority.

Probability x Impact Matrix

Probability / Impact Very Low Low Medium High Very High
Very High (>80%)MediumMediumHighCriticalCritical
High (60-80%)LowMediumMediumHighCritical
Medium (40-60%)LowLowMediumHighHigh
Low (20-40%)LowLowLowMediumMedium
Very Low (<20%)LowLowLowLowMedium

Risk Response Strategies

For Threats (Negative Risks)

  • Avoid: Change the plan to eliminate the risk entirely. Example: Use a proven technology instead of an experimental one.
  • Mitigate: Reduce probability or impact. Example: Add automated testing to reduce the risk of regression bugs.
  • Transfer: Shift the risk to a third party. Example: Use a managed database service instead of self-hosting.
  • Accept: Acknowledge the risk and prepare a contingency plan (active acceptance) or do nothing (passive acceptance).

Risk Register Template

// Risk Register Data Model
interface Risk {
  id: string;
  title: string;
  description: string;
  category: 'technical' | 'schedule' | 'cost' | 'resource' | 'external' | 'organizational';
  probability: 1 | 2 | 3 | 4 | 5; // 1=Very Low, 5=Very High
  impact: 1 | 2 | 3 | 4 | 5;
  riskScore: number; // probability * impact
  priority: 'critical' | 'high' | 'medium' | 'low';
  responseStrategy: 'avoid' | 'mitigate' | 'transfer' | 'accept';
  responsePlan: string;
  owner: string;
  triggerConditions: string[];
  contingencyPlan: string;
  status: 'identified' | 'analyzing' | 'monitored' | 'occurred' | 'closed';
  dateIdentified: Date;
  lastReviewDate: Date;
}

interface RiskRegister {
  projectId: string;
  risks: Risk[];
  reviewFrequency: 'weekly' | 'bi-weekly' | 'monthly';
  lastReview: Date;
  nextReview: Date;
}

// Example IT project risk register
const projectRiskRegister: RiskRegister = {
  projectId: 'PRJ-2024-042',
  risks: [
    {
      id: 'R-001',
      title: 'Key developer leaves during critical phase',
      description: 'The senior backend engineer who owns the payment service could leave the company',
      category: 'resource',
      probability: 2,
      impact: 5,
      riskScore: 10,
      priority: 'high',
      responseStrategy: 'mitigate',
      responsePlan: 'Cross-train a second engineer on the payment service. Document all architectural decisions. Conduct knowledge sharing sessions bi-weekly.',
      owner: 'Tech Lead',
      triggerConditions: ['Engineer gives resignation notice', 'Engineer expresses dissatisfaction in 1:1'],
      contingencyPlan: 'Engage contract senior engineer from preferred vendor list. Budget: $50K contingency.',
      status: 'monitored',
      dateIdentified: new Date('2024-03-01'),
      lastReviewDate: new Date('2024-03-15')
    },
    {
      id: 'R-002',
      title: 'Third-party payment API breaking changes',
      description: 'Stripe may release API v3 during our development, requiring migration',
      category: 'external',
      probability: 3,
      impact: 3,
      riskScore: 9,
      priority: 'medium',
      responseStrategy: 'mitigate',
      responsePlan: 'Implement adapter pattern to isolate payment provider integration. Pin API version. Monitor Stripe changelog.',
      owner: 'Backend Team',
      triggerConditions: ['Stripe announces deprecation', 'API version sunset date within 6 months'],
      contingencyPlan: 'Allocate 1 sprint for migration. Pre-build adapter layer allows swap without changing business logic.',
      status: 'monitored',
      dateIdentified: new Date('2024-03-05'),
      lastReviewDate: new Date('2024-03-15')
    },
    {
      id: 'R-003',
      title: 'Performance requirements not met',
      description: 'Page load times may exceed the 2-second requirement under peak load',
      category: 'technical',
      probability: 3,
      impact: 4,
      riskScore: 12,
      priority: 'high',
      responseStrategy: 'mitigate',
      responsePlan: 'Implement performance testing in CI pipeline from sprint 2. Set up load testing with k6 for peak scenarios. Profile and optimize early.',
      owner: 'Tech Lead',
      triggerConditions: ['P95 latency exceeds 1.5s in staging', 'Load test shows degradation above 500 concurrent users'],
      contingencyPlan: 'Add CDN layer, implement server-side caching, consider horizontal scaling. Budget $10K for additional infrastructure.',
      status: 'monitored',
      dateIdentified: new Date('2024-03-01'),
      lastReviewDate: new Date('2024-03-15')
    }
  ],
  reviewFrequency: 'bi-weekly',
  lastReview: new Date('2024-03-15'),
  nextReview: new Date('2024-03-29')
};

// Risk score calculator
function categorizeRisk(probability: number, impact: number): string {
  const score = probability * impact;
  if (score >= 15) return 'critical';
  if (score >= 10) return 'high';
  if (score >= 5) return 'medium';
  return 'low';
}

Known Unknowns vs. Unknown Unknowns

Two Types of Uncertainty

  • Known Unknowns: Risks you can identify but cannot predict the outcome. These go in your risk register. Example: "We know the third-party API might change, but we do not know when."
  • Unknown Unknowns: Risks you cannot even imagine. These are handled through management reserves (budget buffer) and Agile practices (short iterations that reveal unknowns early). Example: A global pandemic disrupting your supply chain.

Contingency reserves cover known unknowns. Management reserves cover unknown unknowns. Typical split: 10-15% contingency + 5-10% management reserve.

Risk Review Best Practices

  • Review Regularly: Bi-weekly for active projects, monthly for lower-risk projects
  • Assign Owners: Every risk must have one person accountable for monitoring and response
  • Track Triggers: Define observable conditions that indicate a risk is about to occur
  • Close Resolved Risks: Risks that are no longer relevant should be closed with a resolution note
  • Add New Risks: Every sprint may reveal new risks — keep the register alive

Continue Learning