<?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: Kalarani Lakshmanan</title>
    <description>The latest articles on DEV Community by Kalarani Lakshmanan (@kalarani).</description>
    <link>https://dev.to/kalarani</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%2F1010288%2Fc4fddb6c-6a10-4acb-84e3-58e819305fe7.jpeg</url>
      <title>DEV Community: Kalarani Lakshmanan</title>
      <link>https://dev.to/kalarani</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kalarani"/>
    <language>en</language>
    <item>
      <title>Crossing the chasm with Copilot</title>
      <dc:creator>Kalarani Lakshmanan</dc:creator>
      <pubDate>Tue, 27 Jun 2023 14:41:17 +0000</pubDate>
      <link>https://dev.to/kalarani/crossing-the-chasm-with-copilot-k2k</link>
      <guid>https://dev.to/kalarani/crossing-the-chasm-with-copilot-k2k</guid>
      <description>&lt;p&gt;I've observed a lot of folks (including me) struggle in our initial attempts to get copilot write the code we want. The common entry barrier in such cases, is &lt;strong&gt;&lt;em&gt;"prompting"&lt;/em&gt;&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;With all the attention prompt engineering is getting in recent times, developers tend to think, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"How do I come up with the most effective prompt, that'd make copilot write the code that I have in mind?" &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As it turns out, arriving at the right prompt, in itself, is an iterative process. So, you're &lt;del&gt;never going to get the prompt right in first place&lt;/del&gt; always going to take a few attempts before copilot spits out the code you expected.&lt;/p&gt;

&lt;p&gt;I think, we should simply take all this fuzz about prompt engineering (for copilot) out of our heads and just keep coding. Copilot &lt;em&gt;will&lt;/em&gt; tag along with you. You don't have to think about the prompt that you'd need to write. Just focus on what you need to build.&lt;/p&gt;

&lt;p&gt;I've found working with copilot in this mode more useful than prompting it to generate code, for two reasons:&lt;/p&gt;

&lt;p&gt;1) When you prompt, copilot may generate a code that may not necessarily fit into your style of coding. Every developer has their own style of coding and it is as unique as their signature.&lt;br&gt;
2) When you prompt, it takes &lt;a href="https://arxiv.org/pdf/2210.14306.pdf"&gt;significant amount of time&lt;/a&gt; in reviewing the code, since you are not yet in the coding mode. This is a subtle difference and takes a hit on developer experience. &lt;/p&gt;

&lt;p&gt;Without prompting, It just feels like working with an invisible pair. Just that the pair often hogs the keyboard and completes the code before you could :) . It definitely made me go faster than I would've done it myself.&lt;/p&gt;

&lt;p&gt;In this mode, you are always on the flow. You don't get into the &lt;em&gt;&lt;strong&gt;prompt - review - accept / reject&lt;/strong&gt;&lt;/em&gt; cycle. You keep churning the code out, copilot comes along with its suggestions, which you take less time to accept / reject since you are already neck deep into it.&lt;/p&gt;

&lt;p&gt;In my opinion, while I was in the &lt;em&gt;&lt;strong&gt;prompt - review - accept / reject&lt;/strong&gt;&lt;/em&gt; cycle, copilot was taking a lot of focus away from the thing being built. Without prompting, copilot became a trusted ally and helped me build what I wanted, the product remained in the primary focus. And that's what a great tool does.&lt;/p&gt;

&lt;p&gt;To sum it up, a tool doesn't need to do great things. It just need to do simple and useful things. In that aspect, I must admit that copilot is a really good tool to have in a dev's toolkit.&lt;/p&gt;

</description>
      <category>githubcopilot</category>
      <category>ai</category>
      <category>tooling</category>
      <category>programming</category>
    </item>
    <item>
      <title>Paradigm shift: Immutability in Elixir</title>
      <dc:creator>Kalarani Lakshmanan</dc:creator>
      <pubDate>Mon, 19 Jun 2023 04:31:47 +0000</pubDate>
      <link>https://dev.to/kalarani/paradigm-shift-immutability-in-elixir-51e2</link>
      <guid>https://dev.to/kalarani/paradigm-shift-immutability-in-elixir-51e2</guid>
      <description>&lt;p&gt;I spent this weekend by writing an &lt;a href="https://github.com/kalarani/mlbook-elixir/blob/main/linear-regression/LinearRegression.exs"&gt;Elixir script to solve the Linear Regression problem&lt;/a&gt;. And then when I went on to implement Gradient descent to train the model, I hit a road block.&lt;/p&gt;

&lt;p&gt;I came up with this code, which looked perfect to me, just that it didn't work. It didn't do what I expected this to do.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  def train_from(filename) do
    raw_dataset = read_dataset(filename)
    x = raw_dataset |&amp;gt; Enum.map(fn d -&amp;gt; elem(Integer.parse(Enum.at(d, 0)),0) end)
    y = raw_dataset |&amp;gt; Enum.map(fn d -&amp;gt; elem(Float.parse(Enum.at(d, 1)),0) end)
    training_dataset = %{x: x, y: y}
    w = 100
    b = 100

    for n &amp;lt;- 1..5 do
      IO.inspect("Iteration #{n}: #{w}, #{b}")
      [w, b] = gradient_descent_step(x, y, w, b)
      IO.inspect("End of Iteration #{n}: #{w}, #{b}")
    end

    IO.inspect("End values for w: #{w}, b: #{b}");
  end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It spit out this output. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Iteration 1: 100, 100"&lt;br&gt;
902964882.6662791&lt;br&gt;
4514335.333331471&lt;br&gt;
"Iteration 2: 100, 100"&lt;br&gt;
902964882.6662791&lt;br&gt;
4514335.333331471&lt;br&gt;
"Iteration 3: 100, 100"&lt;br&gt;
902964882.6662791&lt;br&gt;
4514335.333331471&lt;br&gt;
"Iteration 4: 100, 100"&lt;br&gt;
902964882.6662791&lt;br&gt;
4514335.333331471&lt;br&gt;
"Iteration 5: 100, 100"&lt;br&gt;
902964882.6662791&lt;br&gt;
4514335.333331471&lt;br&gt;
"End values for w: 100, b: 100"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I was expecting the value of w and b to be updated and passed on in each iteration. Even though, the gradient descent returned back new values for w and b, it wasn't carried forward to the next iteration.&lt;/p&gt;

&lt;p&gt;Turned out, I missed an important aspect of Elixir, rather functional programming. It is&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;Immutability&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;All variables are immutable. Ideally, they are constants. You can't change it once they are initialised. &lt;/p&gt;

&lt;p&gt;If that is the case, how am I supposed to do multiple iterations and feed the outputs from the previous iteration to the next one?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;This is where the &lt;strong&gt;paradigm shift&lt;/strong&gt; from object oriented programming is required.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;By forcing ourselves to deal with immutable variables and methods that &lt;del&gt;doesn't&lt;/del&gt; shouldn't have any side effects, we can come up an alternative way to solve the problem. i.e., to use &lt;a href="https://elixir-lang.org/getting-started/recursion.html#loops-through-recursion"&gt;recursion for looping&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Epilogue:
&lt;/h2&gt;

&lt;p&gt;My relationship with Elixir has always been on and off. Having spent a couple of years building websites in RoR, I've explored &lt;a href="https://elixirschool.com/ta/lessons/basics/basics"&gt;basics of elixir&lt;/a&gt; few years back. Recently I came across &lt;a href="https://dockyard.com/blog/2022/07/12/elixir-versus-python-for-data-science"&gt;this blog&lt;/a&gt; from &lt;a href="https://seanmoriarity.com/"&gt;Sean Moriarity&lt;/a&gt; and that triggered my interest to try out elixir in the ML space.&lt;/p&gt;

&lt;p&gt;For curious minds, &lt;a href="https://twitter.com/cscalfani"&gt;Charles Scalfani&lt;/a&gt; wrote a &lt;a href="https://cscalfani.medium.com/so-you-want-to-be-a-functional-programmer-part-1-1f15e387e536"&gt;series of blogposts&lt;/a&gt; that helps with the fundamentals of functional programming.&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>elixir</category>
    </item>
    <item>
      <title>My experiments with Copilot</title>
      <dc:creator>Kalarani Lakshmanan</dc:creator>
      <pubDate>Sun, 21 May 2023 05:39:28 +0000</pubDate>
      <link>https://dev.to/kalarani/my-experiments-with-copilot-2nd3</link>
      <guid>https://dev.to/kalarani/my-experiments-with-copilot-2nd3</guid>
      <description>&lt;p&gt;I've been trying my hand at creating something with &lt;a href="https://github.com/features/copilot"&gt;Copilot&lt;/a&gt; for the last two weeks. The one question that I set out to find an answer is, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can copilot really replace pair programming?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--audFUtI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ufp4fkqhxkj757f4pbz1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--audFUtI8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ufp4fkqhxkj757f4pbz1.png" alt="Human and Robot pairing. Image created by Midjourney" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
I've spent a good amount time of my career crafting code and 80% of the time the code was co-created with my pair. So, there was an initial hesitation to try this out. But one fine day, I crossed the chasm and got started on my experiments with copilot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;

&lt;p&gt;The way copilot responded to some of my initial few prompts was amazing. I was writing a simple calculator in three different languages. In a few minutes, I had the code and tests for my calculators in &lt;code&gt;Java&lt;/code&gt;, &lt;code&gt;Python&lt;/code&gt; and &lt;code&gt;Elixir&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A (not so) complex problem
&lt;/h2&gt;

&lt;p&gt;I encountered challenges when I prompted copilot to create a simple CRUD API in layered architecture. &lt;/p&gt;

&lt;p&gt;Given the prompt to create an article controller, copilot suggested to do the CRUD for an article and then it stopped there. My initial reaction was, &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Dear copilot, I know that I'd need to have CRUD endpoints in a controller. Could you please write the code for the same?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But then there was only silence from the other end. So, I gave up and started defining the controller and dependencies. At this point, copilot came along and offered some suggestions that were appropriate.&lt;/p&gt;

&lt;p&gt;It failed me again though. Given the prompt to create an endpoint to create an Article, copilot went on to define an action in MVC style, whereas I was looking to create a REST API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Lessons learnt
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;You need to get better at prompt engineering. Be able to break down the task at hand and give specific prompts to copilot. The more specific your prompt is, the more appropriate the code will be.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copilot can get stuck at times, or produce incorrect code. In such cases, once you take a lead, copilot will be able to follow.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You need to really know what you are doing. In a new language / framework, it can easily (and quickly) lead you down the drain.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Testing time
&lt;/h2&gt;

&lt;p&gt;Once I had the code in place, I went on to explore copilot's skills in writing tests. I must admit that, it was pretty impressive in this space. It was able to cover the happy path and error scenarios equally well.&lt;/p&gt;

&lt;p&gt;Again, Copilot's is quick to pick up your coding style and write more tests in the same style.&lt;/p&gt;

&lt;p&gt;While at it, I wanted to write a builder for my model and with just one line of prompt, copilot gave me the implementation of the builder class. This is a key improvement. If copilot is able to write code understanding the language of software developers, that would be a good improvement in this tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can copilot replace pair programming?
&lt;/h2&gt;

&lt;p&gt;The verdict: &lt;code&gt;Nope. Or at least, not yet.&lt;/code&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Copilot doesn't know (or care) why you are doing something. It is highly focussed on the how. While pairing often you'd have to zoom out and look at the big picture to ensure you are on the right track. Copilot is very contextual and can help you with specific tasks, but cannot help you with doing the right thing. It helps you do the thing right.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There is still a long way to go. But the future seems promising. &lt;a href="https://github.com/features/preview/copilot-x"&gt;CopilotX&lt;/a&gt; is a good step in that direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future experiments:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Can you drive design through TDD?&lt;br&gt;
Can you just write the tests and let copilot write the code. You should be good as long as the tests are green.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Can copilot help you go deeper? &lt;br&gt;
Once you decide on the technical architecture, can copilot write code to create the entire infrastructure? &lt;br&gt;
(or)&lt;br&gt;
For a ML problem, can copilot help you pick up, train and test the best model for the job?&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Gradient Descent for XP practitioners</title>
      <dc:creator>Kalarani Lakshmanan</dc:creator>
      <pubDate>Tue, 09 May 2023 12:35:33 +0000</pubDate>
      <link>https://dev.to/kalarani/gradient-descent-for-xp-practitioners-33k6</link>
      <guid>https://dev.to/kalarani/gradient-descent-for-xp-practitioners-33k6</guid>
      <description>&lt;h2&gt;
  
  
  What is Gradient Descent?
&lt;/h2&gt;

&lt;p&gt;Gradient descent is an optimisation algorithm used in machine learning to deduce the optimal weights / parameters that incurs minimum cost for the model being trained. &lt;/p&gt;

&lt;p&gt;A machine learning model needs to be trained on a dataset before it can start predicting. We can call training as done, if we have figured out the optimal values for its parameters. We can say the parameter values are optimal when the cost (difference between prediction and actual) is minimum. Gradient descent helps us find the optimal parameters for a model, given the training data and cost function.&lt;/p&gt;

&lt;h2&gt;
  
  
  How does it work?
&lt;/h2&gt;

&lt;p&gt;It is suggested to start with a random value for parameters and gradually update them till minimum cost is achieved. &lt;/p&gt;

&lt;p&gt;The rate at which the parameters are updated is called &lt;strong&gt;learning rate&lt;/strong&gt;. It is important that the learning rate shouldn't be too large or small. If it is too large, the model takes bigger steps and may not converge towards the global minimum. On the other hand, if the learning rate is too small, it may take a long time to arrive at the global minimum. &lt;/p&gt;

&lt;p&gt;The cost function acts as the &lt;strong&gt;feedback mechanism&lt;/strong&gt; to guide the gradient descent towards global minimum. It is not expected to start at a perfect value for the parameters. We rely on the feedback mechanism and the iterative updation of parameters to guide us towards the optimal value for the parameters, in baby steps. Each &lt;strong&gt;iteration&lt;/strong&gt; in the gradient descent is just the most confident step we could take in the right direction.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gUsn6Y7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yj1pc055i6y0x37dabv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gUsn6Y7e--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0yj1pc055i6y0x37dabv.jpeg" alt="Gradient Descent" width="279" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  So, how does it relate to XP?
&lt;/h2&gt;

&lt;p&gt;We can draw parallels to the Gradient descent from XP practices and principles. XP states that striving for perfection is the enemy of progress. You don't need a perfect place to start. Rather, it is important to start somewhere that is logical to the team and equip ourselves with the right feedback mechanisms so that we can confidently move towards the expected state. &lt;/p&gt;

&lt;p&gt;When we say move, it implies taking baby steps, rather than huge leaps. Taking baby steps can help us the safety net to fail and learn, course correct ourselves when things go wrong.&lt;/p&gt;

&lt;p&gt;In summary, Gradient descent and XP are similar at a fundamental level, even though they have completely different applications.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Continuous Improvement&lt;/li&gt;
&lt;li&gt;Relying on Feedback mechanism&lt;/li&gt;
&lt;li&gt;Importance of Iterations&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>xp</category>
      <category>agile</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Agile Maturity Assessment</title>
      <dc:creator>Kalarani Lakshmanan</dc:creator>
      <pubDate>Thu, 04 May 2023 17:23:05 +0000</pubDate>
      <link>https://dev.to/kalarani/agile-maturity-assessment-5hgj</link>
      <guid>https://dev.to/kalarani/agile-maturity-assessment-5hgj</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You cannot improve anything that you cannot measure.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;For teams on a Agile transformation journey, they may want to know at how mature they are. While I'm not a fan of ranking teams based on their maturity index (or similar), I think, within the team such assessments can be good starting points to identify what they have to focus on. In such cases, I've found James Shore's &lt;a href="https://www.jamesshore.com/v2/books/aoad1/assess_your_agility"&gt;agile maturity assessment&lt;/a&gt; to be a useful tool.&lt;/p&gt;

&lt;p&gt;This is a self-assessment for a team on 5 different sections.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Thinking - Awareness of what you're doing, why you're doing&lt;/li&gt;
&lt;li&gt;Collaborating - Software development is a team activity.&lt;/li&gt;
&lt;li&gt;Releasing - Pushing the software to production.&lt;/li&gt;
&lt;li&gt;Planning - Don't strive to plan everything upfront. Adapt it as you go.&lt;/li&gt;
&lt;li&gt;Developing - Is not just coding. It is the art of crafting a well rounded software.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each section has a few questions that carry different weights. Every team member needs to take this assessment individually and plot their score on a &lt;a href="https://www.jamesshore.com/downloads/art-of-agile/assessment-chart.pdf"&gt;spider chart&lt;/a&gt;. A collective view of this, can provide immense insights for a team on where they stand. You can classify it into two buckets&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Areas of improvement - a relatively low score in a particular section, from every member of the team is a clear indicator of an improvement area for the team.&lt;/li&gt;
&lt;li&gt;Gaps in understanding - difference in scores for a particular section is a clear indicator of the gaps on how the team feels it is doing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The team can then brainstorm and come up with action items for themselves.&lt;/p&gt;

&lt;p&gt;As mentioned above, the individual scores in themselves are not valuable, whereas the collective view of the team is. Therefore, comparing teams based on these scores does not make sense as well. I strongly believe, the business outcomes should give us the right feedback on the transformation.&lt;/p&gt;

&lt;p&gt;Further reading:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/live/qt6SN6jhacc"&gt;James Shore on Agile Fluency&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://martinfowler.com/articles/agileFluency.html"&gt;The Agile Fluency Model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.jamesshore.com/v2/books/aoad2"&gt;The Art of Agile Development&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>agile</category>
    </item>
    <item>
      <title>Demystifying XP Values, Principles &amp; Practices</title>
      <dc:creator>Kalarani Lakshmanan</dc:creator>
      <pubDate>Sun, 19 Feb 2023 14:59:10 +0000</pubDate>
      <link>https://dev.to/kalarani/demystifying-xp-values-principles-practices-1e1a</link>
      <guid>https://dev.to/kalarani/demystifying-xp-values-principles-practices-1e1a</guid>
      <description>&lt;p&gt;For any team that wants to adopt XP, it is important to make sense of the &lt;a href="http://www.extremeprogramming.org/values.html"&gt;values&lt;/a&gt;, principles and practices and how they are connected to each other. Though, this understanding will solidify itself over time, it can be challenging to the team to sustain till then. And many teams may not have the luxury of allowing themselves the required time. Here, I attempt to put my understanding from practising XP over my years in Thoughtworks into words, hoping it'd help someone who is looking for this.&lt;/p&gt;

&lt;h2&gt;
  
  
  An Analogy:
&lt;/h2&gt;

&lt;p&gt;Imagine a child, that is learning to speak. Children usually start speaking and create grammatically correct sentences even before they understand the elements of grammar. At this point, they are simply replicating / mimicking what they hear others speak. But, as they grow, they start understanding what they speak. They are able to break it down and label things as nouns / verbs / adjectives / adverbs. They are able to understand the different voices in the sentence. Once they understand this, they'll play around with it. They'll be able to generate more sentences that mean the same. They become capable of expressing themselves creatively and in different forms and without taking much of cognitive load.&lt;/p&gt;

&lt;h2&gt;
  
  
  In the XP world:
&lt;/h2&gt;

&lt;p&gt;I feel, it is the same with teams that want to practice XP. Often it is useful to start with the practices, since they are more concrete. For example, you can start doing TDD even before you could understand the values of doing so. You can write a test - see it fail (bleeding red) - write the code - and see it pass. These are tangible things. The practices are activities that helps us in our day jobs. We spend most of our time in such practices. It is a very good place to start. But, if we don't understand the values and principles behind them, we risk being dogmatic.&lt;/p&gt;

&lt;p&gt;As the team matures, we need to look beyond practices and be able to look at a big picture, be able to pick &amp;amp; choose (or drop) what is appropriate for the given situation.&lt;/p&gt;

&lt;p&gt;Consider a scenario to see how these different components come to play with each other. As a team, we've agreed to value &lt;code&gt;Communication&lt;/code&gt;. Personally, I'm not a big fan of code commenting. However, there are people on my team who'd see code comments as documentation that accounts to communication. I'd suggest that we address this by adding tests, which is guided by the principle of &lt;code&gt;Quality&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;However, if the team publishes an API and if anyone in the world can consume it, then it becomes essential that we add documentation (which could be in the form of comments and using tools to generate docs out of it). Here the documentation is important since it is now guided by a couple of principles &lt;code&gt;Humanity&lt;/code&gt; (for external devs who consume our APIs) and &lt;code&gt;Redundancy&lt;/code&gt; (by having tests + docs).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--20FpUP2V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zn14g27tiv06bfm8dt4n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--20FpUP2V--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zn14g27tiv06bfm8dt4n.png" alt="Mapping to show adoption of different practices based on context" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Golden circle of XP:
&lt;/h2&gt;

&lt;p&gt;I relate the values, principles and practices to &lt;a href="https://www.ted.com/talks/simon_sinek_how_great_leaders_inspire_action"&gt;the golden circle&lt;/a&gt;. The practices (what we do) form the outer most circle. The principles (how we do) takes the inner circle. The values (why we do) goes into the core. &lt;/p&gt;

&lt;p&gt;Lets say, As a team we decide to do TDD. Practising TDD would be hard, if we take a complex problem and attack it as a whole. We'd have to break it down to smaller pieces and attack one at a time - which essentially means we are taking &lt;code&gt;Baby steps&lt;/code&gt; - which in turn reflects the fact that we value &lt;code&gt;Simplicity&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2fKHeFUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a7v5nsoyyvhnqqmo6chb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2fKHeFUB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a7v5nsoyyvhnqqmo6chb.png" alt="Golden circle showing the route from TDD to Simplicity by taking Baby Steps" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Similarly, if we take another example - when the team decides to do pair programming. We could trace it to the value of &lt;code&gt;Feedback&lt;/code&gt; in the lens of &lt;code&gt;Redundancy&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O8AfBIB9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eziigb755kw1i80cuv4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O8AfBIB9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/eziigb755kw1i80cuv4u.png" alt="Golden circle showing the route from Pairing to Feedback by allowing Redundancy" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>xp</category>
      <category>agile</category>
    </item>
  </channel>
</rss>
