article: chatgpt my English
This commit is contained in:
@@ -40,35 +40,35 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
|
|
||||||
<template>
|
<template>
|
||||||
<article class="flow-article">
|
<article class="flow-article">
|
||||||
<h1>Pull system</h1>
|
<h1>Pull System</h1>
|
||||||
<!-- <h2>Ekiden (駅伝): long-distance running relay race</h2> -->
|
<!-- <h2>Ekiden (駅伝): long-distance running relay race</h2> -->
|
||||||
<div class="flow-intro text">
|
<div class="flow-intro text">
|
||||||
<p>
|
<p>
|
||||||
In lean manufacturing, one key aspect is the notion of
|
In lean manufacturing, a key concept is <em>lead time</em>: the time it
|
||||||
<em>lead time</em>: the time needed by the company to deliver the
|
takes for a company to deliver a product from the moment a client places
|
||||||
product requested by the client starting when the client makes the
|
an order. For lean practitioners, ensuring timely delivery involves
|
||||||
order. For lean practitioners, the way to deliver at the right time is
|
optimizing their delivery system using... the pull system!
|
||||||
by improving how their delivery system works with... The pull system!
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The pull system is in opposition of the push system. Instead of trying
|
The pull system contrasts with the push system. Instead of trying to
|
||||||
to make everyone work at their maximum capacity, we try to improve the
|
make everyone work at maximum capacity, the focus shifts to improving
|
||||||
time it needs to deliver a feature.
|
the time required to deliver a feature.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
I wanted to create a simulation to see what are the consequences of
|
I wanted to create a simulation to explore the consequences of different
|
||||||
different strategy patterns and which is the most effective.
|
strategic approaches and identify which one is most effective.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Let's see what happens when we want to create a news mobile app. We have
|
Imagine we're developing a mobile news app. We have several
|
||||||
some functionalities to implement and we want to measure how long it
|
functionalities to implement and want to measure how long each takes to
|
||||||
takes.
|
complete.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<em
|
<em>
|
||||||
>Note: as we'll visualize work done between teams, it needs space so
|
Note: This article includes visualizations of team workflows that can
|
||||||
this article has a better experience on desktop.</em
|
be too large for a mobile phone. For the best experience, please view
|
||||||
>
|
it on a desktop.
|
||||||
|
</em>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<SeparatorIcon />
|
<SeparatorIcon />
|
||||||
@@ -103,21 +103,20 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
<!-- <SeparatorIcon /> -->
|
<!-- <SeparatorIcon /> -->
|
||||||
<div class="flow-setup text">
|
<div class="flow-setup text">
|
||||||
<p>
|
<p>
|
||||||
The project has just started, our goal is to make a product as fast as
|
The project has just begun, and our goal is to deliver a product as
|
||||||
you can. You'll have teams dedicated to the product, the design, the
|
quickly as possible. We’ll have dedicated teams for product design,
|
||||||
coding and one making sure it is going live.
|
coding, and ensuring the product goes live.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
First things first, what is a feature? A feature is a piece of software
|
First, what is a feature? A feature is a software component that
|
||||||
that enables <em>things</em> for the user. It can be the capability to
|
provides a functionality for the user. Examples include the ability to
|
||||||
read articles or to share them or even to be able to read one without
|
read articles, share content, or use the app offline. In our simulation,
|
||||||
the need for internet connection. In our simulation, a feature will be
|
a feature is represented as follows:
|
||||||
represented as follow:
|
|
||||||
</p>
|
</p>
|
||||||
<FeatureItem :feature="feature" />
|
<FeatureItem :feature="feature" />
|
||||||
<p>
|
<p>
|
||||||
It starts with the intention "<code>{{ feature.name }}</code
|
Each feature starts with an intention: "<code>{{ feature.name }}</code
|
||||||
>". This is what we'll add to the mobile app.
|
>". This defines what we will add to the mobile app.
|
||||||
</p>
|
</p>
|
||||||
<!-- [complexity]
|
<!-- [complexity]
|
||||||
<p>
|
<p>
|
||||||
@@ -126,61 +125,48 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
chance we introduce a defect.
|
chance we introduce a defect.
|
||||||
</p> -->
|
</p> -->
|
||||||
<p>
|
<p>
|
||||||
<span class="numeric">{{ feature.leadTime }}d</span> is the number of
|
<span class="numeric">{{ feature.leadTime }}d</span> indicates the
|
||||||
days the teams work on the feature. The goal is to reduce this number
|
number of days teams work on the feature. The goal is to minimize this
|
||||||
and deliver as fast as possible.
|
number and deliver features as quickly as possible.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<QualityIssue class="inline" :quality-issue="feature.qualityIssue" />
|
<QualityIssue class="inline" :quality-issue="feature.qualityIssue" />
|
||||||
are the number of defects the feature has during the flow. For the sake
|
shows the number of defects found in the feature during its workflow.
|
||||||
of simplicity, we assume teams are capable of detecting every defects
|
For simplicity, we assume teams can identify all defects, and no
|
||||||
and we never deliver defects. This means each defect will be reworked by
|
defective features are delivered. Any defect must be reworked by the
|
||||||
the team that introduced it.
|
team that caused it.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Okay! We have 20 features to deliver. It takes one day for each team to
|
Okay! We have 20 features to deliver. Each team takes one day to
|
||||||
finish their part for each feature.
|
complete their part for a feature.
|
||||||
</p>
|
</p>
|
||||||
<!-- [dps] <p>Each day, you can choose between 3 strategies:</p> -->
|
<!-- [dps] <p>Each day, you can choose between 3 strategies:</p> -->
|
||||||
<p>Each day, you can choose between 2 strategies:</p>
|
<p>Every day, you can choose between two strategies:</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li><PushSystemIcon /> Push system</li>
|
<li><PushSystemIcon /> Push system</li>
|
||||||
<li><PullSystemIcon /> Pull system</li>
|
<li><PullSystemIcon /> Pull system</li>
|
||||||
<!-- [dps]
|
|
||||||
<li>
|
|
||||||
<ProblemSolvingIcon /> Problem solving
|
|
||||||
</li> -->
|
|
||||||
</ol>
|
</ol>
|
||||||
<p>
|
<p>
|
||||||
In this article we'll focus on how these strategies are efficient and
|
In this article, we’ll examine how these strategies affect efficiency
|
||||||
what are the impact on the quality the teams produce. Let's dive in each
|
and quality. Let’s explore each one!
|
||||||
strategy!
|
|
||||||
</p>
|
</p>
|
||||||
<h3>The push system: start as many features as possible</h3>
|
<h3>The Push System: Start as Many Features as Possible</h3>
|
||||||
<p>
|
<p>
|
||||||
By pushing features from the start, we try to maximize the time worked
|
In the push system, we aim to maximize the time teams spend working on
|
||||||
by teams on the product. This way, no money is wasted, everyone has
|
the product. This ensures no downtime, as everyone always has tasks to
|
||||||
everytime something to do.
|
complete.
|
||||||
|
</p>
|
||||||
|
<h3>The Pull System: Produce Features When the Next Team Needs Them</h3>
|
||||||
|
<p>
|
||||||
|
Instead of pushing features forward, the pull system waits until the
|
||||||
|
next team is ready. This approach acknowledges that the ideal "push
|
||||||
|
system where everything goes perfectly" is unrealistic. By prioritizing
|
||||||
|
readiness, we avoid creating a backlog of pre-prepared features.
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
But it comes with a cost: the more feature ongoing in parallel, the more
|
To implement this, we introduce "blue bins" as safety stock. These bins
|
||||||
it is difficult to focus and it is more likely to introduce a defect..
|
ensure teams always have work ready to process without delays. For our
|
||||||
</p>
|
simulation, each team has two blue bins, which provides a good balance.
|
||||||
<h3>
|
|
||||||
The pull system: produce features only when the next team needs it
|
|
||||||
</h3>
|
|
||||||
<p>
|
|
||||||
Now, instead of pushing features, we wait for the next team to be ready.
|
|
||||||
It comes from the assumptions that we will never reach the best score
|
|
||||||
ever aka "the push system where everything goes right". We know we
|
|
||||||
prefer 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, it seems a good tradeoff.
|
|
||||||
</p>
|
</p>
|
||||||
<!-- [dps]
|
<!-- [dps]
|
||||||
<h3>Problem solving: no production, just reflection</h3>
|
<h3>Problem solving: no production, just reflection</h3>
|
||||||
@@ -196,31 +182,28 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
<FeatureSteps alias="playground" />
|
<FeatureSteps alias="playground" />
|
||||||
<div class="manual-simulation text">
|
<div class="manual-simulation text">
|
||||||
<p>
|
<p>
|
||||||
So what do you think? What can we learn? What are the patterns we can
|
What insights can we gain from these strategies? Here are some
|
||||||
identify? Well it depends, but overall...
|
observations:
|
||||||
</p>
|
</p>
|
||||||
<ol>
|
<ol>
|
||||||
<li>
|
<li>
|
||||||
In a primarly <PushSystemIcon /> push system, you can see teams going
|
In a predominantly <PushSystemIcon /> push system, teams perform well
|
||||||
just fine but when a problem occurs, it starts to snowball. Teams
|
initially, but issues can snowball when problems arise. Teams
|
||||||
start to struggle and need to rework the same features again and again
|
struggle, leading to repeated rework, and many features are delivered
|
||||||
to finally deliver many features all at once.
|
all at once.
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
In a primarly <PullSystemIcon /> pull system however, we see a
|
A <PullSystemIcon /> pull system creates a smoother workflow, with
|
||||||
smoother flow of work with teams able to pass on features
|
teams passing features along continuously. This results in steadier
|
||||||
continuously, leading to a more steady and predictable delivery. It's
|
and more predictable delivery. Although defects still occur, the
|
||||||
not perfect, defects are still there. But when we start to see
|
synchronized workflow improves quality. Features are delivered in
|
||||||
synchronisation, we can see a better quality too. That enables the
|
smaller batches, which benefits users.
|
||||||
product to be deliver piece by piece to the user. Furthermore! The
|
|
||||||
batches of features going live are smaller and, for the user, this is
|
|
||||||
great!
|
|
||||||
</li>
|
</li>
|
||||||
</ol>
|
</ol>
|
||||||
<p>
|
<p>
|
||||||
Now, to easily compare the two systems: let's simulate whole project
|
Let’s compare the two systems by simulating the entire project using
|
||||||
depending on if the teams use <PushSystemIcon /> push system or
|
either the <PushSystemIcon /> push system or the <PullSystemIcon /> pull
|
||||||
<PullSystemIcon /> pull system.
|
system.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<SimulationControls type="single" class="above" />
|
<SimulationControls type="single" class="above" />
|
||||||
@@ -241,20 +224,20 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
<SimulationControls type="multiple" class="above" />
|
<SimulationControls type="multiple" class="above" />
|
||||||
<div class="flow-multiple-simulation text">
|
<div class="flow-multiple-simulation text">
|
||||||
<p v-if="displaySimulationConclusion">
|
<p v-if="displaySimulationConclusion">
|
||||||
Okay, now we're pretty sure! As the quality issue increase in the
|
Now we’re pretty confident! As quality issues increase in the
|
||||||
<PushSystemIcon /> push system, these defects and corrections pile up
|
<PushSystemIcon /> push system, defects and corrections accumulate,
|
||||||
and generate at about
|
leading to approximately
|
||||||
<span class="numeric">{{ leadTimeDelta }}</span>
|
<span class="numeric">{{ leadTimeDelta }}</span> days of delay
|
||||||
days of difference<template v-if="leadTimeDeltaFloat > 12">!!</template
|
<template v-if="leadTimeDeltaFloat > 12">!!</template
|
||||||
><template v-else>.</template>
|
><template v-else>.</template>
|
||||||
</p>
|
</p>
|
||||||
<p v-else>
|
<p v-else>
|
||||||
Waiting for at least {{ SIMULATION_THRESHOLD }} simulations...
|
Waiting for at least {{ SIMULATION_THRESHOLD }} simulations...
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
Teams tend to underestimate how long a project will be and how hard it
|
Teams often underestimate the complexity of a project and the challenges
|
||||||
will be to work with others. The bad news is this is what I've seen in a
|
of collaborating with others. Unfortunately, this is something I’ve
|
||||||
lot of software projects.
|
observed in many software projects.
|
||||||
</p>
|
</p>
|
||||||
<!-- [dps]
|
<!-- [dps]
|
||||||
<p>
|
<p>
|
||||||
@@ -262,12 +245,14 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
team to stop and think about how they work is critical.
|
team to stop and think about how they work is critical.
|
||||||
</p> -->
|
</p> -->
|
||||||
<p>
|
<p>
|
||||||
If we're not in a good pace, we just have to try harder. Only once.
|
If a project isn’t progressing well, the response is often to "try
|
||||||
"Just in time" becomes "Just this time" many times. So teams
|
harder"—just once. However, "Just in time" frequently turns into "Just
|
||||||
overproduce. Creating stock and latent defects the teams need to rework.
|
this time" over and over. This approach causes teams to overproduce,
|
||||||
The worse the project do, the more silot we become and we tend to argue
|
creating unnecessary stock and latent defects that require rework. The
|
||||||
with a "I've done my job, if the project fails it's not my fault.". The
|
more the project struggles, the more siloed teams become, leading to
|
||||||
fact is that it's nobody's fault, it's a system.
|
blame-shifting: "I did my part; if the project fails, it’s not my
|
||||||
|
fault." The reality is, it’s not anyone’s fault—it’s the system that’s
|
||||||
|
broken.
|
||||||
</p>
|
</p>
|
||||||
<!-- [dps]
|
<!-- [dps]
|
||||||
<p>
|
<p>
|
||||||
@@ -278,36 +263,29 @@ const displaySimulationConclusion = computed(() => {
|
|||||||
<SeparatorIcon />
|
<SeparatorIcon />
|
||||||
<div class="flow-conclusion text">
|
<div class="flow-conclusion text">
|
||||||
<p>
|
<p>
|
||||||
When money and pressure are in the game, fear, uncertainty, and doubt
|
When under pressure to meet deadlines, fear and uncertainty can cause
|
||||||
spread out rapidly. So we rush, as fast as we can, and when a team has
|
teams to overproduce. Product teams prepare extra features, designers
|
||||||
nothing to do, it becomes a disaster: money are being burned.
|
create unnecessary screens, and developers rush through coding. This
|
||||||
</p>
|
"just in case" mentality results in wasted effort and latent defects
|
||||||
<p>
|
that require rework, slowing productivity.
|
||||||
Teams will overproduce. They will do every pieces they can as they can:
|
|
||||||
product team will prepare their features, designers will design every
|
|
||||||
screens, developers will rush to code. Then, they struggle to get these
|
|
||||||
pieces to the very end. So the fear of having nothing to give to the
|
|
||||||
next team pushes us to produce just in case. Bugs lead to more bugs
|
|
||||||
leading to more bugs. The productivity drops.
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
|
Counterintuitively,
|
||||||
<a
|
<a
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
href="https://journals.aps.org/pre/abstract/10.1103/PhysRevE.96.052303#:~:text=The%20%E2%80%9Cfaster%2Dis%2Dslower,evacuation%20time%20can%20be%20achieved"
|
href="https://journals.aps.org/pre/abstract/10.1103/PhysRevE.96.052303#:~:text=The%20%E2%80%9Cfaster%2Dis%2Dslower,evacuation%20time%20can%20be%20achieved"
|
||||||
>Slower is faster</a
|
>slower is often faster</a
|
||||||
>
|
>. Excessive pushing slows down the system, while a
|
||||||
is counter-intuitive. The more we push the more we are slowing down the
|
<PullSystemIcon /> pull system enforces constraints that prioritize
|
||||||
system. The <PullSystemIcon /> pull system must be a constrain not a
|
thoughtful delivery.
|
||||||
choice with the idea to build around.
|
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
The <PullSystemIcon /> pull system is here to change our priority.
|
The pull system shifts priorities, treating developers as clients of the
|
||||||
Developpers are the clients of the Designer team, as Designers are the
|
design team, who in turn are clients of the product team. By focusing on
|
||||||
client of the Product team. Focusing on the lead time is asking to the
|
lead time, teams ask, "What do you need to succeed, and how can we
|
||||||
next team: "Is this what you need? How can we give you everything you
|
support you in delivering quality?" This embodies
|
||||||
need to deliver quality too?". This is <em>the true nature</em> of team
|
<em>the true essence</em> of teamwork.
|
||||||
work.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</article>
|
</article>
|
||||||
|
|||||||
Reference in New Issue
Block a user