<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://chocolatedrivendevelopment.com/feed/by_tag/devops.xml" rel="self" type="application/atom+xml" /><link href="https://chocolatedrivendevelopment.com/" rel="alternate" type="text/html" /><updated>2025-08-04T06:59:12+00:00</updated><id>https://chocolatedrivendevelopment.com/feed/by_tag/devops.xml</id><title type="html">Chocolate Driven Development</title><subtitle>The blog Chocolate Driven Development contains things to help in making your software creation better for the business, as well as for the developers.</subtitle><entry><title type="html">Publish first, review later</title><link href="https://chocolatedrivendevelopment.com/2023/11/23/review/" rel="alternate" type="text/html" title="Publish first, review later" /><published>2023-11-23T00:00:00+00:00</published><updated>2024-02-16T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2023/11/23/review</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2023/11/23/review/"><![CDATA[<p>Code that is waiting for review is useless to the customer.
It also risks growing old, or blocking other work that needs to be done. 
On top of that, it is demotivating for developers to see their code collect dust.</p>

<p>If the code is created by an open source community,
or something else that is done outside of the ordinary work,
things are different.
For a team working with the code in a professional setting,
asynchronous code reviews should be something to avoid.</p>

<h2 id="the-purpose-of-a-code-review">The purpose of a code review</h2>

<p>A traditional code review has two major purposes. 
The first is to make sure that the code behave as intended.
There are alternative ways to achieve this.
You can work in pairs or an ensemble. 
A test first approach, with a good knowledge in test coverage design,
might also help with this.</p>

<p>The second purpose is to maintain code quality over time. 
This is impossible for a team that lack refactoring skills,
regardless of how well code is reviewed.
Perhaps it works for a product in an environment that never changes,
but then code quality will also be less important.
So the team will need to know how to change production code in a safe and effective way.
With that knowledge, you can review code that is important, instead of code that is new.</p>

<p>The important code is the areas in the production code where a lot of changes happen.
You can then, as a team, look at the code and find ways to change it, so that it is easier to work with.
That will improve the software design skills of the entire team.</p>

<h2 id="ease-them-out">Ease them out</h2>
<p>To become a high achieving software team you will need the same skills that make 
asynchronous code reviews unnecessary.
So try to ease them out if you can.
If you don’t feel safe to let code go into production without a review step,
make sure to only focus on functionality (or what regulations demand).
Have a linter in place that checks things like formatting as a pre-commit hook. 
If the code quality is so low that it hurts to put the code in production,
that developer should not work alone. 
It is harder to teach software skills through a written review than in person.</p>

<p>Save the review energy for the high stake parts of the system, 
and go through it as a team.
Then you make sure that the knowledge from the entire team is used,
and shared, 
and that everyone is onboard with the results.</p>

<p>When the code never has to wait for <em>someone else</em> to get into production, 
then you can create value really fast.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="code" /><category term="agile" /><category term="devops" /><summary type="html"><![CDATA[Code needs something to make sure it works as intended. Using asynchronous code reviews for that will slow the team down. Reviewing code as a group is a good tool for knowledge sharing, but do it on production code.]]></summary></entry><entry><title type="html">The magic of comfort zones</title><link href="https://chocolatedrivendevelopment.com/2023/09/28/comfort-zone/" rel="alternate" type="text/html" title="The magic of comfort zones" /><published>2023-09-28T00:00:00+00:00</published><updated>2023-09-28T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2023/09/28/comfort-zone</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2023/09/28/comfort-zone/"><![CDATA[<p>Kid’s independence is a love battery, 
charged and grown with closeness, 
safety and care, for their entire childhood.
Until one day they can carry that sense of safety with them out in the world, 
powered by just knowing that they are loved.</p>

<p>If we want people to learn new things,
collaborate with an open heart,
and challenge the limits of their capacity,
we do that by creating a safe and nurturing place for them.</p>

<p>The way out of the comfort zone is to have a comfort zone to start with.
Make people feel so safe that they get bored and start creating,
so cherished that they dare make a fool of themselves,
and so relaxed that all energy go into the task at hand.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="empathy" /><category term="equity" /><category term="devops" /><summary type="html"><![CDATA[When we feel comfortable there is room to try new and uncomfortable things. Then we can take (calculated) risks, collaborate and create. Value real comfort zones.]]></summary></entry><entry><title type="html">DevOps vs. FullStack</title><link href="https://chocolatedrivendevelopment.com/2023/07/26/devopsfullstack/" rel="alternate" type="text/html" title="DevOps vs. FullStack" /><published>2023-07-26T00:00:00+00:00</published><updated>2023-07-26T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2023/07/26/devopsfullstack</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2023/07/26/devopsfullstack/"><![CDATA[<p>DevOps and FullStack are orthogonal concepts. 
They express information along two different axis, independent of each other.</p>

<p>FullStack is about what kind of software you are comfortable writing. 
Where the stack starts and ends depend on who you are asking. 
It includes at least two layers of software.</p>

<p>DevOps is about what parts of the software lifecycle you are comfortable with.
The requirement is that you see it through at least until it brings value to the end user.</p>

<p>You can be a mobile app developer and do DevOps,
as long as your responsibility includes the distribution of the app,
and that is all that is required for it to reach the user.</p>

<p>You can be fullstack and not do DevOps,
if you let go of the code as soon as your feature is implemented.</p>

<p>If you, and your team, are responsible for development and operations,
that is DevOps.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="devops" /><category term="agile" /><category term="code" /><summary type="html"><![CDATA[DevOps and FullStack are orthogonal concepts. One is about technology and the other is about the software lifecycle.]]></summary></entry><entry><title type="html">The SOLID principles for organizing work</title><link href="https://chocolatedrivendevelopment.com/2023/07/17/solid-for-people/" rel="alternate" type="text/html" title="The SOLID principles for organizing work" /><published>2023-07-17T00:00:00+00:00</published><updated>2023-07-17T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2023/07/17/solid-for-people</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2023/07/17/solid-for-people/"><![CDATA[<p>Conway’s law states that:</p>
<blockquote>
  <p>Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization’s communication structure.</p>
</blockquote>

<p>We also know from the <a href="https://services.google.com/fh/files/misc/state-of-devops-2019.pdf">DORA DevOps report</a>
that we want loosely coupled code.
The SOLID principles can help us write code that has high cohesion and low coupling. 
I think we can translate those to work for organizations as well, 
and see how we can help the code be flexible through how we work.</p>

<h2 id="the-single-responsibility-principle">The Single-responsibility principle</h2>
<blockquote>
  <p>There should never be more than one reason for a class to change.</p>
</blockquote>

<p>This is really about stakeholders. 
(<a href="/2022/10/04/single-responsibility-salt/">See this blogpost for more on how it works in code.</a>)</p>

<blockquote>
  <p>Aim for as few stakeholders as possible for a team</p>
</blockquote>

<p>The stakeholder can be internal or external.</p>

<p>(I expand on what to do to achieve this in <a href="/2023/07/24/tug-of-war/">another post.</a>)</p>

<h2 id="the-openclosed-principle">The Open–closed principle</h2>
<blockquote>
  <p>Software entities … should be open for extension, but closed for modification.</p>
</blockquote>

<p>We want change to happen where it makes sense and only when needed.
For organizations we get there by team design.</p>
<blockquote>
  <p>Create small, long term, self sufficient teams that collaborate.</p>
</blockquote>

<p>Teams get better with time.</p>

<h2 id="the-liskov-substitution-principle">The Liskov substitution principle</h2>
<blockquote>
  <p>Functions that use pointers or references to base classes must be able to use objects of derived classes without knowing it.</p>
</blockquote>

<p>How something is solved can change, and you should not have to care about it.
The design of the base class helps us find the purpose of the object from the user perspective.</p>

<blockquote>
  <p>Internal services are internal products</p>
</blockquote>

<p>Create internal services as if they would be sold to external customers.
We want each part of the system to have a clear purpose and each team to have independent pacing of their work.
It also makes it possible to swap it for “off the shelf”-solutions if the service is no longer a part of the competitive edge.
(And let the team take on a new project.)</p>

<h2 id="the-interface-segregation-principle">The Interface segregation principle</h2>
<blockquote>
  <p>Clients should not be forced to depend upon interfaces that they do not use.</p>
</blockquote>

<p>We don’t want code to be weighed down by conforming to rules that does not apply to it.
The same is true for teams.</p>

<blockquote>
  <p>Let each team own their process.</p>
</blockquote>

<p>There can not be one flavour of agile in a big company.
Instead, each team should be provided with the time and expertise to learn how to improve their own work.
Be clear with desired outcomes and core values,
let the team do the rest.</p>

<h2 id="the-dependency-inversion-principle">The Dependency inversion principle</h2>
<blockquote>
  <p>Depend upon abstractions, not concretions.</p>
</blockquote>

<p>This is about integrity.</p>

<blockquote>
  <p>No micro management.</p>
</blockquote>

<p>Give the team one stakeholder and the capabilities they need to fill one purpose for that stakeholder,
then trust them.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="agile" /><category term="code" /><category term="devops" /><summary type="html"><![CDATA[The SOLID principles help us write loosely coupled code. We also know that the structure of the organization is reflected in the resulting code. So how can we translate SOLID to help with a loosely coupled organization?]]></summary></entry><entry><title type="html">The upside-down framework anti-pattern</title><link href="https://chocolatedrivendevelopment.com/2022/11/04/upside-down/" rel="alternate" type="text/html" title="The upside-down framework anti-pattern" /><published>2022-11-04T00:00:00+00:00</published><updated>2022-11-04T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2022/11/04/upside-down</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2022/11/04/upside-down/"><![CDATA[<p>In the tv-series <a href="https://en.wikipedia.org/wiki/Stranger_Things">Stranger things</a> there are tentacles, or maybe vines,
spreading through the underworld called “the upside-down”. 
It’s a scary place of darkness,
and the thick dark cords infiltrate and consume.
The clinging and squirming things are also connected to each other.
Step on one and all the others will know.</p>

<p>There is code like this, frameworks that infiltrate the domain code until they are inseparable. 
Change one part and it affects all of it. You are never safe to move. 
Bad habits of the team that designed the framework will seep into the code base. 
(Regardless if the framework is external or developed alongside the domain logic.) 
Getting free takes time. 
Approval tests and safe refactoring are the flamethrowers that can save us.</p>

<p>To avoid this anti-pattern, keep your frameworks at arms length. 
Isolate code that is framework specific from your domain logic. 
Use interfaces!
<a href="https://en.wikipedia.org/wiki/Hexagonal_architecture_(software)">Hexagonal design (ports and adapters)</a> 
can be used for this.</p>

<p>A bonus is that the code will be testable. 
Frameworks are good at side effects. 
Let them deal with that.
The domain code is then easy to put in unit tests.</p>

<p>If the framework is not working for you, or is updated, 
make sure the interface is preserved and the change is mostly done. 
It won’t even make your nose bleed.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="code" /><category term="quality" /><category term="devops" /><summary type="html"><![CDATA[Don't let frameworks interlace with the domain code. Keep them separate and working with the codebase won't require super powers.]]></summary></entry><entry><title type="html">Let code grow old in peace</title><link href="https://chocolatedrivendevelopment.com/2022/10/29/grow-old-in-peace/" rel="alternate" type="text/html" title="Let code grow old in peace" /><published>2022-10-29T00:00:00+00:00</published><updated>2022-10-29T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2022/10/29/grow-old-in-peace</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2022/10/29/grow-old-in-peace/"><![CDATA[<p><a href="/2022/10/04/single-responsibility-salt/">Single responsibility principle</a>,
<a href="https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle">open-closed principle</a> and
<a href="https://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a> are all design principles that allow code to grow old in peace.</p>

<p>Code that has a limited responsibility, with only one stakeholder. 
Objects and functions that can be part of composition, without being altered. 
Interactions designed to work even if the implementation details of one actor changes. 
They will all likely result in code that has not been touched or altered for a very long time. 
The code is still in use, but as “done” as code ever gets.</p>

<p>It is a blessing when code is allowed to grow stale. 
We should design our code so that it can slowly sediment, 
harden by itself, 
in the peace good design and proper testing creates.
The codebase as a whole will still evolve, and that is going fast. 
Changes to support the business are quickly done in small units with good interfaces. 
Sometimes a bigger part is swapped out. 
In other cases, an old trustworthy part is promoted into a library. 
There is movement where it is needed, but the ripple effects don’t reach far.</p>

<p>When I hear about code freeze or software hardening as part of a delivery pipeline, 
I think about the aging and maturing of code. 
With small units of decoupled and well tested code, it will naturally harden. 
Some files will be created, 
used for days or decades, 
and then deleted, 
without ever being changed.
Others will have an eventful youth, 
but soon settle into being run, but not altered. 
For me, that is the goal, letting the legacy of code create a solid foundation for new work.</p>

<p>What do you have to change to let your code age in peace?</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="code" /><category term="devops" /><category term="quality" /><summary type="html"><![CDATA[Design the code so that as little as possible needs to change when the world changes.]]></summary></entry><entry><title type="html">Westrum in a restroom</title><link href="https://chocolatedrivendevelopment.com/2022/09/21/westrum/" rel="alternate" type="text/html" title="Westrum in a restroom" /><published>2022-09-21T00:00:00+00:00</published><updated>2022-09-21T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2022/09/21/westrum</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2022/09/21/westrum/"><![CDATA[<p>The sociologist Dr. Ron Westrum defined <a href="https://cloud.google.com/architecture/devops/devops-culture-westrum-organizational-culture">three main categories of company cultures</a>:
pathological, bureaucratic and generative.</p>

<p>The first time I heard of Westrum organisational culture I misheard it as
“Restroom Culture”.
I thought it was a way to tell company culture by looking at shared facilities.
It turned into a neat mnemonic, so now I bring you the explanation of the three
organisational cultures of Westrums, using restrooms.
Hopefully, though a bit silly, it will help you remember the real name,
as well as the concept. 
What kind of culture do you work in?</p>

<h2 id="pathological">Pathological</h2>
<p>No one dares to use up the last square of toilet paper. 
That person will be punished and might even be fired.
The storage is locked, some few select have a key. 
If you are friendly with someone who has access to extra toilet paper you might 
get a fresh roll.
But first you have to find out who those people are, and how to suade them. 
No one dares to mention that it might be wasteful to limit access to toilet paper.
The last one who brought up the subject
was first publicly blamed for all restroom related problems and then let go.
Some people bring their own rolls, but in secret,
so that it won’t be taken for critique.</p>

<h2 id="bureaucratic">Bureaucratic</h2>
<p>Toilet paper is refilled Tuesdays and Thursdays. 
If it runs out any other day there is a form to fill out that heed approval from
your bosses boss.
Any suggestion to change this will be ignored.
Employees are not trusted with important things like toilet paper.</p>

<h2 id="generative">Generative</h2>
<p>Toilet paper is stored where everyone has access to it.
If it runs low anyone who notices takes action.
There is also a supply of sanitary products available in all restrooms,
as a result of an employee initiative.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="devops" /><category term="empathy" /><summary type="html"><![CDATA[The Westrum model for company culture distinguishes between pathological, bureaucratic and generative. To remember the model it is presented as ways to deal with a common restroom.]]></summary></entry><entry><title type="html">The &amp;amp; in DevOps</title><link href="https://chocolatedrivendevelopment.com/2022/08/23/and-in-devops/" rel="alternate" type="text/html" title="The &amp;amp; in DevOps" /><published>2022-08-23T00:00:00+00:00</published><updated>2022-08-23T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2022/08/23/and-in-devops</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2022/08/23/and-in-devops/"><![CDATA[<p>In the book ‘Thinking in systems’ Donella M. Meadows quotes the Sufi teaching:</p>

<blockquote>
  <p>You think because you understand ‘one’ you must also understand ‘two’,
because one and one make two. 
But you must also understand ‘and’.</p>
</blockquote>

<p>DevOps is Dev and Ops. 
For something to be DevOps the team must do development. 
The same team has to run operations.
In this an invisible ‘&amp;’ gets created between Dev and Ops.
This ‘&amp;’ has value that can not be seperated from it joining Dev and Ops.</p>

<p>Getting unique value from putting responsibility for Dev and Ops in the same team
can be hard to grasp. 
It is creating a new system with improved self organisation and 
evolution capabilities.
This evolution and self organisation might manifest as a demand for new software,
development practises or an interest in cloud services. 
But these are only side effects of the newly created ‘&amp;’.
Don’t mistake a continues integration server for DevOps.</p>

<p>Some want the ‘&amp;’ that this change brings to life 
to be bottled and sold on its own.</p>

<p>We see software marketed as DevOps.
Or a service as DevOps.
“Let us do your DevOps for you.”</p>

<p>Introducing external dependencies, and thereby removing agency for the team,
damages the very ‘&amp;’ it is confused with.</p>

<p>You can’t sell love, company culture, life, ‘rainforestness’
or any other ‘&amp;’ from systems we have around us.</p>

<p>DevOps can only be created by letting one team have responsibility
for dev, ops and everything else that is needed for software to bring value.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="devops" /><summary type="html"><![CDATA[Systems thinking helps us understand why DevOps happens in the joining of dev and ops. It can not be bottled and sold separately.]]></summary></entry><entry><title type="html">The DevOps person and a 300 meter marathon</title><link href="https://chocolatedrivendevelopment.com/2021/05/26/the-devops-person-and-a-300-meter-marathon/" rel="alternate" type="text/html" title="The DevOps person and a 300 meter marathon" /><published>2021-05-26T00:00:00+00:00</published><updated>2021-05-26T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2021/05/26/the-devops-person-and-a-300-meter-marathon</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2021/05/26/the-devops-person-and-a-300-meter-marathon/"><![CDATA[<p>There are some concepts that have a logical conflict built in,
self contradictions.
A marathon is 42,195 meters,
otherwise it is not a marathon,
so a 300 meter marathon can not exist.
You can not have a diet plan for intuitive eating,
a vegan slaughterhouse or cooked raw food.
Democratic processes with a predefined result is as intrinsically incoherent
as an environment friendly coal mine,
regardless of what people say.
It makes no sense to beatify Martin Luther,
since one of the things that made him thrown out of church
is saying that everyone is a saint,
and no one is a saint.
I believe that the DevOps person (or team) is as bad as Saint Luther.</p>

<p>The point of DevOps is that the responsibility for development,
operations and maintenance of an application,
should be on the same team.
Everyone does DevOps,
and no one does DevOps.
It is a way of working that eliminates the hand-offs by saying that
writing and running the code is part of the same job.</p>

<p>To enable DevOps there are a lot of tools
for things like continuous delivery.
The tools themselves are sometimes confused with DevOps as a concept.
But you can use all of them without getting the benefits of DevOps.
Likewise, no cloud service,
containerisation tool or build system is needed to do DevOps.
Everything that is needed is in the statement
“Everyone is both a developer and does operations.”
(The separation is not to be compared with Luther’s saint vs. sinner
as more than a conceptual similarity.)</p>

<p>It is dangerous to believe DevOps to be either a role,
a team or a toolset.
One of the effects might be to overlook the changes
needed in the Dev part of DevOps.
In the <a href="https://services.google.com/fh/files/misc/state-of-devops-2019.pdf">DORA DevOps report</a>
automated tests,
trunk based development and loosely coupled architecture
is listed next to deployment automation and cloud
(page 31 is my favourite).
Writing tests,
using version control systems
and design code is clearly a dev thing.
Those skills are as important as setting up a build pipeline
or containers that run in the cloud.
If you just take a team of developers,
and add someone who knows the toolchain for DevOps,
you might oversee the need for training in other technical skills,
such as TDD.</p>

<p>Another trap is that if you still have one person in the team
responsible for getting the code into production,
and taking care of the new shiny tools,
not much have changed.
You have only created a mini ops team within the dev team.
The end goal is about shared responsibility
and a holistic view on the lifecycle of a feature,
and that needs to include everyone.</p>

<p>So the next time someone talks about DevOps as a person,
a role, a team or a tool chain,
remember your favourite self contradiction.
I will think about Saint Luther doing a diet plan for intuitive eating.</p>

<p>ps</p>

<p>If you find any examples I have not listed,
please share them in the comments or on Twitter @edytterbrink.
If anyone comes up with a nice hashtag I will edit and add it here.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="devops" /><summary type="html"><![CDATA[Self contradictions are things with a built in logical conflict. A DevOps person is not possible, since DevOps is about collaboration and shared responsibility. It can not be contained by a person.]]></summary></entry><entry><title type="html">Read Accelerate and wash your hands</title><link href="https://chocolatedrivendevelopment.com/2021/05/06/read-accelerate-and-wash-your-hands/" rel="alternate" type="text/html" title="Read Accelerate and wash your hands" /><published>2021-05-06T00:00:00+00:00</published><updated>2021-05-06T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2021/05/06/read-accelerate-and-wash-your-hands</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2021/05/06/read-accelerate-and-wash-your-hands/"><![CDATA[<p>In the <a href="https://services.google.com/fh/files/misc/state-of-devops-2019.pdf">DORA DevOps report</a>
and the accompanying book
<a href="https://itrevolution.com/book/accelerate/">Accelerate</a>
science show us how software should be done today
to optimise both for financial success and employee’ health.
From the respondents in the 2019 survey
20% of the companies are elite performers.
And the selection for the survey is such
that companies have to know about it to participate.</p>

<p>Around 1847 Ignaz Semmelweis discovered that washing the hands
before delivering babies
had the death rate of mothers go from 18% to 1.3%.
Semmelweis died in an asylum in 1865.
It is said that the cause was a nervous breakdown
as a result of his discovery
being met with such hostility in the medical community.
Doctors got offended by the idea that they could cause infection.
It was first in the 1870s
that doctors began systematically washing before surgery.
That is a lot of death.</p>

<p>The DORA DevOps report from 2019 connects success factors and practises
to lower risk of burnout.
We have scientific based research showing how to save lives
among the workers in our industry.
The only thing we need to do is to adapt the ways of work,
and learn the skills, that will also make us more profitable.
Still only one in five of the companies responding 
took full advantage of things that are available today.
Many companies do not even know about this research.</p>

<p>So if you have ever listened to a story like the one about Semmelweis
and thought about how stupid people used to be
who hung on to theories about body fluids in balance
and a geocentric world view, I have one thing to say to you:
Read the DevOps report and wash your hands.</p>

<p>ps.</p>

<p><a href="http://www.wnycstudios.org/story/dispatch-2-every-day-ignaz-semmelweis-day/">Radiolab tells the story about Semmelweis nicely.</a></p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="devops" /><summary type="html"><![CDATA[There is a scientifically better way to write software. It is all available in the DORA DevOps report and learning about it will save lives, for real.]]></summary></entry><entry><title type="html">It is not too good to be true</title><link href="https://chocolatedrivendevelopment.com/2021/04/27/it-is-not-too-good-to-be-true/" rel="alternate" type="text/html" title="It is not too good to be true" /><published>2021-04-27T00:00:00+00:00</published><updated>2021-04-27T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2021/04/27/it-is-not-too-good-to-be-true</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2021/04/27/it-is-not-too-good-to-be-true/"><![CDATA[<p>In 2019 the 20% highest performing software teams had 106 times shorter lead time,
2,604 times faster time to recover from incidents,
7 times lower change failure rate, while deploying 208 times as often,
compared to the 12% lowest performing teams.
This according to the <a href="https://services.google.com/fh/files/misc/state-of-devops-2019.pdf">State of DevOps 2019</a>
report.
Some performance factors found are code maintainability,
automated testing and loosely coupled architecture.
So why is not more effort put into creating codebases that are easy to work with?
I believe that some answers can be found on my messy desk.</p>

<p>One parallel between tidy software and a tidy home is about identity.
What life do we imagine is possible for us?</p>

<p>The KonMari method for tidying your home
talks about the importance of imagining where you want to end up.
When you are done with the KonMari method your home “go click”.
Then you have changed as a person and will never relapse into messiness again.
(You will still need to clean, but it will be much easier.)</p>

<p>So first you get to dream up the life you want to live,
get the tools to achieve it and grow into a person who can maintain it.
Each step of the KonMari journey is a part of that transformation.</p>

<p>There are software developers thinking that Test Driven Development is a unicorn,
that everyone dream of but no-one has really seen.
Software deteriorate, even rot, over time,
it is said.
People see it as inevitable, at least for them.
The role models for quality code in real projects are few.
That makes it harder to know what we could experience if things were better.
Still the DORA DevOps report shows us
that there is a real differentiation in the industry.
The gap is not only between the highest and the lowest performing teams.
Some move quicker than all of the rest and get better results.
But do we believe we could be like them?</p>

<p>We need to start dreaming about excellence.
Our identity has to shift to encompass the belief
that software can be written differently than it is today.
It might hurt to think of all the pain we suffered before,
when we learn a skill that makes our life easier.
It might be scary to imagine all the business decisions we need to make
when the technology
is no longer holding us back.
I was once afraid of a clean kitchen counter,
since it left me without something obvious to blame for … anything actually.
But we can not let fear hold us back!</p>

<p>Just doing more of the same we have always done won’t work either.
Getting rid of one item of clothing every day for December
won’t change our buying habits more than any other such challenge.
The clutter comes from how we relate to ourselves,
each other and our belongings.
The same goes for our code.
And just as Marie Kondo also teaches folding,
organising and storing,
there are concrete skills to learn that make writing tidy code easier.
But it has to come with a shift in perspective on improvement.
It is not about remembering to write unit tests,
it is about learning how to test drive code so that the architecture improve.
We do not simply have to remember to document the code,
instead it is about how we see carrying domain information
as a part of the codes purpose.
There is a difference between cleaning more often
and creating structural change to make cleaning easier.
It still does not require a rewrite of the entire codebase,
or you moving to a new home,
but we need to do something else than what has failed before.</p>

<p>To know what we are aiming for we need to dare to imagine a world
where writing code is fun and pain free.
We need to believe that we can be part of such a world.
Then it will be easier to learn and grow so that we can reach that goal.
In contrast to KonMari, best done alone,
changing how we write software is a team,
community and industry effort.
We need a bigger dream,
of a brighter future,
and believe that we can get there.
Please join me!</p>

<p>ps. My home still has some way to go before it “go click”
but I will re-read Spark Joy by Marie Kondo to get back on track.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="devops" /><summary type="html"><![CDATA[The software industry has to dream bigger when it comes to excellence, and use research available to improve. We need to dare to imagine a world where writing code is fun and pain free. It is possible!]]></summary></entry><entry><title type="html">Unnecessary limitations with a history</title><link href="https://chocolatedrivendevelopment.com/2021/04/08/unnecessary-limitations-with-a-history/" rel="alternate" type="text/html" title="Unnecessary limitations with a history" /><published>2021-04-08T00:00:00+00:00</published><updated>2023-09-07T00:00:00+00:00</updated><id>https://chocolatedrivendevelopment.com/2021/04/08/unnecessary-limitations-with-a-history</id><content type="html" xml:base="https://chocolatedrivendevelopment.com/2021/04/08/unnecessary-limitations-with-a-history/"><![CDATA[<p>Most software teams today underperform
since they can not fully leverage
the technological advantages we have gained over the last decades.</p>

<p>That is a bold statement and it comes from recognising three different levels of limitations
to our productivity.</p>

<h3 id="the-hard-limitation-in-the-technical-tools">The hard limitation in the technical tools</h3>

<p>In 1956 the cost of 30 hours of console time was the same as for a full year of a software engineer.
That has shaped our entire industry since then.
In <a href="/references/large-computer-programs.html">Production of large computer programs</a> Benington 
describes one of the first software projects big enough to need a team.
At this time the limitations in hardware defined how we wrote our software.</p>

<p>Some methods presented are very modern at their core.
Benington describes both predefined tests for small units of code,
parameter tests — today unit tests,
and tests for the entire system,
assembly tests — today system tests.
To automate them and run them for every change of the code was financially impossible. 
Instead every test is clearly documented,
not only to enable retesting but also to improve test design.
The parameter tests were defined for every combination of inputs
and outputs before starting to code.</p>

<blockquote>
  <p>In other words, a programmer must prove that he satisfied his specifications,
not that his program will perform as coded.<br />
(Actually, test specifications for one subprogram can be prepared in parallel with the coding.)</p>

  <p>– <cite>Benington in Production of large computer programs</cite></p>
</blockquote>

<p>You could stretch it so far as calling it Test Driven Development in spirit.
Benington also describes the seed of our modern Integrated Development Environments (IDEs).
The paper states about their development tools that  <em>its present size 40,000 machine instructions
is indicative of the importance attached to its role.</em> 
It really hit me how limiting it was to not have access to processing power
when developing software in 1956.
They knew what they needed, but the hard limitation in the technical tools 
made them take compensatory actions instead,
like having designated teams for testing and operations.</p>

<h3 id="the-limitations-originating-in-our-old-compensatory-actions">The limitations originating in our old compensatory actions</h3>

<p>In his <em>Theory of Constraints</em> Goldratt explains
that we can not gain advantage from a technical advancement
before we get rid of the compensatory actions we took to manage without it.
I illustrate it with a story about a Sunday steak and a pot.
The steak got its end cut off before it was put in the pot,
since the recipe originated from an ancestor with a pot so small
that no steak would fit without trimming it first.
This waste was discovered first
as one of the children asked the grandmother the magic word “why?”
and the origin was uncovered.
The limitations originating in our old compensatory actions can be tricky.
How do we know what things that used to enable us,
actually hinder us today? 
We need to find and discard them before we can benefit from new and better ways of working.</p>

<h3 id="the-limitations-from-outdated-skills">The limitations from outdated skills</h3>
<p>When we rid ourselves of old ways of working, 
no longer needed with new tools,
how do we gain proficiency in the new technology?
Not everything has such an intuitive interface as a slightly larger pot.
I use IDEs that the developers in 1956 could only dream of,
but they are only useful if you learn what they can do.
Modern version control systems create an opportunity for collaboration
that turns silos into networks and enable us to explore
and experiment in a way not possible before, if we know how to.
Test driving software for evolutionary design is a skill needed,
now that developers can be trusted with using a computer. 
So is continuous delivery a capability required as software changes faster for longer,
now that updates are no longer delivered with a person traveling to install it   for you.</p>

<h3 id="what-to-do">What to do</h3>
<p>Developers need to utilise the technical advances we have made since 1956.
For a long time we have stuck with the practises Benington
and others developed to survive in an era
where computing was extremely expensive.
Instead of holding on to processes they adapted out of necessity,
I want us to look at the dream that shines through the lines in that paper.
There I see test driven development,
continuous delivery,
static code checking,
code in high level languages that is easy to read and then optimised by compilers,
powerful IDEs and a lot more that we have today.
This generation has the tools to get all the smart people working together on hard problems, 
while letting the computers do the boring repetitive stuff.
But the <a href="/references/devops-2019.html">DORA’s devops report</a>
shows that far from everyone make use of the technical advancements. 
I believe that all the listed limitations have a hand in that.
The world needs better software,
and I somehow feel that I owe it to those
who walked before me to use the tools I have, but they only dreamed of.</p>

<p>To recap,
look around you
and see if you spot the same limitations as I do:</p>

<ul>
  <li><strong>The hard limitation in the technical tools</strong>, remember why you do it,
make a note in the recipe on the reason for trimming the edges of the steak.</li>
  <li><strong>The limitations originating in our old compensatory actions</strong>,
embrace asking “why?” to weed out things no longer needed.</li>
  <li><strong>The limitations from outdated skills</strong>,
read the DORA DevOps report
and find the support needed to become an elite performing software team.</li>
</ul>

<p>Next time your are frustrated over your working environment consider where we are
and how we got here.
There is a lot of prestige related to proficiency in the software industry.
We can’t keep the old limitations
just to avoid admitting our need to learn new skills.
Instead, take an action to change it for the better.
Remove something compensatory
that is not longer needed,
or learn a new skill to leverage the tools available.
No individual developer is to blame
that it ended up like this.
We need support each other to get out of it.</p>

<p>A version of this text was previously published on
<a href="https://www.linkedin.com/pulse/role-tac-plays-saving-it-industry-how-we-got-here-ester-daniel/">LinkedIn</a>.</p>]]></content><author><name>Ester Daniel Ytterbrink</name></author><category term="ToC" /><category term="devops" /><summary type="html"><![CDATA[Software development today share problems with the first bigger software projects, but unnecessarily so. To take advantage of a new technology we must unlearn what we did to manage without it. Then we can learn the skills needed to fully utilize our tools.]]></summary></entry></feed>