599 lines
18 KiB
Markdown
Executable File
599 lines
18 KiB
Markdown
Executable File
---
|
||
note type:
|
||
- devops
|
||
- theory
|
||
- note
|
||
date: 2026-06-20
|
||
done:
|
||
link: https://app.pluralsight.com/ilx/video-courses/devops-foundations-core-concepts-fundamentals/course-overview
|
||
---
|
||
# Introduction
|
||
|
||
> **Epistemology** is the branch of philosophy that examines the **nature, origin, and limits of knowledge**, often referred to as the **theory of knowledge**.
|
||
|
||
# Lean Software Development
|
||
|
||
- Lean originates from **Sakichi Toyoda**, who focused on reducing wasted human effort after observing his mother’s weaving work.
|
||
- Core idea: **optimise systems by respecting and improving human work**, not just machines.
|
||
- Toyoda’s innovations in **automatic looms** laid the foundation for modern industrial efficiency.
|
||
- His son, **Kiichiro Toyoda**, expanded into automobiles → founding **Toyota** (first car: 1936).
|
||
- Post-WWII constraints forced Toyota to **avoid mass production** and focus on efficiency instead.
|
||
- **Toyota Production System (TPS)**, led by Taichi Ohno, aimed for the **complete elimination of waste**.
|
||
- Two key pillars:
|
||
- **Just-in-Time**: produce only what’s needed, when needed
|
||
- **Jidoka**: stop immediately when defects occur
|
||
- **Andon system**: any worker can halt production to fix problems early (quality over speed).
|
||
- Term **“Lean”** coined in 1990 to describe this high-efficiency, low-waste system.
|
||
- Adapted to software (2003): focuses on **waste reduction, continuous improvement, and delivering value**, closely aligned with **Agile principles**.
|
||
|
||
# Lean Software Development – Waste & Principles
|
||
|
||
- Central idea in lean: **waste is the primary enemy**. Eliminating it leads to better outcomes.
|
||
- Key insight: **optimising for speed alone creates waste**, but **eliminating waste naturally improves speed**.
|
||
- In software, this effect is amplified. **Early problem detection drastically reduces cost and impact**.
|
||
|
||
## Bug Example (Cost vs Timing)
|
||
|
||
- Bug found by **customer** → highest cost (damage to trust/reputation).
|
||
- Found **just before release** → still costly (delays).
|
||
- Found in **code review** → limited impact (few people involved).
|
||
- Found during **development/testing** → minimal cost.
|
||
- Found via **test-first (TDD)** → often prevented entirely.
|
||
|
||
## Core Concepts
|
||
|
||
- **Shift-left thinking**: move detection and quality checks as early as possible.
|
||
- **Test-first development (TDD)**:
|
||
- Write tests before code
|
||
- Forces clarity and simpler, more reliable designs
|
||
- Reduces the chance of defects early
|
||
- Even though tests aren’t perfect, they **guide safer, more focused development**.
|
||
|
||
## First Lean Principle
|
||
|
||
- **Eliminate waste**:
|
||
- Fixing avoidable bugs = waste
|
||
- Rework and repetition = waste
|
||
- Human effort spent on low-value tasks = waste
|
||
|
||
## Key Philosophy
|
||
|
||
- Repetition of simple tasks by humans = **underutilising human potential**
|
||
- Lean aims to **free people to do higher-value, creative work**
|
||
|
||
# Lean Software Development – Poka‑Yoke & Defect Prevention
|
||
|
||
## Inspection Types
|
||
|
||
- **Inspection to find defects**:
|
||
- Happens **after the process**
|
||
- More costly and disruptive
|
||
- **Inspection to prevent defects**:
|
||
- Happens **during or before the process**
|
||
- Cheaper and more effective
|
||
|
||
## Poka‑Yoke (Error Prevention)
|
||
|
||
- Japanese term meaning **“error avoidance”**
|
||
- Focus: **design systems so mistakes are impossible or immediately caught**
|
||
- Aim: **build quality into the process, not inspect it afterwards**
|
||
|
||
## Everyday Examples
|
||
|
||
- **UI validation** (e.g. input masks, dropdowns, live error messages)
|
||
- **USB design**: only fits one way
|
||
- **Electrical outlets (GFCI)**: shuts off power to prevent harm
|
||
- **Manual cars**: must press clutch to start
|
||
|
||
## Software & DevOps Applications
|
||
|
||
- **Principle of least privilege**:
|
||
- Users only have permissions they need
|
||
- Prevents both malicious actions and accidental errors
|
||
- **Protected branches**:
|
||
- No direct commits to deployment branches
|
||
- Changes go through **pull requests + reviews + automated tests**
|
||
- **IDE checks**:
|
||
- Real-time compilation and error detection during coding
|
||
|
||
## Test-First Development (TDD)
|
||
|
||
- Write **tests before code**
|
||
- Forces clarity about:
|
||
- Requirements
|
||
- Assumptions and expected behaviour
|
||
- Helps:
|
||
- Prevent defects early
|
||
- Keep code simpler and more focused
|
||
|
||
## Key Insight
|
||
|
||
- Code contains **implicit assumptions** that are hard to debug later
|
||
- Writing tests first makes these assumptions **explicit and verifiable**
|
||
|
||
## Long-Term Value
|
||
|
||
- Tests don’t just prevent initial bugs
|
||
- They **guard against regressions** (future defects)
|
||
|
||
# Lean Software Development – Certainty & Knowledge
|
||
|
||
## Core Idea: Certainty Matters
|
||
|
||
- Lean emphasises not just **knowing something**, but **being certain that it is true**.
|
||
- Two separate statements:
|
||
- “This code works”
|
||
- “We are certain this code works”
|
||
|
||
## Creating Certainty in Software
|
||
|
||
- **Automated testing**:
|
||
- Creates knowledge (code works)
|
||
- Maintains certainty (re-run tests continuously)
|
||
- At release level, certainty comes from accumulated evidence:
|
||
- Passing automated tests
|
||
- Code reviews
|
||
- Successful builds
|
||
- Load/performance tests
|
||
|
||
## Limits of Human Testing
|
||
|
||
- Human testing is **inherently limited** in software:
|
||
- Fixing one bug does **not guarantee stability elsewhere**
|
||
- Unlike physical systems, software behaviour is **non-linear and unpredictable**
|
||
- Conclusion: **minimise reliance on manual testing**
|
||
|
||
## Key Insight: Software is Uncertain by Nature
|
||
|
||
- Software development is **“predictably unpredictable”**
|
||
- Traditional planning often fails because:
|
||
- Required knowledge **doesn’t exist upfront**
|
||
- It only emerges **during development**
|
||
|
||
## Lean / Agile Perspective
|
||
|
||
- Lean, Agile, and DevOps:
|
||
- **Force teams to confront uncertainty honestly**
|
||
- Reject the illusion of perfect upfront planning
|
||
- Agile is not idealistic—it’s based on **real-world experience of failure in rigid planning**
|
||
|
||
## Software as Research
|
||
|
||
- Software development is essentially **research work**:
|
||
- Problems are **“wicked”** (can’t be fully defined upfront)
|
||
- Understanding evolves through **iteration and experimentation**
|
||
|
||
## Principle: Epistemic Humility
|
||
|
||
- Accept that:
|
||
- Your knowledge is **incomplete and uncertain**
|
||
- Plan and work accordingly:
|
||
- Short feedback loops
|
||
- Continuous validation
|
||
- Incremental delivery
|
||
|
||
## Practical Implications
|
||
|
||
- Build systems that:
|
||
- **Continuously generate evidence of correctness**
|
||
- Adapt as new knowledge emerges
|
||
- Shift focus from:
|
||
- “Are we right?” → “How sure are we that we’re right?”
|
||
|
||
# Lean Software Development – Defer Commitment
|
||
|
||
- **Defer commitment**: avoid making decisions too early when knowledge is still uncertain.
|
||
- Early commitments (BDUF – Big Design Up Front) **reduce predictability** because key knowledge doesn’t exist yet.
|
||
- **Software development creates knowledge over time**, so decisions improve as the project progresses.
|
||
|
||
## Decision Types
|
||
|
||
- **Irreversible decisions**:
|
||
- Hard or costly to undo
|
||
- Should be **delayed as long as possible**
|
||
- Allows better-informed choices
|
||
- **Reversible decisions**:
|
||
- Easy to change later
|
||
- Can be made **early to maintain progress**
|
||
|
||
## Key Strategy
|
||
|
||
- Prioritise **reversible choices over irreversible ones** when possible.
|
||
- Make early decisions that **keep options open**, not ones that lock you in.
|
||
|
||
## Practical Examples
|
||
|
||
- Architecture choices:
|
||
- Use modular systems so components can be swapped later (reversible)
|
||
- Business analogy:
|
||
- Travel insurance or flexible bookings = **paying for reversibility**
|
||
- Easy returns (e.g. Amazon, Zappos) encourage decisions because they reduce risk
|
||
|
||
## Takeaway
|
||
|
||
- **Better decisions come from better information**, which takes time to develop
|
||
- Lean encourages:
|
||
- **Delay irreversible commitments**
|
||
- **Keep options open**
|
||
- **Move forward with flexible, changeable decisions**
|
||
|
||
# Lean Software Development – Deliver Fast
|
||
|
||
## Core Idea: Deliver Fast
|
||
|
||
- “Fast” means both **early delivery** and **frequent delivery**.
|
||
- Goal: **accelerate feedback and learning**.
|
||
|
||
## Deliver Early
|
||
|
||
- Release **small increments quickly** (e.g. end of each sprint).
|
||
- Even simple outputs (e.g. a mock login page) help:
|
||
- Expose issues early
|
||
- Trigger useful discussions
|
||
- Force setup of delivery processes (CI/CD, version control)
|
||
|
||
## Deliver Often
|
||
|
||
- Shift from **large, infrequent releases (e.g. quarterly)** to **frequent ones (e.g. weekly)**.
|
||
- Frequent releases:
|
||
- Reduce pressure to “get everything perfect”
|
||
- Allow unfinished features to be safely deferred
|
||
|
||
## System-Level Impact
|
||
|
||
- Frequent delivery forces teams to:
|
||
- **Automate repetitive tasks**
|
||
- **Simplify or eliminate unnecessary processes**
|
||
|
||
## Key Principle
|
||
|
||
- **“If it hurts, do it often”**:
|
||
- Increase frequency of painful processes (e.g. releases, testing)
|
||
- Forces improvement, automation, and efficiency
|
||
|
||
## Practical Mindset
|
||
|
||
- Identify risky/problematic areas (“what feels uncomfortable”)
|
||
- **Tackle them early and repeatedly** to reduce uncertainty
|
||
|
||
# Lean Software Development – Respect People
|
||
|
||
## Core Principle: Respect People
|
||
|
||
- Lean (Toyota) places **people at the centre of systems**, unlike traditional approaches that treat workers like machines.
|
||
- Origin influenced by **Sakichi Toyoda’s human-focused perspective** (seeing work through his mother’s experience).
|
||
|
||
## What “Respect People” Really Means
|
||
|
||
- Not just:
|
||
- Being polite
|
||
- Fairness or “HR-style” gestures
|
||
- Instead, it means:
|
||
- **Empowering individuals**
|
||
- **Giving ownership and responsibility**
|
||
- **Trusting people to contribute and improve systems**
|
||
|
||
## Key Idea
|
||
|
||
- “People operate the system, not the other way around.”
|
||
- Workers are **intelligent contributors**, not interchangeable parts.
|
||
|
||
## Practical Implications
|
||
|
||
- Give teams:
|
||
- Authority to **stop processes and fix issues**
|
||
- Opportunity to **suggest improvements**
|
||
- Build systems where:
|
||
- **Anyone can contribute ideas**
|
||
- Collaboration is encouraged over rigid hierarchy
|
||
|
||
## Business Impact
|
||
|
||
- Human-centred systems:
|
||
- **Outperform top-down, rigid structures**
|
||
- Improve innovation and adaptability
|
||
- Benefits include:
|
||
- Lower turnover
|
||
- Higher engagement
|
||
- Better overall results
|
||
|
||
## Risks of Ignoring This Principle
|
||
|
||
- Treating people like machines leads to:
|
||
- Poor morale
|
||
- Lack of innovation
|
||
- Long-term organisational failure
|
||
# Lean Software Development – Optimising the Whole System
|
||
|
||
## Core Idea: System Thinking Over Local Optimisation
|
||
|
||
- Focusing on improving **one part of the system (e.g. development speed)** can harm the **overall system performance**.
|
||
- True optimisation comes from improving the **entire value stream**, not individual components.
|
||
|
||
## Example: Test-Driven Development (TDD)
|
||
|
||
- TDD may:
|
||
- **Slow down development initially**
|
||
- But it:
|
||
- Eliminates or reduces **manual testing effort**
|
||
- Prevents **regressions with automated tests**
|
||
- Creates a long-term **quality safety net**
|
||
- Net effect: **faster, more efficient system overall**
|
||
|
||
## The Problem: Suboptimisation
|
||
|
||
- Optimising individual parts ≠ optimising the system
|
||
- Common mistake:
|
||
- Managers focus on **visible metrics (e.g. dev time)**
|
||
- Ignore downstream effects (e.g. testing, defects, rework)
|
||
|
||
## Key Insight (Elon Musk Quote)
|
||
|
||
- “Optimising something that shouldn’t exist” = waste
|
||
- Highlights:
|
||
- Even smart people fall into **misplaced optimisation**
|
||
- We often optimise **means instead of outcomes**
|
||
|
||
## Evaluating System Components
|
||
|
||
Every part of a system:
|
||
|
||
1. **Adds value** → keep and improve
|
||
2. **Hurts the system** → fix or remove
|
||
3. **Adds no value** → eliminate
|
||
|
||
## Lean Mindset
|
||
|
||
- “The best part is no part. The best process is no process.”
|
||
- Remove:
|
||
- Unnecessary steps
|
||
- Redundant processes
|
||
- Inefficient workflows
|
||
|
||
## Practical Implications
|
||
|
||
- Automate instead of manually repeating tasks
|
||
- Eliminate processes that **don’t contribute to value**
|
||
- Focus on:
|
||
- **Flow of work across the whole system**
|
||
- **End-to-end efficiency**, not local metrics
|
||
|
||
## Takeaway
|
||
|
||
- **Optimise the system, not individual parts**
|
||
- TDD and automation may slow one step, but improve the **entire pipeline**
|
||
- True lean improvement often means:
|
||
- **Removing what shouldn’t exist** rather than refining it
|
||
|
||
# Lean Software Development – Waste (7 Types & System View)
|
||
|
||
## Core Idea: What is Waste?
|
||
|
||
- Waste = **any activity that does not add value to the end product**.
|
||
- Important distinction:
|
||
- Something may look like waste **in hindsight (final product)**
|
||
- But may still be **necessary in the process (learning, iteration)**
|
||
- Lean requires **careful identification of real waste vs necessary work**
|
||
|
||
## The 7 Types of Waste (Lean Development)
|
||
|
||
### 1. Partially Done Work
|
||
|
||
- Work that is **not fully complete or deployed**
|
||
- Creates:
|
||
- Hidden effort
|
||
- False sense of progress
|
||
- Example:
|
||
- Code written without tests → _looks done but isn’t actually usable_
|
||
|
||
### 2. Extra Features (Overproduction)
|
||
|
||
- Features built **too early or unnecessarily (“just in case”)**
|
||
- Equivalent to **unused inventory** in manufacturing
|
||
- Root cause:
|
||
- Poor adaptability / fear of future change
|
||
- Lean approach:
|
||
- Build **just in time**, not “just in case”
|
||
|
||
### 3. Relearning
|
||
|
||
- Re-acquiring knowledge that was **already known before**
|
||
- Causes:
|
||
- Poor documentation
|
||
- Staff turnover
|
||
- Knowledge silos
|
||
- Mitigation:
|
||
- Documentation, automation, simpler design
|
||
- Cross-training team members
|
||
|
||
**Example**
|
||
|
||
- Losing key developers → project knowledge lost → costly recovery
|
||
|
||
### 4. Task Switching
|
||
|
||
- Switching between tasks reduces efficiency significantly
|
||
- Cognitive penalty ≈ **40% productivity loss**
|
||
- Humans **cannot truly multitask**
|
||
- Impact:
|
||
- Slower delivery
|
||
- More errors
|
||
|
||
### 5. Delays
|
||
|
||
- Idle time waiting for:
|
||
- Decisions
|
||
- Information
|
||
- Approvals
|
||
- Causes:
|
||
- Centralised authority
|
||
- Poor communication (silos)
|
||
- Lean solution:
|
||
- **Empower teams, improve access to information**
|
||
|
||
### 6. Defects
|
||
|
||
- Errors that require **rework and disruption**
|
||
- Effects:
|
||
- Task switching
|
||
- Relearning context
|
||
- Delays and wasted effort
|
||
- Worse when found late:
|
||
- May require multiple people
|
||
- May be harder to fix
|
||
|
||
### 7. Handoffs (implicit in examples)
|
||
|
||
- Knowledge transfer between people/teams
|
||
- Risk:
|
||
- Miscommunication
|
||
- Loss of context
|
||
- Example:
|
||
- Poorly transferred project → failure after staff leave
|
||
|
||
## Key Insight: Wastes Are Connected
|
||
|
||
- Each waste often results from **missing lean principles**:
|
||
- Lack of **knowledge creation** → relearning
|
||
- Lack of **respect for people** → delays
|
||
- Poor **defect prevention** → defects + rework
|
||
|
||
## System-Level Impact of Defects
|
||
|
||
- Defects amplify multiple wastes:
|
||
|
||
- Trigger **task switching**
|
||
- Require **relearning context**
|
||
- Create **delays**
|
||
- Increase **partially done work**
|
||
- Extreme case:
|
||
|
||
- Original developer unavailable → severe handoff waste
|
||
|
||
## Real-World Example Insight
|
||
|
||
- Loss of key employees caused:
|
||
- Knowledge loss
|
||
- Project failure
|
||
- Major financial loss
|
||
- Preventive actions could include:
|
||
- Better knowledge capture (recordings, docs)
|
||
- Cross-training team members
|
||
- Retention incentives
|
||
|
||
## Takeaway
|
||
|
||
- Waste is **any non-value-adding effort across the system**
|
||
- Most waste comes from:
|
||
- Poor knowledge management
|
||
- Late feedback
|
||
- Weak processes and structure
|
||
- **Defects are a critical signal**:
|
||
- If defect rates are high, other wastes are likely unmanaged
|
||
|
||
# Lean Software Development – Practical Application (DevOps)
|
||
|
||
## Core Idea: Focus on Impact (Pareto Principle)
|
||
|
||
- Use **Pareto (80/20 analysis)**:
|
||
- **80% of problems come from 20% of causes**
|
||
- In DevOps, biggest win:
|
||
- **Reduce defect rate first**
|
||
- Focus on the **“bad neighbourhood” in code**:
|
||
- Areas everyone avoids → highest impact if fixed
|
||
- Approach:
|
||
- **Go where the pain is (fear-driven development)**
|
||
|
||
## Practical Strategy to Reduce Waste
|
||
|
||
### 1. Target High-Impact Problems First
|
||
|
||
- Identify:
|
||
- Bug hotspots
|
||
- Fragile systems
|
||
- Fixing these yields **disproportionate improvements**
|
||
|
||
**Example**
|
||
|
||
- A single unstable module causing most outages → prioritise fixing it
|
||
|
||
### 2. Improve Developer Experience (Respect People)
|
||
|
||
- If developers are:
|
||
- Slow
|
||
- Frustrated
|
||
- Error-prone
|
||
- That is a **system failure**, not a people problem
|
||
|
||
**Example**
|
||
|
||
- Inability to debug locally:
|
||
- Leads to slow, painful development
|
||
- Fixing this improves speed and quality immediately
|
||
|
||
### 3. Prioritise User Pain (Internal Customers)
|
||
|
||
- Treat internal teams (e.g. support engineers) as **customers**
|
||
- Fix their tooling issues first
|
||
|
||
**Example**
|
||
|
||
- Improving admin tools → enables support to resolve issues faster → better customer outcomes
|
||
|
||
### 4. Reduce Handoffs (Cross-Training)
|
||
|
||
- Train multiple people to perform key tasks
|
||
- Avoid reliance on individuals
|
||
|
||
**Example**
|
||
|
||
- Rotate responsibility for complex processes → spreads knowledge → reduces risk
|
||
|
||
### 5. Simplify and Standardise Systems
|
||
|
||
- Look for duplication:
|
||
- Similar processes/tools doing the same job
|
||
- Consolidate into **one flexible system**
|
||
|
||
**Example**
|
||
|
||
- Replace multiple build pipelines with **one parameterised build system**
|
||
|
||
### 6. Automate Repetition
|
||
|
||
- Rule:
|
||
- If you do something **twice**, consider automation before the third time
|
||
- Benefits:
|
||
- Reduces waste
|
||
- Improves consistency
|
||
- Frees up human effort
|
||
|
||
**Example**
|
||
|
||
- Automate deployments, testing, or data imports
|
||
|
||
## Key Lean Connections
|
||
|
||
- **Reduce defects** → biggest system-wide gain
|
||
- **Respect people** → improve how work actually gets done
|
||
- **Eliminate waste** → focus on high-value activities
|
||
- **Create knowledge** → through automation, documentation, and sharing
|
||
|
||
## Takeaway
|
||
|
||
- Start with **where the pain is highest**, not what’s easiest
|
||
- Improve systems by:
|
||
- Fixing bottlenecks
|
||
- Empowering people
|
||
- Automating repetitive work
|
||
- Lean DevOps isn’t about doing small improvements everywhere—it’s about **making the biggest difference first**
|
||
|
||
## Summary
|
||
|
||
- Use **80/20 thinking** to prioritise work
|
||
- Focus on:
|
||
- High-defect areas
|
||
- Developer productivity
|
||
- Tool usability
|
||
- Standardise, automate, and cross-train to reduce waste
|
||
- Always aim to **improve the whole system, not just individual parts** |