<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[AgileBits by Learn Agile Practices: Older issues]]></title><description><![CDATA[Older issues with the old format, now available in the archive of our blog https://www.learnagilepractices.com/posts/archive]]></description><link>https://learnagilepractices.substack.com/s/older-issues</link><image><url>https://substackcdn.com/image/fetch/$s_!tmzC!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7c7edca-11c8-4eda-8c1b-f7fc03037193_500x500.png</url><title>AgileBits by Learn Agile Practices: Older issues</title><link>https://learnagilepractices.substack.com/s/older-issues</link></image><generator>Substack</generator><lastBuildDate>Mon, 13 Jul 2026 18:00:27 GMT</lastBuildDate><atom:link href="https://learnagilepractices.substack.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Dan the dev]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[learnagilepractices@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[learnagilepractices@substack.com]]></itunes:email><itunes:name><![CDATA[Dan the dev]]></itunes:name></itunes:owner><itunes:author><![CDATA[Dan the dev]]></itunes:author><googleplay:owner><![CDATA[learnagilepractices@substack.com]]></googleplay:owner><googleplay:email><![CDATA[learnagilepractices@substack.com]]></googleplay:email><googleplay:author><![CDATA[Dan the dev]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[What if We do Ensemble Programming all the time? 🧑🏻‍💻👩🏽‍💻👨🏻‍💻👨🏼‍💻]]></title><description><![CDATA[Imagine a world where software development is a collective endeavor: every team member actively contributes to every line of code. Does it make sense? Is it even possible? Meet Ensemble Programming!]]></description><link>https://learnagilepractices.substack.com/p/what-if-we-do-ensemble-programming</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/what-if-we-do-ensemble-programming</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 19 Mar 2024 06:00:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W5wh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4><strong>&#128204; In case you missed it last week</strong></h4><p>Last newsletter issue:</p><ul><li><p>London vs Chicago: The two ways of TDD &#128256;: Whenever you get closer to TDD, you discover that two main approaches (schools) exist: they are called London School and Chicago School. But what are the differences? Let's see it together!</p></li></ul><p>Read the full article and all the previous ones in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>Video Podcast (ITA):</p><ul><li><p>The Weekly Pomodoro #8 - Some tips for wannabe/junior Developers trying to enter the IT job market</p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a> or <a href="https://open.spotify.com/show/2ivOpZJj1py7bcGpiCfeHp">Spotify</a>.</p><div><hr></div><h1>What if We do Ensemble Programming all the time? &#129489;&#127995;&#8205;&#128187;&#128105;&#127997;&#8205;&#128187;&#128104;&#127995;&#8205;&#128187;&#128104;&#127996;&#8205;&#128187;</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>Today, the issue will focus on collaborative coding - we're exploring the practice of Ensemble Programming.</p><p>In this issue, we will look at the fascinating subject of Ensemble Programming, including its ideas, advantages, and possible impact on software development processes. Ensemble Programming has the potential to transform the way we develop software by encouraging collaboration and improving code quality.<br><br>So make sure to be ready to read this with an open mind while I tell you the potential benefits of adopting Ensemble Programming as a mainstream practice in the software business.</p><p>Let's dive in! &#128187;&#10024;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W5wh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W5wh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W5wh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W5wh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W5wh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W5wh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg" width="452" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:452,&quot;bytes&quot;:150247,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W5wh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!W5wh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!W5wh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!W5wh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa2196342-f7d0-4e6c-aef9-6711b07d127c_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A Mob Programming session imagined by <a href="https://ideogram.ai/">Ideogram.AI</a></figcaption></figure></div><h3>From Mob to Ensemble</h3><p>Some of you probably heard about Ensemble Programming under a different name: this is a synonym of Mob Programming.</p><p>Ensemble/Mob Programming is a collaborative approach to software development in which the Software Development team works together in real time on one task. In addition to software coding, the team collaborates to complete almost all tasks that a typical software development team would perform, such as defining stories, designing, testing, deploying software, and working with the customer. Almost all work is completed through "working meetings" or workshops, and everyone participating in the software development process, including our partners, is considered a team member. </p><p>Ensemble Programming is clearly connected to Pair Programming, an XP practice that you probably heard enough times from me: I love to say that this is an evolutionary step beyond the eXtreme Programming practice of Pair Programming, even more, &#8220;eXtreme&#8221;. When practicing Ensemble Programming we prioritize face-to-face and side-by-side communication, team alignment, cooperation, entire team engagement, continuous code review, and self-organizing teams.</p><p>So, some of you might wonder&#8230; why the name change?</p><p>As you can read <a href="https://mobprogramming.org/mob-programming-where-did-you-get-the-name/">here</a>, the name Mob Programming was retrieved by Woody Zuill team when they set up this practice for the first time, and it felt like a good enough name for them. Then, Zuill started to advocate the practice, which became famous but&#8230; as mentioned <a href="https://www.lisihocke.com/2021/02/ensemble-is-the-new-mob.html">here</a> by Zuill himself:</p><blockquote><p>Many people had been appalled by the term "mob" and hence didn't want to give it a try. Thinking of bullying or lynch mobs, the term is triggering trauma.</p></blockquote><p>Therefore, in 2020, they decided to come up with a new name - and Ensemble Programming was the choice - a very good choice IMHO, that well expresses the intent of a &#8220;whole-team approach&#8221;. </p><h3>Is this even possible?</h3><p>I know what you all guys are thinking: &#8220;How can be sustainable to have the whole team work on a single task together? We need to parallelize, go faster, to produce more code! And the business will never buy into such an approach, btw!&#8221;.</p><p>I mean, if we said that Ensemble Programming is the &#8220;extreme&#8221; version of Pair Programming, it&#8217;s easy to expect that skepticism goes to his extreme also.</p><p>The problem, by the way, is always the same as when we discuss most Agile Practices: what do you think is &#8220;waste&#8221; in Software Development?</p><p>Waste in Software is a hard topic - but luckily  in the latest years, the software world has collected some data, and, together with Lean and DevOps principles, we can have a better understanding of this compared to 10/20 years ago.</p><p>Waste in software is made of a lot of things, some of them unexpected:</p><ul><li><p>unplanned work - a category containing work such as bugs, defects, and any other unexpected problem that might show up</p></li><li><p>features - the most unexpected type of waste; a <a href="https://www.pendo.io/resources/the-2019-feature-adoption-report/">research</a> from Pendo shows that features usage mirrors the Pareto Principle: only 20% of features are always used; among the other 80%, 24% of features are never used; this is a HUGE waste</p></li></ul><p>Some other type of waste exists, but those 2 are enough to show why Ensemble Programming is a great idea and improves the outcomes of the team.</p><p>First of all, how do we reduce unplanned work? The research in the book Accelerate shows that the percentage of unplanned work goes down from 27% for low-performing teams to 20% for high-performing teams. To achieve that, practices such as Continuous Integration and Trunk-Based Development have proved to be effective, according to the same research. In addition to this, working together works a lot better to improve quality code and share knowledge compared to Code Reviews, especially async once. </p><p>Therefore, the same benefits of pairing apply to mobbing and &#8220;goes extreme&#8221;: everyone works on everything, knows a lot, and continuously shares knowledge. No one can be a blocker for the team because &#8220;only he worked on such stuff&#8221;, or any similar example you can think of. We are still fundamental as individuals, by contributing to the work as a part of the team and not with individual contribution that we understand how to integrate when it&#8217;s done. </p><p>Ensemble Programming simplifies a lot of things: it&#8217;s a lot easier to apply Trunk-Based Development because we are all there and we can easily commit to master directly when we all agree on the solution; no review needed, no waiting time, the code goes straight to master and to a test environment.</p><p>But, what about features? Well&#8230; as we saw, building features shouldn&#8217;t be our priority - at all. Features are waste, we should work on them with an MVP and iterative approach as much as possible: build a small version of that feature, monitor its usage, and iteratively evolve it if the usage justifies it. </p><p>What we should optimize instead is lead time: the time that goes from idea/ticket creation to release in production. Optimizing that time will give us superpowers. As Lean and DevOps teach us, optimizing lead time means optimizing the flow of work - and limiting Work In Process (WIP) is a good way to achieve this. Again, we bring this to the extreme by applying Single-Piece Flow (WIP=1), working on one task at a time, as a whole team - therefore maximizing the flow of work.</p><p>Being able to go from idea to production requires also good design choices, of course - and working together we will maximize the quality of our design choices by having all our talent working on it and sharing a decision.</p><p>If you think about it, we typically see this happening naturally when a bug in production shows up: it happens quite often that the entire team groups around the problem while investigating the issue, looking together at logs, tests, etc to find the solution as soon as possible - and then, most of the times the fix happens also together,  PR can be skipped because everyone already knows about it and code can go straight to production. So, when an emergency shows up, we naturally decide that working together is the fastest way to release a solution, even if it&#8217;s a stressful moment - why shouldn&#8217;t be a good idea to do this more often, or even all the time?</p><p>To finish my considerations, I also want to emphasize that Ensemble is very great not only from a technical/productivity but also from a cultural point of view: working together builds trust and psychological safety; it makes burnout less likely to happen, and, in general, makes it easier to introduce a junior in the team, and results in easier business success. </p><p>Especially in a remote world, where it&#8217;s harder to build a sense of teamwork and trust each other, we should favor sync work and Ensemble Programming: frequent, positive interactions as an ensemble make it easier to build trust and discover shared values<strong>.</strong></p><h3>Practical tips</h3><p>Ok so - we have established that not only Ensemble Programming exists and makes a lot of sense for a lot of people - with proven data of its outcomes.</p><p>But I know how this works, and again I know what you guys are thinking - because I&#8217;ve been in your shows. This looks nice in theory, but impossible in practice.</p><p>So here I want to share some practical tips to start introducing Ensemble Programming in a team and see how it can work for you in your context - with some additional tips to set up it correctly and effectively from my experience.</p><h4><strong>Introduce Ensemble Programming to your team</strong></h4><p><strong>Start with Learning</strong></p><p>The first approach I can suggest is to start approaching learning as an ensemble; turn the learning time of the team into a team activity instead of an individual one: set book clubs and workshops, but also katas, coding challenges, and hackathons as whole team activities; the benefits of learning together will be visible, and the team will start to understand how working together gives better outcomes for most activities</p><p><strong>Introduce Ensemble with bugs and small tasks</strong></p><p>Typically, bugs and very small tasks are already handled in a special way than usual work; it&#8217;s very often that a hotfix can be merged in a special way than the usual PR process, for example - and the same usually applies to very small task such as one line changes that anyone in the team can do. Therefore, those are the best opportunities we have to introduce Ensemble: instead of investing time in aligning before letting one of the team do the work, just jump into doing it all together immediately.</p><p><strong>Make a first try</strong></p><p>Once you practiced the whole-team approach in small tasks a bunch of times, be ready to identify the best chance to apply it on a real task or bigger feature; ideally, it should be a piece of code where we already have a good agreement on the possible solution so that the conversation will be easier and the team can focus a bit more on the dynamics of working as an Ensemble. Don&#8217;t wait for the &#8220;ideal&#8221; task anyway - it will never come; just pick a task that at least a couple of the team have confidence in, and try it out!</p><p><strong>Make Ensemble the default</strong></p><p>Review the test session in a retrospective, collect what worked and what didn&#8217;t - and try to improve the setup to start making Ensemble Programming the default way of working for the team. It&#8217;s a one-way road, there is no going back once you see how amazing the result is - and you will never regret doing this.</p><h4><strong>Tips to improve Ensemble Programming sessions from my experience</strong></h4><p><strong>Create an environment to make Ensemble work comfortable</strong></p><p>People must be comfortable when working, and this is even more true when working in Ensemble; if you work in person, make sure there is a room dedicated to the Ensemble; there should be either a projector or a very big screen, more chairs than the people in the team - and ideally that kind of chairs that allow to easily look up, if you use a projector; ensure that is easy for everyone to quickly connect its own device (laptop, keyboard, mouse, etc) to ensure that everyone is feeling comfortable when driving the keyboard; if you do this remotely, make sure you use a tool for online meeting that allows for smart screen sharing, with the cameras always visible and the ability to draw on the screen for who is watching (it really helps conversations!!) - you can even use a collaboration tool to be able to work together on the code without committing, either on a local IDE or on a cloud environment, but be careful: committing often is a good practice, and being forced to commit something before changing the driven can be a helpful limitation.</p><p><strong>Make up a rotation rule and stick to it very strictly</strong></p><p>You have to set up some rules, and at least at the beginning when the team has little experience, it&#8217;s a good idea to strictly respect them. The most important rule is probably the one about rotation: there are multiple strategies to handle rotation when Pairing/Mobbing - if you are confident with TDD you can try ping-pong, where a member of the team writes a test, then immediately switch to another member that passes that test and write a new one, etc; or you can stick to a more standard chess-clock approach: just set up a timer, and switch the driver when the time is up. Make sure to let the team pick up their preferred strategy, the one that suits them the most: some teams prefer to stick to the timer very strictly, for example - when the time is up, you have to switch even unfinished work - while some others prefer to either rollback unfinished work or invest a couple more minutes to finish and commit.</p><p><strong>Have a team break strategy, but allow for free solo breaks</strong></p><p>The other most important rule when working in Ensemble, in my opinion, is the rule about breaks: it&#8217;s always important to have proper breaks during work, but it becomes fundamental when working in Ensemble because it requires some more energy. The best strategy here is to pick up a team break rule that matches with the rotation rule: for example, if you use ping-pong, you can still set up a timer and make a break when time is up. If you use a chess clock, instead, you can decide after how many timers there will be a break. Make the team set this up together, and make it explicit.</p><p>It&#8217;s always a good example to stick to some time and focus management strategy: the most famous is always the <a href="https://www.pomodorotechnique.com/">Pomodoro Technique</a>: 25 minutes of work, 5 minutes of break (15 minutes every 4 Pomodoros). You can easily match this technique with a chess-clock strategy, which I think it&#8217;s the easiest setup to start: 25 minutes of work, 5 minutes of break, then another 25 minutes with a different driver - and so on - and if 25 minutes looks very little, you can consider <a href="https://timmetz.medium.com/pomodoro-technique-and-other-work-rhythms-which-one-suits-you-34c2d05fe46e#:~:text=The%20other%20alternative&amp;text=Pomodoro%20Technique%3A%2025%20minutes%20of,minutes%20of%20work%2C%20extended%20break.">some alternatives</a>.</p><p>In addition to these team break rules, anyway, you should let people be free to take their own time: someone might have a bad day or need some time for any reason. Make an explicit rule about allowing people to take a break at any time, especially when they are not the driver, without even asking - and make sure that people are aware of this rule and feel safe to use it.</p><p><strong>Share a netiquette and make it transparent</strong></p><p>While I decided that 2 rules deserved their spot, is a good idea in general to write down the rule set of the Ensemble sessions in a shared netiquette: this is typically a great first task to work on as an Ensemble. </p><p>In the netiquette, make sure that everything is explicit - keep it simple, but clear, so that no understanding shows up. Of course, be always ready to improve it if any negative feedback shows up from experience - and if you do this as a team, it will be easier for people to &#8220;disagree and commit&#8221; while fixing and improving.</p><p>The purpose of the rules is not just to avoid discussion - is to make sure that the team commits to a shared understanding (which is why they should be decided by the team and not imposed) and they are responsible for themselves. They can set it up as they want, as soon as it works and produces a good outcome, and can keep improving it over time in autonomy. </p><p><strong>Involve non-dev people</strong></p><p>Whenever the team needs non-developer members of the team to progress with the work, involve them in the Ensemble. Typically, it works well to involve UX designers while finalizing the frontend development, for example - or involving a domain expert while building a new feature, spike, or experiment.</p><p>Involve the most people possible the more time possible - it can be hard work to let people outside developers the value of this and make sure to help them on this, but it&#8217;s game-changing. </p><p>For example, it typically is a great idea to write Acceptance tests together with domain experts and stakeholders - but putting them in front of code is very hard for them, so using a higher level language, even English, with explicit examples can work well and allow you to convert that in code. </p><p>An easier example is related to UX designers, that can typically be involved in the Ensemble while developing a Design System because 100% of the code has an impact on what they design.</p><p>Find a good balance between doing this in front of code (when it&#8217;s really necessary) or in a physical/digital workshop or anything else, but make sure that you spend some effort in involving also non-developers, even customers, in the Ensemble continuously.</p><p><strong>Monitor the right metrics</strong></p><p>This is true in any Software Development Team, but I want to discuss this to answer the question: &#8220;Can I monitor if it&#8217;s working?&#8221; - IMHO, the answer is: &#8220;Yes, if you monitor the good stuff&#8221;. </p><p><a href="https://docs.gitlab.com/ee/user/analytics/dora_metrics.html">DORA metrics</a> are still the best choice we have today, and you should expect to see them improve when starting work as an Ensemble. In addition to that, is always a good idea to set an Employee NPS every week or two to let people anonymously express how they feel and therefore check if there is improved feedback from the team. And also talk about it in the retrospectives and 1to1 meetings - conversations always help!</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p>Where is the proof that splitting the work between multiple people is effective at all? The goal is not to be productive but effective: being productive and not effective is usually a good way to produce waste quickly.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/4bUMdE6">Software Teaming: A Mob Programming, Whole-Team Approach</a> </strong>- the reference book on the practice, by Woody Zuill itself.</p></li><li><p><strong><a href="https://amzn.to/3wyMsoi">Code With the Wisdom of the Crowd: Get Better Together With Mob Programming</a></strong> - See how to avoid the most common pitfalls that teams make when first starting out.</p></li><li><p><strong><a href="https://amzn.to/3TjnDW8">Remote Mob Programming: At home, but not alone.</a> </strong>- Remote Mob Programming combines two ways of working: Mob Programming and working as a distributed team.<strong> </strong></p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://ericnormand.substack.com/p/ensemble-programming-is-more-efficient">Ensemble programming is more efficient</a></strong></p></li><li><p><strong><a href="https://craftingtechteams.substack.com/p/team-lessons-found-only-in-ensemble">Team Lessons Found Only in Ensemble (Mob) Programming</a></strong></p></li><li><p><strong><a href="https://craftingtechteams.substack.com/p/how-high-performing-teams-review">How High-Performing Teams Review Code</a></strong></p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://www.infoq.com/news/2016/06/mob-programming-zuill/">Mob Programming - an Interview with Woody Zuill</a></strong></p></li><li><p><strong><a href="https://www.kosli.com/blog/8-reasons-why-we-do-ensemble-programming/">8 reasons why we do ensemble programming</a></strong></p></li><li><p><strong><a href="https://leaddev.com/process/how-build-strong-culture-ensemble-programming">How to build a strong culture with ensemble programming</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://open.spotify.com/show/01npjdd1VRiNqw1RZ8aB5g">The Mob Mentality Show</a></strong></p></li><li><p><strong><a href="https://open.spotify.com/episode/7y7KJJq5bTDK9svRdqggsJ">Mob Programming with The Mob Programming Team</a></strong></p></li><li><p><strong><a href="https://open.spotify.com/episode/3XDgQp0VdWqN16TK00HgMe">Woody Zuill on Mob Programming and Influencing Change</a></strong></p></li></ul><h3>&#128421;&#65039; Videos</h3><ul><li><p><strong><a href="https://www.youtube.com/watch?v=p_pvslS4gEI">A day of Mob Programming</a> (Woody Zuill)</strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=qjE1O9Zdm3U">AVOID These Mob Programming / Ensemble Mistakes</a> (Emily Bache)</strong></p></li></ul><div><hr></div><h1>&#128161;Master Agile Methodologies with Learn Agile Practices</h1><p>Are you a Software Developer eager to accelerate your growth and become a senior developer? Discover what Learn Agile Practices offers to help you on our <a href="https://learnagilepractices.substack.com/about">About page</a>. </p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><h6><em>&#128227; Remember: as a subscriber to this newsletter, you have a dedicated discount for any of our digital products/services. You can find it in your subscription email confirmation, or just hit me via email or social media and I will send it again! &#128521;</em></h6>]]></content:encoded></item><item><title><![CDATA[London vs Chicago: The two ways of TDD 🔀]]></title><description><![CDATA[Whenever you get closer to TDD, you discover that two main approaches (schools) exist: they are called London School and Chicago School. But what are the differences? Let's see it together!]]></description><link>https://learnagilepractices.substack.com/p/london-vs-chicago-the-two-ways-of</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/london-vs-chicago-the-two-ways-of</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 12 Mar 2024 06:01:05 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!bVuQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h4><strong>&#128204; In case you missed it last week</strong></h4><p>Last newsletter issue:</p><ul><li><p>eXtreme Programming for Remote Teams: XP is the parent of a lot of best practices known today: when it comes to remote teams, anyway, some of its values, principles, and practices seem to be incompatible... but is this the truth?</p></li></ul><p>Read the full article and all the previous ones in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>Video Podcast (ITA):</p><ul><li><p>The Weekly Pomodoro #7 - How to approach learning TDD effectively</p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a> or <a href="https://open.spotify.com/show/2ivOpZJj1py7bcGpiCfeHp">Spotify</a>.</p><div><hr></div><h1>London vs Chicago: The two ways of TDD &#128256;</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>We go back to talk about Test-Driven Development (TDD) today, with a little twist&#8212;we're exploring the two main different approaches of the two iconic TDD schools: London and Chicago.</p><p>Each TDD school brings its unique flavor to the table, offering a different perspective on how to approach software testing and development with TDD. In this article, we'll describe the two approaches and compare them.</p><p>In an imaginary travel from America to England, let&#8217;s see what London and Chicago Schools have to offer for TDD practitioners.</p><p>Let's dive in! &#128187;&#10024;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bVuQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bVuQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bVuQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bVuQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bVuQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bVuQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg" width="460" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:460,&quot;bytes&quot;:208153,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bVuQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!bVuQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!bVuQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!bVuQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F03950f5e-3785-45e7-9e32-23caf1fa105f_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is how <a href="https://ideogram.ai/">Idegram.AI</a> imagines the fight between London and Chicago: which city is whom?</figcaption></figure></div><h3>A Tale of Two Cities</h3><p>First of all, I want to make sure everyone knows what I&#8217;m referring to when I mention London or Chicago schools.</p><p>When we first meet TDD, we typically first see it via the Chicago School: a.k.a. Detroit School, this school follows an Inside-Out approach; this provides a more exploratory, state-based way to solve the problem by starting from the inside of the application (from the core domain models, for example) and works out towards the APIs.</p><p>Most of the time, this is the typical approach I see when it comes to tutorials and examples online, especially those for beginners - probably just because it&#8217;s easier to start making examples on small pieces of code and then putting them together afterward.</p><p>Usually, the pros and cons of the Chicago School are considered to be:</p><ul><li><p>Pros</p><ul><li><p>since typically the collaborators we need already exist, It&#8217;s easier to keep tests decouples from the implementation, and the use of Test Doubles is minimized</p></li><li><p>It&#8217;s easier to have a higher cohesion because we start with very specific tests to more generalized ones - and this promotes high cohesion</p></li></ul></li><li><p>Cons</p><ul><li><p>It&#8217;s harder to respect the YAGNI principle and avoid over-engineered solutions - while TDD still reduces these risks, going from the inside to the outside can still bring to some of these situations because you look at the higher level later</p></li></ul></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ezr0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ezr0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 424w, https://substackcdn.com/image/fetch/$s_!Ezr0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 848w, https://substackcdn.com/image/fetch/$s_!Ezr0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 1272w, https://substackcdn.com/image/fetch/$s_!Ezr0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ezr0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png" width="344" height="437.503355704698" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/eeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:758,&quot;width&quot;:596,&quot;resizeWidth&quot;:344,&quot;bytes&quot;:122365,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ezr0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 424w, https://substackcdn.com/image/fetch/$s_!Ezr0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 848w, https://substackcdn.com/image/fetch/$s_!Ezr0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 1272w, https://substackcdn.com/image/fetch/$s_!Ezr0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Feeda6875-9b5e-4c5d-b717-a93c39f11bcd_596x758.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Chicago School Pros and Cons</figcaption></figure></div><p>The London School, on the other hand, follows the opposite Outside-In approach; this provides a formal, behavior-based way to solve the problem by starting from the outside of the application (from the APIs or controllers, for example) and working its way through the lower layers. </p><p>This school is called in multiple ways (Mockist TDD, or the most famous ATDD, which stands for Acceptance Tests Driven Development) and is the approach that you typically face after you start being fluent with TDD in general.</p><p>Usually, the pros and cons of the London School are considered to be:</p><ul><li><p>Pros</p><ul><li><p>It&#8217;s an approach more focused on the behavior of the application and the interface used by the user - like in Contract-First API development, you start by thinking about how the client will interact with your code, and then move more on the inside later</p></li><li><p>CQS (Command-Query Separation principles) is easier to implement: CQS is an approach that promotes classes that have only methods that either read data or change data, which improves readability and maintainability</p></li></ul></li><li><p>Cons</p><ul><li><p>Higher risk of more fragile tests: starting from the outside will require using mocks to replace the collaborators we need and still don&#8217;t exist; we need to be careful and use best practices here to ensure that we don&#8217;t tight too much to the implementation, otherwise our tests will break at every change; one example? Favor manual written Fakes and Spies instead of Stub and Mocks set up with mock libraries</p></li><li><p>Refactoring might be harder: for the same reason, if we tighten too much our tests to the implementation, every refactoring will also require changing tests - and this is just wrong since refactoring should be done by never breaking our tests; be careful with those mocks!</p></li></ul></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XisN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XisN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 424w, https://substackcdn.com/image/fetch/$s_!XisN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 848w, https://substackcdn.com/image/fetch/$s_!XisN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 1272w, https://substackcdn.com/image/fetch/$s_!XisN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XisN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png" width="336" height="384" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:704,&quot;width&quot;:616,&quot;resizeWidth&quot;:336,&quot;bytes&quot;:138824,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XisN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 424w, https://substackcdn.com/image/fetch/$s_!XisN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 848w, https://substackcdn.com/image/fetch/$s_!XisN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 1272w, https://substackcdn.com/image/fetch/$s_!XisN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F22d1ad31-3822-40f0-acfe-e6f3a34e3ab9_616x704.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">London School Pros and Cons</figcaption></figure></div><h3>The best of two Worlds</h3><p>The two approaches both have pros and cons, and it&#8217;s important to learn them and then make use of the good side of both. But let&#8217;s make this clear: the point is not about choosing one of the two. The point is to understand them both to build an integrated adoption of these two schools.</p><p>For example, in a standard process of building a new feature that the client will use via API, I typically start the work following London Outside-In School: this way, I start focusing on the way the client will make the request, and which response he expects, to start building first from the interface he will use. Similar to the Contract-First API approach, this is a good way to ensure that the way you talk with the client is not coupled to the implementation - because the implementation still doesn&#8217;t exist. It&#8217;s a great fit, because the controller in a good architecture will typically only handle the request validation, and then talk to the Service that will implement the behavior. And if we follow CQS, creating a fake/spy for our queries/command handlers is the best way to use Test Doubles.</p><p>Chicago School is typically more useful to me when it comes to the Service because this is where the behavior will happen. First of all, sometimes the behavior is complex and the problem is hard to understand - and this is where the power of TDD comes out the most. Second of all, here we will probably have some collaborators because we might need to change the state of our application (write on a cache, file, database, or whatever - or change a runtime value) or interact with an external API. </p><p>When the need for those collaborators is clear from the start, I typically start by building those, focusing on how they specifically work (if I don&#8217;t know yet), and then putting the behavior together. I will then decide if it&#8217;s best to have a Double or use the concrete implementation in the test of the Service. When the behavior is less clear, instead, I have a hybrid approach: I typically start by implementing it all in the service in a &#8220;Chicago way&#8221; like it&#8217;s the lowest piece of the puzzle and then extract the pieces that make sense to isolate. The same decision about keeping the real concrete of the new collaborator extracted or replacing it with a Double in the test will need to happen here.</p><h3>Craft your way to TDD</h3><p>Finally, I want to share with you some tips from my experience about how to start practicing, and then practicing and one day even mastering, TDD - and which of the two Schools to favor.</p><p>As you can imagine, the answer is: &#8220;It depends&#8221;. The target should be to understand them both, and like I did in the example of the previous section, understand how to put them in your context and mix them to achieve the best outcomes possible.</p><p>My first tip is for beginners: at first, you should strictly follow the cycle, the law, and the best practices as they are described in TDD books, especially the original one from Kent Beck. The reason is that when we are learning something, having rules to respect is easier - and then when they become a habit and you already see some of their benefits, it&#8217;s easier to learn even more of why that works and how to become even better.</p><p>The second tip is for people that already started to become fluent with TDD at least on Katas and Side Projects: make the leap and start using TDD in real features. If you work on a legacy system, start using TDD with new code, where it doesn&#8217;t have to necessarily impact the old one. Then, move to bigger features, discover how to add tests to non-tested code properly (a bit of Refactoring is needed here), and progressively raise the bar. And then, as soon as you have the chance to work on a greenfield project, develop the system from scratch in TDD.</p><p>The third tip is for a bit more experienced developers who have worked in TDD for some years: if you never did it, consider re-reading the book from Kent Beck - I&#8217;ve done it a couple of times more after the first one, and especially the 2nd part about TDD patterns is always a discovery of new tips that you can more easily understand when you have some experience - that book is not just a tool to start, but it can also help you master TDD. In the alternative, there are some other great books that talks about TDD - check the &#8220;Go Deeper&#8221; section for my tips - and they can always give you an alternative point of view that helps your growth.</p><p>And then, finally, I have a bonus tip for skeptics: try to give TDD a chance. A real one! Trying to do TDD in real production code without practicing before - or practicing only once - it&#8217;s not a real, proper chance. I understand that some might be reluctant to the approach, but there is evidence out there proving that TDD (and some other practices such as CI, Trunk-Based, etc) produce better outcomes. My suggestion is to give yourself at least 8 hours of practicing: doesn&#8217;t matter if it&#8217;s continuous time, or splitter in 30 minutes per day (if you practice, make sure you do at least one Pomodoro) - but I think that 8 hours of practicing, while reading books or other learning content when we face struggles, is the minimum time required to be sure you started understanding something concretely. And even if you still don&#8217;t like TDD at that point, I&#8217;m sure that at least it will give you something to think about.</p><p>In the end, the key is to embrace the essence of TDD: iterative development, continuous testing, and a relentless focus on quality.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p><strong>It's not just </strong><em><strong>writing the test</strong></em><strong>, we are </strong><em><strong>designing while we're writing the test.</strong></em></p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/49ljN4v">Test-Driven Development: by Example</a> </strong>- Quite simply, test-driven development is meant to eliminate fear in application development. Kent Beck teaches programmers by example, so they can painlessly and dramatically increase the quality of their work.</p></li><li><p><strong><a href="https://amzn.to/49M6c6b">Growing Object-Oriented Software, Guided by Tests</a> </strong>- A practical guide to TDD that takes you beyond the basic concepts. Drawing on a decade of experience building real-world systems, two TDD pioneers show how to let tests guide your development and grow software that is coherent, reliable, and maintainable.</p></li><li><p><strong><a href="https://amzn.to/3wqAuwZ">Agile Technical Practices Distilled</a> </strong>- The book that changed my career: it explores the fundamental practices of Agile working, including test-driven development (TDD), refactoring, pair programming, and continuous integration.</p></li><li><p><strong><a href="https://amzn.to/48sbAKC">Accelerate</a> </strong>- Readers will discover how to measure the performance of their teams, and what capabilities they should invest in to drive higher performance. Spoiler: one of those is TDD!</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://tidyfirst.substack.com/p/canon-tdd">Canon TDD</a> </strong>(by Kent Beck itself!)</p></li><li><p><strong><a href="https://engineeringorg.substack.com/p/everything-i-know-about-tdd">Everything I know about TDD</a></strong></p></li><li><p><strong><a href="https://albexl.substack.com/p/the-basics-of-test-driven-development">The Basics of Test-Driven Development with a Focus on Data Structures</a></strong></p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://www.telerik.com/blogs/30-days-tdd-day-one-what-is-tdd">30 Days of TDD: Day One &#8211; What is TDD and Why Should I Use It?</a></strong></p></li><li><p><strong><a href="https://symflower.com/en/company/blog/2023/how-to-get-started-with-tdd/">How to get started with Test-Driven Development</a></strong></p></li><li><p><strong><a href="https://www.tddfellow.com/blog/2016/08/30/getting-stuck-while-doing-tdd-part-1-example/">Getting Stuck While Doing TDD. Part 1: Example</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://www.thoughtworks.com/insights/podcasts/technology-podcasts/tdd-for-today">TDD for today (ThoughtWorks)</a></strong></p></li><li><p><strong><a href="https://www.everand.com/podcast/419000640/76-TDD-Don-t-be-afraid-of-Test-Driven-Development-Chris-May-Test-Driven-Development-TDD-can-be-intimidating-to-try-In-this-episode-Chris-May">TDD: Don&#8217;t be afraid of Test-Driven Development - Chris May</a></strong></p></li><li><p><strong><a href="https://podcasters.spotify.com/pod/show/99x/episodes/Test-Driven-Development-TDD-in-Angular-eqj2lb">Test Driven Development (TDD) in Angular</a></strong></p></li></ul><h3>&#128421;&#65039; Videos</h3><ul><li><p><strong><a href="https://www.youtube.com/watch?v=yfP_v6qCdcs">Test Driven Development Tutorial For Beginners</a></strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=6Xq8EdSypLw">Test Driven Development TDD Crash Course 2022 | What is TDD in Java | Learn Java TDD - English</a></strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=a1jdwlujdk0">Introduction to Test-Driven Development (TDD) with TypeScript | 2021</a></strong></p></li></ul><div><hr></div><h1>&#128161;Master Agile Methodologies with Learn Agile Practices</h1><p>Are you a Software Developer eager to accelerate your growth and become a senior developer? Discover what Learn Agile Practices offers to help you on our <a href="https://learnagilepractices.substack.com/about">About page</a>. </p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><h6><em>&#128227; Remember: as a subscriber to this newsletter, you have a dedicated discount for any of our digital products/services. You can find it in your subscription email confirmation, or just hit me via email or social media and I will send it again! &#128521;</em></h6>]]></content:encoded></item><item><title><![CDATA[eXtreme Programming for Remote teams]]></title><description><![CDATA[XP is the parent of a lot of best practices known today: when it comes to remote teams, anyway, some of its values, principles, and practices seem to be incompatible... but is this the truth?]]></description><link>https://learnagilepractices.substack.com/p/extreme-programming-for-remote-teams</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/extreme-programming-for-remote-teams</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 05 Mar 2024 06:00:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!S4IJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome back to Learn Agile Practices, the home of continuous improvement and learning for Software Developers.</p><p><strong>&#128204; In case you missed it</strong></p><p>In the last issue last week, I wrote about Async stand-Ups: is it really a good idea to go async with such practice? I don&#8217;t believe it is: if you haven&#8217;t yet, you can read my controversial opinion in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>And for those of you who speak Italian, this is what you can find on my video podcast from last week:</p><ul><li><p>The Weekly Pomodoro #6 - You can apply CQRS without Event Sourcing&#8230; and you should!</p></li><li><p>Dev Debate #2 - Accelerate, Continuous Integration and burnout w/ Ruggero Visintin</p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a> or <a href="https://open.spotify.com/show/2ivOpZJj1py7bcGpiCfeHp">Spotify</a>.</p><p><strong>&#128293; Available for mentoring and coaching</strong> </p><p>I&#8217;m always available for some mentoring and coaching to other software developers! Feel free to reach me: we will know each other and discuss what path can be best for you, from a free monthly mentoring path to a more frequent one or a 1-to-1 coaching service specifically on your needs!</p><p>&#128073; Feel free to reply to this email or reach me on any social media: all the details on my <a href="https://danthedev.carrd.co/">website</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>eXtreme Programming for Remote teams</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>I&#8217;m a big advocate of eXtreme Programming, as most of you already know: since the first time I read &#8220;eXtreme Programming: Explained&#8221;, this methodology has become part of my daily job as a Software Developer and it&#8217;s the core of what I typically bring as suggestion when I&#8217;m technical coaching.</p><p>Then, remote work became a habit and it seems that the direction where this type of work is going is diverging from the values and principles of XP itself; most people think that XP (and Agile) practices are not compatible with remote - but is this actually the truth?</p><p>Let&#8217;s dive into the issue and discover what I think about this!</p><pre><code>&#128161; This is the "sequel" of an old issue: I will expand and explore the topic here, focusing more on XP, but if you want, you can read the first part &#128073; <em><strong><a href="https://learnagilepractices.substack.com/p/the-surprising-truth-about-xp-and">here</a></strong></em>.</code></pre><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!S4IJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!S4IJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S4IJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S4IJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S4IJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!S4IJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg" width="468" height="468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:468,&quot;bytes&quot;:100916,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!S4IJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!S4IJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!S4IJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!S4IJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd96313c4-af92-4619-b647-bbfc0761a39d_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is what <a href="https://ideogram.ai/">Ideogram.AI</a> thinks a Remote Pair Programming session looks like.</figcaption></figure></div><h3>Values and principles are universal</h3><p>XP was my first step into the Agile world, and it was enlightening. I always tell this story: when I first heard about a methodology called &#8220;eXtreme Programming&#8221;, I immediately thought it was related to coding for hours overnight like in some movies - the word extreme in the name is pretty misunderstandable, to be honest.</p><p>Then I read the book and the reason for the name became more clear: </p><div class="pullquote"><p>It&#8217;s called &#8220;eXtreme Programming&#8221; because the idea is to take all the things that have proved to work well in programming and take them to their extreme. <br><br>Do writing tests work? Do it first!<br>Does working together work? Do Pair Programming all the time!<br>Does releasing more often work? Do it every day!<br><br>&#8230; and so on</p></div><p>The idea is simple, yet revolutionary: if a thing works well, let&#8217;s do it more often. Let&#8217;s do it always! Why not?</p><p>From a high-level perspective, XP is something everyone can easily agree on: the 5 values (communication, simplicity, feedback, courage, respect) are something that most developers themselves can think of as ideal values for their work. We all want effective communication, simplifying our work, and respect - and we can easily discover the importance of feedback and courage.</p><p>Similarly, principles are still enough high-level that most people will easily agree: if you ever meet someone who doesn&#8217;t agree with principles such as humanity, mutual benefit, improvement, diversity, etc&#8230; - well, run away as fast as you can!</p><p>It&#8217;s great that XP is based on such universal concepts, of course: this can help in setting up a conversation about it because we can easily start with a shared agreement on them. On the other side, this is just too high level: making values explicit is important because, without values, practices quickly become rote, activities performed for their own sake but lacking any purpose or direction.</p><p>Practices, on the other hand, are evidence of values. Values are expressed at such a high level that I could do just about anything in the name of value. Practices are clear.</p><p>Principles bridge the gap between values and practices. Principles are domain-specific guidelines for life, that starting from values can lead to practices that respect all of them. </p><p>By far, IMHO, everything related to XP Values and Principles is &#8220;location independent&#8221; - meaning that remote work has no impact on their application: we want our organization to be respectful, communicate well, favor diversity, etc - no matter if we are remote or not.</p><h3>XP practices for remote teams</h3><p>Practices are the kind of things you will see XP teams doing daily.</p><p>Applying a practice is a choice: XP offers a collection of practices that work and work even better together, and they have been used before, and those are the practices listed in Kent Beck&#8217;s book. Practices only make sense if related to principles, otherwise, they become rote; pairing just to make your boss happy is frustrating, but if you recognize its values in communication, feedback, simplicity, courage, and respect it makes a lot of sense.</p><p>But remember that practices are situation-dependent: if the situation changes, you will choose different practices to meet those conditions. </p><p>Values don't change, and principles can be used to figure out something new.</p><p>Today, I want to focus on some of the practices suggested by XP: I will focus on the most important (in my opinion, of course) but also on the one that can more easily be seen as harder when remote, to share my thoughts about the impact of remote work on them.</p><h4>Sit Together</h4><p>Let&#8217;s start directly with one of the easiest practices to put into discussion when working remotely: &#8220;Sit Together&#8221; means that people should work in a shared space big enough for the whole team. Of course, this is just not possible if we are working remotely&#8230; but the reality is that we don&#8217;t have to interpret this practice in such a concrete way. </p><p>Kent Beck itself, in the 2nd edition of the book, added some additional notes related to remote work, and states that multisite teams can do XP: the point is that practices are just predictions - here, for example, the prediction is that the more face time you have, the more human and productive the project will be. </p><p>But today, technology can  easily help and make teamwork remote: we can easily set up virtual rooms, with both video and audio and also the chance to share screens and documents - and we can also move some of that conversation async (not all, not even most, only some!).</p><p>Of course, if you have problems related to teamwork think about ways to sit together, even if it requires traveling.</p><h4>Pair Programming</h4><p>My dear Pair Programming! It always comes back in my writings, at some point. I&#8217;m referring to Pairing because it is explicitly quoted in the book, but this point can also be applied to Ensemble Programming (aka Mob Programming, which we can simplify to &#8220;pairing with the whole team&#8221; - and what is Mob if not the &#8220;extreme&#8221; version of Pairing? &#128521;</p><p>Pair Programming is already hard enough to make a habit when working in the same space for a lot of developers - which is sad, in my opinion - so it is no surprise that even more people think it&#8217;s harder when working remotely.</p><p>I think that, if we have a good enough setup, it&#8217;s the same: we can easily share a screen today, or use a collaborative tool that allows multiple people to change the code together; we can easily have a webcam always on so that we can always see each other and talk to each other; we can easily share an online board like Miro for some brainstorming or sharing ideas; technology is growing and evolving daily, and it will help always more.</p><p>There is only one thing about Pair/Ensemble Programming that is still important when in person, but it becomes fundamental when remote: taking breaks! When working remotely, we have the additional fatigue coming from all the conversation happening on a screen, typically also with headsets - so having regular breaks is not just a good idea, it&#8217;s required to keep the work healthy.</p><h4>Code and Tests</h4><p>This practice is not much known as the others, but I think it&#8217;s important to share some thoughts about how we can adapt XP practices keeping values and principles in mind: &#8220;Code and Tests&#8221; suggests that code and test should be the only piece of work maintained from the team; any other document should be generated from them, and we should rely on social mechanisms to keep alive the important history of the project.</p><p>This practice is a companion for the Agile principle of &#8220;working software over comprehensive documentation&#8221; - we should be able to make the team only work on code and tests, and any other artifact such as documentation should be generated from them.</p><p>First of all, this description is ideal and it&#8217;s very hard that we can do that, no matter where the members of the team work from. But still, it should be our target. That&#8217;s why is a good idea to generate a Swagger doc from annotations in the code, for example.</p><p>The main issue with this practice when going remote is that &#8220;social mechanisms&#8221; are different, and sharing information is harder and less natural; on one side, we can fight this by working in sync - I know that the industry goes the opposite way, but remember: async is good only for some things, not all, not even most of things. On the other side, we need to invest some time in writing down information and making it accessible - but be careful, this doesn&#8217;t necessarily mean writing down documentation.</p><p>Do we need to share how to set up the project? Let&#8217;s create a script to automate that - it will make it easier to onboard new people, and they will still be able to read the script code to discover what it does.</p><p>We need to document decisions? Implement ADRs in a dedicated repository using MD files - and you could even build automation to publish them and make them searchable.</p><p>This kind of approach has a much higher ROI compared to simple documentation.</p><h4>Continuous Integration</h4><p>Continuous Integration means that our code has to go into the main branch at least once per day. It is a synonym of Trunk-Based Development, and it is the opposite of Feature Branches. It is also not the best friend of Async Pull Request, but they can live together if the team is responsible.</p><p>I know that Feature Branches are something that also teams working in the same place do most of time - for some reason, this way of working has become so popular - but I feel that it&#8217;s even more used by remote teams. In general, remote teams tend to accept isolation of work for individuals for a long time - this helps the work-life balance, they say. It&#8217;s just not true.</p><p>Anyway, there is no specific solution related to remote here: my suggestion is just to try to force yourself to have branches that live 24 hours at most, and see what happens - you will discover a powerful technique. </p><p>Additional point: since your team will have a good number of reviews if you start having 1-day branches, people will collaborate more in a natural way - and you can even consider a different approach to PRs such as &#8220;Skip/Ship/Show&#8221;.</p><h4>Real Customer Involvement</h4><p>The last practice I want to talk about is about involving customers in our daily work: we should make people whose lives and businesses are affected by your system part of the team. Visionary customers can be part of quarterly or weekly planning.</p><p>You will get different results with real customers involved. When you act trustworthy and have nothing to hide, you are more productive. This is already hard and rare enough in general, and it can appear harder to achieve in a remote work context.</p><p>I believe that if your company has a culture of involving the customers, you will be able to do it independently from being remote or not. Again, if the customers are tech-savvy enough, technology can easily help nowadays - and if customers are not that tech-savvy to do it on their own, you can invest some workforce in helping them share their thoughts in other ways.</p><h3>Conclusions</h3><p>I think we can safely say that we can try to implement eXtreme Programming even if we are working remotely; the most important thing is that we need to be sure to respect values and principles, that are the foundation of a good, healthy company and tech culture. </p><p>Once we are aligned on those, we can easily pick the practices that we all agree on, and start from there; then, we can respond to our issues by testing other practices or by creating our own.</p><p>Embrace XP, you will never regret it! </p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p>XP is about social change. It's about letting go of habits and patterns that were adaptive in the past but now get in the way of us doing the best work.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3SU8pHa">Extreme Programming Explained: Embrace Change</a> - </strong>this is just THE book on the topic - make sure to read it before starting your XP journey. It&#8217;s clear, simple to read, and gives a lot of inspiration about our work in general.</p></li><li><p><strong><a href="https://amzn.to/3SJr3zU">Extreme Programming: Installed</a> -</strong> The book consists of a connected collection of essays, presented in the order the practices would be implemented during a project. Ideal as both a start-to-finish tutorial and quick reference, the book demonstrates exactly how XP can promote better communication, quality, control, and predictability.</p></li><li><p><strong><a href="https://amzn.to/3HZaGKy">Agile Technical Practices Distilled</a> - </strong>This book uses the term Agile as a wide umbrella and covers Agile principles and practices, as well as most methodologies associated with it - XP included.</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://tidyfirst.substack.com/p/scaling-extreme-programming-dependencies">Scaling Extreme Programming: Dependencies</a></strong></p></li><li><p><strong><a href="https://tidyfirst.substack.com/p/appreciating-your-way-to-xp">Appreciating Your Way to XP</a></strong></p></li><li><p><strong><a href="https://learnagilepractices.substack.com/p/the-surprising-truth-about-xp-and">The Surprising Truth About XP and Agile in Remote Work Environments</a></strong></p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://www.codurance.com/publications/xp-in-remote">XP in remote times</a></strong></p></li><li><p><strong><a href="https://ahmadatwi.me/2019/07/03/5-xp-practices-that-will-make-your-remote-team-more-effective/">5 XP practices that will make your remote team more&nbsp;effective</a></strong></p></li><li><p><strong><a href="https://tanzu.vmware.com/content/blog/extreme-programming-remote-teams">Making Extreme Programming Work for Remote Teams</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://www.podchaser.com/podcasts/practising-xp-extreme-programm-213795">Practising XP (Extreme Programming)</a></strong></p></li></ul><h3>&#128421;&#65039; Videos</h3><ul><li><p><strong><a href="https://www.youtube.com/watch?v=fjc5xqRJQBE">How does an XP team operate?</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Are we sure async Daily Stand-ups are a good idea? 🤔]]></title><description><![CDATA[As remote work reshapes our routines, async Daily Stand-ups emerge as a tempting alternative. But are they truly a game-changer?]]></description><link>https://learnagilepractices.substack.com/p/are-we-sure-async-daily-stand-ups</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/are-we-sure-async-daily-stand-ups</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 27 Feb 2024 06:01:01 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!GonI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome back to Learn Agile Practices, the home of continuous improvement and learning for Software Developers.</p><p><strong>&#128204; In case you missed it</strong></p><p>In the last issue last week, I shared my thoughts about the CQRS pattern: I highlighted the pros and cons of that pattern and shared why I think it deserved more spotlights, not necessarily paired with some other pattern like Event Sourcing. If you haven&#8217;t yet, you can read it in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>And for those of you who speak Italian, this is what you can find on my video podcast from last week:</p><ul><li><p>The Weekly Pomodoro #5 - Accelerate and the importance of Agile practices</p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a> or <a href="https://open.spotify.com/show/2ivOpZJj1py7bcGpiCfeHp">Spotify</a>.</p><p><strong>&#128293; Available for mentoring and coaching</strong> </p><p>I&#8217;m always available for some mentoring and coaching to other software developers! Feel free to reach me: we will know each other and discuss what path can be best for you, from a free monthly mentoring path to a more frequent one or a 1-to-1 coaching service specifically on your needs!</p><p>&#128073; Feel free to reply to this email or reach me on any social media: all the details on my <a href="https://danthedev.carrd.co/">website</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>Are we sure async Daily Stand-ups are a good idea? &#129300;</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>In this issue, my battle against going async for everything when working remotely takes another step &#128515;: I will talk to you about Daily Stand-up meetings!</p><p>This practice is one of the most used (and abused) among all the Agile practices, and it has been misinterpreted and misused for a lot of years (the usual example is that it becomes an update meeting) - and now that working remotely has become very common, a lot of tools that implement an &#8220;async&#8221; stand-up are used by a lot of teams, adding another misuse of the practice.</p><p>Today, I will try to describe what purpose such meetings are supposed to achieve, and why they are important, going back to what I think is one of the most underestimated objectives of Agile: collaboration!</p><p>Since I came up with the idea of this post from <a href="https://www.linkedin.com/posts/activity-7160180253925990400-AMMi/">this</a> post on LinkedIn, and some comments below, you should have a look at it before reading this - I will still make a short intro through it anyway.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GonI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GonI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GonI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GonI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GonI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GonI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg" width="452" height="452" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:452,&quot;bytes&quot;:143065,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!GonI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!GonI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!GonI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!GonI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ccbf86d-e86c-440a-bf3c-8c04275621e9_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This is what <a href="https://ideogram.ai/">Ideogram</a> thinks a Daily Stand-up meeting in person looks like.</figcaption></figure></div><h3>The real purpose of a Daily Stand-up meeting </h3><p>The Daily Stand-up Meeting is one of the most used among all the Agile practices - and also one of the most abused, misused, and misunderstood. </p><p>Let&#8217;s start with a generic definition: the daily Stand-up is the practice of grouping the team 15 minutes per day in a meeting where everyone takes the word for a minute, typically responding to 3 questions:</p><ol><li><p>What did I do yesterday?</p></li><li><p>What will I do today?</p></li><li><p>Do I have any blocker or issue, or do I need any sort of help?</p></li></ol><p>We can sum up the goals of this practice into two things: status updates (question 1) &amp; planning the day (questions 2 and 3): the purpose is to sum up what each of us did yesterday, and then plan the new day of work together.</p><p>Over the years, I&#8217;ve seen and heard of multiple common anti-patterns in daily stand-up implementation, doesn&#8217;t matter if in person or remotely:</p><ul><li><p>too much focus on the status update: people simply recap what they did yesterday and what they expect to do today, mainly talking to the PM to let him know and eventually discuss blockers</p></li><li><p>too much focus on individual work: people are only focused on their moment of speaking, but have no interest in listening to the other members of the team because the work is intended to be individual</p></li><li><p>too much focus on the timing: respecting the time frame (typically 15 minutes) becomes more important than achieving the goal of the meeting</p></li><li><p>putting it in the middle of the day: as in the LinkedIn <a href="https://www.linkedin.com/posts/activity-7160180253925990400-AMMi/">post</a>, since people tend to get tired of stand-ups when they are only used as a status update, they start finding solutions to make it less tedious for the team; moving it in the middle of the day typically helps to achieve this, because people thinks &#8220;I already hate enough having a status update every day, at least do not force me to arrive early in the morning and talk as a first thing in the day&#8221; - understandable, since the meeting is completely non-sense when only focused on status updates.</p></li><li><p>going async: a different response that remote teams have to feel tired of status update stand-ups is to make them async; using some online tool, people can send their update at any time and in multiple formats (some use text messages, some use short videos, etc..) without the need to enter a sync meeting; that would be a good idea if the goal of the standup was the status update - but as I already said, that is not the main goal, is just a small part of it.</p></li></ul><p>Those anti-patterns are typically the consequences of a non-ideal approach to Software Development: teams that don&#8217;t approach Software Development as a team effort. What most team still does today is to work as individual contributors on a shared codebase: each team member gets a ticket assigned by the PM (doesn&#8217;t matter if the P stands for Project or Product here) and works on that for the time required (at least some days, typically). Once they are done, they open a PR, discuss it with others (typically async via GitHub comments), and then merge it. </p><p>What Agile, XP, and Lean suggest, each in their way, is a different approach: <strong>Software Development works best when done as a team effort work</strong>. People should work more closely together, integrating their code more often, and in general, collaborate continuously during the day to ensure the Software achieves business results.</p><p>With this in mind, it&#8217;s easier to understand what Daily Stand-up should really be about: the main goal is to <strong>plan the day</strong>. </p><h3>Async is good for status updates, not for planning and collaboration</h3><p>If you accept that the goal of the Daily Stand-up is to plan the day and see things from the perspective of a team that closely collaborates to achieve business success, it makes a lot of sense to state that: </p><blockquote><p>The Daily Stand-up should happen in sync and at the beginning of the day.</p></blockquote><p>First of all, having the Daily Stand-up at the beginning of the day is a perfect match with the target of planning the day: it becomes the tool to trigger the &#8220;work is starting&#8221; message to our brain; thinking about where you left yesterday, and then planning what you need to do today to progress is ideal as first thing in the day. </p><p>This meeting is the practice suggested to also set up the collaboration we need among the team for today: for example, this is typically the moment when Agile teams set up pairing or mobbing sessions for the day, or ask for a sync PR review on the latest changes, or set up some additional refinement or customer feedback moment, for example.</p><p>On the other hand, there is the need for synchronicity: async communication is a better choice in some cases; for example to collect ideas, share status updates, or any kind of data in general, especially when a wide audience is interested in reading them - but, sync communication is far more effective than async when we need to brainstorm solutions, ideas, work together and collaborate. And this should be what Software Development teams do continuously every day: work together and collaborate.</p><p>When a team works mostly async, in the configuration of multiple individual contributors working alone most of the time and then putting the code together when done, typically after days of isolated work on a branch, then I&#8217;m sure that the standup is probably just a status update for you, and going async can probably improve your day in the immediate. But I have to say that I think this is not an ideal way of working in software: we can achieve more freedom and flexibility differently and still collaborate a lot during the day. </p><p>If you are more open to considering working together, I strongly suggest that you focus on improving your Daily Stand-ups by focusing mostly on the planning part: spend a few words on what you did yesterday just to sum up and start the talking, but move fast to planning today. To improve even more, start asking someone to pair with you, at least when you are doing something hard or very important - this will not only reduce the time for PR reviews but also make the Stand-up quicker.</p><p>Bonus point: once you move to collaboration and pair or mob most of your time, you might even not need the Daily Stand-up or reduce it to 5 minutes - because the team will be much more aligned and working together, therefore the need to orchestrate will be minimal.</p><h3>What if you really want to go async?</h3><p>The best tip I can give you is to do whatever it takes to focus on planning today way more than updating on what you did yesterday. If I had to run an async stand-up, I would suggest the following things:</p><ol><li><p>Use a template: with a template we can make it faster to write (or say, if it&#8217;s audio/video) the message, but also easier to read/listen to it for the others; should take no more than 30 seconds to read/listen the message to the others, so that going through all the messages takes around 5 minutes and the cognitive load remains low.</p></li><li><p>Make it video: I would favor a video format, with a webcam + shared video on the board highlighting the tasks while are discussed; video format favors communication because spoken + face works far better than written one and makes it also easy and fast to say if we need some support.</p></li><li><p>Define an ideal time limit: I think it would still be important to have it at the beginning of the day; it can be a problem if you are totally async, but generally speaking the working hours might be different but are similar; for example, asking to submit our daily message before 10 or 11 am looks reasonable to me.</p></li><li><p>Define how to set up collaboration for the day: I would still try to force this stand-up moment to focus on setting up the day way more than being a mere status update, so I would decide a way to ask for some collaboration/help.</p></li></ol><p>An example to favor collaboration after an async standup would be to have a tool where the person in need of help would start a conversation (it can be something like Stackoverflow for teams or simply Slack); the conversation starts in an async way, but everyone should be ready to go in a sync meeting as soon as needed, immediately if people are available, or scheduling a meet asap; the expectation would be that the person asking for support open the conversation leaving all the info in the first message, mixing text, video, and screenshots - as I said, collecting ideas and sharing info in async is a good idea, just ensure that people are happy and ready to move to sync communication as soon as required. </p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p>Developing Software is an activity that works best when the work is treated as a team effort. Consider this every time you decide to add some async flavor to the work: we have to find the right balance between collaboration and async.</p><p>Yes, there is a trade-off there so make sure it&#8217;s an intentional one.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3SU8pHa">Extreme Programming Explained: Embrace Change</a>: </strong>this book doesn&#8217;t talk about stand-ups in general - but we can use it to reflect: are we respecting the values and principles of XP with our current stand-up? If yes, keep improving - if not, either fix it or remove it.</p></li><li><p><strong><a href="https://www.oreilly.com/library/view/the-async-first-playbook/9780138187651/">The Async-First Playbook: Remote Collaboration Techniques for Agile Software Teams</a></strong>: I&#8217;m not a fan of going async, as you know; &#8220;async first&#8221; make some sense, &#8220;only async&#8221; makes no sense at all, IMHO; but this book comes from Thoughtworks so it&#8217;s worth reading it and taking inspiration from it if you work remotely.</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://shawli.substack.com/p/how-to-stop-your-standups-from-turning">How to stop your standups from turning into status updates.</a></strong></p></li><li><p><strong><a href="https://parasocialwork.substack.com/p/a-quick-and-easy-slack-hack-to-augment">A Quick and Easy Slack Hack to Augment My Team&#8217;s Daily Standup</a></strong></p></li><li><p><strong><a href="https://learnagilepractices.substack.com/p/choosing-wisely-when-to-go-sync-and">Choosing Wisely: When to Go Sync &#9203; and When to Go Async &#9200; in Software</a></strong></p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://ayanza.com/blog/asynchronous-daily-standups">Asynchronous Daily Standups: Pros, Cons &amp; Best Practices</a></strong></p></li><li><p><strong><a href="https://www.agileambition.com/asynchronous-daily-standup/">Don't Let Async Standup Kill Team Effectiveness</a></strong></p></li><li><p><strong><a href="https://friday.app/p/asynchronous-daily-standups">Asynchronous Daily Standups (How They Work for Remote Teams)</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://www.atlassian.com/blog/podcast/work-check/season/season-3/is-it-time-to-ditch-the-remote-daily-stand-up">Is it time to ditch the remote daily stand-up?</a></strong></p></li><li><p><strong><a href="https://www.businessenglishpod.com/2017/10/07/bep-314-english-for-project-management-5-daily-scrum-stand-up-meetings-2/">BEP 314 &#8211; Project Management 5: Scrum Stand-up Meetings</a></strong></p></li></ul><h3>&#128421;&#65039; Videos</h3><ul><li><p><strong><a href="https://www.youtube.com/watch?v=5hdBnKvdp2A">Daily Standup: You're Doing It Wrong! (What Does A Perfect DAILY SCRUM Look Like)</a></strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=ut__r-YTq-g">How to Run The Perfect Asynchronous Daily Scrum (compatible with SCRUM??)</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[CQRS pattern: advantages of Command and Queries]]></title><description><![CDATA[CQRS pattern is typically discussed only in pair with Event Sourcing - but while not all projects might justify ES, any project can make use of CQRS: let's discover why!]]></description><link>https://learnagilepractices.substack.com/p/cqrs-pattern-advantages-of-command</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/cqrs-pattern-advantages-of-command</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 20 Feb 2024 06:01:06 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Kg2K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome back to Learn Agile Practices, the home of continuous improvement and learning for Software Developers.</p><p><strong>&#128204; In case you missed it</strong></p><p>In the last 2 weeks, in this newsletter, we discussed Continuous Integration and Trunk-Based Development: there you can read the 2-parts article that includes a quick introduction to the 2 topics, some coding patterns that you can use to hide unfinished work, and some real-world examples from my experience. If you haven&#8217;t yet, you can read it in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>And for those of you who speak Italian, I also discussed the same topic last week on my video podcast:</p><ul><li><p>The Weekly Pomodoro #4 - Trunk-Based Development coding patterns</p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a> or <a href="https://open.spotify.com/show/2ivOpZJj1py7bcGpiCfeHp">Spotify</a>.</p><p><strong>&#128293; Available for mentoring and coaching</strong> </p><p>I&#8217;m always available for some mentoring and coaching to other software developers! Feel free to reach me: we will know each other and discuss what path can be best for you, from a free monthly mentoring path to a more frequent one or a 1-to-1 coaching service specifically on your needs!</p><p>&#128073; Feel free to reply to this email or reach me on any social media: all the details on my <a href="https://danthedev.carrd.co/">website</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>CQRS pattern: advantages of Command and Queries</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>Today&#8217;s topic is one of those that made me desire to stand up for a discussion when I heard about it: the Command-Query Responsibility Segregation pattern (CQRS) is very powerful and useful but it&#8217;s usually only discussed together with Event Sourcing (ES) and this is a pity. </p><p>I think CQRS deserves its autonomous role in Software Development and should be discussed more because it is a powerful technique to organize our software and keep it maintainable.</p><p>This is what I want to do with this issue: describe what the CQRS pattern is about, with some practical examples and usages, and especially highlighting its advantages on a business application and why it makes total sense to apply it on its own, no need for ES.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Kg2K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Kg2K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Kg2K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Kg2K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Kg2K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Kg2K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg" width="438" height="438" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:438,&quot;bytes&quot;:135427,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Kg2K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Kg2K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Kg2K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Kg2K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6a3e196c-528c-4302-8166-3c70a1154b30_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A &#8220;chibi style&#8221; happy software developer programming from the beach, made with <a href="https://ideogram.ai/">ideogram.ai</a></figcaption></figure></div><h3>From CQS to CQRS</h3><p>To talk about CQRS in deep, especially to prove my point about its importance in a Software project, we need to introduce its &#8220;little brother&#8221;: the Command-Query Separation principle (CQS).</p><p>The Command-Query Separation principle states that a class can have 2 types of methods:</p><ul><li><p>a Command: a method that can mutate the state of the system, but doesn&#8217;t return data from the state itself - a violation of this principle is considered weak and is allowed: for example, think of a method that creates a new entity and returns the ID</p></li><li><p>a Query: a method that returns a portion of the state of the system, but doesn&#8217;t change it in any way - no exception allowed in this case, a violation of this principle with a Query changing the state is considered strong and is forbidden</p></li></ul><p>Building your classes following the CQS principle will ensure a higher quality, readability, and maintainability of our classes, with a clearer separation of concern; it&#8217;s also easier to stub/mock the classes following this principle (stubs are for queries because they only need to return a fixed data sample, mocks are for commands because they only need to verify how it is called) and in general has a lot of benefits in our code.</p><p>There is a strong relation between CQS and CQRS: basically, CQRS raises the CQS pattern to a higher architecture layer, embracing the separation between Commands and Queries at the entire application level - meaning that we want to separate Queries from Commands at an architectural level in the same way we typically keep different modules separated. </p><p>The separation can be physical or logical, but it must be clear.</p><p>Let&#8217;s try to describe a simple sample implementation of CQRS in an application:</p><ul><li><p>dedicated controllers/command handlers/data layer for the write side</p><pre><code>// pseudo code example - write side

class Controller {
 public function addElementToList(Element $element): void;
}

class Service {
 public function executeAddElementToListCommand(AddElementToList $command): void; // used from Controller
}

class ListRepository {
 public function add(Element $element): void; // used from Service
}</code></pre></li><li><p>separated data layer for write and read - this can be achieved in multiple ways but in general, you will need a way to calculate the read side starting from the right side, some examples to implement that are:</p><ul><li><p>Database views</p></li><li><p>Scheduled cron jobs writing in dedicated tables/database</p></li><li><p>Events</p></li><li><p>Event Sourcing projections</p><p></p></li></ul></li><li><p>dedicated controllers/command handlers/data layer for the read side</p><pre><code><code>// pseudo code example - read side

class Controller {
 public function getList(): Collection&lt;Element&gt;;
}

class Service {
 public function executeGetListQuery(): Collection&lt;Element&gt;;
}

class ListRepository {
 public function all(): Collection&lt;Element&gt;;
}</code></code></pre></li></ul><blockquote><p>&#128161; Embracing the low-code and no-code technologies available today, you can automate some of this to reduce the boilerplate code. </p></blockquote><p>For example, what I typically do:</p><ul><li><p>when performances are not a priority, I use DB views to build the read side model with the expected fields already in place and then use a tool to expose those views automatically via REST/GraphQL (pgRest/Hasura)</p></li><li><p>when performances matter, the calculation can be done with some async script, even better if they are triggered via Events instead of being scheduled cron jobs</p></li><li><p>for MVPs, I&#8217;ve also handled the write side via automated REST API, for example using Supabase and having separated tables for write and read (you can also use access control rules to block writing on the read side and vice-versa)</p></li><li><p>no-code can be useful also for building the UI, both for the write side and in some use cases for read-side data visualization</p></li><li><p>last tip: consider Make or Zapier as tools to implement automated triggers with ease</p></li></ul><p>I typically favor custom API based on feature names over REST, but since write and read are separated I can easily accept automate and standardize the less important side and focus on the most important one with the customization it needs - depending on the use case, I&#8217;ve done it on both sides and it works pretty well, reducing the codebase to maintain and simplifying things.</p><h3>Make sure Event Sourcing is needed</h3><p>Now, let&#8217;s introduce the villain of our story: Event Sourcing.</p><p>Event Sourcing is a pattern that mostly impacts how we handle the persistence layer of the state of our application: in a typical application, when something happens that requires changing the state, we simply change it from A to B, and then persist B as a new state. With ES, instead, we create an Event describing the change from A to B and we store the Event itself - then, an async process will execute the Events and therefore transform A into B.</p><p>As you can easily understand, this pattern has multiple positive consequences:</p><ul><li><p>we can query the Events directly</p></li><li><p>we can rebuild the state up to a given date in the past</p></li><li><p>we can add retroactive Events to fix the state</p></li></ul><p>Event Sourcing in general is a great and powerful technique&#8230; so, why did I call it the villain of this story?</p><p>First of all, ES is costly: it has a high learning curve to learn how to implement it, and it is complex to learn how to maintain an application based on such a paradigm. </p><p>But today we are talking about CQRS, and the big problem I have with ES is the misconception it brings to CQRS: the two paradigms work very well together, therefore are usually presented and described together and most people think that CQRS only makes sense together with ES.</p><p>This is simply not true.</p><p>On one side, it&#8217;s undeniable that CQRS naturally fits with some other architectural patterns, not only Event Sourcing.</p><ul><li><p>We can easily move away from a CRUD to a task-based approach.</p></li><li><p>CQRS fits well with event-based programming models in general.</p></li><li><p>CQRS is a good fit already for simple domains, but it&#8217;s also great for complex domains that also benefit from Domain-Driven Design.</p></li></ul><p>On the other side, it&#8217;s also very true that CQRS deserves its spotlight in Software Development, and it&#8217;s a good paradigm for building and maintaining an application with ease.</p><p>Anyway, even if CQRS brings a lot of benefits, it adds complexity to our codebase so we need to be cautious about using it: some systems fit well with an implementation based on data that is changed the same way it&#8217;s read, and in that case, adding CQRS would just add complexity without any real benefit. CQRS is a great tool to know and have in the toolbox, but even if not as complex as ES, it&#8217;s still complex enough to be used with consciousness.</p><p>Typically is a good idea to only use it on specific sections of a system instead of the entire system: a specific DDD&#8217;s Bounded Context, for example, the one where having read and write separated adds more value than complexity. One of the typical benefits of the pattern, for example, is when your system has a disparity in read and write load, because this pattern easily allows you to scale them independently. </p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p>CQRS allows you to separate the load from reads and writes allowing you to scale each independently. If your application sees a big disparity between reads and writes this is very handy. <br><br>[Martin Fowler]</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/42nBAVV">CQRS (Command Query Responsibility Segregation)</a></strong> - There are a lot of misconceptions around the CQRS pattern, especially when it comes to applying it in real-world software projects. In this book, CQRS, you will learn all about CQRS with event sourcing, database configuration for reads and writes, and more.</p></li><li><p><strong><a href="https://amzn.to/42lxj5h">Microservice Patterns and Best Practices</a></strong> - This book will take you through different design patterns at different stages of the microservice application development along with their best practices.</p></li><li><p><strong><a href="https://amzn.to/3HFnAgY">Practical Microservices: Build Event-Driven Architectures with Event Sourcing and CQRS</a></strong> - MVC and CRUD make software easier to write, but harder to change. Microservice-based architectures can help even the smallest of projects remain agile in the long term, but most tutorials meander in theory or completely miss the point of what it means to be microservice-based.</p></li><li><p><strong><a href="https://amzn.to/3vTUbgn">Software Architecture Patterns for Serverless Systems: Architecting for innovation with events, autonomous services, and micro frontends</a></strong> - This book takes you through the architectural patterns that power enterprise-grade software systems and the key architectural elements that enable change (such as events, autonomous services, and micro frontends), along with showing you how to implement and operate anti-fragile systems.</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://pratikpandey.substack.com/p/cqrs-pattern-a-patterns-f0693a04f4fe">CQRS Pattern: Architecture Pattern</a></strong></p></li><li><p><strong><a href="https://byron.substack.com/p/how-the-cqrs-pattern-changed-my-interviews">How the CQRS pattern changed how I think about domain modeling: part 1</a></strong></p></li><li><p><strong><a href="https://craftingtechteams.substack.com/p/tell-dont-askthe-gateway-to-loosely">Tell, don't ask&#8212;the gateway to loosely coupled architecture</a></strong></p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://martinfowler.com/bliki/CQRS.html">CQRS by Martin Fowler&#8217;s blog</a></strong></p></li><li><p><strong><a href="https://dev.to/claranet/cqrs-with-low-code-48oi">CQRS with Low-Code</a></strong></p></li><li><p><strong><a href="https://blog.knoldus.com/introduction-to-cqrs/">Introduction to CQRS(Working, Uses, Benefits)</a></strong></p></li><li><p><strong><a href="https://blog.risingstack.com/when-to-use-cqrs/">When should you use CQRS?</a></strong></p></li><li><p><strong><a href="https://medium.com/codex/cqrs-design-pattern-5-things-you-should-know-ecaab3f406cc">CQRS Design Pattern &#8212; 5 Things You Should Know</a></strong></p></li><li><p><strong><a href="https://dev.to/jackynote/understanding-cqrs-pattern-pros-cons-and-a-spring-boot-example-3flb">Understanding CQRS Pattern: Pros, Cons, and a Spring Boot Example</a></strong></p></li><li><p><strong><a href="https://medium.com/applantic/use-cqrs-part-ii-f2d2b112e3a9">How to implement simple CQRS?&#8212; Part II</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://www.heroku.com/podcasts/codeish/105-event-sourcing-and-cqrs">105. Event Sourcing and CQRS</a></strong></p></li><li><p><strong><a href="https://podcasts.apple.com/no/podcast/episode-218-udi-dahan-on-cqrs-command-query-responsibility/id120906714?i=1000334491220">Episode 218: Udi Dahan on CQRS (Command Query Responsibility Segregation)</a></strong></p></li></ul><h3>&#128373;&#65039;&#8205;&#9792;&#65039; Others</h3><ul><li><p><strong><a href="https://learncqrs.com/">Learn CQRS</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Continuous Integration and Trunk-Based Development (part 2/2): real-world examples]]></title><description><![CDATA[I often describe the advantages of CI and TBD: today, I will make it more concrete by sharing with you some real-world use cases and coding examples from my experience.]]></description><link>https://learnagilepractices.substack.com/p/continuous-integration-and-trunk-3bc</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/continuous-integration-and-trunk-3bc</guid><pubDate>Tue, 13 Feb 2024 06:00:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Ovb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome back to Learn Agile Practices, the home of continuous improvement and learning for Software Developers.</p><p><strong>&#128204; In case you missed it</strong></p><p>Last week in this newsletter, I sent the first part of this issue about Continuous Integration and Trunk-Based Development: there you can read the introduction to the 2 topics and the main coding patterns that you can use to hide unfinished work and therefore be able to merge and release daily, multiple times per day, with ease. If you haven&#8217;t yet, you can read it in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>And for those of you who speak Italian, last week on my video podcast:</p><ul><li><p>The Weekly Pomodoro #3 - Lean Software Development </p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a> or <a href="https://open.spotify.com/show/2ivOpZJj1py7bcGpiCfeHp">Spotify</a>.</p><p><strong>&#128293; Available for mentoring and coaching</strong> </p><p>I&#8217;m always available for some mentoring and coaching to other software developers! Feel free to reach me: we will know each other and discuss what path can be best for you, from a free monthly mentoring path to a more frequent one or a 1-to-1 coaching service specifically on your needs!</p><p>&#128073; Feel free to reply to this email or reach me on any social media: all the details on my <a href="https://danthedev.carrd.co/">website</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>Continuous Integration and Trunk-Based Development (part 2/2): real-world examples</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>Here is the 2nd part of this big issue related to Continuous Integration and Trunk-Based Development - and today, I will finally share with you 3 real-world examples where I applied the coding pattern I described last week.</p><p>This issue aims to share a concrete guide for those who want to start applying these practices to help you achieve them in your practices first, and then in daily work - so hopefully, real-world examples will make it easier to understand and spot use cases in your work to start using the patterns by yourself.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Ovb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Ovb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg" width="460" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:460,&quot;bytes&quot;:138359,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9Ovb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A happy developer made with <a href="https://ideogram.ai/">Ideogram.AI</a></figcaption></figure></div><h3>Real-World examples I applied</h3><h4>A food delivery API backend</h4><h5><strong>The context</strong></h5><p>In a food-tech company, I was working on a Food Delivery B2B product, and I was able to work on that almost from the beginning. We had a couple of customers who were ready to take advantage of our food delivery services to offer them to their employees as an additional lunch benefit option, and we had to build the entire platform where they could place orders for the day.</p><p>As I mentioned, it was &#8220;almost&#8221; the beginning: we had a few months of work already done on a generic set of APIs that could serve any generic e-commerce/food delivery app, with way more API routes and features than we needed - but still no frontend and no clear idea of what the core of the product should be.</p><h5><strong>The use case</strong></h5><p>As you can imagine, a lot of work had to be done, and a lot of it was outside of code - but for this issue, we will focus on coding. We had to sustain the business in a better way than was done before, therefore we had three main objectives:</p><ul><li><p>build the frontend MVP</p></li><li><p>build the missing backend APIs for the MVP</p></li><li><p>clean up existing code (clean up here means multiple stuff: the code had a lot of code smells, tests were there but it was only integration tests at controller level, they were very brittle and weren&#8217;t testing enough, most often only 200 as HTTP response code, and some features weren&#8217;t even needed at all)</p></li></ul><p>Of course, the clean-up had to be done sustainably, because we still had to serve the business to achieve the MVP release successfully and less waste possible (zero waste was impossible at that point).</p><h5><strong>The approach</strong></h5><p>We applied mainly two patterns here: Parallel Change and Dark Launch.</p><p>Since when I joined, I pushed to move into an MVP version of the software for the first release - of course, the backend would have to live with existing useless code somehow, but at least we could build the frontend from an MVP perspective and also use the set of features used in the frontend as the list of &#8220;actually required&#8221; features.</p><p>Taking inspiration from Dark Launch, we moved all the existing routes of the APIs under a useless route group that no user had access to - and then built a clean version of the active group of APIs including only useful routes. The routes were still there in the codebase, but no one could access them. This made it easy to make decisions about how to improve the code, especially when we had to clean up some code that was used in multiple places: every feature that didn&#8217;t enter the MVP phase was removed safely unless we were already sure that it was a feature that we had to include in a new release very soon (example: special rules in discount).</p><p>In some cases, we had to keep a feature: the behavior was fine but we had to refactor somehow to build a code and test we could trust&#8230; (1 ensure tests were good, 2 copy-paste the feature, 3 refactor in parallel change to test the behavior was the same)</p><p>This way, we were able to face this issue iteratively and progressively, keeping it sustainable and completely transparent to the users.</p><h4>Smart Fridges iterative rollout </h4><h5><strong>The context</strong></h5><p>In the same company and product context as the previous example, we also offered Smart Fridges to our customers, and one specific use case is to use it as a vending machine for healthy, high-quality products for both lunch and snacks. The UX was very smooth: you could just open the fridge via QR code with your phone, take what you wanted, and go away, and we automatically calculate what you have to pay and take it from the wallet.</p><h5><strong>The use case</strong></h5><p>After the first version release, we needed more marketing-related features like using coupons, discount codes, special offers, highlights favorites products, etc. From the user perspective, what we wanted to do is add a pre-opening screen: after using the QR code, the fridge wouldn&#8217;t open immediately anymore - instead, we show a page dedicated to the fridge, with an &#8220;OPEN&#8221; button; that page enabled us to new interactions with the customer. While from the user's perspective, it wasn&#8217;t a big change, technically it required some changes on the fridge opening and payments, basically the two most delicate pieces of the puzzle.</p><h5><strong>The approach</strong></h5><p>We approached this with two patterns in mind: Parallel change and Feature flags; but then also Branch by Abstraction came in handy.</p><p>On the backend, we applied Parallel change by creating a completely new API version for both the opening and the payment, starting from a copy of the existing one. Since the opening API became &#8220;pre-opening&#8221;, we also had to create a new API specifically dedicated to opening. These APIs were also released in production, but no one could use them because the front end wasn&#8217;t using them and we didn&#8217;t give access to anyone to those routes. </p><p>On the front end, we applied Parallel change by creating the new &#8220;pre-opening&#8221; page, which was a brand new page - it simply wasn&#8217;t used by the user flow, so no one could see it. We didn&#8217;t hide it completely (meaning that if someone guessed the URL he could have seen it) because it was in any way related to the QR code and auth strategy with the fridge, so it wouldn&#8217;t have worked anyway, and that was enough for us. If needed, we could have added a way to hide it completely.</p><p>Then, once released in production, we had to test it from a user perspective (we had unit and integration tests of course), so we implemented a feature flag at a fridge level: this allowed us to decide what to do when a user tried to open a fridge based on a variable related specifically to that fridge. </p><p>This was also a simple implementation of Branch-by-abstraction: the interface that decided which open strategy to use was based on the feature flag in this case, but still, we had an interface that was taking that decision and redirecting the user to the right strategy - we could also have a more granular approach to send only a percentage of users of a single fridge into the new strategy, but we didn&#8217;t have thousands of users so we didn&#8217;t need this level of safety.</p><p>Thanks to this flag, we were able to roll out first on our test fridge in our office and run the first tests - then, one by one, we activated the new opening on all fridges. The iterative rollout was already simplifying things, but the flag was also helpful to rollback immediately in case something didn&#8217;t work well. </p><p>Once the new feature was stable enough (in our case, we waited for a couple of weeks), we just removed the old code and the feature flags.</p><h4>Feature Flag for a progressive release</h4><h5><strong>The context</strong></h5><p>In a more recent experience, I had to work on a project dedicated to upgrading the database of the historical monolith database from MySql 5 to 8. In case you don&#8217;t know, with this upgrade there is an automatic cache feature that is deprecated, and our application was taking so much advantage of it that upgrading was causing a drop in performances on some of our main pages for SEO: we couldn&#8217;t afford that.</p><h5><strong>The use case</strong></h5><p>From the beginning, I was very concerned about the work to do because the codebase wasn&#8217;t covered by enough tests, and we couldn&#8217;t trust the existing ones - I also didn&#8217;t have confidence in that codebase either because I was new.</p><p>What we had to do in practice was replace the (dozens of) queries from the most important pages for SEO with a single GET read operation from REDIS: an async data calculation would have prepared the required JSON structure to replace the queries.</p><p>Some problems: no one had enough knowledge to build a JSON sample, so we had to build it step by step, and no one was aware of what data from those queries was used - we were pretty sure that a lot of fields were unnecessary since most queries were getting all the fields from all the tables, but we couldn&#8217;t understand which ones were unnecessary upfront (and even if we could do it, it would have taken ages). </p><h5><strong>The approach</strong></h5><p>An iterative, exploratory approach was the only safe way here but we also needed a way to test the changes (non-regression kind of testing, since it&#8217;s like refactoring work here).</p><p>Again, Parallel Change, Dark Launch, and Feature Flags were our safety net here.</p><p>We put together those patterns to build a cascade structure:</p><ul><li><p>via Feature Flags at a page level (a simple boolean value on a database configuration table) we could decide for each page if the data was coming from DB or Cache (with a Strategy Pattern implemented on code through the Feature Flag)</p></li><li><p>via Parallel Change, we handled some shared code that was unsafe to refactor by copy-pasting it in a version dedicated to cache, where we replaced DB queries with data from cache - once it was stabilized as a good solution, we removed the duplication</p></li><li><p>and, last but not least, in a sort of a Dark Launch approach, we also implemented the Cache strategy in a way that catches any Exception that might happen in the process: if that happens, we log the exception (so that we could collect all the data issues to fix) and then we transparently fallback to the DB strategy so that the page keeps working from the user perspective</p></li></ul><p>Again, some additional work during development put us in a situation where we were able to avoid any real big issues to reach production - we had some small issues, but it was easy to handle them because the user wasn&#8217;t seeing anything weird, and we could always turn the flag OFF if needed.</p><h4>Conclusions</h4><p>As you might have noticed, one pattern does not appear in the examples I chose: the reason is that I mostly used those in more simple situations.</p><p>For example, I used the Keystone interface sometimes to release a new API without setting up the route where the Controller would respond; sometimes it&#8217;s even enough if the frontend is built after the backend, so you can just release the new API but no one can use it. This is useful when we work with separated frontend and backend task (I usually share the API contract before, and release a stub respecting that contract, to enable async releases of backend and frontend - just be careful to replace the stub with the real implementation before allowing the users to see this) but it&#8217;s also helpful when we work in Pair/Mob Programming (in this case, we can just build the API on the backend and then work on the frontend after that).</p><p>Branch by abstraction has a small example, but it&#8217;s the best I can provide from real experience - in any case, you can use it together with Parallel change to build a class that behaves as a sort of Load Balancer between old and new logic, and even configure how many requests to direct to the new logic.</p><p>In general, such techniques are powerful and pretty useful, and I strongly suggest everyone that who wants to become a Senior become confident in them because they are great ways to avoid issues in production in a safe way.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p>We must avoid unplanned work at any cost: a little planned cost today is far better than a much higher unplanned cost later.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3OhhW8m">Continuous Integration: Improving Software Quality and Reducing Risk</a> - </strong><em>The authors first examine the concept of CI and its practices from the ground up and then move on to explore other effective processes performed by CI systems, such as database integration, testing, inspection, deployment, and feedback.</em></p></li><li><p><strong><a href="https://leanpub.com/trunk-based-development">Trunk-Based Development And Branch By Abstraction</a></strong> - <em>An all you need to know reference book about trunk-based development, Branch by abstraction, and related software development practices. Many diagrams throughout, and a sections on working out how your company can get from where you are to trunk-based development, CI, CD, and all that comes with it.</em></p></li><li><p><strong><a href="https://www.oreilly.com/library/view/feature-flag-best/9781492050452/">Feature Flag Best Practices</a></strong> - <em>With this practical book, software engineers will learn eight best practices for using feature flags in production, including how to configure and manage a growing set of feature flags within your product, maintain them over time, manage infrastructure migrations, and more.</em></p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://strongopinionsweaklyheld.substack.com/p/the-difference-between-design-thinking-lean-startup-and-agile-5cf07b117562">The Difference Between Design Thinking, Lean Startup, and Agile</a></strong> [<strong><a href="https://strongopinionsweaklyheld.substack.com/">Strong Opinions, Weakly Held</a></strong>]</p></li><li><p><strong><a href="https://refactoring.fm/p/feature-flags">Feature Flags</a></strong> [<strong><a href="https://refactoring.fm/">Refactoring</a></strong>]</p></li><li><p><strong><a href="https://saasengineering.substack.com/p/the-road-to-continuous-deployment">The Road To Continuous Deployment</a></strong> [<strong><a href="https://saasengineering.substack.com/">SaaS Engineering</a></strong>]</p></li><li><p><strong><a href="https://gitbetter.substack.com/p/branch-based-vs-trunk-based-development">Branch based vs Trunk based development</a></strong> [<strong><a href="https://gitbetter.substack.com/">Git Better</a></strong>]</p></li><li><p><strong><a href="https://learnagilepractices.substack.com/p/why-are-we-so-afraid-of-trunk-based">Why are we so afraid of Trunk-Based Development?</a></strong> [<strong><a href="https://learnagilepractices.substack.com/">Learn Agile Practices</a></strong>]</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://martinfowler.com/articles/continuousIntegration.html">Continuous Integration by Martin Fowler&#8217;s blog</a></strong></p></li><li><p><strong><a href="https://www.split.io/blog/branch-by-abstraction/">HOW TO BRANCH BY ABSTRACTION WITH FEATURE FLAGS</a></strong></p></li><li><p><strong><a href="https://itnext.io/evolving-your-react-app-safely-with-feature-toggles-and-branch-by-abstraction-bb7b97290bc9">Evolving Your React App Safely with Feature Toggles and Branch By Abstraction</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://podcasts.apple.com/za/podcast/trunk-based-development-vs-gitflow/id1223811385?i=1000393287122">Trunk Based Development vs. Gitflow</a> </strong>[The Rabbit Hole podcast]</p></li><li><p><strong><a href="https://podcasts.apple.com/za/podcast/trunk-based-development-and-feature-flags-with-ej-tj/id1356275803?i=1000583105649">Trunk-Based Development And Feature Flags With EJ &amp; TJ</a> </strong>[The CTO Studio]</p></li><li><p><strong><a href="https://podcastaddict.com/the-continuous-delivery-podcast/episode/126614613">Ep. 5: Trunk-Based Development</a></strong> [The Continuous Delivery Podcast]</p></li><li><p><strong><a href="https://jhall.io/archive/2022/09/13/a-conversation-about-trunk-based-development/">A conversation about trunk-based development</a></strong> [Tiny DevOps podcast]</p></li></ul><h3>&#128373;&#65039;&#8205;&#9792;&#65039; Others</h3><ul><li><p><strong><a href="https://minimumcd.org/minimumcd/">MinimumCD</a></strong> [Reference website for Continuous Integration and Deployment/Delivery]</p></li><li><p><strong><a href="https://trunkbaseddevelopment.com/">Trunk-Based Development</a></strong> [Reference website for TBD]</p></li><li><p><strong><a href="https://docs.google.com/presentation/d/e/2PACX-1vSELox8W3f7jHli7BqJvGWG-IkaiTZJe4YwPMqD6irTGq2RF8FeaiklfLW119HsXhtkm2gAacKwpl-1/pub?start=false&amp;loop=false&amp;delayms=3000&amp;slide=id.p">Just commit to master, please - Hot to actually implement CI</a> </strong>[My talk slides]</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Continuous Integration and Trunk-Based Development (part 1/2): coding patterns]]></title><description><![CDATA[I often describe the advantages of CI and TBD: today, I will make it more concrete by sharing with you some real-world use cases and coding examples from my experience.]]></description><link>https://learnagilepractices.substack.com/p/continuous-integration-and-trunk</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/continuous-integration-and-trunk</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 06 Feb 2024 06:00:41 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!9Ovb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome back to Learn Agile Practices, the home of continuous improvement and learning for Software Developers.</p><p><strong>&#128204; In case you missed it</strong></p><p>Last week in this newsletter, I wrote about Lean Thinking and Lean Software Development: starting from Toyota Production System, I shared with you the impact of applying Lean to software, what principles it suggests, and the positive outcomes of applying them. If you haven&#8217;t yet, you can read it in our <a href="https://learnagilepractices.substack.com/archive">archive</a>.</p><p>And for those of you who speak Italian, last week on my video podcast:</p><ul><li><p>The Weekly Pomodoro #2 - OOP Misconceptions </p></li></ul><p>Watch episodes on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a>.</p><p><strong>&#128293; Personal Coaching</strong> </p><p>If you want to speed up your growth as a software developer with Agile practices such as TDD and Clean Code, you should consider my coaching service: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of my First Lesson Free policy: enjoy the first free session and get to know me to see why I am the right person for you to improve your professionalism as a software developer. </p><p>Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>Continuous Integration and Trunk-Based Development (part 1/2): coding patterns</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>Since I started this newsletter, I&#8217;ve talked of a lot of topics related to programming, Agile practices, and the work of a Software Engineer in general - but for sure, there are some of them that I talked about much more than others, with the top 3 probably composed by Test-Driven Development, Continuous Integration, and Trunk-Based Development.</p><p>Today, we talk again about the last two: after a quick recap of what they are about, I will share with you the coding patterns that enable CI and TBD by hiding work in progress and some real-world examples where I applied those practices.</p><p>This issue aims to share a concrete guide for those who want to start applying these practices to help you achieve them in your practices first, and then in daily work - the coding patterns tips will be simple but clear, enough to clarify the approach and start practicing it.</p><p>In this first part, we will introduce the topics in short, and then deep dive into the coding pattern I want to talk about. Then, next week, in the 2nd part, I will share 2 real-world examples where I applied those patterns in my experience - with my final reflections on the topic.</p><p><em>I wanted to put some code examples, but this kind of pattern requires a lot of context to build a meaningful use case, and it would still be hard to understand only by reading, so I thought it wasn&#8217;t worth it and gave up the idea.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9Ovb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9Ovb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg" width="460" height="460" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:460,&quot;bytes&quot;:138359,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!9Ovb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!9Ovb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F12aac87e-598a-4153-8a3a-6eb57a093f6d_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A happy developer made with <a href="https://ideogram.ai/">Ideogram.AI</a></figcaption></figure></div><h3>The principles</h3><p>Continuous Integration is one of the most powerful concepts to master in the Software Development World, probably the one that most impacted how I see this job.</p><blockquote><p><em>CI is the activity of very frequently integrating work to the trunk of version control and verifying that the work is, to the best of our knowledge, releasable.</em></p></blockquote><p>Implementing Continuous Integration implies some practices that are embedded into it, and one of those practices is Trunk-Based Development.</p><blockquote><p><em>Trunk-Based Development is a methodology where changes to code are integrated directly in the main branch, without any other branch in the middle, at least once per day.</em></p></blockquote><p>If you want to implement CI in your workflow, you must start using the set of practices that together make CI, including Trunk-Based Development: in other words, you can&#8217;t say you do CI if you don&#8217;t do TBD. </p><p>Sadly, that&#8217;s what most company does, at least in my experience - they use feature branches, typically with a very long life of multiple days, and then think they are doing CI just because they have an automated pipeline. </p><p>That&#8217;s just wrong.</p><p>Anyway, when it comes to the idea of <em>very frequently integrating work to the trunk</em>, where very frequently means daily or even multiple times per day, the typical concern is: how do we hide work in progress if I have to merge unfinished work to master (and even release to production, if I also want CD)?</p><p>There is a great quote I agree with, about this topic. The quote comes from Bryan Finster, who as a guest on an issue of the Crafting Tech Teams newsletter once said:</p><blockquote><p><em>Software Developers have been trained to deliver complete features. That&#8217;s the problem. It&#8217;s one of the hardest habits to break.</em></p></blockquote><p><strong>That is so much true!</strong></p><p>90% of software developers I know have this bias: we were taught to release fully completed features, and see the release of the software as the last piece of a long process instead of part of the daily work; this habit makes the question about how to hide work in progress seems to be a very hard and complicated question to find an answer to.</p><p>The reality is that this is a problem that has already been solved: there are multiple patterns that we can use to keep the work in progress hidden from the user, allowing us to release our code without any issue on their side.</p><p>We will dive into the most common patterns in a while, but I want to point out an important thing before; let me share a quick example with the most known pattern to hide work in progress: Feature Flags. A basic implementation could be as simple as a boolean value in the configuration, at a user level, that allows you to decide if a user has access to that feature or not; this has some consequences on code implementation, of course, because you&#8217;ll have to handle this configuration value to decide whether to execute the behavior or skip it.</p><p>From this example we can highlight a characteristic that is shared by all the &#8220;work in progress hiding patterns&#8221;: it will probably require some additional work to hide the work in progress; we have to think about how to hide it and make some coding to achieve this purpose.</p><p><strong>So the question here is: is it worth it?</strong> </p><p>Of course, it is, and the reason is quite simple: the investment we take to hide our work in progress and enable the release of our code is completely repaid by the unplanned work we will avoid after the release; it is proved that implementing CI in our daily work will drastically reduce the unplanned work we will face later on during the process of completing the feature.</p><p>Maybe you remember it from our Lean Software Development issue, but let&#8217;s say it again: <strong>unplanned work is one of the biggest sources of waste in software development</strong>, therefore reducing it should be one of our targets.</p><p>Here, we are reducing unplanned work thanks to a little additional, but plannable, work: it means we are investing 1 today to be sure to not waste 10 tomorrow; we are accepting a bit of additional conscious work, that we are aware of and therefore is plannable, to ensure we avoid some unplanned, unexpected work later that will cause waste, issues, waiting time and context switch to be solved.</p><p>As always, if you want to deep dive into such topics, you will find a lot of useful resources in the Go Deeper section at the end of this issue.</p><h3>Coding patterns</h3><h4>Keep the API Hidden</h4><h5><strong>The pattern</strong></h5><p>The easier way to hide code to be executed or noticed in production is to hide its interface: just make sure that the path to the feature is either hidden to the user or the last piece you release. In a well-designed system, such interface elements should be minimal and thus simple to add.</p><h5><strong>Practical Tips</strong></h5><ol><li><p>Hide (or release last) the <a href="https://laravel.com/docs/10.x/routing">route</a> of the API - I typically like to do this with a stubbed response that respects the real contract</p></li><li><p>Hide (or release last) the UI that enables the user to interact with the feature (it can even mean hiding an entire component or page)</p></li></ol><h4>Feature flags</h4><h5><strong>The pattern</strong></h5><p>A boolean value, typically based on a constant, a parameter, or a configuration value, that a class can use to decide if we want to execute path A or B: this is basically what Feature Flags are. This is a simple way to be able to activate the new behavior for testing, while it&#8217;s still disabled in production.</p><h5><strong>Practical Tips</strong></h5><ul><li><p>Build a Feature Flag class or use an existing library (an example <a href="https://packagist.org/packages/friendsofcat/laravel-feature-flag">here</a>) - some tips:</p><ul><li><p>prefer Strategy pattern to implement the two different paths</p></li><li><p>be careful to pick the granularity you need for the flag: if it&#8217;s too big it can become useless, if it&#8217;s too small it can become too complex to maintain, so make sure it&#8217;s worth it</p></li><li><p>Feature Flags are temporary most of the times (at some point only one of the 2 paths usually survive, whether it was an experiment or a change) so be sure that the implementation is also easy to remove</p></li></ul></li><li><p>Make sure that you can enable/disable the flag quickly: if your release process is fast enough, even changing code can be fine - otherwise favor a DB table configuration or something else that allows you to do it in seconds</p></li></ul><h4>Parallel change</h4><h5><strong>The pattern</strong></h5><p>Also known as <code>expand/contract</code>, these patterns suggest expanding the current code instead of changing it: for example, if we have to rename a database field, we should:</p><ol><li><p>create a new one instead</p></li><li><p>start writing in both fields</p></li><li><p>copy data from old to new field</p></li><li><p>start reading from the new field</p></li><li><p>remove the old field, now unused</p></li></ol><p>This allows us to make each of those steps reversible easily, something impossible if we directly change the name of the column.</p><h5><strong>Practical Tips</strong></h5><ul><li><p>The main objective when doing a change is to make it safe, ensuring we can rollback in case of issues, and avoid the need for synchronous changes with clients.</p></li><li><p>Another example is creating a new version of a public API: </p><ul><li><p>release the new version first, while still keeping the old one</p></li><li><p>ensure that no one uses the old one anymore (providing a deprecation date might be good enough in most cases)</p></li><li><p>remove the old version of the API</p></li></ul></li><li><p>The idea of Parallel Change is pretty flexible: in general, stop thinking of software development as changing code, and think more of it in terms of expanding what exists first, and then removing what&#8217;s not needed anymore</p></li></ul><h4>Dark Launch</h4><h5><strong>The pattern</strong></h5><p>When you have to add a new behavior, you can make the code execute this behavior without impacting the existing one: this way, it will be invisible from the user's perspective, nothing has changed from his point of view - but in reality, you are executing that code in production to test its impact and monitor things like performances or saved data.</p><p>Add your behavior, and just ignore the results from the application point of view - but log or save any info about what has been done when it goes well, or what happened when it broke up.</p><h5><strong>Practical Tips</strong></h5><ul><li><p>This pattern best suits use cases where the new behavior is enhancing something already existing that doesn't require any additional interaction from the user. </p></li><li><p>Ensure that the &#8220;dark&#8221; code is under a try/catch that handles all errors: this way, you can save all the info you need from the error (in logs or everywhere else you might need it) and allow the code to move on without breaking</p><pre><code>function foo(): void {
   // do something before
   try {
       // execute the new behaviour here
   } catch (Throwable $exception) {
       // save the data you need about the error, then let the code move on
   }
}</code></pre></li></ul><h4>Branch by abstraction</h4><h5><strong>The pattern</strong></h5><p>The idea here is that we can introduce a different alternative behavior, but instead of making it used by everyone immediately, we use an abstraction layer to route only part of the requests to it: it can mean that only a specific component uses the new behavior at first, or just a percentage of requests. </p><p>Thanks to this approach, we can iteratively roll out the change and increment the usage until it replaces the old behavior completely.</p><p>This pattern has some similarities with Parallel Change: the main difference is that here we progressively go from old to new behavior, while in Parallel Change it&#8217;s more of a direct switch after the two behaviors live together. </p><h5><strong>Practical Tips</strong></h5><ul><li><p>If the code you need to change is used directly by others, build the abstraction layer first</p></li><li><p>If you are doing this on some legacy or badly tested code, you can take advantage of the abstraction layer to add tests to that behavior</p></li></ul><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3OhhW8m">Continuous Integration: Improving Software Quality and Reducing Risk</a> - </strong><em>The authors first examine the concept of CI and its practices from the ground up and then move on to explore other effective processes performed by CI systems, such as database integration, testing, inspection, deployment, and feedback.</em></p></li><li><p><strong><a href="https://leanpub.com/trunk-based-development">Trunk-Based Development And Branch By Abstraction</a></strong> - <em>An all you need to know reference book about trunk-based development, Branch by abstraction, and related software development practices. Many diagrams throughout, and a sections on working out how your company can get from where you are to trunk-based development, CI, CD, and all that comes with it.</em></p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://strongopinionsweaklyheld.substack.com/p/the-difference-between-design-thinking-lean-startup-and-agile-5cf07b117562">The Difference Between Design Thinking, Lean Startup, and Agile</a></strong> [<strong><a href="https://strongopinionsweaklyheld.substack.com/">Strong Opinions, Weakly Held</a></strong>]</p></li><li><p><strong><a href="https://refactoring.fm/p/feature-flags">Feature Flags</a></strong> [<strong><a href="https://refactoring.fm/">Refactoring</a></strong>]</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://martinfowler.com/articles/continuousIntegration.html">Continuous Integration by Martin Fowler&#8217;s blog</a></strong></p></li><li><p><strong><a href="https://www.split.io/blog/branch-by-abstraction/">HOW TO BRANCH BY ABSTRACTION WITH FEATURE FLAGS</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://podcasts.apple.com/za/podcast/trunk-based-development-vs-gitflow/id1223811385?i=1000393287122">Trunk Based Development vs. Gitflow</a> </strong>[The Rabbit Hole podcast]</p></li><li><p><strong><a href="https://podcasts.apple.com/za/podcast/trunk-based-development-and-feature-flags-with-ej-tj/id1356275803?i=1000583105649">Trunk-Based Development And Feature Flags With EJ &amp; TJ</a> </strong>[The CTO Studio]</p></li></ul>]]></content:encoded></item><item><title><![CDATA[Lean Software Development]]></title><description><![CDATA[Lean Thinking was first introduced by Toyota in the 40s and then adapted to the Software Development world in 2003 - today I will enter you all in this methodology to understand his huge impact.]]></description><link>https://learnagilepractices.substack.com/p/lean-software-development</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/lean-software-development</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 30 Jan 2024 06:00:52 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!toPK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome back to Learn Agile Practices, the home of continuous improvement and learning for Software Developers.</p><p><strong>&#128204; In case you missed it</strong></p><p>In the first issue of 2024 last week, I shared my objectives for this year, with some spoilers on what to expect from this newsletter. In case you missed it, check it <a href="https://open.substack.com/pub/learnagilepractices/p/first-steps-in-code-the-significance?r=1arsz9&amp;utm_campaign=post&amp;utm_medium=web">here</a>.</p><p>Also, for those of you who speak Italian, my video podcast is back! Two episodes are already out:</p><ul><li><p>The Weekly Pomodoro #1 - Async work </p></li><li><p>Dev Debate #1 - Async work with Jaga Santagostino &amp; Simone D&#8217;Avico </p></li></ul><p>Watch them on YouTube <a href="https://www.youtube.com/channel/UCow5aybmZhzR7HbPf8JmcmA">here</a>, or listen on Podcast using <a href="https://www.spreaker.com/podcast/learn-agile-practices--4737447">Spreaker</a>.</p><p><strong>&#128293; Personal Coaching</strong> </p><p>If you want to speed up your growth as a software developer with Agile practices such as TDD and Clean Code, you should consider my coaching service: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of my First Lesson Free policy: enjoy the first free session and get to know me to see why I am the right person for you to improve your professionalism as a software developer. </p><p>Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>Lean Software Development</h1><h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>Today we talk about one of my favorite stories: Lean Thinking <strong>was born in the 40s in Toyota </strong>in the attempt of the Japanese company to become a leader in the automotive world business. This attempt will be successful and will build the legend of the Toyota Production System and its inventor <strong>Taiichi Ohno</strong>.</p><p>Ohno realized that the main issue of Toyota was that they were used to a PUSH mass production approach because this was the successful approach they were used to when creating military means. The Japanese car market didn&#8217;t have the same size and requirements, of course, so he brought the idea to shift to a PULL production approach, driven by customer demand.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!toPK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!toPK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!toPK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!toPK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!toPK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!toPK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg" width="498" height="498" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:498,&quot;bytes&quot;:160050,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!toPK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!toPK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!toPK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!toPK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd3622131-6569-484e-8e86-d1b45b2f5666_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This worker at Toyota just pulled the Andon cord, but something didn&#8217;t go well&#8230; according to AI &#128515;</figcaption></figure></div><p>The Toyota Production System has become legendary and it&#8217;s still evolving and in use today, its main goal is to reduce waste over the entire flow of work, and its main characteristics are: </p><ul><li><p>The <strong>right process</strong> to produce the <strong>right results</strong>: a pull system to avoid overproduction and balance workload, building a culture of stopping to fix problems and getting quality from the start</p></li><li><p>Add value to the organization by <strong>developing your people and partners</strong>: grow leaders who can then teach others, develop exceptional people and teams, and help your partners and suppliers improve</p></li><li><p>Continuously <strong>solving root problems</strong> drives organizational learning: go and see for yourself to understand the situation, make decisions by consensus considering all the options, and build a learning organization</p></li></ul><blockquote><p>What this means is that it is a system for thorough waste elimination. Here, waste refers to anything which does not advance the process, everything that does not increase added value. Many people settle for eliminating the waste that everyone recognizes as waste. But much remains that simply has not yet been recognized as waste or that people are willing to tolerate. [<a href="https://en.wikipedia.org/wiki/Toyota_Production_System">Wikipedia</a>]</p></blockquote><p>Lean Thinking is the methodology born from the Toyota Production System: since TPS worked well, it has been used as a model to build a framework to replicate the same principles in different types of companies, businesses, and contexts.</p><h3>From manufacturing to software</h3><p>In a progressive process, Lean Thinking was taken as inspiration and transposed from the manufacturing to the software world, because smart people started to notice that there is much that the software world can learn from Lean manufacturing - a good (invented) story about this is the book &#8220;The Phoenix Project&#8221;.</p><p>In 2003, Mary and Tom Poppendieck wrote the book &#8220;Lean Software Development&#8221;, where they formalized the idea of Lean applied to Software, describing the 7 principles they based it on:</p><ol><li><p>Eliminate Waste</p></li><li><p>Amplify Learning</p></li><li><p>Decide as late as possible</p></li><li><p>Deliver as fast as possible</p></li><li><p>Empower the team</p></li><li><p>Build integrity in</p></li><li><p>See the whole</p></li></ol><p>In a similar way to XP, since principles are pretty high-level, they went deeper with each of those to give some more low-level and practical description of what they meant.</p><h4>Eliminate Waste</h4><blockquote><p><em>Eliminating waste is the most fundamental lean principles.</em></p></blockquote><p>Software development has multiple types of waste, and the first step is to understand how to recognize them:</p><ul><li><p>unreleased work</p></li><li><p>obsolete or unused features</p></li><li><p>defects and bugs</p></li><li><p>context switch</p></li><li><p>waiting time</p></li><li><p>handoffs</p></li><li><p>unnecessary processes or documentation</p></li><li><p>management activities</p></li></ul><p><strong>Eliminating waste is definitely the place to start</strong>, and the main activity to achieve this target is to measure the lead time: you should map the high-level process from the idea to giving value to the customer, and then measure the time of this process including both work and wait time; this is the lead time, and once you are measuring it your objective is to pick the biggest opportunities to increase flow and reduce the lead time (theory of constraints) and implement it - then measure again to confirm the improvement, and move on with the next bottleneck.</p><h4>Amplify Learning</h4><blockquote><p><em>Generate the most knowledge at the least cost possible.</em></p></blockquote><p>Software Development is most often a <strong>learning process</strong>, so we should embrace that it involves trial and error and handle it by consequence, for example:</p><ul><li><p>make sure feedback loops are in place and at the highest speed possible</p></li><li><p>keep synchronization high: integrate code changes in small batches and make it fast to build and test the system (CI)</p></li><li><p>work in (short) iterations delivering the highest priority item first and then get feedback</p></li><li><p>Talk about constraints instead of solutions, and allow the obvious solution to emerge by getting feedback on multiple options</p></li></ul><h4>Decide as late as possible</h4><blockquote><p><em>The target is a robus, change-tolerant design for the system so that it can be readily adapted to most likely changes.</em></p></blockquote><p>We need to avoid that changing code becomes always harder because of new code, and to do that we need to <strong>favor emerging design over time</strong>. To achieve this target, we want to decide as late as possible following 3 main principles:</p><ul><li><p><strong>Options Thinking</strong>: make decisions under the road, delaying irreversible decisions until the uncertainty is gone (or reduced to the minimum); be open to doing something new in the future without building it before it&#8217;s needed and improve your skills in understanding what options are worth to keep open</p></li><li><p><strong>Last responsible moment</strong>: delay decisions until failing to make a decision removes important alternatives - to delay commitment, favor abstractions over specific representations, separate interfaces from implementations, and use feature flags; the only decisions to take early are those that facilitate design to emerge</p></li><li><p><strong>Making decisions</strong>: plan work without predicting it, and use simple principles or guidelines to enable decision-making by the people closest to work. </p></li></ul><h4>Deliver as fast as possible</h4><blockquote><p><em>The faster is delivery, the longer decisions can be delayed.</em></p></blockquote><p>Delivering fast is important to reduce the feedback loop and reduce the weight of  reversible decisions; to optimize speed without dropping quality, there are three main pillars to follow:</p><ol><li><p>Implement a <strong>pull system</strong>, where customers pull the work instead of a schedule pushing it; use Kanban to visualize the work so that everyone can see what&#8217;s going on.</p></li><li><p>Follow <strong>queuing theory</strong> to reduce cycle time: split incoming work into small batches, prioritize work regularly, make people focus on bottlenecks, and limit variability in work; the target must be to optimize for quicker cycle time instead of people utilization, so you should always leave enough slack in capacity and a parallel independent stream of work.</p></li><li><p><strong>Delays have a cost</strong> so we want to reduce it: give the team a simple, economic model, empowering it to make tradeoff decisions by putting a price tag on delivering vs delay; avoid trades of time vs scope vs money by making it all about money.</p></li></ol><h4>Empower the team</h4><blockquote><p><em>Give people the power to decide for their work, but also invest in developing their capacity of making decisions.</em></p></blockquote><p>Decisions should be at the lowest level possible to ensure they are contextual and fast. You should empower the team by helping people to develop some characteristics: the team should <strong>feel responsible for their own work</strong> (including processes, practices, quality, etc), while managers should listen to the teams and help them remove organizational blockers but also coach them.</p><p>Allowing the team to commit together to achieve their objectives, celebrating successes, and allowing for mistakes will make people more motivated and committed, which is one of the objectives of leadership: set direction and lead, don&#8217;t manage.</p><p>Finally, ensure that the expertise of the team always grows over time: <strong>encourage experiments and continuous training and learning</strong>, favor sharing sessions to spread the knowledge gained, favoring conversations over documentation) and build internal communities of expertise.</p><h4>Build integrity in</h4><blockquote><p><em>Integrity is a key differentiator.</em></p></blockquote><p>We need to build <strong>great product integrity</strong> that must be perceived in the eyes of the customers - this integrity is built by multiple pieces: </p><ul><li><p><strong>Clear communications with customers</strong>: we need to ensure that the communication flows between customers and the team in both directions; it must be easy to receive feedback about the last iteration, but also to keep customers updated on what&#8217;s new; customer&#8217;s problems should always be kept as a priority when making decisions, supporting the team in achieving and maintaining a deeper customer understanding.</p></li><li><p><strong>Clear communications within the team</strong>: ensure that the core concepts of the product belong together, and enable a regular flow of information between everyone working on the product, making it easy to discuss and solve problems together.</p></li><li><p><strong>Continuous refactoring</strong>: foster a clean code culture to reduce the cost of refactoring and enable refactoring code daily to maintain the codebase under control; allow design and architecture to evolve so that you can delay decisions also on them; to ensure you refactor only where it&#8217;s worth it, try to refactor a piece of code right before it needs to change.</p></li><li><p><strong>Testing</strong>: help the team in improving their testing knowledge and skills to ensure they use all the best possible testing techniques, from unit to e2e tests; ensure testing is automated, and use acceptance tests as a tool to ensure customer needs are met.</p></li></ul><h4>See the whole</h4><blockquote><p><em>The ability of a system depends on how well the parts work together.</em></p></blockquote><p>We should always strive to improve the whole system and not the single parts: the focus when removing constraints, addressing problems, and measuring results should be on the entire system and not on an individual level. </p><p><strong>Avoid measuring locally</strong>, because you want to optimize the whole and not just a small part: measure group productivity, not individual one - we want to win a marathon, not only a section. </p><p>When writing contracts with supplies and vendors assume good intent, and limit damaging behavior through relationship, not the contract, favoring a kind of contract that shares goals instead of fixed price ones.</p><h3>A successful model for businesses</h3><p>After all this history about Lean, and considering the words I use to talk about it, it&#8217;s probably quite clear that I love the Lean approach: it&#8217;s just a perfect match with the Software Industry and it should be much more considered.</p><p>The first time I heard about the Toyota Production System and Lean was in the Phoenix Project book: a narrative/tech book that tells the story of Bill, an IT Manager at a company called Parts Unlimited. Bill is responsible for a project that is fundamental for the future of the company but it&#8217;s massively over budget and later (codename &#8220;Phoenix&#8221;): he has 90 days to make it successful, otherwise the entire department will be outsourced. Luckily, he will receive the help of Erik, a new board member who shares his knowledge of TPS, Lean, and DevOps with Bill.</p><p>Through Erik, the authors make this book much more than simply a fun narrative about very common historical issues of the Software industry: through the story, you can <strong>learn the basics of those methodologies</strong> - and this book does not only have a sequel (The Unicorn Project) but also a strictly related book named The DevOps Handbook, a more classical tech book from the same authors that deep dive into the methodologies used in the story.</p><p>I was already into Agile and XP at that point, and I knew the basic principles of DevOps - I was fascinated by the story of Toyota and the Lean methodology, especially because it&#8217;s pretty clear that <strong>Agile, XP, Lean, and DevOps share a lot</strong>: to be honest, I treat them as a family.</p><p>Once you deep dive into Lean Software Development, you can either be fascinated or horrified I guess - based on which kind of professional developer you are: to me, a born team player who LOVES the team dynamics of collaboration practices such as Pair/Mob Programming, the focus on the entire system and not on individuals not only makes a lot of sense (that should be objective&#8230;) but also motivate me a lot.</p><p>Thanks to Lean, I learned to <strong>focus on flow</strong> and became interested in topics such as reducing work in process, especially the &#8220;extreme&#8221; version of it: Single-Piece Flow, where we can only work on one thing at a time - I even dedicated an <a href="https://learnagilepractices.substack.com/p/stop-overcommitting-and-start-delivering">old issue</a> of the newsletter and a <a href="https://docs.google.com/presentation/d/e/2PACX-1vQ1dtcMJOv6K0v2ioLatd1jlRR_YYTKPjNpjfZ8bDSlUvpqZFjBiJulnptM8Vb8DYWbJg5f7aUdJr6m/pub?start=false&amp;loop=false&amp;delayms=3000&amp;slide=id.p">talk</a> to this topic that seems so revolutionary in a world where multi-tasking is considered somehow the standard, completely ignoring how our brain works.</p><p>The 7 Lean Software Development principles I described above describe the way I see software work in a way that is probably even better than what Agile and XP can do because they mostly focus on team and company as a system, and if there is one thing I can say is that <strong>if the system doesn&#8217;t work you will fail</strong>, no matter if you have the best people in the team: there&#8217;s no way out. </p><p>Also, the Toyota story is a good conversational tool when you are trying to sustain the introduction of practices: the idea that a big company such as Toyota thinks that it&#8217;s a good idea to introduce the Andon cord to allow anyone over the entire production line to <strong>stop the entire line if something breaks up</strong> is incredibly powerful; making people responsible for the quality, and when something happens everyone focuses on the problem, instead of continuing the work on the working parts, not only enable a quicker fix of the problem but also avoid to accumulate work in the broken part of the system that would cause a slower restart when the fix is done - therefore, stopping all the work is better because it reduces the overall waste. </p><p>The first time I understood this, it was mind-blowing.</p><p>Lean is even <strong>more fascinating</strong> to me than Agile and XP, and this was a surprise for me: now I think the reason is that XP and Agile were made by developers and only after reached also other businesses, so they might be perceived as biased, especially when trying to foster them with skeptics or non-technical people. </p><p>Lean, on the other hand, did the opposite way: it was born in the manufacturing world, and only after it reached the Software world. This has some positive side effects:</p><ul><li><p>it&#8217;s far easier to have concrete examples that it works, and Toyota is just the biggest example of them all - this makes the conversation with non-technical people far easier</p></li><li><p>It has an intrinsic match with businesses (reducing waste, we reduce costs and will more likely be successful and obtain more profit) and therefore the Software implementation of Lean seems more understandable to business people</p></li></ul><p>I strongly believe that Lean is an amazing methodology to use in both business and software, and I hope that Lean Startup and Lean Software Development methodologies will keep growing in popularity because this can only bring positive side effects to our world.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><div class="pullquote"><p>All we are doing is looking at the timeline, from the moment the customer gives us an order to the point when we collect the cash. And we are reducing the timeline by reducing the non-value-adding wastes.</p><p>[Taiichi Ohno]</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3OvkMqz">The Toyota Way</a></strong> - <em>A classic in the world of business management, The Toyota Way has been helping leaders create powerful strategies based on the automaker's legendary management principles and philosophy for nearly two decades.</em></p></li><li><p><strong><a href="https://amzn.to/3UctywW">Taiichi Ohnos Workplace Management</a></strong> - <em>This unique volume delivers a clear, concise overview of the Toyota Production System and kaizen in the very words of the architect of both of these movements, Taiicho Ohno.</em></p></li><li><p><strong><a href="https://amzn.to/3HrUmlv">Lean Software Development</a></strong> - <em>In Lean Software Development, Mary and Tom Poppendieck identify seven fundamental "lean" principles, adapt them to the world of software development, and show how they can serve as the foundation for agile development approaches that work. Along the way, they introduce 22 "thinking tools" that can help you customize the right agile practices for any environment.</em></p></li><li><p><strong><a href="https://amzn.to/3vGKPnV">Implementing Lean Software Development</a></strong> - <em>While the previous book provides an introduction, theoretical advice, and a reference to Lean, this follow-up incorporates their gained knowledge and understanding of what works and goes steps further to provide hands-on guidance for implementing a Lean system.</em></p></li><li><p><strong><a href="https://amzn.to/3OaPMvD">The Phoenix Project</a></strong> - <em>The CEO demands Bill must fix the mess in ninety days or else Bill&#8217;s entire department will be outsourced. In a fast-paced and entertaining style, three luminaries of the DevOps movement deliver a story that anyone who works in IT will recognize. Readers will not only learn how to improve their own IT organizations, they&#8217;ll never view IT the same way again.</em></p></li><li><p><strong><a href="https://amzn.to/48VzAX6">The DevOps Handbook</a></strong> - <em>Technology is now at the core of every company, no matter the business model or product. The theories and practices laid out in The DevOps Handbook are tools to be used by anyone from across the organization to create joy and succeed in the marketplace.</em></p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://strongopinionsweaklyheld.substack.com/p/the-difference-between-design-thinking-lean-startup-and-agile-5cf07b117562">The Difference Between Design Thinking, Lean Startup, and Agile</a></strong> [<strong><a href="https://strongopinionsweaklyheld.substack.com/">Strong Opinions, Weakly Held</a></strong>]</p></li><li><p><strong><a href="https://bitbytebit.substack.com/p/2019-07-22-examples-of-seven-wastes-of-software-development">Examples of the hidden wastes of software development</a></strong> [<strong><a href="https://bitbytebit.substack.com/">Bit Byte Bit</a></strong>]</p></li><li><p><strong><a href="https://learnagilepractices.substack.com/p/stop-overcommitting-and-start-delivering">&#9995;Stop Overcommitting and &#128666; Start Delivering: The Benefits of WIP Limit in Software Development &#129489;&#8205;&#128187;</a></strong> [<strong><a href="https://learnagilepractices.substack.com/about">Learn Agile Practices</a></strong>]</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://rupertsnook.medium.com/book-summary-for-lean-software-development-an-agile-toolkit-7082b9bdc02">Book Summary for Lean Software Development</a></strong></p></li><li><p><strong><a href="https://leansixsigmabelgium.com/blog/toyota-six-sigma-14-solid-principles/">Toyota Production System : 14 Solid Principles</a></strong></p></li><li><p><strong><a href="https://mag.toyota.co.uk/13-pillars-of-the-toyota-production-system/">13 pillars of the Toyota Production System</a></strong></p></li><li><p><strong><a href="https://www.productplan.com/glossary/lean-software-development/">What is Lean Software Development (LSD)?</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://podcasts.apple.com/jp/podcast/91-lean-software-development-principles-and-mindset/id1523421550?i=1000565360908">#91 - Lean Software Development Principles and Mindset - Mary &amp; Tom Poppendieck</a></strong> [TechLead Journal podcast]</p></li><li><p><strong><a href="https://open.spotify.com/episode/3IR9D3x0Tc19WZ73wIIKED">Lean Software Development - It&#8217;s About Uncertainty!</a></strong> (Healthy Software Developer podcast)</p></li><li><p><strong><a href="https://thedigitalbusinessanalyst.co.uk/podcast-s3e05-lean-software-engineering-ff4fed9dfd1d">Podcast S3E05: Lean Software Engineering</a></strong> [The Burn Up - Agile Software Delivery podcast]</p></li><li><p><strong><a href="https://open.spotify.com/show/0WlXpTGl6DJZsb3UBShyIC">The Toyota Production System</a> </strong>podcast</p></li></ul><h3>&#128104;&#127995;&#8205;&#127979; Online courses</h3><ul><li><p><strong><a href="https://www.pluralsight.com/courses/lean-software-development-fundamentals">Lean Software Development Fundamentals</a> </strong>[Pluralsight]</p></li></ul><h3>&#128373;&#65039;&#8205;&#9792;&#65039; Others</h3><ul><li><p><strong><a href="https://global.toyota/en/company/vision-and-philosophy/production-system/">Toyota Vision</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[My plans for 2024]]></title><description><![CDATA[The new year has come and as every year the LAP restart with some spoilers of what will come in the next months and my personal objectives!]]></description><link>https://learnagilepractices.substack.com/p/my-plans-for-2024</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/my-plans-for-2024</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 23 Jan 2024 06:00:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!EohB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Introduction</h3><p>Happy 2024, developers! &#128640;</p><p>A new year has arrived, and every year I start my content production by sharing publicly my plans and objectives for the year, in this case specifically for Learn Agile Practices. You will find spoilers about new types of content and formats, the evolution of existing formats, and my personal learning plan related to my professional growth.</p><p>As always, the target is double: on one side, sharing these objectives will motivate me more in trying to achieve them, but on the other side, as always with any of my content, I hope that these objectives might inspire and be useful to you all.</p><p>Let&#8217;s start!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EohB!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EohB!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!EohB!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!EohB!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!EohB!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EohB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png" width="500" height="500" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b206f41d-2483-40cc-933a-26e17b8f0717_500x500.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:500,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:71163,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EohB!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 424w, https://substackcdn.com/image/fetch/$s_!EohB!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 848w, https://substackcdn.com/image/fetch/$s_!EohB!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 1272w, https://substackcdn.com/image/fetch/$s_!EohB!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb206f41d-2483-40cc-933a-26e17b8f0717_500x500.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">LAP logo is a fidget-spinner because it&#8217;s a toy to relieve nervous energy,&nbsp;anxiety, or<a href="https://en.wikipedia.org/wiki/Psychological_stress"> </a>psychological stress: Agile and the practices derived from it have the same target in software development.</figcaption></figure></div><h3>Learn Agile Practices evolution</h3><p>The most important element of LAP currently is the newsletter, and this will remain true because it&#8217;s the main content I do in English and this is important for me - anyway, an evolution in the format is required from my point of view. </p><p>In the latest issues, I noticed that I felt the desire to invest more time into my take section, and less time into the introduction; this not only made it harder to write but also caused the two sections to be a bit mixed compared to the past; because of this, I decided to simplify the newsletter and just write everything in a single section, where I will for sure introduce the topic but will put more focus on my point of view and reflection on it. The Go Deeper section will remain: I consider that one of the identifiers of my content: there&#8217;s always a way to deep dive into a topic if you are interested, and helping in doing that is an important objective of my content.</p><p>The biggest news from a content production point of view is that I will be back with Youtube videos and podcasts: by the end of January I will be back with a video podcast series of episodes that will be available both on video and podcast, but it will be all in Italian, at least for now. This is mainly because it&#8217;s easier for me to create such content without too much preparation if I use my natural language, and it's also easier to invite other developers to a monthly interview special edition episode that I plan to start. I want to bring 2 main formats to my video podcasts:</p><ol><li><p>The Weekly Pomodoro: one topic, 25 minutes available for me to talk about it. Weekly on Thursday, the first episode will be out on the 25th of January</p></li><li><p>The Debate: a monthly episode coming out on the last Wednesday of each month, in addition to the weekly one; I will deep dive into a hot topic (typically introduced in the previous Weekly Pomodoro) with one or more guests that will either disagree with me about the topic or be an expert on it that can share some insights with us.</p></li></ol><p>You can subscribe to my YouTube channel here and see on which platform the podcast is available here to follow.</p><p>Then, let&#8217;s talk about my services: personal coaching service will remain available - all the previous coaching has been completed and I&#8217;m thinking of evolving this service but for now is available in the same format: 699$ for 12 one-hour lessons, with a First Lesson Free policy (enjoy the first free session and get to know me to see why I am the right person for you to improve your professionalism as a software developer) and also remember that you have access to dedicated discount as a subscriber to this newsletter, just contact me to discover more.</p><p>But the main service I will focus on this year is my TDD &amp; OOP Workshop: the first edition last year was a great success, with 8 participants in a 4-hour practical session and very positive feedback. I plan to repeat at least 3 more free versions of the workshop in the first quarter of 2024, to keep improving the format, and then start offering a paid version in the second half of the year, both online and in person (somewhere in Milan).</p><p>The best way to remain updated on all my initiatives, in addition to this newsletter, is to follow me on LinkedIn here. </p><h3>My learning plan</h3><p>I&#8217;ve reflected a lot on my learning plan for this year because there are multiple topics that I&#8217;m interested in - hopefully, the plan is not impossible to achieve:</p><ol><li><p>First of all, I want to go even more in-depth with my knowledge about OOP and TDD, meaning not only improving even more with the practices but also expanding the list of OOP programming languages I know. My plan here is to deep dive into books like: &#8220;<code>Clean Code&#8221;, &#8220;Growing Object-Oriented Software Guided by Tests&#8221;, &#8220;Working Effectively with Legacy Code&#8221;</code>. On the other side, I will study multiple programming languages: Typescript (I already know it and worked with it for a couple of years, but I don&#8217;t work with it now and I want to go deeper with it, but also Go, Rust, and Ruby. The idea here is to read the documentation and use some tools:</p><ol><li><p><a href="https://exercism.org/">Exercism</a> to move the first steps with Katas of raising difficulty</p></li><li><p><a href="https://codingchallenges.substack.com/">Code Challenges</a> newsletter from John Crickett, to raise the level with more structured projects</p></li><li><p><a href="https://codecrafters.io/">CodeCrafters</a> to make the most realistic project possible creating clones of Redis, Docker, or other famous existing products</p></li></ol><p>In the end, I will probably pick one of those languages, the one that I liked the most, to dive even more into it with a book and an even bigger side project.</p></li><li><p>Functional Programming: I want to start learning this paradigm, that I already faced and worked on for a year in 2020/2021, but it has been a while and not much knowledge has remained on me so it&#8217;s like I have to start from scratch. The plan is to do this in the second part of the year, and I will probably start by following Giulio Canti&#8217;s course guide in <a href="https://github.com/gcanti/functional-programming">this</a> repository (I had the pleasure to participate in one of its courses and this should help me remember most of it), then I will probably go with &#8220;<code>From Object To Functions&#8221;</code>, a book that has been strongly suggested to me. Finally, I will probably also read <code>Domain modeling made functional</code>.</p></li><li><p>Public speaking: in 2023 I experienced my first talk at a conference, and in the entire year I had 3 talks in Meetups and 1 talk at a big conference (Italian Agile Days). I love that, so I plan to take more talks and participate in more conferences this year, and I would also like to invest some time in learning public speaking. I&#8217;m still exploring the how, what, and when of this, so if you have any suggestions please feel free to contact me!</p></li></ol><p>That&#8217;s it with my 2024 goals, let me know what you think and what are your goals!</p><p>Before saying hi, here is a short spoiler recap of the following appointment with LAP:</p><ul><li><p>The podcast returns, in Italian and also on video, with new episodes starting in 2 days:</p><ul><li><p>25th of January - The Weekly Pomodoro: Why I don&#8217;t like async work</p></li><li><p>31st of January - The Debate: Async work w/ Jaga Santagostino &amp; Simone D&#8217;avico</p></li><li><p>1st of February - The Weekly Pomodoro: Object-Oriented Programming Misconceptions</p></li></ul></li><li><p>Next week in this newsletter &#8594; Lean Software Development</p></li><li><p>On February, specific date tba: 2nd edition of my &#8220;TDD &amp; OOP&#8221; Workshop Online, 6 seats available</p></li></ul><p>The best way to remain updated on all this stuff is to remain subscribed to this newsletter and follow me on LinkedIn <a href="https://www.linkedin.com/in/daniele-scillia/">here</a>. Always feel free to contact me for any questions or needs, I&#8217;m also available for some mentorship and support in general, and always happy to help if I can!</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p>]]></content:encoded></item><item><title><![CDATA[Learn Agile Practices Wrapped 2023]]></title><description><![CDATA[Celebrate the journey, embrace the lessons! &#127881; Join me in reflecting on the milestones, the learnings, and the evolution that made 2023 an unforgettable year for me and Learn Agile Practices.]]></description><link>https://learnagilepractices.substack.com/p/learn-agile-practices-wrapped-2023</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/learn-agile-practices-wrapped-2023</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 12 Dec 2023 06:00:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!vUXX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>Introduction</h3><p>Hello, developers! &#128640;</p><p>Another year has come to an end, and it&#8217;s the first year of this newsletter, that started the 20th of January this year with the first article: <a href="https://learnagilepractices.substack.com/p/why-agile-is-important">Why Agile is important?</a></p><p>Today, I want to share with you my personal retrospective on this years, considering all aspects of my professional life as a Software Engineer and Content Creator, and in the first issue of the year I will also share my objectives for 2024.</p><p>The reason to share this kind of stuff is that sharing is a great way to both celebrate success (and you will hopefully celebrate with me!) and also commit to the new objectives and make them more concrete. It&#8217;s a great way to find motivation, and I&#8217;ve started doing this since 2020 when my content was only Italian.</p><p>I will be short, I promise: let&#8217;s jump into it!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!vUXX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!vUXX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vUXX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vUXX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vUXX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!vUXX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg" width="390" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:390,&quot;bytes&quot;:67778,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!vUXX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!vUXX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!vUXX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!vUXX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F104b6dc4-1eb9-404a-97d6-5243a9c58aff_1024x1024.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A cartoonized version of myself.</figcaption></figure></div><h3>Happenings and Achievements</h3><p>This year, I started the Learn Agile Practices journey: LAP currently is made by this newsletter, but in my head, it&#8217;s already clear how to evolve it and to make it become much more: more types of content (audio/video) and a technical coaching service for developers (personal coaching always available, but also free sessions and workshop).</p><p>In this first year, the result was pretty good! I reached 54 subscribers to the newsletter, and 129 subscribers to my Youtube channel. I offered my first free TDD Workshop, which was a great success, and I was able to speak at a great conference such as the Italian Agile Days 2023, but also to a couple of meetups - and I&#8217;m particularly proud of my talks! In addition, a collaboration with Codemotion started: I will write a monthly article in Codemotion Magazine (in Italian) about Agile practices and methodologies, the first one will be out before Christmas!</p><p>It was a great first year, and hopefully, the next one will be even better!</p><p>In case you missed them, these were the top 2 most read articles from this year:</p><ul><li><p><a href="https://learnagilepractices.substack.com/p/choosing-wisely-when-to-go-sync-and">Choosing Wisely: When to Go Sync &#9203; and When to Go Async &#9200; in Software</a> (109 views)</p></li><li><p><a href="https://learnagilepractices.substack.com/p/stop-overcommitting-and-start-delivering">&#9995;Stop Overcommitting and &#128666; Start Delivering: The Benefits of WIP Limit in Software Development &#129489;&#8205;&#128187;</a> (107 views)</p></li></ul><p>From a professional point of view, I kept investing a lot of time in learning and continuous improvement, focusing on different objectives: improving my approach to learning, improving my communication skills, and deep dive into top Agile practices such as Refactoring, TDD, etc.</p><p>This is the list of the books I read (or studied) in 2023:</p><ul><li><p><a href="https://amzn.to/4a3n35n">Non-violent communication</a> &#8594; a nice framework for effectively communicating things without hurting people, especially when expressing negative feedback or critics</p></li><li><p><a href="https://amzn.to/3tdePqv">Practice Perfect</a> &#8594; a wonderful book about coaching techniques and best practices, useful from both perspectives of the teacher and the learner, and therefore useful for when I&#8217;m learning but also when I&#8217;m coaching</p></li><li><p><a href="https://amzn.to/47X2CVQ">Refactoring</a> &#8594; a milestone about how to approach refactoring effectively; the most relevant part, IMHO, is that refactoring can only happen if we have tests to validate that the behavior doesn&#8217;t change - and that refactoring should be a daily habit, not a special occasion</p></li><li><p><a href="https://amzn.to/485nryj">Practices of an Agile Developer</a> &#8594; a cool book that is a quick trip around all the best technical practices known today; a great refresher of all of those, with some gems and personal examples from real experience</p></li><li><p><a href="https://amzn.to/41ajne2">Accelerate</a> &#8594; by far the best book I read this year - the moment I discovered that a book based on research that proves that techniques such as TDD and CD have a positive impact on business exists, I knew I had to read it, and it was amazing as expected; the info in this book is the best argument existing to support why such practices should be implemented in every company</p></li></ul><p>From a career point of view, I realized one of my objectives: working from home for a foreign company outside of Italy. I currently work for TourRadar, a travel-tech company based in Vienna: a company with such a great culture and passionate people, and I&#8217;m very proud to be part of it. </p><h3>Learnings</h3><p>It&#8217;s good to rethink what happened and fall into a bit of nostalgia, but the main reason to do it is to learn something from it - so here is what I learned this year:</p><ul><li><p>I love speaking in public. I like it and I want to invest some learning time in it to improve my public speaking skills, for sure.</p></li><li><p>I prefer sync software development: async work is a thing today, especially when working remotely, but I think we are overusing async - especially for refinements, brainstorming, and software development, I love sync conversations. Refining a feature or request is easier with a conversation, same as pair/mob programming is better than async PRs.</p></li><li><p>I believe I have some entrepreneurial spirit: I don&#8217;t think I will ever jump into my own startup unless I find an idea that makes me fall in love, but I would love to jump into a startup as the first and only developer at the beginning, for sure!</p></li><li><p>After a lot of learning about practices and methodologies (and much more to learn, especially about ATDD, BDD, and DDD), I think it&#8217;s probably time to enlarge my portfolio of languages</p></li></ul><h3>See you in 2024</h3><p>And that was my wrap for the 2023 year of myself and Learn Agile Practices! Hope you liked it, feel free to share your learnings of the year and any feedback or suggestions about LAP!</p><p>The newsletter will be back on the 16th of January, with the first issue exploring my objectives for 2024 and presenting all the news that will come - then, we will jump back into content with a great topic: Lean!</p><p><em><strong>Until next time, Merry Christmas, Happy New Year, but most of all, Happy coding </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187; </strong></p>]]></content:encoded></item><item><title><![CDATA[My personal 2023 directory of AI & No-Code tools 🤖⚙️]]></title><description><![CDATA[In this last "content-focused" issue of the year, I want to make a small gift to all of you, and share the list of AI and No-code tools I used over the last 12/18 months, in case they might help you!]]></description><link>https://learnagilepractices.substack.com/p/my-2023-directory-of-ai-and-no-code</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/my-2023-directory-of-ai-and-no-code</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 05 Dec 2023 06:00:38 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!c6Qe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome to the home of continuous improvement and learning for Software Developers.</p><p>&#128204; In case you missed it: in the last issue, I got inspired by my talk at IAD 2023 about CI and Trunk-Based Development, and specifically from a question I received about this year's State of DevOps Report that suggests that Trunk-Based Development might increase the burnout: I was skeptic, so I took the report and read it in deep, and then I wrote my thought about it. In case you missed it, check it <a href="https://learnagilepractices.substack.com/p/trunk-based-development-might-increase">here</a>.</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>My personal 2023 directory of AI &amp; No-Code tools &#129302;&#9881;&#65039;</h1><p>Hello, developers! &#128640;</p><p>First of all, a small announcement: this is the last &#8220;content-focused&#8221; newsletter of the year - what I mean is that next week I will share a personal retrospective of 2023, a short recap of what I achieved and learned in the last 12 months - and then, the newsletter will be back in January, after holidays.</p><p>This week, I&#8217;ll be sharing a small &#8220;Christmas gift&#8221;: my personal directory of AI and No-Code tools that I've discovered and used in 2023 (and before). It will not be an exhaustive, immense list of tools - but it will be very concrete. If you are passionate about AI and No-Code, I&#8217;m not sure you will find new tools here, but you will find tools I used and tested, with a short review of my experience, or tools that I already studied a bit and wants to try soon in the future. </p><p>Hopefully, this list will be useful for you all to reflect on how AI and No-Code could enter your daily work habits and improve your productivity! </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!c6Qe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!c6Qe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c6Qe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c6Qe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c6Qe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!c6Qe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg" width="400" height="400" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:400,&quot;bytes&quot;:143943,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!c6Qe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!c6Qe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!c6Qe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!c6Qe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2560b6b3-df30-4bc2-beb6-5597bdc17087_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">This image is generated via ideogram.ai, like all the images of my newsletter - here is the prompt I used: &#8220;A cute realistic style of a lady software developer with a laptop, while she is smiling and coding. she has dark hair, fashion, text rendering, illustration, anime, with black glass, typography, fashion, photography, rendering 3d, dark fantasy, poster, illustration, typography, fashion, photo, 3d render, cinematicv0.2.&#8221;</figcaption></figure></div><h2>Some thoughts about AI and No-Code</h2><div class="pullquote"><p>Small note: I will simplify the post here by writing &#8220;No-Code&#8221; - but I will also include some &#8220;Low-Code&#8221; tools. This is for two main reasons: the first one is that it will make it easier to read; the second one is that, in general, in real-world usage, you will still need to code a bit to integrate your system with a &#8220;No-Code&#8221; tools, similarly to what a &#8220;Low-code&#8221; tool requires - the difference is that &#8220;No-Code&#8221; tools might be enough by themselves in some context, as standalone tools.</p></div><p>I&#8217;ve been interested in No-Code tools since 2021, and 2023 has been the year of AI, and it&#8217;s full of tools out there. No-Code tools are inevitably more mature, in general, since they have been around a lot longer - but AI tools have way more traction at the moment (and some tools are also both No-Code and AI).</p><p>I think that the time is mature for us, as Software Developers, to start adding some of those tools into our toolbox for our daily job, and that&#8217;s where this list comes from: my own experience in starting using these tools in the real world.</p><p>One of the things that astonishes me is that looks like AI tools have been accepted more by Developers than No-Code - I mean, AI is fascinating, especially for tech people like us, but No-Code is way more mature at the moment and offers solutions to simplify some architectural patterns.</p><p>This is one of the points I want to touch here: No-Code is cool, and has a lot of potential - give it a chance! </p><p>The second point is: be careful! Especially AI tools, but also No-Code tools, are still relatively young - make sure to a spike and/or POC to test it works as desired and monitor the tools to be sure that they can sustain your system and that you can trust them.</p><p>The third point: be open-minded! Some ideas to use such tools will be straightforward, but for others, you will need to be creative. </p><p>I think 2024 will be the year when such tools will become &#8220;common enough&#8221; in our systems and can help us speed up some of our implementations!</p><h2>The list of tools</h2><h3>AI Tools</h3><h5>Tools I Use Often</h5><ul><li><p><a href="https://app.grammarly.com/">Grammarly</a>: An AI-powered writing assistant that helps improve grammar and writing style - I have used it since 2021 and in the last year I got access to Business features thanks to my company: worth it! The effectiveness of Grammarly, at least in English, is amazing!</p></li><li><p><a href="https://ideogram.ai/">Ideogram</a>: An image generation AI, an alternative to Midjourney, DALL-E, etc. It is pretty simple to use via a simple browser UI, and generated images are pretty nice, especially for comics-stiles; it also produces written text well enough. I typically use it to generate the images for my newsletter and other type of content.</p></li><li><p><a href="https://chat.openai.com/">ChatGPT</a> / <a href="https://www.notion.so/product/ai">NotionAI</a>: I mostly use these two to help me with the draft, outlines, and ideas for content creation. I think NotionAI is generally better in its outputs, at least for text content creation, but only when I can use my Notion Second Brain content as a reference. In other conditions, ChatGPT is more flexible and returns good text too.</p></li><li><p><a href="https://quillbot.com/">Quillbot</a>: A powerful paraphrasing tool that uses AI to generate alternative suggestions for text: sometimes, I&#8217;m not sure that what I wrote in English is actually fluent to read, or just need some suggestions for synonyms to avoid repetitions, etc. When Grammarly is not enough, Quillbot is a great additional tool to get help on that! Can also be useful when you need to find a good name for a variable/class in programming, to look for alternatives.</p></li></ul><h5>Tools I've Used a Few Times</h5><ul><li><p><a href="https://github.com/features/copilot">GitHub Copilot</a>: You all know this one! I will be honest: it&#8217;s not completely in my flow at the moment. I hate the definition on the website (&#8220;Your AI Pair Programmer&#8221; - please, pair programming is something else), but I can get over it :D I just have to find a way to use it better. But it&#8217;s powerful, and can speed up some coding stuff: I will increase usage for sure!</p></li><li><p><a href="https://gummysearch.com/">Gummysearch</a>: An AI analysis tool that leverages Reddit audience data to generate business ideas. It&#8217;s amazing the amount of data and information that Gummysearch can provide - some default audiences are offered from the tool, but you can try to create your own and generate a custom data fetch. Some info about the audience is behind a paywall, but if you are looking for niches and business ideas, this is a great tool!</p></li><li><p><a href="https://founderpal.ai/marketing-strategy-generator">Founderpal</a>: A marketing strategy generator powered by AI. You just describe your idea and you receive a user persona and suggestion for marketing that idea. As simple as this. Don&#8217;t expect a tailor-made marketing strategy in detail, but some actionable tips and initiatives you can put into practice, for sure!</p></li></ul><h5>Tools I Want to Test in the Future</h5><ul><li><p>Video 2 shorts converter: A tool that converts long videos into short, engaging clips: I want to come back with podcasts and will publish them also in the video version, so the idea is to repurpose shorts from the podcast video, of course, in addition to dedicated shorts. I selected a group of three tools to test: <a href="https://vizard.ai/tools/youtube-video-editor/youtube-shorts-maker">Vizard</a>, <a href="https://2short.ai/">2short</a>, and <a href="https://www.quickvid.ai/">Quickvid</a></p></li><li><p><a href="https://www.rewind.ai/">Rewind.ai</a>: The promises of Rewind are amazing: Rewind runs in the background capturing your screen and audio, then compresses, transcribes, encrypts, and stores your data locally (so only you have access) and you can chat with him and ask questions about all that happened, like meeting notes, email drafts, etc. Something that might be worth trying!</p></li><li><p><a href="https://www.browse.ai/">Browse.ai</a>: An AI-powered tool that can extract data from a web page and put it in a spreadsheet. I have a couple of side projects where I would need such a tool to collect data from non-formal sources, and in general, it happens quite often that you need to collect data in a company so it&#8217;s a tool that can be useful to learn also for suggesting it when someone need to do something similar.</p></li><li><p><a href="https://asknotion.app/?ref=taaft&amp;utm_source=taaft&amp;utm_medium=referral">Asknotion.app</a>: An AI-based question-answering platform that integrates with Notion - the idea here is to connect this to my Second Brain databases on Notion to see what it allows me to do and if it&#8217;s more useful than Notion AI itself. If the questions are more free, it might be interesting!</p></li><li><p><a href="https://github.com/di-sukharev/AI-TDD">AI-TDD</a>: An AI tool for Test-Driven Development - and here, I&#8217;m dreaming. What I want to do is try to practice doing TDD with me writing tests, and AI implementing and refactoring the code. The idea behind this is that I expect in the future AI could remove the need to maintain code from us - because it will be able to it by itself - but good Agile practices will always be useful to reduce risks, be sure code does what we need, release often, etc - and this could be the first step in that direction!</p></li></ul><h3>No-Code Tools</h3><h5>Tools I Use Often</h5><ul><li><p><a href="https://substack.com/">Substack</a>: The platform I use to handle this newsletter - it&#8217;s easy to use, allows for premium subscription and other potential functionalities I might use in the future, and it&#8217;s continuously evolving.</p></li><li><p><a href="https://www.notion.so/">Notion</a>: A versatile workspace tool that enables collaboration and organization. I use it for a multitude of stuff: my daily job Journal, my personal notes about all the learning content I study (from books to online courses, blog posts, podcasts, etc.), tracking my quarter/weekly objectives, organization of all related to Learn Agile Practices (newsletter content calendar, podcast content calendar, but also workshop content, etc). It&#8217;s amazing and easy to use, and it also has APIs, that can always become useful somehow.</p></li><li><p><a href="https://carrd.co/">Carrd</a>: A simple and intuitive website builder for creating landing pages and portfolios. It&#8217;s very basic and simple, with low pricing but with high value in return, I have my website built on top of it and also use it for landing pages and forms - I will use it for sure to launch my TDD Workshop next year!</p></li><li><p><a href="http://bento.ai/">Bento.ai</a>: A simple link in bio website builder, with a UX/UI that reminds me of Notion in some elements - I like simplicity and I used this for a basic link in bio for my social pages.</p></li><li><p><a href="https://supabase.com/">Supabase</a>: A backend-as-a-service tool based on a PostgreSQL database with a web UI interface to configure it and handle data, and automatic REST APIs exposed for each table in the DB. It&#8217;s amazing, I used it for some simple microservices in the past, especially for the read-side of a CQRS approach because the automatic APIs prevented the team from writing a lot of boilerplate code. </p></li><li><p><a href="https://zapier.com/">Zapier</a>: An automation platform that connects various apps and services - it has a lot of integration already existing and available, allowing you to connect popular tools without coding - but also allows you to create your own connector to connect your system to others. </p></li></ul><h5>Tools I've Used a Few Times</h5><ul><li><p><a href="https://www.adalo.com/">Adalo</a>: A no-code platform for building mobile and web apps - I helped my old CTO build a simple CRUD app for a non-profit association once, it worked well and was easy to set up and maintain.</p></li><li><p><a href="https://webflow.com/">Webflow</a>: A visual web design tool for creating responsive websites - I built a couple of websites for startups on this. If you only need a static website, that doesn&#8217;t integrate directly with an application, Webflow is pretty nice, and much more lightweight and simple to use than WordPress IMHO.</p></li><li><p><a href="https://hasura.io/">Hasura</a>: A GraphQL engine for building scalable and real-time applications - it can be connected to a database and then automatically expose the GraphQL to enable a client to access data, allowing also to set up permissions easily. This was the first tool I used with the approach described also for Supabase, to automate the read side of a CQRS infrastructure; compared to Supabase itself, Hasura can be used on a custom DB without requiring to use of a separate PostgreSQL DB.</p></li></ul><h5>Tools I Want to Test in the Future</h5><ul><li><p><a href="https://retool.com/use-case/graphql-gui">Retool</a>: A no-code platform that enables to creation of a UI for a given REST/GraphQL API - I tested it for fun and I noticed it integrates very well, especially with GraphSQL, and can be a good option in the future to test for internal tools.</p></li><li><p><a href="https://www.notion.so/">Notion as CMS</a>: Utilizing Notion as a Content Management System for Websites. I have at least two use cases in mind: first of all, actual website content handled via Notion (some tools already allow handling a newsletter, or a blog, using a Notion db as source for the content) - the second use case is an internal tool (as you can notice, automating an internal tool is one of my main ideas: the reason is that those tools typically burn a lot of time and money). Imagine using Notion as CMS for an e-commerce, or any other customer-facing tool where you want to give control to stakeholders over the control - instead of implementing a tool you might use Notion and then sync the data via the APIs.</p></li></ul><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Go Deeper &#128270;</h1><h3>&#129302; AI Tools Directories</h3><ul><li><p><a href="https://theresanaiforthat.com/">There&#8217;s an AI for that</a></p></li><li><p><a href="https://aitoolsdirectory.com/">AI Tools Directory</a></p></li><li><p><a href="https://allthingsai.com/">AllThingsAI</a></p></li></ul><h3>&#9881;&#65039; No-Code Tools Directories</h3><ul><li><p><a href="https://www.nocode.mba/tools">No-Code MBA</a></p></li><li><p><a href="https://nocodelist.co/">NoCodeList</a></p></li><li><p><a href="https://nocodeforge.io/">No-Code Forge</a></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Trunk-based development might increase burnout? 🔥 My thoughts on the 2023 State of DevOps Report 🤔]]></title><description><![CDATA[In 2023 State of DevOps Report, an increase of burnout is related to Trunk-Based Development: is the first time, one of those practices shows a concrete negative effect, let's reflect on the report!]]></description><link>https://learnagilepractices.substack.com/p/trunk-based-development-might-increase</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/trunk-based-development-might-increase</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 28 Nov 2023 06:00:37 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!CZbZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome to the home of continuous improvement and learning for Software Developers.</p><p>&#128204; In case you missed it: in the last issue, I wrote a piece to describe the Walking Skeleton, one of the most underestimated Agile Practices: start small also on the architecture, but cover the entire architecture from the beginning - this way it will be easier to evolve it. In case you missed it, check it <a href="https://open.substack.com/pub/learnagilepractices/p/first-steps-in-code-the-significance?r=1arsz9&amp;utm_campaign=post&amp;utm_medium=web">here</a>.</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>Trunk-based development might increase burnout? &#128293; My thoughts on the 2023 State of DevOps Report &#129300;</h1><h3>Introduction</h3><p>Hello, developers! &#128640; </p><p>The 2023 State of DevOps Report was released in October 2023, you can find it <a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2023-state-of-devops-report">here</a>: it&#8217;s the annual update to the research on which the book <a href="https://amzn.to/49RLzq0">Accelerate</a> was based on in 2018. Every year, the research continues and the update is released, but this time, for the first time (as I can remember, at least) a real concrete negative effect has been registered after one of the Agile Practices considered in the research - in particular, it&#8217;s Trunk-based development.</p><p>Let&#8217;s reflect on the research!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CZbZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CZbZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CZbZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CZbZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CZbZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CZbZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg" width="502" height="502" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:502,&quot;bytes&quot;:108163,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CZbZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!CZbZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!CZbZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!CZbZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F251af332-3fd7-412d-bce3-1d9e367d03a5_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A programmer facing burnout and screaming.</figcaption></figure></div><h3>The 2023 State of DevOps Report</h3><p>On the 18th of November, I attended the <a href="https://www.agileday.it/">Italian Agile Days 2023</a> Conference in Milan as a speaker, at the Politecnico University; my talk was just right after the lunch break, and I talked about Continuous Integration and Trunk-based Development, how those two practices are related and which benefits they bring - the video is not available, but you can see the slide deck <a href="https://docs.google.com/presentation/d/e/2PACX-1vSELox8W3f7jHli7BqJvGWG-IkaiTZJe4YwPMqD6irTGq2RF8FeaiklfLW119HsXhtkm2gAacKwpl-1/pub?start=false&amp;loop=false&amp;delayms=3000&amp;slide=id.p">here</a>.</p><p>During the Q&amp;A session, one of the questions came from <a href="https://www.linkedin.com/in/ruggero-enrico-visintin/">Ruggero</a>: </p><blockquote><p>What&#8217;s your opinion about the last State of DevOps Report, where it emerges an increase of burnout due to Trunk-based Development?</p></blockquote><p>At that point, I hadn&#8217;t read the report yet, only a quick recap article that didn&#8217;t highlight much of this burnout topic - so I was a bit surprised, and I responded that it&#8217;s hard to have an opinion on this without having more context. For example, if the practice is forced on the team, or it&#8217;s not supported by proper training, I can imagine that at least in the first weeks it can be an overhead for people used to long-living branches. Still, my experience is similar to Ruggero&#8217;s: CI and TBD make life easier, and I&#8217;ve seen this for both average and above-average skilled developers!</p><p>So, I left the conference with this question in mind and decided to look for the complete report, and for more complete articles about it, to see what it states and reflect on it - this article is the sum of my thoughts!</p><h3>Some key insights from the report</h3><p>The <a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2023-state-of-devops-report">article</a> from the DORA team highlights 5 key insights:</p><ol><li><p>A healthy culture matters: teams with generative cultures have 30% higher organizational performance</p></li><li><p>User in mind: teams that focus on the user have 40% higher organizational performance</p></li><li><p>Documentation has an impact: high-quality documentation leads to 25% higher team performance</p></li><li><p>Work distribution is not fair: women and underrepresented people have higher levels of burnout</p></li><li><p>Cloud used effectively: leveraging the characteristics of the cloud, like rapid elasticity and on-demand self-service, teams can get the most value out of the cloud: this flexibility leads to <em>30% higher organizational performance</em></p></li></ol><p>The first thing I noticed was that the recap/announce article from the DORA team does not emphasize much about burnout increase related to TBD. At this point, without reading the report yet, I had 2 hypotheses: either there is something more in the report that makes them not give that much weight to that, or they are trying to ignore it for now to avoid controversy.</p><p>While the second is still an option (it can even be for a good reason: it&#8217;s the first time that shows up, so we still need some confirmation before actually worrying about it), I couldn&#8217;t avoid approaching the report hoping to find something supporting the first option: &#8220;there must be something more&#8221;, I thought.</p><p>And finally, I started reading it.</p><h3>Burnout can increase with TBD?</h3><p>The technical capabilities considered and analyzed in the report evolve year after year, so it&#8217;s important to consider that these are the 5 technical capabilities considered this year:</p><ul><li><p>AI</p></li><li><p>Trunk-Based Development</p></li><li><p>Loosely coupled architecture</p></li><li><p>Continuous Integration</p></li><li><p>Rapid code review</p></li></ul><p>As always, the report considers 2 types of impacts: performance measures (team, organizational, software delivery, and operational performances) and indicators of people's well-being (burnout, productivity, job satisfaction).</p><p>Focusing on Continuous Integration and Trunk-Based Development here, the impact on performance measures overall is quite good, as always: both practices showed minor increases in team, organizational, and software delivery performances, with a minor decrease in operational performances for TBD.</p><p>On the other hand, looking at people's well-being&#8217;s indicators, it looks like there is no effect directly from this two practices in most cases, but with minor increase in job satisfaction thanks to CI, and a substantial increase on burnout because of TBD.</p><p>And here we are! Let&#8217;s deep dive into this part of the Report to find out something more: we have two sections to discuss, the first one being this data with some additional info and comments, while the second one being a note on the benefits of Continuous Delivery from Dave Farley.</p><p>Before looking at the conclusions and answers we can take from the report, one side note from me: I&#8217;m not sure that those practices should actually be considered separated. I mean, CI embeds TBD - it is the actual topic of my talk at IAD 2023 - so focusing on TBD means focusing on 1/6 of CI. As always, discover more about this and my other personal thoughts in the next section, Dan&#8217;s take.</p><p>Back to the report: about performance measures, no particular comments worth highlighting here - they basically consider it all positive. To be honest, they treat as pretty positive also the people's well-being&#8217;s indicators - quoting the report:</p><blockquote><p>Additionally, these capabilities and processes don&#8217;t show a detrimental impact on the well-being of the individuals doing the work. In fact, most of these predict improvements to the individual&#8217;s well-being.</p></blockquote><p>A lot more focus is on highlighting how much all the indicators increase positively than on asking why one decreased - I&#8217;m not sure if it&#8217;s correct from the scientific approach point of view, but for sure it looks a bit surprising for me. </p><p>Even Dave Farley looks more surprised from the impact on performance measures (positive, but not as much as he expected) than from the people side:</p><blockquote><p>I am somewhat surprised that continuous integration (CI) and trunk-based development didn&#8217;t have a bigger impact on software delivery performance.</p></blockquote><p>And finally, two new metrics are added here: stability (change failure rate and failed deployment recovery time) for quality and throughput (change lead time and deployment frequency) for fast feedback and problem detection.</p><p>But most of all, the concept of mediators is introduced: CD, for example, is a mediator of many technical capabilities (including CI and TBD), meaning that those capabilities works because they create an environment that enabled CD. </p><p>Basically, Farley highlight something similar to my question above: we cannot just consider those capabilities as separated, they are connected to each other - one might be enabler for the other, and so on. </p><p>So, when we read at this data where TBD seems to be a (rather small) danger to burnout, we should consider that, for example, code review speed substantially decrease the burnout - and what&#8217;s a best way to reduce code review time than reducing the size of the review via TBD? &#128521;</p><p>I will share my thoughts in the next section, as always - but let me know what do you think by replying to this email or commenting the LinkedIn/Twitter post where I shared it!</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>I have to admit that the question at the conference made me panic a bit: Accelerate, the research behind that book, and the yearly updates to the research are one of the best tool we can use to support and proof the importance of the Agile Practices for a business, and while it is totally correct (and to be appreciated) that elements against the ideas are highlighted - if that happens, we need to be very very effective in communicating correctly because it&#8217;s already hard enough to make people understand the importance of this kind of technical excellence.</p><p>I really wanted to find something that justified that outcome, and at first I was also disappointed that the research never discuss the point directly - but then, I thought: &#8220;there must be a reason&#8221;. </p><p>I mean, is not that I want to justify something just because it&#8217;s coherent to my beliefs, but the entire research over the years is based on questioning our beliefs and understand their impact in a transparent way - I really couldn&#8217;t believe that they wouldn&#8217;t be transparent about that.</p><p>Luckily, I was right - even if it&#8217;s not addressed directly (they never say &#8220;TBD seems to lead to an increase in burnout, but&#8230;&#8221;) it is definitely addressed in the considerations an thoughts about the overall outcomes.</p><p>The main point, which is both my initial thought and also what they highlight multiple times in the report, is that even if they treat the technical capabilities separated for research purposes, they should always be seen as strictly correlated: if you think about it, 4 out of 5 technical capabilities examined (AI excluded) are needed to enable Continuous Deployment.</p><p>Quoting Dave Farley, page 24 of the report:</p><blockquote><p>CD&#8212;the ability to release changes of all kinds on demand quickly, safely, and sustainably&#8212;is a substantial mediator of many technical capabilities. </p><p>[&#8230;]</p><p>The practice of CD, in turn, provides the mechanism through which these capabilities can predict stronger software delivery performance.</p><p>[&#8230;]</p><p>For example, how can we achieve high scores on Throughput if our code doesn&#8217;t integrate, and how can we be sure that our Stability is high if we haven&#8217;t checked it? For me, CI is how we know these things, and so it&#8217;s a key mediator of software delivery performance. </p></blockquote><p>Look at the tables from the report:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T3RE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T3RE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 424w, https://substackcdn.com/image/fetch/$s_!T3RE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 848w, https://substackcdn.com/image/fetch/$s_!T3RE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 1272w, https://substackcdn.com/image/fetch/$s_!T3RE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T3RE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png" width="1386" height="664" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:664,&quot;width&quot;:1386,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:146984,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!T3RE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 424w, https://substackcdn.com/image/fetch/$s_!T3RE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 848w, https://substackcdn.com/image/fetch/$s_!T3RE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 1272w, https://substackcdn.com/image/fetch/$s_!T3RE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F115c6501-0b94-4127-a8a4-d97d845116d5_1386x664.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Impact of the 5 technical capabilities on performance.</figcaption></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IHt_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IHt_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 424w, https://substackcdn.com/image/fetch/$s_!IHt_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 848w, https://substackcdn.com/image/fetch/$s_!IHt_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 1272w, https://substackcdn.com/image/fetch/$s_!IHt_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IHt_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png" width="1396" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1396,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:113293,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!IHt_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 424w, https://substackcdn.com/image/fetch/$s_!IHt_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 848w, https://substackcdn.com/image/fetch/$s_!IHt_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 1272w, https://substackcdn.com/image/fetch/$s_!IHt_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F28207769-ff19-49d6-a7e3-deec90a1529e_1396x628.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Impact of the 5 technical capabilities on people well being.</figcaption></figure></div><p>There are some points we can agree on:</p><ul><li><p>72% of the impact is positive (4 decreases and 6 no effects on a total of 35)</p></li><li><p>Except for AI, the other 4 capabilities are strictly related to each other</p></li><li><p>Except for AI, the other 4 capabilities are together enabling even more technical capabilities and practices</p></li></ul><p>I will use an example to express my feelings about all this: we can say that the impact on burnout of the 4 capabilities is a substantial decrease (no effect + substantial decrease + substantial decrease + substantial increase), and the 2 capabilities impacting positively are a faster code review speed and a loosely coupled architecture. </p><p>The things is: how do you increase code review speed? With TBD, because you reduce the batch work size, meaning the size of the review, making it easier and faster to both find a time span to perform the review, and also to do the review itself: if every team member creates daily (or shorter) PRs, they will more easily find the time for performing the review without too many interrupts, and review itself will be faster.</p><p>At the same time, it&#8217;s almost impossibile to achieve CI if we don&#8217;t have loosely-coupled teams, splitted by domains and without depending to each other for PRs and releases - and this open the chances to achieve a loosely-coupled architecture too.</p><p>As you can see, it&#8217;s all connected, so here is my final thought: we cannot just think to this results looking at the specific item, same as we cannot think about team performance by looking at the performances of a single developer - we need to think about the whole system, and in this case the whole research, the entire group of practices considered and their impact with each other.</p><p>But, I think we also need to face this in a correct way, and it looks that me and Dave agree also on this (see quote below): this is, in any case, an interesting and intriguing thing to keep a look at, and we will probably discover more in the next year State of DevOps Report!</p><p>I mean: we always keep &#8220;uncovering better ways of developing software&#8221;, right? &#128521;</p><div class="pullquote"><p>Is this a problem of interpretation or something deeper and more important? Intriguing!</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/46tqX4r">Accelerate</a></strong> - How can we apply technology to drive business value? This book is the first production of the research that is now yearly updates with the State of DevOps Report.</p></li><li><p><strong><a href="https://amzn.to/3MXCHoM">Continuous Delivery: Reliable Software Releases Through Build, Test, and Deployment Automation</a></strong> - This groundbreaking new book sets out the principles and technical practices that enable rapid, incremental delivery of high quality, valuable new functionality to users.</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://devinterrupted.substack.com/p/dora-metrics-weve-been-using-them-00c">DORA Metrics: We&#8217;ve Been Using Them Wrong</a></strong> [<a href="https://devinterrupted.substack.com/">Dev Interrupted</a>]</p></li><li><p><strong><a href="https://blog.snackablecto.coach/p/continuous-delivery-progress-is-the">Continuous Delivery: Progress is the foundation of happiness</a></strong> [<a href="https://blog.snackablecto.coach/">Snackable CTO</a>]</p></li><li><p><strong><a href="https://craftingtechteams.substack.com/p/why-are-teams-so-slow-to-adopt-simple">Why Are Teams So Slow to Adopt Simple Continuous Delivery?</a></strong> [<a href="https://craftingtechteams.substack.com/">Crafting Tech Teams</a>]</p></li></ul><h3>&#127897;&#65039; Podcast episodes</h3><ul><li><p><strong><a href="https://podtail.com/en/podcast/the-continuous-delivery-podcast/ep-27-dora-metrics/">Dora Metrics</a> </strong>[<strong>The Continuous Delivery</strong> podcast]</p></li><li><p><strong><a href="https://www.lennyspodcast.com/how-to-measure-and-improve-developer-productivity-nicole-forsgren-microsoft-research-github-goo/">How to measure and improve developer productivity</a></strong> [Lenny&#8217;s podcast]</p></li></ul><h3>&#128196; The Status of DevOps Report 2023</h3><ul><li><p><strong><a href="https://cloud.google.com/blog/products/devops-sre/announcing-the-2023-state-of-devops-report">Recap article</a></strong> (you can also download the report from there!)</p></li></ul><p></p>]]></content:encoded></item><item><title><![CDATA[First Steps in Code: The Significance of a Walking Skeleton in New Projects 🚀🪴]]></title><description><![CDATA[In simple words, when you start a project with a walking skeleton, you first build a minimal functionality (as simple as a &#8220;Hello world&#8221; page or API) and then release it to the test and production env]]></description><link>https://learnagilepractices.substack.com/p/first-steps-in-code-the-significance</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/first-steps-in-code-the-significance</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 21 Nov 2023 06:00:36 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!PEr9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome to the home of continuous improvement and learning for Software Developers.</p><p>&#128204; In case you missed it: in the last two issues, I wrote a 2-part fake trial where I tried my best to prosecute TDD, supporting all the critics that are typically moved against it - and then trying to defend it, supporting both points of view with the most concrete approach possible. In case you missed it, check the first part <a href="https://learnagilepractices.substack.com/p/putting-test-driven-development-under">here</a>, and the second part <a href="https://learnagilepractices.substack.com/p/putting-test-driven-development-under-adb">here</a>.</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>First Steps in Code: The Significance of a Walking Skeleton in New Projects &#128640;&#129716;</h1><h3>Introduction</h3><p>Hello, fellow developers! &#128640; </p><p>To introduce the idea of the Walking Skeleton practice, let me describe an example: a new project starts, we work on the features for months and it all works locally, and it&#8217;s complex enough to include a database, an admin dashboard, a queue system for async processing and a Redis instance for cache; then, we need to build the architecture to deploy on a test environment: here we will have to understand how to set all that stuff up on a test environment, in a cost-effective way, and after some tests, we will probably need to fix something on both code and architecture; finally, we will need to move to production: typically, our choices here will change because &#8220;it&#8217;s production&#8220; and we will have to rediscover and fix some issues, probably old and new ones, all together. We were basically done with development, but architecture and release for both test and production took weeks, mostly because we had to face all those issues together.</p><p>If this situation is familiar in some way, you will easily understand what benefits can bring the practice of walking skeleton: let's get started!</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PEr9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PEr9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PEr9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PEr9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PEr9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PEr9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg" width="488" height="488" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:488,&quot;bytes&quot;:108797,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!PEr9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!PEr9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!PEr9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!PEr9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc6eeee9f-f6e9-439a-a081-ffe2e86482a9_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A happy walking skeleton software developer with a <em>M</em>acbook. Anime style</figcaption></figure></div><h3>Start small, also in the architecture</h3><p><a href="http://alistair.cockburn.us/Walking+skeleton">Alistair Cockburn</a> defined the Walking Skeleton practice as:</p><blockquote><p><em>a tiny implementation of the system that performs a small end-to-end function. It need not use the final architecture, but it should link together the main architectural components. The architecture and the functionality can then evolve in parallel.</em> </p></blockquote><p>A similar concept called &#8220;Tracer Bullets&#8221; was introduced in&nbsp;<a href="https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X">The Pragmatic Programmer</a>.</p><p>In simple words, when you start a project with a walking skeleton, you first build a minimal functionality (as simple as a &#8220;Hello world&#8221; page or API) and then release it to the test and production environments.</p><p>By doing this, you start building all the pieces that together will create your system, each in its own easier and smaller version possible; for example, every automation and tool you need should be in place, including:</p><ul><li><p>the automated pipeline to build the app, execute tests, trigger the deployment, etc</p></li><li><p>the logging, monitoring, and alerting systems to allow for instant alerts of errors and easy investigation</p></li></ul><p>And, of course, you will also need the servers to deploy the code, whether it is in the cloud or not: you will have the simplest version of your system and architecture, while the features are still zero. </p><p>This practice aims to broaden the baby steps and YAGNI principles to include the entire system, and not only the codebase: by doing this, we are reducing the chances of issues and mistakes happening by splitting the complexity of building our architecture through time instead of facing it all together just before releasing, and we will also be sure that all we add to our system is because we need it, when we need it.</p><p>Moving on with the example, we will build only what is required, which is the minimum stuff we should all have in production:</p><ul><li><p>the automated pipeline </p></li><li><p>a log system</p></li><li><p>a monitoring system</p></li><li><p>and alerting system</p></li><li><p>a server for test env</p></li><li><p>a server for production env</p></li></ul><p>Since we want to follow YAGNI and baby steps, we also don&#8217;t want to build the &#8220;ultimate&#8221; version of any of those: for example, the pipeline will be minimal (build, execute tests, deploy) and we will postpone decisions such as which static analysis tool to use; the alerting system might start as an email and evolve to Slack or any different channel in the future; the monitoring system might only show minimal data required to check if there are issues; the servers will likely have very little memory and CPU power, and so on.</p><p>Here is a sample list of what we will not have at first, even if we will likely need them in the future:</p><ul><li><p>a database, or any other persistence layer</p></li><li><p>a way to handle environment variables</p></li><li><p>a way to handle secrets</p></li><li><p>a Redis cache instance</p></li></ul><p>After being done with the Walking skeleton, we will start working on the first feature - and as soon as the need for one of these pieces shows up, we will add it to our infrastructure.</p><h3>An underestimated practice</h3><p>Every time we want to learn a practice, we should strive to understand why that practice is important from a technical and business perspective, and the walking skeleton makes no exception.</p><p>As already mentioned, the two main principles behind it are:</p><ul><li><p>Baby steps: In the same way as working with short branches it&#8217;s easier than using long-living feature branches or using TDD to get feedback every minute on our code makes it super fast to fix any mistakes we make, adding pieces to the system one by one will drastically reduce the complexity compared to putting all pieces together at once/</p></li><li><p>YAGNI: &#8220;You Aren&#8217;t Going to Need It&#8221; - a very well-known principle in software development, typically used to refer to the idea of not adding pieces of code to generalize or expand a feature just because &#8220;you never know, we might need it in the future&#8221;; instead, stick to what you need today, and add new pieces when the need appears - here, we want to apply the same principle to the entire system: for example, why adding a database while you don&#8217;t have any table yet? When the need to persist some data comes, for example, you might even discover you need a no-SQL solution for that specific use case. It&#8217;s not only to wait to split complexity along the way but also to ensure that you decide in the last moment possible to ensure it&#8217;s the best decision possible.</p></li></ul><p>In addition to these principles, the Walking skeleton shares a target with every other agile practice: reducing risks. According to Hofstadter&#8217;s Law:</p><blockquote><p>It always takes longer than you expect, even when you take into account Hofstadter&#8217;s Law.</p></blockquote><p>Making changes to architecture becomes more difficult and expensive over time, as it ages and grows in size. As in many other agile practices, we want to identify errors as soon as possible. This technique provides us with a short feedback loop, allowing us to adjust and work iteratively as needed to fulfill the business' needs. Assumptions about the architecture are validated very early and any error is discovered early in the implementation process, causing an easier evolution of it.</p><p>In the end, the Walking Skeleton is a practice to validate the architecture and get early feedback so that it can be improved. It&#8217;s fundamental that you don&#8217;t write the first acceptance test until the walking skeleton is deployed to production, possibly behind a feature flag or just hidden from the outside world if required, because you want to exercise your deployment and build scripts from the beginning to discover as many potential problems as you can as early as possible.</p><p>I know what you are thinking: but Dan, <strong>this means we have a test and production environment since day 1 that we have to pay for!</strong></p><p>Short answer: yes, and you will not regret it. </p><p>Long answer: the additional cost of having a test and production environment from scratch should be very little, considering how simple the system will be at the beginning; in most cases, there will probably be a free or very cheap option in any hosting service you are using. And this time should not be long anyway, because you are releasing the first version, which should be an MVP. You don&#8217;t expect to work 6 months before reaching the first release, right? &#128521;</p><p>Let me know if you already use this practice and what you think about it!</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>The reason why Agile principles, methodologies, and practices changed my career is because they brought answers to questions that tormented me since my day 1 as Software Developer: </p><ul><li><p>How is it possible that there is no way to ensure I don&#8217;t break my previous code? Automated tests</p></li><li><p>How is it possible that there is no way to make coding easier and safer? TDD</p></li><li><p>How is it possible that there is no way to notice errors in production? Monitoring &amp; Alerting</p></li></ul><p>Walking Skeleton practice had the same impact: how is it possible that there is no way to avoid releasing everything at once in the end? The walking skeleton (and evolutionary architecture principle) is the answer to this question at an architecture/entire system level, the same way as Continuous Integration/Trunk-Based Development is the answer at the code level.</p><p>The first time I worked to a project where the Senior leading the team brought this technique up, it was amazing to see the impact. Setting up pipelines, monitoring, alerting, logging, and everything else all at once when the features are done and ready for tests - and then repeating everything all at once to setup production just before the release - has always been a nightmare experience.</p><p>The very long TODO list in the backlog united to the stress of the release coming closer is a devil mixup that makes issues very very likely. By creating a Walking Skeleton, we create the simplest version possible of each of those elements, and then evolve them together with code and requirements: in the same way that CI avoids big merge conflicts and time-consuming async Pull Requests on big changes, the Walking Skeleton will avoid accumulating all the work related to the setup the system and architecture, splitting it along the way, making it easier to handle the (small) changes.</p><p>Once you start working in baby steps, iterative way you find it useful in any circumstance, even in your personal life, so being able to approach the architecture and system the same way I approach coding and development is great!</p><p>Typically, I consider the Walking skeleton of a new service once I have:</p><ul><li><p>Local environment setup running under Docker + Docker Compose, including both features and tests (I most often build APIs, so I typically start with a GET /hello-world API and its test)</p></li><li><p>Setup of the logging system (depending on the language and framework) to print logs in standard format (typically JSON) via standard output</p></li><li><p>Makefile to create the catalog of repetitive useful commands to be used locally during development</p></li><li><p>Readme file with basic stuff like info about the project, prerequisites, and how to set up and run locally</p></li><li><p>Pipelines (typically via GitHub Actions) to build and test the service and then release it on test at every push on the master branch, and on production at every tag</p></li></ul><p>Test and production environments are born identical (and should always remain such):</p><ul><li><p>A server somewhere to release the Docker image of the application</p></li><li><p>A login system that gets the standard output and allows to easily search and read logs</p></li><li><p>A monitoring system that notices any error happening (basic example: 500 HTTP responses of APIs)</p></li><li><p>An alerting system that emails the team when an error happens (at first, it can even email me at the first error immediately)</p></li></ul><p>One last tip from my experience: when I am in a micro-service context and my team creates new services very often, I typically suggest creating a template repository with the walking skeleton, so that when you need a new one you can start from there and speed up the code part of the skeleton, focusing only on the architecture one - if you add infrastructure as a code to this example, you can basically automate a good part of walking skeleton. </p><div class="pullquote"><p>A Walking Skeleton is a tiny implementation of the system that performs a small end-to-end function. It need not use the final architecture, but it should link together the main architectural components. The architecture and the functionality can then evolve in parallel.<br><br>[Alistair Cockburn]</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3odcGsw">Growing Object-Oriented Software, Guided by Tests</a></strong> - This book talks about a lot of great practices, and chapter 10 is dedicated to Walking Skeleton iself.</p></li><li><p><strong><a href="https://amzn.to/3R4yaDG">The Pragmatic Programmer</a></strong> - In this book, the Walking Skeleton practice is referenced as &#8220;Tracer Bullets&#8221;, and the principles are mostly the same; in addition, the book is filled of useful tips for being a good and professional developer</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://tonydev.substack.com/p/how-to-start-a-new-project-what-is">How to start a new project ? What is walking skeleton ?</a></strong> [<strong><a href="https://tonydev.substack.com/">Tony&#8217;s Substack</a> </strong>by <strong><a href="https://substack.com/@tonydev">Tonydev</a></strong>]</p></li><li><p><strong><a href="https://smakhonco.substack.com/p/creating-the-walking-skeleton-part">Creating the walking skeleton - Part 1</a> and <a href="https://smakhonco.substack.com/p/creating-the-walking-skeleton-part-998">Part 2</a></strong> [<strong><a href="https://smakhonco.substack.com/">Sivu Writes Software</a></strong> by <strong><a href="https://substack.com/@smakhonco">Sivu Makhonco</a></strong>]</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://www.henricodolfing.com/2018/04/start-your-project-with-walking-skeleton.html">Start your Project with a Walking skeleton</a></strong></p></li><li><p><strong><a href="https://medium.com/kayvan-kaseb/the-benefits-of-using-the-walking-skeleton-approach-in-software-development-fed196089b65">The Benefits of Using Walking Skeleton Approach in Software Development</a></strong></p></li><li><p><strong><a href="https://medium.com/kayvan-kaseb/using-walking-skeleton-approach-in-software-development-943c3d69a8c0">Using Walking Skeleton Approach in Software Development</a></strong></p></li></ul><h3>&#127897;&#65039; Podcast episodes</h3><ul><li><p><strong><a href="https://soundcloud.com/the-competitive-advantage/iteration-0-walking-skeleton">Iteration 0: Walking Skeleton</a> </strong>[<strong>The Competitive Advantage</strong> podcast]</p></li><li><p><strong><a href="https://www.infoq.com/presentations/Walking-Skeleton/">Creating a Walking Skeleton</a> [InfoQ </strong>podcast<strong>]</strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[🧑🏻‍⚖️ Putting Test-Driven Development under Trial: Could the Critics Be Right? 😳 Part 2 (fixed)]]></title><description><![CDATA[Here is the 2nd part of our investigative journey where the practice of TDD is put on trial. The prosecuting attorney presents the arguments against TDD, raising doubts about its effectiveness.]]></description><link>https://learnagilepractices.substack.com/p/putting-test-driven-development-under-adb</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/putting-test-driven-development-under-adb</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 14 Nov 2023 06:00:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mbEV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! Welcome to the home of continuous improvement and learning for Software Developers.</p><p>&#128204; In case you missed it: this is the second part of an imaginary trial: we are trying our best to prosecute TDD, supporting all the critics that are typically moved against it - and then trying to defend it, supporting both points of view with the most concrete approach possible. In case you missed it, check our archive for the first part.</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>&#129489;&#127995;&#8205;&#9878;&#65039; Putting Test-Driven Development under Trial: Could the Critics Be Right? &#128563; Part 2</h1><h3>Introduction</h3><blockquote><p>Sorry, a wrong email started yesterday. This is the correct email with the complete introduction. Sometimes, we just make a mistake - sorry again. Enjoy the issue! &#128170;&#127995;</p></blockquote><p>Few practices in software development have sparked as much debate and controversy as test-driven development (TDD). Advocates think it's a panacea for writing clean, manageable code, while critics argue it's a time-consuming and unneeded burden. Last week, we started a trial on TDD. Imagine a courtroom in which the prosecution throws charges and the defense rallies to demonstrate that those charges are wrong.</p><p>I collected all the critics I found online about TDD, and we are giving all those critics the benefit of the doubt, trying to go very deep into understanding the cons that they typically suggest and to support their ideas - then, we will also try to demystify it. In the end, I will share with you what thoughts I had after all this work.</p><p>So grab your gavels and robes, for we're about to embark on the second part of the TDD trial of the century! &#127963;&#65039;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mbEV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mbEV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mbEV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg" width="470" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:470,&quot;bytes&quot;:71217,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!mbEV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The trial of Test-Driven Development, with two layers fighting in a tribunal about TDD.</figcaption></figure></div><h3>k to the Trial &#128071;</h3><p>Here is the updated list of the 8 most common criticisms that people throw against TDD - a list I collected by searching online and from past experiences and chats, and we already discussed the first 4 points in the first part last week:</p><ol><li><p><s>Time-Consuming</s></p></li><li><p><s>Too much overhead</s></p></li><li><p><s>Focus on Testing, Not Design</s></p></li><li><p><s>Inflexibility</s></p></li><li><p><strong>Over-testing</strong></p></li><li><p><strong>Difficult to Learn</strong></p></li><li><p><strong>False Sense of Security</strong></p></li><li><p><strong>Not Suitable for All Projects</strong></p></li></ol><p>Today we will continue our ping-pong challenge between the prosecution and defense of TDD, completing the list with the last 4 points and then going straight to the conclusions.</p><h4>TDD cause over-testing</h4><h5>Prosecution</h5><p>Ladies and gentlemen of the jury, let's restart this trial by delving into another pressing issue surrounding Test-Driven Development (TDD). Detractors claim that TDD, in its zealous pursuit of robust code, can inadvertently lead to over-testing. The concern is that developers, driven by the TDD approach, might find themselves entangled in an exhaustive quest to cover every conceivable edge case.</p><p>This meticulous testing, as critics argue, can be a time-consuming and unnecessary endeavor. Picture this: developers navigating a labyrinth of test scenarios, trying to account for every possible nuance. We must ponder whether this exhaustive approach to testing is truly warranted or if it's an undue burden on the development process. As we proceed, we'll unveil the intricacies of this claim and explore whether TDD's emphasis on comprehensive testing is a necessary virtue or an onerous vice.</p><h5>Defense</h5><p>Your honor, and ladies and gentlemen of the jury, please excuse me but I&#8217;ll have to be repetitive on this one - because once again, the prosecution against TDD has no concrete pieces of evidence.</p><p>As I mentioned last time, Kent Beck shows us how the same problem caused him to write 6 tests, while another developer wrote 65. Quoting the book:</p><blockquote><p>You will have to decide, from experience and reflection, about how many tests you want to write.</p></blockquote><p>TDD's view of testing is pragmatic: tests are a means to an end, the end being &#8220;code in which we have great confidence&#8221;. The number of tests we decide to write will depend on the confidence we have in the problem and a possible solution.</p><p>There is another thing that most often is not considered: tests in TDD lead you to a solution, but then you only want to keep with you the tests you need to feel safe when that code changes. It&#8217;s not uncommon that once your work is done, you might consider throwing away some of the tests that you used - because they already fulfilled their purpose in driving you through design decisions but they don&#8217;t add any confidence when changing the code. </p><h4>TDD is hard to learn</h4><h5>Prosecution</h5><p>There is another contention against Test-Driven Development (TDD) that we want to highlight today. Critics vehemently assert that TDD, with all its purported benefits, presents an insurmountable challenge for developers new to the practice. The crux of the matter is the formidable learning curve associated with TDD, which, according to the prosecution's argument, may serve as a deterrent to its widespread adoption.</p><p>The prosecution contends that TDD is not just about mastering the art of testing; it entails delving into the intricate principles that underpin effective test-driven development. This dual challenge, critics argue, places an undue burden on developers, especially those navigating the early stages of their TDD journey.</p><h5>Defense</h5><p>There are two sides to the medal when discussing the learning curve of TDD: first of all, it requires a shift in the way we think about problem-solving. Most of us learned to develop software in a specific way: code a solution, then test it. TDD requires a shift where you think about your tests before writing the actual code - and not only at a high level but also for every step we make in coding the solution.</p><p>The second point is that TDD also brings the approach of small steps and continuous design feedback thanks to the TDD cycle and the fact that we execute the test suite every minute; we are all typically so used to working with long-living branches and getting feedback only after a lot of time - and even if that late feedback is often uncomfortable, a lot of people think it is inevitable.</p><p>To learn TDD, you need an Agile mindset: you need to embrace change to accept that there might be another way to do things, maybe even better ways. </p><p>TDD is a way to ensure that you produce &#8220;clean code that works&#8221;, having a simple way to avoid bugs and defects or recognize them very early when they happen; it&#8217;s a way of doing one thing at a time, to avoid being overwhelmed by a lot of ideas when coding; it&#8217;s a way to improve the design one small step at a time, without getting stuck in implementing a certain design patterns because the step was too big.</p><p>I&#8217;ve never seen someone having a great level of confidence in those without TDD, and even if you can do it, ask yourself how much energy it requires you - with TDD, it&#8217;s all included.</p><h4>TDD gives a false sense of security</h4><h5>Prosecution</h5><p>We are not done yet, and now let's delve into another critical assertion against Test-Driven Development (TDD). Detractors argue that the pursuit of extensive test coverage, a hallmark of TDD, might inadvertently foster a false sense of security among developers. The crux of this contention is that developers, ensconced in a cocoon of extensive testing, might be led to believe that their code is impervious to bugs.</p><p>The prosecution posits that an overemphasis on test coverage could be a double-edged sword, providing a deceptive assurance that the codebase is devoid of defects. As we scrutinize this claim, we'll explore whether the purported sense of security induced by comprehensive testing is a commendable outcome or a perilous illusion that detracts from the rigor of software development.</p><h5>Defense</h5><p>No one advocating TDD will ever tell you that if you do TDD you will never have defects, bugs, or any problem. It would be just false, anyway.</p><p>TDD is a way to minimize unplanned work, which includes bugs and defects for sure. Minimize doesn&#8217;t mean avoiding completely - you can always make mistakes, for sure, even if TDD minimizes the fact that a mistake is integrated into the main branch and reaches production or even staging. But it can happen because we are humans.</p><p>Doing TDD doesn&#8217;t change the fact that you should have a good monitoring and alerting system - or more in general, a way to notice problems immediately when they happen, a good rollback strategy if required, and also working in Continuous Integration releasing a small batch of work every day so that even if an issue shows up in production the change will be very little and fixing it will be very fast.</p><p>TDD is not a replacement for that, for sure.</p><h4>TDD is not suitable for all projects</h4><h5>Prosecution</h5><p>And finally, your honor, let us now address the last critical viewpoint we want to level against Test-Driven Development (TDD). We want to contend that TDD may not be the optimal strategy for projects characterized by swiftly evolving requirements or those in the throes of highly experimental development.</p><p>The prosecution submits that TDD's insistence on defining tests before actual code might pose a challenge in the context of projects where requirements are in constant flux. We shall examine this claim closely, scrutinizing whether the rigidity of TDD aligns with the demands of dynamic and experimental development environments or if it becomes a hindrance in such scenarios.</p><h5>Defense</h5><p>Well, your honor, here we have something that can be partially true, but&#8230; the reasons why this can be true are completely different from what the prosecution suggested.</p><p>Is TDD suitable for all projects? Yes, it is. It&#8217;s also suitable for startups and small businesses because it will cost less money spent on developing software, most often because of less time invested in giving the feature to customers and reduced unplanned work. &#8220;Accelerate&#8221; (the book) proved this in the research it is based on.</p><p>Is TDD suitable for any coding situation? Maybe not, as always there are special cases.</p><p>For example, when you are doing a spike or some thinking around code, you might want to avoid tests, at least at the beginning, because you are just looking around and you don&#8217;t have any clear questions to respond to. Once you have it, Test-First is a good way to formalize it, for example, but you might decide to follow TDD strictly or not depending on the situation.</p><div><hr></div><p>Well, this fake trial finally ended - and it was a good, fun exercise to try to collect all the concrete ideas against TDD and also try to debunk them afterward. </p><p>As you all know, I love Agile Practices, but I also want to be sure that it doesn&#8217;t become a dogma where I&#8217;m not able to recognize the reasons why it is good anymore - so I feel that sometimes trying to discuss against it, even internally, is a good idea.</p><p>What do you think? Reply to the email to let me know what you think about TDD and if you practice or are interested in learning it!</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>I will not add much today, because the target of the trial is to try to be non-opinionated most of the time, but hey - this is my personal take zone, so it&#8217;s opinionated by definition.</p><p>First of all, I want to say that it was really fun to build this fake trial: I used Chat GPT to help me write the prosecution part in an attorney language, and after a couple of prompts tests, I was able to get a good enough result, hopefully! </p><p>As always, collecting points against something I love is a great exercise: it makes not only reflect on some elements that are actual criticism, but also reminds me of why such practices are great, which is always important to avoid them becoming a blind dogma.</p><p>Here are some reflections I made in the process:</p><ul><li><p>A lot of people consider TDD time consuming, while today I&#8217;m a lot slower when I don&#8217;t write tests before; this makes me reflect a lot on the fact that a lot of people don&#8217;t learn enough about something before using it in the real world, and this is bad - whatever it is that &#8220;something&#8221;. We should consider writing software for production more like a match for a professional sport: it&#8217;s our performance, and at that moment we have to win in any way (in our case, getting the result with the lowest cost possible) - it is not the moment to &#8220;try something new I never tried before&#8221;, for that you should the training to build the confidence you need to then use it during the real performance.</p></li><li><p>Resistance to change is a real thing for human beings, and it&#8217;s hard to fight. But since I started to talk about TDD around, and hosting workshop, I realized that a lot of people just need a bit of support - they start learning TDD but they are not pushed by the environment in growing into that direction, and then it requires a huge willing power to keep going on; if you want to learn TDD and you are having hard times, before giving up, find a mentor!</p></li><li><p>The &#8220;there is no silver bullet&#8221; and &#8220;there is always a trade-off&#8221; are very useful quotes, but sometimes we use them to hide ourselves from the truth. I want to be completely honest: I still haven&#8217;t found any actual cons to TDD. I keep looking for it because I want to be a critic to grow even more, but I can&#8217;t find it. I&#8217;ve never seen someone doing TDD and regretting it or highlighting limits - I&#8217;ve always seen people who find it hard and then start arguing against it. TDD produces better software, it&#8217;s a fact.</p></li></ul><div class="pullquote"><p><em>Kent Beck says: &#8220;I&#8217;m not a great developer - I&#8217;m just a good developer with great habits&#8221;. I follow this quote daily, building better habits to avoid facing big issues. <br>If I prevent the fire, I don&#8217;t need to learn how to face it.</em></p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3WeEqcM">Test-Driven Development: An Empirical Evaluation of Agile Practice</a></strong> - this book includes the results of three different experiments, including concrete examples of how to conduct statistical analysis, using as evaluation indicators the number of acceptance tests passed (overall and per hour) and design complexity metrics.</p></li><li><p><strong><a href="https://www.amazon.it/Test-Driven-Development-Example-English-ebook/dp/B095SQ9WP4?keywords=test+driven+development&amp;qid=1684399881&amp;sprefix=test-driven%2Caps%2C100&amp;sr=8-1&amp;linkCode=sl1&amp;tag=dscillialikes-21&amp;linkId=94b1917001584a50f24d9d7b2a299319&amp;language=it_IT&amp;ref_=as_li_ss_tl">Test Driven Development: By Example</a></strong> - the original book from Kent Beck that explains TDD, with examples, and also explain some pitfalls for experts practitioners</p></li><li><p><strong><a href="https://amzn.to/3og3SlF">Learning Test-Driven Development</a></strong> - Author Saleem Siddiqui shows you how to tackle domain complexity using a unit test-driven approach. TDD partitions requirements into small, implementable features, enabling you to solve problems irrespective of the languages and frameworks you use.</p></li><li><p><strong><a href="https://amzn.to/3odcGsw">Growing Object-Oriented Software, Guided by Tests</a></strong> - Implementing TDD effectively: creating cleaner, more expressive, more sustainable code using tests.</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://engineeringorg.substack.com/p/everything-i-know-about-introducing">Everything I know about introducing TDD in an org</a></strong> [<strong><a href="https://engineeringorg.substack.com/">The Engineering Organisation</a> </strong>by <strong>svs</strong>]</p></li><li><p><strong><a href="https://jitterted.substack.com/p/introduction-to-predictive-tdd">Introduction to Predictive TDD</a></strong> [<strong><a href="https://jitterted.substack.com/">Make Your Code More Testable</a> </strong>by<strong> Ted M. Young</strong>]</p></li><li><p><strong><a href="https://craftingtechteams.substack.com/p/use-test-driven-development-to-retain">Use Test-driven Development to Retain Modularity</a> </strong>[<strong><a href="https://craftingtechteams.substack.com/">Crafting Tech Teams</a> </strong>by<strong> Denis &#268;ahuk</strong>]</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://medium.com/@joantolos/the-real-reason-why-you-dont-like-tdd-a65b26d2805e">The real reason why you don&#8217;t like TDD</a></strong></p></li><li><p><strong><a href="https://www.pluralsight.com/guides/test-driven-development-research">How to evaluate</a></strong><a href="https://www.pluralsight.com/guides/test-driven-development-research"> </a><strong><a href="https://www.pluralsight.com/guides/test-driven-development-research">Test Driven Development (TDD) Research</a></strong></p></li><li><p><strong><a href="http://www.gregerwikstrand.com/the-evidence-is-in-tdd-works/">The evidence is in: TDD works</a></strong></p></li><li><p><strong><a href="https://paytonrules.com/post/2015-03-06-evidence-for-tdd/">The Evidence For TDD</a></strong></p></li><li><p><strong><a href="https://semaphoreci.com/blog/test-driven-development">Test-Driven Development (TDD): A Time-Tested Recipe for Quality Software</a></strong></p></li><li><p><strong><a href="https://medium.com/ssense-tech/test-driven-development-tdd-and-why-people-get-it-wrong-9c8b80536838">Test-Driven Development (TDD) and Why People Get it Wrong</a></strong></p></li><li><p><strong><a href="https://www.wwt.com/article/why-test-driven-development-after-all">Why Test-Driven Development After All?</a></strong></p></li><li><p><strong><a href="https://markheath.net/post/measuring-tdd-effectiveness">Measuring TDD effectiveness</a></strong></p></li><li><p><strong><a href="https://cucumber.io/blog/bdd/how-to-measure-the-roi-of-bdd-and-tdd/">How to Measure the ROI of BDD and TDD</a></strong></p></li></ul><h3>&#127897;&#65039; Podcast episodes</h3><ul><li><p><strong><a href="https://www.thoughtworks.com/insights/podcasts/technology-podcasts/tdd-for-today">TDD for today</a></strong> [<strong>Thoughtworks Technology</strong> podcast]</p></li><li><p><strong><a href="https://completedeveloperpodcast.com/episode-140/">Unit Testing With Test Driven Development</a></strong> [<strong>Complete Developer</strong> podcast]</p></li><li><p><strong><a href="https://unhandledexceptionpodcast.com/posts/0017-tddwithiancooper/">TDD with Ian Cooper</a></strong> [<strong>The Unhandled Exception</strong> podcast]</p></li></ul><h3>&#128104;&#127995;&#8205;&#127979; Online courses</h3><ul><li><p><strong><a href="https://www.pluralsight.com/courses/codemash-session-87?utm_source=google&amp;utm_medium=paid-search&amp;utm_campaign=upskilling-and-reskilling&amp;utm_term=ssi-emea-dynamic&amp;utm_content=free-trial&amp;gclid=Cj0KCQjwmZejBhC_ARIsAGhCqndpxdi86GoI6Dolsrh_KeQ934vu0cNA3_iEhTLGZCv_6n3hLEmL2qEaAtwbEALw_wcB">Test-driven Development: CodeMash</a> </strong>[Pluralsight]</p></li><li><p><strong><a href="https://www.coursera.org/learn/test-and-behavior-driven-development-tdd-bdd">Introduction to Test Driven Development (TDD)</a> </strong>[Coursera]</p></li><li><p><strong><a href="https://testdriven.io/">TestDriven.io</a> [</strong>a platform dedicated to TDD courses<strong>]</strong></p></li><li><p><strong><a href="https://learnagilepractices.substack.com/p/micro-learning-courses">TDD micro-learning</a></strong> - Our micro-learning courses catalog offers, among the others, a path dedicated to TDD: learn the core concepts at your own pace in an interactive learning experience</p></li></ul><h3>&#128373;&#65039;&#8205;&#9792;&#65039; Others</h3><p>&#10145;&#65039; <strong><a href="https://www.researchgate.net/profile/Burak-Turhan-2/publication/258126622_How_Effective_is_Test_Driven_Development/links/54e794320cf27a6de10a8afe/How-Effective-is-Test-Driven-Development.pdf?origin=publication_detail">How effective is Test-Driven Development</a></strong><a href="https://www.researchgate.net/profile/Burak-Turhan-2/publication/258126622_How_Effective_is_Test_Driven_Development/links/54e794320cf27a6de10a8afe/How-Effective-is-Test-Driven-Development.pdf?origin=publication_detail"> </a>- a research written by the University of Oulu, Carnegie Mellon University and Fraunhofer Center for Experimental Software Engineering</p><p>&#10145;&#65039; <strong><a href="https://qr.ae/pyGvsT">Quora post from J.B.</a><a href="https://www.quora.com/profile/J-B-Rainsberger">Rainsberger</a><a href="https://qr.ae/pyGvsT"> about TDD effectiveness</a></strong></p>]]></content:encoded></item><item><title><![CDATA[🧑🏻‍⚖️ Putting Test-Driven Development under Trial: Could the Critics Be Right? 😳 Part 1]]></title><description><![CDATA[Let's embark on an investigative journey where the practice of TDD is put on trial. The prosecuting attorney presents the arguments against TDD, raising doubts about its effectiveness.]]></description><link>https://learnagilepractices.substack.com/p/putting-test-driven-development-under</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/putting-test-driven-development-under</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 07 Nov 2023 06:00:21 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!mbEV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! The biggest news of the week is that my first free Workshop, a 4-hour deep-dive into TDD basics and OOP misconceptions, took place last Saturday - and it was amazing. Stay connected because I will repeat some of those for sure at the beginning of 2024. Also, welcome 2 new subscribers that allow us to reach 46 members!!</p><p>&#128204; In case you missed it: two weeks ago, I talked about documentation in Agile, to try to remove some fog from some misconceptions about it! If you haven't already, make sure to take a read at it <a href="https://learnagilepractices.substack.com/p/whats-the-real-deal-with-documentation">here</a> and let me know what you think! &#128170;</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>&#129489;&#127995;&#8205;&#9878;&#65039; Putting Test-Driven Development under Trial: Could the Critics Be Right? &#128563; Part 1</h1><h3>Introduction</h3><p>Few practices in software development have sparked as much debate and controversy as test-driven development (TDD). Advocates think it's a panacea for writing clean, manageable code, while critics argue it's a time-consuming and unneeded burden. Today, we're putting TDD to the trial. Imagine a courtroom in which the prosecution throws charges and the defense rallies to demonstrate that those charges are wrong. </p><p>I collected all the critics I found online about TDD, and we will give all those critics the benefit of the doubt, trying to go very deep into understanding the cons that they typically suggest and to support their ideas - then, we will also try to demystify it. In the end, I will share with you what thoughts I had after all this work.</p><p>So grab your gavels and robes, for we're about to embark on the TDD trial of the century! &#127963;&#65039;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mbEV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mbEV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mbEV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg" width="470" height="470" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:470,&quot;bytes&quot;:71217,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!mbEV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!mbEV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F60d2e5ce-d601-46ad-8570-48d5edeeb51a_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The trial of Test-Driven Development, with two layers fighting in a tribunal about TDD.</figcaption></figure></div><h3>Test-Driven Development on Trial &#128070;</h3><p>Setting up the stage for the trial, as a (very bad) prosecution attorney, I was able to collect the 8 most common criticisms that people throw against TDD:</p><ol><li><p><strong>Time-Consuming</strong></p></li><li><p><strong>Too much overhead</strong></p></li><li><p><strong>Focus on Testing, Not Design</strong></p></li><li><p><strong>Inflexibility</strong></p></li><li><p>Over-testing</p></li><li><p>Difficult to Learn</p></li><li><p>False Sense of Security</p></li><li><p>Not Suitable for All Projects</p></li></ol><p>We will deep dive into each of those, in a ping pong challenge between prosecution and defense of TDD - the first 4 points will be in this week's newsletter, and then the 2nd part will come next week. </p><p>Let&#8217;s see which criticism is concrete and which is not, and how concrete and real those problems are raised by skeptics.</p><h4>TDD is time-consuming</h4><h5>Prosecution</h5><p>Ladies and gentlemen of the jury, it's essential to acknowledge that Test-Driven Development consumes an exorbitant amount of time. The reason is that TDD necessitates developers to compose tests before crafting the actual code, and this supplementary step serves only to extend the already arduous development timeline. TDD's insistence on creating tests prior to developing the actual code is an irksome and time-consuming ritual.</p><p>To elucidate further, allow me to emphasize the problems with TDD's initial phase, where the developer is burdened with the task of devising test cases. This detracts significantly from the rapid inception of the code, leading to longer project timelines. In fact, the documentation-intensive nature of TDD often exacerbates the already onerous demands of software development, resulting in an unwarranted delay in reaching the final product.</p><p>What we want to point out and make very clear here, your honor, is that TDD increase time for development, making the life a lot harder - and while we cannot prove that there might be a gain of time on the long run, we can definitely see we are slower in the immediate - and that is not good for business.</p><h5>Defense</h5><p>Honorable people of the jury, we vehemently refute this accusation: claiming that Test-Driven Development is time-consuming is something inaccurate that starts from some bad habits about learning and applying a new practice.</p><p>What we want to say is that for any new practices we want to learn and apply, we cannot start applying them on the job - we should invest time in learning via exercises and training, starting from trivia software exercises and then moving to more complex ones. If you start doing TDD and try to apply it while still learning and not being confident enough, of course, you will be a lot slower than usual. But this is an unsafe way of approaching new methodologies or technologies on the job, and it&#8217;s also disrespectful of the money the company pays us.</p><p>The reference here is professional sport: if you want to be able to apply good techniques during the match, where points are at stake and there is pressure, you must work hard first to excel in those practices during training, where you have no pressure and all the time needed for learning. Developing a feature for software that is (supposed to) make money, it&#8217;s our performance moment, it&#8217;s like we are in the match - there is pressure due to money and time, and that is normal, so you cannot use a practice/methodology/technology you are not confident enough, and you should build that confidence before via training.</p><p>And remember: training is a developer's responsibility, not the company&#8217;s: &#8220;<em>company doesn&#8217;t give me time for training</em>&#8221; is just an excuse, the responsibility for the quality of our work and our learning is ourselves.</p><h4>TDD causes too much overhead</h4><h5>Prosecution</h5><p>The next problematic point we want to highlight about TDD is that the testing code creates an overhead that complicates projects. One of the more troublesome aspects of TDD, as our esteemed critics contend, is the unwarranted overhead it introduces to software projects. This weighty accusation concerns the task of maintaining the testing code alongside the production code, which, according to the prosecution's perspective, considerably exacerbates the complexities of project management.</p><p>Now, please indulge me as we delve into the nitty-gritty of this allegation. Our critics astutely point out that TDD's unwavering emphasis on creating tests in tandem with the production code results in an inherent conundrum. As developers, we find ourselves in the unenviable position of maintaining two parallel sets of code - the production code itself and the code responsible for testing it.</p><p>This approach adds layers of intricacy to the project. This situation isn't merely an issue of maintaining an additional set of files; it involves ensuring that the testing code is in harmony with the production code. In our experience, such meticulous synchronization introduces confusion and can escalate into an administrative nightmare.</p><p>The stark reality is that the act of maintaining these test codes often leads to a decline in overall project manageability. We contend that this complication is just one of many signs that TDD is a practice far too cumbersome for today's fast-paced software development landscape.</p><h5>Defense</h5><p>First of all, your honor, I want to point out that is not merely about TDD, it&#8217;s a general attack on having automated tests in our codebase - which is even worse, probably, but also easier to defend.</p><p>The moment you start wondering how to make software development better and to have a better life at work daily, you start realizing that there is typically a lot of time wasted in unplanned work: bugs, defects, issues in production, and any other kind of activities that you cannot plan because it&#8217;s unexpected. Agile, XP, and Lean all agree that we should strive to reduce the time we spend in unplanned work to the minimum possible (around 20% of the time for high-performance teams, according to the research in the &#8220;Accelerate&#8221; book, against 27% invested by low-performance teams).</p><p>Writing and maintaining an automated test suite is a minimal investment that pays off by enhancing code quality, reducing defects, and increasing the maintainability of the code itself - meaning it reduces unplanned work in the future. TDD can reduce that even more, to be honest, because it ensures a couple of additional points:</p><ul><li><p>we are sure all the code is covered by tests without any additional effort</p></li><li><p>you will write only the minimum code required for your current needs, meaning the YAGNI principle will be respected and you will have to maintain the less code possible</p></li><li><p>big complex problems/features will not keep you stuck because you don&#8217;t need to overthink the entire design beforehand - you can just understand how to start and have a generic understanding, and tests will drive you to the solution</p></li></ul><p>So we can say with absolute certainty that having an automated tests suite is very very helpful, and an investment that is worth doing - and TDD raises even more of that value.</p><h4>TDD focuses on testing, not design</h4><h5>Prosecution</h5><p>I'd like to draw your attention to yet another critical viewpoint, one that questions whether Test-Driven Development (TDD) leads us down a path of good design, as its proponents claim. Our esteemed critics argue that TDD's singular emphasis on testing overshadows the importance of promoting well-crafted software, and they propose that it often steers developers toward writing code primarily to fulfill test cases, rather than to foster sound design principles.</p><p>This critique, ladies and gentlemen, underscores a fundamental issue with TDD. The practice may encourage a myopic focus on satisfying test conditions rather than nurturing the kind of software that stands the test of time. Instead of nurturing the growth of elegant, maintainable, and efficient code, TDD, according to our critics, may drive developers to prioritize passing tests at the expense of the software's overall quality.</p><p>These criticisms, as unpalatable as they may be to some, should give us pause. We are left to ponder whether TDD is truly a beacon of good design or, as our critics assert, a practice that might inadvertently pave the way for poorly designed software. The prosecution contends that this is a matter we cannot afford to take lightly and warrants a closer examination of TDD's value in contemporary software development.</p><h5>Defense</h5><p>There are two questions we want to start our response from, to demonstrate that this accusation is completely without basis and concreteness.</p><p>The first question is: are you sure that it is bad to focus primarily on passing the tests? As the Agile Manifesto states, the first measure of progress is &#8220;working software&#8221; - and passing those tests means our software is working, so it is for sure something to celebrate and be happy about.</p><p>But the second question will add light also on the first one: are you sure that TDD emphasizes passing tests instead of good design? I think that the name here is probably causing some misunderstanding. </p><p>Let me explain: TDD means Test-Driven Development. Development is the process where we add functionalities to a software, and while we do that we also decide the design of the software to achieve that purpose. TDD means that you develop software by letting the tests drive this process, and TDD has a specific target that is stated in the very first page of Kent Beck&#8217;s book: &#8220;clean code that works&#8221;.</p><p>&#8220;Clean code&#8221; means code with a good design, intended as a design that makes it easy to read and maintain the code. &#8220;That works&#8221; means code that does what we expect from it. Tests we use to drive the process allow us to achieve both: if they are green, our code is working - and thanks to those tests, we can easily refactor our code to improve its design being sure that the behavior is still the same.</p><p>The focus of TDD is not only on testing, is &#8220;clean code that works&#8221; and the test-driven process is the best way known today to achieve that result - it also allows us to split the problem: we write the tests and make it green, focusing on &#8220;code that works&#8221; - then, we refactor focusing on &#8220;clean code&#8221;. </p><p>TDD doesn&#8217;t take care itself of it: it&#8217;s up to you to be sure you know what the software is supposed to do to write useful tests, and it&#8217;s also up to you to know the best design and refactor practices to apply - once you know those, TDD is the best tool to be sure you achieve them both.</p><h4>TDD is not flexible</h4><h5>Prosecution</h5><p>Now, your honor, please let us now cast our gaze upon the notion of inflexibility. As opponents of TDD, we want to present an argument that has struck at the very heart of its methodology, contending that the rigid nature of this approach, which insists on writing tests before any code, may stifle creativity and innovation.</p><p>The prosecution asserts that this critique is a striking indictment of TDD's potential drawbacks. We argue that the demand for tests to precede coding creates an environment where creativity and exploration take a back seat, as it's not conducive to imaginative problem-solving or the pursuit of alternative, innovative solutions.</p><p>In our ongoing scrutiny of TDD, the notion of inflexibility is indeed a substantial concern. It prompts us to consider whether, in its zeal to ensure testing, TDD might inadvertently suppress the very creativity and out-of-the-box thinking that often leads to groundbreaking software solutions. The prosecution submits that these allegations, while disputed by proponents, are nonetheless serious and warrant careful consideration as we weigh the merits of TDD in the realm of software development.</p><h5>Defense</h5><p>Letting aside the attack about TDD being focused on testing, that we already responded to in the previous point, we want to totally refuse the prosecution accusing TDD of being inflexible.</p><p>In this case, we can start our responding taking inspiration directly from Kent Beck&#8217;s TDD book itself: in the &#8220;Mastering TDD&#8221; chapter, the author respond to some hypothetical questions that may arise when trying TDD. Among all the incredible insights of this chapter, one of the questions is: &#8220;How much feedback do you need?&#8221;.</p><p>The question is about feedback because tests in TDD are described as a way to have a short feedback loop about our decision, so this question can actually be rephrased to &#8220;How many tests should I write?&#8221;. And the answer is: it depends!</p><p>With a very clear example, Beck shows us how the same problem caused him to write 6 tests, while another developer wrote 65. Quoting the book:</p><blockquote><p>You will have to decide, from experience and reflection, about how many tests you want to write.</p></blockquote><p>TDD's view of testing is pragmatic: tests are a means to an end, the end being &#8220;code in which we have great confidence&#8221;. Taking this idea to the limit, it means that if our knowledge of the implementation gives us confidence even without a test, then we might even decide to not write a test at all.</p><p>In the end, this means that the more you know the problem you are solving with the code, the less number of tests you will feel the need to feel safe - and as a consequence, you will write fewer tests. On the reverse, when you are facing a problem for the first time, you will probably prefer to have a lot more tests to feel safe.</p><p>And that sounds like a very flexible approach to me! </p><div><hr></div><p>Next week, we will discuss the last 4 points, and then I will share my take and conclusions, as always, and also the most important resources I know to understand more about the impact of this practice.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p>]]></content:encoded></item><item><title><![CDATA[🧙🏼‍♀️The Blair Witch Project: a Software Development Horror Story [Halloween Special 🎃]]]></title><description><![CDATA[&#128123; Beware, for the shadows of bad programming practices lurk in the woods of software development. Enter a terrifying tale where a cursed codebase becomes the epicenter of horrors.]]></description><link>https://learnagilepractices.substack.com/p/the-blair-witch-project-a-software</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/the-blair-witch-project-a-software</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 31 Oct 2023 06:00:26 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!UzEC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>Happy Halloween &#128123;</h3><p>&#127881; Hey, developers! This week, a special edition of the newsletter is coming to your inbox! We celebrate Halloween with an AI-generated Horror Story about Software Development. I asked ChatGPT to help with this, giving &#8220;The Blair Witch Project&#8221; movies as a reference. Hope you will enjoy this week's email, and have fun on your Halloween night! &#127875; </p><p>In case you feel the need for a technical read - check our archive <a href="https://learnagilepractices.substack.com/archive">here</a>!</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>&#129497;&#127996;&#8205;&#9792;&#65039;The Blair Witch Project: a Software Development Horror Story [Halloween Special &#127875;]</h1><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UzEC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UzEC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!UzEC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!UzEC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!UzEC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UzEC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg" width="444" height="444" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:444,&quot;bytes&quot;:163541,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!UzEC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!UzEC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!UzEC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!UzEC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb93c533e-a6f9-489b-bc8b-3fe06f914621_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A movie poster for the horror movie called "The Blair Witch Project: a Software Development Horror Story" - it's a funny horror story about a horrible bad software development project. While it's an horror story, it's also funny because it's a parody. So be sure to make a movie poster that is ok for a parody horror movie. The main element is the black forest, with some guys entering the dark forest with a laptop in their hand. No text in the image. </figcaption></figure></div><p>The moon loomed high in the dark, starless sky. Sarah, Mark, and Mike ventured into the dreaded "Black Code Forest," a cursed software development project whispered about in hushed tones among the bravest programmers. It was an insidious place, shackled by malevolent waterfall practices. Automated tests had long been sacrificed to the project's spectral forces, leaving a void for chaos to reign. The team's mission: to rescue this forsaken codebase.</p><p>With laptops as their torches, the intrepid trio crossed the threshold of the "Black Code Forest." A sense of unease fell over them as they waded deeper into the labyrinthine codebase.</p><p>Within the dimly lit corridors of code, ethereal whispers grew louder. "No version control," they hissed. "Manual deployments." "Untested changes." The voices swirled around the team, a constant reminder of the dark past that had trapped the project in its cursed state.</p><p>As they trudged forward, the ominous nature of their task became apparent. Deadlines loomed like specters, never allowing a moment's rest. The shadow of perpetual overtime and the threat of burnout weighed heavy on their shoulders.</p><p>Sarah stumbled upon a terrifying chart - the "Graph of Doom." A menacing illustration of the project's trajectory into chaos. It was a cruel reminder of the arduous journey that lay ahead.</p><p>Merge conflicts, like malevolent spirits, haunted their work. Eerie error messages echoed with chilling warnings: "Conflicts found. Resolve or be doomed." The team fought the spirits as they clawed at their code, desperately trying to break free.</p><p>Phantoms of broken code materialized before them. Lines of logic twisted and turned, defying all reason. The team, engulfed by the mystic fog, pursued the elusive specters through the labyrinthine passages.</p><p>The fateful night of deployment arrived. It was a harrowing ritual, one that came once a year. The process was riddled with unexpected errors, and the team's nights were consumed by dark sorcery. It was a tradition that none wished to perpetuate.</p><p>In their darkest hour, the team remembered the wisdom of software development best practices. Agile methods, automated testing, and continuous integration became their talismans. They decided to fight back, determined to banish the project's malevolence.</p><p>With renewed resolve, they set about to break the curse that held the project in its icy grip. They summoned practices like TDD, CI/CD, and automated testing, beginning the process of exorcising the sinister forces that had tormented them.</p><p>The day of reckoning came at last. With courage and an unwavering commitment to best practices, the team performed the final deployment. They bid farewell to the legacy code, leaving behind a well-documented, efficiently maintained software. The curse was shattered, and the "Black Code Forest" vanished into the mists.</p><p>This chilling tale serves as a reminder of the horrors that can afflict software development when best practices are abandoned. The curse of legacy code, manual deployments, and an absence of testing can torment even the bravest. However, with dedication and the right practices, the curse can be vanquished, and the nightmare can finally end.</p><p>Happy Halloween, fearless developers. Remember, in the world of software development, the specters of bad practices and legacy code are very real. It's up to you to decide whether to banish them or let them haunt your projects.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p>]]></content:encoded></item><item><title><![CDATA[🚀 What's the Real Deal with Documentation in Agile? 🤔]]></title><description><![CDATA[Some think Agile (and XP) means no documentation at all, but that is simply not true! So, let's discover what actually are the Agile and XP point of views about documentation!]]></description><link>https://learnagilepractices.substack.com/p/whats-the-real-deal-with-documentation</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/whats-the-real-deal-with-documentation</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 24 Oct 2023 05:00:28 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!8vJh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! The biggest news of the week is that I launched my first free Workshop: a 4-hour deep-dive into TDD basics to use it as a learning tool, and OOP misconceptions. The even bigger news is that the 8 seats available went sold out in a single day! It was amazing, and I will definitely setup new sessions in the future, so&#8230; stay tuned!</p><p>&#128204; In case you missed it: last week, I gave my 2 cents about AI's impact on Software Development jobs: where we are, where we might go in the future, IMHO! If you haven't already, make sure to take a read at it <a href="https://learnagilepractices.substack.com/p/ai-and-software-whats-the-synergy">here</a> and let me know what you think! &#128170;</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>&#128640; What's the Real Deal with Documentation in Agile? &#129300;</h1><h3>Introduction</h3><p>Documentation is a frequent source of heated discussion when it comes to Agile practices. Discussions can become rather animated as people from different backgrounds and experiences bring their unique viewpoints to the table. Some people say that Agile and documentation cannot coexist because they are incompatible, comparing them to oil and water. On the other hand, other people believe that documentation is an essential and crucial component of the Agile process.</p><p>Maybe you are one of the believers that Agile says to avoid documentation completely. We're here to debunk this myth. </p><p>The approach to documentation that Agile and Extreme Programming take is sometimes misunderstood or misinterpreted. So, in this post, we'll go into the essence of XP and expose the true nature of Agile documentation as it relates to this powerful and dynamic methodology.&#128640;&#128221;</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8vJh!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8vJh!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8vJh!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8vJh!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8vJh!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8vJh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg" width="446" height="446" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:446,&quot;bytes&quot;:209846,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8vJh!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!8vJh!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!8vJh!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!8vJh!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed73f6dc-8ad3-411d-bf6c-eaf02828836d_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Generate an image illustrating a frazzled cartoon programmer surrounded by towering stacks of handwritten documentation, desperately writing more pages in a humorous and exaggerated style.</figcaption></figure></div><h3>The Truth About Documentation in Agile</h3><p>Let&#8217;s start by stating the truth very clearly: in no way does Agile Manifesto, XP, or any other Agile-related methodology suggest avoiding documentation completely. </p><p>I mean, that wouldn&#8217;t make any sense, right? Some documentation is just needed, sometimes. Think about audits, support, onboarding, tracking decisions, brainstorming - there simply are good reasons to document stuff, sometimes.</p><p>The only real take about documentation is:</p><blockquote><p>We are <strong>uncovering</strong> <strong>better ways of developing software</strong> <strong>by doing it</strong> and helping others do it. Through this work <strong>we have come to value</strong>:</p><p>[&#8230;]<br><strong>Working software over comprehensive documentation</strong><br>[&#8230;]</p><p><strong>That is, while there is value in the items on the right, we value the items on the left more.</strong></p></blockquote><p>The Agile Manifesto states very clearly that &#8220;there is value&#8221; in documentation, but working software is considered more important - and hopefully, this is something we all agree on.</p><p>The problem is that, over time, some people misunderstood this sentence and spread the idea that all documentation should be avoided. This is simply not true and is one of the things that contributed to making people skeptical about Agile.</p><p>Still, most people underestimate that statement - and I think that to clarify it we need to bring eXtreme Programming's take on documentation when describing the principle of &#8220;<strong>mutual benefit</strong>&#8221;:</p><blockquote><p><strong>Extensive internal documentation</strong> of software is an example of a practice that <strong>violates mutual benefit</strong>: I am supposed to slow down my development considerably so some unknown person in the potential future will have an easier time maintaining this code.</p></blockquote><p>This is the big problem with extensive documentation in most organizations, IMHO: while some consider the cost of documentation, almost no one considers the ROI of that cost - that most of the time is very low.</p><p>Writing technical documentation has a lot of issues:</p><ul><li><p>writing good technical documentation is hard, for multiple reasons:</p><ul><li><p>even writing well in general is hard</p></li><li><p>writing good technical documentation is a different job than writing code</p></li></ul></li><li><p>async written communication is generally less efficient than sync conversations (and the fact that writing well is hard doesn&#8217;t help)</p></li><li><p>it is completely detached from the codebase, so you need to invest effort to be sure either you don&#8217;t have duplicate info between code and doc or to keep that duplicated info in sync</p></li></ul><p>I&#8217;m sure most of you feel related to those problems, but you probably think that documentation is still important and we just have to do it.</p><p>I agree, we need <strong>certain types</strong> of documentation, but not all.</p><h3>The heuristics we should care about</h3><p>From all the ways to think about software documentation, I like the approach of splitting it into two main categories:</p><ul><li><p>Product documentation &#8594; here we have all the documentation we write for users (both internal and external), but also all the documentation related to the system - for example, API public documentation and Architecture documentation fall into this category</p></li><li><p>Process documentation &#8594; here we have all the documentation we produce during the process of development = for example, user stories and meeting notes fall into this category</p></li></ul><p>We can safely say, IMHO, that Product documentation is the most important one to invest in - because it will last over time; Process documentation instead, is only useful in the process, then it becomes mostly useless.</p><p>This is one of the keys to approaching documentation in an Agile (and smart) way: consider trade-offs like we always do in code (or should do!). If the Product doc is more important, we want to invest more time in it compared to the Process doc.</p><p>Talking about the mutual benefit example we discussed earlier, the solution is not to don&#8217;t write documentation at all - XP simply suggests a different approach: </p><ul><li><p>Invest time in writing automated tests instead of documenting the code what it should do and how to use it - this way not only benefit will be mutual (for both the current dev and the future one) but in general the code will be easier to read and maintain</p></li><li><p>Invest time in refactoring instead of documenting the code to explain what it should do in detail - this way, we can remove accidental complexity and improve readability, giving the current dev more satisfaction and fewer defects, and also an easier-to-understand code for the future dev</p></li><li><p>Invest time in names to make them explicit and coherent, so that the current dev works faster and future dev will easily read it</p></li></ul><p>The point is not to avoid documentation, but to handle it in a professional and smart way - not writing any doc or writing too much doc without thinking are just 2 faces of the same, problematic coin.</p><p>Basically, we should handle the documentation the same way we treat code and tests: the less it is, the better; the more automated it is, the better; the less duplication there is, the better; and so on.</p><p>Here are the principles and heuristics that we can follow to face documentation in an effective and sustainable way:</p><ul><li><p><strong>Code should be self-documenting &#8594;</strong> the right place to read what the code does is the code itself: instead of writing documentation to describe it, refactor it to make it readable</p></li><li><p><strong>Tests are living documentation &#8594;</strong> tests are still code, and they basically are examples of usages of the code under tests: make tests readable so that they can actually be useful as documentation</p></li><li><p><strong>Automate all the documentation possible &#8594;</strong> writing documentation is painful, and keeping it updated with changes is even more painful - be sure to always ask yourself if a piece of documentation can be automated, and pick your tools to enable the automation chances; documentation is costly, we need to reduce that cost</p></li><li><p><strong>Keep documentation close to what it describes</strong> &#8594; instead of having a single place for documentation, make sure you document something very close to where you use it - a centralized wiki makes a lot of sense for company-wide and product documentation, but, for example, document your codebase in the repository itself</p></li><li><p><strong>Write just enough documentation &#8594;</strong> &#8220;just enough&#8221; means be sure you write all that truly matters, in a clear way, but no more; it also means be sure to cover all that matters</p></li><li><p><strong>Write documentation &#8220;just in time&#8221; &#8594;</strong> before documenting, wait. Produce documentation when it&#8217;s needed, not before - a similar approach to creating an abstraction: do not do it immediately, wait until the last responsible moment when you are sure you need it and most information is now steady and not changing continuously.</p></li></ul><p>Just as clean code and solid architecture contribute to a healthy project, so does comprehensive and well-maintained documentation - and missing/wrong/bad documentation also contributes to technical debt, so again, &#8220;just enough&#8221;: write all that&#8217;s important, but no more.</p><p>This synergy can help us steer clear of the ever-dreaded tech debt, maintaining a system that's truly agile, adaptable, and ready for the future.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>I&#8217;m pretty good at documenting stuff - at least, this is how I feel about it, due to some self-reflection but also the feedback I got in my career. </p><p>The truth is: that I hate documentation - so I had to learn how to handle it in order to avoid writing too much.</p><p>At first, I did some research, because you know - it&#8217;s not like you can stop doing something just because you don&#8217;t like it, it is not professional. I wanted to understand how people were handling documentation. </p><p>In the first years of my career, when I still wasn&#8217;t into Agile, all I could find was a lot of tips on how to write and maintain a big documentation. I&#8217;ve never been able to make it work, and I&#8217;ve never seen people that have that approach to documentation making it work properly.</p><p>Documentation is just part of the Agile and XP revolution that I faced years ago: in the same way that I discovered that there actually are ways of developing software successfully, there also are ways to handle documentation successfully!</p><p>Differently from code, where we can identify a lot of practices to approach development in an Agile way (TDD, CI, etc..) - on documentation we mostly have principles and ideals. </p><p>Today, I want to give you an example of what we set up in my previous team, where I was tech lead and we tried to handle documentation in the most lightweight and agile way we could think of.</p><ol><li><p><strong>Distributed documentation</strong></p><p><br>In a similar way to distributed services and microservices, we tried to approach documentation in a distributed way: we tried to keep the documentation always as close as possible to the thing we wanted to document. <br><br>Everything related to the codebase was in the README file in the repository - things like a description of the project, setup requirements, and domain knowledge that it&#8217;s worth an explanation of why it&#8217;s implemented that way. <br><br>We had a 2 layer Wiki (made with Notion) - layer 1 was company-side documentation, used for organization stuff like describing the company the business, etc; layer 2 was the products, each product had a dedicated sub-wiki where documenting all the things related to that product (POCs, External APIs or Hardware tools doc, Meeting notes, etc).<br><br>We also had an ADR repository: we used the Any Decision Record interpretation, and there we tracked all company-wide tech decisions, such as the format for money and date in our internal APIs.<br></p></li><li><p><strong>Prefer automation</strong></p><p><br>We were a small team of a small startup, so it was fundamental for us to consider the impact of documentation on our productivity - and being able to automate documentation was a game changer for us.<br><br>Here is the best example of it: we didn&#8217;t need a Swagger documentation API for external users - our API was only used by the front end. At first, we automated Swagger doc from code - then, we evolved it to create the Typescript types library and automatically share it from BE to FE. This way, we automated the creation of 90% of boilerplate code - we only needed to implement the client class using that type, we had a standard way of handling exceptions and the only thing that remained to share was special error cases. Another future improvement we planned was automating the entire SDK instead of only the types of Requests and Responses, but we didn&#8217;t achieve that before I left.</p><p></p></li><li><p><strong>Pick tools that enable automation</strong></p><p><br>It&#8217;s fundamental to choose your tools with automation in mind: for example, we choosed Notion because thanks to its APIs we had the chance to automate some kind of documentation - for example, we automated the publication of approved ADRs, and when I left we were working in automating release notes using Notion as CMS.<br><br>Having tools such as Notion, with official API included in the plan. will always enable you to automate stuff as you need - and most of time even without implementing due to an existing integration via Zapier/Make. <br></p></li><li><p><strong>Consider the trade-offs</strong></p><p><br>In the same way, we need to consider trade-offs when implementing something in the code, we should do the same with documentation.<br><br>The simplest example: is if you need to invest 1 hour to document a change that requires 15 minutes of implementation, you should ask yourself if it&#8217;s worth it. Probably, you can reduce that time - probably, you are documenting way more than &#8220;just enough&#8221; needed. Be sure to document everything that&#8217;s worth it, especially the whys and constraints that lead to a certain decision.<br><br>But be 100% sure that everything you write in documentation is worth the time.<br></p></li><li><p><strong>Shared responsibility</strong></p><p><br>Writing documentation is not the responsibility of a single specific person, even if he was the one working on the related part. Everything related to the product should be a team responsibility, following Agile principles - and documentation makes no exception.<br><br>Be sure that automation is the priority for everyone when it comes to documentation, and that the written documentation that you still need to write is written by a different member every time so that the pain is shared.<br></p></li></ol><p>This is just an example, something that worked pretty well for us in a context where documentation was only internal and we were driving it as a best practice - so basically the company trusted us in most decisions. </p><p>In your context, you could of course face more constraints (stakeholder needs, user-facing documentation required, etc) - but following the same principles and heuristics shared in this article, you should be able to handle it successfully without making developers suffer!</p><div class="pullquote"><p>Documentation is a pain 99% of the time, so be sure to face it in a smart way or it will lead you to hard times. Avoid documenting what can be written in code, avoid handling manually what can be automated, and in general treat documentation as something that has a high cost: carefully consider every investment in it.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3rV4lvv">Agile Documentation: A Pattern Guide to Producing Lightweight Documents for Software Projects</a> </strong>- Documentation is the castor oil of programming. Managers think it is good for programmers, and programmers hate it!</p></li><li><p><strong><a href="https://amzn.to/4049PR7">The Product is Docs: Writing technical documentation in a product development group</a> -</strong> This book provides a broad perspective on the essential aspects of creating technical documentation in today's product development world. It is a book of opinions and guidance, collected as short essays.</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://www.nuclino.com/articles/agile-documentation">Agile Development Methodology and Documentation</a></strong></p></li><li><p><strong><a href="https://blog.prototypr.io/software-documentation-types-and-best-practices-1726ca595c7f">Software Documentation Types and Best Practices</a></strong></p></li><li><p><strong><a href="https://www.archbee.com/blog/types-of-software-documentation#:~:text=There%20are%20several%20types%20of,code%20documentation%2C%20and%20troubleshooting%20guides.">Types of Software Documentation to Know About</a></strong></p></li><li><p><strong><a href="https://devops.com/documentation-in-agile-challenges-and-trends-in-2023/">Documentation in Agile: Challenges and Trends in 2023</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://www.leadingagile.com/podcast/agile-myth-busting-is-there-really-no-documentation-in-agile-w-anil-jaising/">Agile Myth Busting: is there really no documentation in Agile?</a></strong></p></li><li><p><strong><a href="https://www.easyagile.com/blog/easy-agile-podcast-ep-14/">Easy Agile Podcast Ep.14 Rocking the Docs</a></strong></p></li><li><p><strong><a href="https://www.infoq.com/articles/roadmap-agile-documentation/">A Roadmap to Agile Documentation</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[AI and Software: 🤖💻 What's the Synergy We Can Expect?]]></title><description><![CDATA[We are experiencing the beginning of the future of Software Development! &#128640; Let's explore the possibilities, challenges, risks and opportunities that AI will open for all Software Developers.]]></description><link>https://learnagilepractices.substack.com/p/ai-and-software-whats-the-synergy</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/ai-and-software-whats-the-synergy</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 17 Oct 2023 05:00:16 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!Bp1I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! As every week, we keep growing due to a new subscriber that joined LAP &#127379; - let&#8217;s welcome him among us while hitting 45 subscribers! &#128588; Thank you all so much for your support - please, share this content to your fellow developers to help LAP keep growing!</p><p>&#128204; In case you missed it: last week, I entered the highly discussed topic of monolith vs microservices and gave my thoughts on how, sometimes, that decision is not merely technically but more sociotechnical and team-structure-dependent! If you haven't already, make sure to take a read at it <a href="https://learnagilepractices.substack.com/p/choosing-wisely-when-to-go-sync-and">here</a> and let me know what you think! &#128170;</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>AI and Software: &#129302;&#128187; What's the Synergy We Can Expect?</h1><h3>Introduction</h3><p>Are you ready to navigate the exciting terrain of AI in software development, but perhaps a bit apprehensive about the future? &#129302; </p><p>As technology continues to advance, there's a growing fear that AI might replace many human workers, including programmers. But wait, there's another side to this story.</p><p>&#127775; Embracing AI doesn't just mean relinquishing control; it means unlocking new opportunities for creativity and innovation in the software realm. In this article, we'll journey through the realm of AI, addressing those concerns while putting a different light on the incredible possibilities it brings. </p><p>So, let's embark on this adventure together and explore the synergy of AI and software development. &#128105;&#8205;&#128187;&#128640; </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Bp1I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Bp1I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Bp1I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Bp1I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Bp1I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Bp1I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg" width="414" height="414" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:414,&quot;bytes&quot;:213222,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Bp1I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!Bp1I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!Bp1I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!Bp1I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F701f93fa-3d97-4894-99cd-90fa5053f74b_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">An AI programming the evil software to command the world and kill us all.</figcaption></figure></div><h3>What do we mean with AI?</h3><p>Artificial Intelligence (AI) is a phrase that's been circling the tech world for decades. But what does it actually mean, and how is it relevant to software development? Let's start by demystifying AI.</p><p><strong>Defining AI</strong></p><p>At its core, AI refers to the ability of machines or software to perform tasks that typically require human intelligence. These tasks encompass a wide range of activities, from recognizing patterns in data to making decisions based on that data. In the context of software development, AI can revolutionize how we approach various tasks, from coding to testing.</p><p>Since I&#8217;m not an expert in the field of how AI works - I prefer to send you an article from more expert people to read more about this. You can find it <a href="https://www.coe.int/en/web/artificial-intelligence/what-is-ai">here</a>.</p><p><strong>AI in Everyday Life</strong></p><p>AI is no longer confined to the domain of sci-fi films and research labs. It's integrated into our daily lives, from personalized movie recommendations on streaming platforms to self-driving cars.</p><p>AI's ability to sift through vast datasets, identify patterns, and make informed predictions can revolutionize various aspects of our jobs, software development included.</p><h3>The current landscape of AI for Software Development</h3><p>The integration of AI into software development is not a distant dream. It's happening right now, reshaping how we conceive, build, and manage software applications.</p><p><strong>1. Code Generation and Auto-Completion</strong></p><p>One of the most immediate applications of AI in software development is code generation. AI-powered tools analyze your programming tasks, understand the context, and suggest code snippets or even generate entire functions. This can, potentially, drastically speed up the coding process.</p><p><strong>2. Bug Detection</strong></p><p>AI algorithms excel at spotting anomalies in large datasets. In software testing, AI can pinpoint irregularities in code execution, making it an invaluable asset for identifying and fixing bugs. This contributes to the development of more robust and reliable software.</p><p><strong>3. Predictive Analytics for Software Maintenance</strong></p><p>AI's predictive capabilities extend to software maintenance. By analyzing historical data, AI can forecast when components or systems may fail or require maintenance. This allows developers to proactively address issues, reducing downtime and enhancing user experiences.</p><p><strong>4. User-Centric Application Customization</strong></p><p>Incorporating AI enables applications to adapt to individual users' needs. Whether it's suggesting content or tailoring the user interface, AI enhances user experiences and increases engagement.</p><p><strong>5. Advanced Security Measures</strong></p><p>Security remains a paramount concern in software development. AI plays a pivotal role in detecting and responding to cyber threats in real time, fortifying the software against potential attacks.</p><p><strong>AI in the Cloud</strong></p><p>Cloud platforms harness AI to streamline software development processes. These platforms offer scalable resources, support collaboration, and facilitate DevOps practices.</p><p><strong>Emerging AI Trends</strong></p><p>As AI in software development continues to evolve, emerging trends show its vast potential. Natural Language Processing (NLP) enables code to be written in plain English. Reinforcement learning can optimize code execution. AI chatbots are transforming customer support in software applications.</p><h3>Will we all lose our jobs?</h3><p>As AI continues to weave its way into the software development landscape, a significant concern looms: will AI make software developers obsolete?</p><p><strong>1. A Shift in Roles</strong></p><p>AI will not replace developers but rather redefine their roles. Routine and repetitive tasks, such as code generation, will become automated. This allows developers to focus on higher-value activities like problem-solving, architecture design, and creative innovation.</p><p><strong>2. Continuous Learning is Key</strong></p><p>The symbiotic relationship between AI and developers necessitates continuous learning. Developers must adapt to this new environment, learning to collaborate effectively with AI systems and harness their capabilities.</p><p><strong>3. Enhanced Productivity and Efficiency</strong></p><p>AI augments developers' productivity. It offers recommendations, identifies potential issues, and accelerates coding tasks. This synergy fosters efficient software development.</p><p><strong>4. Job Evolution, Not Extinction</strong></p><p>The role of a software developer is not disappearing; it's evolving. Developers become AI partners, utilizing technology to create sophisticated, intelligent, and user-centric applications.</p><p><strong>5. Ethical and Creative Aspects</strong></p><p>AI cannot replicate human ethics, creativity, or empathy. Developers remain essential in making ethical decisions, creating innovative solutions, and understanding user needs at a deeper level.</p><p>The partnership between AI and software developers holds immense promise. As AI tools become indispensable, software development will become more efficient and innovative. Developers' jobs will transform, aligning with the evolving technology landscape. The future is bright for those who embrace AI as a powerful ally in the realm of software development. It's not about job loss but about a new era of enhanced capabilities and endless possibilities.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>If you know me, you already know how I see our job: we are problem solvers, and code is just one of the tools in our toolbox - AI is just another one. </p><p>So, in general, I don&#8217;t think AI will replace our job entirely - mostly because of two reasons:</p><ul><li><p>first of all, we often solve context-specific problems, and this means that standard solutions and known solutions can be reapplied only if adapted to context, considering tradeoffs, constraints, etc - there will probably be some problems that we will solve with prompts instead of code, but I don&#8217;t see a total replacement here</p></li><li><p>also, someone will have to develop AI, develop tools around them, integrations, and so on - there will be new opportunities also, not only something less to do</p></li></ul><p>At the moment, the best thing we can do as software engineers is try to understand how AI can be useful to us. </p><h3>How do I use AI?</h3><p>In general, I&#8217;m still a bit skeptical about the current status of AI for coding, and I&#8217;m going very slow in experimenting it: for example, GitHub Copilot is still not in my daily coding routine. </p><p>I&#8217;m experimenting with some stuff, for example, an AI-TDD CLI tool that basically allows me to call a command specifying a test, and he will respond by creating a class implementing a code passing that test.</p><p>This is the first great usage that I see today and I want to start experimenting in deep - it&#8217;s also a path that I think can become more powerful in the future: I&#8217;ve seen some people making AI creating tests for the code they wrote, but I don&#8217;t like that approach.</p><p>As a sustainer of TDD, I strongly believe that the most important part of the code is the test: if written first, the test guarantees us to make the code do what we tested, but also decide how it is used - and then leave the implementation to AI. This makes so much sense to me because it allows humans to help AI in context stuff (one of the weaknesses of AI, at the moment) by deciding class and method names - and also allows us to have control over what AI produces with an automated test. </p><p>The green tests are all we need - and the tests will become the most important code for humans to maintain - and can probably even evolve to some &#8220;more human&#8221; language than code, maybe even some prompts, but more controllable.</p><p>I see a lot of potential in this approach: if such a tool will gain the ability to have more context from the project, we could see a real big change: we don&#8217;t even care if the code is maintainable because it&#8217;s AI that maintains it so making it more readable in the implementation doesn&#8217;t make that much difference. We could forget about SOLID and other Clean Code principles and just care about the external interface - that will remain the most important thing. I know it looks very far from now, and some of you might think that I&#8217;m crazy, but I truly believe in this.</p><p>Another point where AI could be useful is documentation - there already are a lot of ways to automate documentation of multiple kinds, and with AI these tools could become so powerful that we could even automate everything, maybe. Imagine running commands that are able to create the Swagger documentation only by reading code, without any comment in the code - or the same for C4 Model documentation, UML, etc. </p><p>We will always need some sort of documentation, especially for APIs or libraries we offer to the external world.</p><p>In general, anyway, the most realistic future I can imagine is one where the focus of software developers is building systems where AI can automatically generate code and we build what&#8217;s needed to be sure that what AI built is correct and is actually what business needs. </p><p>This also means that, at least for a couple of decades more, there will still be a lot of work for software developers - especially those that deep dive into practices and methodologies because they will come in handy for sure in the transition to AI-generated code, but I&#8217;m sure they will be helpful also once AI will generate code we can trust more.</p><div class="pullquote"><p>I strongly believe that practices like Continuous Delivery, working in baby steps, TDD, and BDD - in general all technical excellence practices - will gain even more importance with AI-generated code: at first, they will help us build trust easily in the generated code, and then they will be less useful for the code design management but even more in the business side of coding, where our target is making the company make money and succeed thanks to technology.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3PVEKub">Artificial Intelligence For Dummies</a></strong> - Starting with a basic definition of AI and explanations of data use, algorithms, special hardware, and more, this book simplifies this complex topic for anyone who wants to understand what operates the devices we can&#8217;t live without.</p></li><li><p><strong><a href="https://amzn.to/3rRl9mW">Artificial Intelligence Basics: A Non-Technical Introduction</a></strong> - Artificial intelligence touches nearly every part of your day. In our modern era, an understanding of AI and its possibilities for your organization is essential for growth and success.</p></li><li><p><strong><a href="https://amzn.to/3tB62ic">Probabilistic Machine Learning: An Introduction</a></strong> - This book offers a detailed and up-to-date introduction to machine learning (including deep learning) through the unifying lens of probabilistic modeling and Bayesian decision theory.</p></li><li><p><strong><a href="https://amzn.to/46xycci">Fundamentals of Machine Learning for Predictive Data Analytics</a></strong> - This introductory textbook offers a detailed and focused treatment of the most important machine learning approaches used in predictive data analytics, covering both theoretical concepts and practical applications.</p></li></ul><h3>&#128233; Newsletters</h3><ul><li><p><strong><a href="https://aisupremacy.substack.com/p/the-most-impactful-ai-events-of-2023">The most impactful AI events of 2023</a></strong> - [<strong><a href="https://aisupremacy.substack.com/">AI Supremacy</a></strong> newsletter from <a href="https://substack.com/@aisupremacy">Michael Spencer</a>]</p></li><li><p><strong><a href="https://lastweekin.ai/">Last week in AI</a></strong><a href="https://lastweekin.ai/"> </a>newsletter</p></li><li><p><strong><a href="https://useai.substack.com/">Use AI</a></strong>, a practical AI newsletter</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://bitrock.it/it/blog/can-ai-help-you-code.html">Can AI help you code?</a></strong></p></li><li><p><strong><a href="https://jellyfish.tech/blog/ai-for-software-development/">AI for Software Development: Use Cases and Challenges</a></strong></p></li><li><p><strong><a href="https://www.synopsys.com/blogs/software-security/the-rise-of-ai-in-software-development.html">The rise of AI in software development</a></strong></p></li><li><p><strong><a href="https://github.blog/2023-04-14-how-generative-ai-is-changing-the-way-developers-work/">How generative AI is changing the way developers work</a></strong></p></li><li><p><strong><a href="https://theresanaiforthat.com/">There&#8217;s an AI for that</a></strong> - a collection of AI tools, daily updated</p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://www.zartis.com/podcasts-story-of-software/25-ai-and-machine-learning/">AI And Machine Learning &#8211; Story Of Software Podcast</a></strong></p></li><li><p><strong><a href="https://developer.ibm.com/podcasts/ai-infusion/008-future-of-software-and-ai/">The future of software and AI</a></strong></p></li><li><p><strong><a href="https://clickup.com/blog/ai-podcasts/">20 AI Podcasts to Learn More About Artificial Intelligence</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[Choosing Wisely: When to Go Sync ⏳ and When to Go Async ⏰ in Software]]></title><description><![CDATA[Sync vs async &#128260; let's explore the scenarios where each shines brightly and uncover why, more often than not, synchronous work can be the key to high-quality software development. &#128640;]]></description><link>https://learnagilepractices.substack.com/p/choosing-wisely-when-to-go-sync-and</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/choosing-wisely-when-to-go-sync-and</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 10 Oct 2023 05:00:23 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!xZR_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! As every week, we keep growing due to a new subscriber that joined LAP &#127379; - let&#8217;s welcome him among us while hitting 45 subscribers! &#128588; Thank you all so much for your support!</p><p>&#128204; In case you missed it: last week, I made my call into the &#8220;microservices yes or no&#8221; topic, explaining why I think that we must always consider DDD Strategic approach and Team Topologies organizational pattern in the decision! If you haven't already, make sure to take a read at it here and let me know what you think! &#128170;</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>Choosing Wisely: When to Go Sync &#9203; and When to Go Async &#9200; in Software</h1><h3>Introduction</h3><p>We are presented with a paradox that is becoming more and more common in the dynamic world of contemporary software development: the decision between synchronous and asynchronous work. Even if the globe has seen a tremendous shift towards remote employment, it's important to remove a myth. Asynchronous work and remote work are not always related. They are two separate dimensions that are capable of coexisting or functioning separately.</p><p>When we accept remote work, we admit that the distance between us no longer limits our capacity for productive collaboration. The choice of whether to operate synchronously or asynchronously is dependent on a diverse set of factors, and it has a significant impact on the outcomes we generate.</p><p>We'll examine the circumstances in which each strategy excels in this blog article, delving into the nuances of this decision and probing the reasons why, more often than not, synchronous work emerges as the cornerstone of high-quality software development. While asynchronous work undoubtedly has advantages, we'll explain why maintaining a careful balance between the two is necessary for long-term success in the software development industry. I will also try to suggest one possible approach, in my personal take section.</p><p>So let's start this trip to learn how to make sensible software decisions about when to go sync and when to go async.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xZR_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xZR_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xZR_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xZR_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xZR_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xZR_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg" width="464" height="464" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:464,&quot;bytes&quot;:147726,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xZR_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!xZR_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!xZR_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!xZR_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fae8407b4-2307-4ebe-9204-658f108204e4_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A team of people working from the same office, but in async.</figcaption></figure></div><h3>&#128675; Navigate the realms of sync and async</h3><p>Asynchronous (async) and synchronous (sync) are two characteristics of the way a team or organization decides to work: that decision determines the pace and flow of the work, dictating some constraints in how we handle tasks and processes within our daily work. Understanding the differences between these two paradigms is essential, particularly in a world where remote work is becoming more and more common.</p><p>What Distinguishes Sync from Async, then?</p><p>First of all, is important to notice that it is mostly communication that can be sync or async - but communication is such an important thing that this decision has an impact on the entire workflow.</p><p>Synchronous communication is the one we are used to: people are available all at the same time, working in the same hours (mostly, at least) and then they are able to communicate to each other immediately when required: response is expected in minutes because we know that we are all available together. </p><p>On the other hand, we can handle communication in an asynchronous way: people are not required to share any hours to work contemporarily and therefore are not expected to be necessarily working when someone else is working. If someone needs to communicate with someone else, the expectation is that response might even take hours, or an entire day, because the other person might work in a completely different time.</p><p>These two approaches to communication, as I already mentioned, have a huge impact on how we work: async communication implies that everyone is working mostly solo, so people are required to be autonomous, and if you need some help you will probably have to wait a lot so you should be able to find out a way to make that waiting time productive anyway. </p><p>In the last years, with remote working becoming quite normal all around the world, a lot of companies went into the path of being fully (or mostly) async in communication, and therefore also in how they work: in such organizations, work is typically handled with a feature branch for each developer, with Pull Requests at the end; you might have a single daily touchpoint with a standup that is typically just an update (and sometimes can be also async) and then work in solo the rest of the day.</p><p>I think this is a very big mistake from companies - or, at least, most companies working this way are not aware of the impact of that choice on software development, which is typically a negative impact. </p><h3>&#128675; Pros and cons of async work in Software Development</h3><p>In general, when working remotely, async communication is a very powerful tool, that can improve employers&#8217; lives and productivity: I won&#8217;t deny this.</p><p>Some benefits are: </p><ul><li><p>communications are not urgent by default and they become urgent only when actually needed (when we are sync, it&#8217;s easily the reverse, which is a big mistake)</p></li><li><p>it&#8217;s easier to have some focus time - office context can be quite distracting, and sometimes we just need to focus</p></li><li><p>a better work-life balance, which is definitely the biggest pro of being able to work whenever we want</p></li></ul><p>These are just some of the reasons why async communication makes a lot of sense, sometimes. But when it comes to Software Development, things are different.</p><p>If you are here, you probably heard about the <a href="https://agilemanifesto.org/">Agile Manifesto</a>: if we try to follow the Agile Manifesto we realize that async communication is an obstacle to it.</p><p>Let&#8217;s have a deeper look at the 4 values:</p><ul><li><p>Individuals and interactions over processes and tools</p><p></p><p>This is very reversed in async communication - every developer works on its own, with no chances of pair/mob or any feedback before the async PR - that, BTW, becomes an actual process in that context; if we go fully async, we are giving power to process and tools, instead of giving it to people</p><p></p></li><li><p>Working software over comprehensive documentation</p><p></p><p>This is also the opposite when async - the reason is that we want to favor async communication as a default, so one of the consequences is that we think we should document everything at the highest level of detail possible; the problem is that documentation should be only for things that don&#8217;t change - but if you do that, it&#8217;s probably not enough for a completely async approach, so you fall into the mistake of documenting details, and either failing in keeping it updated or invest a lot of hours in doing it, with a negative ROI then compared to when and how much it will be useful</p><p></p></li><li><p>Customer collaboration over contract negotiation</p><p></p><p>This becomes mostly impossible when working async - collaboration, actual collaboration, require a lot of sync communication; we cannot actually collaborate if we only communicate async via text, email, or documentation; then, it only remains to negotiate contracts, typically based on estimates and due to that, since estimates are guess and will be wrong by default, based on wrong data.</p><p></p></li><li><p>Responding to change by following a plan</p><p></p><p>Finally, the 4th point also becomes mostly impossible: typically, you cannot respond to change on your own, for multiple reasons - you might not have access to the feedback autonomously, you might require some approval to change the solution away from the original plan, etc. If you have to wait hours, or days, to have feedback on changes, you will be inclined to avoid changes and follow plans without looking for faster feedback. This, again, has been proven to be non-productive in the software development world.</p></li></ul><p>Basically, I don&#8217;t see a way to be Agile when working async; actually, I don&#8217;t even see how you can consider that a team: they are more like individuals that contribute to the same codebase. And if you are not Agile and do not develop your digital product as a team, you will have hard times.</p><h3>&#127757; The best of two worlds</h3><p>What to do instead? I will dive more into my ideal approach in the &#8220;Dan&#8217;s take&#8221; section, but here are the guidelines I would follow:</p><ul><li><p>keep async as default with company-wide non-urgent communications: unless you have to announce something urgent or very important, company-wide meetings can be easily recorded to allow people who cannot be there LIVE to see the recording later</p></li><li><p>keep async as default with people from different teams: this is still a good idea because communication should be non-urgent by default, and this is easier when async</p></li><li><p>make sync the default within the same team: given for granted that we have cross-functional teams built around our products/projects, we should favor the collaboration among the team</p></li><li><p>keep a couple of hours of async: it is fine to keep some async time for people to offer flexibility and freedom - for example, sticking to only 6 hours of expected sync work is a good approach</p></li><li><p>implement Continuous Integration: CI requires you to merge code into the main branch at least daily - this will lead the team to a more strict and frequent collaboration in a natural way</p></li></ul><p>In general, remember that working together works best in most contexts, software development included - I know that working from home is a great opportunity for freedom and flexibility, but we should also consider our responsibility for the success of the company and the quality of the software.</p><p>Also, the most important thing: being async and being remote is an orthogonal decision: they are totally non-related! I&#8217;ve seen teams working async in the office, without any kind of collaboration (and no, a coffee break or lunch together is not collaboration) while I&#8217;ve been in a team working remotely pairing/mobbing/collaborating all the time. </p><p>I know what you are thinking: staying on call is tiring. I know. But while remote work is a great perk, we cannot expect it to be only pros without any cons. It is tiring, for sure, because it&#8217;s work - we can face this by learning to take proper breaks, for example.</p><blockquote><p><em>With great powers, comes great responsibility.</em></p></blockquote><p>Be responsible when deciding to go sync or async.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>You know, it&#8217;s weird because for some reason we think that the approach that works great for Open Source can work also in a product/project context - but they are very different!</p><p>In Open Source, the maintainer(s) of the library receives contributions from individuals all over the world; they never know who and when someone might send a contribution, and they don&#8217;t share any objective together with them. In this context, async PR is the only way to work, allowing for different time zones and a safe way to check that the contribution is correct.</p><p>When we work in a product/project we should be working in a team.</p><p>Here are some definitions of a <strong>team</strong>:</p><ul><li><p><em>a number of people who <strong>do something together</strong> as a group</em></p></li><li><p><em><strong>people</strong> <strong>working together</strong> as a group in order to achieve something</em></p></li><li><p><em>a group of people <strong>who support a particular person or point of view</strong></em></p></li></ul><p>As you can see, a team works together and has shared objectives: while objectives might be clear and shared in an async context, working together is totally removed, taking inspiration from Open Source - total nonsense, in my opinion. </p><p>In a company context, whether it&#8217;s a product or project team, we should favor other things:</p><ul><li><p>product/project success</p></li><li><p>company profit and safety</p></li><li><p>software quality to ensure profitability grows over time</p></li><li><p>faster feedback loop and smaller releases to favor gathering feedback from customers</p></li></ul><p>With this in mind, I want to state something very strong: I think that flexibility is a great benefit, but we should never take advantage of it before considering the impact on the company. Total flexibility given from a full async can be good from some point of view, but we are not doing the best for the company: at best, we are still making money but we could be making more, but we must <strong>at least</strong> be aware of the trade-off we are taking. </p><p>What I want to say is that sometimes I feel that people only want flexibility without considering the impact of it. It&#8217;s like freedom of speech: of course, everyone has the right to say what he wants, but this is not just a right, it&#8217;s also a responsibility. </p><p>If you offend someone, you must be aware that you are responsible for that. If you talk about a topic you know nothing about, you must be aware of it. And so on.</p><p>The same is true with flexibility: if you are allowed to work from home, you should consider the impact of it: it&#8217;s not &#8220;the same:&#8221;, it&#8217;s different - let&#8217;s be honest on this, especially because most of the time is better.</p><p>What I would do, then? Well, following the principles listed above, here is how I would set up my remote organization:</p><ol><li><p>6 hours of expected sync work - there are a couple of solutions that I would be testing: one could be a single time frame between 10 am and 17 am, including lunch; a different approach could be to split it into two time frames, for example, 9:30-12:30 am and 14:30-17:30 pm; both have pros and cons about lunchtime and starting time, I would probably discuss this with the team</p></li><li><p>Daily standup at the beginning of the sync work - a proper standup is really useful for a collaborating team: it is not a moment of update, it is the moment when we organize the starting day; set up pairing or mobbing session when required, highlight any blocker or issue where some help might be needed, etc.</p></li><li><p>Waiting time rules of thumbs - I would suggest a list of possible activities to be done when someone needs to wait for sync time; this comes from the fact that I would suggest working in single-piece flow, meaning doing one thing at a time, also meaning that if a waiting time is required, you shouldn&#8217;t start a new task; some things that are valuable can be: looking for open PR and check if an async review is enough or not, have a look at future tasks to be refined to be ready for it, or even study something (which is always a great investment)</p></li><li><p>Email communication avoided (unless required, for example when talking to someone external) and Slack/Discord chat as a default communication tool: Slack or Discord are great for building a digital office setup, but I would still keep and cultivate a culture of non-urgent communication by default: response are not expected in a bunch of minutes, even if it&#8217;s a chat - in the past, for example, we had a &#8220;Pomodoro&#8221; rule: wait at least one Pomodoro (25 minutes) before pushing for a reply</p></li><li><p>Continuous Integration is a must: while I love Pair/Mob, I know that not all developers love that - so, while I would suggest them as a daily practice for sure, I would leave the final choice to the team; my guidelines, anyway, would only accept practices that enables CI: no feature branches, and in general no branches longer than a day; fully automated test suite; etc.</p></li></ol><p>Of course, all of those points would be discussed with the team, and the final setup and balance would be found with them because I truly believe in giving responsibility and trust. But still, these are my main ideas.</p><p>What do you think? What would you do instead? Feel free to let me know! :) </p><div class="pullquote"><p>Moving from async code reviews to pairing on code review, to doing work itself together (Pair/Mob Programming) is a progression that lots of teams in our industry might benefit from experimenting with.</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3RQjg4y">Remote Team Interactions Workbook: Using Team Topologies Patterns for Remote Working</a></strong> - In this workbook, the authors of the widely successful Team Topologies provide a road map for organizing effective and happy team-first remote workplaces.</p></li><li><p><strong><a href="https://amzn.to/3F6dbJG">Sync Async: Making progress easier in the changing world of work</a></strong> - A growing number of teams and businesses are learning and experiencing the value of deliberately working in sync / async ways.&nbsp;You can start working better in both sync and async ways from today.&nbsp;</p></li><li><p><strong><a href="https://amzn.to/46DwBRT">From Chaos to Successful Distributed Agile Teams: Collaborate to Deliver</a> </strong>- Distributed agile teams have a terrible reputation. They don&#8217;t deliver &#8220;on time,&#8221; and too often, they don&#8217;t deliver what the customer needs. However, most agile teams, have at least one remote team member. And, agile approaches are here to stay. Don&#8217;t blindly apply agile practices designed for collocated teams. Instead, learn to use three mindset shifts and the agile and lean principles to create your successful distributed agile team. Use the tips and traps to help your team succeed.</p></li></ul><h3>&#128233; Newsletters</h3><ul><li><p><strong><a href="https://www.remote-work.io/newsletter/">Remote Work Pulse</a></strong> [A remote work newsletter by Sergio Pereira - I don&#8217;t always agree with him, but he is very experienced]</p></li><li><p><strong><a href="https://indiaremotejobs.substack.com/">Remote Work Newsletter</a></strong> by <a href="https://substack.com/@indiaremotejobs">harkirat</a></p></li><li><p><strong><a href="https://beremote.substack.com/">Work From Anywhere</a> </strong>newsletter by <a href="https://substack.com/@beremote">Mike Holp</a></p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://www.infoq.com/articles/co-creation-patterns-software-development/">From Async Code Reviews to Co-Creation Patterns</a></strong></p></li><li><p><strong><a href="https://joinhorizons.com/asynchronous-work/">What Is Asynchronous Work? (Async Working Model)</a></strong></p></li><li><p><strong><a href="https://www.remote-work.io/sync-vs-async-communication-in-remote-work/">Sync vs Async Communication in Remote Work</a></strong></p></li><li><p><strong><a href="https://www.loom.com/blog/synchronous-vs-asynchronous">When to Choose Synchronous Vs. Asynchronous Communication</a></strong></p></li></ul><h3>&#127897;&#65039; Podcasts</h3><ul><li><p><strong><a href="https://37signals.com/podcast/">The ReWork Podcast</a></strong></p></li><li><p><strong><a href="https://distributed.blog/podcast/">Distributed</a></strong></p></li><li><p><strong><a href="https://podcasts.apple.com/gb/podcast/managing-remote-teams/id1525685462">Managing Remote Teams</a></strong></p></li></ul>]]></content:encoded></item><item><title><![CDATA[🌪️ What most people don't consider when discussing micro-services: DDD and Stream-aligned teams matter! 🤝]]></title><description><![CDATA[&#9881;&#65039; The very famous debate around micro-services is most often discussed from a technical point of view; instead, we should first consider Bounded Context and our teams' organization structure.&#128161;]]></description><link>https://learnagilepractices.substack.com/p/what-most-people-dont-consider-when</link><guid isPermaLink="false">https://learnagilepractices.substack.com/p/what-most-people-dont-consider-when</guid><dc:creator><![CDATA[Dan the dev]]></dc:creator><pubDate>Tue, 03 Oct 2023 05:00:09 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!jnLS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>&#128196; &#128226; Newsletter Update Time &#128226;</h1><h3>&#127881; Milestones Reached &#127881;</h3><p>&#127881; Hey, developers! As every week, we keep growing due to 4 new subscribers that joined LAP &#127379; - let&#8217;s welcome them among us while hitting 44 subscribers! &#128588; Thank you all so much for your support!</p><p>&#128204; In case you missed it: last week, I entered you into the world of Domain-Driven Design, a very complex methodology, especially highlighting the strategic approach that is very powerful to add to your problem-solving skills! If you haven't already, make sure to take a read at it here and let me know what you think! &#128170;</p><h3>&#128293; Premium updates &#128293;</h3><p>&#128293; Personal coaching services seats available: one-on-one guidance from me, Dan the dev, an experienced Agile developer who will help you develop the skills and knowledge you need to succeed in 12 1-hour sessions.</p><p>Take advantage of our 2-lessons Money Guarantee policy: enjoy the first two out of twelve sessions and if you are not happy with them, I will refund the entire amount. Discover more &#128073; <a href="https://learnagilepractices.gumroad.com/l/personal-coaching">here</a>.</p><p><strong>Thanks again for being a part of our journey! &#128591;</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://learnagilepractices.gumroad.com/&quot;,&quot;text&quot;:&quot;Discover our products and services&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://learnagilepractices.gumroad.com/"><span>Discover our products and services</span></a></p><h6><em>&#128227; Just a friendly reminder, folks! In our welcome email, you received a sweet discount that's valid for any of my products and services. Don't forget to take advantage of it - it doesn&#8217;t expire! &#128521;</em></h6><h1>&#127786;&#65039; What most people don't consider when discussing micro-services: DDD and Stream-aligned teams matter! &#129309;</h1><h3>&#9193; Introduction</h3><p>At some point in the last decade, microservices have been considered game-changers in software architecture, and have taken the tech world by storm. Organizations worldwide transitioned from monolithic architectures to microservices, seeking benefits like improved scalability, agility, and maintainability. The allure of microservices lies in their promise to deliver independently deployable and highly specialized components, allowing teams to develop, deploy, and scale services with unprecedented flexibility.</p><p>But then, at some point, the realization that microservices also come with their own set of negative sides also spread out - and people recently started a new trend by suggesting to avoid microservices completely, or at least wait for when it actually makes sense. </p><p>The discussion about &#8220;when it makes sense&#8221; became finally important - which is great because every time we make a decision like that in software development, there is always a tradeoff somewhere - and discussing tradeoffs is the right thing to do because the most important thing is to pick conscious tradeoffs - not accidental ones.</p><p>So, let&#8217;s deep dive into the issue to understand why it&#8217;s important to take those aspects into consideration - before even discussing if and when splitting some services into microservices makes sense or not.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jnLS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jnLS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jnLS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jnLS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jnLS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jnLS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg" width="390" height="390" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1024,&quot;width&quot;:1024,&quot;resizeWidth&quot;:390,&quot;bytes&quot;:156612,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jnLS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 424w, https://substackcdn.com/image/fetch/$s_!jnLS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 848w, https://substackcdn.com/image/fetch/$s_!jnLS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!jnLS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fded2dba9-13c5-4f7a-9177-818359950ed1_1024x1024.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A micro-services architecture infographic for a software development book cover.</figcaption></figure></div><h3>&#129513; Know your business subdomains</h3><p>Microservices are not just about creating smaller codebases. They are about creating independent, self-contained services that align seamlessly with your business's needs. Imagine your software system as a vast landscape, and microservices as the distinct territories within that landscape. Each territory (microservice) has its own rules, culture, and language.</p><p>What DDD suggests is that we can identify different territories in our company landscape - for example, in an e-commerce business we might identify Shop, Storage, and Shipping territories - and then each of those territories lives on its own, designing its own Product model containing only the subset of data they actually need. </p><p>Basically, we split the complexity of a very big and complex business into 3 different smaller businesses, the subdomains, dedicating their own specific smaller systems to each of them; the biggest advantage of this is that we can evolve what Storage needs without worrying about what Shipping needs, as soon as we support a standard communication way between the two territories.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JRXX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JRXX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 424w, https://substackcdn.com/image/fetch/$s_!JRXX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 848w, https://substackcdn.com/image/fetch/$s_!JRXX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 1272w, https://substackcdn.com/image/fetch/$s_!JRXX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JRXX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png" width="450" height="461.11764705882354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/054a3020-d592-400c-9000-c10a9439ed01_850x871.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:871,&quot;width&quot;:850,&quot;resizeWidth&quot;:450,&quot;bytes&quot;:144214,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JRXX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 424w, https://substackcdn.com/image/fetch/$s_!JRXX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 848w, https://substackcdn.com/image/fetch/$s_!JRXX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 1272w, https://substackcdn.com/image/fetch/$s_!JRXX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F054a3020-d592-400c-9000-c10a9439ed01_850x871.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A simple visual representation of the big Product table splitter into 3 services with different responsibilities.</figcaption></figure></div><p>If you are confident enough with the DDD Strategic approach, you probably noticed that this parallelism can be repeated for the organization subdomains: the entire company business is the landscape, and subdomains are the distinct territories within it.</p><p>The Shop, Storage, and Shipping I identified in the example - which is simplified but still meaningful - are nothing different than an implementation of 3 different bounded contexts.</p><p>Do you see the connection, now?</p><h3>&#128104;&#8205;&#128105;&#8205;&#128102;&#8205;&#128102; Structure your teams accordingly</h3><p>Thanks to subdomains, we now have a clear idea of which territories make sense to split our landscape - and if we follow subdomains, you can be sure that the isolation of those concepts will be a simplification compared to the hypothesis of keeping them all together.</p><p><strong>But that is not enough: team structure is also important!</strong></p><p>Imagine a group of explorers navigating through the territories of your landscape (microservices). Each explorer has a unique skill set and purpose. The success of your expedition depends on how well these explorers are organized and work together. </p><p>We absolutely want the explorers to be autonomous and not depend on anything else to achieve their goals so that they can get out of any issue without problems. </p><p>Imagine they are attacked by some animals and they need to fight to defend themselves - if they need to hide and wait for help, it will be a lot riskier and expensive to save them, while if they are able to at least fight for defend himself and run away, they can at least run away safely and then think to the next move.</p><p>In software development, we want stream-aligned teams (as suggested by Team Topologies): cross-functional teams focus on a single, impactful stream of work. It can be an entire product or service (the territory), or a single set of features/user journey/user persona (a portion of that territory). The team is empowered to build and deliver customer or user value as quickly, safely, and independently as possible, without requiring hand-offs to other teams to perform parts of the work - like analysis, release, monitoring, etc: the team covers all of them by itself.</p><h3>&#128104;&#8205;&#128105;&#8205;&#128102;&#8205;&#128102; Put subdomains and stream-aligned teams together</h3><p>Okay, so now we know the territories we have in our landscape, and we know that we want to have stream-aligned teams. What&#8217;s next?</p><p><em>It depends!</em></p><p>The smallest stream-aligned team I can think of in a standard software development context is made of 4 people:</p><ul><li><p>Product Manager</p></li><li><p>UX Designer</p></li><li><p>Backend Developer</p></li><li><p>Frontend Developer</p></li></ul><p>Let&#8217;s describe the ideal situation with a simple example. </p><p>Let&#8217;s say we have 2 territories in our landscape: on the team structure level, we will set up Team A, responsible for Territory 1, and Team B which will be responsible for Territory 2. On a microservices implementation level, we want to have at least 2 different microservices: Service 1 (for Territory 1) and Service 2 (for Territory 2), that will communicate with each other in an asynchronous way, without any dependency (Service 1 can work even if Service 2 is down, and vice-versa).</p><p>This microservices structure is not merely a technical decision, because it is widely impacted by our domain and subdomains - and we want to build a team structure that follows that subdomains. </p><p>Do you know why? Because <strong>Conway&#8217;s law</strong> exists!</p><blockquote><p>Any organization that designs a system (defined broadly) will produce a design whose structure is a copy of the organization's communication structure.<br><em>Melvin E. Conway</em></p></blockquote><p>On the contrary, when it comes to a specific subdomain, the decision to use microservices to split it into even smaller pieces it&#8217;s mostly technical and can be discussed by the team itself. For example, if Team A thinks that it&#8217;s worth isolating a piece of Service 1 for some reason, it&#8217;s totally up to them and should be invisible on the outside of that subdomain: autonomous teams, remember?</p><p>In conclusion, you need to know your domain and subdomain first, then consider your team and organize it according to the subdomains and the number of people in it - finally, you will prefer microservices at a subdomain level, to achieve independence for the team, and let each team decide whether an even smaller split is needed within their subdomain, for technical reasons.</p><p><em><strong>Until next time, happy coding! </strong></em><strong>&#129299;&#128105;&#8205;&#128187;&#128104;&#8205;&#128187;</strong></p><h1>Dan&#8217;s take &#128587;&#127995;&#8205;&#9794;&#65039;</h1><p>Every time I come into a microservices discussion, I feel like some topics are missing or very underestimated: of course, when thinking about microservices, is fine to think of possible cons like HTTP requests due to network, data consistency, or global testing, etc. But before getting to those technical decisions, we need to face organizational and team structural problems, related to the Domain-Driven Design Strategic approach, and Team Topologies concepts like Stream-Aligned teams.</p><p>In the past, we were used to building a single software system to serve the entire company's needs: typically, this big monolith becomes a mess, with tables that contain a gigantic number of columns because &#8220;hey, in the Product model we need all the info to be able to show and sell the product, add it to a cart, but also all the pieces of information about storage, shipping, etc&#8221;. </p><p>Moving on with our explorer parallelism, in the old days we tried to explore the entire landscape by organizing our people by skills: we could have an Explorers team, Technician team, and Farmers team, for example. Each team organizes its work by itself, and when one needs something from another, send a request and wait for the response when possible.</p><p>With stream-aligned teams, instead, we create a single team with all the skills: if we try to do this for the entire landscape, we come up with a very big team containing all the Explorers, Technician and Farmers we have - the problem with that is that is just too much people, and due to how communication works we would be too slow - that&#8217;s why we add DDD subdomains to the equation and split people into multiple cross-functional teams, at least one for each territory (subdomain) we identify.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iXyI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iXyI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 424w, https://substackcdn.com/image/fetch/$s_!iXyI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 848w, https://substackcdn.com/image/fetch/$s_!iXyI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 1272w, https://substackcdn.com/image/fetch/$s_!iXyI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iXyI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png" width="410" height="427.43620899149454" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:858,&quot;width&quot;:823,&quot;resizeWidth&quot;:410,&quot;bytes&quot;:277515,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!iXyI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 424w, https://substackcdn.com/image/fetch/$s_!iXyI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 848w, https://substackcdn.com/image/fetch/$s_!iXyI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 1272w, https://substackcdn.com/image/fetch/$s_!iXyI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c26a16b-303d-486f-b485-f12c0076ab11_823x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>I know some of you might think that not the situations are the same - typically, we can think of the explorer mission in two different ways in software development (mainly):</p><ol><li><p>If we are a consultancy company, we probably work by the project: this means our explorers will have an exploration that has a target (a scope and a time frame, typically) - we need to take the best outcomes for that scope in that time frame for our customers, like if someone pays us to send our explorers to get some food in the forest</p></li><li><p>If we work in a product company, it&#8217;s like the explorers are in a neverending exploration of the territory we assigned them, and they keep exploring it to get the most (money) out of it in all the different ways we can find according to our skills (business models)</p></li></ol><p>While consultancy contexts are typically harder, especially from the scope and time point of view, it would still be a good idea to set up the organization by stream-aligned team - it could be one team for the project, for example. The fact that a project typically has an end date has no impact on this.</p><p>To conclude my thoughts, there are a couple of typical patterns that I want to highlight from the ideal situation described above:</p><p><strong>What if we do have not enough people to build multiple teams?</strong></p><p>Then you already have a decision about microservices at a subdomain level: keep everything together. Build modular monolith microservices, where every subdomain is easily identifiable, so that code is more maintainable even if all together and it&#8217;s ready to be spliced out whenever the time comes. Every microservices split here is mostly technical because splitting in microservices for each subdomain would be a useless overhead for a single team.</p><p><strong>What if we discover that Territory 1 could contain another subdomain?</strong></p><p>This probably means you discovered a new possible income stream for the company, which is great! While things are still small, nothing needs to change: Team A can work on both. Once the two streams are big enough, and the workload is too big for a single team, you can add a second team to that Territory: at first, you might want to make both teams work on the entire Territory on both streams (two teams sharing the backlog), then, once the second stream is big enough to be on its own, you can even think to split it into two different territories to ensure their independency. </p><div class="pullquote"><p>When cognitive load isn&#8217;t considered, teams are spread thin trying to cover an excessive amount of responsibilities and domains. Such a team lacks the bandwidth to pursue mastery of their trade and struggles with the costs of switching contexts.</p><p>[Matthew Skelton, Team Topologies]</p></div><h1>Go Deeper &#128270;</h1><h3>&#128218; Books</h3><ul><li><p><strong><a href="https://amzn.to/3LDaSS4">Domain-Driven Design and Microservices</a></strong> - Domain-Driven Design (DDD) concept was introduced by first Eric Evans in 2003. The concept of microservices did not exist at that time. So basically DDD was introduced to solve the problem of a large monolithic code base. This book explores the two topics together.</p></li><li><p><strong><a href="https://amzn.to/45a0kkm">Implementing Domain-Driven Design</a></strong> - Implementing Domain-Driven Design presents a top-down approach to understanding domain-driven design (DDD) in a way that fluently connects strategic patterns to fundamental tactical programming tools. Vaughn Vernon couples guided approaches to implementation with modern architectures, highlighting the importance and value of focusing on the business domain while balancing technical considerations.</p></li><li><p><strong><a href="https://amzn.to/3rwx8pX">Team Topologies</a></strong> - In Team Topologies IT consultants Matthew Skelton and Manuel Pais share secrets of successful team patterns and interactions for IT through four fundamental team topologies and three interaction modes.</p></li></ul><h3>&#128233; Newsletter issues</h3><ul><li><p><strong><a href="https://craftingtechteams.substack.com/p/tune-in-for-the-20-years-of-ddd-stream?utm_source=profile&amp;utm_medium=reader2">Tune in for the 20 years of DDD Stream</a></strong> [<a href="https://craftingtechteams.substack.com/">Crafting Tech Teams</a> by <a href="https://substack.com/@craftingtechteams">Denis &#268;ahuk</a>]</p></li><li><p><strong><a href="https://ravisystemdesign.substack.com/p/principles-of-the-microservice-architecture">Principles Of The Microservice Architecture</a></strong> [<a href="https://ravisystemdesign.substack.com/">Ravi's System Design Newsletter</a> by <a href="https://substack.com/@ravisystemdesign">Ravi Tandon</a>]</p></li><li><p><strong><a href="https://codinginterviewsmadesimple.substack.com/p/amazon-prime-video-reduced-costs?utm_medium=reader2">Amazon Prime Video reduced costs by 90% by ditching Microservices</a></strong> [<a href="https://codinginterviewsmadesimple.substack.com/">Technology Made Simple</a> by <a href="https://substack.com/@devanshtechmadesimple">Devansh</a>]</p></li></ul><h3>&#128196; Blog posts</h3><ul><li><p><strong><a href="https://javascript.plainenglish.io/domain-driven-design-for-a-modular-monolith-bridging-the-gap-between-microservices-and-monoliths-2d2521196dd8">Domain-Driven Design for a Modular Monolith: Bridging the Gap Between Microservices and Monoliths</a></strong></p></li><li><p><strong><a href="https://dev.to/bendix/applying-domain-driven-design-principles-to-a-nest-js-project-5f7b">Applying Domain-Driven Design principles to a Nest.js project</a></strong></p></li><li><p><strong><a href="https://medium.com/it-dead-inside/domain-driven-design-in-the-era-of-icroservices-de2be01821ed">Domain-Driven Design in the Era of Microservices</a></strong></p></li><li><p><strong><a href="https://blog.bitsrc.io/developing-a-ddd-oriented-microservices-1b65bd45e2a8">Developing a DDD-Oriented Microservices</a></strong></p></li><li><p><strong><a href="https://semaphoreci.com/blog/domain-driven-design-microservices">Domain-Driven Design Principles for Microservices</a></strong></p></li></ul><h3>&#127897;&#65039; Podcast episodes</h3><ul><li><p><strong><a href="https://corecursive.com/018-micro-services-and-domain-driven-design-with-vaughn-vernon/">Domain-Driven Design and Micro Services</a></strong></p></li><li><p><strong><a href="https://www.youtube.com/watch?v=sFCgXH7DwxM">DDD and Microservices: At Last, Some Boundaries!</a></strong></p></li><li><p><strong><a href="https://richardwbown.com/podcast-avoiding-legacy-ddd-collaborative-architecture-and-product-thinking-with-nico-krijnen/">Avoiding Legacy? DDD, Collaborative Architecture and Product Thinking with Nico Krijnen</a></strong></p></li></ul><h3>&#128104;&#127995;&#8205;&#127979; Online courses</h3><ul><li><p><strong><a href="https://www.udemy.com/course/domain-driven-design-and-microservices/?utm_source=adwords&amp;utm_medium=udemyads&amp;utm_campaign=LongTail_la.EN_cc.ROW&amp;utm_content=deal4584&amp;utm_term=_._ag_77879424134_._ad_535397245863_._kw__._de_c_._dm__._pl__._ti_dsa-1007766171312_._li_1008436_._pd__._&amp;matchtype=&amp;gclid=CjwKCAjw69moBhBgEiwAUFCx2BLvRWtrCA0A8Jxwofh1QtQXUodbHeKfYsKVBSjS2G1_F107dBtiHRoCrXAQAvD_BwE">Domain Driven Design &amp; Microservices for Architects</a> (Udemy)</strong></p></li><li><p><strong><a href="https://github.com/ddd-edm-online-course">DDD and Event-Driven Microservices Course</a></strong></p></li><li><p><strong><a href="https://www.oreilly.com/live-events/domain-driven-design-and-event-driven-microservices/0636920215868/0636920072244/">Domain-driven design and event-driven microservices</a></strong> <strong>(O&#8217;Reilly)</strong></p></li></ul>]]></content:encoded></item></channel></rss>