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

441 lines
16 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>Why Can't We Deploy This Today?</title>
<link rel="stylesheet" href="dist/reset.css">
<link rel="stylesheet" href="dist/reveal.css">
<link rel="stylesheet" href="dist/theme/black.css">
<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">
<!-- Theme used for syntax highlighted code -->
<link rel="stylesheet" href="plugin/highlight/monokai.css">
</head>
<body>
<div class="reveal">
<div class="slides">
<section id="cover-page">
<h1>Why can't we deploy this today?</h1>
<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>
</section>
<section data-markdown id="about-me">
# About me
* Dirk Nederveen, [@dirk@blog.ndrvn.nl](https://blog.ndrvn.nl/u/dirk)
* Husband, father of 3
* Streaming Engineer (QA) @Jet-Stream
* Interests:
- Theology
- Neurospychology
- Reading
- Beer brewing
</section>
<section>
<section id="story-bug">
<h1>The story of a bug</h1>
<p>Starring</p>
<p>
🦹🏻‍♂️<br>
🦸🏼‍♂️<br>
🧑‍💼<br>
👩🏾‍💻 👷🏻‍♂️<br>
👩🏼‍🚒
</p>
<aside class="notes">
<p>Today we'll follow a bug through the processes of development team</p>
🦹🏻‍♂️ Customer<br>
🦸🏼‍♂️ Support Hero<br>
🧑‍💼 Company/Product Owner<br>
Dev team: 👩🏾‍💻 Sr. Dev and 👷🏻‍♂️ Jr. Dev<br>
Ops team: 👩🏼‍🚒 System Operator<br>
</aside>
</section>
<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>
</section>
<section data-markdown>
# Closed sprint
- Two weeks is fast in context of 6 month CD-ROM releases!
- How long does shipping take for your application?
---
# Closed sprint
- 👍 Shared control over workload
- 👍 Predictible cadence
- 👎 Limits response time to `sprint_length`
</section>
</section>
<section id="pull-requests">
<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="">
# Pull Requests
- Untrusted contributer, trusted maintainer
- Communication through centralised repository
---
# Pull Requests
- 👍 Multiple people look at the code
- 👎 Time between action and response
- 👎 Focus on code level, not product level
- 👎 Value spends a lot of time waiting
</section>
</section>
<section id="handoffs">
<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="">
# Handoffs
- Teams with distinct responsibilities
- Changes move in discrete steps
---
# Handoffs
- 👍 Specialisation
- 👍 Clear responsibilities
- 👎 Pipeline speed
- 👎 Adversarial relationships
</section>
</section>
<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>
<section data-markdown="">
# Time to value
- The bug is fixed, 🦹🏻‍♂️ Customer can send their invoices again!
- 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
</section>
<aside class="notes" data-markdown="">
- We engaged in an exercise of (informal) value stream mapping
- Actually helps with providing estimates
</aside>
</section>
<section>
<h1>We have processes for a reason</h1>
<ul>
<li>Quality assurance</li>
<li>Pace</li>
<li>Delivering software reliably</li>
<li class="fragment">Make the suits happy</li>
</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
</section>
</section>
<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">
<h2>Deployment pipeline</h2>
<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>
</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>
<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
- 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
- Understand the Ops team
- Grow in mutual trust
</section>
</section>
<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?
* Build quality in
- test-drive a larger user story
- pair program for an hour daily
- codify a text runbook
---
# What to do this Monday?
* Work in small batches
- build a story on `main` behind a feature flag
---
# What to do this Monday?
* Computers perform repetitive tasks, people solve people-solve-problems
- improve your app's deployment pipeline
---
# What to do this Monday?
* Relentlessly pursue continuous improvement
- 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?
* Everyone is responsible
- 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
---
# What to do this Monday?
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>
</section>
</section>
</div>
</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,
defaultTiming: 42,
// 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>
</html>