article: changing the intro, we're getting somewhere

This commit is contained in:
Julien Calixte
2024-12-30 17:18:20 +01:00
parent 46a7dda448
commit 222a6510cb
6 changed files with 90 additions and 45 deletions

View File

@@ -1,3 +1,26 @@
export const newsAppFeatures = [
'Accessing the latest news articles',
'Reading one new article',
'Breaking news alerts',
'Live news streaming',
'Search',
'Login / sign up',
'Personalized news feed',
'News article bookmarking',
'News article sharing',
'Commenting on articles',
'Multi-language support',
'News article recommendations',
'News article summarization',
'News article audio playback',
'Offline reading',
'Polls',
'News article ratings',
'News article history',
'News articles based on geolocation',
'Public access to data sources'
]
export const appFeatures = [
'Login / Sign Up',
'Search',

View File

@@ -15,11 +15,11 @@ import SimulationDashboard from '@/modules/pull-system/simulation/SimulationDash
<template>
<div class="flow-article">
<h1>Pull system</h1>
<h2>Ekiden (駅伝): long-distance running relay race</h2>
<!-- <h2>Ekiden (駅伝): long-distance running relay race</h2> -->
<FlowIntro class="text" />
<SeparatorIcon />
<FlowHypothesis class="text" />
<SeparatorIcon />
<!-- <FlowHypothesis class="text" /> -->
<!-- <SeparatorIcon /> -->
<FlowSetup class="text" />
<FlowDashboard class="above" />
<FeatureSteps alias="playground" />

View File

@@ -17,8 +17,9 @@
</p>
<p>
But the best way to succeed is to ask: "Is this what you need? How can I
help you?". Just like in Ekiden, handovers are where the real struggles
happen but we're on the same race, together.
help you?".
<!-- Just like in Ekiden, handovers are where the real struggles
happen but we're on the same race, together. -->
</p>
</div>
</template>

View File

@@ -1,14 +1,31 @@
<template>
<div class="flow-intro">
<h2>What's the fastest way to deliver an app?</h2>
<p>
How good are we to succeed a project? Delivering the features at the good
quality and at the right time. We're pretty bad at it and there is a lot
of misconceptions on how to manage people to do what need to be done. I
wanted to create a simulation to plan ahead and see what are the
consequences of different strategy patterns and which is the most
effective.
In lean manufacturing, one key aspect is the notion of
<em>lead time</em>: the time needed by the company to deliver the product
requested by the client starting when the client makes the order. For lean
practitioners, the way to deliver at the right time is by improving how
their delivery system works with... The pull system!
</p>
<p>
The pull system is in opposition of the push system. Instead of trying to
make everyone work at their maximum capacity, we try to improve the time
it needs to deliver a feature.
</p>
<p>
I wanted to create a simulation to see what are the consequences of
different strategy patterns and which is the most effective.
</p>
<p>
Let's see what happens when we want to create a Newsletter mobile app. We
have some functionalities to implement and we want to measure how long it
takes.
</p>
<p>
<em
>Note: as we'll visualize work done between teams, it needs space so
this article has a better experience on desktop.</em
>
</p>
<p><em>Note: better experience on desktop.</em></p>
</div>
</template>

View File

@@ -8,7 +8,7 @@ import QualityIssue from '@/modules/pull-system/feature/QualityIssue.vue'
import { Feature } from '@/modules/pull-system/feature/feature'
const feature: Feature = {
name: 'As a user, in the homepage, I can login',
name: 'As a user I can have access to the latest news from the homepage.',
complexity: 3,
leadTime: 2,
qualityIssue: 4,
@@ -20,30 +20,41 @@ const feature: Feature = {
<template>
<div>
<p>
You're a Product Manager in a project who has just started, your goal is
to make a product as fast as you can. With you, you'll have the product
team, designers, developers and a release team.
The project who has just started, our goal is to make a product as fast as
you can. With you, you'll have the product team, designers, developers and
a release team.
</p>
<p>
First things first, what is a feature? A feature is a piece of software
that enables <em>things</em> for the user. It can be the capability to
read articles or to share them or even to be able to read one without the
need for internet connection. In our simulation, a feature will be
represented as follow:
</p>
<p>This is a feature:</p>
<FeatureItem :feature="feature" />
<p>
It starts with the intention "<code>{{ feature.name }}</code>". This is what we'll add to the mobile app.
</p>
<p>
<span class="numeric">({{ feature.complexity }})</span> is the complexity
of the feature. The more complex a feature is, the more chance to have
defect we have.
of the feature. The more complex a feature is, the more chance we introduce a defect.
</p>
<p>
<span class="numeric">{{ feature.leadTime }}d</span> is the number of days
the feature started its journey. The ultimate goal is to reduce this
number and deliver as fast as possible.
the teams work on the feature. The goal is to reduce this number and
deliver as fast as possible.
</p>
<p>
<QualityIssue class="inline" :quality-issue="feature.qualityIssue" />
are the number of defects the feature had during the flow.
are the number of defects the feature had during the flow. For the sake of
simplicity, we assume teams are capable of detecting every defects and we
never deliver defects.
</p>
<p>
You have 20 features to deliver, and each day you can choose between 3
strategies:
Okay! We have 20 features to deliver. It takes one day for each team to finish
their part for each feature.
</p>
<p>Each day, you can choose between 3 strategies:</p>
<ol>
<li>
Push system
@@ -58,19 +69,15 @@ const feature: Feature = {
<ProblemSolvingIcon />
</li>
</ol>
<FlowControls :with-eraser="false" />
<p>
In this article we'll focus on how these strategies are efficient and what
are the impact on the quality the teams produce.
are the impact on the quality the teams produce. Let's dive in each
strategy!
</p>
<h3>The push system: start features as many as possible</h3>
<h4>Seeking for the most of each team</h4>
<h3>The push system: start as many features as possible</h3>
<p>
Pushing all the feature as fast as possible, this is the only strategy
that allows us to target the best possible result: `# step × # status × #
features`. We may overburden teams in the process though. But as we
already invest money everybody to work so if there is someone who has
nothing to do, this is just money down the drain.
By pushing features from the start, we try to maximize the time worked by teams on the product.
This way, no money is wasted, everyone has everytime something to do.
</p>
<h3>The pull system: produce features only when the next team needs it</h3>
<p>
@@ -79,6 +86,12 @@ const feature: Feature = {
waiting for next team to be ready before doing some extra work than having
stock of feature pre-baked.
</p>
<p>
To make this happen we first need to setup blue bins: our security stocks
Blue bins make sure teams can work without any blockers. The next team
will always have material to transform. Here, we'll have 2 blue bins per
team.
</p>
<h3>Problem solving: no production, just reflection</h3>
<p>
We invest days where we are not productive at all to investigate and
@@ -87,15 +100,6 @@ const feature: Feature = {
understand and limit rework. The more the team investigate, the more the
team learn and start to be extremely good at problem solving.
</p>
<h3>Blue bin: the security stock</h3>
<p>
Blue bins are your security stock, they make sure teams can work without
any blockers. The next team will always have material to transform. But it
comes with a cost: too many blue bins add overburden, stagnation
(increasing lead time) and duplicated mistakes. The less you have, the
more the team can focus. But the more you have, the more secure you are to
make teams work, we have to find the good balance.
</p>
</div>
</template>

View File

@@ -1,4 +1,4 @@
import { appFeatures } from '@/data/app-feature'
import { newsAppFeatures } from '@/data/app-feature'
import { birds } from '@/data/bird'
import { Feature } from '@/modules/pull-system/feature/feature'
import { randomInteger } from '@/utils'
@@ -21,7 +21,7 @@ export const birdFeatures: Feature[] = birds.map((name) => ({
qualityIssue: 0
}))
export const mobileAppFeatures: Feature[] = appFeatures.map((name) => ({
export const mobileAppFeatures: Feature[] = newsAppFeatures.map((name) => ({
name,
complexity: randomInteger(1, 5),
leadTime: 0,