Preparing your learning space...
67% through FDE Project Management tutorials
Risk management is the discipline of identifying what could go wrong, assessing how likely and how painful each problem would be, and putting plans in place before the problems arrive. In field engineering, the cost of unseen risks is unplanned outages, broken trust, and missed deadlines.
Risk identification is the act of listing everything that could threaten the project before it becomes a fire. Done early, it turns surprises into planned-for scenarios.
Why it is useful: You can't manage a risk you haven't named. Most project failures aren't caused by the risk that "couldn't happen" — they're caused by the risk nobody wrote down.
Look in these places for the biggest haul:
| Source | Examples |
|---|---|
| Assumptions | "SSO will be ready" — what if it isn't? |
| Dependencies | Third-party APIs, customer data, another team's release |
| People | The one person who knows a system goes on leave |
| Data | Messy data, wrong format, missing fields |
| Security | Access to customer systems, credentials exposure |
| Schedule | A buffer-less plan built from optimistic estimates |
assumptions = [
"Customer SSO will be available by week 2",
"Export dataset stays under 500k rows",
"The Ops contact can review the demo weekly",
]
for assumption in assumptions:
print(f"Assumption: {assumption}")
print(f" Risk: what if this is false? What do we do then?\n")
Simple explanation: Every assumption is a risk in disguise. Walking through each assumption and asking "what if it's false?" is the fastest way to produce a first risk list — no complex tooling needed.
Assessment rates each risk by two questions: how likely is it, and how painful would it be? Combining them gives you a score you can use to decide where to spend attention.
Why it is useful: Not all risks are equal. Scoring separates the "could sink us" risks from the "barely worth a thought" ones, so you don't waste effort on the wrong list.
Rate likelihood and impact from 1 (low) to 5 (high); multiply for the score.
| Impact 1 | Impact 3 | Impact 5 | |
|---|---|---|---|
| Likelihood 5 | 5 | 15 | 25 |
| Likelihood 3 | 3 | 9 | 15 |
| Likelihood 1 | 1 | 3 | 5 |
A score of 12+ usually means "act now." Below that, monitor.
risks = [
{"id": "R1", "risk": "Customer IT contact leaves mid-project",
"prob": 3, "impact": 4, "score": 12,
"strategy": "Mitigate", "owner": "FDE"},
{"id": "R2", "risk": "Export API rate limit blocks large pulls",
"prob": 2, "impact": 3, "score": 6,
"strategy": "Accept + monitor", "owner": "FDE"},
]
for r in sorted(risks, key=lambda x: -x["score"]):
print(f"{r['id']} {r['risk']}: {r['score']} -> {r['strategy']}")
Simple explanation: The score (probability × impact) gives each risk a number so you can sort them. R1 scores 12 and gets an owner plus a mitigation; R2 scores 6 and is accepted with monitoring. The register records not just the risk but the decision.
Once a risk is scored, choose a response strategy. This is where you decide what you'll do about it, and what you'll do if it happens anyway.
Why it is useful: A plan made calmly in advance beats a decision made in panic during an outage.
| Strategy | What it means | Example |
|---|---|---|
| Avoid | Remove the cause | Use a managed service instead of running it yourself |
| Mitigate | Reduce likelihood or impact | Add a backup owner for the critical contact |
| Transfer | Shift the risk to someone else | Buy support, use a vendor's SLA |
| Accept | Knowingly take the risk | Low impact, worth it; monitor anyway |
| Escalate | Push it up where more authority exists | Customer won't approve a deadline change |
Risk R1: Customer IT contact leaves mid-project
Mitigation (reduce the chance we're harmed):
- Meet the backup IT contact in week 1
- Store all decisions in a shared doc, not private chats
- Record credentials/access in the vault with a second approver
Contingency (if the risk fires anyway):
- Pause decisions needing IT approval
- Escalate to the sponsor to name a new contact within 2 days
Simple explanation: Mitigation lowers the chance or damage before the risk fires; contingency is the plan you execute after it fires. Having both means the risk is handled whether or not it actually happens.
Monitoring is the habit of reviewing the risk register regularly and acting when things change. Risks aren't static. They appear, fade, upgrade, and downgrade.
Why it is useful: A risk register written once and never touched is fiction. The whole point is that likelihood and impact move as the project evolves.
def weekly_review(risks, trigger_score=12):
active = [r for r in risks if r["score"] >= trigger_score]
print(f"{len(active)} risk(s) need attention this week")
for r in active:
print(" -", r["id"], r["risk"])
print("Re-score each risk and check assumption changes.")
weekly_review(risks)
Simple explanation: A short weekly ritual — re-score the list, update assumption changes, check triggers — keeps the register alive. New information (a person quit, an API changed) should immediately bump the relevant risk's score. Two minutes on a calendar beats a two-hour firefight later.
Save your progress and earn XP for completing tutorials.
4 questions · Pass with 70%+
1A risk has a probability of 3 and an impact of 4. Using the probability × impact matrix, what is its score, and what does the tutorial suggest?
2What is the difference between mitigation and contingency?
3Which of the following is not one of the five risk response strategies?
4Why is a risk register that is written once and never updated dangerous?
Technology
Forward Deployed Engineer
Lesson group
FDE Project Management
Progress
67% complete