<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Francisco Ortiz</title>
    <description>The latest articles on DEV Community by Francisco Ortiz (@fran_ortiz).</description>
    <link>https://dev.to/fran_ortiz</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F760312%2Fe21f927a-0f6c-4bdc-90ec-ece5d4af1fee.jpeg</url>
      <title>DEV Community: Francisco Ortiz</title>
      <link>https://dev.to/fran_ortiz</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fran_ortiz"/>
    <language>en</language>
    <item>
      <title>Little's Law: improving the lead time by reducing WIP</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Wed, 01 Jun 2022 06:57:39 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/littles-law-improving-the-lead-time-by-reducing-wip-51n8</link>
      <guid>https://dev.to/fran_ortiz/littles-law-improving-the-lead-time-by-reducing-wip-51n8</guid>
      <description>&lt;p&gt;Improving the &lt;a href="https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/"&gt;delivery lead time&lt;/a&gt; is a goal for every organization. In this article, we will explore &lt;a href="https://en.wikipedia.org/wiki/Little%27s_law"&gt;Little's Law&lt;/a&gt;, a mathematical theory that relates lead time to the amount of work in progress and to the team's throughput.&lt;/p&gt;

&lt;h3&gt;
  
  
  Little’s Law
&lt;/h3&gt;

&lt;p&gt;Little’s Law comes from &lt;a href="https://en.wikipedia.org/wiki/Queueing_theory"&gt;queueing theory&lt;/a&gt;. It states the following:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“The long-term average number L of customers in a stationary system is equal to the long-term average effective arrival rate λ multiplied by the average time W that a customer spends in the system.”&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Algebraically, the law is: &lt;em&gt;L = λW&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Little’s Law is present in every queue. Some examples where it appears are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Number of customers in a store&lt;/li&gt;
&lt;li&gt;Number of messages in a queue&lt;/li&gt;
&lt;li&gt;Number of user stories in a product backlog&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this article, we will focus on the last use case: the number of user stories in a product backlog. Considering the product backlog as our stationary system, we could define the Little’s Law as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The average team’s delivery lead time is the number of work-in-progress tasks divided by its throughput.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tJGCV7_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r27svhmhtvfhpjg0iiig.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tJGCV7_J--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r27svhmhtvfhpjg0iiig.png" alt="Little's Law" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead time&lt;/strong&gt; is the average time a task spends in the backlog.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WIP&lt;/strong&gt; is the average number of in-progress tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throughput&lt;/strong&gt; is the average amount of work a team can complete in a certain period of time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the formula, we can see that we have two options to improve lead time: &lt;strong&gt;reduce the amount of work in progress&lt;/strong&gt; or &lt;strong&gt;increase the throughput&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reduce Work In Progress
&lt;/h3&gt;

&lt;p&gt;Work in progress (WIP) refers to the work that has been started but not yet finished. When we set a WIP limit, we are forced to prioritize and select the tasks to implement. If the WIP limit is reached, nobody is allowed to start new work. Instead, all people should help to finish the ongoing work.&lt;/p&gt;

&lt;p&gt;As John Cutler explains &lt;a href="https://cutlefish.substack.com/p/tbm-4052-why-limiting-wip-starting?s=r"&gt;here&lt;/a&gt;, &lt;strong&gt;limiting WIP is hard&lt;/strong&gt;. We usually have the goal of having everyone busy, and any other choice is considered ineffective. In fact, any other decision seems counterintuitive.&lt;/p&gt;

&lt;p&gt;With Little’s Law, we have mathematical proof that reducing WIP is a better strategy if we want to finish our work early. &lt;strong&gt;We don’t want resource optimization, we want to optimize the flow&lt;/strong&gt; in the queue. We want to &lt;strong&gt;&lt;a href="https://www.goodreads.com/book/show/16208052-stop-starting-start-finishing"&gt;stop starting and start finishing&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  How to reduce WIP
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Do fewer things&lt;/strong&gt;: this may look obvious, but it forces us to make decisions and discard some ideas. Otherwise, we will have a never-ending backlog and a lot of pressure to start new work. Steve Jobs said: &lt;em&gt;“People think focus means saying yes to the thing you’ve got to focus on. But that’s not what it means at all. It means saying no to the hundred other good ideas that there are. You have to pick carefully.”&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pair / Mob programming:&lt;/strong&gt; pair/mob programming is also an excellent approach for reducing WIP. Instead of assigning one task to each developer, try to solve the problem together. As we said, our goal is to complete the task as soon as possible, not to start as many as possible.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Increment throughput
&lt;/h3&gt;

&lt;p&gt;In Kanban, throughput refers to the amount of work delivered over a certain period of time. Example: the number of tasks a team can complete on a weekly basis.&lt;/p&gt;

&lt;p&gt;While the current amount of work in progress can be reduced instantly, increasing the team's throughput is not as simple. There are no immediate actions that produce a better team performance. However, there are some decisions that can improve this throughput in the long term.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improve the team's technical practices:&lt;/strong&gt; practices like &lt;a href="https://cloud.google.com/architecture/devops/devops-tech-trunk-based-development"&gt;trunk-based development&lt;/a&gt;, &lt;a href="https://cloud.google.com/architecture/devops/devops-tech-test-automation"&gt;automatic testing&lt;/a&gt;, or &lt;a href="https://cloud.google.com/architecture/devops/devops-tech-continuous-delivery"&gt;continuous delivery&lt;/a&gt; improve the software delivery performance, so the throughput will increase.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Improve team’s autonomy&lt;/strong&gt;: teams should be autonomous to complete a task. When a team needs to wait for external dependencies to complete their work all the time, the lead time is really affected. This topic was covered further in the &lt;a href="https://productdeveloper.net/cross-team-communication-avoid-dependencies"&gt;Cross-Team Communication: avoid dependencies&lt;/a&gt; post.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Work in small batches:&lt;/strong&gt; by working in small batches, we can quickly validate if changes have the desired effect. If not, it lets us make the proper corrections. As a result, we avoid spending a lot of time working on a bad solution so we improve the throughput.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hiring more people:&lt;/strong&gt; this always can be a valid solution. However, remember to be careful, as the team throughput does not grow in the same way as the number of people in the team. The more people in the team, the more needed coordination for the team to perform well. If the required coordination is too high, the team throughput can decrease when we add more people to the team. That’s why we have some rules like the &lt;a href="https://docs.aws.amazon.com/whitepapers/latest/introduction-devops-aws/two-pizza-teams.html"&gt;Two-Pizza Teams&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;When working on any queue, we should keep in mind that the goal is to optimize for fast flow, reducing the lead time as much as possible.&lt;/p&gt;

&lt;p&gt;In this article, we have seen Little’s law, a powerful and simple mental model that establishes a relationship between the lead time, the number of in-progress tasks, and the team throughput. In order to have the shortest lead time, we should try to reduce the number of work-in-progress items and increase the throughput.&lt;/p&gt;

&lt;p&gt;We have focused on a product backlog queue, but remember that this model is valid in any other queue. If you are optimizing a process that involves a queue, consider simulating your use case with this law.&lt;/p&gt;

&lt;p&gt;What is your experience with Little's Law? Please &lt;a href="//mailto:fortizabril@gmail.com"&gt;get in touch&lt;/a&gt; and let me know.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related content
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.loom.com/share/5efceb288b634a449041918bdba08202"&gt;High WIP, Online Whiteboard for Visual Collaboration&lt;/a&gt; - John Cutler (@johncutlefish)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://cutlefish.substack.com/p/tbm-4052-why-limiting-wip-starting?s=r"&gt;Why Limiting WIP, Starting Together, Being Less Busy, and Working Together is SO HARD &lt;/a&gt;- John Cutler (@johncutlefish)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/michelgrootjans/explaining-flow"&gt;Explaining flow&lt;/a&gt; - Michel Grootjans (@​michelgrootjans)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=yPqHK5fjJ10"&gt;Escalabilidad: bases y aplicación a sistemas, equipos y procesos&lt;/a&gt; - Talk with Edu Ferro (@eferro) in the Caceres Devops Days 2020&lt;/p&gt;

</description>
      <category>queueingtheory</category>
      <category>devops</category>
    </item>
    <item>
      <title>Book review: Modern Software Engineering</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Thu, 31 Mar 2022 07:07:30 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/book-review-modern-software-engineering-2bip</link>
      <guid>https://dev.to/fran_ortiz/book-review-modern-software-engineering-2bip</guid>
      <description>&lt;p&gt;When I read a book, I don't always take the time to reflect on what I learned. My purpose in writing these articles is to share a quick summary of some books I find interesting, along with some opinions and learnings I am taking from them.&lt;/p&gt;

&lt;p&gt;My first choice is a book I just finished last month: &lt;a href="https://www.amazon.com/-/es/David-Farley/dp/0137314914" rel="noopener noreferrer"&gt;Modern Software Engineering&lt;/a&gt; by &lt;a href="https://twitter.com/davefarley77" rel="noopener noreferrer"&gt;Dave Farley&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As a frequent viewer of the &lt;a href="https://www.youtube.com/c/ContinuousDelivery" rel="noopener noreferrer"&gt;Continuous Delivery&lt;/a&gt; channel, I had some doubts about reading this book, since I’m already very aligned with Dave Farley’s ideas :). Finally, I decided to read it and I enjoyed it. &lt;strong&gt;Modern Software Engineering is a book for anyone working or aspiring to be a software engineer&lt;/strong&gt;. It presents a series of related ideas, advice, and technical practices that can have a significant impact on the quality of our work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is Software Engineering?
&lt;/h3&gt;

&lt;p&gt;The book starts presenting &lt;strong&gt;software development as an engineering practice.&lt;/strong&gt; This definition has always been something controversial for me, as we have sometimes separated the word “engineering” from software development. As Dave Farley says, this separation comes from the attempts of our industry of treating software development as a production line, designing waterfall processes where there is no discovery, learning, or experimentation. Software engineering is a different problem. Software is not a production problem (physical things with a high cost of replication) so we need to use different tools for software development: testability, experiments, continuous delivery.&lt;/p&gt;

&lt;p&gt;Taking these things into account, Dave presents the following definition for software engineering:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Software engineering is the application of an empirical, scientific approach to finding efficient, economic solutions to practical problems in software”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To master software engineering, we must become &lt;strong&gt;experts at learning and experts at managing complexity&lt;/strong&gt;. Software development requires continuous discovery and learning, so that's why we should master the &lt;strong&gt;learning&lt;/strong&gt; part. To do this sustainably, we must manage the &lt;strong&gt;complexity&lt;/strong&gt; of our systems.&lt;/p&gt;

&lt;h3&gt;
  
  
  Optimize for learning
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9za5iy8mncptbu11lj4x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9za5iy8mncptbu11lj4x.png" alt="Optimize for learning"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Software engineering is a complex and creative discipline, a continuous exercise of exploration and discovery. In many cases, we don’t even completely understand what we are building so it’s very important to explore our customer's needs, try to figure out how to solve the problem presented, or try to discover new tools to improve our work.&lt;/p&gt;

&lt;p&gt;So, to master software engineering, we should focus on improving our skills of &lt;strong&gt;exploration&lt;/strong&gt;, &lt;strong&gt;discovery&lt;/strong&gt;, and &lt;strong&gt;learning&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;To highlight the importance of continuous learning in software development, I also love the driving metaphor from the &lt;a href="https://www.oreilly.com/library/view/extreme-programming-explained/0201616416/" rel="noopener noreferrer"&gt;Extreme Programming book&lt;/a&gt;:&lt;br&gt;
&lt;em&gt;“Driving is not about getting the card going in the right direction. Driving is about constantly paying attention, making a little correction this way, a little correction that way”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To optimize for learning, the book presents five behaviors to consider:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Working iteratively&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Feedback&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Incrementalism&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Empiricism&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Being Experimental&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The main idea is to work on small steps, collect feedback, and adjust.&lt;/strong&gt; We usually fail to guess what users want. According to some studies, two-thirds of the ideas that come from top software companies fail to produce the expected value (here you have examples from &lt;a href="http://ai.stanford.edu/~ronnyk/ExPThinkWeek2009Public.pdf" rel="noopener noreferrer"&gt;Microsoft&lt;/a&gt; or &lt;a href="https://www.businessinsider.com/amazon-products-services-failed-discontinued-2019-3?r=MX&amp;amp;IR=T#haven-2" rel="noopener noreferrer"&gt;Amazon&lt;/a&gt;). If these companies are making mistakes, then we will too :) So the important thing is to test our ideas effectively so that we can discard the bad ones as soon as possible.&lt;/p&gt;

&lt;p&gt;This part of the book also reminds me of the &lt;a href="https://itrevolution.com/the-devops-handbook/" rel="noopener noreferrer"&gt;DevOps Handbook&lt;/a&gt; book, with the &lt;a href="https://itrevolution.com/the-three-ways-principles-underpinning-devops/" rel="noopener noreferrer"&gt;Three Ways of DevOps&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The first way: &lt;strong&gt;System thinking&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The second way: &lt;strong&gt;Amplify Feedback Loops&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The third way: &lt;strong&gt;Culture of continual experimentation and learning&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Optimize for managing complexity
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo876cuvgugxlxu3qeltt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo876cuvgugxlxu3qeltt.png" alt="Optimize for managing complexity"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As a company grows, if we want to be able to scale, we need to manage the complexity of our systems.&lt;/p&gt;

&lt;p&gt;We can start to work on a small idea without taking design decisions but, if our system grows and we want to scale beyond a single team we need to consider these ideas. Otherwise, we will end up with big-ball-of-mud systems, a huge number of bugs and technical debt, etc.&lt;/p&gt;

&lt;p&gt;The book presents other five ideas to manage complexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modularity&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cohesion&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Separation of Concerns&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Information Hiding and Abstraction&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Managing Coupling&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Tools to support engineering in software
&lt;/h3&gt;

&lt;p&gt;In this block, Dave Farley examines some of the ideas discussed throughout the book, exploring them in more depth and showing some practical examples.&lt;/p&gt;

&lt;p&gt;The presented ideas are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Testability&lt;/li&gt;
&lt;li&gt;Deployability: remember, &lt;strong&gt;deployable != releasable&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Controlling the variables&lt;/li&gt;
&lt;li&gt;Continuous Delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also liked the part about disruptive organizations from this section, where he presents the “**BAPO versus OBAP” **model.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fma30gkcqr57m5mzrnfox.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fma30gkcqr57m5mzrnfox.png" alt="OBAP versus BAPO"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With the OBAP model, companies first fix the structure, departments, teams, and responsibilities. They then decide on a business strategy, architecture, and processes based on those constraints.&lt;/p&gt;

&lt;p&gt;Instead, the first step in the BAPO model is to identify the business vision and goals. Then, work on defining an architecture and processes that help to achieve that architecture. The final step is to pick an organizational structure that supports the necessary activities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OBAP&lt;/strong&gt;: organizational structure &amp;gt; business vision &amp;gt; architecture &amp;gt; processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BAPO&lt;/strong&gt;: business vision &amp;gt; architecture &amp;gt; process &amp;gt; organizational structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Modern Software Engineering book presents a good set of ideas, advice, and technical practices that we can apply to improve our work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All the ideas are related.&lt;/strong&gt; Using the presented ideas to manage complexity (&lt;strong&gt;modularity&lt;/strong&gt;, &lt;strong&gt;cohesion&lt;/strong&gt;, &lt;strong&gt;separation of concerns&lt;/strong&gt;...) you will be able to create systems that will help you learn faster (through rapid &lt;strong&gt;feedback&lt;/strong&gt;, small &lt;strong&gt;iterations&lt;/strong&gt;, &lt;strong&gt;experimentation&lt;/strong&gt;, etc.).&lt;/p&gt;

&lt;p&gt;Analyzing the book, my feeling is that Dave Farley has got a mix of the &lt;a href="https://www.oreilly.com/library/view/extreme-programming-explained/0201616416/" rel="noopener noreferrer"&gt;Extreme Programming&lt;/a&gt; and the &lt;a href="https://itrevolution.com/the-devops-handbook/" rel="noopener noreferrer"&gt;DevOps Handbook&lt;/a&gt; books in a single book so I would recommend it to anyone working in the software industry.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related content
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://itrevolution.com/the-devops-handbook/" rel="noopener noreferrer"&gt;DevOps Handbook&lt;/a&gt; - Gene Kim, Jez Humble, Patrick Debois, John Willis, and Nicole Forsgren&lt;br&gt;
&lt;a href="https://www.oreilly.com/library/view/extreme-programming-explained/0201616416/" rel="noopener noreferrer"&gt;Extreme Programming&lt;/a&gt; - Kent Beck&lt;br&gt;
&lt;a href="https://productdeveloper.net/feedback-loops" rel="noopener noreferrer"&gt;Using the DevOps second way to improve the product development process&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/c/ContinuousDelivery" rel="noopener noreferrer"&gt;Continuous Delivery Youtube channel&lt;/a&gt; - Dave Farley&lt;/p&gt;

</description>
      <category>devops</category>
      <category>xp</category>
      <category>programming</category>
      <category>books</category>
    </item>
    <item>
      <title>Pair Programming - Why you should try it</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Wed, 23 Feb 2022 19:38:28 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/pair-programming-why-you-should-try-it-2577</link>
      <guid>https://dev.to/fran_ortiz/pair-programming-why-you-should-try-it-2577</guid>
      <description>&lt;p&gt;&lt;a href="http://www.extremeprogramming.org/rules/pair.html"&gt;Pair programming&lt;/a&gt; is one of the most important practices from &lt;a href="http://www.extremeprogramming.org/"&gt;Extreme Programming&lt;/a&gt;. Although it is a well-known technique, it is rarely used in our industry.&lt;/p&gt;

&lt;p&gt;One reason is that many people view pair programming as an ineffective technique. In terms of effectiveness, there have been many attempts to measure the performance of software teams. The problem is that they tend to focus on individual productivity: how much code people write, how many hours people work... &lt;em&gt;They focus on outputs instead of outcomes&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;However, software development is not about how fast we can write new code. The goal of any organization is to make money. &lt;strong&gt;To make money, companies need to reduce the &lt;a href="https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/"&gt;lead time&lt;/a&gt; to increase production feedback&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In this article, we will see how pair programming accelerates production feedback. We will also discuss some other benefits of pair programming, and why it is such an important practice in software development.&lt;/p&gt;

&lt;p&gt;Hopefully, you'll decide to try it out :)&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits of pair programming
&lt;/h3&gt;

&lt;p&gt;It's important to be aware of the benefits a new practice should provide before you start using it. You can then evaluate if it's working, motivate yourself to keep doing it, etc. We will explore some of the benefits of pair programming in this section.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--y8dIWi43--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0jt75387el1rldv6vjp.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--y8dIWi43--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0jt75387el1rldv6vjp.jpeg" alt="Pair Programming Benefits" width="880" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Team relationships
&lt;/h4&gt;

&lt;p&gt;In 2015, Google wanted to discover if there were any common factors among its best-performing teams. They conducted over 200 interviews on more than 180 teams. What they found was that “&lt;strong&gt;who is on a team matters less than how the team members interact, structure their work, and view their contributions&lt;/strong&gt;”.&lt;/p&gt;

&lt;p&gt;Software development is a team activity. The communication that pair programming requires often leads to a stronger sense of team identity and better relationships between team members. We enjoy our success together when things go well. When things go wrong, it is also less painful for the team if they are together.&lt;/p&gt;

&lt;h4&gt;
  
  
  Knowledge Sharing
&lt;/h4&gt;

&lt;p&gt;This one is the most obvious benefit of pair programming. When we do pair programming, every piece of our code is known by at least two people. A few immediate advantages at this point are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Bus_factor#:~:text=The%20%22bus%20factor%22%20is%20the,disappearing%20suddenly%20from%20the%20project."&gt;Bus Factor&lt;/a&gt; problem is dramatically decreased.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Taking holidays whenever we like does not affect the team's activity. Team initiatives are not dependent on a specific person.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Furthermore, remember that the whole team is constantly exchanging knowledge. Eventually, everyone on the team will grow dramatically. In my opinion, &lt;strong&gt;there is no better strategy to spread learning than pair programming&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Efficiency
&lt;/h4&gt;

&lt;p&gt;Let’s go with efficiency. When we are working on a new feature, our goal is to deploy the new changes into production as soon as possible so that we can get feedback about them. As we saw in the article on &lt;a href="https://productdeveloper.net/feedback-loops/"&gt;feedback loops&lt;/a&gt;, &lt;strong&gt;fast feedback has many benefits&lt;/strong&gt;. We would like to work on small steps, committing changes very often.&lt;/p&gt;

&lt;p&gt;In addition to having fast feedback, we want to maintain a high level of quality within our code. To keep this level of quality, we often do code reviews before deploying code to production. A second opinion is always useful. There are several ways to conduct these reviews:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Asynchronous code reviews&lt;/strong&gt;: Asynchronous code reviews prevent us from committing changes to production continuously, so our goal of having fast feedback is broken. Additionally, asynchronous code reviews result in a lot of wasted time and interruptions due to multiple context switches. The screenshot below illustrates this clearly, from &lt;a href="https://twitter.com/d_stepanovic/"&gt;Dragan Stepanovic’s&lt;/a&gt; tweet:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--GpcO1p1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9vwo1z6fznwbpeaoc3ag.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--GpcO1p1c--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9vwo1z6fznwbpeaoc3ag.jpeg" alt="Asynchronous code reviews" width="880" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Synchronous code reviews&lt;/strong&gt;: to avoid interruptions and context switching, we can force our code reviews to be synchronous. However, what if we commit our changes very frequently in very small steps? We would need to interrupt our colleagues many times. It would not be effective. To have fewer interruptions, we would end up with bigger changes, which is something that we don’t want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Pair programming&lt;/strong&gt;: we have continuous code review with pair programming. As all the code is developed in pairs, the code review is not a separate step. All the code goes to production as soon as it’s committed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, as a summary:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To work on small steps, asynchronous code review is not an option.&lt;/li&gt;
&lt;li&gt;With synchronous code reviews, we need a lot of coordination between the team members and we end up with bigger changes.&lt;/li&gt;
&lt;li&gt;Pair programming allows us to work on small steps, getting fast feedback of our changes without compromising the code quality, as the code is continuously reviewed. &lt;strong&gt;Pair programming is the most effective way to work if we want to do continuous integration and continuous delivery&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are interested in learning more about the different types of code reviews, I recommend reading &lt;a href="https://www.eferro.net/2021/09/code-reviews-synchronous-and.html"&gt;Edu Ferro's post on code reviews&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Quality
&lt;/h4&gt;

&lt;p&gt;Collaboration generates more ideas than working alone on a problem. The more ideas we have, the easier it is to find better solutions, resulting in better quality.&lt;/p&gt;

&lt;p&gt;Knowledge sharing also affects this quality. As the team grows due to this sharing, the overall quality of code increases.&lt;/p&gt;

&lt;h4&gt;
  
  
  Onboarding
&lt;/h4&gt;

&lt;p&gt;Since pair programming improves knowledge sharing and team relationships, it is really useful when onboarding new team members.&lt;/p&gt;

&lt;p&gt;New people will gain a much better understanding of the business domain, the code, and the entire organization with pair programming.&lt;/p&gt;

&lt;p&gt;In addition to this, software development is a team activity. A new team member changes the dynamics of the team, as people need some time to get to know each other. Pair programming accelerates this process as people are constantly collaborating.&lt;/p&gt;

&lt;h4&gt;
  
  
  Communication skills
&lt;/h4&gt;

&lt;p&gt;Communication is an undervalued and very important skill for software developers.&lt;/p&gt;

&lt;p&gt;Pair programming forces us to share and discuss our ideas with our colleagues, instead of implementing the first solution that comes to our minds. To convince people to implement our ideas, we must explain them clearly, so our communication skills improve.&lt;/p&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;According to the &lt;a href="https://www.devops-research.com/research.html"&gt;DORA Research&lt;/a&gt;, practices like &lt;a href="https://cloud.google.com/architecture/devops/devops-tech-continuous-delivery"&gt;continuous delivery&lt;/a&gt;, &lt;a href="https://cloud.google.com/architecture/devops/devops-process-working-in-small-batches"&gt;working on small batches&lt;/a&gt;, and having a &lt;a href="https://cloud.google.com/architecture/devops/devops-culture-learning-culture"&gt;learning culture&lt;/a&gt; are predictors of higher software delivery and organizational performance.&lt;/p&gt;

&lt;p&gt;With pair programming, we have seen that &lt;strong&gt;production feedback is faster, team relationships are stronger, and knowledge is spread easily within the organization&lt;/strong&gt;. Additionally, we will improve the code quality, make a better onboarding process, and improve our communication skills.&lt;/p&gt;

&lt;p&gt;Give it a try.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related content
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=SqI9jV7afpE"&gt;Lean Product Development: Resource management vs. Flow efficiency&lt;/a&gt; - Johanna Rothman&lt;br&gt;
&lt;a href="https://www.eferro.net/2021/09/code-reviews-synchronous-and.html"&gt;Code Reviews (Synchronous and Asynchronous)&lt;/a&gt; - Edu Ferro&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=CostXs2p6r0"&gt;The resource utilization trap.&lt;/a&gt; - Henrik Kniberg&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=aItVJprLYkg"&gt;You must be crazy to do pair programming&lt;/a&gt; - Dave Farley&lt;br&gt;
&lt;a href="https://tuple.app/pair-programming-guide/styles"&gt;Pair Programming Styles&lt;/a&gt; - Tuple's Blog&lt;/p&gt;

</description>
      <category>xp</category>
      <category>devops</category>
      <category>agile</category>
      <category>extremeprogramming</category>
    </item>
    <item>
      <title>Using the DevOps second way to improve the product development process</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Tue, 18 Jan 2022 19:43:27 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/using-the-devops-second-way-to-improve-the-product-development-process-4k25</link>
      <guid>https://dev.to/fran_ortiz/using-the-devops-second-way-to-improve-the-product-development-process-4k25</guid>
      <description>&lt;p&gt;All the DevOps principles and practices can be derived from the &lt;a href="https://itrevolution.com/the-three-ways-principles-underpinning-devops/"&gt;“Three Ways of DevOps”&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The first way&lt;/strong&gt;: Flow/Systems Thinking&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The second way&lt;/strong&gt;: Amplify Feedback Loops&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The third way&lt;/strong&gt;: Culture of Continual Experimentation and Learning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These practices are well covered in both “&lt;a href="https://itrevolution.com/book/the-devops-handbook"&gt;The DevOps Handbook&lt;/a&gt;” and the “&lt;a href="https://itrevolution.com/book/the-phoenix-project/"&gt;Phoenix Project&lt;/a&gt;” books. In this post, we will look more closely at a concept mentioned in “the second way”: &lt;strong&gt;feedback loops&lt;/strong&gt;. From the &lt;a href="https://itrevolution.com/the-three-ways-principles-underpinning-devops/"&gt;“Three Ways of DevOps”&lt;/a&gt;: &lt;em&gt;“The second way is about creating the right to left feedback loops. The goal of almost any process improvement initiative is to shorten and amplify feedback loops so necessary corrections can be continually made”&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  What are feedback loops?
&lt;/h4&gt;

&lt;p&gt;In simple terms, a feedback loop is a process where the outputs of a system are used as inputs again.&lt;/p&gt;

&lt;p&gt;Feedback loops are always running in the background of our lives. The human body is dominated by a variety of feedback loops: there are processes that ensure a proper balance of everything, from the amount of water in our cells to the number of hormones that we release. They are not only present in human biology, but also in the center of human behavior, where the outputs of many processes influence many of our decisions.&lt;/p&gt;

&lt;p&gt;Of course, feedback loops are also present in product development. Through this post, we will explore how we can shorten and amplify these feedback loops and use them to improve our product development process. First, we will see the two types of feedback loops.&lt;/p&gt;

&lt;h4&gt;
  
  
  The two types of feedback loops
&lt;/h4&gt;

&lt;p&gt;As we said, a feedback loop occurs when a change in something ultimately comes back to cause a further change in the same thing. Depending on this further change’ direction, there are two different types of feedback loop.&lt;/p&gt;

&lt;h5&gt;
  
  
  Reinforcing feedback loop
&lt;/h5&gt;

&lt;p&gt;Further change is in the same direction. By increasing the value of a variable in the first entity, the value of the second entity increases, which causes the value of the first entity to increase even more. We can see it as a loop of accelerating change.&lt;/p&gt;

&lt;p&gt;Compound interest is a classical example of a reinforcing feedback loop: imagine that you start with 100€ and get paid 10 percent interest each year. After one year, you’ll have 110€. The next time around, you get paid 10 percent interest on 110€, so you will have 121€. The loop will go on and on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---Ah7rlzs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/32uf0g1eyj22l7rupkhm.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---Ah7rlzs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/32uf0g1eyj22l7rupkhm.jpg" alt="Reinforcing Feedback Loop" width="500" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reinforcing feedback loops can be great for building good habits or achieving peak performance in something. Of course, they can amplify the impact of bad behaviors as well.&lt;/p&gt;

&lt;h5&gt;
  
  
  Balancing feedback loop
&lt;/h5&gt;

&lt;p&gt;Further change is in the opposite direction. In this case, an increase in value in the first entity causes a decrease in the second entity, which in turn leads back to a decrease in the first entity. A loop of this type causes the system to stabilize at a point where there can be no more change.&lt;/p&gt;

&lt;p&gt;An example of a balancing feedback loop is a thermostat. Suppose we set a target temperature of 23 degrees. The lower the current temperature the greater the temperature gap. The greater the gap the more heat that flows into the system. That increases the temperature, which leads to a smaller temperature gap. It keeps going down until the gap is zero, where the system has reached the target.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---HZytRpn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bziwpk4iet95tzmwoii.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---HZytRpn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7bziwpk4iet95tzmwoii.jpg" alt="Balancing Feedback Loop" width="500" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Balancing feedback loops can be very effective at moderating bad habits.&lt;/p&gt;

&lt;h4&gt;
  
  
  Feedback loops in product development
&lt;/h4&gt;

&lt;p&gt;During the product development process, we turn ideas into products, measure how customers respond, and adapt our product based on that feedback. Here we have the most obvious feedback loop in product development: the process of collecting customer feedback continuously and improving our product based on these insights.&lt;/p&gt;

&lt;p&gt;But there are many other opportunities to get feedback before we put our software in front of customers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testing&lt;/strong&gt;: each time we execute a test, we receive feedback about the test result.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merge&lt;/strong&gt;: when we merge our code with the main branch, we receive feedback about possible conflicts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code review&lt;/strong&gt;: when more people see one piece of code, there is feedback about possible improvements.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deploy&lt;/strong&gt;: every time we deploy new code to production, we receive feedback about how it performs. Examples: how the system works with that new feature, possible incompatibilities with other features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System monitoring&lt;/strong&gt;: we continuously have feedback about the system’s health (dashboards, alerts, etc.).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Release&lt;/strong&gt;: every time we release a new feature, we receive feedback about how it is used by customers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product instrumentation&lt;/strong&gt;: we receive continuous feedback about the actions that customers are doing in our product through product instrumentation tools.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HFje57st--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3x171x446wdesw3kuvoq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HFje57st--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3x171x446wdesw3kuvoq.jpg" alt="Feedback Loops in Product Development" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we go through all these steps, from the moment we write the first line of code to the moment we know whether a feature is being used, the results we receive shape our next decisions, &lt;strong&gt;creating a feedback loop&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Shortening our feedback loops
&lt;/h4&gt;

&lt;p&gt;Each action has a delay between doing it and receiving feedback. The longer this delay, the slower we can react. Additionally, long delays in receiving feedback lead to other problems such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A lot of wasted time on bad assumptions.&lt;/li&gt;
&lt;li&gt;We make a lot of wrong decisions because of the impossibility of seeing the effects of our actions. Think about that shower faucet with a long delay: you always end up frozen or burned :)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some examples of this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Working in a separate branch for a long time&lt;/strong&gt;: we may then discover that the main branch has changed and it is not compatible with our code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A single developer works alone for a long time and the code is not compatible with the team practices&lt;/strong&gt;: once the problem is found in a code review, all the code has to be rewritten.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;We don’t talk with customers before implementing a feature&lt;/strong&gt;: we work for a long time on implementing it. Then, the feature is not used by any customer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To avoid these problems, &lt;strong&gt;we need to adapt our processes in order to have feedback loops as fast as possible&lt;/strong&gt;. Remember, from &lt;a href="https://itrevolution.com/the-three-ways-principles-underpinning-devops/"&gt;“Three Ways of DevOps”&lt;/a&gt;: &lt;em&gt;“The goal of almost any process improvement initiative is to shorten and amplify feedback loops so necessary corrections can be continually made”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let’s look at some practices that lead to shorter feedback loops.&lt;/p&gt;

&lt;h5&gt;
  
  
  Unit testing
&lt;/h5&gt;

&lt;p&gt;Unit testing is the first feedback loop that should be established on any project. Rather than running the whole application, you’re running smaller parts of code (test suites) designed to be fast. With unit testing, you can have feedback about your work in seconds.&lt;/p&gt;

&lt;p&gt;Next, you can shorten and increase the number of feedback loops even more by practicing &lt;strong&gt;test-driven development (TDD)&lt;/strong&gt;. One of the biggest benefits of TDD is that you run your code often. As you write the test first, you’ll automatically have rapid feedback every time you save a new change. For me, this fast feedback is one of the main reasons to practice TDD.&lt;/p&gt;

&lt;h5&gt;
  
  
  Pair/Mob Programming
&lt;/h5&gt;

&lt;p&gt;Apart from the advantage of improving your knowledge by continuously explaining problems or solutions to someone else, pair/mob programming is a powerful loop technique that provides peer feedback in seconds. By having people work together, the feedback they give each other is immediate and easily applied.&lt;/p&gt;

&lt;p&gt;As an alternative to pair/mob programming, you can conduct synchronous code reviews. You’ll lose other benefits of group programming, but we will avoid long feedback cycles.&lt;/p&gt;

&lt;h5&gt;
  
  
  Trunk based development
&lt;/h5&gt;

&lt;p&gt;With &lt;a href="https://trunkbaseddevelopment.com/"&gt;trunk-based development&lt;/a&gt;, we have continuous feedback about the compatibility of the newly developed code with the main branch. We are committing new changes to the main branch continuously so we avoid long feedback loops and painful merges.&lt;/p&gt;

&lt;p&gt;Trunk-based development is a key enabler of the next practice, continuous delivery.&lt;/p&gt;

&lt;h5&gt;
  
  
  Continuous Delivery
&lt;/h5&gt;

&lt;p&gt;&lt;a href="https://continuousdelivery.com/"&gt;Continuous Delivery&lt;/a&gt; is the ability to get changes of all types—including new features, configuration changes, bug fixes, and experiments—into production, or into the hands of users, &lt;em&gt;safely&lt;/em&gt; and &lt;em&gt;quickly&lt;/em&gt; in a &lt;em&gt;sustainable&lt;/em&gt; way.&lt;/p&gt;

&lt;p&gt;Decoupling our deployments from our releases means that we can deploy more often, so we will have more feedback. &lt;a href="https://martinfowler.com/articles/feature-toggles.html"&gt;Feature toggles&lt;/a&gt; are a great tool to do this.&lt;/p&gt;

&lt;h5&gt;
  
  
  Work in small batches
&lt;/h5&gt;

&lt;p&gt;Work in small increments. Then deploy those small increments to production. Remember, the more time we spend working on an idea without getting feedback, the more probability we have of working on bad assumptions.&lt;/p&gt;

&lt;h4&gt;
  
  
  Amplifying our feedback loops: look for virtuous cycles
&lt;/h4&gt;

&lt;p&gt;When we talk about amplifying feedback loops, we are looking for loops where each iteration of the cycle reinforces the previous one: reinforcing feedback loops.&lt;/p&gt;

&lt;p&gt;When we get reinforcing feedback loops in a positive way we get a **virtuous cycle. **We can see an example with the level of automated testing on our product and the team's confidence.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BeIP3bs_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v0flk28e49xse6awtz4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BeIP3bs_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5v0flk28e49xse6awtz4.jpg" alt="Virtuous Cycle" width="500" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As our product is more tested, the team will have a greater level of confidence when doing new features. Each iteration of the loop reinforces the previous one, and the levels of confidence and testing are rising continuously. This is why we want to amplify feedback loops.&lt;/p&gt;

&lt;p&gt;However, we have to be careful, as the same positive feedback loop can also run in reverse order, creating a &lt;strong&gt;vicious cycle.&lt;/strong&gt; Here, a bad situation feeds on itself to make it even worse. We can see an example below, with the technical debt and the code quality:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5D-6k87w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2phs5p0nf8kyfjadvr7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5D-6k87w--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g2phs5p0nf8kyfjadvr7.jpg" alt="Vicious Cycle" width="500" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The more technical debt in our project, the more quick and dirty code we will produce. This feedback loop will be continuously running unless we stop it.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusions
&lt;/h4&gt;

&lt;p&gt;Feedback loops can be a powerful tool in our product development process. The more positive feedback loops we have, the greater control of our system and better customer satisfaction, some goals that we all want to achieve.&lt;/p&gt;

&lt;p&gt;However, we have also seen that there are negative feedback loops that can produce some vicious cycles if we don’t identify and stop them.&lt;/p&gt;

&lt;p&gt;The intent of this article was to assist with creating and identifying feedback loops in the product development process so we can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Amplify our current positive feedback loops, reaching virtuous cycles.&lt;/li&gt;
&lt;li&gt;Stop our current negative feedback loops, removing the vicious cycles.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This way, we can move from letting feedback loops shape our decisions in an invisible way to designing the feedback loops we want and need. &lt;strong&gt;Rather than being victims of feedback loops suffering vicious cycles, we should be architects of them and benefit from virtuous cycles.&lt;/strong&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Related content
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;The DevOps Handbook (book): &lt;a href="https://itrevolution.com/book/the-devops-handbook/?_ga=2.102924932.520566917.1641551391-1413882804.1637091596"&gt;https://itrevolution.com/book/the-devops-handbook&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Small batches for the win (blog from @eferro): &lt;a href="https://www.eferro.net/2021/01/small-batches-for-win-continuous.html"&gt;https://www.eferro.net/2021/01/small-batches-for-win-continuous.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Many Much More Smaller Steps (post from GeePaw Hill): &lt;a href="https://www.geepawhill.org/series/many-much-more-smaller-steps/"&gt;https://www.geepawhill.org/series/many-much-more-smaller-steps/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Introducing Extreme Programming: &lt;a href="http://www.extremeprogramming.org/introduction.html"&gt;http://www.extremeprogramming.org/introduction.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The Virtuous Cycle of Velocity: What I learned about going fast at eBay and Google (talk from Randy Shoup): &lt;a href="https://www.youtube.com/watch?v=EwLBoRyXTOI"&gt;https://www.youtube.com/watch?v=EwLBoRyXTOI&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code reviews, synchronous and asynchronous (post from @eferro): &lt;a href="https://www.eferro.net/2021/09/code-reviews-synchronous-and.html"&gt;https://www.eferro.net/2021/09/code-reviews-synchronous-and.html&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Equipos de algo rendimiento, qué son y cómo identificarlos: &lt;a href="https://www.youtube.com/watch?v=Eqwy6w2RYUk"&gt;https://www.youtube.com/watch?v=Eqwy6w2RYUk&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>From Software Engineer to Product Engineer</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Tue, 21 Dec 2021 18:43:14 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/from-software-engineer-to-product-engineer-8p1</link>
      <guid>https://dev.to/fran_ortiz/from-software-engineer-to-product-engineer-8p1</guid>
      <description>&lt;p&gt;The product development process consists of two different activities: decide what to do and decide how to do it. The part related to "the what" is called product discovery and the one related to "the how" is the product delivery.&lt;/p&gt;

&lt;p&gt;Traditionally, software engineers have not participated in the product discovery part. The business team makes decisions, product owners convert those decisions into requirements for the software engineers and they implement the given solutions, called user stories.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mwZzs064--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vz7le0mv9pugaaf6oiu9.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mwZzs064--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vz7le0mv9pugaaf6oiu9.jpg" alt="Separate Product-Development teams" width="600" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is what Marty Cagan defines as a &lt;a href="https://svpg.com/product-vs-feature-teams/"&gt;feature team&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The success of these teams is measured by the number of user stories they complete within a given period of time.&lt;/p&gt;

&lt;p&gt;But this is not the best approach to do product development. The purpose of a product team should not be just to deliver new features given by business requirements. &lt;strong&gt;The value of a product is not just in the number of features (the output), but in solving the right problems for the customer (the outcomes)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://itrevolution.com/accelerate-book/"&gt;Accelerate&lt;/a&gt;, we can see the following capabilities as higher organizational performance predictors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Whether teams have a good understanding of the flow of work from the business all the way through to customers, and whether they have visibility into this flow, including the status of products and features.&lt;/li&gt;
&lt;li&gt;Whether development teams have the authority to create and change specifications as part of the development process without requiring approval.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As a result of this paradigm shift, a new role is emerging within software engineers: the product engineer.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is a product engineer?
&lt;/h3&gt;

&lt;p&gt;Product engineers are software developers with a lot of interest in the product that they are working on. Apart from implementing solutions, they want to understand why problems deserve to be solved, how people use the product, and participate in the decision-making.&lt;/p&gt;

&lt;p&gt;From my point of view, these are the main capabilities of a product engineer:&lt;/p&gt;

&lt;h4&gt;
  
  
  They understand the product
&lt;/h4&gt;

&lt;p&gt;Product engineers want to understand the "why?" behind all things. They want to know how and why the product is successful.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How is the company making money?&lt;/li&gt;
&lt;li&gt;What problem does the product solve?&lt;/li&gt;
&lt;li&gt;Who are the users? How much do they pay?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more engineers know about this, the better decisions they will make for the company.&lt;/p&gt;

&lt;h4&gt;
  
  
  They have product ownership
&lt;/h4&gt;

&lt;p&gt;In the same way that they have ownership of the code that they ship, product engineers have product ownership. As we said before, product engineers participate in the whole value chain, from the decision-making to validating business metrics after the release.&lt;/p&gt;

&lt;p&gt;They do not consider the work as done when a feature is released, that’s the moment when they actively start to follow up if the feature is meeting the expectations. If that is not the case, they attempt to figure out what went wrong and iterate on another solution.&lt;/p&gt;

&lt;h4&gt;
  
  
  They work as a team
&lt;/h4&gt;

&lt;p&gt;Product engineers see product development as a team activity, where each team member provides a unique skill set and expertise to the team. They have good communication skills, having a strong relationship with the product manager, who is also part of the team.&lt;br&gt;
Rather than having two separate teams (product and engineering) in charge of the discovery and delivery parts respectively, they work as a single product team, trying to resolve the customer problems together.&lt;/p&gt;

&lt;h4&gt;
  
  
  They offer new ideas and tradeoffs
&lt;/h4&gt;

&lt;p&gt;As they understand how the product and the business work, they are able to bring new ideas and tradeoffs to the table. Some examples:&lt;/p&gt;

&lt;p&gt;"We think we can improve the speed of our site in an X% using the technology Y. This would improve the metric Z in an N%".&lt;/p&gt;

&lt;p&gt;"We could also test this other solution to solve problem X, the product impact would be similar and the engineering effort is extremely smaller".&lt;/p&gt;

&lt;h4&gt;
  
  
  They have empathy with users
&lt;/h4&gt;

&lt;p&gt;They care about the experience the users are having with the product, making sure they are getting the expected benefit from it. They have access to all available business and user metrics and they are curious about this.&lt;/p&gt;

&lt;h4&gt;
  
  
  Technology is a means, not an end
&lt;/h4&gt;

&lt;p&gt;They are software developers, but they don’t see the software as an end. They are focused on providing the best possible experience to the product users and software is useful in achieving that goal.&lt;/p&gt;

&lt;p&gt;They don’t choose technology because it’s cool, they make those decisions based on the problem that they are trying to resolve.&lt;/p&gt;

&lt;h4&gt;
  
  
  They are proud of what they do
&lt;/h4&gt;

&lt;p&gt;Product engineers are aware of how their work affects users. They are proud of the product they build and how it impacts their customers' lives.&lt;/p&gt;

&lt;h4&gt;
  
  
  They are ordinary but empowered people
&lt;/h4&gt;

&lt;p&gt;We are enumerating many different capabilities of product engineers, but they do not have to be extraordinary as individuals. Instead, they are ordinary but empowered people.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They are empowered with all the necessary business context to do their job. The company needs to provide it. Otherwise, it’s difficult for these people to do their job.&lt;/li&gt;
&lt;li&gt;They are empowered because they work as a team: there are many different skills and experiences in a product team. As a result, all the team is empowered with all these skills to resolve the business problems.&lt;/li&gt;
&lt;li&gt;They are empowered with trust: because of this teamwork, people establish a huge level of trust in their teammates. This is really important to do their work properly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Summary
&lt;/h3&gt;

&lt;p&gt;Product engineers are a key ingredient to building a successful product. We have enumerated some capabilities that these people share:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;They understand the product.&lt;/li&gt;
&lt;li&gt;They have product ownership.&lt;/li&gt;
&lt;li&gt;They work as a team.&lt;/li&gt;
&lt;li&gt;They offer new ideas and tradeoffs.&lt;/li&gt;
&lt;li&gt;They have empathy with users.&lt;/li&gt;
&lt;li&gt;Technology is a means, not an end.&lt;/li&gt;
&lt;li&gt;They are proud of what they do.&lt;/li&gt;
&lt;li&gt;They are ordinary but empowered people.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We have also found that these people cannot excel without the proper company context, since they must understand the business that they are working on. Even though this isn't the most common scenario in software companies, I think that product teams are on the rise within our industry.&lt;/p&gt;

&lt;p&gt;If you work for a product company: Do you consider yourself a product engineer? Do you have the proper environment to do your job? It would be a pleasure if you &lt;a href="//mailto:fortizabril@gmail.com"&gt;contact me&lt;/a&gt; and share your experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Related Content
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Empowered Product teams: &lt;a href="https://svpg.com/empowered-product-teams/"&gt;https://svpg.com/empowered-product-teams/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Comunicación efectiva con ingenieros de software (Spanish): &lt;a href="https://www.estrategiadeproducto.com/p/comunicacion-ingenieros-software"&gt;https://www.estrategiadeproducto.com/p/comunicacion-ingenieros-software&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Equipos de alto rendimiento: qué son y cómo identificarlos (Spanish) &lt;a href="https://www.youtube.com/watch?v=Eqwy6w2RYUk"&gt;https://www.youtube.com/watch?v=Eqwy6w2RYUk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Accelerate: &lt;a href="https://itrevolution.com/accelerate-book/"&gt;https://itrevolution.com/accelerate-book/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>motivation</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Cross-Team Communication: Avoid Dependencies</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Wed, 01 Dec 2021 19:13:07 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/cross-team-communication-avoid-dependencies-4jhc</link>
      <guid>https://dev.to/fran_ortiz/cross-team-communication-avoid-dependencies-4jhc</guid>
      <description>&lt;p&gt;The &lt;a href="https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/"&gt;delivery lead time&lt;/a&gt; is the time it takes to go from a customer making a request to the request being satisfied. So, improving this time should be a goal for every organization. A major decelerator for this delivery flow is that the different teams in an organization have been traditionally working in silos, with a ticketing system as the unique communication channel. This is tragic when you have some team dependencies, which is something that usually happens.&lt;/p&gt;

&lt;p&gt;To tackle this problem, a simple solution emerges in most cases: Increase the communication between the different teams.&lt;/p&gt;

&lt;p&gt;But, is this solution enough? How does the "increase communication solution" scale when the company grows? We will explain some of those things in this article but, as a spoiler: &lt;strong&gt;having proper team interactions is a complex problem, and complex problems rarely have simple solutions&lt;/strong&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  How cross-team communication scales
&lt;/h4&gt;

&lt;p&gt;Having good cross-team communication and good collaboration is necessary. Also, when starting a product, the most effective way to work is having strong horizontal communication between individual team members, asking each other for help any time they need it. There are no blocks, features don’t have idle time so the lead time does not suffer.&lt;/p&gt;

&lt;p&gt;However, this type of communication doesn’t scale well. When we have team dependencies that require continuous communication between the different team members, the delivery lead time for any feature can be affected as the number of members in the organization increase. Let's see with a figure from the &lt;a href="https://www.leadingagile.com/2018/02/lines-of-communication-team-size-applying-brooks-law/"&gt;Brooks Law&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SuBDWxpt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b3rgje9nz49z2yfz6hwz.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SuBDWxpt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b3rgje9nz49z2yfz6hwz.jpeg" alt="Brooks Law" width="600" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we can see, as the number of team members increases, the possible communication lines' growth rate is very high. If this communication is necessary because the teams are waiting for external dependencies many features will sit idle, teams will have context switching until they get the responses they are waiting for, etc.&lt;/p&gt;

&lt;p&gt;So... what should we do?&lt;/p&gt;

&lt;h4&gt;
  
  
  Define your team interaction modes to remove dependencies
&lt;/h4&gt;

&lt;p&gt;As we said, good communication is necessary and good. But the problem here is not the communication quantity, but the quality. We need to define the team interactions in a way that removes team dependencies as much as possible, removing the communication at all where it should not be necessary. From &lt;a href="https://itrevolution.com/accelerate-book/"&gt;Accelerate&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"In teams which score highly on architectural capabilities [which directly lead to higher performance], little communication is required between delivery teams to get their work done, and the architecture of the system is designed to enable teams to test, deploy, and change their systems without dependencies on other teams."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://teamtopologies.com/"&gt;Team Topologies&lt;/a&gt; book approaches this communication problem, defining four fundamental team topologies and three team interaction modes:&lt;/p&gt;

&lt;p&gt;The team topologies are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stream aligned team&lt;/strong&gt;: aligned to a flow of work from (usually) a segment of the business domain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enabling team&lt;/strong&gt;: helps a Stream-aligned team to overcome obstacles. Also detects missing capabilities.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complicated Subsystem team&lt;/strong&gt;: where significant mathematics/calculation/technical expertise is needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform team&lt;/strong&gt;: a grouping of other team types that provide a compelling internal product to accelerate delivery by Stream-aligned teams.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;About the interactions, they present the three interaction modes below:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Collaboration&lt;/strong&gt;: teams work together for a defined period of time to discover something.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;X-as-a-Service&lt;/strong&gt;: one team provides and one team consumes something "as a service".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Facilitation&lt;/strong&gt;: one team helps and mentors another team.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Depending on the team topologies, they propose to try an interaction mode or other.&lt;/p&gt;

&lt;p&gt;When you want to apply these concepts, there are no right or wrong answers without knowing the specific team context. But checking your current team interactions and evaluating them is a good starting point. Some examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In my current company, &lt;a href="https://audiense.com/"&gt;Audiense&lt;/a&gt;, the &lt;strong&gt;stream-aligned&lt;/strong&gt; teams needed a "&lt;strong&gt;collaboration&lt;/strong&gt; interaction" with the systems team each time they wanted to create some infrastructure components, such as a new queue, event topic, etc. The stream-aligned teams didn’t have this infrastructure creation part within their development process, so that collaboration was always at the end of the feature development, leading to some blocks.
Since some months ago, the &lt;strong&gt;Platform team&lt;/strong&gt; has created a service where the different stream-aligned teams are able to create that infrastructure components writing some code, and the components are automatically created in the CI process. That interaction is &lt;strong&gt;X-as-a-Service now&lt;/strong&gt;, and we have removed that dependency. We now have other parts where we are doing the same, but that dependency was causing many blocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For similar cases: does it make sense to have a collaboration interaction mode for a long time in parts where you can afford an X-as-a-Service one?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you usually need to wait for some people to make some decisions: does it make sense? Can you remove that dependency by having a &lt;strong&gt;facilitation&lt;/strong&gt; interaction mode during a specific time?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are the type of questions you should ask yourself.&lt;/p&gt;

&lt;p&gt;As always, &lt;strong&gt;approach the problem as a continuous process, taking small steps&lt;/strong&gt; to improve your current situation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate your current team dependencies and their interaction modes.&lt;/li&gt;
&lt;li&gt;Take the blocking dependencies first so features don't sit idle any more, these dependencies are your current bottleneck.&lt;/li&gt;
&lt;li&gt;Update that interaction mode and remove that dependency.&lt;/li&gt;
&lt;li&gt;Find the next bottleneck.&lt;/li&gt;
&lt;li&gt;Start again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Do you have any experiences applying these interaction modes between your teams?&lt;/strong&gt; Please, &lt;a href="//mailto:fortizabril@gmail.com"&gt;contact me&lt;/a&gt; and share it!&lt;/p&gt;

&lt;h5&gt;
  
  
  References
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Software delivery performance. Four key metrics &lt;a href="https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/"&gt;https://itrevolution.com/measure-software-delivery-performance-four-key-metrics/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Brooks Law: &lt;a href="https://www.leadingagile.com/2018/02/lines-of-communication-team-size-applying-brooks-law/"&gt;https://www.leadingagile.com/2018/02/lines-of-communication-team-size-applying-brooks-law/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Accelerate: &lt;a href="https://itrevolution.com/accelerate-book/"&gt;https://itrevolution.com/accelerate-book/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Team topologies: &lt;a href="https://teamtopologies.com/"&gt;https://teamtopologies.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Why I hate the phrase “breaking silos”. Charity Majors. &lt;a href="https://charity.wtf/2021/08/27/why-i-hate-the-phrase-breaking-down-silos/"&gt;https://charity.wtf/2021/08/27/why-i-hate-the-phrase-breaking-down-silos/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>agile</category>
      <category>leadership</category>
    </item>
    <item>
      <title>How I created my blog with Gatsby, Netlify, and Plausible.</title>
      <dc:creator>Francisco Ortiz</dc:creator>
      <pubDate>Wed, 24 Nov 2021 19:19:37 +0000</pubDate>
      <link>https://dev.to/fran_ortiz/how-i-created-my-blog-with-gatsby-netlify-and-plausible-29bf</link>
      <guid>https://dev.to/fran_ortiz/how-i-created-my-blog-with-gatsby-netlify-and-plausible-29bf</guid>
      <description>&lt;p&gt;This post was originally posted &lt;a href="https://productdeveloper.net/how-i-created-my-blog"&gt;on my blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you want to remember something, write it down.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I’m starting a blog. After some time of doubts (pondering about if it’s worth it, thinking that people have already covered all the topics I will want to write about) I decided to give it a try. It was because of three principal reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get deeper into some topics I like: &lt;strong&gt;I think writing things down leads to better learning&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Help other people.&lt;/li&gt;
&lt;li&gt;Improve my communication skills.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That said, I will use the first post to explain how I created the blog.&lt;/p&gt;

&lt;h4&gt;
  
  
  The first decision: where I should publish my content?
&lt;/h4&gt;

&lt;p&gt;I was not sure about owning a domain name or publishing content on sites like &lt;a href="https://medium.com/"&gt;Medium&lt;/a&gt;, &lt;a href="https://dev.to/"&gt;Dev.to&lt;/a&gt; or &lt;a href="https://hashnode.com/"&gt;Hashnode&lt;/a&gt;. After some research, I decided to publish on my own domain. It brings some benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The first one is simple, &lt;strong&gt;I own it&lt;/strong&gt;: I can choose and customize whatever I want.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I remove a dependency with a third-party platform.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;I can still publish the same content on other platforms and redirect people to my personal blog. We have to take care of not hurting the SEO because of the duplicated content here, but we can solve it with &lt;a href="https://developers.google.com/search/docs/advanced/crawling/consolidate-duplicate-urls"&gt;canonical URLs&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After making that decision, I will explain why I chose the tools below to create the blog.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.gatsbyjs.com/"&gt;Gatsby&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.netlify.com/"&gt;Netlify&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://plausible.io/"&gt;Plausible&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Gatsby
&lt;/h4&gt;

&lt;p&gt;Gatsby is an open-source framework based on React that helps developers to build websites.&lt;/p&gt;

&lt;p&gt;I’m not experienced in Gatsby at all, making this blog was my first experience with this framework. After being checked some other tools like &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt; that also met my requirements, I decided to give Gatsby a try, as I'm more familiar with its ecosystem.&lt;/p&gt;

&lt;p&gt;You can start from scratch, but if you also don't have previous experience with Gatsby, I would recommend checking the available Gatsby starters: &lt;a href="https://www.gatsbyjs.com/starters/"&gt;https://www.gatsbyjs.com/starters/&lt;/a&gt;. Once there, there are many options that you can pick.&lt;/p&gt;

&lt;p&gt;In my case, I initialized the project with the &lt;a href="https://www.gatsbyjs.com/plugins/@lekoarts/gatsby-theme-minimal-blog/"&gt;gatsby-theme-minimal-blog&lt;/a&gt; starter.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gatsby new minimal-blog LekoArts/gatsby-starter-minimal-blog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, you can run the application and start modifying it with the commands below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;minimal-blog
gatsby develop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You will have your site accessible at &lt;a href="http://localhost:8000"&gt;http://localhost:8000&lt;/a&gt;.&lt;/p&gt;

&lt;h5&gt;
  
  
  Customization
&lt;/h5&gt;

&lt;p&gt;Once you have started a new application, you can easily customize the page as you want if you have some concepts about web development, as it uses React, HTML and CSS.&lt;/p&gt;

&lt;p&gt;If you are using a Gatsby theme, they have the concept of &lt;a href="https://www.gatsbyjs.com/docs/how-to/plugins-and-themes/shadowing/"&gt;shadowing&lt;/a&gt;, which makes the customization really easy. This feature allows replacing any file in the theme &lt;code&gt;src&lt;/code&gt; directory with your own implementation. As an example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Imagine you are using a theme called &lt;code&gt;some-theme&lt;/code&gt; and it has a file called &lt;code&gt;some-theme/src/components/post.tsx&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you want to replace that component with your own implementation, you just need to create a new file in &lt;code&gt;your-blog-directory/src/some-theme/components/post.tsx&lt;/code&gt;. From that moment, your own implementation will be rendered instead of the default one.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  SEO friendly
&lt;/h5&gt;

&lt;p&gt;SEO is really important if you want people to find your website. Apart from making your site fast for search engine crawlers, Gatsby has some useful plugins to improve your implementation from the SEO point of view. Some of the plugins that I'm currently using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.gatsbyjs.com/plugins/gatsby-plugin-sitemap/"&gt;gatsby-plugin-sitemap&lt;/a&gt;: it automatically creates a sitemap for your site every time you launch a new build.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/nfl/react-helmet"&gt;React Helmet package&lt;/a&gt;: it adds metadata into the web page, which is very important for SEO.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Netlify
&lt;/h4&gt;

&lt;p&gt;Once we have the content for our blog, we need to host it somewhere. I had experience with &lt;a href="https://pages.github.com/"&gt;Github pages&lt;/a&gt; for hosting some pages before, but I decided to try Netlify and I finally chose it. It provides some advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Continuous deployment&lt;/strong&gt;: After adding some build settings in just a few clicks, Netlify deploys a new version of the blog every time I push a new change to the repository main branch. Also, it provides other features like deploy previews, rollbacks, or &lt;a href="https://docs.netlify.com/site-deploys/split-testing/"&gt;split testing&lt;/a&gt;. I'm not currently using all of these features but they can be really useful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Domain configuration&lt;/strong&gt;: it provides a really easy configuration for a custom domain name. Also, you will have an SSL certificate for free.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Although Netlify is a paid tool, all these features are included in the free plan, which is the one I’m currently using.&lt;/p&gt;

&lt;h4&gt;
  
  
  Plausible
&lt;/h4&gt;

&lt;p&gt;I want to have some available analytics from the first moment. After trying Google Analytics, I think it’s a bit overkill for my use case.&lt;br&gt;
As there are many data I don’t understand, I have a continuous feeling of not taking all the value that it provides.&lt;/p&gt;

&lt;p&gt;After some research, I found &lt;a href="https://plausible.io/"&gt;Plausible&lt;/a&gt;. It provides simple analytics with some easy-to-understand dashboards. Also, at least from my point of view, it has some important advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It is an open-source tool, with an &lt;a href="https://github.com/plausible/analytics/projects/1"&gt;&lt;strong&gt;open product roadmap&lt;/strong&gt;&lt;/a&gt; driven by its community.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Because of providing only some simple analytics, it has a very small script so it does not affect the web speed so much.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adblockers does not affect Plausible: it does not track any personal data or use cookies so Adblockers usually do not block pages with the Plausible script.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can find a Plausible demo &lt;a href="https://plausible.io/plausible.io"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, being a software developer, I had a very good experience with these three tools so I recommend any of them if you are&lt;br&gt;
in the situation of starting a website.&lt;/p&gt;

&lt;p&gt;What do you think of this blog stack?&lt;/p&gt;

&lt;p&gt;If you think it can be interesting for some other people, feel free to share it with anyone you want.&lt;/p&gt;

</description>
      <category>gatsby</category>
      <category>netlify</category>
      <category>typescript</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
