<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>Chemaclass - pair-programming</title><subtitle>Tech Lead sharing practical insights on software craftsmanship, TDD, leadership, Bitcoin, and AI. Blog posts, book summaries, and conference talks.</subtitle><link rel="self" type="application/atom+xml" href="https://chemaclass.com/tags/pair-programming/atom.xml"/><link rel="alternate" type="text/html" href="https://chemaclass.com"/><generator uri="https://www.getzola.org/">Zola</generator><updated>2024-03-28T00:00:00+00:00</updated><id>https://chemaclass.com/tags/pair-programming/atom.xml</id><entry xml:lang="en"><title>Effective Pair Programming</title><subtitle>Embracing quality practices in your engineering culture</subtitle><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="clean-code" scheme="https://chemaclass.com/tags/clean-code/" label="Clean Code"/><published>2024-03-28T00:00:00+00:00</published><updated>2024-03-28T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/effective-pair-programming/"/><id>https://chemaclass.com/blog/effective-pair-programming/</id><summary type="html">A practical guide to pair programming that works: roles, rotation, when to pair, common pitfalls, and how to make sessions productive.</summary><content type="html">&lt;p>What is pair programming? Two people working together on the same problem, at the same time.&lt;/p>
&lt;span id="continue-reading">&lt;/span>
&lt;p>It is not about one person showing off their skills in front of another, nor one person afraid of making mistakes due to an impostor syndrome.&lt;/p>
&lt;p>Each person will have a role:&lt;/p>
&lt;ul>
&lt;li>Navigator: he will pay attention to the bigger picture; eg: architecture, relation between collaborators, object design, etc.&lt;/li>
&lt;li>Driver: she will pay attention to the small details; eg: naming, code conventions, writing syntax, object design, etc.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>The pair could, and should, switch roles occasionally; eg: every X commits pushed, every 10 mins, … up to them.&lt;/p>
&lt;/blockquote>
&lt;p>Pair programming should not be considered a practice only for “seniors” to juniors, but regardless of the team members’ experience level.&lt;/p>
&lt;p>It is about the &lt;strong>collaboration flow&lt;/strong>, the quality communication, the absence of feeling judged, and the idea of welcoming vulnerability with your peers, knowing they will support and help you.&lt;/p>
&lt;p>It is about constantly challenging each other, seeking the most pragmatic solution while keeping it simple. Always looking for &lt;strong>quick feedback&lt;/strong> when speaking to each other, but also on the solution you agreed to implement and its direction.&lt;/p>
&lt;p>It is about the short, quick, and immediate feedback loop while talking to your partner, who &lt;strong>reviews your code on the fly&lt;/strong>. You can guide as a navigator or help the driver validate their ideas in a broader picture.&lt;/p>
&lt;p>It is about the constant &lt;strong>sharing&lt;/strong> of &lt;strong>knowledge&lt;/strong> atmosphere by default, reducing bus-factors and silo-knowledge areas to the maximum. Increasing the focus by having two minds working on the same task simultaneously.&lt;/p>
&lt;p>It is about &lt;strong>team cohesion&lt;/strong> and sharpening the feeling that we belong. When we understand each other’s strengths and weaknesses, we will realize how much we can help each other grow.&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-03-28/footer.webp" alt="blog-img" />&lt;/p>
&lt;h2 id="how-can-you-practice-pair-programming">How can you practice pair programming?
&lt;a class="heading-anchor" href="#how-can-you-practice-pair-programming" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Pair programming can be done in different ways:&lt;/p>
&lt;ul>
&lt;li>You can start and finish a task with pairing. You can time-box it to 30, 60, 90 minutes. Either way, it is recommended to have pauses in the middle - Pomodoro.&lt;/li>
&lt;li>You can start the task together and stop when one of your peers feels confident enough to continue alone.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It is up to the team, and the task in context, to decide when and how to apply pairing to get the best out of it.&lt;/p>
&lt;/blockquote>
&lt;p>This does not mean you must constantly work “no matter what” in pair. This is not about creating rules; on the contrary, it is about embracing this practice to the point you feel confident to choose when and how to use it to get the best out of it.&lt;/p>
&lt;p>Pair programming might become one of the best tools in your team toolbox for daily interactions. Not because you read it somewhere but because of the benefits you and your team will find.&lt;/p>
&lt;h3 id="common-patterns">Common Patterns
&lt;a class="heading-anchor" href="#common-patterns" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;h4 id="different-strategies-for-effective-pairing">Different strategies for effective pairing
&lt;a class="heading-anchor" href="#different-strategies-for-effective-pairing" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>Driver-Navigator&lt;/strong>: One person is driving the code (with the keyboard), focusing on the detail aspect of the task itself. The other is a navigator (no keyboard), having a more abstract picture of the task in mind.&lt;/li>
&lt;li>&lt;strong>Ping-Pong&lt;/strong>: Frequent switching driver-navigator roles in small interactions, e.g., every N minutes, every N commits, etc.&lt;/li>
&lt;li>&lt;strong>Backseat driver&lt;/strong>: The navigator engages actively with the driver.&lt;/li>
&lt;li>&lt;strong>Tourist guide&lt;/strong>: The navigator passively learns with the driver.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2024-03-28/good-pair-prog.jpg" alt="effective pair programming patterns" />&lt;/p>
&lt;h4 id="anti-patterns-while-pairing">Anti-patterns while pairing
&lt;a class="heading-anchor" href="#anti-patterns-while-pairing" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>The silent partner&lt;/strong>: The navigator is not participating, and they are being silent.&lt;/li>
&lt;li>&lt;strong>The solo act&lt;/strong>: The driver ignores all inputs from the navigator.&lt;/li>
&lt;li>&lt;strong>Distracted pair&lt;/strong>: The pair does not focus on the problem to solve.&lt;/li>
&lt;li>&lt;strong>The Dictator&lt;/strong>: One person is telling what to do, ignoring the input from the other.&lt;/li>
&lt;li>&lt;strong>Philosophical pair&lt;/strong>: The pair is &lt;a href="/blog/bikeshedding/">bikeshedding&lt;/a> into irrelevant topics.&lt;/li>
&lt;li>&lt;strong>The code war&lt;/strong>: The pair does not reach an agreement and starts an unnecessary war, which wastes time and effort.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="/images/blog/2024-03-28/anti-pair-prog.jpg" alt="pair programming anti-patterns" />&lt;/p>
&lt;p>&lt;strong>Want more?&lt;/strong> Check this out: &lt;a rel="external" href="https://www.figma.com/file/FCmGwRPIO8cLowDRraJhgr/Learning-TDD">Learning Through KATAS&lt;/a>&lt;/p>
&lt;p>&lt;img src="/images/blog/2024-03-28/learning-through-katas.jpg" alt="learning through katas" />&lt;/p>
&lt;h2 id="the-takeaway">The takeaway
&lt;a class="heading-anchor" href="#the-takeaway" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Pairing is not a rule to enforce, it is a tool to reach for. Use it when the task is complex, the knowledge is siloed,
or the stakes are high. Skip it when the work is trivial. The goal is never “always pair”, it is &lt;strong>better software and a
stronger team&lt;/strong>. Pick one real task this week, pair on it, and switch roles often. The benefits show up faster than you
expect.&lt;/p>
&lt;aside class="kudos">
&lt;span class="kudos__icon" aria-hidden="true">🧠&lt;/span>
&lt;div class="kudos__content">
&lt;p>Thanks to my friend &lt;a rel="external" href="https://x.com/evrtrabajo">Manu&lt;/a>, who helped me with this post. We even share a &lt;a rel="external" href="https://phpconference.com/agile-culture/practical-tdd-workshop/">workshop&lt;/a> on this topic.&lt;/p>
&lt;/div>
&lt;/aside></content></entry><entry xml:lang="en"><title>Pull Requests vs Pair Programming</title><subtitle>Why choosing when you can have both?</subtitle><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><category term="code-review" scheme="https://chemaclass.com/tags/code-review/" label="Code Review"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2021-04-01T00:00:00+00:00</published><updated>2021-04-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/pull-request-vs-pair-prog/"/><id>https://chemaclass.com/blog/pull-request-vs-pair-prog/</id><summary type="html">Let's talk about the benefits of Pull Requests and Pair Programming, and my thoughts on these after some years of experience with them.</summary><content type="html">&lt;p>Let’s talk about the benefits of Pull Requests and Pair Programming, and my thoughts on these after some years of experience with them.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h2 id="pull-requests">Pull Requests
&lt;a class="heading-anchor" href="#pull-requests" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>A Pull Request (PR) is basically a way of showing your suggested code changes such that they are easily comparable with the existing source code. This is part of a workflow that helps developers to share knowledge about the changes that are being done within the system.&lt;/p>
&lt;blockquote>
&lt;p>A Pull Request is the moment where you ask your peers to review and check out your code changes.&lt;/p>
&lt;/blockquote>
&lt;p>Usually, it’s also used:&lt;/p>
&lt;ol>
&lt;li>For discussions about code style.&lt;/li>
&lt;li>To spot potential bugs.&lt;/li>
&lt;li>For architectural or design discussions once the solution is done.&lt;/li>
&lt;/ol>
&lt;h3 id="pull-requests-aren-t-the-best-tool-for-everything">Pull Requests aren’t the best tool for everything
&lt;a class="heading-anchor" href="#pull-requests-aren-t-the-best-tool-for-everything" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The main problem with these topics above is that PR’s are usually ready when the feature/bug is already being worked on and in the last stage of its development process.
It [a PR] is an “already changed proposal [I have already worked on this change, here’s the code] to be merged into the current system [someone please look it over]”.&lt;/p>
&lt;p>The concept of “Draft PR” exists to make explicit that a PR is not ready to be merged, so it’s still a “work in progress thing”, but that’s another topic.&lt;/p>
&lt;p>Pull Requests are, indeed, one of the best tools that we have in our industry to share knowledge about the changes that we are doing in the system, but sometimes they might be misused, as for example:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Discussions about code style&lt;/strong>. Code style shouldn’t be discussed in a PR. There should be already a CI running a code style checker, that’s all. If you want to talk about code style, request a change in your code style checker, but not in a random PR.&lt;/li>
&lt;li>&lt;strong>Spot bugs&lt;/strong>. Bugs and desired behavior should be covered by automated tests. The developer is the first responsible person for this topic.&lt;/li>
&lt;li>&lt;strong>Architectural or design discussions&lt;/strong>. Once a particular solution is developed and ready for review, it is usually really hard to “rollback” that idea and rewrite it again. Because “why would you do that? For some subjective opinion? It’s done already. And it seems to work just fine.”&lt;/li>
&lt;/ol>
&lt;p>Having an extra person looking at the changes that we have done for “designing decisions” might be beneficial, but we could have addressed “potential disagreements” in a sooner stage.&lt;/p>
&lt;h3 id="what-should-the-purpose-of-a-pull-request-be">What should the purpose of a Pull Request be?
&lt;a class="heading-anchor" href="#what-should-the-purpose-of-a-pull-request-be" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;ol>
&lt;li>Sharing knowledge about the proposed changes with the team.&lt;/li>
&lt;li>Ensuring the team aligns and agrees across the multiples changes that are getting submitted every day in order to keep a healthy direction for the project. Yes, this might include double-checking the outcome design, but… What if that is now too late? How could we solve all those issues?&lt;/li>
&lt;/ol>
&lt;h2 id="pair-programming">Pair Programming
&lt;a class="heading-anchor" href="#pair-programming" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The concept of “Pair Programming” can be understood from different points of view. Pair thinking and pair programming, driver-navigator roles concepts, or pure live coding from one side. Actually, this is way easier than it looks like at first instance:&lt;/p>
&lt;ul>
&lt;li>Either you watch and help the other person to write code,&lt;/li>
&lt;li>Or you type while getting another pair of eyes watching and helping you.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Pair Programming helps the team to work together.&lt;/p>
&lt;/blockquote>
&lt;p>Pair programming is the joy of working with an extra brain and another pair of eyes, where the key is to &lt;strong>build a context&lt;/strong> where you two &lt;strong>share the same goal&lt;/strong> in order to find the &lt;strong>best possible solution&lt;/strong>. All of this while learning from each other every single second.
Pair Programming is not about developing the best solution at the very beginning. It’s about making it work, sharing ideas, and finding a better solution together. After that, you can refactor and clean the code.&lt;/p>
&lt;h3 id="pair-programming-is-a-continuous-code-review">Pair Programming is a continuous code review
&lt;a class="heading-anchor" href="#pair-programming-is-a-continuous-code-review" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Pull Requests are an asynchronous way to share code changes, while Pair Programming is totally &lt;strong>synchronous&lt;/strong> because it happens at the same time.&lt;/p>
&lt;p>That said, Pull Requests and Pair Programming aren’t mutually exclusive, they can coexist. They are tools, and we should wisely choose them in order to achieve our objectives.&lt;/p>
&lt;p>The most common fear that I saw while encouraging to do Pair Programming is that some people are shy and they don’t like to have other eyes around them while they are coding because of:&lt;/p>
&lt;ul>
&lt;li>Fear that they don’t know what to code or where to start.&lt;/li>
&lt;li>Fear that others will laugh at their solutions.&lt;/li>
&lt;li>Fear to not succeed in public.&lt;/li>
&lt;li>Fear to not be able to develop the expected solution for multiple reasons: misunderstanding the task or lack of knowledge.&lt;/li>
&lt;li>Fear to change your mind in front of others.&lt;/li>
&lt;li>Fear to discuss and make decisions loud.&lt;/li>
&lt;li>Fear of disagreeing with others.&lt;/li>
&lt;/ul>
&lt;h2 id="after-several-years-of-experience-on-this-topic">After several years of experience on this topic
&lt;a class="heading-anchor" href="#after-several-years-of-experience-on-this-topic" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The pattern which rejects Pair Programing is basically “fear”, and being out of your comfort zone. And this is due to the misunderstanding of the roots of the actual Pair Programming concept.&lt;/p>
&lt;p>Pair Programming is not “to show off in front of your colleagues” or “to be screwed by your peers”, but to be transparent (showing your skills as they really are) and improve as a team lifting up each other.&lt;/p>
&lt;p>Programming is an iterative process that needs a continuous refactoring of our way of thinking in order to achieve better solutions, day by day. Therefore, programming with another person next to you (with a different way of thinking) will help the team to get the best from each other while discarding the waste or bad habits if necessary.&lt;/p>
&lt;p>Pair Programming doesn’t need to be always set for everything. As a tool, it’s flexible, and we can choose how, when and for what reason.&lt;/p>
&lt;p>A personal rule of thumb, before starting tasks that might involve touching multiple modules or complex business rules, think about a quick Pair Thinking/Programming with another more experienced colleague in that field.&lt;/p>
&lt;blockquote>
&lt;p>Everything depends on a particular context and people: the developers, the pairs, the tasks, the mood.&lt;/p>
&lt;/blockquote>
&lt;h3 id="still-uncomfortable-with-pair-programming">Still uncomfortable with Pair Programming?
&lt;a class="heading-anchor" href="#still-uncomfortable-with-pair-programming" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>If you still feel uncomfortable having another person next to you while you write code, it might be because you aren’t particularly happy with your own code, or the process that you follow in order to achieve some result. My favorite way to work on this is by exercising on your own and working on improving your skills as a software developer.&lt;/p>
&lt;ul>
&lt;li>Create and play around with your own pet projects.&lt;/li>
&lt;li>Work on code katas on your own and with others.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Practice makes the master.&lt;/p>
&lt;/blockquote>
&lt;h2 id="keep-pull-requests-add-pair-programming">Keep pull requests, add pair programming
&lt;a class="heading-anchor" href="#keep-pull-requests-add-pair-programming" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;ul>
&lt;li>Don’t get me wrong, Pull Requests are great. Keep doing them.&lt;/li>
&lt;li>Team collaboration is essential. Pair Programming aims for this.&lt;/li>
&lt;li>Pair Programming encourages the team to proactively work together.&lt;/li>
&lt;li>Don’t be afraid of coding while having eyes around you. Ask questions when something is unclear. Ask for help when you don’t know how to solve something.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>It’s totally ok not knowing everything. The most important thing is to know how to work together.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="/images/blog/2021-04-01/footer.webp" alt="two developers pair programming" />&lt;/p></content></entry><entry xml:lang="en"><title>Sharing Your Git Patches</title><subtitle>Another way of sharing quick suggestions with your team</subtitle><category term="git" scheme="https://chemaclass.com/tags/git/" label="Git"/><category term="code-review" scheme="https://chemaclass.com/tags/code-review/" label="Code Review"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><published>2020-12-01T00:00:00+00:00</published><updated>2020-12-01T00:00:00+00:00</updated><author><name>
Chemaclass</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/blog/sharing-git-patches/"/><id>https://chemaclass.com/blog/sharing-git-patches/</id><summary type="html">Discover another way of sharing suggestions with your development team.</summary><content type="html">&lt;p>Discover another way of sharing suggestions with your development team.&lt;/p>
&lt;span id="continue-reading">&lt;/span>&lt;h3 id="imagine-this-situation">Imagine this situation
&lt;a class="heading-anchor" href="#imagine-this-situation" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>You are reviewing a Pull Request (PR), and you see some minor improvements or suggestions that you would like to share with the author. You might write some comments, and usually, that would be sufficient.&lt;/p>
&lt;p>Imagine that in order to transmit your “whole idea” you would need to change some files because just communicating the full picture will end up in a huge comment which might be not as clear as it could be.&lt;/p>
&lt;h2 id="what-possibilities-are-there-apart-from-just-comments-in-a-pr">What possibilities are there apart from just comments in a PR?
&lt;a class="heading-anchor" href="#what-possibilities-are-there-apart-from-just-comments-in-a-pr" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Well, there are multiple options. The key is to be aware of them and use them wisely depending on the priority of the task and the changes themselves:&lt;/p>
&lt;ul>
&lt;li>As already mentioned, writing a comment as feedback is a good idea by default, but not the only one.&lt;/li>
&lt;li>We can always do some pair-thinking, talk at any time. Communication is always good in order to clarify the possible uncertainty.&lt;/li>
&lt;li>Sharing your git patches is another good option.&lt;/li>
&lt;/ul>
&lt;h2 id="git-diff-to-the-rescue">Git diff to the rescue!
&lt;a class="heading-anchor" href="#git-diff-to-the-rescue" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>What if you (as a reviewer) could share your idea without any single commit or comment in the PR, but sharing your changes directly with the author?&lt;/p>
&lt;p>Well, that’s actually possible and really easy. As you already know, the git diff command gives you the differences between any two branches.&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> diff&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> origin&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> develop&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../my-origin-develop.patch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>What we are doing here is redirecting the output of the diff command into a file (aka: patch), so we can share that output with any other peer-team.&lt;/p>
&lt;h2 id="what-now">What now?
&lt;a class="heading-anchor" href="#what-now" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Well, having that patch file, it’s pretty easy to apply those changes in your local machine without doing any commit:&lt;/p>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> apply&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../my-origin-develop.patch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;p>Applying this patch will simply change your local system in the same way the patch was created.&lt;/p>
&lt;h2 id="how-to-by-steps">“How to” by steps
&lt;a class="heading-anchor" href="#how-to-by-steps" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Let’s divide the responsibilities into two: the creator of the patch and its user:&lt;/p>
&lt;h3 id="the-patch-creator-the-person-who-will-create-the-patch">The patch creator: the person who will create the patch
&lt;a class="heading-anchor" href="#the-patch-creator-the-person-who-will-create-the-patch" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Checkout that branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> pull&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> origin&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> the-branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Do your suggestions and changes in the targeted branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Generate the patch file using the diff command&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> diff&lt;/span>&lt;span style="color: light-dark(#D73A49, #F97583);"> &amp;gt;&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../your-diff.patch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Share the patch file with the author of the PR&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;h3 id="the-patch-user-the-person-who-will-see-the-patch">The patch user: the person who will see the patch
&lt;a class="heading-anchor" href="#the-patch-user-the-person-who-will-see-the-patch" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;pre class="giallo" style="color-scheme: light dark; color: light-dark(#24292E, #E1E4E8); background-color: light-dark(#FFFFFF, #24292E);">&lt;code data-lang="shellscript">&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Ensure you are in that branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> pull&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> origin&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> the-branch&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6A737D, #6A737D);">#&lt;/span>&lt;span style="color: light-dark(#6A737D, #6A737D);"> Apply the patch file&lt;/span>&lt;/span>
&lt;span class="giallo-l">&lt;span style="color: light-dark(#6F42C1, #B392F0);">$&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ~/myProject&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git:&lt;/span>&lt;span>(&lt;/span>&lt;span style="color: light-dark(#6F42C1, #B392F0);">the-branch&lt;/span>&lt;span>)&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ➜&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> git&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> apply&lt;/span>&lt;span style="color: light-dark(#032F62, #9ECBFF);"> ../your-diff.patch&lt;/span>&lt;/span>&lt;/code>&lt;/pre>
&lt;hr />
&lt;h4 id="references">References
&lt;a class="heading-anchor" href="#references" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;ul>
&lt;li>&lt;a rel="external" href="https://git-scm.com/docs/git-apply">Official documentation for “git apply”&lt;/a>&lt;/li>
&lt;/ul></content></entry><entry xml:lang="en"><title>Extreme Programming Explained</title><subtitle>Embrace Change</subtitle><category term="xp" scheme="https://chemaclass.com/tags/xp/" label="Xp"/><category term="agile" scheme="https://chemaclass.com/tags/agile/" label="Agile"/><category term="tdd" scheme="https://chemaclass.com/tags/tdd/" label="Tdd"/><category term="pair-programming" scheme="https://chemaclass.com/tags/pair-programming/" label="Pair Programming"/><category term="communication" scheme="https://chemaclass.com/tags/communication/" label="Communication"/><published>2020-03-05T00:00:00+00:00</published><updated>2020-03-05T00:00:00+00:00</updated><author><name>
Kent Beck</name></author><link rel="alternate" type="text/html" href="https://chemaclass.com/readings/extreme-programming-explained/"/><id>https://chemaclass.com/readings/extreme-programming-explained/</id><summary type="html">Extreme Programming (XP) is an agile software development framework that aims to produce higher quality software, and higher quality of life for the development team. XP is the most specific of the agile frameworks regarding appropriate engineering practices for software development.</summary><content type="html">&lt;span id="continue-reading">&lt;/span>&lt;h2 id="definition">Definition
&lt;a class="heading-anchor" href="#definition" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Extreme Programming (XP) is an agile software development framework that aims to produce higher quality software, and
higher quality of life for the development team. XP is the most specific of the agile frameworks regarding appropriate
engineering practices for software development.&lt;/p>
&lt;hr />
&lt;h2 id="values">Values
&lt;a class="heading-anchor" href="#values" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>The five values of XP are communication, simplicity, feedback, courage, and respect and are described in more detail
below.&lt;/p>
&lt;h3 id="communication">Communication
&lt;a class="heading-anchor" href="#communication" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Software development is inherently a team sport that relies on communication to transfer knowledge from one team member
to everyone else on the team. XP stresses the importance of the appropriate kind of communication: face to face
discussion with the aid of a white board or other drawing mechanism.&lt;/p>
&lt;h3 id="simplicity">Simplicity
&lt;a class="heading-anchor" href="#simplicity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Simplicity means “what is the simplest thing that will work?” The purpose of this is to avoid waste and do only
absolutely necessary things such as keep the design of the system as simple as possible so that it is easier to
maintain, support, and revise. Simplicity also means address only the requirements that you know about; don’t try to
predict the future.&lt;/p>
&lt;h3 id="feedback">Feedback
&lt;a class="heading-anchor" href="#feedback" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Through constant feedback about their previous efforts, teams can identify areas for improvement and revise their
practices. Feedback also supports simple design. Your team builds something, gathers feedback on your design and
implementation, and then adjust your product going forward.&lt;/p>
&lt;h3 id="courage">Courage
&lt;a class="heading-anchor" href="#courage" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Kent Beck defined courage as “effective action in the face of fear”. This definition shows a preference for action based
on other principles so that the results aren’t harmful to the team. You need courage…&lt;/p>
&lt;ul>
&lt;li>to raise organizational issues that reduce your team’s effectiveness.&lt;/li>
&lt;li>to stop doing something that doesn’t work and try something else.&lt;/li>
&lt;li>to accept and act on feedback, even when it’s difficult to accept.&lt;/li>
&lt;/ul>
&lt;h3 id="respect">Respect
&lt;a class="heading-anchor" href="#respect" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The members of your team need to respect each other in order to communicate with each other, provide and accept feedback
that honors your relationship, and to work together to identify simple designs and solutions.&lt;/p>
&lt;hr />
&lt;h2 id="principles">Principles
&lt;a class="heading-anchor" href="#principles" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;h3 id="humanity">Humanity
&lt;a class="heading-anchor" href="#humanity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Human beings are the ones developing software. It is a fact. The book mentions 5 points that are needed for developers
to become good: basic safety, accomplishment, belonging, growth, and intimacy.&lt;/p>
&lt;p>The magic of great teams is that after the team members develop trust they find that they are free to be more themselves
as a result of their work together.&lt;/p>
&lt;h3 id="economics">Economics
&lt;a class="heading-anchor" href="#economics" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Software costs. Someone or multiple people paid or invested in it.&lt;/p>
&lt;p>Make sure what you are doing has business value, meets business goals, and serves business needs. For example, solving
the highest priority business need first maximizes the value of the project.&lt;/p>
&lt;p>The earlier software makes money, the sooner the development is valuable.&lt;/p>
&lt;h3 id="mutual-benefit">Mutual Benefit
&lt;a class="heading-anchor" href="#mutual-benefit" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Mutual benefit in XP is about activities benefitting all concerned. This principle is about finding practices that
benefit me now, me later, and the customers as well.&lt;/p>
&lt;p>The book brings up 3 points how XP mutually deals with communication-with-the-future problems:&lt;/p>
&lt;ul>
&lt;li>I write automated tests that help me design and implement better today. I leave these tests for future programmers to
use as well. This practice benefits me now and maintainers down the road.&lt;/li>
&lt;li>I carefully refactor to remove accidental complexity, giving me both satisfaction and fewer defects and making the
code easier to understand for those who encounter it later.&lt;/li>
&lt;li>I choose names from a coherent and explicit set of metaphors which speeds my development and makes the code clearer to
new programmers.&lt;/li>
&lt;/ul>
&lt;h3 id="self-similarity">Self-Similarity
&lt;a class="heading-anchor" href="#self-similarity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>This principle is about copying the structure of one solution into a new context.&lt;/p>
&lt;p>For example, the basic structure of development is that you write a failing test and then make it work. This structure
operates at all different scales. Take into account, this principle is a good start, but it may not always work.&lt;/p>
&lt;h3 id="improvement">Improvement
&lt;a class="heading-anchor" href="#improvement" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Do your best today but strive to do better tomorrow, strive to have a deeper understanding tomorrow. XP shines in this
aspect, it is about always improving.&lt;/p>
&lt;blockquote>
&lt;p>Put improvement to work by not waiting for perfection. Find a starting place, get started, and improve from there.&lt;/p>
&lt;/blockquote>
&lt;h3 id="diversity">Diversity
&lt;a class="heading-anchor" href="#diversity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Teams need to bring in people from different backgrounds, with different experiences, attitudes, etc. In order for the
team to have different ways of thinking and solving a problem.&lt;/p>
&lt;p>The principle of diversity suggests that the programmers should work together on the problem and both opinions should be valued.&lt;/p>
&lt;h3 id="reflection">Reflection
&lt;a class="heading-anchor" href="#reflection" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Good teams reflect after action, regularly. They think about why and how they are working.&lt;/p>
&lt;ul>
&lt;li>Why did we succeed? What should we continue doing?&lt;/li>
&lt;li>Why did we fail? What can we do better or differently?&lt;/li>
&lt;/ul>
&lt;p>Reflect and strive to improve. Even if everything seems perfect, know that there is always room for improvement and
throw in the question:&lt;/p>
&lt;ul>
&lt;li>Why do things seem perfect? What are we doing well? What can we do better in order to succeed even more?&lt;/li>
&lt;/ul>
&lt;h3 id="flow">Flow
&lt;a class="heading-anchor" href="#flow" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Flow in software development is delivering a steady flow of valuable software by engaging in all the activities of
development simultaneously. Don’t deliver software in big portions. Deploy smaller increments of value more frequently.&lt;/p>
&lt;h3 id="opportunity">Opportunity
&lt;a class="heading-anchor" href="#opportunity" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Learn to see problems as opportunities for learning and improving.&lt;/p>
&lt;blockquote>
&lt;p>Part of being extreme is consciously choosing to transform each problem into an opportunity:
an opportunity for personal growth, deepening relationships, and improved software.&lt;/p>
&lt;/blockquote>
&lt;h3 id="redundancy">Redundancy
&lt;a class="heading-anchor" href="#redundancy" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The difficult problems in software development should be solved in multiple ways.&lt;/p>
&lt;blockquote>
&lt;p>The cost of the redundancy is more than paid for by the savings from not having a disaster.&lt;/p>
&lt;/blockquote>
&lt;h3 id="failure">Failure
&lt;a class="heading-anchor" href="#failure" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Sometimes it is extremely difficult to implement something, we don’t know which way or approach to take, try the ideas
you have, even if they fail! Failure isn’t a waste, rather a learning experience.&lt;/p>
&lt;p>Be aware of falling into the trap of discussing or thinking forever and not getting things done.&lt;/p>
&lt;blockquote>
&lt;p>When you don’t know what to do though, risking failure can be the shortest, surest road to success.&lt;/p>
&lt;/blockquote>
&lt;h3 id="quality">Quality
&lt;a class="heading-anchor" href="#quality" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Projects don’t go faster by lowering the quality. Actually it’s often the other way around (if not always). It results
in later and less predictable delivery, especially due to the amount of time spent on fixing bugs for example.&lt;/p>
&lt;p>Pushing quality higher often results in faster delivery.&lt;/p>
&lt;blockquote>
&lt;p>A concern for quality is no excuse for inaction. If you don’t know a clean way to do a job that has to be done,
do it the best way you can. If you know a clean way but it would take too long, do the job as well as you have time
for now. Resolve to finish doing it the clean way later.&lt;/p>
&lt;/blockquote>
&lt;h3 id="baby-steps">Baby Steps
&lt;a class="heading-anchor" href="#baby-steps" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Take baby steps. Making big changes in big steps is dangerous. People and teams can take many small steps so they appear
to be moving forward rapidly.&lt;/p>
&lt;blockquote>
&lt;p>Baby steps acknowledge that the overhead of small steps is much less than when a team wastefully recoils from aborted big changes.&lt;/p>
&lt;/blockquote>
&lt;h3 id="accepted-responsibility">Accepted Responsibility
&lt;a class="heading-anchor" href="#accepted-responsibility" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;blockquote>
&lt;p>Responsibility cannot be assigned; it can only be accepted. If someone tries to give you responsibility, only you can decide if you are responsible or if you aren’t.&lt;/p>
&lt;/blockquote>
&lt;hr />
&lt;h2 id="practices">Practices
&lt;a class="heading-anchor" href="#practices" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>While it is possible to do these practices in isolation, many teams have found some practices reinforce the others and
should be done in conjunction to fully eliminate the risks you often face in software development.&lt;/p>
&lt;h3 id="sit-together">Sit Together
&lt;a class="heading-anchor" href="#sit-together" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Since communication is one of the five values of XP, have your team sit together in the same space without barriers to
communication, such as cubicle walls.&lt;/p>
&lt;h3 id="whole-team">Whole Team
&lt;a class="heading-anchor" href="#whole-team" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Include on the team people with all the skills and perspectives necessary for the project to succeed.&lt;/p>
&lt;h3 id="informative-workspace">Informative Workspace
&lt;a class="heading-anchor" href="#informative-workspace" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Set up your team space to facilitate face to face communication, allow people to have some privacy when they need it,
and make the work of the team transparent to each other and to interested parties outside the team.&lt;/p>
&lt;h3 id="energized-work">Energized Work
&lt;a class="heading-anchor" href="#energized-work" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>You are most effective at software development and all knowledge work when you are focused and free from distractions.&lt;/p>
&lt;h3 id="pair-programming">Pair Programming
&lt;a class="heading-anchor" href="#pair-programming" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Pair Programming means all production software is developed by two people sitting at the same machine. The idea behind
this practice is that two brains and four eyes are better than one brain and two eyes. You effectively get a continuous
code review and quicker response to nagging problems that may stop one person dead in their tracks.&lt;/p>
&lt;p>Teams that have used pair programming have found that it improves quality and does not actually take twice as long
because they are able to work through problems quicker, and they stay more focused on the task at hand, thereby creating
less code to accomplish the same thing.&lt;/p>
&lt;p>Pair programmers:&lt;/p>
&lt;ul>
&lt;li>Keep each other on task.&lt;/li>
&lt;li>Brainstorm refinements to the system.&lt;/li>
&lt;li>Clarify ideas.&lt;/li>
&lt;li>Take initiative when their partner is stuck, thus lowering frustration.&lt;/li>
&lt;li>Hold each other accountable to the team’s practices.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Pair programming is a dialog between two people simultaneously programming (and analyzing and designing and testing)
and trying to program better.&lt;/p>
&lt;/blockquote>
&lt;p>Though, if you need privacy and time to work on an idea, go ahead and do it. We need both companionship and privacy.
Make sure to rotate pairs frequently and take frequent breaks, pairing can be tiring, but surely is rewarding.&lt;/p>
&lt;h3 id="stories">Stories
&lt;a class="heading-anchor" href="#stories" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Describe what the product should do in terms meaningful to customers and users. These stories are intended to be short
descriptions of things users want to be able to do with the product that can be used for planning and serve as reminders
for more detailed conversations when the team gets around to realizing that particular story.&lt;/p>
&lt;p>Give the stories a short title and a description. Write them on cards and put them on a wall that is often being passed.&lt;/p>
&lt;p>In XP stories are estimated extremely early, which gets the team thinking about how to get the largest return from the
tiny investment.&lt;/p>
&lt;h3 id="weekly-cycle">Weekly Cycle
&lt;a class="heading-anchor" href="#weekly-cycle" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The Weekly Cycle is synonymous to an iteration. In the case of XP, the team meets on the first day of the week to
reflect on progress to date, the customer picks the stories they would like delivered in that week, and the team
determines how they will approach those stories.&lt;/p>
&lt;p>The intent behind the time boxed delivery period is to produce something to show to the customer for feedback.&lt;/p>
&lt;h3 id="ten-minute-build">Ten-Minute Build
&lt;a class="heading-anchor" href="#ten-minute-build" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The goal with the Ten-Minute Build is to automatically build the whole system and run all of the tests in ten minutes.&lt;/p>
&lt;h3 id="continuous-integration">Continuous Integration
&lt;a class="heading-anchor" href="#continuous-integration" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Continuous Integration is a practice where code changes are immediately tested when they are added to a larger code
base. The benefit of this practice is you can catch and fix integration issues sooner.&lt;/p>
&lt;p>This practice requires some extra discipline and is highly dependent on Ten Minute Build and Test First Development.&lt;/p>
&lt;h3 id="test-first-programming">Test-First Programming
&lt;a class="heading-anchor" href="#test-first-programming" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;blockquote>
&lt;p>Write a failing automated test before changing any code.&lt;/p>
&lt;/blockquote>
&lt;p>The book mentions 4 problem Test-First Programming addresses at once:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Scope creep: It’s easy to get carried away programming and put in code “just in case.” By stating explicitly and
objectively what the program is supposed to do, you give yourself a focus for your coding. If you really want to put
that other code in, write another test after you’ve made this one work.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Coupling and cohesion: If it’s hard to write a test, it’s a signal that you have a design problem, not a testing
problem. Loosely coupled, highly cohesive code is easy to test.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Trust: It’s hard to trust the author of code that doesn’t work. By writing clean code that works and demonstrating
your intentions with automated tests, you give your teammates a reason to trust you.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Rhythm: It’s easy to get lost for hours when you are coding. When programming test-first, it’s clearer what to do
next: either write another test or make the broken test work. Soon this develops into a natural and efficient rhythm:
test, code, refactor, test, code, refactor.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h3 id="incremental-design">Incremental Design
&lt;a class="heading-anchor" href="#incremental-design" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;blockquote>
&lt;p>Invest in the design of the system every day.&lt;/p>
&lt;/blockquote>
&lt;p>You do a little bit of work up front to understand the proper breadth-wise perspective of the system design, and then
dive into the details of a particular aspect of that design when you deliver specific features.&lt;/p>
&lt;p>This approach reduces the cost of changes and allows you to make design decisions when necessary based on the most
current information available.&lt;/p>
&lt;hr />
&lt;h2 id="roles">Roles
&lt;a class="heading-anchor" href="#roles" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h2>
&lt;p>Although XP specifies particular practices for your team to follow, it doesn’t really establish specific roles for the
people on your team.&lt;/p>
&lt;p>Depending on which source you read, there is either no guidance, or there is a description of how roles typically found
in more traditional projects behave on XP projects.&lt;/p>
&lt;h3 id="the-customer">The Customer
&lt;a class="heading-anchor" href="#the-customer" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The Customer role is responsible for making all of the business decisions regarding the project including:&lt;/p>
&lt;p>The XP Customer is assumed to be a single person, however experience has shown that one person cannot adequately provide
all of the business related information about a project.&lt;/p>
&lt;h3 id="the-developer">The Developer
&lt;a class="heading-anchor" href="#the-developer" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>Because XP does not have much need for role definition, everyone on the team (with the exception of the customer and a
couple of secondary roles listed below) is labeled a developer. Developers are responsible for realizing the stories
identified by the Customer.&lt;/p>
&lt;h3 id="the-tracker">The Tracker
&lt;a class="heading-anchor" href="#the-tracker" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>The main purpose of this role is to keep track of relevant metrics that the team feels necessary to track their progress
and to identify areas for improvement.&lt;/p>
&lt;h3 id="the-coach">The Coach
&lt;a class="heading-anchor" href="#the-coach" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h3>
&lt;p>This is usually an outside consultant (or someone from elsewhere in your organization) who has used XP before and is
included in your team to help mentor the other team members on the XP Practices and to help your team maintain your
self-discipline.&lt;/p>
&lt;hr />
&lt;h4 id="what-is-xp-in-2-min">What is XP? (in 2 min)
&lt;a class="heading-anchor" href="#what-is-xp-in-2-min" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/hbFOwqYIOcU"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div>
&lt;h4 id="tech-talk-by-kent-beck-xp-20-years-later">Tech Talk by kent Beck: XP 20 years later
&lt;a class="heading-anchor" href="#tech-talk-by-kent-beck-xp-20-years-later" title="Copy link" aria-label="Link to this section">#&lt;/a>
&lt;/h4>
&lt;div style="position:relative;aspect-ratio:16/9;width:100%;">
&lt;iframe
src="https://www.youtube-nocookie.com/embed/cGuTmOUdFbo"
title="YouTube video"
width="560"
height="315"
loading="lazy"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
referrerpolicy="strict-origin-when-cross-origin"
style="position:absolute;inset:0;width:100%;height:100%;border:0;"
allowfullscreen>
&lt;/iframe>
&lt;/div></content></entry></feed>