article: chatgpt my English

This commit is contained in:
Julien Calixte
2025-01-09 20:36:37 +01:00
parent 6811dc6f9c
commit 197e59363f

View File

@@ -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. Well 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, well examine how these strategies affect efficiency
what are the impact on the quality the teams produce. Let's dive in each and quality. Lets 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 Lets 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 were 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 Ive
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 isnt 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, its not my
fault." The reality is, its not anyones faultits the system thats
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>