1
0
Fork 0
why-cant-we-deploy-today/index.html

441 lines
16 KiB
HTML
Raw Normal View History

2023-05-23 20:51:40 +02:00
<!doctype html>
<html lang="en">
2023-05-23 20:51:40 +02:00
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
2023-05-26 00:02:09 +02:00
<title>Why Can't We Deploy This Today?</title>
2023-05-23 20:51:40 +02:00
<link rel="stylesheet" href="dist/reset.css">
<link rel="stylesheet" href="dist/reveal.css">
<link rel="stylesheet" href="dist/theme/black.css">
2023-05-26 00:02:09 +02:00
<link rel="stylesheet" href="lineicons-4.0-basic-free/web-font-files/css/icons.css">
<link rel="stylesheet" href="why-cant-we-deploy-this-today.css">
2023-05-23 20:51:40 +02:00
<!-- Theme used for syntax highlighted code -->
<link rel="stylesheet" href="plugin/highlight/monokai.css">
</head>
<body>
<div class="reveal">
<div class="slides">
2023-05-29 09:48:14 +02:00
<section id="cover-page">
<h1>Why can't we deploy this today?</h1>
2023-05-26 10:34:33 +02:00
<aside class="notes">
Good morning everyone, today I would like to tell you some things
about my journey with Software delivery processes, and how the question
'Why can't we deploy this today' has helped us at Jet-Stream to make
interesting improvements to our software delivery.
</aside>
2023-05-25 06:29:16 +02:00
</section>
2023-05-26 10:34:33 +02:00
<section data-markdown id="about-me">
2023-05-25 06:29:16 +02:00
# About me
* Dirk Nederveen, [@dirk@blog.ndrvn.nl](https://blog.ndrvn.nl/u/dirk)
2023-05-29 09:48:14 +02:00
* Husband, father of 3
* Streaming Engineer (QA) @Jet-Stream
2023-05-25 06:29:16 +02:00
* Interests:
- Theology
- Neurospychology
- Reading
- Beer brewing
2023-05-23 20:51:40 +02:00
</section>
<section>
2023-05-26 00:02:09 +02:00
<section id="story-bug">
<h1>The story of a bug</h1>
<p>Starring</p>
<p>
🦹🏻‍♂️<br>
🦸🏼‍♂️<br>
🧑‍💼<br>
👩🏾‍💻 👷🏻‍♂️<br>
👩🏼‍🚒
</p>
<aside class="notes">
2023-05-26 10:29:31 +02:00
<p>Today we'll follow a bug through the processes of development team</p>
2023-05-26 00:02:09 +02:00
🦹🏻‍♂️ Customer<br>
🦸🏼‍♂️ Support Hero<br>
🧑‍💼 Company/Product Owner<br>
Dev team: 👩🏾‍💻 Sr. Dev and 👷🏻‍♂️ Jr. Dev<br>
Ops team: 👩🏼‍🚒 System Operator<br>
</aside>
</section>
2023-05-25 06:29:16 +02:00
2023-05-26 00:02:09 +02:00
<section>
<h1>The story of a bug</h1>
<p>
1 May: 🦹🏻‍♂️ →📞→ 🦸🏼‍♂️<br>
4 May: 🧑‍💼 👩🏾‍💻 🦸🏼‍♂️ → 🐛<br>
5 May: 🧑‍💼 👩🏾‍💻<br>
8 May: 🧑‍💼​ 🦸🏼‍♂️ 👩🏾‍💻 👷🏻‍♂️<br>
</p>
<aside class="notes">
🦹🏻‍♂️ Customer calls with a question about sending an invoice on Mon 1 May, 🦸🏼‍♂️ Support Hero logs ticket BS-1234 in Jira<br>
🧑‍💼 Product Owner, 👩🏾‍💻 Sr. Dev and 🦸🏼‍♂️ Support Hero have triage meeting on Thu 4 May, bug confirmed, priority 'Highest'<br>
🧑‍💼 Product Owner and 👩🏾‍💻 Sr. Dev have backlog grooming meeting on Friday 5 May <br>
🧑‍💼​ 🦸🏼‍♂️ 👩🏾‍💻 👷🏻‍♂️ Team has Sprint Planning meeting on Mon 8 May, commit to BS-1234 for 1 Story Point <br>
</aside>
2023-05-25 06:29:16 +02:00
</section>
2023-05-26 00:02:09 +02:00
<section data-markdown>
2023-05-25 06:29:16 +02:00
# Closed sprint
- Two weeks is fast in context of 6 month CD-ROM releases!
- How long does shipping take for your application?
---
2023-05-23 20:51:40 +02:00
2023-05-25 06:29:16 +02:00
# Closed sprint
2023-05-26 00:02:09 +02:00
- 👍 Shared control over workload
- 👍 Predictible cadence
- 👎 Limits response time to `sprint_length`
2023-05-23 20:51:40 +02:00
</section>
2023-05-25 06:29:16 +02:00
</section>
<section id="pull-requests">
2023-05-26 00:02:09 +02:00
<section>
<h1>The story of a bug</h1>
<p>
10 May: 👷🏻‍♂️, 🤷‍♂️; 👷🏻‍♂️ →📧→ 🦹🏻‍♂️<br>
11 May, 4 PM: 🦹🏻‍♂️ →📧→ 👷🏻‍♂️<br>
15 May: 👷🏻‍♂️ →<i class="lni lni-github-original"></i>→ 👩🏾‍💻<br>
16 May, 4 PM: 👩🏾‍💻 →<i class="lni lni-github-original"></i>→ 👷🏻‍♂️<br>
</p>
<aside class="notes">
👷🏻‍♂️ Jr. Dev picks up BS-1234, needs clarification and sends 🦹🏻‍♂️ Customer an email on Wednesday 10 May<br>
🦹🏻‍♂️ Customer responds Thursday 11 May, 16:00<br>
👷🏻‍♂️ Jr. Dev starts implementation on Monday 15 May, opens PR #2345 in GitHub<br>
👩🏾‍💻 Sr. Dev responds to PR #2345 on Tuesday 16 May 16:00, needs improvement<br>
</aside>
</section>
<section data-markdown="">
2023-05-25 06:29:16 +02:00
# Pull Requests
2023-05-29 09:48:14 +02:00
- Untrusted contributer, trusted maintainer
- Communication through centralised repository
2023-05-25 06:29:16 +02:00
---
# Pull Requests
2023-05-23 20:51:40 +02:00
2023-05-25 06:29:16 +02:00
- 👍 Multiple people look at the code
2023-05-26 00:02:09 +02:00
- 👎 Time between action and response
2023-05-25 06:29:16 +02:00
- 👎 Focus on code level, not product level
- 👎 Value spends a lot of time waiting
2023-05-23 20:51:40 +02:00
</section>
2023-05-25 06:29:16 +02:00
</section>
<section id="handoffs">
2023-05-26 00:02:09 +02:00
<section>
<h1>The story of a bug</h1>
<p>
17 May: 👷🏻‍♂️ →<i class="lni lni-github-original"></i>→ 👩🏾‍💻<br>
17 May, 3 PM: 👩🏾‍💻 →<i class="lni lni-slack"></i>→ 👷🏻‍♂️<br>
18 May: 👷🏻‍♂️ → 🕺⛺️🍻<br>
</p>
<aside class="notes">
👷🏻‍♂️ Jr. Dev processes feedback on Wed 17 May, 10:00<br>
Oh no! 💥 Merge conflict!<br>
👩🏾‍💻 Sr. Dev checks PR #2345 and Slacks 👷🏻‍♂️ Jr. Dev on Wed 17 May, 15:00<br>
It's the Ascension Day weekend! 👷🏻‍♂️ Jr. Dev is off to a festival 🕺<br>
</aside>
</section>
<section>
<h1>The story of a bug</h1>
<p>
22 May: 🧑‍💼​ 🦸🏼‍♂️ 👩🏾‍💻 👷🏻‍♂️<br>
30 May: 👷🏻‍♂️ →<i class="lni lni-github-original"></i>→ 👩🏾‍💻<br>
30 May: 👩🏾‍💻 →✅→ 👷🏻‍♂️<br>
2 June: 👩🏾‍💻 👷🏻‍♂️ →📦→ 👩🏼‍🚒<br>
</p>
<aside class="notes">
Mon 22 May: another Sprint Planning meeting. The team commits to BS-1234 again (0 Story points now, "it's basically done")<br>
Tue 30 May: 👷🏻‍♂️ Jr. Dev picks up BS-1234 again, fixes the merge conflict<br>
Tue 30 May: 👩🏾‍💻 Sr. Dev approves PR #2345 and 👷🏻‍♂️ Jr. Dev gets to click the ⛙ Merge button!<br>
Friday 2 June: Sprint end! 👩🏾‍💻 👷🏻‍♂️ Dev team sends the release candidate to 🙅 👩🏼‍🚒 Ops team<br>
</aside>
</section>
<section data-markdown="">
2023-05-25 06:29:16 +02:00
# Handoffs
2023-05-26 00:02:09 +02:00
- Teams with distinct responsibilities
- Changes move in discrete steps
---
# Handoffs
2023-05-25 06:29:16 +02:00
2023-05-26 00:02:09 +02:00
- 👍 Specialisation
- 👍 Clear responsibilities
- 👎 Pipeline speed
- 👎 Adversarial relationships
2023-05-25 06:29:16 +02:00
</section>
</section>
2023-05-26 00:02:09 +02:00
<section id="time-to-value">
<section>
<h1>The story of a bug</h1>
<p>
6 June, 7 AM: 👩🏼‍🚒 →📦→ ☁️<br>
6 June, 9 AM: 🧑‍💼 →📧📧📧→ 🦹🏻‍♂️🦹🏻‍♂️🦹🏻‍♂️
</p>
<aside class="notes">
👩🏼‍🚒 System Operator prepares release after Sprint end, and deploys update on Tue, 6 June 07:00<br>
🧑‍💼 Product Owner sends the update newsletter Tue at 09:00<br>
</aside>
</section>
2023-05-25 06:29:16 +02:00
2023-05-26 10:29:31 +02:00
<section data-markdown="">
2023-05-26 00:02:09 +02:00
# Time to value
- The bug is fixed, 🦹🏻‍♂️ Customer can send their invoices again!
2023-05-26 10:29:31 +02:00
- Took 5 weeks <!-- .element: class="fragment" -->
</section>
</section>
<section>
<section data-markdown="">
# Value stream mapping
- How the *value* flows through an organisation
- *Who* holds responsibility
- Time to value
2023-05-25 06:29:16 +02:00
</section>
2023-05-26 10:29:31 +02:00
<aside class="notes" data-markdown="">
- We engaged in an exercise of (informal) value stream mapping
- Actually helps with providing estimates
</aside>
2023-05-25 06:29:16 +02:00
</section>
2023-05-26 10:29:31 +02:00
<section>
<h1>We have processes for a reason</h1>
2023-05-26 00:02:09 +02:00
<ul>
<li>Quality assurance</li>
<li>Pace</li>
<li>Delivering software reliably</li>
2023-05-26 10:29:31 +02:00
<li class="fragment">Make the suits happy</li>
2023-05-26 00:02:09 +02:00
</ul>
<aside class="notes">
In the end, all processes are born to get the chaos of life under control
</aside>
</section>
<section id="pom-pom-pom">
<section>
<h1>The story of a bug</h1>
<p>
6 June<br>
🦹🏻‍♂️🤬 →📞→ 🧑‍💼<br>
🧑‍💼😱 🦸🏼‍♂️ 👩🏾‍💻 👷🏻‍♂️<br>
👩🏾‍💻 →🩹→ 👩🏼‍🚒<br>
👩🏼‍🚒 →🩹→ ☁️<br>
</p>
<aside class="notes">
🦹🏻‍♂️ Customer calls angrily: the bug is not fixed!<br>
🧑‍💼 Product Owner calls an urgent meeting: Why is BS-1234 (zero points!!) open for over a month?<br>
👩🏾‍💻 Sr. Dev drafts a patch release<br>
👩🏼‍🚒 System Operator deploys the patch<br>
</aside>
</section>
<section data-markdown="">
# What just happened?
- High stress: angry phone calls
- Value discovery, implementation, delivery
2023-05-23 20:51:40 +02:00
</section>
</section>
2023-05-26 00:02:09 +02:00
<section>
<section id="continuous-delivery">
<h1>Continuous delivery</h1>
<div style="width: 80%; float: left" data-markdown="">
* Build quality in
* Work in small batches
* Computers perform repetitive tasks, people solve problems
* Relentlessly pursue continuous improvement
* Everyone is responsible
</div>
<div style="float: right; width: 20%; height: 8em">
<a href="https://www.bol.com/nl/nl/p/accelerate/9200000080652224">
<img src="accelerate.jpg" style="height: 50%;">
</a><br>
<a href="https://www.informit.com/store/continuous-delivery-reliable-software-releases-through-9780321770424?ranMID=24808">
<img src="cd-book.png" style="height: 50%;">
</a>
</div>
</section>
<section id="deployment-pipeline">
2023-05-26 10:29:31 +02:00
<h2>Deployment pipeline</h2>
2023-05-29 09:48:14 +02:00
<img src="cd-pipeline.png" href="https://opensource.com/article/20/5/cicd-best-practices">
<aside class="notes">
Image by <a href="https://opensource.com/users/heronthecli">Taz Brown</a>, <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a>
</aside>
2023-05-26 10:29:31 +02:00
</section>
<section>
<h2>Deployment pipeline</h2>
<p data-markdown="">
- Releasable: `True` or `False`
- Quick feedback
- Release → Domain knowledge → Pipeline improvements → Better release → …
</p>
</section>
<section id="deployment-pipeline">
<h2>Deployment pipeline</h2>
<img src="cd-pipeline.png">
</section>
2023-05-26 00:02:09 +02:00
<section id="build-quality-in" data-markdown="">
## Build quality in
- Test Driven Development
- Pair programming
- Infrastructure as code
</section>
<section id="work-in-small-batches" data-markdown="">
## Work in small batches
- Continuous integration/Trunk based development
- Feature flags
- More frequent releases
</section>
<section id="people-solve-problems" data-markdown="">
## Computers perform repetitive tasks, people solve problems
- Continuous deployment
- Tacit knowledge → Text runbook → Script → Deployment pipeline
</section>
<section id="relentlessly-pursue-improvement" data-markdown="">
## Relentlessly pursue improvement
2023-05-23 20:51:40 +02:00
2023-05-26 00:02:09 +02:00
- Do one step at a time
- Find out (measure!) what works
- "Make the change easy, then make the easy change"
</section>
<section id="everyone-is-responsible" data-markdown="">
## Everyone is responsible
2023-05-26 10:29:31 +02:00
- Understand the Ops team
- Grow in mutual trust
2023-05-26 00:02:09 +02:00
</section>
2023-05-23 20:51:40 +02:00
</section>
2023-05-26 00:02:09 +02:00
<section id="homework">
<section data-markdown="">
# What to do this Monday?
* Sketch the value stream for a 1-hour
- Discovery
- Selection/prioritisation
- Implementation
- Verification
- Delivery
---
# What to do this Monday?
2023-05-23 20:51:40 +02:00
* Build quality in
2023-05-26 00:02:09 +02:00
- test-drive a larger user story
- pair program for an hour daily
- codify a text runbook
---
# What to do this Monday?
2023-05-23 20:51:40 +02:00
* Work in small batches
2023-05-26 00:02:09 +02:00
- build a story on `main` behind a feature flag
---
# What to do this Monday?
* Computers perform repetitive tasks, people solve people-solve-problems
2023-05-26 10:29:31 +02:00
- improve your app's deployment pipeline
2023-05-26 00:02:09 +02:00
---
# What to do this Monday?
2023-05-23 20:51:40 +02:00
* Relentlessly pursue continuous improvement
2023-05-26 00:02:09 +02:00
- got TDD? Go TCR: `(test && commit) || revert`
- got a deploy script? Bring it to the deployment pipeline
- got automated builds? Release each working build to acceptance
- Refactor before implementation
---
# What to do this Monday?
2023-05-23 20:51:40 +02:00
* Everyone is responsible
2023-05-26 00:02:09 +02:00
- have lunch with the 🦸🏼‍♂️ Ops team
- need review? Sync with 👩🏾‍💻 Sr. Dev at your desk
- need to review? Pair with 👷🏻‍♂️ Jr. Dev
- propose process improvements
2023-05-23 20:51:40 +02:00
2023-05-26 00:02:09 +02:00
---
# What to do this Monday?
2023-05-25 06:29:16 +02:00
2023-05-26 10:29:31 +02:00
Ask *"Why can't we deploy this today?"* and automate the answer
</section>
</section>
<section>
<section id="credits">
<h1>Why can't we deploy this today?</h1>
Credits:
<ul>
<li>👸🏻 My lovely wife for telling again and again my slides have too many words</li>
<li><a href="https://lineicons.com/">Lineicons</a> for the brand icons</li>
<li>The Jet-Stream crew for joining me in discovering Continuous Delivery in more depth</li>
<li><a href="https://revealjs.com/">reveal.js</a> for the slides framework</li>
</ul>
</section>
<section id="endcap">
<h1>Why can't we deploy this today?</h1>
2023-05-26 00:02:09 +02:00
</section>
2023-05-25 06:29:16 +02:00
</section>
</div>
2023-05-23 20:51:40 +02:00
</div>
<script src="dist/reveal.js"></script>
<script src="plugin/notes/notes.js"></script>
<script src="plugin/markdown/markdown.js"></script>
<script src="plugin/highlight/highlight.js"></script>
<script>
// More info about initialization & config:
// - https://revealjs.com/initialization/
// - https://revealjs.com/config/
Reveal.initialize({
hash: true,
2023-05-26 10:29:31 +02:00
defaultTiming: 42,
2023-05-23 20:51:40 +02:00
// Learn about plugins: https://revealjs.com/plugins/
plugins: [RevealMarkdown, RevealHighlight, RevealNotes]
});
</script>
<script>
document.querySelectorAll('.slides section a[href^="http"]').
forEach(a => a.setAttribute('target', '_blank'))
</script>
</body>
2023-05-19 20:08:46 +02:00
</html>