<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ agile - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Browse thousands of programming tutorials written by experts. Learn Web Development, Data Science, DevOps, Security, and get developer career advice. ]]>
        </description>
        <link>https://www.freecodecamp.org/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ agile - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 22:24:36 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/agile/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ How to Prioritize as a Product Manager – Product Prioritization Frameworks Explained ]]>
                </title>
                <description>
                    <![CDATA[ Prioritization in product management is hardly about what metric takes precedence over the other. Of all the roles a product manager plays, one of the most difficult is deciding what to work on next. Why? Because everything feels urgent. Engineers wa... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-prioritize-as-a-product-manager/</link>
                <guid isPermaLink="false">697bf73e79322b4a93ac0fb8</guid>
                
                    <category>
                        <![CDATA[ Product Management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ user experience ]]>
                    </category>
                
                    <category>
                        <![CDATA[ product development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Onyinyechi Nwaucha ]]>
                </dc:creator>
                <pubDate>Fri, 30 Jan 2026 00:11:42 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1769731875495/c2d3feca-a09e-454c-93de-bc00607ac517.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Prioritization in product management is hardly about what metric takes precedence over the other. Of all the roles a product manager plays, one of the most difficult is deciding what to work on next. Why? Because everything feels urgent. Engineers want to fix technical debt, users want improvements, stakeholders have more opinions than practical solutions, and so on. With that kind of pressure and without a proper framework, it is easy to focus on the wrong thing.</p>
<p>And this is where prioritization comes in. In this article, you'll learn how product managers prioritize work, what guides their decisions, and the frameworks they use to decide what does and does not get built.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a class="post-section-overview" href="#heading-why-prioritization-is-difficult">Why Prioritization is Difficult</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-what-do-product-managers-really-prioritize">What Do Product Managers Really Prioritize?</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-user-problems-and-not-feature-ideas">User Problems and Not Feature Ideas</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-business-outcomes-not-tasks">Business Outcomes, not Tasks</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-trade-offs-not-preferences">Trade-offs, not Preferences</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-what-inputs-drive-product-prioritization">What Inputs Drive Product Prioritization?</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-user-feedback-and-research">User Feedback and Research</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-product-metrics">Product Metrics</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-business-goals">Business Goals</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-technical-limits-and-demands">Technical Limits and Demands</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-prioritization-frameworks">Prioritization Frameworks</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-why-do-prioritization-frameworks-exist">Why Do Prioritization Frameworks Exist?</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-rice-scoring">RICE Scoring</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-kano-model">Kano Model</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-moscow-method">MoSCoW Method</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-ice-framework">ICE Framework</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-impact-vs-effort-matrix">Impact vs Effort Matrix</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-choose-the-right-framework">How to Choose the Right Framework</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-common-prioritization-mistakes">Common Prioritization Mistakes</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion">Conclusion</a></p>
</li>
</ul>
<h2 id="heading-why-prioritization-is-difficult">Why Prioritization is Difficult</h2>
<p>Prioritization can be difficult because product managers must almost always choose between multiple viable options. Between requests centered on optimization and bug fixing, increasing revenue, and reliability concerns from users, stakeholders, the design team, engineers, and sales departments, we can see how easy it is to build the wrong thing.</p>
<p>Each of the requests would be entirely legitimate when considered separately, but determining which is more crucial at any given moment can be challenging. Prioritization decisions are frequently made based on incomplete information, such as not knowing which features users will actually adopt, whether a request represents a real problem or just a loud minority, or whether it will significantly improve a metric. which, in contrast to engineering tasks, are simple: is the bug there or not? Does the code work or not?</p>
<p>The fact that the trade-offs are not immediately apparent is another factor making prioritization challenging. Other worthwhile projects are postponed or abandoned when a product manager gives priority to one. Although these lost chances don't immediately result in failures, their effects can mount up over time and affect long-term results, growth, and product quality.</p>
<h2 id="heading-what-do-product-managers-really-prioritize">What Do Product Managers Really Prioritize?</h2>
<p>A common misconception is that product managers only prioritize features. PMs don’t just choose between whether to ‘add dark mode’ or ‘add in-app messaging’, they also choose between reducing churn and improving retention. Therefore, what PMs are really prioritizing are:</p>
<h3 id="heading-user-problems-and-not-feature-ideas">User Problems and Not Feature Ideas</h3>
<p>At face value, user feedback consists of solutions and not problems, like:</p>
<ul>
<li><p>Add dark mode</p>
</li>
<li><p>I want to be able to edit a typo after posting on my story</p>
</li>
<li><p>Can you make it possible to export this as a PDF?</p>
</li>
</ul>
<p>A PM won’t just take these requests as they are but will ask why, how, and what.</p>
<ul>
<li><p>What pain point is the user experiencing?</p>
</li>
<li><p>How many users are experiencing this?</p>
</li>
<li><p>Why does the user want this?</p>
</li>
</ul>
<p>After asking these questions, the PM doesn’t just prioritize being adding the dark mode feature but rather, evaluates that users requested for that feature because, apart from personal preference, they struggle to use the product for long periods especially at night and that dark mode is one possible solution and there may be others</p>
<h3 id="heading-business-outcomes-not-tasks">Business Outcomes, not Tasks</h3>
<p>We can look at it this way: a task is something the team does and an outcome is the result the business wants. Some examples of tasks are:</p>
<ul>
<li><p>Fixing bugs</p>
</li>
<li><p>Redesigning the onboarding process</p>
</li>
<li><p>Adding dark mode</p>
</li>
</ul>
<p>Increasing activation rate is one example of an outcome. Product managers prioritize outcomes because they are measurable, connect work to business goals, and tasks alone do not guarantee impact. So, when deciding what to prioritize, a PM considers whether it will increase engagement, improve retention, or reduce churn.</p>
<h3 id="heading-trade-offs-not-preferences">Trade-offs, not Preferences</h3>
<p>This is where things get complicated because, as a product manager, you occasionally have to make trade-offs between things like speed and quality, features and time, resources and scope, quality and cost, technical debt and new features, and so forth.</p>
<p>What this means is that PMs don’t make preference-based decisions when they have to prioritize, but rather, their decisions are constraint-based. This implies that instead of saying, “I prefer this idea,” they are saying, “If we do this now, we can’t do that.”</p>
<h2 id="heading-what-inputs-drive-product-prioritization">What Inputs Drive Product Prioritization?</h2>
<p>Before anything is prioritized, PMs gather input from multiple sources like:</p>
<h3 id="heading-user-feedback-and-research"><strong>User Feedback and Research</strong></h3>
<p>These include interviews, usability tests, user reviews, social media comments, direct feature requests, quantitative data from product analytics, and metrics like Net Promoter Score (NPS) or customer satisfaction (CSAT) scores, which offer a human-centered approach that relies heavily on customer needs, behaviors, and pain points.</p>
<h3 id="heading-product-metrics"><strong>Product Metrics</strong></h3>
<p>Metrics like activation rate, churn, feature adoption, retention, session duration, Daily Active Users (DAU) and Monthly Active Users (MAU), session frequency, and so on, help PMs understand if and where the product is underperforming.</p>
<h3 id="heading-business-goals"><strong>Business Goals</strong></h3>
<p>Prioritization has to align with the company’s strategy and vision because every product exists to serve a business objective, and those objectives directly influence what a product manager prioritizes at any point in time. Business objectives have a big impact on product priorities. While a revenue-focused company might invest in monetization features, a growth-oriented company might prioritize onboarding and acquisition. Product managers frequently give core user experience enhancements and dependability top priority when retention is the aim. Because of these changing objectives, prioritization is dynamic and changes as the company does. So, it depends on whether the business is focused on growth, retention, cost optimization, or revenue.</p>
<h3 id="heading-technical-limits-and-demands"><strong>Technical Limits and Demands</strong></h3>
<p>Simply put, even if an idea is great, it may not be possible at the moment because, even if they sound simple, they may be quite complex to implement. For example, a product that supports offline mode. Also, many features depend on another being completed. Lastly, there is technical debt, which basically refers to shortcuts taken that make a system hard to change in the future. An example includes poor documentation or design. Technical debt, amongst other things, increases bugs and slows down development.</p>
<h2 id="heading-prioritization-frameworks">Prioritization Frameworks</h2>
<p>Prioritization frameworks are structured approaches that product managers use to make explainable and rational decisions. They are decision aids that help PMs compare options. Prioritization frameworks eliminate guesswork from decision-making in product management, thereby helping the product manager make informed guesses instead of instinctive ones.</p>
<p>Let us have a look at some of these frameworks, why they exist, why and when to use them.</p>
<h2 id="heading-why-do-prioritization-frameworks-exist">Why Do Prioritization Frameworks Exist?</h2>
<p>Prioritization frameworks are like aids, not formulas that help a product manager make defensible choices. These frameworks exist to enable PMs make informed decisions, and they do that by asking ‘who?’ and ‘how?’.</p>
<ul>
<li><p>Who does this help?</p>
</li>
<li><p>How does it help?</p>
</li>
<li><p>How is it going to be built?</p>
</li>
<li><p>How does it benefit/align with the company vision?</p>
</li>
</ul>
<p>So no, frameworks do not replace judgement, they only support it. Therefore, instead of making decisions based on whether they think something will be a good idea, PMs they ask the hows and the whats. Some prioritization frameworks in product management include:</p>
<h3 id="heading-rice-scoring">RICE Scoring</h3>
<p>Developed by Sean McBride at Intercom, RICE stands for the four elements—reach, impact, confidence, and effort—that are taken into consideration when developing a product idea. This framework provides an answer to the question of how much value will be produced relative to the effort by comparing each element.</p>
<ul>
<li><p><strong>Reach:</strong> Measures how many users will be affected by the product in a given time period. It is about scale and must always include a timeframe, otherwise the numbers become useless. For example, 5000 users monthly or 35% of weekly active users.</p>
<p>  A small improvement for many users can outweigh a large improvement for very few users. This is evident when comparing the reach of two features, like Feature A, which affects 20,000 users monthly, and Feature B, which affects 500 users monthly. It is evident that even though the improvement is small, its reach surpasses that of the big improvement, therefore making it more significant.</p>
</li>
<li><p><strong>Impact:</strong> Measures how those customers will be affected by the product. Unlike reach which is about scale, impact is about depth or value. <a target="_blank" href="https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/#:~:text=estimate%20the%20impact%20on%20an%20individual%20person.%20For%20my%20team%2C%20it%E2%80%99s%20%E2%80%9Chow%20much%20will%20this%20project%20increase%20conversion%20rate%20when%20a%20customer%20encounters%20it%3F%E2%80%9D.%20Your%20team%20might%20replace%20this%20with%20another%20goal%2C%20such%20as%20%E2%80%9Cincrease%20adoption%E2%80%9D%2C%20or%20%E2%80%9Cmaximize%20delight%E2%80%9D.">Sean McBride</a> suggests estimating the impact on an individual person. Like, “How much will this project increase the conversion rate when a customer encounters it?” And points out that this can be replaced with other goals, such as “increase adoption” or “maximize delight”. Seeing as impact can be difficult to measure, a scale of 0.25 to 3 is used, where 0.25 is minimal, 0.5 is low, 1 is medium, 2 is high and 3 is massive impact.</p>
</li>
<li><p><strong>Confidence:</strong> This measures the level of confidence in executing ideas and is gotten from sources like user feedback and A/B testing and uses a 100% scale, where 50% is ‘low confidence’, 80% is ‘medium confidence’ and 100% is ‘high confidence’. This accounts for uncertainty and risk, and it helps to answer the question, “How sure are we about this idea?” and prevents speculative ideas from ranking too highly.</p>
</li>
<li><p><strong>Effort:</strong> Refers to the time it will take the team to execute an idea. Effort is like the investment, and the other elements, reach, confidence and impact, are potential benefits. Effort is usually measured in person-months or person-weeks and puts things like engineering time and design work into consideration. This is the most important element in this framework because two ideas with similar value may differ greatly in effort, and a lower effort increases the RICE score.</p>
</li>
</ul>
<p>The RICE formula is:</p>
<p>RICE Score = (<strong>R</strong>each × <strong>I</strong>mpact × <strong>C</strong>onfidence) ÷ <strong>E</strong>ffort</p>
<p>While the RICE scoring method of prioritization is excellent for data-driven teams, it can be too long and difficult to understand.</p>
<h3 id="heading-kano-model"><strong>Kano Model</strong></h3>
<p>This categorizes features based on customer needs and how they affect user satisfaction and was developed by Noraki Kano in 1984. It has three parts, namely:</p>
<ul>
<li><p>Basic needs: Features that customers expect your product to have, like core reliability and login functionality. Sometimes, users don’t notice them when they exist but when they don’t exist, it leads to dissatisfaction.</p>
</li>
<li><p>Performance needs: Features where better performance increases satisfaction. This means that this features scale satisfaction linearly, that is the better they perform, the happier users are. An example is faster load time.</p>
</li>
<li><p>Delighters: Unexpected features that create excitement. These are unexpected features that make users feel heard and happy like TikTok allowing users post images in comment sections.</p>
</li>
</ul>
<p>One of the cons of the kano model is that delighters eventually become basic expectations.</p>
<h3 id="heading-moscow-method"><strong>MoSCoW Method</strong></h3>
<p>This framework was developed by Dai Clegg while working at Oracle in 1994 and it categorizes work into:</p>
<ul>
<li><p>Must have: Essential for the release and can either make, or mar the product.</p>
</li>
<li><p>Should have: Important but not critical. That is, the success of the product is not dependent on it.</p>
</li>
<li><p>Could have: Nice to have but not important.</p>
</li>
<li><p>Won’t have: These are not relevant to the product.</p>
</li>
</ul>
<p>This framework is very easy to use and understand, and that is one of its biggest advantages and it is particularly useful for release planning, MVP definition, and scope control. But the disadvantage is that without proper categorization, every feature can start to look like a must have and categorizing features as a ‘won’t have’ can also prove difficult.</p>
<h3 id="heading-ice-framework"><strong>ICE Framework</strong></h3>
<p>The ICE framework is a lighter-weight alternative to RICE, commonly used when data is limited or speed matters more than precision.</p>
<p>ICE evaluates initiatives based on:</p>
<ul>
<li><p><strong>Impact:</strong> How strongly the initiative is expected to move a key metric.</p>
</li>
<li><p><strong>Confidence:</strong> How certain the team is about the expected impact.</p>
</li>
<li><p><strong>Ease:</strong> How easy the initiative is to implement relative to others.</p>
</li>
</ul>
<p>Each dimension is typically scored from 1–10 with the total average being the ICE score.</p>
<p>ICE works well when:</p>
<ul>
<li><p>Products are early-stage</p>
</li>
<li><p>Teams need quick prioritization</p>
</li>
<li><p>Detailed effort estimates are unavailable</p>
</li>
</ul>
<p>A disadvantage of this framework is that it sacrifices accuracy for speed and it can give biased results.</p>
<h3 id="heading-impact-vs-effort-matrix"><strong>Impact vs Effort Matrix</strong></h3>
<p>This is also known as the <strong>value vs effect</strong> or <strong>value vs effort matrix</strong> and is one of the best suited for visual team discussions and quick alignment with stakeholders.</p>
<p>Initiatives are plotted on a 2×2 grid that is based on the value it will yield (impact) and what it will take to achieve it (effort):</p>
<ul>
<li>High impact/Low effort → They are top priority and also known as big wins.</li>
</ul>
<ul>
<li><p>High impact/High effort → The features that fall into this quadrant are high yielding features but must be planned carefully, hence, the high effort.</p>
</li>
<li><p>Low impact/Low effort → Features that fall here are known as fill-ins. They are optional or nice to have. They require low effort and yield low impact and should only be worked on when high priority tasks are complete.</p>
</li>
<li><p>Low impact/High effort → Low impact and high value? Nobody wants their team to waste time on such features so they should be avoided at all costs.</p>
</li>
</ul>
<p>The elements that make up this framework are much like that of MoSCoW which contributes to its simplicity. It is also intuitive and can serve as a more flexible and visual substitute for RICE. A disadvantage is that it can be subjective and both impact and effort are estimates.</p>
<p>Other frameworks include:</p>
<ul>
<li><p><strong>Weighted Scoring Model</strong>: Prioritizes ideas by scoring them across multiple criteria, such as user impact, strategic alignment, effort, risk, and key metrics, with each criterion weighted according to its importance to the business.</p>
</li>
<li><p><strong>Opportunity Scoring</strong>: Identifies aspects of the product that are of importance to the users but are not being satisfied. The formula for opportunity scoring is: <strong>I</strong>mportance + <strong>(I</strong>mportance – <strong>S</strong>atisfaction<strong>)</strong> = <strong>O</strong>pportunity</p>
</li>
<li><p><strong>Desirability, Feasibility and Viability Framework</strong>: Evaluates ideas based on desirability, feasibility and viability. That is whether users want them, if the team can build them, and finally, if the business can sustain them.</p>
</li>
<li><p><strong>Cost of Delay</strong>: This measures the financial impact of postponing a task and is an excellent framework when dealing with time-sensitive products.</p>
</li>
<li><p><strong>Product Tree</strong>: Is a visual method that replaces the roots, trunk, branches and leaves with systems, current set of features (core functionality), features/enhancements, and new ideas respectively. This helps teams explore ideas and visualize growth in a structured way.</p>
</li>
</ul>
<h2 id="heading-how-to-choose-the-right-framework">How to Choose the Right Framework</h2>
<p>No prioritization framework works in every situation, so choosing the right one depends on the team’s goal at that point in time. Factors that affect how to choose the right framework include:</p>
<ul>
<li><p><strong>The product stage</strong> has significant impacts on framework selection. Early-stage products frequently lack accurate data, therefore a lightweight framework such as Desirability-Feasibility-Viability will be more effective for rapid learning. Growth-stage products often have enough users and analytics to provide structured comparisons, making RICE, Weighted Scoring, and Impact vs Effort more useful. Finally, mature goods prioritize optimization, revenue, and risk, where timing is critical. Frameworks such as the Cost of Delay help to assess added value and urgency.</p>
</li>
<li><p><strong>Data availability</strong> is also an important factor because frameworks presuppose varying degrees of confidence. Using data-driven frameworks without accurate data can result in false precision. When metrics and past performance are available, scoring frameworks become more useful. When they are not, simpler qualitative models are more reliable and honest.</p>
</li>
<li><p><strong>Stakeholder and team requirements</strong> also have to be considered because frameworks are useful for communication as well. They aid persuading stakeholders' decisions, collaboration between teams like design and research is facilitated by user-centered frameworks like the Kano model. Also, teams and stakeholders can rapidly align with frameworks such as the product tree.</p>
</li>
<li><p><strong>Adaptation over rigid use</strong> basically means that frameworks should be modified, instead of using them in a rigid manner. They should be used as guidelines for thinking not a direct path to certainty. That being said, frameworks are often adjusted, simplified, or combined to fit the product stage, available data, and team context.</p>
</li>
</ul>
<h2 id="heading-common-prioritization-mistakes">Common Prioritization Mistakes</h2>
<p>Prioritization can still go wrong even with excellent frameworks and data. Such mistakes are common, but they can have a big impact on long-term results, team trust, and product quality. Some of these mistakes include:</p>
<ul>
<li><p>Prioritizing the loudest speaker is a common mistake in product prioritization which happens more than you’d think. Some stakeholders or team members, for example, speak loudly and frequently that they unintentionally dominate the roadmap even when their ideas or requests don’t align with the user interests or company goals. It is necessary to distinguish between the person making the request and its actual value in order to prioritize tasks effectively.</p>
</li>
<li><p>Confusing urgency with importance is another very common mistake in prioritization because sometimes, everything looks like a must have, but not everything that looks urgent is important. Urgent tasks come with deadlines or short-term pressure—for example, an upcoming demo presentation—but important tasks yield long-term value like reducing technical debt.</p>
</li>
<li><p>Relying on instinct alone and not fact will most likely not get you the desired results as a product manager. If you make a decision just because it feels like a good idea, without validating it through research or grounding it in a prioritization framework, the effort required to fix the resulting mistakes can be significant, often costing more time, resources, and trust.</p>
</li>
</ul>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Finding the ideal framework or making error-free choices are not the goals of prioritization. It is about making conscious trade-offs with limited time, data, and resources—and being able to explain why those trade-offs were necessary. Prioritization frameworks are used as tools to eliminate bias, reveal assumptions, and encourage better decision-making in the face of uncertainty rather than as rigid rules.<br>Finally, because effective prioritization is a constant process, priorities must be revisited often, assumptions must be validated early, and decisions must be documented.</p>
<p>As products evolve, user needs change, and company goals shift, priorities must be examined and adjusted. Product managers who constantly prioritize clarity, proof, and intent are considerably more likely to create solutions that add genuine value for both users and businesses.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A Beginner Developer's Guide to Kanban ]]>
                </title>
                <description>
                    <![CDATA[ First, a confession: When I was learning to code, my “workflow” was a mess. Sticky notes. Google Docs. Random Trello boards I never checked again. And a to-do list that somehow never got any shorter. Then I joined a real team. Suddenly, I was introdu... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-beginner-developers-guide-to-kanban/</link>
                <guid isPermaLink="false">68815e6054ad71fa4b3b7bb6</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile methodology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Agile Software Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ interview ]]>
                    </category>
                
                    <category>
                        <![CDATA[ kanban ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Kanban boards ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Beginner Developers ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Developer ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aditya Vikram Kashyap ]]>
                </dc:creator>
                <pubDate>Wed, 23 Jul 2025 22:12:48 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753300952223/508231c9-f0bc-4aa8-9c97-5ad4157891b9.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>First, a confession<strong>:</strong> When I was learning to code, my “workflow” was a mess. Sticky notes. Google Docs. Random Trello boards I never checked again. And a to-do list that somehow never got any shorter.</p>
<p>Then I joined a real team.</p>
<p>Suddenly, I was introduced to this thing called <strong>Kanban</strong> – and I realized I’d been treating software like a solo art project, not a process.</p>
<p>If that sounds familiar, you’re in the right place.</p>
<p>This guide will walk you through <strong>how Kanban actually works</strong>, how developers use it to track and prioritize work, and how it can help you stay sane when juggling bugs, features, and real-world deadlines.</p>
<p>Without further delay, lets get into it.</p>
<h3 id="heading-heres-what-well-cover">Here’s what we’ll cover:</h3>
<ul>
<li><p><a class="post-section-overview" href="#heading-so-what-is-kanban">So… What Is Kanban?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-classic-kanban-board-three-simple-columns">The Classic Kanban Board: Three Simple Columns</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-developers-use-kanban-in-real-life">How Developers Use Kanban in Real Life</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-kanban-vs-scrum-whats-the-difference">Kanban vs Scrum: What’s the Difference?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-so-which-one-should-you-use-scrum-or-kanban">So which one should you use Scrum or Kanban?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-what-tools-do-teams-use-for-kanban">What Tools Do Teams Use for Kanban?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-use-kanban-to-manage-your-own-coding-projects">How to Use Kanban to Manage Your Own Coding Projects</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-final-thoughts-why-kanban-isnt-just-a-board">Final Thoughts: Why Kanban Isn’t Just a Board</a></p>
</li>
</ul>
<h2 id="heading-so-what-is-kanban">So… What Is Kanban?</h2>
<p>At its core, Kanban is a <strong>visual way to manage work</strong>. It helps teams (or team members) see:</p>
<ul>
<li><p>What needs to get done</p>
</li>
<li><p>What’s in progress</p>
</li>
<li><p>What’s finished</p>
</li>
<li><p>Where things are getting stuck</p>
</li>
</ul>
<p>The concept comes from lean manufacturing, but in tech, it’s often used in Agile teams that need flexibility without the structure of Scrum sprints.</p>
<p>Think of Kanban like a whiteboard that tells a story. Not just what’s done, but how work flows.</p>
<h2 id="heading-the-classic-kanban-board-three-simple-columns">The Classic Kanban Board: Three Simple Columns</h2>
<p>So what exactly is a Kanban board? At its core, it’s a visual representation of your workflow – a board that shows all the work your team (or you, solo warrior) are juggling, and where each task stands.</p>
<p>It can be physical, like an actual whiteboard with sticky notes that move from one column to the next. Or digital, using tools like Trello, Jira, GitHub Projects, or Notion. The key is that it’s visual and up-to-date. You can walk into a room or open a tab and instantly understand: What’s being worked on? What’s ready to go? Where are things stuck?</p>
<p>It’s like having your brain on a wall, but organized. And slightly less chaotic.</p>
<p>The beauty of Kanban is how dead simple it is to get started. At minimum, your board has three columns:</p>
<table><tbody><tr><td><p><strong>&nbsp;To Do</strong></p></td><td><p><strong>In Progress</strong></p></td><td><p><strong>Done</strong></p></td></tr></tbody></table>

<p>Each task – or <strong>card</strong> – moves from left to right as it gets worked on.</p>
<p>Let’s say your team is building a blog platform. Your Kanban board might have cards like:</p>
<ul>
<li><p>“Create signup form”</p>
</li>
<li><p>“Fix image upload bug”</p>
</li>
<li><p>“Deploy staging build”</p>
</li>
</ul>
<p>Now, while Kanban is flexible, it can absolutely be taken too far.</p>
<p>I’ve seen boards with more columns than a Greek temple: “Needs Review,” “Pending Client Feedback,” “QA Rework Round 2,” “Blocked but Still Hopeful,” “In Existential Limbo,” and so on. Every card had six tags, three owners, two checklists, and one migraine.</p>
<p>The lesson? Don’t turn your board into a bureaucratic jungle.</p>
<p>You don’t need to account for every edge case. Start simple: “To Do,” “In Progress,” “Review,” “Done.” These basic stages cover most workflows. If you discover a real need for something more – like a dedicated “QA” column or “Blocked” column – add it intentionally, not because you feel like your board needs to look fancy.</p>
<p>Remember: A Kanban board should be helpful, not overwhelming. If you spend more time managing the board than doing the work on it… it’s doing the opposite of what it’s meant to do.</p>
<h2 id="heading-how-developers-use-kanban-in-real-life">How Developers Use Kanban in Real Life</h2>
<p>Here’s how you might interact with a Kanban board on a dev team:</p>
<ol>
<li><p>You pick up a card from “To Do” – let’s say, “Add dark mode toggle.”</p>
</li>
<li><p>You move it to “In Progress.”</p>
</li>
<li><p>When it’s ready for review, you might move it to a temporary “Review” or “Testing” column.</p>
</li>
<li><p>Once it’s merged, tested, and deployed, you move it to “Done.”</p>
</li>
<li><p>You smile, drink some coffee, and grab the next card.</p>
</li>
</ol>
<p>That’s it. But over time, this process helps the whole team:</p>
<ul>
<li><p>Spot bottlenecks</p>
</li>
<li><p>Prevent duplicate work</p>
</li>
<li><p>Reduce context switching</p>
</li>
<li><p>Keep everyone aligned</p>
</li>
</ul>
<h3 id="heading-whats-a-wip-limit-and-why-should-you-care">What’s a WIP Limit — And Why Should You Care?</h3>
<p>WIP = <strong>Work In Progress</strong>. This is the most important concept to keep us in check.</p>
<p>One of Kanban’s key principles is <strong>limiting how many things you’re working on at once</strong>. Because guess what? Multitasking kills momentum.</p>
<p>A typical WIP limit might look like:</p>
<ul>
<li><p>No more than 2–3 cards per person in “In Progress” Again this is best practice, but folks do pick up a lot and then they end up being the bottleneck.</p>
</li>
<li><p>No more than 5 tasks waiting on QA.</p>
</li>
</ul>
<p>Why? Because when everything’s urgent, nothing gets done. WIP limits force you to finish one thing before you start more – and that’s how real velocity happens.</p>
<p>If there are more than 5 tasks in the “To Do” column, the team doesn’t take up new ones. Instead, everyone chips in to see how they can help unclog the bottleneck. A bottleneck is your worst enemy in Kanban, and you want to resolve it so items move smoothly on time and on target.</p>
<p><a target="_blank" href="https://youtu.be/R8dYLbJiTUE?si=Hh00XXI4_1urv4Mp">Here’s a video</a> recapping key concepts.</p>
<h2 id="heading-kanban-vs-scrum-whats-the-difference"><strong>Kanban vs Scrum: What’s the Difference?</strong></h2>
<p>You’ve probably heard Scrum and Kanban mentioned in the same breath – and both are popular Agile frameworks. But they’re not interchangeable.</p>
<p>Scrum is structured, with roles like Product Owner and Scrum Master, and work gets organized into time-boxed sprints. It’s perfect for teams that benefit from rhythm and rituals – like sprint planning, daily standups, and retrospectives.</p>
<p>Kanban, on the other hand, is a little looser. No official roles, no set sprint timelines. Work flows continuously, and change can happen anytime. It’s perfect for teams who need more flexibility and fewer ceremonies.</p>
<p>So how do they compare in practice? Let’s break it down:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Key Differentiating Factors</strong></td><td><strong>Scrum</strong></td><td><strong>Kanban</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Time-based</td><td>Yes – 1–2 week sprints</td><td>No – continuous flow</td></tr>
<tr>
<td>Roles</td><td>PO, SM, Developers</td><td>No specific roles required</td></tr>
<tr>
<td>Planning</td><td>Sprint planning, retros, and so on</td><td>On-demand, just-in-time</td></tr>
<tr>
<td>Cadence</td><td>Fixed sprint cycle</td><td>Flexible, ongoing</td></tr>
<tr>
<td>Use case</td><td>Complex, structured teams</td><td>Continuous delivery teams</td></tr>
</tbody>
</table>
</div><p><strong>Bottom line:</strong></p>
<ul>
<li><p>Scrum is a scheduled loop. Kanban is a living flow.</p>
</li>
<li><p>One’s a playbook. The other’s a status window.</p>
</li>
</ul>
<p><a target="_blank" href="https://youtu.be/F5QIqFEDv2k?si=jvNoAiHmrv_iq-Lx">Here’s a video</a> on the main differences between Scrum and Kanban you can watch if you want more detail.</p>
<h2 id="heading-so-which-one-should-you-use-scrum-or-kanban"><strong>So which one should you use Scrum or Kanban?</strong></h2>
<p>So… which one should you use?</p>
<p>It really depends on your team, your product, and your pain points.</p>
<p>✔️ If you’re working on a brand-new product where requirements shift a lot, and your team thrives with structure and routines – Scrum is likely the better fit. Sprints give you a sense of pacing, and ceremonies help ensure alignment.</p>
<p>✔️ If you’re managing ongoing work like bug triage, tech debt, infrastructure tasks, or anything that’s more “whenever it comes in” than “we need to ship this in two weeks” – Kanban gives you flexibility and visibility without the overhead.</p>
<p>And yes, there’s such a thing as <strong>Scrumban</strong> – a hybrid approach where teams use visual boards and WIP limits from Kanban, but keep some of Scrum’s structure like standups and retros. It’s like Agile tapas: you get the flavors that work best for your appetite.</p>
<p><a target="_blank" href="https://youtu.be/kiI3IweyAeQ?si=M1mtS5HCCcGcT78J">Here is a detailed video</a> that’'ll teach you more about how Scrumban works in practice.</p>
<p>Watch the Scrumban video only when you are familiar and comfortable with both Scrum and Kanban – otherwise, you might get confused from the cross-pollination of ideas and frameworks.</p>
<p>I personally have never seen a Scrumban implementation thats scaled well – too many folks trying too many things and none of them work. But thats just based on my experience – it may work for you and your team. I’ll let you be the judge.</p>
<h2 id="heading-what-tools-do-teams-use-for-kanban"><strong>What Tools Do Teams Use for Kanban?</strong></h2>
<p>You’ve probably seen (or used) one already:</p>
<ul>
<li><p><strong>Trello</strong> – Simple and great for solo or small teams</p>
</li>
<li><p><strong>Jira</strong> – Enterprise-level, customizable workflows</p>
</li>
<li><p><strong>GitHub Projects</strong> – Lightweight but powerful for devs</p>
</li>
<li><p><strong>ClickUp / Asana / Notion</strong> – Integrated with docs/tasks</p>
</li>
</ul>
<p>Kanban isn’t tied to any one tool – you can use an app, a browser tab, or a whiteboard and a pack of sticky notes from the office supply closet. What matters is how you use it. But let’s walk through some of the most common tools and what they offer in a Kanban context:</p>
<h3 id="heading-trello">🟩 <strong>Trello</strong></h3>
<p>Trello is probably the easiest way to start with Kanban. It gives you a simple digital board with columns and cards you can drag and drop. It’s great for devs or small teams who don’t need tons of automation – just a clean place to track work visually.</p>
<h3 id="heading-jira">🟨 <strong>Jira</strong></h3>
<p>Jira is a heavyweight – and while it’s built for Scrum, it also supports robust Kanban boards. You can define custom workflows, use built-in reports like cumulative flow diagrams, enforce WIP limits, and manage team velocity. Ideal for large teams that need traceability, integrations, and permissions.</p>
<h3 id="heading-github-projects">🟦 <strong>GitHub Projects</strong></h3>
<p>If your code lives in GitHub, GitHub Projects is a clean way to stay close to your codebase. It lets you create Kanban-style boards with issues and pull requests as cards, so you’re never toggling between tools just to track what’s in progress.</p>
<h3 id="heading-clickup-asana-notion">🟧 <strong>ClickUp / Asana / Notion</strong></h3>
<p>These are all-in-one productivity platforms. They combine Kanban boards with documentation, team chat, calendars, and reporting. If your team needs more than just “move card left to right,” these tools let you manage projects, meetings, notes, and workflows in one place.</p>
<h3 id="heading-whiteboard-sticky-notes">🟪 <strong>Whiteboard + Sticky Notes</strong></h3>
<p>Don’t underestimate the analog approach. It’s fast. It’s visible. It’s tactile. Physically moving a task from “Doing” to “Done” gives you a sense of progress no digital tool can match. And when something’s blocked? Slap a red sticky on it and call it a day.</p>
<p>Bottom line: The best tool is the one your team will <em>actually</em> use. Fancy doesn’t beat consistent. And the actual tool doesn’t matter as much as the <strong>discipline</strong> your team has to actually use it.</p>
<h2 id="heading-how-to-use-kanban-to-manage-your-own-coding-projects"><strong>How to Use Kanban to Manage Your Own Coding Projects</strong></h2>
<p>Even if you're not on a team yet, Kanban is great for your own workflow. Here’s how you can use it to help yourself out:</p>
<ol>
<li><p>Create a basic 3-column board (To Do, In Progress, Done)</p>
</li>
<li><p>Write out every task, big or small</p>
</li>
<li><p>Set a WIP limit (for example, no more than 2 tasks at once)</p>
</li>
<li><p>Update it daily. Make it a ritual.</p>
</li>
<li><p>Review your flow weekly – What got stuck? What moved fast?</p>
</li>
</ol>
<p> Example:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>To-Do</strong></td><td><strong>In Progress</strong></td><td><strong>Done</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Fix CSS Layout</td><td>Add blog search bar</td><td>Set up Netlify</td></tr>
<tr>
<td>Write README</td><td></td><td>Deploy v1</td></tr>
</tbody>
</table>
</div><p>You’ll be shocked how much clearer your thinking gets when you can <em>see</em> your work. It’s simple but super powerful to visualize your work it in this way.</p>
<h2 id="heading-final-thoughts-why-kanban-isnt-just-a-board"><strong>Final Thoughts: Why Kanban Isn’t Just a Board</strong></h2>
<p>Kanban isn’t just a tool – it’s a mindset.</p>
<p>It helps you focus. It helps your team collaborate. And it gives everyone – even non-technical folks – visibility into what’s going on.</p>
<p>If you’re learning to code and want to feel more confident working with others, <strong>learning Kanban is low-effort, high-impact</strong>.</p>
<p>So don’t wait until your first job. Start using it now – and show up to that standup with confidence.</p>
<p>I hope this small 101 Guide to Kanban was helpful to you all. My sole purpose to write this was to help beginner developers understand Kanban as a practical workflow system – especially for those transitioning from solo coding to collaborative, real-world development environments. It aims to demystify the methodology in a casual, beginner-friendly tone while still offering actionable guidance.</p>
<p>I hope you enjoyed my beginners guide to Kanban.</p>
<p>Until next time, keep Learning, Unlearning and Relearning, folks….</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Run a Sprint Retrospective Using the Start, Stop, Continue Method ]]>
                </title>
                <description>
                    <![CDATA[ I’ve been writing a lot of articles lately on Agile methodologies. And for this one, I wanted to cover how to get the most out of a Sprint Retrospective. I’ve been participating and running Sprint Retrospectives now for 15 years and I truly believe t... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-run-a-sprint-retrospective-start-stop-continue-method/</link>
                <guid isPermaLink="false">67d1f7a9ed7b17e04fb90aa7</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile methodology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Agile Software Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile methods ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ben ]]>
                </dc:creator>
                <pubDate>Wed, 12 Mar 2025 21:07:53 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1740494845460/a0181901-d715-49ce-881b-936b1143d341.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I’ve been writing a lot of articles lately on Agile methodologies. And for this one, I wanted to cover how to get the most out of a Sprint Retrospective.</p>
<p>I’ve been participating and running Sprint Retrospectives now for 15 years and I truly believe that when done well, they are the best way to make a team more effective and more closely bonded.</p>
<h2 id="heading-what-is-a-sprint-retrospective">What is a Sprint Retrospective?</h2>
<p>A sprint retrospective is one of the key events in an Agile Sprint. The retrospective occurs at the end of each sprint and it is the meeting where the scrum team gets together to talk openly and honestly about the sprint that has just finished.</p>
<p>The purpose of the Sprint Retrospective is to find out things that went well in the previous sprint and things that didn’t.</p>
<p>Agile promotes iteration and improvement. The retrospective is a way to continuously improve the team and the team’s practices by regularly (at the end of each sprint) dissecting your working practices and trying to improve upon them.</p>
<h2 id="heading-building-the-foundation-for-effective-retrospectives">Building the Foundation for Effective Retrospectives</h2>
<p>Before diving into methodology, let's address three critical factors that determine how successful your sprint retrospective might be:</p>
<ol>
<li><p><strong>Team size matters</strong>: I've discovered that scrum teams larger than 6-7 people struggle with meaningful retrospectives. The dynamics change, people speak less freely, and you lose the intimate environment needed for honest feedback. If your team has grown too large, consider splitting it.</p>
</li>
<li><p><strong>Trust is non-negotiable</strong>: I've seen brilliant retrospective frameworks fail in environments where team members don't feel safe sharing honest feedback. This foundation must be established first.</p>
</li>
<li><p><strong>Actions speak louder than words</strong>: Teams quickly recognize empty exercises. If retrospective outcomes aren't implemented, people will lose faith and stop participating. Make sure you follow through.</p>
</li>
</ol>
<h2 id="heading-the-mechanics-of-start-stop-continue">The Mechanics of Start, Stop, Continue</h2>
<p>The beauty of this approach is due to its simplicity.</p>
<p>Start, Stop, Continue is a framework that tries to get you and your team to categorize all of the aspects of work in the team (planning, execution, reviews, communication, and so on) into three simple categories:</p>
<ul>
<li><p>Things we should <strong>start</strong> doing (before starting a new code change, see if there are open pull requests to review),</p>
</li>
<li><p>Things we should <strong>stop</strong> doing (submitting pull requests that are longer than X lines), and</p>
</li>
<li><p>Things we should <strong>continue</strong> doing (keep the stand up to 15 minutes).</p>
</li>
</ul>
<p>Here's how I structure these sessions:</p>
<h3 id="heading-gathering-start-items">Gathering "Start" Items</h3>
<p>I ask: "<em>What practices should we begin implementing that we currently don't do?</em>"</p>
<p>Common themes I've seen across teams include:</p>
<ul>
<li><p>Earlier stakeholder demos</p>
</li>
<li><p>More rigorous code review practices</p>
</li>
<li><p>Better preparation before refinement meetings</p>
</li>
<li><p>Cross-functional pairing opportunities</p>
</li>
<li><p>More well-defined tasks</p>
</li>
</ul>
<h3 id="heading-finding-the-stop-items">Finding the "Stop" Items</h3>
<p>Next question: "<em>What's currently slowing down our productivity or quality?</em>"</p>
<p>Frequently mentioned items include:</p>
<ul>
<li><p>Context switching between multiple stories</p>
</li>
<li><p>Late-sprint testing bottlenecks</p>
</li>
<li><p>Inconsistent documentation practices</p>
</li>
<li><p>Meeting overload</p>
</li>
<li><p>Changing priorities mid sprint</p>
</li>
</ul>
<h3 id="heading-recognizing-continue-items">Recognizing "Continue" Items</h3>
<p>Finally: "<em>What positive practices have we recently adopted that require reinforcement?</em>"</p>
<p>This category functions as a temporary holding area. Once practices become second nature, they graduate from the list.</p>
<h2 id="heading-the-decision-framework">The Decision Framework</h2>
<p>After generating ideas, decision-making becomes critical.</p>
<p>You now need to decide which items on the board (across all categories) you want to talk about.</p>
<p>There may be some retrospectives where you decide as a team that the most important items to talk about are all In the “start” category, there may be some meetings where you talk about items from the Start, Stop, and Continue categories. It really depends on what is deemed by the team to be the most important items that need addressing.</p>
<p>Here’s my preferred approach to picking the most important topics to discuss:</p>
<ol>
<li><p>Group similar items for clarity. Are there three items on the board that are to do with different aspects of stability? Group them into one.</p>
</li>
<li><p>Allocate three votes per team member. Giving people limited options means that their votes truly matter. If you ask people to tag any items they see as important, you’ll more than likely get an overwhelming number of action items.</p>
</li>
<li><p>Select the top 2-3 items for action. It’s not possible to make too many changes in one go or in one sprint. Choosing 2-3 means that you are likely to be able to achieve them. Starting each retro by highlighting missed action items can be demoralizing. Limiting your action items hopefully mitigates this.</p>
</li>
<li><p>Assign clear ownership for each item. One person needs to lead each action item. Without clear ownership, the <a target="_blank" href="https://en.wikipedia.org/wiki/Bystander_effect">bystander effect</a> is likely to happen.</p>
</li>
</ol>
<p>The key insight: changing too many things simultaneously dilutes focus. A few well-implemented changes outperform numerous half-hearted attempts.</p>
<h2 id="heading-avoiding-retrospective-monotony">Avoiding Retrospective Monotony</h2>
<p>Repetitive formats lead to diminishing returns.</p>
<p>There are various ways that you can “spice up” the Start, Stop, Continue framework to make sure that people don’t get bored and just go through the motions.</p>
<p>Some of the processes below augment the Start, Stop, Continue process changing it slightly to keep it interesting.</p>
<p>I've developed several variations to keep the process engaging:</p>
<ul>
<li><p><strong>Silent brainstorming</strong>: Everyone writes ideas on sticky notes before sharing</p>
</li>
<li><p><strong>Theme-focused</strong>: Concentrate on specific areas (for example, "testing practices" or "collaboration"). Only do Start, Stop, and Continue on the chosen topic.</p>
</li>
<li><p><strong>Data-driven</strong>: Begin by examining sprint metrics, then discuss implications. Look at the sprint burndown, the velocity, the story breakdown and do Start, Stop Continue based on the data that you see. For instance, “Start breaking stories down to smaller chunks so that each story can be delivered quicker giving us a more smooth burndown”</p>
</li>
<li><p><strong>Rotating facilitation</strong>: Have different team members lead each retrospective. People engage more if they are actively leading a meeting. They will find ways to keep the others engages as well as they want to do a good job of running the meeting.</p>
</li>
<li><p><strong>Talking stick:</strong> Use a physical stick (yes, I’m serious) as a talking stick and only the person holding can talk. They are allowed to talk about whatever they want, good, bad, or indifferent. You can have one person taking the notes of what the person with the talking stick is saying. For instance, the person with the talking stick might say "I’d like to reduce the number of project meetings within the Sprint”. The meeting facilitator could then translate this to “Stop having so many project meetings in the sprint” and put it on the board.</p>
</li>
</ul>
<h2 id="heading-the-mathematics-of-team-improvement">The Mathematics of Team Improvement</h2>
<p>Here's something rarely discussed in Agile circles but frequently mentioned in finance: <a target="_blank" href="https://en.wikipedia.org/wiki/Compound_interest">the power of compounding</a>. Just as compound interest transforms modest savings into significant wealth, small team improvements compound over time.</p>
<p>Consider this: A team implementing just one meaningful improvement per sprint will see huge results after a year. If each improvement increases efficiency by just 2%, the compounding effect after 26 two-week sprints is remarkable.</p>
<p>Teams that understand this principle outperform those making sporadic large changes.</p>
<h2 id="heading-maintaining-continuity-between-retrospectives">Maintaining Continuity Between Retrospectives</h2>
<p>I maintain a living document tracking all retrospective outcomes.</p>
<p>Before each new session, I review:</p>
<ul>
<li><p>Which items were successfully implemented</p>
</li>
<li><p>Which items need continued attention</p>
</li>
<li><p>Which items were dropped and why</p>
</li>
</ul>
<p>This creates an improvement narrative that demonstrates the team's evolution.</p>
<h2 id="heading-why-this-framework-delivers-in-real-world-scenarios">Why This Framework Delivers in Real-World Scenarios</h2>
<p>Having implemented this across multiple organizations, from startups to established enterprises, I've found the Start, Stop, Continue model succeeds because:</p>
<ol>
<li><p>It creates immediate clarity on what requires action</p>
</li>
<li><p>It balances recognition of successes with acknowledgment of challenges</p>
</li>
<li><p>It creates a sustainable improvement cycle without overwhelming the team</p>
</li>
<li><p>It focuses on behavioral changes rather than vague aspirations</p>
</li>
</ol>
<p>The best retrospectives I've facilitated didn't just improve processes—they transformed team cultures by establishing continuous improvement as a fundamental value.</p>
<p><em>In his spare time, Ben writes his tech blog</em> <a target="_blank" href="https://justanothertechlead.com/"><em>Just Another Tech Lead</em></a> <em>and runs a site creating forever-free online calaculators at</em> <a target="_blank" href="https://calculatorlord.com/"><em>CalculatorLord.com</em></a><em>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The Clean Code Handbook: How to Write Better Code for Agile Software Development ]]>
                </title>
                <description>
                    <![CDATA[ Building scalable software applications requires writing clean code that’s so simple that any dev can understand it. In this article, I’ll explain and demonstrate what clean code is. Then I’ll share my favorite clean code patterns for building modern... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-clean-code-handbook/</link>
                <guid isPermaLink="false">679a5fa86177eb24200d0f7f</guid>
                
                    <category>
                        <![CDATA[ clean code ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ handbook ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Programming with Shahan ]]>
                </dc:creator>
                <pubDate>Wed, 29 Jan 2025 17:04:40 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1738170236859/edacf21e-7180-4f65-9e7e-f7cf95b4f9d8.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Building scalable software applications requires writing clean code that’s so simple that any dev can understand it.</p>
<p>In this article, I’ll explain and demonstrate what clean code is. Then I’ll share my favorite clean code patterns for building modern Agile applications.</p>
<p>I won’t use complex jargon. I’ll hit you with simple, clear JavaScript examples that focus on the core concepts. Straight to the point, no nonsense – that’s how I roll.</p>
<p>Let’s get started.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ol>
<li><p><a class="post-section-overview" href="#heading-the-cost-of-bad-code">The Cost of Bad Code</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-clean-coder-vs-messy-coder">Clean Coder vs. Messy Coder</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-ai-cant-save-you-if-your-code-is-a-mess">AI Can’t Save You If Your Code is a Mess 🗑️</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-12-clean-code-design-patterns-for-building-agile-applications">12 Clean Code Design Patterns for Building Agile Applications ⚖️</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-use-names-that-mean-something">🌿 Use Names That Mean Something</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-keep-functions-laser-focused-srp">🔨 Keep Functions Laser-Focused (SRP)</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-use-comments-thoughtfully">🚪 Use Comments Thoughtfully</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-best-practices-for-writing-good-comments">⚡ Best Practices for Writing Good Comments</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-make-your-code-readable">🧩 Make Your Code Readable</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-test-everything-you-write">🏌️ Test Everything You Write</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-use-dependency-injection">💉 Use Dependency Injection</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-clean-project-structures">📂 Clean Project Structures</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-be-consistent-with-formatting">🤹‍♂️ Be Consistent with Formatting</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-stop-hardcoding-values">✋ Stop Hardcoding Values</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-keep-functions-short">🤏 Keep Functions Short</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-follow-the-boy-scout-rule">⛺ Follow the Boy Scout Rule</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-follow-the-openclosed-principle">🏟️ Follow the Open/Closed Principle</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-modern-best-practices-to-help-you-write-clean-code-a-summary">Modern Best Practices to Help You Write Clean Code: A Summary 🥷</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-automated-tools-for-maintaining-clean-code">Automated Tools for Maintaining Clean Code ⚓</a></p>
<ul>
<li><p><a class="post-section-overview" href="#heading-1-static-analysis">1️⃣ Static Analysis</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-2-automated-code-formatting">2️⃣ Automated Code Formatting</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-3-continuous-integration-ci-testing">3️⃣ Continuous Integration (CI) Testing</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-4-cicd-pipelines">4️⃣ CI/CD pipelines</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#heading-the-role-of-documentation-in-agile-software-development">The Role of Documentation in Agile Software Development 🚣</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-conclusion">Conclusion 🏁</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-frequently-asked-questions-about-clean-code">Frequently Asked Questions About Clean Code 🧯</a></p>
</li>
</ol>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xh3j6ccn1hc3euc3lfyl.png" alt="Image of agile software development meme" width="600" height="400" loading="lazy"></p>
<p>In Agile, where change is the only constant, clean code is your armor. It makes you adaptable, swift, and, most importantly, in control.</p>
<p>Here’s the truth: writing clean code is not optional if you want to survive in the software development industry. Fortunately, we human beings are able to master clean code with some effort and practice.</p>
<h2 id="heading-the-cost-of-bad-code">The Cost of Bad Code</h2>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wdai6npb55j71sguj6kl.png" alt="Image of cost of messy code vs clean code graph by shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>To explain this stack bar graph, in the initial development phase, bad code is <strong>slightly</strong> more costly to change than clean code.</p>
<p>But as we move into the maintenance and refactoring phases, the gap widens significantly, with bad code costing nearly twice as much as clean code.</p>
<p>By the legacy phase, bad code reaches 100% cost – now it’s extremely expensive to update, while clean code remains more manageable at 45%.</p>
<p>As of now, the most recent analysis on the cost of poor software quality in the U.S. is the 2022 report by the Consortium for Information and Software Quality (<a target="_blank" href="http://cisq.org">cisq.org</a>). This report estimates that poor software quality cost the U.S. economy at least $2.41 trillion in 2022, with technical debt accounting for about $1.52 trillion of this amount.</p>
<p>You can <a target="_blank" href="https://www.it-cisq.org/the-cost-of-poor-quality-software-in-the-us-a-2022-report/">read more about that here</a>.</p>
<p>Recent discussions continue to highlight the significant impact of technical debt on software quality and business performance.</p>
<p>For instance, <a target="_blank" href="https://vfunction.com/blog/how-to-manage-technical-debt">a 2024 survey</a> indicated that for more than 50% of companies, technical debt accounts for greater than a quarter of their total IT budget. And this can really hinder innovation if it’s not addressed.</p>
<p>As you can see, there’s no doubt that bad code is a costly problem in software development.</p>
<h2 id="heading-clean-coder-vs-messy-coder"><strong>Clean Coder vs. Messy Coder</strong></h2>
<p>Here’s a graph that shows the journey of <strong>two types</strong> of coders:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6ubf77uwipf4gtucw8q.png" alt="Image of clean code vs bad code graph chart" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<ul>
<li><p><strong>⚠️ The Messy Coder (Red line):</strong> Starts fast but crashes hard. The more lines they write, the more trouble they make.</p>
</li>
<li><p><strong>⚡ The Clean Coder (Blue line):</strong> Starts slow but stays consistent. Growth doesn’t stop — it accelerates.</p>
</li>
</ul>
<p>🫵 Now, you decide which line you want to follow.</p>
<h2 id="heading-ai-cant-save-you-if-your-code-is-a-mess">AI Can’t Save You If Your Code is a Mess 🗑️</h2>
<p>When you get stuck writing code, you might turn to AI. But let me tell you something: AI can’t save you if your code is a mess.</p>
<p>It’s like building a house on sand. Sure, it stands for a while, but one strong gust of wind or big wave, and it collapses.</p>
<p>Remember: AI is just a tool. If you don’t know how to write clean, scalable applications, you're setting yourself up for failure.</p>
<p>If you can’t maintain the code you write, you’re in trouble.</p>
<p>I’ve seen it over and over again: developers who know five programming languages. They can build apps, websites, software. They know algorithms and data structures like the back of their hand.</p>
<p>But when faced with a large project or someone else’s messy code, they crumble.</p>
<p>They’re like an aerospace engineer who designs and builds their own planes but doesn’t know how to fly them. They crash into their own code.</p>
<p>This was me...once upon a time. I’d write thousands of lines of code, only to realize I couldn’t even understand what I wrote last week. It was chaos for me.</p>
<p>But then it hit me — every developer struggles with this. It wasn't about how much I knew. It was about how I organized and structured what I knew. In other words, it was about knowing the art of programming itself.</p>
<p>I decided to escape this trap. After five months of intense work — four to five hours a day writing, designing, and researching — I created something I wish I had when I started programming. A book that’s a complete beginner’s guide: <strong>Clean Code Zero to One.</strong></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737731329839/c4c862d9-7fdc-460a-ae2e-18b19468b6ec.png" alt="cover image of clean code zero to one: from messy code to masterpiece" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>If you want to learn more about the book, I give you all the details at the end of this tutorial. So read on to learn more about writing clean code.</p>
<h2 id="heading-12-clean-code-design-patterns-for-building-agile-applications">12 Clean Code Design Patterns for Building Agile Applications ⚖️</h2>
<p>If your code doesn’t follow these modern clean code design patterns, you could be creating a ticking time bomb. These patterns are your tools. Master them and enjoy the success of your projects. Let me show you one by one.</p>
<h3 id="heading-use-names-that-mean-something"><strong>🌿 Use Names That Mean Something</strong></h3>
<p>Naming your variables or functions b or x is not helpful. Call them what they are so they’re easier to understand. Here’s an example of both a bad and good variable name:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Weak and vague</span>
<span class="hljs-keyword">let</span> b = <span class="hljs-number">5</span>;

<span class="hljs-comment">// Strong and clear</span>
<span class="hljs-keyword">let</span> numberOfUsers = <span class="hljs-number">5</span>;
</code></pre>
<p>People who write unclear names don’t want to own their mistakes. Don’t be that person.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1736165724746/37b2edc3-3c68-47a8-ab6f-f131a2239a01.png" alt="Comic showing a bad vs a good variable name, by Shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h3 id="heading-keep-functions-laser-focused-srp"><strong>🔨 Keep Functions Laser-Focused (SRP)</strong></h3>
<p>A function should do <strong>one thing</strong>—and do it perfectly. This is called the Single Responsibility Principle (<strong>SRP</strong>).</p>
<p>Good code is like a hammer. It hits one nail, not ten. For example, if you are hiring someone to do everything in your company — finance, sales, marketing, janitorial work, and so on — they’ll likely fail miserably because they can’t focus one one thing. The same goes for your classes in code.</p>
<p>🚧 When a class or function does more than one thing, it becomes a tangled mess. Debugging it feels like solving a puzzle upside down. If your class handles both user input and database operations, for example, it’s not multitasking — it’s madness. Break it up. One method, one job.</p>
<p><strong>🔥 My Rule:</strong> Your code works for you. Keep it sharp, focused, and controllable, or it’s going to control you. Here is how to make that happen:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Clean: One job, one focus</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateTotal</span>(<span class="hljs-params">a, b</span>) </span>{
    <span class="hljs-keyword">return</span> a + b;
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">logTotal</span>(<span class="hljs-params">user, total</span>) </span>{
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`User: <span class="hljs-subst">${user}</span>, Total: <span class="hljs-subst">${total}</span>`</span>);
}

<span class="hljs-comment">// Messy: Trying to do EVERYTHING</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateAndLogTotal</span>(<span class="hljs-params">a, b, user</span>) </span>{
    <span class="hljs-keyword">let</span> total = a + b;
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`User: <span class="hljs-subst">${user}</span>, Total: <span class="hljs-subst">${total}</span>`</span>);
}
</code></pre>
<p>🪧 When you mix tasks, you mix in confusion. As simple as that.</p>
<h3 id="heading-use-comments-thoughtfully"><strong>🚪 Use Comments Thoughtfully</strong></h3>
<p>There is a great saying among professional developers:</p>
<blockquote>
<p>“ Code speaks for itself. ”</p>
</blockquote>
<p>You don’t explain what a door does every time someone walks into a room, do you? Your code should work the same way.</p>
<p>Comments aren’t bad, but if your code can’t stand on its own, then you may have a problem.</p>
<p>🪧 A good comment should tell “why” not “how or what”. If a developer doesn’t understand “how” something works, then they likely aren’t going to understand “why” either.</p>
<p>Here are some short examples of good comments vs bad comments. I’ll also show you a real-world project for writing clean comments.</p>
<p><strong>Example 1: Bad Comment 👎</strong></p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Multiply the price by the quantity to calculate the total</span>
<span class="hljs-keyword">const</span> total = price * quantity;
</code></pre>
<p>This is a <strong>bad comment</strong> because it simply repeats what the code already says. The code <code>price * quantity</code> is self-explanatory, so the comment doesn’t add anything useful.</p>
<p><strong>Good Comment: 👍</strong></p>
<p>If the code is clear and simple, <strong>you don’t need a comment.</strong></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> total = price * quantity;
</code></pre>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1736165891398/6a942ad7-5b09-4990-9c7f-95358dafcbf3.png" alt="Image illustrating unnecessary comment vs &quot;silent comment&quot;, by Shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Example 2: Bad Comment 👎</strong></p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Check if the user logged in</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isUserLoggedIn</span>(<span class="hljs-params">session</span>) </span>{
    <span class="hljs-keyword">return</span> !!session.user;
}
</code></pre>
<p>This comment is bad because it doesn’t explain why the <code>isUserLoggin()</code> exists. It just explains what happens. But we already know that this is an auth function. This comment is a waste of time.</p>
<p><strong>Good Example 👍</strong></p>
<pre><code class="lang-javascript"><span class="hljs-comment">// The user is authenticated before accessing protected resources</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">isUserLoggedIn</span>(<span class="hljs-params">session</span>) </span>{
    <span class="hljs-keyword">return</span> !!session.user;
}
</code></pre>
<p>This is a <strong>good comment</strong> because it explains <strong>why</strong> the code exists. It tells us that the function checks if the user is authenticated before allowing access to sensitive parts of the app. It focuses on the bigger picture.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1736166143011/b3ddae3d-41cf-4534-8f1a-af710579922c.png" alt="Before: &quot;Check if the user is logged in&quot;. After: &quot;The user is authenticated before accessing protected resources.&quot; By Shahan." class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<h3 id="heading-best-practices-for-writing-good-comments"><strong>⚡ Best Practices for Writing Good Comments</strong></h3>
<ol>
<li><p><strong>Explain the “Why,” not the “What”:</strong><br> Write comments to explain the purpose or context of the code, not what the code is doing.</p>
</li>
<li><p><strong>Avoid obvious comments:</strong><br> Don’t write comments for things the code already makes clear.</p>
</li>
<li><p><strong>Keep them short and precise:</strong><br> Write concise comments that are easy to read and directly explain the purpose.</p>
</li>
<li><p><strong>Update comments regularly:</strong><br> Outdated comments can mislead developers, so always update them when the code changes.</p>
</li>
</ol>
<p><strong>Real-World Example (with Good Comments) 🛒</strong></p>
<p>Let’s implement these practices into a real-world project: a large e-commerce application. One function calculates shipping costs based on the order details. Here's the full code, I will explain each comment below:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Shipping rules:</span>
<span class="hljs-comment">// - Free shipping for orders over $100</span>
<span class="hljs-comment">// - Standard shipping ($10) for orders below $100</span>
<span class="hljs-comment">// - Additional $5 for international orders</span>

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateShipping</span>(<span class="hljs-params">order</span>) </span>{
    <span class="hljs-keyword">let</span> shippingCost = <span class="hljs-number">0</span>;

    <span class="hljs-comment">// Check if the order qualifies for free shipping</span>
    <span class="hljs-keyword">if</span> (order.total &gt;= <span class="hljs-number">100</span>) {
        shippingCost = <span class="hljs-number">0</span>; <span class="hljs-comment">// Free shipping</span>
    } <span class="hljs-keyword">else</span> {
        shippingCost = <span class="hljs-number">10</span>; <span class="hljs-comment">// Standard shipping cost</span>
    }

    <span class="hljs-comment">// Add additional cost for international orders</span>
    <span class="hljs-keyword">if</span> (order.isInternational) {
        shippingCost += <span class="hljs-number">5</span>;
    }

    <span class="hljs-keyword">return</span> shippingCost;
}

<span class="hljs-comment">// Example usage</span>
<span class="hljs-keyword">const</span> order1 = { <span class="hljs-attr">total</span>: <span class="hljs-number">120</span>, <span class="hljs-attr">isInternational</span>: <span class="hljs-literal">false</span> };
<span class="hljs-keyword">const</span> order2 = { <span class="hljs-attr">total</span>: <span class="hljs-number">80</span>, <span class="hljs-attr">isInternational</span>: <span class="hljs-literal">true</span> };

<span class="hljs-built_in">console</span>.log(calculateShipping(order1)); <span class="hljs-comment">// Output: 0</span>
<span class="hljs-built_in">console</span>.log(calculateShipping(order2)); <span class="hljs-comment">// Output: 15</span>
</code></pre>
<p>At the start of the function, we include a comment explaining the rules for shipping costs. This gives the reader an overview of the logic without needing to read the full code.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Shipping rules:</span>
<span class="hljs-comment">// - Free shipping for orders over $100</span>
<span class="hljs-comment">// - Standard shipping ($10) for orders below $100</span>
<span class="hljs-comment">// - Additional $5 for international orders</span>
</code></pre>
<p>Then, the first condition checks if the order total is greater than or equal to $100. A comment here clarifies <strong>why</strong> free shipping is applied.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Check if the order qualifies for free shipping</span>
<span class="hljs-keyword">if</span> (order.total &gt;= <span class="hljs-number">100</span>) {
    shippingCost = <span class="hljs-number">0</span>; <span class="hljs-comment">// Free shipping</span>
}
</code></pre>
<p>The second condition applies an additional charge for international shipping. The comment explains <strong>why</strong> the extra cost is added.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Add additional cost for international orders</span>
<span class="hljs-keyword">if</span> (order.isInternational) {
    shippingCost += <span class="hljs-number">5</span>;
}
</code></pre>
<p><strong>Why are these comments good?</strong></p>
<p>Imagine you’re working in a team of 20 developers. Someone reads the <code>calculateShipping</code> function six months later. Without these comments, they might waste time guessing why international orders have an extra fee. Good comments clarify the why and save hours of frustration.</p>
<h3 id="heading-make-your-code-readable"><strong>🧩 Make Your Code Readable</strong></h3>
<p>If someone reading your code feels like they’re solving a riddle, you’ve already become a troublemaker. Here is the proof:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Clean: Reads like a story</span>
<span class="hljs-keyword">if</span> (isLoggedIn) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Welcome!"</span>);
} <span class="hljs-keyword">else</span> {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Please log in."</span>);
}

<span class="hljs-comment">// Messy: Feels like chaos</span>
<span class="hljs-keyword">if</span>(isLoggedIn){<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Welcome!"</span>);}<span class="hljs-keyword">else</span>{<span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Please log in."</span>);}
</code></pre>
<p>If your code is messy and hard to read, it will confuse others—and even yourself later! Imagine coming back to your own code after six months and feeling like you’re reading a foreign language. Readable code saves time, reduces bugs, and makes everyone’s life easier.</p>
<p><strong>🍵 Why is Readability Important?</strong></p>
<ol>
<li><p><strong>For yourself:</strong> When you revisit your code after weeks or months, clean code helps you pick up where you left off without wasting time figuring out what you did.</p>
</li>
<li><p><strong>For your team:</strong> If someone else reads your code, they shouldn’t have to solve a puzzle. Clean code makes teamwork smoother and prevents miscommunication.</p>
</li>
<li><p><strong>Fewer bugs:</strong> Clear code is easier to debug because you can quickly spot mistakes.</p>
</li>
</ol>
<p><strong>🧙‍♂️ How to Write Readable Code</strong></p>
<p>Let’s build a simple program to manage books in a library. We’ll make it clean and readable and then I will break down this code below:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// A class to represent a book</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Book</span> </span>{
    <span class="hljs-keyword">constructor</span>(title, author, isAvailable) {
        <span class="hljs-built_in">this</span>.title = title;
        <span class="hljs-built_in">this</span>.author = author;
        <span class="hljs-built_in">this</span>.isAvailable = isAvailable;
    }

    borrow() {
        <span class="hljs-keyword">if</span> (<span class="hljs-built_in">this</span>.isAvailable) {
            <span class="hljs-built_in">this</span>.isAvailable = <span class="hljs-literal">false</span>;
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`You borrowed "<span class="hljs-subst">${<span class="hljs-built_in">this</span>.title}</span>".`</span>);
        } <span class="hljs-keyword">else</span> {
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Sorry, "<span class="hljs-subst">${<span class="hljs-built_in">this</span>.title}</span>" is not available.`</span>);
        }
    }

    returnBook() {
        <span class="hljs-built_in">this</span>.isAvailable = <span class="hljs-literal">true</span>;
        <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`You returned "<span class="hljs-subst">${<span class="hljs-built_in">this</span>.title}</span>".`</span>);
    }
}

<span class="hljs-comment">// A function to display available books</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">displayAvailableBooks</span>(<span class="hljs-params">books</span>) </span>{
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">"Available books:"</span>);
    books.forEach(<span class="hljs-function">(<span class="hljs-params">book</span>) =&gt;</span> {
        <span class="hljs-keyword">if</span> (book.isAvailable) {
            <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`- <span class="hljs-subst">${book.title}</span> by <span class="hljs-subst">${book.author}</span>`</span>);
        }
    });
}

<span class="hljs-comment">// Example usage</span>
<span class="hljs-keyword">const</span> book1 = <span class="hljs-keyword">new</span> Book(<span class="hljs-string">"The Clean Coder"</span>, <span class="hljs-string">"Robert Martin"</span>, <span class="hljs-literal">true</span>);
<span class="hljs-keyword">const</span> book2 = <span class="hljs-keyword">new</span> Book(<span class="hljs-string">"You Don’t Know JS"</span>, <span class="hljs-string">"Kyle Simpson"</span>, <span class="hljs-literal">false</span>);
<span class="hljs-keyword">const</span> book3 = <span class="hljs-keyword">new</span> Book(<span class="hljs-string">"Eloquent JavaScript"</span>, <span class="hljs-string">"Marijn Haverbeke"</span>, <span class="hljs-literal">true</span>);

<span class="hljs-keyword">const</span> library = [book1, book2, book3];

displayAvailableBooks(library); <span class="hljs-comment">// Show available books</span>
book1.borrow(); <span class="hljs-comment">// Borrow a book</span>
displayAvailableBooks(library); <span class="hljs-comment">// Show available books again</span>
book1.returnBook(); <span class="hljs-comment">// Return the book</span>
displayAvailableBooks(library); <span class="hljs-comment">// Final list</span>
</code></pre>
<p>We created a <code>Book</code> class to represent each book. It has properties like <code>title</code>, <code>author</code>, and <code>isAvailable</code> to track its status.</p>
<ul>
<li><p>The <code>borrow</code> method checks if the book is available. If yes, it marks it as unavailable and prints a message.</p>
</li>
<li><p>The <code>returnBook</code> method makes the book available again.</p>
</li>
<li><p>The <code>displayAvailableBooks</code> function loops through the library and prints only the books that are available.</p>
</li>
<li><p>We create three books (<code>book1</code>, <code>book2</code>, <code>book3</code>) and store them in a <code>library</code> array.</p>
</li>
<li><p>We borrow and return books, showing how the list of available books changes.</p>
</li>
</ul>
<p>As you can see, readable code is not just about style. It saves time, prevents bugs, and preserves your code as useful for years to come.</p>
<h3 id="heading-test-everything-you-write"><strong>🏌️ Test Everything You Write</strong></h3>
<p>If you don’t take the time to write tests, you shouldn’t be surprised if your code breaks. If you do want to write tests, follow this unit testing strategy to catch problems ahead.</p>
<p><strong>What Is Unit Testing?</strong></p>
<p>Concretely, unit testing checks individual parts of your code (like functions or classes) to ensure they work correctly. Just like checking each brick of your house for soundness before building the walls.</p>
<p>Let me give you an example of how unit testing works:</p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Calculator</span> </span>{
    add(a, b) { <span class="hljs-keyword">return</span> a + b; }
    subtract(a, b) { <span class="hljs-keyword">return</span> a - b; }
}

<span class="hljs-comment">// Test it (Unit Test)</span>
<span class="hljs-keyword">const</span> calculator = <span class="hljs-keyword">new</span> Calculator();
<span class="hljs-built_in">console</span>.assert(calculator.add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>) === <span class="hljs-number">5</span>, <span class="hljs-string">"Addition failed"</span>);
<span class="hljs-built_in">console</span>.assert(calculator.subtract(<span class="hljs-number">5</span>, <span class="hljs-number">3</span>) === <span class="hljs-number">2</span>, <span class="hljs-string">"Subtraction failed"</span>);
</code></pre>
<p>Here’s what’s going on in this code:</p>
<p>First, we create the calculator class:</p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Calculator</span> </span>{
    add(a, b) { <span class="hljs-keyword">return</span> a + b; }
    subtract(a, b) { <span class="hljs-keyword">return</span> a - b; }
}
</code></pre>
<p>The <code>Calculator</code> class has two methods: <code>add</code> and <code>subtract</code>.</p>
<ul>
<li><p><code>add(a, b)</code> takes two numbers and returns their sum.</p>
</li>
<li><p><code>subtract(a, b)</code> takes two numbers and returns their difference.</p>
</li>
</ul>
<p>Next, we set up the tests:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> calculator = <span class="hljs-keyword">new</span> Calculator();
</code></pre>
<p>Here, we’re creating an instance of the <code>Calculator</code> class to test its methods.</p>
<p>Then we write test cases:</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">console</span>.assert(calculator.add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>) === <span class="hljs-number">5</span>, <span class="hljs-string">"Addition failed"</span>);
<span class="hljs-built_in">console</span>.assert(calculator.subtract(<span class="hljs-number">5</span>, <span class="hljs-number">3</span>) === <span class="hljs-number">2</span>, <span class="hljs-string">"Subtraction failed"</span>);
</code></pre>
<p><code>console.assert(condition, message)</code> checks if the condition is <code>true</code>. If it’s <code>false</code>, the message ("Addition failed" or "Subtraction failed") is displayed in the console.</p>
<ul>
<li><p><strong>First test</strong>: <code>calculator.add(2, 3) === 5</code></p>
<ul>
<li><p>Calls the <code>add</code> method with <code>2</code> and <code>3</code>.</p>
</li>
<li><p>Checks if the result is <code>5</code>.</p>
</li>
</ul>
</li>
<li><p><strong>Second test</strong>: <code>calculator.subtract(5, 3) === 2</code></p>
<ul>
<li><p>Calls the <code>subtract</code> method with <code>5</code> and <code>3</code>.</p>
</li>
<li><p>Checks if the result is <code>2</code>.</p>
</li>
</ul>
</li>
</ul>
<p>So what happens if something breaks? It’s pretty simple to solve any issues that arise here. In this case, if the <code>add</code> or <code>subtract</code> method doesn’t work correctly, the test will fail. For example:</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">console</span>.assert(calculator.add(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>) === <span class="hljs-number">6</span>, <span class="hljs-string">"Addition failed"</span>);
</code></pre>
<ul>
<li><p>The condition <code>calculator.add(2, 3) === 6</code> is <code>false</code>.</p>
</li>
<li><p>The console will display: <code>"Addition failed"</code>.</p>
</li>
</ul>
<p><strong>Real-World Example: Testing a Login System 👥</strong></p>
<p>Let’s test a simple login system to see how unit testing works in a real-world scenario.</p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Auth</span> </span>{
    login(username, password) {
        <span class="hljs-keyword">return</span> username === <span class="hljs-string">"admin"</span> &amp;&amp; password === <span class="hljs-string">"1234"</span>;
    }
}

<span class="hljs-comment">// Test the Auth class</span>
<span class="hljs-keyword">const</span> auth = <span class="hljs-keyword">new</span> Auth();
<span class="hljs-built_in">console</span>.assert(auth.login(<span class="hljs-string">"admin"</span>, <span class="hljs-string">"et5t45#@"</span>) === <span class="hljs-literal">true</span>, <span class="hljs-string">"Login failed for valid credentials"</span>);
<span class="hljs-built_in">console</span>.assert(auth.login(<span class="hljs-string">"user"</span>, <span class="hljs-string">"wrongpassword"</span>) === <span class="hljs-literal">false</span>, <span class="hljs-string">"Login succeeded for invalid credentials"</span>);
</code></pre>
<p>First, create the <code>Auth</code> class:</p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Auth</span> </span>{
    login(username, password) {
        <span class="hljs-keyword">return</span> username === <span class="hljs-string">"admin"</span> &amp;&amp; password === <span class="hljs-string">"1234"</span>;
    }
}
</code></pre>
<p>The <code>login</code> method checks if the username is <code>"admin"</code> and the password is <code>"1234"</code>. If both match, it returns <code>true</code> – otherwise, <code>false</code>.</p>
<p>Next, set up the tests:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> auth = <span class="hljs-keyword">new</span> Auth();
</code></pre>
<p>Create an instance of the <code>Auth</code> class. Then write the test cases:</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">console</span>.assert(auth.login(<span class="hljs-string">"admin"</span>, <span class="hljs-string">"1234"</span>) === <span class="hljs-literal">true</span>, <span class="hljs-string">"Login failed for valid credentials"</span>);
<span class="hljs-built_in">console</span>.assert(auth.login(<span class="hljs-string">"user"</span>, <span class="hljs-string">"wrongpassword"</span>) === <span class="hljs-literal">false</span>, <span class="hljs-string">"Login succeeded for invalid credentials"</span>);
</code></pre>
<ul>
<li><p><strong>First test</strong>: Checks if valid credentials (<code>"admin"</code>, <code>"1234"</code>) succeed. If not, <code>"Login failed for valid credentials"</code> is displayed.</p>
</li>
<li><p><strong>Second test</strong>: Checks if invalid credentials (<code>"user"</code>, <code>"wrongpassword"</code>) fail. If not, <code>"Login succeeded for invalid credentials"</code> is displayed.</p>
</li>
</ul>
<p><strong>🌱 Why testing results in clean code:</strong></p>
<ol>
<li><p>You naturally write smaller, more focused functions to make your code testable</p>
</li>
<li><p>Tests verify that your code behaves as expected under different conditions.</p>
</li>
<li><p>With tests in place, you can confidently update your code, knowing the tests will catch any mistakes.</p>
</li>
</ol>
<h3 id="heading-use-dependency-injection"><strong>💉 Use Dependency Injection</strong></h3>
<p>Hardcoding dependencies is like tattooing someone’s name on your forehead — it’s permanent, can be abrasive, and locks you in.</p>
<p>So, what does Dependency Injection do? It lets you manage your code's relationships by passing dependencies as arguments. It’s flexible, adaptable, and maintainable.</p>
<p>To demonstrate how it works, here I’m using the Nodemailer dependency for sending emails to users:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Dependency: Sending emails with Nodemailer</span>
<span class="hljs-keyword">const</span> nodemailer = <span class="hljs-built_in">require</span>(<span class="hljs-string">'nodemailer'</span>);
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">sendEmail</span>(<span class="hljs-params">to, subject, message</span>) </span>{
    <span class="hljs-keyword">const</span> transporter = nodemailer.createTransport({ <span class="hljs-comment">/* config */</span> });
    <span class="hljs-keyword">return</span> transporter.sendMail({ <span class="hljs-attr">from</span>: <span class="hljs-string">"programmingwithshahan@gmail.com"</span>, to, subject, <span class="hljs-attr">text</span>: message });
}
</code></pre>
<p>⚠️ To save yourself from risk, make sure to avoid <strong>hardcoding</strong> dependencies. Use abstraction or configuration files for secure maintenance.</p>
<p>This is just one example. As a developer, you may use hundreds of libraries or dependencies.</p>
<p>I’m not saying you shouldn’t rely on dependencies/libraries at all, as nowadays it is hard to avoid them. But you should be very careful before installing them in your coding projects.</p>
<p>You should check the security, performance, quality, or functionality of an organization's software systems. Because they sometimes contain risks that can ruin your entire project.</p>
<p>🚧 Always control your tools, don't let them control you.</p>
<h3 id="heading-clean-project-structures"><strong>📂 Clean Project Structures</strong></h3>
<p>A well-organized project is the difference between a <strong>trash heap</strong> and a high-end <strong>boutique</strong>.</p>
<p>Here is how each folder should be organized:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9xwyg9iqqcybz21lsgxz.png" alt="Image of clean code project structure by shahan" width="600" height="400" loading="lazy"></p>
<p>If your codebase looks like a junk drawer, you’ve already caused trouble for your future self.</p>
<p>Let’s go through the clean project structure you can see above to better understand it:</p>
<p><strong>1.</strong> <code>myProjet/src</code></p>
<p>This is the main container for your entire application. Everything your app needs is stored inside this folder. It has subfolders to keep things tidy and managed in one place.</p>
<p><strong>2.</strong> <code>components</code></p>
<p>This is where you keep all the reusable pieces of your app. You can use these components in multiple places without building them again.</p>
<p><strong>3.</strong> <code>services</code></p>
<p>This is the "brain" of your app. It handles all the work behind the scenes for both the frontend and backend. <code>emailService.js</code>, <code>userService.js</code> and <code>productService.js</code> are some of the example files for your <code>services</code> folder.</p>
<p><strong>4.</strong> <code>utils</code></p>
<p>This contains all the small, handy tools you need to make your application run smoothly and make your life easier. For example, <code>formatedate.js</code>, <code>validateEmail.js</code> and <code>generateId.js</code> are some of the common utils files to make reusable pieces of components for your entire project.</p>
<h4 id="heading-5-tests"><strong>5.</strong> <code>tests</code></h4>
<p>Conventionally, test files are typically located <strong>outside</strong> the <code>src</code> folder, at the project root level. This keeps your production code (<code>src</code>) separate from your test code (<code>tests</code>), making it cleaner and easier to manage. Have a look:</p>
<pre><code class="lang-bash">myProject/
├── src/              <span class="hljs-comment"># Production code</span>
│   ├── components/
│   ├── services/
│   └── utils/
├── tests/            <span class="hljs-comment"># Test files</span>
│   ├── components/
│   ├── services/
│   └── utils/
├── package.json      <span class="hljs-comment"># Project configuration</span>
└── README.md         <span class="hljs-comment"># Documentation</span>
</code></pre>
<p>Some developers may prefer creating one testing file inside the <code>test</code> folder to test everything in one place. Unfortunately, it may feel clean at first, but as your project grows, you’ll have to find and search for specific code blocks. It’s ugly and can produce unexpected testing results. So breaking them into multiple testing files inside the <code>tests</code> folder is highly recommended.</p>
<p><strong>Real-world example 📧</strong></p>
<p>So let me create a clean, durable project structure for you to apply in any future projects you might work on. Needless to say, clean project structure is the foundation of building a maintainable project.</p>
<p>From our previous email sending application example, we will write a clean project structure for this app. We want to build an application that sends emails to users. Your clean project structure for this app should look like this:</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6v6rlc5qiplgxz1h4dps.png" alt="Image of email app clean code project structure by shahan" width="600" height="400" loading="lazy"></p>
<p>As you can see, I packed every subfolder and file inside the <code>src</code> folder which is the main container of our application. Inside the <code>src</code> folder, we created <code>components</code>, <code>services</code>, <code>utiles</code>. Finally, we have a manageable <code>test</code> folder outside the <code>src</code> folder to test each component independently. This test folder has nothing to do with our production code that is located inside the <code>src</code> folder.</p>
<h3 id="heading-be-consistent-with-formatting"><strong>🤹‍♂️ Be Consistent with Formatting</strong></h3>
<p>Don’t write code like you’re 10 different people. Be consistent with your formatting.</p>
<p>Use tools like <a target="_blank" href="https://prettier.io/">Prettier</a> or <a target="_blank" href="https://eslint.org/">ESLint</a> to enforce a consistent style. If every file looks different, you’re creating chaos that no one wants to fix.</p>
<p>I would say that consistency in formatting is one of the most important aspects of writing clean code.</p>
<p>Have a look...</p>
<p><img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/46zu4k5nnrkcdesgqrye.png" alt="Image of consistent formatting snippets from clean code zero to one book" width="600" height="400" loading="lazy"></p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Always use 2 spaces for indentation</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateArea</span>(<span class="hljs-params">width, height</span>) </span>{
  <span class="hljs-keyword">if</span> (width &lt;= <span class="hljs-number">0</span> || height &lt;= <span class="hljs-number">0</span>) {
    <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Dimensions must be positive numbers."</span>);
  }
  <span class="hljs-keyword">return</span> width * height;
}

<span class="hljs-comment">// Add meaningful whitespace for readability</span>
<span class="hljs-keyword">const</span> rectangle = {
  <span class="hljs-attr">width</span>: <span class="hljs-number">10</span>,
  <span class="hljs-attr">height</span>: <span class="hljs-number">20</span>,
};

<span class="hljs-comment">// Clear separation of logic</span>
<span class="hljs-keyword">try</span> {
  <span class="hljs-keyword">const</span> area = calculateArea(rectangle.width, rectangle.height);
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Area: <span class="hljs-subst">${area}</span>`</span>);
} <span class="hljs-keyword">catch</span> (error) {
  <span class="hljs-built_in">console</span>.error(error.message);
}
</code></pre>
<p>Let’s examine some of the aspects of this code that make it clean:</p>
<h4 id="heading-1-consistent-indentation">1️⃣ Consistent Indentation</h4>
<p>Why 2 or 4 spaces? It’s clean, minimal, and universally accepted in many JavaScript style guides. It doesn’t overwhelm the eyes, and the code structure stands out clearly. When you mix inconsistent indentation (2 spaces here, 4 spaces there), you confuse people—and confused people make mistakes.</p>
<h4 id="heading-2-meaningful-whitespace-giving-code-room-to-breathe">2️⃣ Meaningful Whitespace: Giving Code Room to Breathe</h4>
<p>That extra line break between the rectangle definition and the <code>try</code> block is like a pause in a sentence — it gives the reader time to process.</p>
<h4 id="heading-3-clear-separation-of-logic-modular-thinking">3️⃣ Clear Separation of Logic: Modular Thinking</h4>
<pre><code class="lang-javascript"><span class="hljs-keyword">try</span> {
  <span class="hljs-keyword">const</span> area = calculateArea(rectangle.width, rectangle.height);
  <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Area: <span class="hljs-subst">${area}</span>`</span>);
} <span class="hljs-keyword">catch</span> (error) {
  <span class="hljs-built_in">console</span>.error(error.message);
}
</code></pre>
<p>Look at how the logic is divided into clear sections:</p>
<ul>
<li><p>First, the calculation (<code>calculateArea</code> function).</p>
</li>
<li><p>Then, the output (<code>console.log</code>).</p>
</li>
<li><p>Finally, error handling (<code>catch</code> block).</p>
</li>
</ul>
<p>Each task has its own space and purpose.</p>
<h4 id="heading-4-readable-error-handling">4️⃣ Readable Error Handling</h4>
<p>When you throw errors or log messages, you format them cleanly. No vague or cryptic messages here. A developer seeing this will immediately know the problem.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Dimensions must be positive numbers."</span>);
</code></pre>
<p><strong>🐦‍⬛ General tips for consistent formatting:</strong></p>
<ul>
<li><p>Use 2 or 4 spaces for indentation consistently throughout your codebase. Avoid tabs to maintain uniformity across different editors.</p>
</li>
<li><p>Keep lines to a maximum of 100-120 characters to prevent horizontal scrolling and improve readability.</p>
</li>
<li><p>Group related logic together and separate blocks of code with blank lines to highlight their purpose.</p>
</li>
<li><p>Finally, avoid over-aligning code. Instead, let indentation naturally guide the flow of logic.</p>
</li>
</ul>
<h3 id="heading-stop-hardcoding-values"><strong>✋ Stop Hardcoding Values</strong></h3>
<p>Hardcoding values is a lazy way to code. Here is the proof:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Bad: Hardcoded and rigid</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">createUser</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">const</span> maxUsers = <span class="hljs-number">100</span>;
    <span class="hljs-keyword">if</span> (currentUsers &gt;= maxUsers) <span class="hljs-keyword">throw</span> <span class="hljs-string">"Too many users!"</span>;
}

<span class="hljs-comment">// Clean: Dynamic and flexible</span>
<span class="hljs-keyword">const</span> MAX_USERS = <span class="hljs-number">100</span>;
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">createUser</span>(<span class="hljs-params"></span>) </span>{
    <span class="hljs-keyword">if</span> (currentUsers &gt;= MAX_USERS) <span class="hljs-keyword">throw</span> <span class="hljs-string">"Too many users!"</span>;
}
</code></pre>
<p>You see, changing this variable won’t surprise you in the future. You know exactly where to find it to change uncertain values.</p>
<p>Its best to store your fixed values in the global configuration (config) file.</p>
<p>🪧 So, avoid hardcoding values at all costs. Hardcoding is the shortcut that may drive your future self (or others) crazy.</p>
<h3 id="heading-keep-functions-short"><strong>🤏 Keep Functions Short</strong></h3>
<p>If your function is longer than 20 lines, it’s probably trying to do too much<em>.</em></p>
<p>Short functions are sharp functions. They hit their mark every time.</p>
<p>Long, bloated functions are messy and hard to read, but short functions are clear and focused. Here is how your large functions should break down:</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">updateCart</span>(<span class="hljs-params">cart, item</span>) </span>{
    addItemToCart(cart, item);
    <span class="hljs-keyword">let</span> total = calculateTotal(cart);
    logTransaction(item, total);
    <span class="hljs-keyword">return</span> total;
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addItemToCart</span>(<span class="hljs-params">cart, item</span>) </span>{
    cart.items.push(item);
}
</code></pre>
<p>Let me explain this code so you understand why breaking down large functions is a winning strategy.</p>
<ol>
<li><p><strong>The Main Function:</strong> <code>updateCart()</code> calls smaller helper functions to handle specific tasks like:</p>
<ul>
<li><p>Adds the item to the cart.</p>
</li>
<li><p>Calculates the total price.</p>
</li>
<li><p>Logs the details of the transaction.</p>
</li>
<li><p>Finally, it returns the total price.</p>
</li>
</ul>
</li>
</ol>
<p>Instead of one long block of code that tries to do everything, it delegates tasks to helper functions.</p>
<ol start="2">
<li><strong>Helper Function:</strong> <code>addItemToCart()</code> This function <strong>only</strong> handles adding the item to the cart. if you need to change how items are added (for example, checking for duplicates). You could just edit this small function instead of digging through a giant block of code in <code>updateCart</code>. That’s how you write clean code functions that’s a joy to read and easy to maintain.</li>
</ol>
<p><strong>What Happens If Functions Are Too Long? 💤</strong></p>
<p>Let’s say you didn’t break down the <code>updateCart</code> function. Here’s what it might look like:</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">updateCart</span>(<span class="hljs-params">cart, item</span>) </span>{
    cart.items.push(item);
    <span class="hljs-keyword">let</span> total = <span class="hljs-number">0</span>;
    <span class="hljs-keyword">for</span> (<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; cart.items.length; i++) {
        total += cart.items[i].price;
    }
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Added <span class="hljs-subst">${item.name}</span>. Total is now $<span class="hljs-subst">${total}</span>.`</span>);
    <span class="hljs-keyword">return</span> total;
}
</code></pre>
<p>What are the problems here?</p>
<ul>
<li><p>It’s trying to do everything.</p>
</li>
<li><p>It’s hard to read, especially if it grows bigger.</p>
</li>
<li><p>If something breaks, you’ll waste time figuring out which part is the problem.</p>
</li>
</ul>
<p>Now the choice is yours: stick with the messy all-in-one approach or practice the clean one function one job mindset.</p>
<h3 id="heading-follow-the-boy-scout-rule"><strong>⛺ Follow the Boy Scout Rule</strong></h3>
<blockquote>
<p>Always leave your campsite cleaner than you found it.</p>
</blockquote>
<p>Let me break it down for you. You don’t just use something and leave it worse than before. That’s inconsiderate behavior. Real professionals leave things better than they found them.</p>
<p>In coding terms, every time you touch the codebase, <strong>make it better.</strong> Clean it up, refactor messy parts, and improve readability. If you don’t, you’re just piling on garbage that will eventually collapse on your head.</p>
<p>Here is an example. Instead of improving it, we’re just adding more layers of complexity:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Original code: Hard to read, poorly named variables</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calc</span>(<span class="hljs-params">a, b</span>) </span>{
  <span class="hljs-keyword">let</span> x = a + b;
  <span class="hljs-keyword">let</span> y = x * <span class="hljs-number">0.2</span>;
  <span class="hljs-keyword">return</span> y;
}

<span class="hljs-comment">// We're adding to it but not cleaning it up</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calcDiscount</span>(<span class="hljs-params">a, b, discountRate</span>) </span>{
  <span class="hljs-keyword">let</span> total = calc(a, b);
  <span class="hljs-keyword">let</span> final = total - discountRate;
  <span class="hljs-keyword">return</span> final;
}
</code></pre>
<p>After: it gets better every time. Here’s how a disciplined coder works — they improve as they go:</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// Improved code: Clear names, refactored for clarity</span>
<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateSubtotal</span>(<span class="hljs-params">price, quantity</span>) </span>{
  <span class="hljs-keyword">return</span> price * quantity;
}

<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculateDiscountedTotal</span>(<span class="hljs-params">price, quantity, discountRate</span>) </span>{
  <span class="hljs-keyword">const</span> subtotal = calculateSubtotal(price, quantity);
  <span class="hljs-keyword">const</span> discount = subtotal * discountRate;
  <span class="hljs-keyword">return</span> subtotal - discount;
}
</code></pre>
<p>Now, anyone can tell what’s happening at a glance. Because we’ve broken down the code into smaller, more focused functions. Thus, adding new features won’t break existing functionality. 🏕️</p>
<h3 id="heading-follow-the-openclosed-principle"><strong>🏟️ Follow the Open/Closed Principle</strong></h3>
<p>This design principle suggests your code should be designed to allow extensions without changing the existing foundation.</p>
<p>You want to add features <em>—</em> not rip it apart every time you upgrade<em>.</em> Modifying old code to fit new requirements is exactly like trying to rebuild your house every time you buy new furniture. It’s not sustainable.</p>
<p>Let’s see how you can build smarter, scalable code that lets you add features without breaking everything else.</p>
<h4 id="heading-before-violating-the-principle">Before: Violating the principle</h4>
<p>You’ve got a class to handle payments — simple enough. At first, it just handles credit cards.</p>
<p>But then your boss shows up and says, <em>“Hey, now we need PayPal support.”</em></p>
<p>And because you didn’t bother learning clean code, your code looks like a spaghetti monster straight out of a legacy enterprise system from 1995. Here’s the masterpiece you’ve crafted:</p>
<pre><code class="lang-javascript"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PaymentProcessor</span> </span>{
  processPayment(paymentType, amount) {
    <span class="hljs-keyword">if</span> (paymentType === <span class="hljs-string">"creditCard"</span>) {
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Processing credit card payment of $<span class="hljs-subst">${amount}</span>`</span>);
    } <span class="hljs-keyword">else</span> <span class="hljs-keyword">if</span> (paymentType === <span class="hljs-string">"paypal"</span>) {
      <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Processing PayPal payment of $<span class="hljs-subst">${amount}</span>`</span>);
    } <span class="hljs-keyword">else</span> {
      <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"Unsupported payment type"</span>);
    }
  }
}

<span class="hljs-keyword">const</span> paymentProcessor = <span class="hljs-keyword">new</span> PaymentProcessor();
paymentProcessor.processPayment(<span class="hljs-string">"creditCard"</span>, <span class="hljs-number">100</span>);
paymentProcessor.processPayment(<span class="hljs-string">"paypal"</span>, <span class="hljs-number">200</span>);
</code></pre>
<p>Alas! Every new payment type (like Apple Pay, Google Pay, and so on) requires modifying the <code>processPayment</code> method. Needless to say, you risk breaking existing functionality while adding new features. If you had learned this principle, you might not be in this mess.</p>
<p>Don’t worry: I’ll help you to fix this. First, we need to refactor the code. Instead of modifying the existing class, we’ll extend its functionality using <a target="_blank" href="https://stackify.com/oop-concept-polymorphism/">polymorphism</a>:</p>
<pre><code class="lang-javascript">javascriptCopy code<span class="hljs-comment">// Base class</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PaymentProcessor</span> </span>{
  processPayment(amount) {
    <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> <span class="hljs-built_in">Error</span>(<span class="hljs-string">"processPayment() must be implemented"</span>);
  }
}

<span class="hljs-comment">// Credit card payment</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">CreditCardPayment</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">PaymentProcessor</span> </span>{
  processPayment(amount) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Processing credit card payment of $<span class="hljs-subst">${amount}</span>`</span>);
  }
}

<span class="hljs-comment">// PayPal payment</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">PayPalPayment</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">PaymentProcessor</span> </span>{
  processPayment(amount) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Processing PayPal payment of $<span class="hljs-subst">${amount}</span>`</span>);
  }
}

<span class="hljs-comment">// Adding a new payment type? Just extend the class!</span>
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ApplePayPayment</span> <span class="hljs-keyword">extends</span> <span class="hljs-title">PaymentProcessor</span> </span>{
  processPayment(amount) {
    <span class="hljs-built_in">console</span>.log(<span class="hljs-string">`Processing Apple Pay payment of $<span class="hljs-subst">${amount}</span>`</span>);
  }
}

<span class="hljs-comment">// Usage</span>
<span class="hljs-keyword">const</span> payments = [
  <span class="hljs-keyword">new</span> CreditCardPayment(),
  <span class="hljs-keyword">new</span> PayPalPayment(),
  <span class="hljs-keyword">new</span> ApplePayPayment(),
];

payments.forEach(<span class="hljs-function">(<span class="hljs-params">payment</span>) =&gt;</span> payment.processPayment(<span class="hljs-number">100</span>));
</code></pre>
<p>Now, adding new payment methods doesn’t require changing the existing <code>PaymentProcessor</code> class. You just created a new subclass. So the original code remains untouched, meaning there’s no risk of breaking existing features.</p>
<p>Each payment type has its own class, and adding PayPal payment support, for example, doesn’t break the code. Now you can reply to your boss: <em>“Of course, I will add this feature in 5 minutes.”</em> Your promotion is waiting for you to accept it.</p>
<p>I share even more tips in my book <a target="_blank" href="https://codewithshahan.gumroad.com/l/cleancode-zero-to-one">Clean Code Zero to One</a>.</p>
<h2 id="heading-modern-best-practices-to-help-you-write-clean-code-a-summary">Modern Best Practices to Help You Write Clean Code: A Summary 🥷</h2>
<p>Now let me show you the best practices and summarise our 12 Clean Code design principles to help you write clean code for agile application development.</p>
<h3 id="heading-common-code-smells-and-how-to-fix-them">🔎 Common Code Smells and How to Fix Them</h3>
<ul>
<li><p>💊 Duplication: If you're copying code, you’re creating more work for yourself. Extract it into a function, and do it right.</p>
</li>
<li><p>🛤️ Long methods: If your method needs a scroll bar, it's doing too much. Break it down, keep it focused.</p>
</li>
<li><p>👑 King objects: No class should be doing everything. Simplify responsibilities, or your codebase will become messy.</p>
</li>
</ul>
<h3 id="heading-effective-commenting-practices">💬 Effective Commenting Practices</h3>
<ul>
<li><p>💭 When to comment: Only comment if the code isn't clear. If it is, comments are just clutter.</p>
</li>
<li><p>🫗 Clarity: Comments should tell why, not what. If your code needs explaining, it might be too complex.</p>
</li>
<li><p>🌴 Avoid redundancy: Don't comment what's obvious. If your function is addNumbers, don't comment it does that.</p>
</li>
</ul>
<h3 id="heading-refactoring-techniques-for-clean-code">🧼 Refactoring Techniques for Clean Code</h3>
<ul>
<li><p>🏭 Extract methods: Big methods? Break them down. It's not just about cleanliness –– it's about control.</p>
</li>
<li><p>🫕Rename variables: If your variable names don’t shout their purpose, change and improve them. Precision in naming is precision in thought.</p>
</li>
<li><p>🍃 Simplify conditionals: If your conditionals look like algebra, simplify them. If a == true, just write if(a).</p>
</li>
</ul>
<h3 id="heading-testing-and-clean-code">🧪 Testing and Clean Code</h3>
<ul>
<li><p>🧙 Unit tests: Test every piece of code like you're interrogating a suspect. No stone unturned.</p>
</li>
<li><p>🏇TDD (Test Driven Development): Write tests first. It's not just about catching bugs, it's about knowing exactly what your code should do before you write it.</p>
</li>
<li><p>🧽 Clean tests: Your tests should be as clean as your code. If they're messy, they’re not going to be helpful.</p>
</li>
</ul>
<h3 id="heading-error-handling-and-clean-code">🐛 Error Handling and Clean Code</h3>
<ul>
<li><p>⁉️ Exceptions: Use them. They're not just for errors, they're also for keeping your code clean from error clutter.</p>
</li>
<li><p>🖍️ Fail fast: If something's wrong, stop right there. Don't let errors add up. Deal with them immediately.</p>
</li>
<li><p>🚨 Logging: Log like you're documenting a crime scene. Clear, precise, and only what's necessary.</p>
</li>
</ul>
<h3 id="heading-code-reviews-and-clean-code">🌱 Code Reviews and Clean Code</h3>
<ul>
<li><p>🚢 Process: Have a system. No cowboy coding. Review, critique, improve.</p>
</li>
<li><p>🔪 Tools: Use tools that make reviews easy. They're not just for catching mistakes, they're also for teaching discipline.</p>
</li>
<li><p>🧦 Culture: Cultivate a culture where feedback is gold. Help your team learn how to handle and receive critiques.</p>
</li>
</ul>
<h2 id="heading-automated-tools-for-maintaining-clean-code">Automated Tools for Maintaining Clean Code ⚓</h2>
<p>Tools and automation techniques can be really helpful in writing clean code. If you’re not using the right tools and automating things to save yourself time, you’re missing out.</p>
<p>You think you can "eyeball" your way through code quality? Guess again. Without automation, this is what happens:</p>
<ol>
<li><p>👎 You miss obvious mistakes because you're "too busy."</p>
</li>
<li><p>🤕 Your code looks different in every file, making collaboration a headache.</p>
</li>
<li><p>🪦 Deployment breaks because you skipped a critical test.</p>
</li>
</ol>
<p>Successful developers use the right tools to automate code and get things done. Here are four strategies for maintaining clean code using modern tools.</p>
<h3 id="heading-1-static-analysis"><strong>1️⃣ Static Analysis</strong></h3>
<p>Static analysis is actually a code inspector that reads through your code and points out potential issues early on. The best part? It works <strong>before</strong> runtime, catching errors that could otherwise lead to crashes, downtime, or embarrassing bugs.</p>
<h4 id="heading-how-does-it-work"><strong>How does it work?</strong></h4>
<ol>
<li><p><strong>Syntax checking</strong>: It looks at your code to analyze everything written in the correct syntax. If you misspell a variable or forget a closing bracket, it’ll call you out instantly.</p>
</li>
<li><p><strong>Code quality rules</strong>: Tools like ESLint enforce rules like consistent indentation, avoiding unused variables, and sticking to best practices.</p>
</li>
<li><p><strong>Error prevention</strong>: It identifies logic errors, such as using variables that haven’t been defined, or making comparisons that don’t make sense.</p>
</li>
</ol>
<p>Here’s how static analysis works in action:</p>
<h4 id="heading-before-static-analysis">🚨 Before static analysis:</h4>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> sum = <span class="hljs-function">(<span class="hljs-params">a, b</span>) =&gt;</span> { <span class="hljs-keyword">return</span> a + b; }
<span class="hljs-built_in">console</span>.log(sume(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>)); <span class="hljs-comment">// Typo, unnoticed until runtime</span>
</code></pre>
<ul>
<li><strong>Problem</strong>: The typo in <code>sume</code> will only cause an error when the code runs, and that could lead to frustrating debugging sessions or worse — breaking the app in production.</li>
</ul>
<h4 id="heading-after-static-analysis-using-eslint">🚑 After static analysis (using ESLint):</h4>
<pre><code class="lang-javascript">codeError: <span class="hljs-string">'sume'</span> is not defined.
</code></pre>
<ul>
<li><strong>Solution</strong>: <a target="_blank" href="https://eslint.org/">ESLint</a> immediately flags the typo before you even run the code. The error is caught early, saving you time and headaches.</li>
</ul>
<h3 id="heading-2-automated-code-formatting"><strong>2️⃣ Automated Code Formatting</strong></h3>
<p>Before Formatting:</p>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculate</span> (<span class="hljs-params"> x , y </span>)</span>{ <span class="hljs-keyword">return</span> x+ y;}
<span class="hljs-built_in">console</span>.log( calculate (<span class="hljs-number">2</span>,<span class="hljs-number">3</span> ) )
</code></pre>
<ul>
<li><strong>Problem</strong>: Inconsistent spacing and formatting make the code harder to read.</li>
</ul>
<h4 id="heading-after-using-prettier">After using Prettier:</h4>
<pre><code class="lang-javascript"><span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">calculate</span>(<span class="hljs-params">x, y</span>) </span>{
  <span class="hljs-keyword">return</span> x + y;
}
<span class="hljs-built_in">console</span>.log(calculate(<span class="hljs-number">2</span>, <span class="hljs-number">3</span>));
</code></pre>
<ul>
<li><strong>Solution</strong>: Clean, consistent, and professional formatting is applied automatically. No more nitpicking over spaces or alignment.</li>
</ul>
<p>Pretty basic stuff though. I covered this in case you write code in notepad or something where IDE is not provided (for example, a job interview).</p>
<h3 id="heading-3-continuous-integration-ci-testing"><strong>3️⃣ Continuous Integration (CI) Testing</strong></h3>
<p>CI testing make sure every new change to your code is verified automatically. It’s like a safety net that catches bugs introduced during development. CI tools run your tests every time you push code, so nothing breaks after deployment.</p>
<h4 id="heading-how-does-ci-testing-work"><strong>How Does CI Testing Work?</strong></h4>
<ol>
<li><p><strong>Triggers on change</strong>: Each time code is committed, the CI tool (like <a target="_blank" href="https://github.com/features/actions">GitHub Actions</a>, <a target="_blank" href="https://www.jenkins.io/">Jenkins</a>) runs automated tests.</p>
</li>
<li><p><strong>Feedback</strong>: It gives you instant feedback if something fails.</p>
</li>
<li><p><strong>Prevents broken code</strong>: Commits only clean, and the working code gets merged into the main branch.</p>
</li>
</ol>
<h3 id="heading-4-cicd-pipelines"><strong>4️⃣ CI/CD pipelines</strong></h3>
<p>We also use CI/CD pipelines as a continuous process that includes code building, testing, and deployment, while CI testing is a part of that process that focuses on automating the testing of code changes. </p>
<p><strong>Differece between CI/CD pipelines vs CI testing:</strong></p>
<ul>
<li><p><strong>CI/CD pipelines:</strong> A CI/CD pipeline combines code building, testing, and deployment into a single process. This process make sure that all changes to the main branch code are releasable to production. CI/CD pipelines can reduce deployment time, decrease costs, and improve team collaboration. </p>
</li>
<li><p><strong>CI testing:</strong> CI testing is the process of automatically testing code changes that are integrated into a central repository. CI testing focuses on making sure the codebase is stable and that integration issues are resolved. CI testing help developer build software that is stable, bug-free, and meets functional requirements</p>
</li>
</ul>
<p>🚧 This is what CI testing CI/CD pipelines concepts are really about. Not as complex as it seems. So let me elaborate more on CI testing with GitHub Actions, as we usually run tests through automated tools nowadays.</p>
<h3 id="heading-continuous-integration-ci-testing-with-github-actions"><strong>⚡ Continuous Integration (CI) Testing with GitHub Actions</strong></h3>
<p>As I said earlier, CI tools run automated tests every time you push code or open a pull request. This guarantees that only working, bug-free code gets merged into the main branch.</p>
<h4 id="heading-how-to-set-up-ci-testing-with-github-actions">How to Set Up CI Testing with GitHub Actions</h4>
<p><strong>Step 1: Create Your Repository</strong></p>
<p>Set up a GitHub repository for your project. Then, push your code to GitHub using the following commands:</p>
<pre><code class="lang-bash">git init
git add .
git commit -m <span class="hljs-string">"Initial commit for CI Testing"</span>
git branch -M main
git remote add origin https://github.com/codewithshahan/codewithshahan.git
git push -u origin main
</code></pre>
<p>Or you can create a new repo from your GitHub account without using the command. Just login to your GItHub account and visit dashboard. Here you will find a “New” button to create a brand new repo:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737618697327/dcef8be8-0d08-45d7-8000-34c4c65df425.png" alt="image of creating a new repo on github by Shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p><strong>Step 2: Add a GitHub Actions Workflow</strong></p>
<p>Navigate to your repository’s <strong>Actions</strong> tab. To do this, first, you have to visit your repo on Github (you will find the link after creating your repo). In this case, I created a new repo called “codewithshahan”. Here, look for the <strong>Actions</strong> tab on the right side of the navigation bar.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737618879398/7c5aa37a-72be-4701-a8f8-9ea9e05c0d5d.png" alt="Image of github actions navigation tab by shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>After navigating the Actions tab, scroll down a little and you will find the <strong>continuous integration</strong> section:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737619002674/60003e57-f2b2-48f1-bef8-9bde39149faf.png" alt="Image of CI (Continuous Integration) testing on Github Actions Page by Shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>Choose a setup workflow yourself. I will use Node.js for this project.</p>
<p>After clicking the configure button, a <code>node.js.yml</code> file will be created automatically, and you can adjust the code depending on your goals.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1737619475568/74da6d46-c105-42c8-8662-fc72e9410bda.png" alt="Image of GitHub workflow snippet for automated testing by Shahan" class="image--center mx-auto" width="600" height="400" loading="lazy"></p>
<p>I won’t go into detail about how should modify your <code>.yml</code> file. It depends on your project goals and personal preference. Also, it is a whole different broader topic and as this article has already become quite long, so I’ll explain it in a future article. For now, just stick with this foundational knowledge.</p>
<p>This CI Testing workflow is best for modern application development. Your app remains stable while incorporating key features including testing (e,g. Dark Mode), Building and deploying applications directly within your GitHub repository. This way, you can push your code confidently, knowing your code is always clean and ready for production.</p>
<h2 id="heading-the-role-of-documentation-in-agile-software-development">The Role of Documentation in Agile Software Development 🚣</h2>
<p>If you want your code to be top-notch, you need to understand how to write good documentation. If you think documentation is just about scribbling down how the code works, you’re wrong. It's about explaining <strong>why</strong> it works, not just how it works. That’s where most people miss the mark.</p>
<h3 id="heading-1-create-useful-docs-explain-why-not-just-how">1. 🚡 Create <strong>Useful Docs (Explain Why, Not Just How)</strong></h3>
<p>When you write documentation, you're not just throwing down some instructions for how to use the code. You're telling the next person (or even yourself in the future) why this piece of code exists in the first place. That’s the difference between good and bad documentation.</p>
<p>Bad docs leave people scratching their heads. They’re too vague, too simple, and they don’t answer the big questions. If your documentation is unclear, that likely means your thinking is unclear. You’re basically saying, <em>"I don’t care if you understand this, it works, just use it."</em> That’s not helpful.</p>
<p>Great documentation answers the tough questions:</p>
<ul>
<li><p>✅ Why did you choose this approach over another?</p>
</li>
<li><p>✅ Why does this function exist? What problem does it solve?</p>
</li>
<li><p>✅ Why did you write this code the way you did?</p>
</li>
</ul>
<p>If your docs are just regurgitating how to use the code, you’re not being as helpful as you can be. Start thinking deeper and explaining the reasoning behind everything.</p>
<h3 id="heading-2-keep-the-docs-updated-outdated-docs-are-worse-than-no-docs">2. ⏳ <strong>Keep the Docs Updated (Outdated Docs Are Worse Than No Docs)</strong></h3>
<p>Outdated documentation is the worst. In fact, it can be worse than having no docs at all. When you leave documentation that’s out of sync with the code, you’re doing your future self — or whoever has to deal with it next — a huge disservice.</p>
<p>Every time your code changes, your documentation needs to change too. It has to reflect the current state of things. Don’t mislead future developers (or yourself) by leaving outdated info that will only confuse them and waste their time. If something is no longer relevant, delete it. Outdated documentation is the equivalent of a cluttered mind — it holds you back.</p>
<p>Make it a habit to check and update your documentation regularly. The minute a line of code changes, so should your documentation. Period.</p>
<h3 id="heading-3-integrate-comments-good-comments-in-code-are-part-of-documentation">3. 🚆 <strong>Integrate Comments (Good Comments in Code Are Part of Documentation)</strong></h3>
<p>Here’s the deal — comments in your code should <strong>integrate</strong> with your documentation. Good comments aren’t just a crutch for developers who can’t explain their code elsewhere. They should improve your docs, not replace them.</p>
<p>Comments are supplements to your documentation. You write clean, understandable code that needs minimal explanation, but when something isn’t crystal clear, throw in a comment. Remember the rule for comments in your code: explain the <strong>why</strong>, not the <strong>how</strong>. It’s the same here. Don’t repeat yourself. Let your code do the talking. Comments should complement the bigger picture of your documentation, not act as a band-aid for sloppy code.</p>
<p>🪧 Great code should be self-explanatory. Fix the code, then add comments for clarification if necessary. Keep comments clean, short, and to the point.</p>
<p>If you want to write clean, efficient, and maintainable code, documentation is key. Stop thinking of docs as an afterthought or something you do to fill space. It’s an extension of your code — your way of communicating clearly and effectively. It’s your roadmap for future developers, and it’s a reflection of your thought process.</p>
<h2 id="heading-conclusion">Conclusion 🏁</h2>
<p>Clean code isn't a nice-to-have –– it's a must-have for those who aim to lead. It's about control, efficiency, and improvement over time in the long run. And ultimately, it’ll help you succeed in the game of agile software development.</p>
<p>🪧 If you want to truly master your craftsmanship, write clean code, and let the efficiency speak for itself.</p>
<h2 id="heading-frequently-asked-questions-about-clean-code">Frequently Asked Questions About Clean Code 🧯</h2>
<ol>
<li><p><strong>What is clean code?</strong> It's code that doesn't make you want to throw your laptop out the window.</p>
</li>
<li><p><strong>Why is clean code important in Agile?</strong> Because Agile is about speed and change, and you can't be quick with a mess.</p>
</li>
<li><p><strong>What are code smells?</strong> Signs that you're about to lose control of your codebase.</p>
</li>
<li><p><strong>How can I improve commenting?</strong> Only comment on what's necessary, and make sure each comment adds value, not noise.</p>
</li>
</ol>
<p>Thank you for being with me. You can visit my <a target="_blank" href="https://x.com/shahancd">Twitter account</a> or <a target="_blank" href="https://www.codewithshahan.com">my website</a> to read more posts about clean code and Agile application development. Until next time… keep improving your codebase.</p>
<p>If you’re serious about mastering clean code and taking your programming career to the next level, then my book is for you: <a target="_blank" href="https://codewithshahan.gumroad.com/l/cleancode-zero-to-one"><strong>Clean Code Zero to One</strong></a>. This book is your full guide from zero to one in clean code, from messy code to masterpiece. I am offering a 50% discount using the code "earlybird" — only for the first 50 copies. Plus, there’s a 30-day money-back guarantee — no risk, all reward.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Run a Great Sprint Review – Actionable Tips for Developers and Teams ]]>
                </title>
                <description>
                    <![CDATA[ In my twenty years of being in the Software Engineer game, I’ve been through lots of Sprint Reviews. I’ve seen them done well, and I’ve seen them used as no more than a few hours every sprint for people to take a nice break in a meeting room. When do... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-run-a-great-sprint-review-actionable-insights/</link>
                <guid isPermaLink="false">679a5f09bd88c0851092079d</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                    <category>
                        <![CDATA[ planning ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ben ]]>
                </dc:creator>
                <pubDate>Wed, 29 Jan 2025 17:02:01 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1738170100236/fcc7407a-3b08-493f-a704-661eed12f369.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>In my twenty years of being in the Software Engineer game, I’ve been through lots of Sprint Reviews. I’ve seen them done well, and I’ve seen them used as no more than a few hours every sprint for people to take a nice break in a meeting room.</p>
<p>When done right, the Sprint Review can be key to keeping your project on track. But badly run Sprint Reviews are worse than just the time they waste – they also reduce people’s trust in Scrum as a whole.</p>
<p>In this article, I’ll walk you through some clear, step-by-step ideas for making your Sprint Review more valuable.</p>
<h2 id="heading-what-is-a-sprint-review"><strong>What is a Sprint Review?</strong></h2>
<p>A <strong>Sprint Review</strong> is a short session held at the end of each sprint, usually once every couple of weeks.</p>
<p>It allows the team to show what they have completed via demos, get feedback, and decide what happens next.</p>
<p>When run well, the Sprint Review shows progress and builds trust with the people who have a stake in the product and project.</p>
<p>Sure, you can tell the stakeholders you are on track, but if they can see it with their own eyes in the Sprint Review, they’ll be much happier.</p>
<h2 id="heading-who-should-be-in-the-review">Who Should Be in the Review?</h2>
<p>In short, anyone who wants to be. Anyone who is a project stakeholder in any capacity can and should attend the meetings.</p>
<p>The scrum team themselves are the core of the meeting, but there can also be Sales, Senior Management, other scrum teams, and Project Managers.</p>
<p>In short, if someone could have good input on a project or could get something out of learning something about a project, they should attend.</p>
<h2 id="heading-what-to-do-before-the-review">What to Do Before the Review</h2>
<p>To ensure that the meeting itself runs as smoothly as possible, you need to make sure that everyone presenting is ready and has a demo ready to show.</p>
<p>In my experience, live demos don’t work. Well, sometimes they do, but mostly they don’t.</p>
<p>Get the people who have a demo to at least record themselves showing their workflow prior to the meeting. That way, if they insist on doing a live demo, they have a recorded video as a backup if it goes wrong.</p>
<p>You should also have a running order. Know who is presenting, in which order, and group them by similarity of topic. Who presents and when doesn’t really matter as long as the presentations are grouped together by topic.</p>
<p>For instance, if you have six engineers – two working on a Login Page, two working on new back-end service, and two working on database performance – make sure that your running order groups these three distinct areas together.</p>
<p>If two demos are fairly similar, you can explain the context once and then run through both demos back to back. Be efficient, as you have a lot of people in this meeting and everyone knows that <a target="_blank" href="https://calculatorlord.com/meeting-cost-calculator/">meetings are expensive</a>.</p>
<h2 id="heading-during-the-review">During the Review</h2>
<p>The Software Engineers who have completed a piece of work will present the work to the other members of the scrum team (Product, QA, and so on) as well as all stakeholders who have attended.</p>
<p>After each Engineer has presented, anyone in the room is free to either ask questions or make comments about the work/presentation.</p>
<p>These questions can simply be to fill in knowledge gaps for people who know less about the project, or they can be questions about why a particular solution was chosen.</p>
<p>Product or more business-focused members of the audience may now give feedback on whether what was demonstrated matches the business intent of what was asked to be delivered.</p>
<p>Once all questions and comments have been addressed, the next Engineer will present their work.</p>
<p>In a Sprint Review, everyone is encouraged to speak, but generally it’s only Engineers who present. So the Engineer will present what they have worked on, then Product, QA, BA, and so on can give feedback and ask questions specifically about what the engineer has presented.</p>
<h2 id="heading-example-review">Example Review</h2>
<p>Let’s take a look at an example review and what that may look like.</p>
<p>We’ll use the example above of having six engineers: two working on a Login Page, two working on a back-end service, and two working on database performance. In that case, you may have a running order like this:</p>
<p>Presentations:</p>
<ol>
<li><p>Larry: <em>User Exceeds Max login attempts and the user account gets locked after the fifth incorrect password. User has to reset password before they can login again.</em></p>
</li>
<li><p>David: <em>User clicks forgotten password link and a link is sent to their email address. The user follows this link and is able to reset their password.</em></p>
</li>
<li><p>Premilla: <em>Reporting Service consumes the “User Exceeded Max Login Attempts” event and publishes it to the reporting dashboard.</em></p>
</li>
<li><p>Akshat: <em>Reporting Service consumes the “User Clicked Forgotten Password” event and publishes this to the reporting dashboard</em></p>
</li>
<li><p>Olga: <em>An Admin User can view the reporting dashboard for a month and load the report within 3 seconds.</em></p>
</li>
<li><p>Trevor: <em>An Admin User can view the events from multiple users combined in to one dashboard and load the report within 2 seconds.</em></p>
</li>
</ol>
<p>As you can see here, the two login page user stories are demonstrated first, then the two reporting service stories, and then the two database speed stories. This requires less context switching for the members of the audience and means that context only needs to be given at the beginning of the first of the two grouped stories (that is, presentations 1, 3 and 5).</p>
<p>After presentation 1 (by Larry), Product may ask why he chose 5 retries as the maximum amount of retries before locking the account. Larry may have an answer, or he may not. Product can either ask to have a follow up on this later and find out what the industry standard is and apply that to Larry’s logic, or just leave it as it is.</p>
<p>After each of the six presentations, there could be questions, comments, and change requests by anyone in the audience. Typically this will then spark a conversation amongst the audience about the best approach.</p>
<p>For instance, in Larry’s example again, some may argue that they should not even be using a username and password, but instead should use an email address and <a target="_blank" href="https://www.pingidentity.com/en/resources/blog/post/what-is-magic-link-login.html">magic link</a>. This is the beauty of the review. You have a lot of smart people in a room bringing their own experience and expertise.</p>
<h2 id="heading-actionable-takeaways"><strong>Actionable Takeaways</strong></h2>
<p>Here are some tips for what to show, how to show it, and what actually matters during the meeting itself.</p>
<h3 id="heading-1-showcase-real-deliverables">1. Showcase Real Deliverables</h3>
<p>First, always present working software or completed work rather than static slides. For instance, if you built a new login feature, do a live demo. This makes the review more genuine and shows tangible progress.</p>
<h3 id="heading-2-encourage-open-feedback">2. Encourage Open Feedback</h3>
<p>Second, invite questions from everyone. Remind stakeholders that their ideas can help shape future work. Write down their suggestions, and confirm whether any changes should go straight into your backlog.</p>
<h3 id="heading-3-keep-it-clear-and-on-track">3. Keep It Clear and On Track</h3>
<p>Third, maintain a simple format. For example, start with a quick overview of the sprint goal, move to demos, and end with a short discussion of next steps.</p>
<p>Avoid going too deep into technical details. If a topic needs more time, set up a follow-up chat.</p>
<h3 id="heading-4-align-on-next-steps">4. Align on Next Steps</h3>
<p>After that, update your backlog based on what you learned. If a feature needs an extra tweak, add that task right away.</p>
<p>This helps the entire group stay informed about the plan for the upcoming sprint.</p>
<h3 id="heading-5-keep-it-short-and-end-on-time">5. Keep it short and end on Time</h3>
<p>You should be reviewing one scrum team’s work for one sprint (two or three weeks).</p>
<p>If your meetings are running on for too long, it either means that your scrum team is too large (in which case, you should think about splitting your scrum team into <a target="_blank" href="https://namegenerators.online/scrum-team-name-generator/">smaller teams</a>), or you are not efficient enough with your demos.</p>
<p>People’s time and attention is expensive and in short supply. Keep the meetings to no more than one <a target="_blank" href="https://en.wikipedia.org/wiki/Basic_rest%E2%80%93activity_cycle">ultradian cycle</a>. I personally try to limit all of the meetings I run to a max of 90 minutes.</p>
<p>Lastly, set a firm limit for the meeting so that participants feel confident bringing their feedback without dragging out the discussion.</p>
<p>Wrapping up on time respects everyone’s schedule and keeps the team fresh for the next sprint.</p>
<h2 id="heading-in-summary"><strong>In Summary</strong></h2>
<p>A Sprint Review gives stakeholders a real-time look at completed work, ensures alignment on what’s next, and gathers the feedback you need to grow your product effectively.</p>
<p>If you focus on showing real progress, inviting open dialogue, and keeping things concise, you’ll see a steady improvement in how your team delivers.</p>
<p><em>In his spare time, Ben writes his tech blog</em> <a target="_blank" href="https://justanothertechlead.com/"><em>Just Another Tech Lead</em></a> <em>and runs a site creating forever-free online calaculators at</em> <a target="_blank" href="https://calculatorlord.com/"><em>CalculatorLord.com</em></a><em>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Write User Stories for Beginners: Agile in Practice ]]>
                </title>
                <description>
                    <![CDATA[ In this tutorial, you’ll learn about an important part of the Agile approach to software development: user stories. I’ll take you through what user stories are, common pitfalls that I’ve seen with creating user stories, and the frameworks that exist ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-write-user-stories-for-beginners/</link>
                <guid isPermaLink="false">676081a802767316a74098de</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ user stories ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Ben ]]>
                </dc:creator>
                <pubDate>Mon, 16 Dec 2024 19:38:16 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1734447615195/2b7c6025-bce2-447e-a685-19f785dcd402.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>In this tutorial, you’ll learn about an important part of the Agile approach to software development: user stories.</p>
<p>I’ll take you through what user stories are, common pitfalls that I’ve seen with creating user stories, and the frameworks that exist to validate if your user story is “good”.</p>
<h3 id="heading-heres-what-well-cover">Here’s what we’ll cover:</h3>
<ul>
<li><p><a class="post-section-overview" href="#the-beginnings-of-agile">The beginnings of Agile</a></p>
</li>
<li><p><a class="post-section-overview" href="#what-is-agile">What is Agile?</a></p>
</li>
<li><p><a class="post-section-overview" href="#what-is-a-user-story">What is a User Story?</a></p>
<ul>
<li><p><a class="post-section-overview" href="#structure-of-a-user-story">Structure of a User Story</a></p>
</li>
<li><p><a class="post-section-overview" href="#example-of-user-stories">Example of User Stories</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#how-to-make-good-user-stories">How to make good User Stories</a></p>
</li>
<li><p><a class="post-section-overview" href="#common-pitfalls-in-user-story-creation">Common pitfalls in User Story creation</a></p>
<ul>
<li><p><a class="post-section-overview" href="#focusing-on-the-technical-aspects">Focusing on the technical aspects</a></p>
</li>
<li><p><a class="post-section-overview" href="#stakeholder-collaboration">Stakeholder Collaboration</a></p>
</li>
<li><p><a class="post-section-overview" href="#vague-user-stories">Vague User Stories</a></p>
</li>
</ul>
</li>
<li><p><a class="post-section-overview" href="#how-to-begin-with-user-stories">How to begin with User Stories</a></p>
</li>
<li><p><a class="post-section-overview" href="#conclusion">Conclusion</a></p>
</li>
</ul>
<h2 id="heading-the-beginnings-of-agile">The Beginnings of Agile</h2>
<p>Chances are that you’ve heard of Agile Development and User Stories. But if you haven’t, let’s have a brief history lesson:</p>
<p>User Stories are part of a larger concept called Agile methodologies.</p>
<p>Agile methodologies have been around since 2001 when 17 well-respected software engineers met at a Ski resort in Utah and created the now infamous <a target="_blank" href="https://agilemanifesto.org/">Agile Manifesto</a>.</p>
<p>If names such as Robert Martin, Martin Fowler and Kent Beck don’t mean anything to you, once you’ve finished this article, go and search them out. They have a wealth of knowledge and between them gave the world of software a more fluid way of delivering projects, called Agiile.</p>
<h2 id="heading-what-is-agile">What is Agile?</h2>
<p>Agile is more of a way of thinking than a prescribed method. Prescribed methods exist, such as Scrum and Kanban, but Agile is a concept.</p>
<p>Agile promotes collaboration, fast feedback, and delivering value often to the user.</p>
<p>The Agile way of thinking encourages flexibility in project planning, which is in stark contrast to its competitor at the time, Waterfall project planning, which was very rigid with what was being delivered and when.</p>
<p>Agile methodologies promote doing “just enough” research at the beginning to get the project started, and then learning, iterating, and changing the design and deliverable as needed throughout the project until the final code is delivered. This “change and learn as you go” approach is called “adaptive planning”.</p>
<p>Agile promotes delivering something of value quickly and often, usually in the form of delivering code to production at the end of every two week “sprint”. This, again, is very different from traditional waterfall planning which would often require months of development before any user-visible change could be delivered to production.</p>
<p>Another key part of Agile is the focus it puts on stakeholders working together closely and often. Product, QA, Engineering, and Sales all have a large input and constant feedback on the project through the project lifecycle.</p>
<p>Now that you know a bit more about how Agile works, let’s dive deeper into how we validate value to the user.</p>
<p>Enter the User Story.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733997119683/6002c66a-b11c-4607-a37f-36480a970099.jpeg" alt="Photo by Mikhail Nilov: https://www.pexels.com/photo/a-hand-pointing-the-sticky-note-on-the-wall-6592358/" class="image--center mx-auto" width="4000" height="6000" loading="lazy"></p>
<h2 id="heading-what-is-a-user-story">What is a User Story?</h2>
<p>A user story is way in plain English to connect the engineer to the end goal of the software.</p>
<p>It’s designed so that a non-techy can read it and understand what is being delivered, and so that an engineer can look at it and see the value and how to validate that you’ve delivered that value.</p>
<h3 id="heading-structure-of-a-user-story">Structure of a User Story</h3>
<blockquote>
<p>As a [type of user], when I [perform action], [expected outcome]</p>
</blockquote>
<p>At its most basic, that is it.</p>
<p>You are putting the emphasis on the end user and the “value” that you will deliver.</p>
<p>Let’s dig into the inputs:</p>
<ul>
<li><p><strong>Type of user</strong>: There is no one size fits all “user”. You have “admin users”, you have “logged-in users”, you have “users with permission X” or “users in role Y”. This is being specific about who is performing the action</p>
</li>
<li><p><strong>Perform action</strong>: What is the user doing? Clicking the “login” button? Deleting a record? Submitting a form?</p>
</li>
<li><p><strong>Expected outcome</strong>: Once your user has performed the action, what should happen? If they’ve clicked “login” with the correct email address and password, where should they be directed? If they’ve clicked “login” with an incorrect email address and password, what should happen?</p>
</li>
</ul>
<h3 id="heading-example-of-user-stories">Example of User Stories</h3>
<p>Let’s look at examples of user stories for a login page.</p>
<p>There’s nothing better than examples.</p>
<p>Let’s set the scene. You have a login page with an entry text box for an email address and an entry text box for a password. You have a submit button. That’s it.</p>
<p>What are the different permutations that can happen on this page from the user’s perspective?</p>
<blockquote>
<p>As a logged in user, when the page loads, I am redirected to the logged in home page</p>
</blockquote>
<p>If I’m already logged in, I don’t want to have to reenter my details, just redirect me to the logged-in home page.</p>
<blockquote>
<p>As a non logged in user, when I enter the correct email address but incorrect password and click Login, an error message appears</p>
</blockquote>
<p>I’m a user who’s not already logged in, and I entered the incorrect details. I should not be logged in.</p>
<blockquote>
<p>As a non logged in user, when I enter an incorrect email address and password and click login, an error message appears.</p>
</blockquote>
<p>Again. I’m not a logged-in user. I’ve entered incorrect details, I should not be logged in.</p>
<blockquote>
<p>As a non logged in user, when I enter the correct email address and password and click login, I am rediected to the logged in home page.</p>
</blockquote>
<p>This time, I’m not already logged in, I enter the correct details and click login. I’m logged in to the system.</p>
<p>Can you see how all of these are focused on the user?</p>
<p>You may notice that some of the “expected behaviour” in the above is not fully defined. We’ll address that later in the acceptance criteria.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1733997173211/1946f2a3-eee3-497e-960b-a6aeac9bd48d.jpeg" alt="Photo by cottonbro studio: https://www.pexels.com/photo/manager-considering-project-strategy-by-the-task-board-6804077/" class="image--center mx-auto" width="5100" height="3400" loading="lazy"></p>
<h2 id="heading-how-to-make-good-user-stories">How to make good User Stories</h2>
<p>There’s a good model called the INVEST model that really simply shows how to know if your user stories are good.</p>
<p><strong>INVEST Model</strong>:</p>
<ul>
<li><p><strong>I</strong>ndependent: Can be developed separately.</p>
</li>
<li><p><strong>N</strong>egotiable: Open to discussion and change.</p>
</li>
<li><p><strong>V</strong>aluable: Delivers value to the user.</p>
</li>
<li><p><strong>E</strong>stimable: Can be estimated for effort.</p>
</li>
<li><p><strong>S</strong>mall: Fits within a sprint.</p>
</li>
<li><p><strong>T</strong>estable: Has clear acceptance criteria.</p>
</li>
</ul>
<p>Let’s apply this INVEST model to one of the user stories examples from above:</p>
<blockquote>
<p>As a non logged in user, when I enter the correct email address and password and click login, I am rediected to the logged in home page.</p>
</blockquote>
<p><em>(I’m going to make some assumptions here, as this is a theoretical code base and theoretical project)</em></p>
<p>Is this story <strong>Independent</strong>? I would say so, yes. It’s a small story that involves only a few components that probably already exist. If the database hasn’t been created yet though for the project, that would give us a dependency. This would no longer be independent.</p>
<p>Is it <strong>Negotiable</strong>? Well again, yes. This story could easily be changed to redirect to the users profile page rather than their home page.</p>
<p>This story is definitely <strong>valuable.</strong> Once implemented, the user can log in. If the story was:</p>
<blockquote>
<p>As a non logged in user, when I enter the correct email address and password and click login, nothing happens</p>
</blockquote>
<p>This would not be valuable. The user would get nothing out of this.</p>
<p>Is the story <strong>estimable</strong>? Again, we have to take some assumptions in this made up scenario, but I would certainly hope that this would be easily estimated. It’s a concise story, involving few components, in a domain that everyone is familiar with and has clear acceptance criteria.</p>
<p>The story is certainly <strong>small.</strong> There is little ambiguity in what needs to be done, there is one user path only and clear outcomes. Let’s take a look at a story that would be too large:</p>
<blockquote>
<p>As a non logged in user, the login page should work as expected.</p>
</blockquote>
<p>As discussed further up in this article, there are many ways that the login page can and should work. “Should work as expected” seems to cover all of those permutations. This would be too large to effectively size as a story, and probably too large to be completed in one sprint.</p>
<p>The story is definitely <strong>Testable.</strong> There are clear user actions to take that has a clear outcome. This user story can be covered by Unit Tests, Integration Tests, and Manual Tests.</p>
<p>It looks like we’ve created a good user story!</p>
<p>If you use the structure I’ve defined above, and the story meets the criteria of the INVEST model, it’s probably a good story.</p>
<h2 id="heading-common-pitfalls-in-user-story-creation">Common pitfalls in User Story creation</h2>
<p>I’ve seen User stories go wrong in the past where people have missed a few crucial aspects to the user story:</p>
<h3 id="heading-focusing-on-the-technical-aspects">Focusing on the technical aspects</h3>
<p>As my examples show above, the user story is non-technical.</p>
<p>There should be no reference to a service name, a database name, or validation based on anything that the user can’t see.</p>
<p>As soon as your story is no longer able to be understood by the end user, you’ve gone wrong.</p>
<p>Focus on what the user is going to do, and what the user is going to see.</p>
<p>Let’s look at an example of a technically focused story:</p>
<blockquote>
<p>As a non logged in user, when I click the forgotten password link with a correct email address, a record is logged in a database table stating that the password reset link has been sent.</p>
</blockquote>
<p>This story can not be verified by a user and non technical users may not understand what it means.</p>
<p>Let’s fix it:</p>
<blockquote>
<p>As a non logged in user, when I click the forgotten password link with a correct email address, an email is sent to the email address provided with a forgotten password reset link</p>
</blockquote>
<p>Non technical users can understand this and it puts the focus on the user, not the product.</p>
<h3 id="heading-stakeholder-collaboration">Stakeholder Collaboration</h3>
<p>Agile is collaborative.</p>
<p>User stories need input from Product, BA, QA, Engineers, and most importantly, Users.</p>
<p>This is how you will ensure that you are delivering what the user wants. Many hands make light work.</p>
<p>If, for instance, just an engineering team came up with user stories, they may look something like this:</p>
<blockquote>
<p>As a logged in user, when the page loads, I am redirected to the logged in home page</p>
<p>As a non logged in user, when I enter the correct email address but incorrect password and click Login, an error message appears</p>
<p>As a non logged in user, when I enter an incorrect email address and password and click login, an error message appears.</p>
</blockquote>
<p>And that’s great. But now let’s get QA involved, who are coming from a different perspective as they’ve different experiences with software:</p>
<blockquote>
<p>As a non logged in user, when I enter a correct email address in Hebrew and a correct password, I am redirected to the home page</p>
<p>As a non logged in user, when I enter a correct email address and password and repeatedly click login, I am redirected to the home page</p>
</blockquote>
<p>Great. We’re getting a more rounded set of user stories now that cover more situations. But what happens if we get Product involved?</p>
<blockquote>
<p>As a non logged in user, when the page loads, my password manager should pre-load my username and password, when I click login, I am redirected to the home page</p>
</blockquote>
<p>The Product team know the users. They know that people really use password managers. We should make sure that when the user doesn’t actually type anything (as the text is loaded by the password manager), the login still works correctly.</p>
<h3 id="heading-vague-user-stories">Vague User Stories</h3>
<p>The idea behind a good user story is that everyone, regardless of expertise, can understand it.</p>
<p>If you’ve written a User Story that. can be interpreted 10 different ways by 10 different people, you’ve gone a bit wrong.</p>
<p>I mentioned above that I would touch on acceptance criteria, and now is the time to do that.</p>
<p>Let’s re-examine the following User Story:</p>
<blockquote>
<p>As a non logged in user, when I enter an incorrect email address and password and click login, an error message appears.</p>
</blockquote>
<p>There’s vagueness in there.</p>
<p>What message should appear? When the page reloads after an invalid login attempt, should the username text box be set back to empty, or prepopulated with the previously entered value? What does “incorrect email address” mean? An email address that has never been seen before, or an email address that is not valid at the moment (not paid the subscription, canceled subscription etc.)</p>
<p>So as you can see, details matter.</p>
<p>This User Story is a fairly contrived simple example and I’ve managed to find a lot of questions about it.</p>
<p>Let’s fix the problem:</p>
<blockquote>
<p>As a non logged in user, when I enter an email address that it not registered with the system, when I click login, an error message appears</p>
</blockquote>
<p>That removed the questions around the user action but has not resolved the issue about the expected error message.</p>
<p>Enter the acceptance criteria.</p>
<p>Within the user story, you need to have a set of acceptance criteria that defines if the implementation of the user story is as expected.</p>
<p>Things like:</p>
<ul>
<li><p>Error message: “Invalid email address or password”</p>
</li>
<li><p>Email Address and Password text box reset to empty on reload</p>
</li>
<li><p>User unable to access pages where login is required</p>
</li>
<li><p>User is presented with a “forgotten password” suggested.</p>
</li>
</ul>
<p>Acceptance criteria states what is expected from the implementation.</p>
<h2 id="heading-how-to-begin-with-user-stories">How to Begin with User Stories</h2>
<p>Start small.</p>
<p>You will not be perfect at refining and creating user stories to start with.</p>
<p>Creating user stories is as much an art as a science. Practice makes perfect.</p>
<p>The creation of User Stories should be done as a group. Often, this is done with the “3 Amigoes” approach, where you will have an engineer, a product person and a QA all sit together and brain storm different permutations that you need to support.</p>
<p>Once you have delivered your project, retrospect. Take a look back and see what gaps you have in your user stories. There will be bugs that the users find, that QA and UAT find, and these are either due to gaps in your user stories or gaps in your testing. Either way, you should learn from them for next time.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Agile is collaborative. Scrum is collaborative. Creating User Stories is collaborative. Remember that.</p>
<p>The more people from different areas of expertise you have brainstorming user story creation, the more likely you are to cover the full set of workflows.</p>
<p>The user is the focus. If you are ever including terminology that your user doesn’t understand, rethink the user story.</p>
<p>You won’t be perfect at this from the start, but as you do more and more, the quicker and more effective you become. Take this from someone who has been doing this for over 10 years. The difference in speed and quality of my User Story creation today vs 10 years ago is a world apart.</p>
<p><em>In his spare time, Ben writes his tech blog</em> <a target="_blank" href="https://justanothertechlead.com/"><em>Just Another Tech Lead</em></a> <em>and runs a site creating forever-free online calaculators at</em> <a target="_blank" href="https://calculatorlord.com/"><em>CalculatorLord.com</em></a><em>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Agile Software Development Handbook – Scrum, Kanban, and Other Methodologies Explained ]]>
                </title>
                <description>
                    <![CDATA[ In the fast-paced and ever-evolving world of software development, there's always a need for flexibility, adaptability, and responsiveness. Traditional software development methods often struggled to keep up with changing requirements and market dema... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/agile-software-development-handbook/</link>
                <guid isPermaLink="false">66d45d5923b027d0ff16f2c0</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ handbook ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Adekola Olawale ]]>
                </dc:creator>
                <pubDate>Wed, 30 Aug 2023 14:26:36 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/08/The-Agile-Development-Handbook-Cover--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>In the fast-paced and ever-evolving world of software development, there's always a need for flexibility, adaptability, and responsiveness.</p>
<p>Traditional software development methods often struggled to keep up with changing requirements and market demands. This can lead to delays, cost overruns, and dissatisfied stakeholders.</p>
<p>In response to these challenges, the Agile Software Development approach emerged as a game-changer, revolutionizing the way software projects are executed.</p>
<p>At its core, Agile Software Development is not just a set of methodologies. It represents a fundamental shift in the way teams approach problem-solving and collaboration.</p>
<p>The Agile approach emphasizes iterative and incremental development. It focuses on delivering value to the customer early and often while adapting to feedback and changing requirements throughout the development process.</p>
<p>A key milestone in the history of Agile was the <a target="_blank" href="https://agilemanifesto.org/">Agile Manifesto</a>. It was formulated in 2001 by a group of experienced software developers who sought to find a better way of developing software.</p>
<p>The manifesto laid out four core values:</p>
<ol>
<li><p>Individuals and interactions over processes and tools.</p>
</li>
<li><p>Working software over comprehensive documentation.</p>
</li>
<li><p>Customer collaboration over contract negotiation.</p>
</li>
<li><p>Responding to change over following a plan.</p>
</li>
</ol>
<p>These values provided a guiding light for the creation of various Agile methodologies, with Scrum and Kanban being two of the most widely adopted frameworks.</p>
<p>Scrum, based on the Agile principles, is a well-defined and structured approach to software development.</p>
<p>It provides a clear set of roles, ceremonies, and artifacts that foster efficient teamwork, transparency, and continuous improvement.</p>
<p>On the other hand, Kanban, inspired by lean manufacturing principles, focuses on the continuous flow of work, limiting work in progress, and maximizing the delivery of value.</p>
<p>However, Agile Software Development goes far beyond Scrum and Kanban. There are several other methodologies and practices, such as Extreme Programming (XP), Lean Software Development, and more, each with its unique strengths and applications.</p>
<p>In this handbook, we will delve deep into the world of Agile Software Development, exploring the core principles that underpin its success.</p>
<p>We will take a close look at Scrum and Kanban, understanding their frameworks, benefits, and challenges.</p>
<p>Moreover, we will explore other Agile methodologies that offer alternative approaches to delivering high-quality software products.</p>
<p>Whether you are an experienced software developer, a project manager, or a newcomer to the Agile landscape, this guide is for you. It aims to provide valuable insights into how Agile methodologies work, the benefits they offer, and how to make the most of them to achieve successful software projects.</p>
<p>So, without further ado, let's embark on this journey. Get ready to discover the power of Agile and its potential to transform the way you and your teams approach software development.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><p><a class="post-section-overview" href="#introduction">Introduction</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-agile-software-development-fundamentals">Agile Software Development Fundamentals</a>‌‌</p>
</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-principles-of-the-agile-manifesto">Principles of the Agile Manifesto</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-iterative-and-incremental-development">Iterative and Incremental Development</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-cross-functional-teams-and-collaborative-environment">Cross-functional Teams and Collaborative Environment</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-scrum-a-comprehensive-approach">Scrum: A Comprehensive Approach</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-overview-of-scrum-framework">Overview of Scrum Framework</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-benefits-and-advantages-of-scrum">Benefits and Advantages of Scrum</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-scrum-challenges-and-how-to-overcome-them">Scrum Challenges and How to Overcome Them</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-kanban-flow-based-development">Kanban: Flow-based Development</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-introduction-to-kanban-methodology">Introduction to Kanban Methodology</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-kanban-principles-and-practices">Kanban Principles and Practices</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-comparison-with-scrum-when-to-use-kanban">Comparison with Scrum: When to Use Kanban?</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-advantages-of-kanban">Advantages of Kanban</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-extreme-programming-xp-a-development-approach">Extreme Programming (XP): A Development Approach</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-overview-of-extreme-programming">Overview of Extreme Programming</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-core-practices-of-xp">Core Practices of XP</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-pros-and-cons-of-extreme-programming">Pros and Cons of Extreme Programming</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-lean-software-development-agile-with-a-focus-on-value">Lean Software Development: Agile with a Focus on Value</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-understanding-lean-principles">Understanding Lean Principles</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-application-of-lean-in-software-development">Application of Lean in Software Development</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-lean-complements-scrum-and-kanban">How Lean Complements Scrum and Kanban</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-agile-project-management-tools-and-software">Agile Project Management Tools and Software</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-project-tracking-and-collaboration-tools">Project Tracking and Collaboration Tools</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-benefits-of-agile-project-management-tools">Benefits of Agile Project Management Tools</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-popular-tools-for-scrum-kanban-and-other-agile-methodologies">Popular Tools for Scrum, Kanban, and Other Agile Methodologies</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-how-to-choose-the-right-agile-approach-for-your-team">How to Choose the Right Agile Approach for Your Team</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-factors-to-consider-when-selecting-an-agile-methodology">Factors to Consider When Selecting an Agile Methodology</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-how-to-tailor-agile-practices-to-suit-your-organization">How to Tailor Agile Practices to Suit Your Organization</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-agile-scaling-beyond-the-team-level">Agile Scaling: Beyond the Team Level</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-understanding-agile-scaling">Understanding Agile Scaling</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-popular-agile-scaling-frameworks">Popular Agile Scaling Frameworks</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-benefits-of-agile-scaling">Benefits of Agile Scaling</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-challenges-and-considerations">Challenges and Considerations</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-agile-and-devops-integration-for-continuous-delivery">Agile and DevOps: Integration for Continuous Delivery</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-agile-and-devops-a-natural-partnership">Agile and DevOps: A Natural Partnership</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-journey-to-continuous-delivery">The Journey to Continuous Delivery</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-benefits-of-agile-and-devops-integration">Benefits of Agile and DevOps Integration</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-overcoming-challenges">Overcoming Challenges</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-future-trends-in-agile-software-development">Future Trends in Agile Software Development</a>‌‌</li>
</ul>
<ol>
<li><p><a class="post-section-overview" href="#heading-agile-at-scale">Agile at Scale</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-value-stream-management-vsm">Value Stream Management (VSM)</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-agile-and-aiml-integration">Agile and AI/ML Integration</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-agile-for-non-software-projects">Agile for Non-Software Projects</a>‌‌</p>
</li>
<li><p><a class="post-section-overview" href="#heading-agile-and-remote-work">Agile and Remote Work</a></p>
</li>
</ol>
<ul>
<li><a class="post-section-overview" href="#heading-conclusion">Conclusion</a>‌‌</li>
</ul>
<h2 id="heading-agile-software-development-fundamentals">Agile Software Development Fundamentals</h2>
<p>Agile Software Development is built upon a strong foundation of core principles and values that prioritize customer collaboration, adaptability, and continuous improvement.</p>
<p>In this section, we will explore the fundamental tenets of Agile and gain a deeper understanding of the principles that guide its implementation.</p>
<h3 id="heading-principles-of-the-agile-manifesto">Principles of the Agile Manifesto</h3>
<p>The Agile Manifesto is a set of guiding values and principles for software development that emphasizes flexibility, collaboration, and customer satisfaction.</p>
<p>As stated earlier, it was created by a group of seventeen software developers who met in February 2001.</p>
<p>This group consisted of representatives from various software development methodologies, including Extreme Programming (XP), Scrum, DSDM (Dynamic Systems Development Method), and others.</p>
<p>They came together to find common ground and establish a more people-centric and flexible approach to software development.</p>
<p>The Agile Manifesto consists of four core values and twelve principles that provide a framework for teams to deliver high-quality software in a more adaptive and responsive manner</p>
<h4 id="heading-four-core-values">Four Core Values</h4>
<h5 id="heading-individuals-and-interactions-over-processes-and-tools">Individuals and interactions over processes and tools</h5>
<p>Agile emphasizes the importance of people and their interactions as the primary drivers of project success. Effective communication, collaboration, and teamwork are vital in Agile environments, fostering a sense of ownership and responsibility among team members.</p>
<h5 id="heading-working-software-over-comprehensive-documentation">Working software over comprehensive documentation</h5>
<p>While documentation remains essential, Agile prioritizes the delivery of working software that meets customer needs. Frequent and incremental releases allow stakeholders to see tangible progress and provide valuable feedback throughout the development process.</p>
<h5 id="heading-customer-collaboration-over-contract-negotiation">Customer collaboration over contract negotiation</h5>
<p>Agile encourages close collaboration with customers and end-users. This customer-centric approach ensures that the software being developed aligns with their evolving needs, increasing the likelihood of delivering a product that satisfies their requirements.</p>
<h5 id="heading-responding-to-change-over-following-a-plan">Responding to change over following a plan</h5>
<p>Agile acknowledges that change is inevitable in software development. Rather than rigidly adhering to a fixed plan, Agile teams embrace change and view it as an opportunity for improvement.</p>
<p>Frequent iterations enable teams to adapt to new information and feedback, fostering a more responsive development process. Agile software development thrives on change and adaptability, making flexibility the heartbeat of its success.</p>
<h4 id="heading-twelve-agile-development-principles">Twelve Agile Development Principles:</h4>
<p>I've paraphrased the <a target="_blank" href="https://agilemanifesto.org/principles.html">12 principles from the Agile Manifesto</a> here for you:</p>
<ol>
<li><p>Prioritize satisfying the customer through early and continuous delivery of valuable software.</p>
</li>
<li><p>Welcome changing requirements, even late in development. Agile processes harness change for the customer's competitive advantage.</p>
</li>
<li><p>Deliver working software frequently, with a preference for shorter timescales.</p>
</li>
<li><p>Collaborate closely between business people and developers throughout the project.</p>
</li>
<li><p>Build projects around motivated individuals. Give them the environment and support they need, and trust them to get the job done.</p>
</li>
<li><p>Use face-to-face communication whenever possible for effective information sharing.</p>
</li>
<li><p>Measure progress primarily through working software.</p>
</li>
<li><p>Maintain a sustainable pace of work for the development team. Continuous work is sustainable work.</p>
</li>
<li><p>Focus on technical excellence and good design to enhance agility.</p>
</li>
<li><p>Keep things simple and maximize the amount of work not done (avoid unnecessary tasks).</p>
</li>
<li><p>Allow self-organizing teams to make decisions on how to accomplish their work.</p>
</li>
<li><p>Reflect at regular intervals on team effectiveness and adjust behavior accordingly.</p>
</li>
</ol>
<h3 id="heading-iterative-and-incremental-development">Iterative and Incremental Development</h3>
<p>At the heart of Agile lies the concept of iterative and incremental development. Unlike traditional "waterfall" methods, where all development occurs sequentially in one large phase, Agile divides the software development process into smaller iterations or time-boxed cycles.</p>
<p>Each iteration results in a potentially shippable increment of the software, with new features or improvements being added in every cycle.</p>
<p>This iterative approach offers several advantages:</p>
<ul>
<li><p><strong>Early Value Delivery:</strong> Customers can start using and benefiting from the software early in the development process, gaining tangible value with each iteration.</p>
</li>
<li><p><strong>Continuous Feedback:</strong> Frequent releases allow stakeholders to provide feedback, guiding the development direction and ensuring that the final product aligns with their expectations.</p>
</li>
<li><p><strong>Risk Mitigation:</strong> By breaking the project into smaller chunks, Agile reduces the risk associated with large-scale development, making it easier to adjust and adapt to changes.</p>
</li>
<li><p><strong>Increased Transparency:</strong> Teams and stakeholders have a clear view of progress, making it easier to identify and address potential issues or delays.</p>
</li>
</ul>
<h3 id="heading-cross-functional-teams-and-collaborative-environment">Cross-functional Teams and Collaborative Environment</h3>
<p>Agile emphasizes the importance of cross-functional teams, where members possess diverse skills and expertise needed to deliver a complete product.</p>
<p>These teams work together in a collaborative environment, promoting shared responsibility, knowledge exchange, and collective ownership of project outcomes.</p>
<p>The cross-functional nature of Agile teams fosters a sense of empowerment. Team members are encouraged to make decisions collectively, take ownership of tasks, and resolve challenges collaboratively. This dynamism enables faster problem-solving, improved creativity, and a more resilient team structure.</p>
<p>Moreover, Agile methodologies often embrace practices like pair programming, where two developers work together on the same piece of code. This leads to higher code quality, knowledge transfer, and reduced knowledge silos within the team.</p>
<p>The fundamentals of Agile Software Development revolve around valuing people and interactions, focusing on delivering working software, collaborating closely with customers, and responding to change in a flexible manner.</p>
<p>By employing iterative and incremental development and fostering a collaborative team environment, Agile lays the groundwork for efficient and customer-focused software development processes.</p>
<p>In the next sections, we will delve into specific Agile methodologies like Scrum and Kanban to see how these principles are put into action.</p>
<h2 id="heading-scrum-a-comprehensive-approach">Scrum: A Comprehensive Approach</h2>
<p>Scrum is one of the most widely adopted Agile frameworks in the software development industry. It provides a structured and comprehensive approach to managing projects, enabling teams to deliver high-quality software efficiently.</p>
<p>In this section, we will explore Scrum in detail, understanding its framework, key roles, artifacts, ceremonies, and the benefits it brings to software development teams.</p>
<h3 id="heading-overview-of-scrum-framework">Overview of Scrum Framework</h3>
<p>The Scrum framework is built on the foundation of Agile principles and is designed to maximize productivity, foster collaboration, and deliver value to customers.</p>
<p>It consists of three essential elements:</p>
<h4 id="heading-scrum-roles">Scrum Roles</h4>
<p><strong>Product Owner:</strong> The Product Owner is the voice of the customer and stakeholders. They are responsible for defining and prioritizing the product backlog, ensuring that the development team is working on the most valuable features.</p>
<p>The Product Owner collaborates with stakeholders to gather requirements and provide feedback on delivered increments.</p>
<p><strong>Scrum Master:</strong> The Scrum Master acts as a facilitator and servant-leader for the development team. Their primary role is to ensure that the Scrum framework is understood and followed correctly.</p>
<p>They remove any impediments that hinder the team's progress, promote a collaborative team environment, and facilitate the various Scrum ceremonies.</p>
<p><strong>Development Team:</strong> The Development Team consists of professionals who do the actual work of delivering a potentially shippable product increment in each sprint. They are self-organizing, cross-functional, and collaborate closely to complete the tasks from the sprint backlog.</p>
<h4 id="heading-scrum-artifacts">Scrum Artifacts</h4>
<p><strong>Product Backlog:</strong> The Product Backlog is a prioritized list of all the work items required to complete the project. These items can include features, enhancements, bug fixes, and technical tasks.</p>
<p>The Product Owner continuously refines and updates the backlog based on feedback and changing requirements.</p>
<p><strong>Sprint Backlog:</strong> Before each sprint, the Development Team pulls a set of work items from the Product Backlog and creates the Sprint Backlog.</p>
<p>The Sprint Backlog contains the tasks the team commits to completing during the sprint. It provides transparency and a clear plan for the upcoming iteration.</p>
<p><strong>Increment:</strong> The Increment represents the sum of all completed Product Backlog items at the end of each sprint. It is a potentially shippable piece of software that should be in a usable state and adhere to the team's definition of "<em>done</em>."</p>
<h4 id="heading-scrum-ceremonies">Scrum Ceremonies</h4>
<p><strong>Sprint Planning:</strong> At the beginning of each sprint, the Product Owner and Development Team collaborate in the Sprint Planning meeting. They discuss and agree on the sprint goal, select the top items from the Product Backlog, and create the Sprint Backlog with associated tasks.</p>
<p><strong>Daily Standup (Daily Scrum):</strong> The Daily Standup is a brief daily meeting where the Development Team synchronizes their work. Each team member shares what they worked on the previous day, what they plan to work on that day, and any impediments they are facing.</p>
<p><strong>Sprint Review:</strong> At the end of each sprint, the team holds a Sprint Review meeting to demonstrate the completed Increment to stakeholders. Feedback is gathered, and the Product Backlog is updated based on the stakeholders' input.</p>
<p><strong>Sprint Retrospective:</strong> Following the Sprint Review, the team conducts the Sprint Retrospective to reflect on the previous sprint. They identify what went well, what could be improved, and define actionable items to enhance their processes in the upcoming sprints.</p>
<h3 id="heading-benefits-and-advantages-of-scrum">Benefits and Advantages of Scrum</h3>
<p>Scrum offers a number of benefits that contribute to its popularity and success in Agile software development:</p>
<ol>
<li><p><strong>Transparency:</strong> The use of visible backlogs, frequent progress updates, and regular meetings ensures transparency among team members and stakeholders. This fosters a shared understanding of the project's status.</p>
</li>
<li><p><strong>Adaptability:</strong> Scrum's iterative nature allows teams to adapt to changing requirements and priorities. This ensures that the delivered product remains aligned with the customer's needs.</p>
</li>
<li><p><strong>Continuous Improvement:</strong> The Sprint Retrospective encourages continuous improvement by providing a platform for the team to reflect on their practices and identify opportunities for enhancement.</p>
</li>
<li><p><strong>Early Value Delivery:</strong> The focus on delivering potentially shippable increments at the end of each sprint allows customers to see tangible progress early in the development process.</p>
</li>
<li><p><strong>Customer Collaboration:</strong> The involvement of the Product Owner and regular Sprint Reviews promote active collaboration with customers, resulting in a product that better meets their expectations.</p>
</li>
</ol>
<h3 id="heading-scrum-challenges-and-how-to-overcome-them">Scrum Challenges and How to Overcome Them</h3>
<p>While Scrum is highly effective, it is not without its challenges. Some common hurdles that teams may encounter include:</p>
<ol>
<li><p><strong>Overcommitment:</strong> Teams might take on too much work in a sprint, leading to incomplete tasks and a compromised Increment. Regularly evaluating capacity and being realistic about commitments can help avoid this pitfall.</p>
</li>
<li><p><strong>Lack of Empowerment:</strong> If team members are not empowered to make decisions and are overly dependent on the Scrum Master, the efficiency and effectiveness of the team may suffer. Encouraging self-organization and trust within the team can mitigate this challenge.</p>
</li>
<li><p><strong>Incomplete Definition of "Done":</strong> Ambiguity about what constitutes a "done" user story can lead to misunderstandings and incomplete work. Clearly defining and agreeing upon the team's "definition of done" is crucial for consistent delivery.</p>
</li>
<li><p><strong>Product Owner Availability:</strong> Insufficient availability of the Product Owner can slow down decision-making and result in unclear requirements. Maintaining constant communication and involvement with the team can help alleviate this issue.</p>
</li>
</ol>
<p>Scrum provides a structured and comprehensive approach to Agile Software Development, offering a well-defined set of roles, artifacts, and ceremonies that facilitate collaboration, transparency, and continuous improvement.</p>
<p>By embracing Scrum's core principles and addressing its challenges proactively, development teams can harness the full potential of this framework to deliver successful software projects.</p>
<h2 id="heading-kanban-flow-based-development">Kanban: Flow-based Development</h2>
<p>Kanban is a highly versatile Agile methodology that emphasizes continuous delivery and flow-based development.</p>
<p>Originally developed in the manufacturing sector, Kanban has found widespread adoption in software development due to its efficiency and adaptability.</p>
<p>In this section, we will explore Kanban in-depth, understanding its principles, practices, and how it complements Scrum and other Agile methodologies.</p>
<h3 id="heading-introduction-to-kanban-methodology">Introduction to Kanban Methodology</h3>
<p>The word "Kanban" translates to "visual signal" or "card" in Japanese.</p>
<p>In the context of software development, Kanban involves visualizing the entire workflow on a board, where work items are represented as cards that move through different stages of development.</p>
<p>The primary goal of Kanban is to optimize the flow of work, reduce waste, and enable teams to deliver value continuously.</p>
<p>Unlike Scrum, which works in fixed time-boxed iterations (sprints), Kanban operates on a continuous flow model.</p>
<p>This flexibility makes Kanban particularly well-suited for teams with unpredictable workloads, frequent changes in priorities, or the need for quick response times.</p>
<h3 id="heading-kanban-principles-and-practices">Kanban Principles and Practices</h3>
<ol>
<li><p><strong>Visualizing Work Items:</strong> The Kanban board serves as a central visual management tool. It represents the workflow, with columns representing different stages of the development process. Work items, represented as cards, move across the board from left to right as they progress through each stage.</p>
</li>
<li><p><strong>Work in Progress (WIP) Limits:</strong> Kanban enforces Work in Progress (WIP) limits for each column on the board. These limits prevent teams from overloading themselves with too many tasks at once, promoting focus and higher-quality output. WIP limits also highlight bottlenecks in the workflow, allowing teams to identify and address inefficiencies.</p>
</li>
<li><p><strong>Continuous Delivery and Flow:</strong> Kanban aims to maintain a steady flow of work items from inception to delivery. The focus is on completing tasks as they become ready, without waiting for a specific sprint or iteration to end. This continuous delivery approach results in a shorter time to market and more responsive software development.</p>
</li>
</ol>
<h3 id="heading-comparison-with-scrum-when-to-use-kanban">Comparison with Scrum: When to Use Kanban?</h3>
<p>While both Scrum and Kanban are Agile methodologies, they cater to different project environments and team dynamics.</p>
<p>Here are some key points to consider when deciding between Scrum and Kanban:</p>
<p><strong>Predictability vs. Flexibility:</strong> Scrum is well-suited for projects with well-defined requirements and predictable workloads. It provides clear sprint boundaries, making it easier to plan and estimate project timelines.</p>
<p>On the other hand, Kanban is more flexible and adapts to changing priorities and frequent interruptions, making it ideal for projects with highly variable workloads.</p>
<p><strong>Time-boxed Iterations vs. Continuous Flow:</strong> Scrum's time-boxed iterations provide a rhythm and cadence to development, allowing teams to review progress and gather feedback regularly.</p>
<p>Kanban, with its continuous flow approach, facilitates a smoother and more steady delivery of work items without the need for predefined sprints.</p>
<p><strong>Team Structure:</strong> Scrum typically works well with cross-functional teams that commit to delivering a set of user stories in each sprint.</p>
<p>Kanban is more accommodating to specialized teams or environments where resources are shared among multiple projects or priorities.</p>
<p><strong>Learning and Improvement:</strong> Both Scrum and Kanban promote continuous improvement, but the approach differs.</p>
<p>Scrum's retrospectives are dedicated events for teams to reflect and adapt. In Kanban, improvement is often embedded in the process, where teams continuously optimize their workflow based on real-time feedback.</p>
<h3 id="heading-advantages-of-kanban">Advantages of Kanban</h3>
<p>Kanban offers several advantages that make it a powerful methodology in certain situations:</p>
<ul>
<li><p><strong>Increased Flexibility:</strong> Kanban's ability to adapt to changing circumstances and priorities makes it suitable for projects with evolving requirements or dynamic environments.</p>
</li>
<li><p><strong>Smoother Workflow:</strong> By limiting work in progress and addressing bottlenecks, Kanban ensures a more predictable and smoother flow of work.</p>
</li>
<li><p><strong>Quick Response Time:</strong> Kanban's continuous delivery model allows teams to respond quickly to new tasks or urgent requests, reducing lead times.</p>
</li>
<li><p><strong>Focus on Value:</strong> Kanban emphasizes delivering value continuously, aligning well with projects that require frequent releases or incremental improvements.</p>
</li>
</ul>
<p>Kanban's flow-based development and continuous delivery approach offer an excellent alternative to Scrum for projects with varying requirements and unpredictable workloads.</p>
<p>By visualizing work, setting WIP limits, and embracing a continuous flow model, Kanban empowers teams to optimize their development processes, enhance collaboration, and achieve a more efficient and responsive software delivery.</p>
<p>Whether used independently or in combination with other Agile methodologies like Scrum, Kanban provides valuable tools and practices for achieving successful software development projects.</p>
<h2 id="heading-extreme-programming-xp-a-development-approach">Extreme Programming (XP): A Development Approach</h2>
<p>Extreme Programming (XP) is an Agile software development approach that embraces a set of best practices and values to deliver high-quality software efficiently.</p>
<p>Created by Kent Beck in the late 1990s, XP challenges traditional development practices by promoting a customer-centric and team-oriented philosophy.</p>
<p>In this section, we will explore the key principles and core practices of Extreme Programming and understand its impact on software development teams.</p>
<h3 id="heading-overview-of-extreme-programming">Overview of Extreme Programming</h3>
<p>Extreme Programming is based on a set of values that drive the development process. These values include communication, simplicity, feedback, courage, and respect.</p>
<p>XP encourages open and frequent communication between team members and stakeholders. This simplifies processes and solutions and encourages team members to seek and act upon feedback regularly. Team members are also encouraged to have the courage to make necessary changes and respect the expertise and contributions of all team members.</p>
<h3 id="heading-core-practices-of-xp">Core Practices of XP</h3>
<p><strong>Test-Driven Development (TDD):</strong> Test-Driven Development is a fundamental practice in XP where developers write tests before writing the code.</p>
<p>The process involves creating a test that initially fails, then writing the code to pass the test. TDD ensures that the code is thoroughly tested. This makes it easier to identify and fix issues early in the development process.</p>
<p><strong>Pair Programming:</strong> In Pair Programming, two developers work collaboratively at the same workstation. One programmer writes the code while the other reviews it in real-time. This promotes continuous feedback, knowledge sharing, and improved code quality.</p>
<p>This practice enhances team communication and leads to the development of more robust solutions.</p>
<p><strong>Continuous Integration:</strong> Continuous Integration involves frequently integrating code changes into a shared repository. This ensures that the software is continuously built and tested as new code is added, reducing integration issues and enabling faster feedback on potential defects.</p>
<p><strong>Collective Code Ownership:</strong> XP encourages the concept of collective code ownership, where all team members take responsibility for the entire codebase.</p>
<p>This fosters a sense of ownership and accountability within the team, leading to a collaborative and supportive work environment.</p>
<p><strong>On-Site Customer:</strong> In XP, having an on-site customer or a dedicated customer representative is vital for effective communication and quick decision-making.</p>
<p>The on-site customer provides real-time feedback and clarifications, ensuring that the team builds the right features and meets customer expectations.</p>
<h3 id="heading-pros-and-cons-of-extreme-programming">Pros and Cons of Extreme Programming</h3>
<h4 id="heading-pros">Pros:</h4>
<ul>
<li><p><strong>High-Quality Code:</strong> TDD and Pair Programming lead to better-tested and more maintainable code.</p>
</li>
<li><p><strong>Fast Feedback:</strong> Continuous Integration and frequent releases provide rapid feedback on code changes.</p>
</li>
<li><p><strong>Customer Collaboration:</strong> Involving an on-site customer ensures better alignment with customer needs.</p>
</li>
<li><p><strong>Adaptability:</strong> XP's practices allow teams to adapt to changing requirements and priorities effectively.</p>
</li>
</ul>
<h4 id="heading-cons">Cons:</h4>
<ul>
<li><p><strong>Learning Curve:</strong> Adopting XP may require a cultural shift and training for team members unfamiliar with its practices.</p>
</li>
<li><p><strong>Resource Intensive:</strong> Pair Programming and on-site customer involvement may require additional resources.</p>
</li>
<li><p><strong>Initial Overhead:</strong> Writing tests before code and maintaining continuous integration can add initial overhead.</p>
</li>
</ul>
<p>Extreme Programming (XP) is a development approach grounded in a customer-focused philosophy and driven by a set of core practices.</p>
<p>By emphasizing test-driven development, pair programming, continuous integration, and collective code ownership, XP aims to deliver high-quality software while promoting effective teamwork and continuous improvement.</p>
<p>Like any methodology, XP has its advantages and challenges, but when applied in the right context with committed team members, it can lead to substantial improvements in software development efficiency and customer satisfaction.</p>
<h2 id="heading-lean-software-development-agile-with-a-focus-on-value">Lean Software Development: Agile with a Focus on Value</h2>
<p>Lean Software Development is an Agile approach inspired by the principles of lean manufacturing, which originated from Toyota's production system. It aims to maximize customer value while minimizing waste in the software development process.</p>
<p>Lean principles emphasize efficiency, continuous improvement, and a relentless focus on delivering value to customers.</p>
<p>In this section, we will delve into the core principles of Lean Software Development and explore how it complements Agile methodologies, such as Scrum and Kanban.</p>
<h3 id="heading-understanding-lean-principles">Understanding Lean Principles</h3>
<p>There are some fundamental principles behind this approach, and they are:</p>
<ol>
<li><p><strong>Eliminate Waste:</strong> Lean Software Development advocates the elimination of non-value-adding activities, often referred to as "waste." This includes avoiding unnecessary bureaucracy, reducing delays, and optimizing resource utilization to ensure that valuable work takes precedence.</p>
</li>
<li><p><strong>Amplify Learning:</strong> Lean promotes a learning culture, where teams continuously seek feedback and insights from customers and stakeholders. This learning mindset drives continuous improvement, enabling teams to deliver higher-quality products that better align with customer needs.</p>
</li>
<li><p><strong>Decide as Late as Possible:</strong> Rather than making significant decisions early in the development process when information is limited, Lean encourages postponing decisions until they are necessary. This allows teams to leverage up-to-date information and make informed choices.</p>
</li>
<li><p><strong>Deliver as Fast as Possible:</strong> Lean Software Development places a premium on rapid value delivery. By shortening the cycle time between idea inception and implementation, teams can respond quickly to changes and deliver customer value sooner.</p>
</li>
<li><p><strong>Empower the Team:</strong> Lean emphasizes the importance of empowering and trusting team members to make decisions and contribute to the development process. This autonomy fosters a sense of ownership and accountability, driving motivation and creativity.</p>
</li>
</ol>
<h3 id="heading-application-of-lean-in-software-development">Application of Lean in Software Development</h3>
<p>Lean principles can be applied in various areas of software development to improve efficiency and value delivery:</p>
<ul>
<li><p><strong>Value Stream Mapping:</strong> By mapping the entire software development process, teams can identify bottlenecks, inefficiencies, and areas of waste. This helps streamline workflows and optimize the delivery process.</p>
</li>
<li><p><strong>Minimal Viable Product (MVP):</strong> The concept of MVP aligns with Lean principles, where the focus is on delivering the smallest set of features that provides value to customers. This enables faster market validation and feedback gathering.</p>
</li>
<li><p><strong>Just-In-Time (JIT) Production:</strong> Applying JIT principles in software development means delivering work items when they are needed and avoiding stockpiling uncompleted features. This reduces inventory waste and ensures a more responsive development process.</p>
</li>
<li><p><strong>Kaizen:</strong> The principle of Kaizen, or continuous improvement, is central to Lean Software Development. Teams regularly reflect on their processes and practices, seeking ways to optimize and refine their approach.</p>
</li>
</ul>
<h3 id="heading-how-lean-complements-scrum-and-kanban">How Lean Complements Scrum and Kanban</h3>
<p>Lean Software Development is highly compatible with other Agile methodologies, such as Scrum and Kanban:</p>
<h4 id="heading-scrum-and-lean">Scrum and Lean</h4>
<p>Scrum's iterative and incremental development aligns with Lean's focus on delivering value early and frequently.</p>
<p>By incorporating Lean principles like eliminating waste and amplifying learning, Scrum teams can enhance their effectiveness and responsiveness.</p>
<h4 id="heading-kanban-and-lean">Kanban and Lean</h4>
<p>Kanban's emphasis on visualizing work, reducing WIP, and promoting continuous flow aligns seamlessly with Lean's core principles. Kanban's focus on delivering value continuously complements Lean's customer-centric approach.</p>
<p>Lean Software Development enriches the Agile landscape with its value-focused philosophy and waste reduction strategies. By embracing Lean principles, teams can optimize their workflows, foster a culture of continuous improvement, and deliver software products that truly meet customer needs.</p>
<p>Lean's compatibility with other Agile methodologies makes it a powerful complement to approaches like Scrum and Kanban. It provides a holistic and efficient way to drive innovation, reduce waste, and maximize customer value in software development.</p>
<h2 id="heading-agile-project-management-tools-and-software">Agile Project Management Tools and Software</h2>
<p>Agile Project Management tools and software play a pivotal role in streamlining and enhancing the efficiency of Agile development processes. These tools provide teams with a centralized platform to plan, track, and collaborate on projects. They can make it easier to manage tasks, monitor progress, and facilitate seamless communication among team members.</p>
<p>In this section, we will explore some popular Agile Project Management tools and software, along with the benefits they offer to Agile teams.</p>
<h3 id="heading-project-tracking-and-collaboration-tools">Project Tracking and Collaboration Tools</h3>
<p><a target="_blank" href="https://www.atlassian.com/software/jira"><strong>Jira</strong></a> was developed by <a target="_blank" href="https://www.atlassian.com/">Atlassian</a>, and is one of the most widely used project management tools, particularly in Agile development.</p>
<p>It offers a range of features, including user story and task management, sprint planning, backlog prioritization, and real-time progress tracking.</p>
<p>With customizable workflows and extensive reporting capabilities, Jira provides teams with a comprehensive platform to manage their Agile projects efficiently.</p>
<p><a target="_blank" href="https://trello.com/home"><strong>Trello</strong></a> is another offering by Atlassian. It's a visual project management tool that allows teams to organize tasks into boards, lists, and cards. It is simple to use and ideal for small to medium-sized projects.</p>
<p>Trello's intuitive interface and drag-and-drop functionality make it easy to track progress, assign tasks, and collaborate with team members.</p>
<p><strong>Azure DevOps (formerly Visual Studio Team Services)</strong> is a comprehensive toolset that includes version control, project planning, continuous integration, and release management capabilities. Its Agile Boards provide flexible backlogs, sprint planning, and real-time task tracking, making it a popular choice for teams following Agile methodologies.</p>
<h3 id="heading-benefits-of-agile-project-management-tools">Benefits of Agile Project Management Tools</h3>
<ol>
<li><p><strong>Improved Transparency:</strong> Agile Project Management tools provide a centralized view of project progress, tasks, and priorities. This transparency enables stakeholders to have a clear understanding of project status and facilitates open communication among team members.</p>
</li>
<li><p><strong>Enhanced Collaboration:</strong> These tools promote seamless collaboration among distributed teams by providing a centralized space to share updates, files, and feedback. Features like commenting and tagging team members make it easier to communicate and address issues effectively.</p>
</li>
<li><p><strong>Streamlined Workflows:</strong> Agile Project Management tools automate repetitive tasks, streamline workflows, and ensure that project tasks flow smoothly from inception to completion. This automation reduces manual overhead and allows teams to focus on delivering value.</p>
</li>
<li><p><strong>Real-time Reporting:</strong> The real-time reporting and data visualization capabilities of these tools provide insights into team performance, sprint progress, and project trends. Teams can use this data to identify bottlenecks, make data-driven decisions, and continuously improve their processes.</p>
</li>
<li><p><strong>Scalability:</strong> Agile Project Management tools cater to projects of varying sizes and complexities, from small startups to large enterprises. They can adapt to different team structures, making them versatile and suitable for diverse Agile implementations.</p>
</li>
</ol>
<h3 id="heading-popular-tools-for-scrum-kanban-and-other-agile-methodologies">Popular Tools for Scrum, Kanban, and Other Agile Methodologies</h3>
<h4 id="heading-scrum-specific-tools">Scrum-Specific Tools</h4>
<ul>
<li><p>Targetprocess: A comprehensive tool tailored for Scrum and Agile teams with features like sprint planning, release forecasting, and progress tracking.</p>
</li>
<li><p>Sprintly: A user-friendly tool that focuses on sprint planning, bug tracking, and team collaboration.</p>
</li>
</ul>
<h4 id="heading-kanban-specific-tools">Kanban-Specific Tools</h4>
<ul>
<li><p>LeanKit: An advanced Kanban tool with customizable boards, analytics, and workflow automation.</p>
</li>
<li><p>Kanbanize: A feature-rich platform with analytics, time tracking, and integrations for managing Kanban projects.</p>
</li>
</ul>
<h4 id="heading-all-in-one-agile-tools">All-in-One Agile Tools</h4>
<ul>
<li><p>VersionOne: An end-to-end Agile management tool that supports Scrum, Kanban, and SAFe frameworks.</p>
</li>
<li><p>Monday.com: A versatile collaboration platform that can be customized for various Agile workflows and methodologies.</p>
</li>
</ul>
<p>Agile Project Management tools and software provide indispensable support to Agile development teams, promoting transparency, collaboration, and streamlined workflows.</p>
<p>From Scrum-specific tools to all-in-one Agile platforms, these tools offer a wide range of features and customization options to suit the needs of different teams and projects.</p>
<p>By leveraging these tools, Agile teams can enhance their productivity, drive successful project delivery, and embrace the iterative and customer-focused essence of Agile Software Development.</p>
<h2 id="heading-how-to-choose-the-right-agile-approach-for-your-team">How to Choose the Right Agile Approach for Your Team</h2>
<p>As Agile Software Development has become increasingly popular, various Agile methodologies have emerged, each with its unique strengths and applicability.</p>
<p>The key to successful Agile implementation lies in selecting the approach that best aligns with your team's goals, project requirements, and organizational culture.</p>
<p>In this section, we will explore essential factors to consider when choosing the right Agile approach for your team. I'll also provide insights into tailoring Agile practices to suit your organization.</p>
<h3 id="heading-factors-to-consider-when-selecting-an-agile-methodology">Factors to Consider When Selecting an Agile Methodology</h3>
<p><strong>Project Scope and Complexity:</strong> Assess the size and complexity of your project.</p>
<p>Scrum is well-suited for projects with a defined scope and set timelines, making it ideal for product development. On the other hand, Kanban's flexibility works best for projects with constantly changing requirements or continuous flow needs.</p>
<p><strong>Team Structure and Expertise:</strong> Consider the composition of your team and their experience with Agile methodologies.</p>
<p>Teams with diverse skills and extensive Agile experience may be more inclined to adopt Extreme Programming (XP) with its emphasis on practices like TDD and pair programming. Conversely, teams with less Agile experience might find Scrum's structured framework easier to implement.</p>
<p><strong>Customer Engagement:</strong> The level of customer engagement and the need for constant customer feedback are crucial factors.</p>
<p>If you have direct access to customers and require frequent feedback, Scrum's focus on customer collaboration through ceremonies like Sprint Reviews is advantageous.</p>
<p><strong>Development Environment:</strong> Evaluate your organization's development environment. If you work in an environment where tasks continuously arise with no fixed iteration timelines, Kanban's continuous flow model can better accommodate these dynamic workflows.</p>
<p><strong>Organizational Culture:</strong> Analyze your organization's culture and willingness to embrace Agile practices.</p>
<p>Some Agile methodologies, like Scrum, require significant changes in project management and team dynamics, which may necessitate strong support from management and a cultural shift.</p>
<h3 id="heading-how-to-tailor-agile-practices-to-suit-your-organization">How to Tailor Agile Practices to Suit Your Organization</h3>
<ul>
<li><p><strong>Hybrid Approaches:</strong> Don't be afraid to adopt a hybrid Agile approach that combines elements from different methodologies. For example, you can use Scrum for project planning and sprint-based development while implementing Kanban's continuous flow model for support and maintenance tasks.</p>
</li>
<li><p><strong>Iterative Adaptations:</strong> Agile is all about continuous improvement and adaptation. Encourage your team to inspect and adapt their Agile processes regularly. This iterative approach allows you to fine-tune your practices to better suit your team's needs and project requirements.</p>
</li>
<li><p><strong>Training and Coaching:</strong> Provide Agile training and coaching to team members, especially if your organization is new to Agile methodologies. Proper education can help teams understand the principles and practices, fostering a smoother adoption process.</p>
</li>
<li><p><strong>Flexibility in Scaling:</strong> As your team grows and takes on more significant projects, consider the scalability of your chosen Agile approach. Some methodologies, like Scrum, have well-defined scaling frameworks like SAFe (Scaled Agile Framework) and LeSS (Large-Scale Scrum), which can be tailored to fit larger teams and complex projects.</p>
</li>
</ul>
<p>Choosing the right Agile approach for your team requires a thoughtful analysis of project requirements, team dynamics, and organizational context.</p>
<p>By considering factors such as project scope, team expertise, customer engagement, and organizational culture, you can make an informed decision on which Agile methodology aligns best with your team's needs.</p>
<p>Remember that Agile is not a one-size-fits-all solution. The key to successful Agile implementation lies in adapting and tailoring Agile practices to suit your unique circumstances and goals.</p>
<h2 id="heading-agile-scaling-beyond-the-team-level">Agile Scaling: Beyond the Team Level</h2>
<p>Agile methodologies have proven to be highly effective at the team level, promoting collaboration, flexibility, and value-driven development.</p>
<p>But as organizations grow and undertake more extensive and complex projects, you'll need to scale Agile practices beyond individual teams.</p>
<p>Agile Scaling addresses the challenges of coordinating multiple teams, aligning strategic goals, and ensuring seamless communication across the organization. In this section, we will explore the concept of Agile Scaling and some popular frameworks that facilitate Agile implementation at the enterprise level.</p>
<h3 id="heading-understanding-agile-scaling">Understanding Agile Scaling</h3>
<p>Agile Scaling involves applying Agile principles and practices across an entire organization to ensure that multiple teams work cohesively towards common goals.</p>
<p>At this level, Agile emphasizes cross-team collaboration, continuous integration, and maintaining a cohesive vision throughout the organization. The objective is to extend the Agile mindset beyond the team level and achieve an Agile culture at the enterprise level.</p>
<h3 id="heading-popular-agile-scaling-frameworks">Popular Agile Scaling Frameworks</h3>
<h4 id="heading-scaled-agile-framework-safe">Scaled Agile Framework (SAFe)</h4>
<p>SAFe is one of the most widely adopted Agile Scaling frameworks. It provides a structured and scalable approach to implementing Agile across large enterprises.</p>
<p>SAFe introduces three primary levels of scaling: team, program, and portfolio. It offers practices, roles, and ceremonies that align teams' efforts, foster cross-team collaboration, and enable organizations to synchronize delivery on a larger scale.</p>
<h4 id="heading-large-scale-scrum-less">Large-Scale Scrum (LeSS)</h4>
<p>LeSS is another Agile Scaling framework that focuses on scaling Scrum principles without introducing additional complexity. It promotes a single product backlog, shared sprint goals, and cross-functional feature teams.</p>
<p>LeSS encourages decentralization, simplicity, and organizational alignment, making it suitable for organizations seeking a lightweight approach to scaling Agile.</p>
<h4 id="heading-nexus-framework">Nexus Framework</h4>
<p>Nexus is a lightweight Agile Scaling framework developed by Scrum.org. It extends Scrum by providing additional roles, events, and artifacts for scaling across multiple Scrum teams.</p>
<p>Nexus focuses on minimizing dependencies between teams, promoting effective communication, and ensuring a consistent definition of "done" across all teams.</p>
<h3 id="heading-benefits-of-agile-scaling">Benefits of Agile Scaling</h3>
<ol>
<li><p><strong>Improved Coordination:</strong> Agile Scaling frameworks enable multiple teams to align their efforts and synchronize their activities, reducing duplication of work and enhancing overall productivity.</p>
</li>
<li><p><strong>Enhanced Visibility:</strong> Agile Scaling provides a comprehensive view of project progress and impediments at the enterprise level. This transparency allows leadership to make data-driven decisions and address organizational challenges proactively.</p>
</li>
<li><p><strong>Agile Culture and Values:</strong> Scaling Agile beyond the team level reinforces the Agile values and principles throughout the organization, creating a shared mindset of customer value, collaboration, and continuous improvement.</p>
</li>
<li><p><strong>Faster Time-to-Market:</strong> Agile Scaling fosters more efficient coordination between teams, resulting in quicker time-to-market for complex projects.</p>
</li>
</ol>
<h3 id="heading-challenges-and-considerations">Challenges and Considerations</h3>
<ul>
<li><p><strong>Cultural Shift:</strong> Scaling Agile requires a cultural shift at the organizational level, which can be challenging. Leadership support, training, and consistent messaging are essential to foster an Agile mindset across the entire organization.</p>
</li>
<li><p><strong>Integration with Existing Processes:</strong> Agile Scaling must integrate with existing project management and development processes to ensure a smooth transition and to address any potential conflicts.</p>
</li>
<li><p><strong>Governance and Decision-Making:</strong> Balancing decentralized decision-making with centralized governance can be complex. Organizations need to strike a balance that empowers teams while maintaining strategic alignment.</p>
</li>
<li><p><strong>Communication and Collaboration:</strong> Effective communication and collaboration mechanisms must be established to keep all teams informed and synchronized.</p>
</li>
</ul>
<p>Agile Scaling is crucial for organizations seeking to extend the benefits of Agile beyond individual teams and apply them at the enterprise level.</p>
<p>By adopting popular Agile Scaling frameworks like SAFe, LeSS, or Nexus, organizations can streamline coordination, enhance visibility, and promote a culture of agility across the entire organization.</p>
<p>Agile Scaling does come with its challenges, requiring careful planning, cultural alignment, and a willingness to adapt existing processes. With the right approach and commitment, Agile Scaling can pave the way for improved productivity, customer value, and successful delivery of complex projects at the enterprise level.</p>
<h2 id="heading-agile-and-devops-integration-for-continuous-delivery">Agile and DevOps: Integration for Continuous Delivery</h2>
<p>Agile and DevOps are two complementary practices that, when integrated, create a powerful synergy for delivering software at high speed and quality.</p>
<p>Agile focuses on iterative development, customer collaboration, and adaptability, while DevOps emphasizes collaboration between development and operations teams to automate and streamline the software delivery process.</p>
<p>In this section, we will explore the integration of Agile and DevOps, the associated benefits, and how it enables organizations to achieve continuous delivery.</p>
<h3 id="heading-agile-and-devops-a-natural-partnership">Agile and DevOps: A Natural Partnership</h3>
<p>Both Agile and DevOps share common objectives, including faster time-to-market, improved collaboration, and delivering value to customers. By combining their principles and practices, organizations can align their efforts to achieve these shared goals seamlessly.</p>
<p>Additionally, Agile promotes frequent feedback through its iterative development approach, while DevOps encourages continuous feedback by automating testing, monitoring, and deployment processes. Integrating these practices ensures continuous improvement based on real-time feedback.</p>
<h3 id="heading-the-journey-to-continuous-delivery">The Journey to Continuous Delivery</h3>
<p>Agile and DevOps collaboration breaks down traditional silos between development and operations teams. Cross-functional teams work together throughout the software development lifecycle, from design and development to testing and deployment.</p>
<p>DevOps automation tools enable continuous integration and deployment, allowing teams to automatically test and deploy code changes. This automated pipeline reduces manual intervention and ensures faster, more reliable releases.</p>
<p>And finally, Agile and DevOps promote early and continuous testing. In Agile, testing is incorporated from the start of development, while DevOps encourages "shift-left" testing to identify and address issues as early as possible in the delivery process.</p>
<h3 id="heading-benefits-of-agile-and-devops-integration">Benefits of Agile and DevOps Integration</h3>
<ol>
<li><p><strong>Faster Time-to-Market:</strong> The combination of Agile's iterative development and DevOps' automation enables organizations to deliver new features and updates to customers rapidly.</p>
</li>
<li><p><strong>Higher Quality Software:</strong> With automated testing and continuous feedback, the integration of Agile and DevOps reduces the risk of defects and enhances the overall quality of software products.</p>
</li>
<li><p><strong>Continuous Improvement:</strong> Agile and DevOps foster a culture of continuous improvement, where teams regularly inspect and adapt their processes to drive efficiencies and optimize the delivery pipeline.</p>
</li>
<li><p><strong>Enhanced Collaboration:</strong> Agile and DevOps integration promotes collaboration and communication between development, operations, and other stakeholders, breaking down traditional barriers and fostering a sense of shared ownership.</p>
</li>
</ol>
<h3 id="heading-overcoming-challenges">Overcoming Challenges</h3>
<ol>
<li><p><strong>Cultural Shift:</strong> Integrating Agile and DevOps requires a cultural shift that embraces collaboration, transparency, and a focus on delivering value. Organizations need to promote a culture of continuous learning and improvement.</p>
</li>
<li><p><strong>Toolchain Integration:</strong> Seamless integration of tools used for Agile and DevOps practices is essential for efficient collaboration and automated workflows. Ensuring compatibility and data exchange between tools is vital for a successful integration.</p>
</li>
<li><p><strong>Learning Curve:</strong> Teams may face a learning curve when adopting new Agile and DevOps practices. Training and support are crucial to help team members embrace the new approach effectively.</p>
</li>
</ol>
<p>Agile and DevOps integration creates a potent combination for achieving continuous delivery of high-quality software.</p>
<p>By aligning their principles, practices, and goals, organizations can streamline their development and operations processes, delivering value to customers faster and more efficiently.</p>
<p>The cultural shift towards collaboration, the adoption of automation, and the commitment to continuous improvement are vital elements in realizing the full potential of the Agile and DevOps integration. This enables organizations to thrive in the dynamic and fast-paced world of software development.</p>
<h2 id="heading-future-trends-in-agile-software-development">Future Trends in Agile Software Development</h2>
<p>Agile Software Development has continuously evolved since its inception, and it is poised to experience even more transformations in the future.</p>
<p>As technology advances, market demands change, and organizations seek more efficient ways to deliver software, new trends are emerging in the Agile landscape.</p>
<p>In this section, we will explore some of the future trends in Agile Software Development and their potential impact on the industry.</p>
<h3 id="heading-agile-at-scale">Agile at Scale</h3>
<p>The trend of scaling Agile to address the needs of large enterprises and complex projects is expected to gain momentum. Organizations are increasingly adopting Agile Scaling frameworks like SAFe, LeSS, and Nexus to coordinate multiple teams, align strategic initiatives, and achieve seamless collaboration across the enterprise.</p>
<p>Agile Scaling allows organizations to extend Agile practices beyond individual teams and create a more holistic Agile culture at the organizational level. As companies grow and undertake larger projects, Agile at Scale will be a critical enabler of success.</p>
<h3 id="heading-value-stream-management-vsm">Value Stream Management (VSM)</h3>
<p>Value Stream Management is a trend that aims to optimize the end-to-end software development value stream, from ideation to deployment and beyond. VSM involves analyzing and visualizing the entire flow of work, identifying bottlenecks, and continuously improving the process to maximize value delivery.</p>
<p>By leveraging data analytics, AI-driven insights, and automation, VSM empowers organizations to make data-driven decisions and enhance the efficiency and quality of software development. This trend aligns well with Agile's focus on delivering customer value and continuous improvement.</p>
<h3 id="heading-agile-and-aiml-integration">Agile and AI/ML Integration</h3>
<p>Artificial Intelligence (AI) and Machine Learning (ML) are rapidly transforming various industries, and their integration with Agile Software Development is becoming increasingly prevalent.</p>
<p>AI-powered tools can assist teams in automating tasks, predicting project risks, and providing data-driven insights for decision-making.</p>
<p>ML algorithms can aid in demand forecasting, resource allocation, and sprint planning. Integrating Agile with AI/ML technologies can significantly boost productivity, optimize resource utilization, and enable teams to make more informed decisions.</p>
<h3 id="heading-agile-for-non-software-projects">Agile for Non-Software Projects</h3>
<p>While Agile was initially developed for software development, its principles and practices are increasingly being adapted for non-software projects. Industries such as marketing, HR, and finance are embracing Agile methodologies to improve project management, collaboration, and adaptability.</p>
<p>Agile's iterative approach and customer-centric mindset can be highly valuable in non-software domains, where requirements change frequently, and feedback from stakeholders is crucial.</p>
<h3 id="heading-agile-and-remote-work">Agile and Remote Work</h3>
<p>The shift towards remote work, accelerated by global events, has prompted a reevaluation of Agile practices to accommodate distributed teams. Future trends in Agile will likely focus on enhancing collaboration and communication in remote settings.</p>
<p>Agile project management tools and virtual collaboration platforms will continue to evolve to facilitate seamless remote team collaboration and maintain the Agile spirit of face-to-face interactions.</p>
<p>The future of Agile Software Development holds exciting possibilities. Agile at Scale will be essential for large organizations seeking to coordinate multiple teams and projects efficiently. The adoption of Value Stream Management will drive continuous improvement and customer value delivery.</p>
<p>Integration with AI/ML technologies will revolutionize how teams plan and execute projects.</p>
<p>Agile's expansion into non-software domains and adaptation to remote work settings will foster Agile principles beyond traditional software development contexts.</p>
<p>As the industry evolves, Agile Software Development will continue to adapt and innovate. This will ensure that organizations remain agile, responsive, and capable of meeting the dynamic demands of the ever-changing digital landscape.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Agile Software Development has revolutionized the way software projects are managed and delivered. It empowers teams to adapt, innovate, and respond to customer needs more effectively than ever before.</p>
<p>In this handbook, we explored Agile methodologies, including Scrum, Kanban, Extreme Programming (XP), and Lean. We have witnessed how Agile principles and practices have reshaped the software development landscape, driving a customer-centric, collaborative, and iterative approach to project management.</p>
<p>While examining Agile's core concepts, we discovered how Scrum provides structure and predictability through sprints, while Kanban offers flexibility and continuous flow. Extreme Programming (XP) encourages high-quality code through test-driven development and pair programming, while Lean focuses on value delivery and waste reduction.</p>
<p>We also explored how these methodologies complement each other, how to choose the right approach for your team, and how Agile can scale beyond individual teams to the enterprise level.</p>
<p>The future of Agile Software Development promises even more exciting possibilities. As Agile at Scale gains traction, organizations will harness the power of Agile principles to coordinate and align efforts across the entire enterprise.</p>
<p>Value Stream Management will enable continuous improvement and data-driven decision-making, enhancing the efficiency and quality of software development. Agile's integration with AI/ML technologies will propel teams to new heights of productivity and insights.</p>
<p>But Agile's adaptability extends beyond the realm of software development, making its mark in various non-software domains where responsiveness and collaboration are critical. The trend of remote work further challenges Agile to evolve and embrace virtual collaboration while preserving the Agile spirit of continuous feedback and self-organizing teams.</p>
<p>As we embrace the future of Agile Software Development, it is essential to remember that Agile is not merely a set of practices, but a mindset and philosophy that values individuals, collaboration, and customer satisfaction.</p>
<p>By fostering a culture of continuous learning, innovation, and adaptability, organizations can fully harness the potential of Agile to stay ahead in an ever-changing, dynamic market.</p>
<p>Ultimately, Agile Software Development has transformed how we approach projects, emphasizing value, collaboration, and continuous improvement. As Agile methodologies continue to evolve and integrate with emerging technologies, the future promises even greater advancements, pushing the boundaries of what is possible in the world of software development.</p>
<p>By embracing Agile's guiding principles and harnessing its potential, organizations can navigate the complexities of the digital age with confidence and drive meaningful, customer-centric outcomes in an ever-evolving and competitive landscape.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is DevOps? How Development + Operations Helps Teams Work More Efficiently ]]>
                </title>
                <description>
                    <![CDATA[ By Satyam Tripathi When developers and operations teams work together, they can identify and solve problems more quickly. This helps them deliver software to users faster and with fewer errors.  This general practice is called DevOps. It involves usi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-devops-works/</link>
                <guid isPermaLink="false">66d4617247a8245f78752ad0</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Devops ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 17 Apr 2023 23:37:44 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/03/Getting-Started-With-DevOps--3--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Satyam Tripathi</p>
<p>When developers and operations teams work together, they can identify and solve problems more quickly. This helps them deliver software to users faster and with fewer errors. </p>
<p>This general practice is called DevOps. It involves using tools and techniques to automate tasks and make software development and deployment more efficient. </p>
<p>In this tutorial, we will explore what DevOps is and why organizations should have DevOps specialists. We'll also discuss the DevOps lifecycle and compare it with the Agile methodology.</p>
<h2 id="heading-what-is-devops">What is DevOps?</h2>
<p>DevOps, at its core, focuses on implementing automation at each and every stage of the software development lifecycle. </p>
<p>The term <strong>DevOps</strong> is a combination of two terms: <strong>Development</strong> and <strong>Operations</strong>. DevOps aims to simplify and reduce the development life cycle of a system. </p>
<p>The DevOps Team is a combination of the Development Team and the Operations Team.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/04/9ef9adf1-e2b7-45c1-acc1-5c5c4bf30c7a.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Development Team &amp; Operations Team working separately</em></p>
<p><strong>DevOps</strong> is a methodology that allows a single team to manage the entire application development life cycle – that is development, testing, deployment, and operations.</p>
<p>This approach can help your team produce superior quality software quickly and with more reliability.</p>
<h2 id="heading-how-does-devops-work">How Does DevOps Work?</h2>
<p>Before DevOps, the development team and the operations team worked separately. This often created a lot of issues in production because both teams were working separately without consulting each other and integrating best practices.</p>
<p>Suppose the operations team has an issue during deployment and they want to communicate with the deployment team. But the deployment team isn't available at that time, so they have to wait a while. Not only that, but the <strong>entire process was manual</strong>.</p>
<p>Because of all of these issues, the DevOps team got created. Again, it combines the <code>Development Team</code> and the <code>Operations Team</code> and automates every step of the process.</p>
<p>Let's look at a sample workflow a DevOps team might follow:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/04/82adf101-a348-4089-9d44-421c436b2b34.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>DevOps workflow</em></p>
<p>In general, developers use version control systems like <code>Git</code> to manage changes in their codebase, and they can use platforms like <code>GitHub</code> to collaborate with others and share their work. </p>
<p>Continuous integration and continuous delivery (CI/CD) tools like <code>Jenkins</code> can be used to automate software building, testing, and deployment, and they often work together with build automation tools like <code>Maven</code>.</p>
<p>Browser automation tools like <code>Selenium</code> can be used to automate web application testing, and deployment automation tools like <code>Chef</code>, <code>Ansible</code>, <code>Docker</code>, and <code>Kubernetes</code> can be used to automate the process of deploying software to different environments. </p>
<p>Finally, monitoring tools like <code>AWS CloudWatch</code> can be used to monitor software applications and infrastructure performance and health.</p>
<h2 id="heading-why-do-you-need-a-devops-specialist">Why Do You Need a DevOps Specialist?</h2>
<p>A DevOps specialist plays an important role in achieving the goals of fast delivery, high quality, reduced costs, and improved reliability of software releases.</p>
<h3 id="heading-fast-delivery">Fast delivery:</h3>
<p>DevOps specialists help streamline the development process by automating build, test, and deployment pipelines, allowing the company to release software more quickly. They also help identify and resolve bottlenecks in the development process, improving efficiency, and reducing delays.</p>
<h3 id="heading-high-quality">High quality:</h3>
<p>DevOps specialists work closely with development and operations teams to ensure that software releases meet the necessary quality standards. They also make sure that customer feedback is incorporated into future releases, allowing the company to continually improve the quality of its software.</p>
<h3 id="heading-less-capex-capital-expenditure-opex-operational-expenditure">Less Capex (Capital Expenditure) + Opex (Operational Expenditure):</h3>
<p>DevOps specialists help identify and implement tools and processes that reduce the time and resources required for software releases. By automating manual tasks and reducing the need for manual intervention, organizations can save time and money, and improve overall efficiency.</p>
<h3 id="heading-reduce-outages">Reduce outages:</h3>
<p>DevOps specialists help reduce outages and improve reliability by implementing monitoring and alerting systems that proactively identify and address issues before they become major problems.</p>
<h2 id="heading-devops-life-cycle">DevOps Life Cycle</h2>
<p>When building a product, teams go through what is known as the Software Development Life Cycle (SDLC). It's a process used by software development teams to design, develop, test, and deploy software applications. </p>
<p>It is helps to ensure that software is delivered on time, within budget, and meets the requirements of stakeholders. </p>
<p>Before DevOps, we used to follow the waterfall or step-by-step model.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/04/1412252f-d8ea-4e39-b05e-9be6beeb7617.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Waterfall methodology for developing any software</em></p>
<p>The Waterfall methodology has been largely replaced by Agile methodology. The main difference between Agile and Waterfall is that Waterfall is a linear system of working that requires the team to complete each project phase before moving on to the next one. Agile, on the other hand, encourages the team to work simultaneously on different phases of the project and allows them to iterate, make changes, and check in along the way. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/04/4573b0c1-8cbf-41f0-8bba-2fe62cd5885c.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>DevOps is an extension of Agile, which itself evolved from the traditional Waterfall methodology.</em></p>
<p>DevOps is an extension of Agile practices. DevOps builds on the principles of Agile, which emphasizes collaboration, flexibility, and iterative development.</p>
<p>Agile phases are comprised of scrums, sprint planning, sprint review, and so on. DevOps, on the other hand, includes planning, building, continuous delivery, testing, and feedback.</p>
<p><strong>Example:</strong></p>
<p>Suppose a customer wants to build an e-commerce app. Let's have a look at the workflow:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/04/04a596bd-a7c2-4626-bccc-2e2540d41403.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Each sprint involves: Develop, Build, Test, and Deploy</em></p>
<p>The sprints shown in the figure represent the steps in the project. Each sprint includes Develop, Build, Test, and Deploy phases.</p>
<p>After completing a sprint, the team contacts the client to check in. If the client wants any changes, the team can easily make them. Once a sprint finishes, the team move on to the next one.</p>
<p>This process may take several days or weeks, which is where DevOps comes in. By implementing DevOps practices like continuous integration and continuous delivery, you can automate the process of building, testing, and deploying the app.</p>
<p>If any issues arise, the team can quickly fix them without causing any downtime for the users.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/04/46b3dbad-621f-4864-b052-9e9d2e6d33dd.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>This is how the DevOps team works to build any software more efficiently.</em></p>
<h2 id="heading-myths-about-devops">Myths about DevOps:</h2>
<ol>
<li><em>Deep Knowledge of a programming language is required:</em> You only need to have a basic understanding of programming concepts to be able to work with code and automate processes.</li>
<li><em>Linux experience is a must:</em> You don't need to be an expert in it. Knowing some basic commands and navigating the file system is enough to get started.</li>
<li><em>Prior IT experience is required:</em> DevOps is about collaboration between development and operations teams to improve software delivery. You don't need prior IT experience to be part of a DevOps team.</li>
<li><em>Non-technical background people can't be a DevOps engineer:</em> Anyone can become a DevOps engineer, regardless of their technical background. While technical skills are important, soft skills like teamwork, communication, and problem-solving are equally valuable in DevOps.</li>
</ol>
<h2 id="heading-wrapping-up">Wrapping Up</h2>
<p>In this article, we discussed how to get started with DevOps, why companies need a DevOps specialist, how DevOps works, and the DevOps life cycle.</p>
<p>You can feel confident learning about DevOps as DevOps isn't going anywhere. DevOps is a methodology that is becoming increasingly popular among organizations that are looking for ways to improve their software development process.</p>
<p>I hope that I have added some value 🚀</p>
<p>You can follow me on <a target="_blank" href="https://twitter.com/triposat"><strong>Twitter</strong></a> &amp; <a target="_blank" href="https://www.linkedin.com/in/triposat/">LinkedIn</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Speed up Your Software Development Pipeline ]]>
                </title>
                <description>
                    <![CDATA[ By Andrej Kovacevic If you've ever managed a software development pipeline—or have plans to do so—there's one thing you'll need to prioritize above almost all else: speed.  No matter the type of software you're working on, you'll always be under pres... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-speed-up-your-software-development-pipeline/</link>
                <guid isPermaLink="false">66d45da8787a2a3b05af438e</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 19 Dec 2022 17:51:06 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/12/software-development-team.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Andrej Kovacevic</p>
<p>If you've ever managed a software development pipeline—or have plans to do so—there's one thing you'll need to prioritize above almost all else: speed. </p>
<p>No matter the type of software you're working on, you'll always be under pressure to speed up your team's deliverables.</p>
<p>Some of that pressure might come from project stakeholders who lack an understanding of how software development works. Sometimes it's because your management team or client fears a competitor will beat them to the punch. </p>
<p>No matter the reason, though, you'll need to know some strategies to speed up your team's cadence without compromising <a target="_blank" href="https://www.freecodecamp.org/news/how-to-write-secure-source-code-for-proprietary-software/">code quality or security</a>.</p>
<p>Doing so isn't as difficult as you might think. All you need to do is to put the right procedures in place and back them with the right technology. To help, here are five tips designed to help software development teams work as quickly and efficiently as possible.</p>
<p>By implementing all of them, it's possible to maintain a quick deliverables pace without sacrificing a thing. Let's get started.</p>
<h2 id="heading-1-create-a-detailed-roadmap-and-stick-to-it">1. Create a Detailed Roadmap and Stick to It</h2>
<p>Perhaps the most important thing a development manager can do to keep work flowing smoothly through their team's work pipeline is to take the time to create a <a target="_blank" href="https://asperbrothers.com/blog/software-development-roadmap/">detailed development roadmap</a> for every project before work begins. </p>
<p>An effective roadmap delineates all of the major steps required to complete the project and assigns major parts of the work to specific team members at the outset.</p>
<p>This is a step that many software development managers hurry through—believing that every minute spent planning and not coding is a minute wasted. </p>
<p>Nothing, however, could be further from the truth. By making major decisions about the development process in advance, the team won't have to break stride later on. Plus, the process of building the roadmap will often uncover hurdles that would have brought work to a screeching halt mid-stream.</p>
<p>It's always better to clear the road ahead before getting to work if you want to keep a software project moving forward at a high rate of speed.</p>
<h2 id="heading-2-set-work-in-progress-limits">2. Set Work-in-Progress Limits</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/project-management-tracking.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Image source: NicoElNino / Adobe Stock</em></p>
<p>These days, most software development pipelines conform to the <a target="_blank" href="https://www.freecodecamp.org/news/being-agile-kanban-vs-scrum/">Kanban or Scrum</a> project management methodologies. And even those that don't still tend to include some form of a Kanban-style board to track project tasks at various stages of completion. </p>
<p>Those work-in-progress (WIP) items help managers maintain visibility into their team's progress and capacity to handle more work.</p>
<p>The trouble is, “scope creep” often sets in, and it's quite easy for a development team's WIP list to get out of hand in a hurry. When that happens, team members will try to multitask, hopping between various WIP items to try and clear the backlog. When they do, it's common for the team's pace to slow to a crawl and for errors to begin creeping into the code.</p>
<p>The problem is that despite many programmers' beliefs to the contrary, <a target="_blank" href="https://health.clevelandclinic.org/science-clear-multitasking-doesnt-work/">humans don't multitask well</a>. The solution, in this case, is to prevent them from trying.</p>
<p>Setting hard limits on the number of WIP items allowed in each stage of the workflow is an excellent way to do that. Doing so guarantees that team members won't bite off more than they can chew and will get more tasks done in less time than they otherwise would have.</p>
<h2 id="heading-3-centralize-and-automate-secrets-management">3. Centralize and Automate Secrets Management</h2>
<p>A software team working quickly can churn out great apps, but it's often at the expense of security. This is especially true for teams working with an array of servers, services, and containers spread over multiple disparate systems. </p>
<p>In those situations, most development teams will designate a single person to manage access to all of the necessary systems and data. However, that creates a bottleneck, since all access requests must flow through that person, and developers can't always move forward until they receive the necessary credentials.</p>
<p>The solution to the problem is to centralize and automate access provisioning and access revocation, and to automate it to the greatest extent possible. </p>
<p>There are a variety of open-source tools that can help facilitate that, and a variety of cloud-based secrets management solutions as well. </p>
<p>One of the most well-known examples is the open-source solution <a target="_blank" href="https://www.hashicorp.com/products/vault">HashiCorp Vault</a>. However, it's not the easiest solution to get up and running with. For some development teams, installation and configuration of the system itself are difficult enough to dissuade them from using it.</p>
<p>It is also worth noting that developers using Google or AWS as a development platform can make use of their respective secrets management tools. They're purpose-built to integrate with project development taking place on those platforms. That means they're typically easy to integrate into workflows without much hassle.</p>
<p>Or, for development teams working in multi-cloud environments, a solution like <a target="_blank" href="https://www.akeyless.io/">Akeyless</a> is often a good fit. Since it's API-based, it integrates with most types of secured systems developers depend on. And, since it operates under the zero-trust paradigm, it doesn't require developers to entrust their project's security to any third parties. </p>
<p>Once a project's up and running with Akeyless, the platform handles the rest. That leaves developers to focus on their work, with all secrets left outside the code, because Akeyless automates the generation and injection of secrets. This lets developers can worry less about security and more about getting their work done.</p>
<h2 id="heading-4-dont-cut-corners-to-bypass-code-problems">4. Don't Cut Corners to Bypass Code Problems</h2>
<p>Any developer who's worked on a complex software project can tell you that there are always code problems that crop up throughout the development process without any obvious solutions.</p>
<p>In many cases, development teams resort to quick and dirty fixes to solve such issues so they can move on quickly. This is how your project can amass a mountain of <a target="_blank" href="https://www.freecodecamp.org/news/tame-your-tech-debt-by-refactoring-more-often-fcc34dd24a33/">technical debt</a> in a hurry, and it will come back to haunt the project in the long run.</p>
<p>If overall development speed is your goal, it's better to take the time to find real solutions to problems as they come up. Even if you need to halt development periodically to do so, you'll save more time in the long run by doing things this way. This is because the true consequences of a cut corner may not become evident until later in the development process, when it may be all but impossible to fix.</p>
<p>It's better to build time for code refactoring and other housekeeping steps into the development roadmap in advance to avoid ending up in that situation in the first place.</p>
<h2 id="heading-5-set-aside-inviolable-deep-work-time">5. Set Aside Inviolable Deep Work Time</h2>
<p>According to a recent survey, the average software engineer only manages to squeeze about <a target="_blank" href="https://retool.com/reports/state-of-engineering-time-2022/">10 hours of so-called deep work time</a> into the average workweek. </p>
<p>The key reason is, most developers have to deal with an <a target="_blank" href="https://daedtech.com/programmers-teach-non-geeks-the-true-cost-of-interruptions/">avalanche of interruptions</a> that break their coding rhythm and eat up their time and attention. From sudden code review requests to unsolicited client feedback, there's no end to the things that can force a developer to drop what they're doing and divert their attention elsewhere.</p>
<p>A savvy development manager can help the situation somewhat by letting team members set specific time blocks aside as inviolable deep work time. It means letting the team member lock in and running whatever interference is necessary to prevent their interruption.</p>
<p>For remote teams, this is as simple as allowing the team to disconnect from chat apps and email for the duration of their work block. </p>
<p>In-office teams have to work a bit harder to do this. In an office setting, it will be up to the development manager to intercept any and all incoming requests that would otherwise reach the team and disrupt them. It may require putting their foot down to higher-level managers or even clients.</p>
<p>The key is to clearly state <em>why</em> interruptions aren't allowed and tie it to meaningful productivity metrics. Anything to get the message across that leaving the team to their work is essential. </p>
<p>Or, if those things won't work, it could be worthwhile to authorize a rotating work-from-home policy to let team members escape the office to get meaningful work done.</p>
<h2 id="heading-the-takeaways">The Takeaways</h2>
<p>The five tips detailed here work wonders to remove common software development stumbling blocks and other procedural time-wasters that can slow down task completion. Together, they should enable a development team to make quick and steady progress on a software project with a minimum of unexpected slowdowns.</p>
<p>Of course, reality dictates that no roadmap is perfect and that expecting the unexpected is always par for the course. But by addressing the bottlenecks and slowdowns that tend to affect every software development project, you and your team will make the most of their time and maintain a pace that other developers would envy.</p>
<p><em>Feature image licensed via snowing 12 / Adobe Stock</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ PMP Certification Cost – 2022 Exam Fees, Degree Requirements, and Years of Experience ]]>
                </title>
                <description>
                    <![CDATA[ The Project Management Professional (PMP) is widely seen by project managers as the "gold standard" credential. Many senior PM roles now require you to be PMP certified. So if you have been working as a PM for a few years, this guide will show you ho... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/pmp-certification-cost-degree-experience/</link>
                <guid isPermaLink="false">66b8d4f2eb5c4db85a0b33ff</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Sun, 10 Apr 2022 15:44:12 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/04/adetola-afolabi-W6Xfv9Rq1j0-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The Project Management Professional (PMP) is widely seen by project managers as the "gold standard" credential. Many senior PM roles now require you to be PMP certified.</p>
<p>So if you have been working as a PM for a few years, this guide will show you how you can take the next step.</p>
<p>I'll cover exam costs, degree requirements, experience requirements, and share some study resources, too.</p>
<h2 id="heading-how-much-is-the-pmp-exam-in-2022">How much is the PMP exam in 2022?</h2>
<p>This varies from country to country. I created this table of exam prices for several major countries:</p>
<pre><code>+--------------+----------------+
|   Country    | PMP Exam Price |
+--------------+----------------+
| USA          | $<span class="hljs-number">555</span>           |
| Canada       | $<span class="hljs-number">555</span>           |
| Australia    | $<span class="hljs-number">719</span>           |
| New Zealand  | $<span class="hljs-number">719</span>           |
| UK           | £<span class="hljs-number">339</span>           |
| Ireland      | €<span class="hljs-number">399</span>           |
| South Africa | R5999          |
| India        | INR <span class="hljs-number">35000</span>      |
+--------------+----------------+
</code></pre><h3 id="heading-what-is-the-total-cost-of-pmp-certification">What is the total cost of PMP certification?</h3>
<p>In terms of money, it's US $555. But keep in mind, passing the PMP exam will also require preparation. Exam prep programs cost between $600 and $1,200.</p>
<p>And then there's the real cost: time. You have to earn a considerable amount of work experience before you are qualified to sit for the exam.</p>
<h2 id="heading-is-a-pmp-worth-getting">Is a PMP worth getting?</h2>
<p>This ultimately depends on your career goals. Do you plan to make Project Management your long term career?</p>
<p>If so, Project Management Institute (PMI) certifications like the PMP may be required for you to continue to get promoted. And getting promoted is probably the surest path to salary increases.</p>
<p>So from where I'm sitting, it seems like an easy decision.</p>
<h3 id="heading-does-pmp-certification-increase-salary">Does PMP certification increase salary?</h3>
<p>Yes. In the US, certification is tied to new potential job roles. Here's a table of median wages:</p>
<pre><code>+---------------------+---------------+
|      Job title      | Annual salary |
+---------------------+---------------+
| Project Manager I   | $<span class="hljs-number">83</span>,<span class="hljs-number">000</span>       |
| Project Manager II  | $<span class="hljs-number">96</span>,<span class="hljs-number">063</span>       |
| Project Manager III | $<span class="hljs-number">115</span>,<span class="hljs-number">000</span>      |
+---------------------+---------------+
</code></pre><p>This information comes straight from the PMI (who oversee PMP certification).</p>
<p>And PMI says that PMPs in Pakistan, Egypt, Saudi Arabia, and New Zealand have experienced even more dramatic salary increases than that.</p>
<h2 id="heading-who-is-eligible-for-pmp-how-many-years-of-experience-do-you-need">Who is eligible for PMP? How many years of experience do you need?</h2>
<p>In order to sit for the PMP exam, you have to be a Project Manager who meets the following qualifications:</p>
<ol>
<li>A four-year degree</li>
<li>36 months worth of experience leading projects</li>
<li>35 hours worth of taking formal project management training, or earning the CAPM Certification</li>
</ol>
<p>That's 3 full years of working as a project manager.</p>
<p>But wait – what if you don't have a 4-year degree? Is there is an alternate path.</p>
<h3 id="heading-can-you-get-pmp-without-a-degree">Can you get PMP without a degree?</h3>
<p>Yes. Thankfully, PMI allows people who didn't earn a 4 degree to still get PMP certified. It just requires an extra 2 years worth of project manager experience. (5 years total.)</p>
<p>Here are the exact qualifications:</p>
<ol>
<li>A high school diploma or an associate’s degree or equivalent. In the US, this would be a GED.</li>
<li>60 months worth of experience leading projects</li>
<li>35 hours worth of taking formal project management training, or earning the CAPM Certification</li>
</ol>
<h2 id="heading-how-do-i-start-preparing-for-pmp">How do I start preparing for PMP?</h2>
<p>I recommend you create a study plan, and schedule out exactly what you're planning to learn in what sequence. Be realistic. This is not an easy exam, and you will probably want to over-prepare.</p>
<p>You can review PMI's official <a target="_blank" href="https://www.pmi.org/-/media/pmi/documents/public/pdf/certifications/project-management-professional-exam-outline.pdf">PMP Exam Content Outline PDF</a>.</p>
<p>I also recommend reviewing this free <a target="_blank" href="https://www.edwel.com/materials/PMP-Exam-Prep-Manual-Online-Free%205_0_5.pdf">PMBOK Exam Tips PDF book</a>. Note that this is from 2014, but it is by far the most comprehensive guide I could find. If you find a better free guide, send it to me and I'll update this.</p>
<p>Finally, take practice exams and review your results periodically. This will help you identify areas you can improve upon.</p>
<h3 id="heading-is-the-pmp-test-hard">Is the PMP test hard?</h3>
<p>Yes. This is a serious exam that will require serious preparation. Again, you can review its contents through <a target="_blank" href="https://www.pmi.org/-/media/pmi/documents/public/pdf/certifications/project-management-professional-exam-outline.pdf">PMI's official PMP Exam Content Outline PDF</a>.</p>
<p>This said, if you have been working as a project manager for the past 3 years (or 5 years if you don't have a 4-year degree), I imagine you'll have plenty of exposure to most of these concepts. So exam prep may be more of a review for you.</p>
<h2 id="heading-is-pmp-only-for-software">Is PMP only for software?</h2>
<p>The Software industry is a a massive employer of PMP-certified project managers. But it is far from the only one.</p>
<p>Earning the PMP can help you find project management work in a variety of fields. Major employers include the construction industry, manufacturing, and non-software engineering projects.</p>
<h2 id="heading-should-i-get-capm-before-pmp">Should I get CAPM before PMP?</h2>
<p>You do not need the CAPM in order to take the PMP. But if you have the CAPM, it will save you from having to get the 35 hours of formal project management training required to sit for the PMP.</p>
<h2 id="heading-go-forth-and-actualize-your-project-manager-career-goals">Go forth and actualize your project manager career goals</h2>
<p>I hope you've found this helpful. If you want to learn more about programming and technology, try <a target="_blank" href="https://www.freecodecamp.org/learn">freeCodeCamp's core coding curriculum</a>. It's free.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The Best Tools for Continuous Testing – How to Keep Your Code Updates from Breaking Things ]]>
                </title>
                <description>
                    <![CDATA[ By Linda Ikechukwu These days, applications have to evolve as the needs of their target users grow and change. This is why engineering teams often adopt Agile software development principles (or any iterative variation). Agile principles involve cont... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/tools-for-continuous-testing/</link>
                <guid isPermaLink="false">66d4601a246e57ac83a2c78f</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ continuous delivery ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Continuous Integration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Software Testing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Testing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 19 Jan 2021 21:57:55 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/6006e5440a2838549dcb4be6.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Linda Ikechukwu</p>
<p>These days, applications have to evolve as the needs of their target users grow and change. This is why engineering teams often adopt Agile software development principles (or any iterative variation).</p>
<p>Agile principles involve continuous integration and continuous delivery (CI/CD). This means that developers will frequently make code updates for new features to the existing codebase of the application. </p>
<p>So then how can you verify that a recent code addition doesn't break a part of the application? The answer is continuous testing.</p>
<h2 id="heading-what-is-continuous-testing">What is Continuous Testing?</h2>
<p>Continuous testing is a critical part of the CI/CD pipeline. It helps development teams discover if a particular code commit will break the application build and if it should be integrated or not.</p>
<p>In other words, continuous testing is the practice of integrating <a target="_blank" href="https://www.perfecto.io/blog/what-is-test-automation">automated tests</a> into a software delivery pipeline to determine the risks associated with each code release or addition. These automated tests are usually triggered during or after builds and are carried out using automation testing frameworks or tools. </p>
<p>Let me now introduce you to four recommended automation tools you can use for continuous testing.</p>
<h2 id="heading-tools-for-continuous-testing">Tools for Continuous Testing</h2>
<h3 id="heading-1-testsigma">1. TestSigma</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-101.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><a target="_blank" href="https://testsigma.com/">TestSigma</a> is a cloud-based automation testing tool for continuous testing. It has a low learning curve, as automated tests can be written in plain English, and requires no coding skills. Tests can also be extended with Selenium and JS-based custom functions for more advanced use cases.</p>
<p>TestSigma can be used for web applications, native mobile apps, regression, cross-browser and data-driven testing. It also features inbuilt seamless integrations with test management, bug reporting, CI/CD, and communication tools such as GitHub, Slack, Jira, BrowserStack, Jenkins, AWS, Bamboo, Azure DevOps, Circle CI, and so on.</p>
<p>TestSigma also uses AI to reduce maintenance effort and increase productivity by identifying affected tests and potential failures upfront to save execution time &amp; cost, alongside other features. </p>
<p>The platform has a free tier, but to use all the features mentioned above, you’ll need to commit to a paid plan.</p>
<h3 id="heading-2-tricentis-tosca">2. Tricentis Tosca</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-102.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><a target="_blank" href="https://www.tricentis.com/products/automate-continuous-testing-tosca/">Tosca</a> is another no-code continuous testing tool which makes it easy to learn. QA engineers with zero scripting knowledge can easily set up automated tests using a GUI.</p>
<p>Tosca is suitable for enterprise-level applications and is versatile because it supports and integrates seamlessly with over 160 technologies/languages. With Tosca, you can run tests on the web, mobile, and desktops with Windows OS (Mac and Linux are only possible with virtualization tools).</p>
<p>Tosca automatically creates and provisions on-demand test data to reduce the time it takes to provision and make reliable test data for test automation. </p>
<p>The platform offers free trials for a limited amount of time and custom pricing, which the sales team decides on based on your specific needs.</p>
<h3 id="heading-3-katalon-studio">3. Katalon Studio</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-103.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><a target="_blank" href="https://www.katalon.com/">Katalon</a> is another comprehensive continuous testing tool built on top of the popular open-source Selenium and Appium. It can be used for testing web, API, mobile, and desktop applications across Windows, macOS, and Linux operating systems. </p>
<p>In fact, with Katalon, you can execute tests on all OSs, browsers, and devices, as well as on cloud, on-premise, and hybrid environments.</p>
<p>Katalon also provides other useful features like recording test steps, executing test cases, providing infrastructure, analytics reporting, and CI/CD integration with the most popular CI tools (like Jenkins, Bamboo, Azure, and CircleCI).</p>
<p>Katalon Studio is easy to get started with because it offers codeless test creation for beginners. For advanced usage, experts can extend automation capabilities using the plugins in the Katalon Store. </p>
<p>It also has extensive documentation featuring a well-organized library of tutorials alongside images and videos to help you out if you ever get stuck on something. It has a robust free tier and an enterprise tier for advanced usage.</p>
<h3 id="heading-4-watir">4. Watir</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-104.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><a target="_blank" href="http://watir.com/">Watir</a> is another continuous testing automation tool powered by the Selenium framework, and it is open-source. Watir can only run tests for web applications on Windows and can only execute simple and easily maintainable tests.</p>
<p>It is not codeless, as scripts have to be written in Ruby, Java, .NET or Python using its sister software: Watij, WatiN, and Nerodia. Regardless, it's easy to get started with if you're already familiar with Ruby because it features extensive documentation. </p>
<p>Watir can also be integrated with a couple of CI tools such as Jenkins and GitHub.</p>
<p>Even though Watir seems limited, most teams find its simplicity appealing. It is prevalent within the Ruby community and is even used by large companies like Slack and Oracle.</p>
<h2 id="heading-how-to-choose-a-continuous-testing-tool">How to choose a continuous testing tool</h2>
<p>There are other excellent continuous testing tools available aside from the four that I have mentioned above. I favour no-code testing tools because it lets teams set up and maintain automated tests much faster. </p>
<p>Regardless, here are a few things to consider before choosing a continuous testing tool:</p>
<ol>
<li><strong>Application types supported:</strong> Does the tool support your intended application type (for example, mobile, web, desktop)?</li>
<li><strong>Learning curve:</strong> How easy/difficult is it to use? Will you need to learn a new scripting language? Ideally, you should go for something with a low learning curve that you and your team can get started with in the shortest amount of time.</li>
<li><strong>Costs:</strong> Is the cost of the tool a feasible addition to your budget in the long run?</li>
<li><strong>Integration capabilities:</strong> Can it integrate seamlessly with your existing CI/CD pipeline?</li>
<li><strong>Scalability and reusability:</strong> Does the tool support scalability and reusability of test cases across multiple projects?</li>
<li><strong>Documentation and Community:</strong> How concise and rich is the documentation for the tool? You’re going to run into some mental blocks in the future, and you may not be able to get through without proper documentation and community support.</li>
</ol>
<h2 id="heading-conclusion">Conclusion</h2>
<p>With the right tools, continuous testing eliminates the risks associated with frequent code releases by ensuring that only quality code is delivered to the end-user.</p>
<p>As I previously mentioned, the tools I have listed above are not an exhaustive list of all the continuous testing tool options. They're just the ones I recommend, and they may or may not be the right choice for you. </p>
<p>Do some further research, check out different tools, and settle for one that will integrate seamlessly into your current setup and meet your needs.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Agile Methods and Methodology for Beginners – Agile Software Development and Agile Project Management Examples ]]>
                </title>
                <description>
                    <![CDATA[ By Adam Naor Agile is a methodology for approaching software development. It consists of different frameworks such as SCRUM or Kanban that help development teams continuously build, test, and gather feedback on their product.  Agile consists of four ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/agile-methods-and-methodology-for-beginners/</link>
                <guid isPermaLink="false">66d45d5f2472e5ed2fa07b97</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 08 Sep 2020 22:34:44 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c98cc740569d1a4ca1c1c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Adam Naor</p>
<p>Agile is a methodology for approaching software development. It consists of different frameworks such as SCRUM or Kanban that help development teams continuously build, test, and gather feedback on their product. </p>
<p>Agile consists of four core principles:</p>
<ol>
<li>Individuals and interactions over processes and tools</li>
<li>Working software over comprehensive documentation</li>
<li>Customer collaboration over contract negotiation</li>
<li>Responding to change over following a plan</li>
</ol>
<p>I will revisit these principles later and make more sense of them. In order to do so, it’s important to take a step back and understand software development practices that were previously used.</p>
<h2 id="heading-waterfall">Waterfall</h2>
<p>Waterfall development is a very linear approach to building a product. It has little to no room for feedback or iteration until the product is completely built and tested. </p>
<p>Here is how it works: teams spend weeks (and sometimes months) drafting product requirement documents. </p>
<p>Before any code is actually written, product managers, analysts, and designers will put together one massive document that outlines the product requirements in extreme detail. </p>
<p>To say the least, this is a long and laborious process in which, inevitably, some things get missed. </p>
<p>Here is a simple thought experiment. Think about Google search or a client email finder.</p>
<p>Now try to try to picture the requirements document for these products. </p>
<p>Undoubtedly, important things will get missed. One simply can’t conceive the use-case or scale or scope of how these products will evolve over time.</p>
<p>If you have built a product - as a solo builder or as a member of a team - you can likely relate to this assertion. </p>
<p>When everything is agreed upon, the specifications get handed off to the engineering team which then builds the product to spec, leverage qualitative and quantitate data and inputs.</p>
<p>When everything is coded up, testing commences. </p>
<p>If it is a complex product, testing and bug fixing can take weeks or months since the entire product needs to go through rigorous review. When testers and product managers sign off on the test requirements, the product is ready to ship to production. </p>
<p>There are a number of shortcomings to waterfall development, and here are a few.</p>
<h3 id="heading-lack-of-built-in-feedback-mechanisms">Lack of built-in feedback mechanisms</h3>
<p>What if the development team follows the specifications exactly and it turns out that seeing it come to life just isn’t as compelling as the product team thought it was? Or worse yet, what if there was an error in the specification document? </p>
<p>In Waterfall development, you won’t know the answer to these questions until the product is already built. </p>
<p>Product development can lead to large fixed costs. If the product doesn’t work, these costs might become sunk costs. </p>
<p>Sunk costs are the enemy of the builder because a sunk cost is a cost that has already been incurred and cannot be recovered.</p>
<h3 id="heading-what-if-the-roadmap-changes">What if the roadmap changes?</h3>
<p>This happens all the time. It happens on the computer you are using to read this article, it happens in your company, and it happens at technology firms large and small.</p>
<p>What if the roadmap changes and the team needs to turn their attention to something else? Under Waterfall, you are left with an unusable product. Think: rigidity.</p>
<p>Again, if you can’t turn your fixed costs into something flexible you will be left with a large bill and not much to show for it. </p>
<p>All the dedicated work, stressful deadlines, and late nights will not lead to the outcomes you wanted at the beginning of the project.</p>
<h3 id="heading-the-product-collects-dust-until-its-finally-shipped">The product collects dust until it’s finally shipped</h3>
<p>Instead of incremental enhancements being delivered to production over a period of time, the waterfall methodology waits to deliver the whole product until the very end.</p>
<p>While this is a reasonable approach for building a car, this is not a great approach to software.</p>
<p>Software, unlike cars, is flexible in the design inputs.</p>
<p>People can't use half produced cars. But we use half built software all the time. </p>
<h2 id="heading-enter-agile">Enter Agile</h2>
<p>Agile helps solve these problems by allowing product development teams to continuously build features that add value. It also allows teams to consistently get feedback on their work and to make changes as necessary. </p>
<p>With the employment of Agile methods, teams consistently and predictably ship small pieces of code to production at a rapid pace.</p>
<p>Once they have completed any sort of feature that will add value, they test and release it to the world. This is an iterative approach to technology building. </p>
<p>Instead of taking months to build a final product and run an end-to-end test, Agile development enables teams to continuously build smaller pieces of the final product and add them to production over time. </p>
<p>This means testing goes faster since you are only testing the compatibility of the latest piece of code. This also means that users and stakeholders are happier because they get to see and utilize the latest product enhancements on a continuous basis. </p>
<p>Consider both approaches to a real word example of remodeling a kitchen. Let’s say it will take six months to do the remodeling job well. </p>
<p>Waterfall would suggest that the contractor and his or her crew rebuild the entire kitchen, then reveal the whole kitchen to the client after the six months are up. </p>
<p>While the job gets done in the same amount of time, the owner is left in the dark. Simple questions like how is it going go largely unanswered. Worst of all, the owners are unable to use any parts of the kitchen until the very end.</p>
<p>With Agile, the contractor would instead figure out what their team could get done every few weeks, and then allow their client to see it and use it while they remodeled the rest of it. </p>
<p>Maybe they can replace the cabinets in the first month, the countertops in the second month, and by the third month they install a new fridge and stove. Not a bad outcome for both parties!</p>
<p>In the second approach, the owner gets the benefit of using parts of the kitchen before everything is complete. Instead of the new stove just sitting there and collecting dust, it’s actually being utilized as soon as it's able to be used. </p>
<p>And maybe the kitchen owner wants to swap out one cabinet for a shelf?  </p>
<p>The contractor can now at least plan for that change before the six months are up and let the owner know how it will affect the project timeline. </p>
<p>Seemingly both parties can work together and communicate transparently to ensure the right outcomes and work are done.</p>
<p>These are some of the many benefits of Agile. Both parties are better off. </p>
<p>Try to take this lesson forward as you learn new development skills on freeCodeCamp and apply your skills on projects.</p>
<h2 id="heading-lets-consider-some-other-examples-in-the-software-world">Let’s consider some other examples in the software world</h2>
<p>Revisiting the four principles of Agile, we can now start to find examples of Agile's application in the real and digital worlds.</p>
<p>By now I hope you can see how these principles are a direct assault on the waterfall process. </p>
<h3 id="heading-principle-1-individuals-and-interactions-over-processes-and-tools">Principle #1: Individuals and interactions over processes and tools</h3>
<p>Having a solid process and set of tools is very important in Agile. However, valuing individuals and interactions over tools enables more value creation and output. </p>
<p>Individual team members can innovate. </p>
<p>Instead of forcing people to conform to strict ideation and specifications, you can give them more bandwidth to experiment.</p>
<p>Part of placing individuals over tools is experimentation with new work-flows. One example that is relevant to innovation in Agile software development is codec, a computer program which encodes or decodes a digital data stream or signals. </p>
<p>The H266/VVC codec uses about half the data to stream 4K videos. And it is recognized as the most efficient coding solution for the future 4K and even 4K VR real-time streaming. </p>
<p>How was this discovery made? It was made by people using Agile to solve video compression problems.</p>
<p>Specifically, it was made because individuals were given freedom to build, test, experiment, and innovate over a period of time. They were not told to build the kitchen from scratch and come back in six months.</p>
<p>They took small steps in the right direction. This outcome is instructive.</p>
<p>Here is a second example: when Lastpass was acquired by LogMeIn, LogMeIn was as interested in the technology as they were the culture of design that Lastpass had implemented to build products. </p>
<p>What type of culture was that? One that prioritized Agile.</p>
<p>Agile not only brings products to market faster, but it creates creative and synergistic outcomes that are valuable.</p>
<p>Creating value is embedded in the culture of Agile.</p>
<h3 id="heading-principle-2-working-software-over-comprehensive-documentation">Principle #2: Working software over comprehensive documentation</h3>
<p>This one should be obvious by now. Instead of verbose specifications and planning, just write a few lines of code that work. </p>
<p>Test it. Get feedback on it. Ship it.</p>
<p>Then, do it again. </p>
<p>Repeat.</p>
<p>A highly relevant example of this repetition process is found in Forms on Fire. </p>
<p>They created software to make mobile data collection easy. They didn’t write their entire company before launching; they wrote a few lines of code, tested it and shipped it. </p>
<p>As they got momentum, they accelerated their testing and iterative steps.</p>
<p>And they repeated what worked and tossed what didn't. The results speak for themselves.</p>
<h3 id="heading-principle-3-customer-collaboration-over-contract-negotiation">Principle #3: Customer collaboration over contract negotiation</h3>
<p>Agile promotes a quick feedback loop to get customer and stakeholder feedback. </p>
<p>What could be better than working backwards from what real users and customers want?</p>
<p>I have a business mentor who advised that instead of over-analyzing what customers want through endless planning, just keep it simple. "Mitigate distractions," he said. </p>
<p>I have written about the KISS principle in <a target="_blank" href="https://www.freecodecamp.org/news/keep-it-simple-stupid-how-to-use-the-kiss-principle-in-design/">freeCodeCamp</a> and that advice certainly holds true in Agile: build something small and see if your customers like it.</p>
<p>If they do, keep going. </p>
<h3 id="heading-principle-4-responding-to-change-over-following-a-plan">Principle # 4: Responding to change over following a plan</h3>
<p>Quick feedback loops beget rapid change and adjustments. This is what makes Agile so great for development teams. </p>
<p>This is why you should embrace it.</p>
<p>Roadmaps always change, this is a known constant. Using Agile methodologies, teams can respond to change by listening to customer feedback and making necessary adjustments.</p>
<p>There are times when responding to change means adjusting your product or changing how you think about users or the competition. </p>
<p>A classic example that students of agile can look at in the e-commerce space is selling on Amazon. How do you rapidly adjust to competition? One way is to build gated communities or try different product launch strategies. </p>
<p>Deploying solutions that are tactical and malleable is advisable.</p>
<p>There is a wonderful proverb: “We can’t change the direction of the wind. We can only adjust our sails.”</p>
<p>When I think of Agile, I think of this saying. </p>
<p>Agile is about learning, Agile is about teaching. Agile is about flexibility.</p>
<p>You can practice Agile in your day to day work or take online courses to develop further.</p>
<p>Some people are smart enough to predict what their customer wants. They know which way the wind is blowing. </p>
<p>But for us mortals, Agile is a methodology for navigating around our deficiencies in understanding what customers want. </p>
<p>It is the system that lets us constantly adjust our sails.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Use the Dev Huddle to Get Your Developers on the Same Page ]]>
                </title>
                <description>
                    <![CDATA[ By Mario Fernandez How do you make sure that the developers on your team are aligned with your technical direction? That’s a difficult question. Every team has its own idiosyncrasies. As a tech lead, I’ve thought a lot about it and ended up with vagu... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-the-dev-huddle-to-get-your-developers-on-the-same-page/</link>
                <guid isPermaLink="false">66d460f0d1ffc3d3eb89de56</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 02 Sep 2020 04:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/08/huddle.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Mario Fernandez</p>
<p>How do you make sure that the developers on your team are aligned with your technical direction? That’s a difficult question.</p>
<p>Every team has its own idiosyncrasies. As a <a target="_blank" href="https://www.patkua.com/blog/the-definition-of-a-tech-lead/">tech lead</a>, I’ve thought a lot about it and ended up with vague ideas like <em>empowerment</em> or <em>shared goals</em>. But these are not very actionable.</p>
<p>However, one ritual has worked really well on the teams I’ve been part of. I want to talk about the <em>dev huddle</em>.</p>
<h2 id="heading-what-is-a-dev-huddle">What is a dev huddle?</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/developers-aligning.jpg" alt="Alignment" width="600" height="400" loading="lazy">
<em>Developers aligning expectations</em></p>
<p>There are many names for it: Dev Huddle, Tech Huddle, Dev Meeting. Whatever you call it, it’s a recurring meeting for the developers on a team. </p>
<p>So what does it accomplish? Well, it's a forum to discuss technical topics and make decisions regarding architecture, conventions, or any other technology stack aspect.</p>
<p>"Wow, that’s <em>so</em> innovative!" you might think. Yes, it’s nothing groundbreaking. The devil is in the details, though. </p>
<p>Running an effective dev huddle can be tricky. Nothing will frustrate a group of developers more than having yet another useless meeting. If you’re taking up their time, you'd better make it count.</p>
<h2 id="heading-why-should-i-do-it">Why should I do it?</h2>
<p>Before focusing on the <em>how</em>, let’s take a look at the <em>why</em> first. What do we expect to accomplish?</p>
<h3 id="heading-create-alignment">Create Alignment</h3>
<p>Developers might work closely together (sometimes <em>too</em> literally), yet build software as if they never met before. Do they agree on the coding conventions? What’s the preferred library to parse JSON? </p>
<p>There are tons of small decisions to make. Over time those form a cohesive understanding of building software that is crucial for any high-performing team.</p>
<h3 id="heading-foster-innovation">Foster Innovation</h3>
<p>You won’t rewrite your application every six months with the trendiest technology, but you want to encourage experiments. <a target="_blank" href="https://www.creativesafetysupply.com/articles/continuous-improvement/">Continuous improvements</a> compound over time. </p>
<p>I’ve been part of teams that looked hopeless in the beginning. After a year of many small improvements, we’re doing <a target="_blank" href="https://www.atlassian.com/continuous-delivery/continuous-deployment#:~:text=Continuous%20Deployment%20(CD)%20is%20a,cycle%20has%20evolved%20over%20time">continuous deployment</a>. That will rarely happen in one big push, though.</p>
<h3 id="heading-encourage-debate">Encourage Debate</h3>
<p>Some teams practice what I call <em>discussion by tenure</em>, where the most senior people in the team make the technology decisions, and the rest, well, follow them. If they are lucky enough to find out about those decisions, that is. </p>
<p>Your senior folks have the experience and the instincts, but everybody else can contribute as well.</p>
<h2 id="heading-preparation">Preparation</h2>
<p>I like to structure huddles around a backlog of ideas. </p>
<p>Something as simple as a sticky note on the wall or a list of issues on Github work. Each one can be just a simple headline – they are there to start a conversation. </p>
<p>Some examples:</p>
<ul>
<li>Let’s try out <a target="_blank" href="https://strikt.io/">strikt</a>, a new assertions library</li>
<li>Refactor our API calls to use <a target="_blank" href="https://reactjs.org/docs/hooks-intro.html">React hooks</a></li>
<li>Missing documentation for our newest microservice</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/huddle-board.png" alt="Huddle board" width="600" height="400" loading="lazy"></p>
<p>Who adds new topics? Everybody! </p>
<p>Find a candidate for refactoring while pairing? Read that <a target="_blank" href="https://dev.to/">dev.to</a> article about that new library?</p>
<p>Just add it to the wall.</p>
<p>In the beginning, you’ll be the only one posting ideas. Over time, the rest of the team will feel more comfortable and chip in. We’ll see how to choose what to talk about in a minute.</p>
<h3 id="heading-finding-a-time">Finding a time</h3>
<p>Some might say, "Let’s just get together whenever needed. We are agile!"</p>
<p>In my experience, that doesn't work. There is always something urgent, or somebody doesn’t have time right now.</p>
<p>My advice? Pick a fixed slot: same day and hour, every week. </p>
<p>Ideally, whenever is least disruptive. After the daily, just after lunch – doesn’t really matter. People will get used to it and take it into account in their schedule.</p>
<p>Half an hour should be enough to have meaningful conversations. </p>
<p>The flow of the board is a good indicator. If you’re collecting more and more topics that you never talk about, maybe your dev huddles need to be a bit longer. If you’re running out of stuff, perhaps you can finish early, or even switch to bi-weekly huddles.</p>
<h2 id="heading-how-to-run-a-dev-huddle">How to run a dev huddle</h2>
<p>Running a dev huddle consists of going through the list of topics, discussing them, reaching a conclusion, and documenting it. Sounds easy, right?</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/moderator.jpg" alt="Moderator" width="600" height="400" loading="lazy">
<em>Moderation happening</em></p>
<p>Not so fast. First of all, there <strong>has</strong> to be a facilitator. </p>
<p>A good facilitator keeps track of the total time, making sure that no single topic consumes the whole time slot. They also give everybody a chance to speak.</p>
<p>Without this role, you might end up having a pub discussion, just without the beer.</p>
<p>I used to run all the huddles in a previous team. I only realized much later what a mistake that was. </p>
<p>The meetings end up becoming yours when it should belong to the whole team. It’s tough to facilitate and be an active participant at the same time. </p>
<p>Rotate the facilitation instead. Everybody gets practice moderating, and you get to have some of the fun as well!</p>
<p>If you have too many topics, you have to pick which ones to tackle. You can take them in order of creation, or <a target="_blank" href="https://en.wikipedia.org/wiki/Dot-voting">dot vote</a> just before starting. </p>
<p>Some people will bring up more points than others. Try to keep it balanced. A big architectural change requires more than a few minutes, so maybe a follow-up meeting is in order.</p>
<p>And then, discussion ensues. </p>
<p>A huddle won’t fix a broken culture, but it’s a good litmus test. Are you stating opinions or facts? Are you fighting to get a word in? If so, a huddle is the least of your problems. </p>
<p>Here is a sample checklist to help less experienced moderators:</p>
<pre><code class="lang-text">- Are there open points from last time?
- Choose the topics for today
* For every topic

    The owner presents the issue so that everybody is on the same page
    Talk about it (Keep a timebox!)
    Resolution
        What did we decide?
        Assign an owner to take care of the follow-up

- Have we made decisions that need to be reflected in ADRs?
- Finish on time, unless there is something that absolutely can't wait
</code></pre>
<h2 id="heading-the-outcome">The outcome</h2>
<p>Getting the team to talk to each other is already <em>something</em>. If there is no outcome, though, it’s not really a meeting but a social gathering. </p>
<p>So write down your findings. Typically, it’ll be about things you want to do or things you’ll do from then on.</p>
<h3 id="heading-technical-stories-slack-items">Technical Stories / Slack items</h3>
<p>Don’t listen to the <a target="_blank" href="https://en.wikipedia.org/wiki/Pointy-haired_Boss">pointy-haired micromanagers</a> who want to record every action ever taken, no matter how inconsequential. For small stuff, keep the accounting to a minimum and rely on <a target="_blank" href="https://www.solutionsiq.com/resource/blog-post/the-importance-of-slack-in-achieving-speed-and-quality/">slack time</a>.</p>
<p>For bigger things, write technical stories and make sure to integrate them into your regular backlog. There is a lot that can be said <a target="_blank" href="https://www.thoughtworks.com/insights/blog/treat-devops-stories-user-stories">about this</a>. </p>
<p>TLDR: Hold a technical story to the same standards as user stories.</p>
<h3 id="heading-keeping-track-of-decisions">Keeping track of decisions</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/decision-records.jpg" alt="Decision records" width="600" height="400" loading="lazy">
<em>Archiving decisions</em></p>
<p>Imagine this: everyone is fired up for the huddle. It gets intense, but you reach an agreement on whether to use semicolons or not. <em>Stuff is getting done</em>. But no one writes it down, and you have to start all over next week.</p>
<p>Infuriating, isn't it?</p>
<p>Can I interest you in some <a target="_blank" href="https://www.thoughtworks.com/radar/techniques/lightweight-architecture-decision-records">lightweight Architecture Decision Records</a>? It may sound formal and un-agile, but it’s really not. You just have a place where you keep track of the decisions you make. </p>
<p>A Markdown file with a title, what you decide, and an explanation of the context is all you need. I’ve seen people write novels to wax poetic about Kafka’s virtues when something simple will work just as well:</p>
<pre><code class="lang-text">Title: Use Kotlin instead of Java for new services

Date: 2018/10

Decision: We'll be using Kotlin whenever we start a new service but leave the existing ones

Context: We think Kotlin will help us create more lightweight services while improving quality thanks to null safety
</code></pre>
<p>There are <a target="_blank" href="https://github.com/joelparkerhenderson/architecture_decision_record#adr-example-templates">many templates</a> that you can use. The important part is to be disciplined and reflect what you agree upon.</p>
<h2 id="heading-get-huddling">Get huddling!</h2>
<p>Looking back, all the teams I’ve been on have significantly benefited from having a place for developers to align. It’s just a small investment of effort and time. </p>
<p>Go ahead and give it a try and find the setup that works best for you.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Why Scrum is Pandemic-Proof ]]>
                </title>
                <description>
                    <![CDATA[ By Kevin Hanson I thought I knew everything about Scrum theory. But the one thing I didn’t know was that the framework is sufficiently resilient that not even a pandemic can stop it in its tracks. Let me tell you why. But first, some background. I am... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/why-scrum-is-pandemic-proof/</link>
                <guid isPermaLink="false">66d45f6738f2dc3808b790bf</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ data analysis ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 26 Aug 2020 00:22:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/08/Meetings.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Kevin Hanson</p>
<p>I thought I knew everything about <a target="_blank" href="https://www.scrumalliance.org/about-scrum/theory">Scrum theory</a>. But the one thing I didn’t know was that the framework is sufficiently resilient that not even a pandemic can stop it in its tracks.</p>
<p>Let me tell you why. But first, some background.</p>
<p>I am a technical project manager and Scrum master on the data engineering team for Major League Baseball. On a daily basis I eat, drink, and sleep all things Agile methodology, particularly Scrum. </p>
<p>My team works on solving complex problems in baseball stats and analytics. We build data pipelines, databases, data analyzing tools, and visualization tools to answer every question possible about traditional baseball stats (who leads the league in home runs?) and <a target="_blank" href="http://m.mlb.com/glossary/statcast">statcast</a> stats (what batter has the highest exit velocity against The Yankees on two strike counts?). </p>
<p>Needless to say, some of the engineering challenges we face are not easy. And with difficult problems to solve, there is a heavy premium placed on excellent communication – it’s one of the key things we look for in hiring talent. </p>
<p>It’s one thing to build an intricate application that calculates home run distance based on on the launch angle and exit velocity of the ball, it’s another to write it all down and explain it to our key stakeholders. </p>
<h2 id="heading-insert-the-covid-19-pandemic-into-the-fold">Insert the COVID-19 pandemic into the fold</h2>
<p>The season gets temporarily cancelled, our roadmaps get shuffled, and we are all forced to work from home indefinitely.</p>
<p>As the Scrum master for the team, I am all of a sudden thinking about how this will affect our communication, throughput, and quality of work. </p>
<p>Previously, we were all co-located in a small San Francisco office where everyone came to work each day. It was great – imagine one big room with an open floor plan where people just write code, bounce ideas off of each other, and watch baseball games. </p>
<p>But now, we are all communicating over Slack and Zoom, and I’m left wondering if things are going to slip through the cracks. </p>
<p>What did I do? I freaked out and started adding more meetings. This would solve our communication shortage, right? Just throw more meetings on everyone’s calendars! </p>
<p>So that’s what I did. </p>
<h3 id="heading-1-happy-hour">1. Happy Hour</h3>
<p>I added a daily “happy hour” that was optional to attend. The goal was to provide a social outlet where people could talk about work or non-work related items in a casual, albeit still virtual, setting. </p>
<p>That one lasted about a week before people stopped going – but more to come on that later. First I want to go over the rest of the failed meeting attempts. </p>
<h3 id="heading-2-happy-hour-part-two">2. Happy Hour Part Two</h3>
<p>The second was yet another Zoom “happy hour” with a slightly larger audience that included some folks from our New York office as well. That lasted even less than a week. </p>
<h3 id="heading-3-leadership-overhead">3. Leadership Overhead</h3>
<p>The third bright idea: a “leadership” call between myself and the three dev leads where we went over in-flight projects and upcoming roadmap items. </p>
<p>I thought our roadmap would be ever fluid during the pandemic (which it was), so why not talk about it every week? </p>
<h3 id="heading-4-additional-stakeholder-meetings">4. Additional Stakeholder Meetings</h3>
<p>And finally, I set up additional touch point meetings with key stakeholders to make sure we were meeting their expectations and getting their feedback on our delivered code fixes and enhancements. </p>
<p>I thought I was taking a proactive approach to solving a problem that no Scrum team has ever gone through: going from a co-located work environment to full remote work while maintaining full productivity levels, strong communication, and high quality of work. </p>
<p>Little did I know, Scrum had this all covered and I freaked out over nothing. </p>
<p>Here’s why.</p>
<p>Scrum provides a framework for how teams can go about building products through iterative cycles of constant feedback and improvement. This framework calls for a variety of different meetings (or as my manager prefers, ceremonies), that facilitate these development principles. </p>
<p>And through these meetings, I came to realize that all of the problems I was trying to solve for, were in fact, already solved by Scrum. </p>
<h2 id="heading-revisiting-my-list-of-additional-meetings-lets-walk-through-why-each-became-obsolete">Revisiting my list of additional meetings – let’s walk through why each became obsolete</h2>
<h3 id="heading-1-and-2-the-happy-hour-meetings">1 and 2. The Happy Hour Meetings.</h3>
<p>It is a best practice in Scrum to hold daily standups. Each developer on the Scrum team goes over what they did yesterday, their plan for today, and if they have any blockers or issues they want to flag. </p>
<p>Early into the working from home life, this daily meeting became a nice touch point to say hi to colleagues and have a bit of social time together. This often took the form of baseball trivia since most of us are big fans of the game. </p>
<p>And while the rules of Scrum say that daily standups should be no longer than 15 minutes, I figured this was well worth going over that. You see, while many Scrum masters are very rigid and treat Scrum as a "science", I am a bit more fluid and treat it more as an "art form". </p>
<h3 id="heading-3-the-leadership-meetings">3. The Leadership Meetings</h3>
<p>The leadership meeting was to have a consistent meeting on the books to go over small and large roadmap items. It was to convene and prioritize items based on news about when the baseball season might return. </p>
<p>Again, I thought I was doing my team a service by adding this additional touch point. And again, I was wrong. </p>
<p>It’s another best practice in Scrum to hold a backlog refinement meeting at least once per development sprint. This meeting is used to review the upcoming bugs and features in the backlog and to prioritize them for future development cycles (sprints). </p>
<p>My dev team and I had been consistently holding these refinement meetings before the pandemic, and sure enough, this was the perfect solution for the problem I was trying to solve – it was there all along. </p>
<p>I quickly realized that we were just repeating ourselves in the leadership meeting. It was pointless to have both.</p>
<h3 id="heading-4-the-stakeholder-meetings">4. The Stakeholder Meetings</h3>
<p>Since we were all working remotely, I figured we should communicate more with stakeholders to make sure we were all crystal clear about what they should expect from my dev team. By now, I’m sure you’ve guessed that Scrum also accounts for this in their guidelines. </p>
<p>The Scrum playbook calls for a demo at the end of every sprint where the dev team gives demos to stakeholders and asks for feedback. </p>
<p>We have been doing this remotely now, and it has had the same effect as always – it shows what we’ve been working on and it creates a forum for quick feedback from the people who have an interest in our product enhancements. </p>
<h2 id="heading-what-i-learned">What I Learned</h2>
<p>Hitting the fast-forward button to today, all of those aforementioned meetings have been cancelled indefinitely and my Scrum team is continuing to deliver consistent results to our stakeholders. </p>
<p>My bias toward taking action with additional meetings, while well-intentioned, only added repetition and clutter. Next time I guess I’ll think twice before trying to reinvent the agile methodology wheel. </p>
<p>There are two important lessons I learned while transitioning to working on a fully remote team during the pandemic that I hope are now obvious to you. </p>
<p>Firstly, it’s that the Scrum framework is resilient and already set up to work in almost any team environment. Its built-in touch points and meeting cadences are the perfect solution that were and still are staring me in the face. </p>
<p>My bias was towards action. But before actioning yet another team meeting, my bias should have been towards the question "why"? This brings me to my second takeaway.</p>
<p>I learned that before adding an additional meeting, you should ask yourself “what is this meeting trying to accomplish? What’s the goal? Is this not already being achieved by some other meeting or other form of communication?” </p>
<p>Surely, this litmus test will catch a lot of repetitive meetings and save a lot of people time on their calendars. Your team will be happier and more effective as a result.  </p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is a Scrum Master? The Agile Role and Responsibilities Explained ]]>
                </title>
                <description>
                    <![CDATA[ By Bertil Muth I've been working as a Scrum Master since 2010. The most common questions I hear are: What exactly does a Scrum Master do? Do you really need the role? Is Scrum Master a full time job? In this article I will answer these questions. W... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-a-scrum-master-the-agile-role-and-responsibilities-explained/</link>
                <guid isPermaLink="false">66d45df6182810487e0ce11f</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 07 Aug 2020 17:31:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/08/irfan-simsar-wxWulfjN-G0-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Bertil Muth</p>
<p>I've been working as a Scrum Master since 2010. The most common questions I hear are:</p>
<ul>
<li>What exactly does a Scrum Master do?</li>
<li>Do you really need the role?</li>
<li>Is Scrum Master a full time job?</li>
</ul>
<p>In this article I will answer these questions.</p>
<h1 id="heading-what-exactly-does-a-scrum-master-do">What exactly does a Scrum Master do?</h1>
<p>The <a target="_blank" href="https://www.scrumguides.org/">Scrum Guide</a> describes the roles, events, and artifacts of Scrum.<br>Everyone who practices Scrum should read the Scrum Guide. It's the normative reference for Scrum. It's only about 20 pages, and it's free to download.</p>
<p>According to the Scrum Guide, the Scrum Master is a <em>Servant Leader</em>. So they're a leader who supports their colleagues in their activities. But not someone who just assigns tasks or bosses other people around.</p>
<p>The Scrum Master supports the Product Owner, the development team, and the rest of the organization.</p>
<h3 id="heading-the-scrum-masters-support-for-the-product-owner">The Scrum Master's support for the Product Owner</h3>
<p>The main task of the Product Owner is to maintain and rank the Product Backlog to maximize the value of the product. </p>
<p>The Scrum Master supports the Product Owner methodically. For example, they help with the documentation of requirements, with prioritization techniques, and in communicating with the rest of the team and organization. </p>
<p>Everyone in the Scrum Team should share a clear vision and understand the direction in which the product will evolve. The team should also have a common understanding of the Product Backlog. The Scrum Master helps with that.</p>
<h3 id="heading-the-scrum-masters-support-for-the-development-team">The Scrum Master's support for the Development Team</h3>
<p>The Scrum Master supports the development team in delivering high quality products. </p>
<p>For example, they make sure that the team can deliver a working, integrated and automatically tested software at least once a Sprint. So for a 2-week Sprint, that's at least every 2 weeks, or more often. </p>
<p>If the team can't deliver, the Scrum Master has to take action.</p>
<p>In the Sprint Retrospective, the Scrum Master ensures that the team discusses how to improve delivery. Not theoretically, but practically. Step by step, in each Sprint.</p>
<p>If the developers can't remove an impediment, the Scrum Master helps. For example if tools need to be purchased for test automation and continuous integration. Or the team needs training courses for its developers.</p>
<p>Also, the Scrum Master supports the team in self-organization. In Scrum there is nobody who assigns tasks to the developers. Instead, the team members perform the tasks that are their own responsibility. </p>
<p>The Scrum Master supports the developers in making this happen, especially if they are not used to it.</p>
<p>Self-organization also includes dealing with conflicts. The Scrum Master teaches the team decision-making techniques and communication techniques, like <a target="_blank" href="https://en.wikipedia.org/wiki/Nonviolent_Communication">non-violent communication</a>.</p>
<p>The Scrum Master also hosts the Scrum Events.</p>
<h3 id="heading-the-scrum-masters-support-for-the-organization">The Scrum Master's support for the organization</h3>
<p>The work of a Scrum Master is not limited to the team. They must also teach the organization how to interact with the teams.</p>
<p>For example, let's say that an important stakeholder approaches developers and makes them implement a feature that hasn't been agreed on with the Product Owner. Then the Scrum Master has to talk to the stakeholder and explain the influence of their behavior on the productivity and effectiveness of the whole team.</p>
<p>Furthermore, a Scrum Master helps with spreading Scrum in the organization,<br>and makes sure that everyone understands how it works. </p>
<p>Scrum is not a process that is just rolled out once and everything's fine. Scrum is about continuous improvement based on continuously observing what is going on.</p>
<h1 id="heading-is-the-role-necessary-is-it-a-full-time-job">Is the role necessary? Is it a full-time job?</h1>
<p>The short answer is yes. I haven't seen a team that that's able to manage all the above mentioned tasks themselves, while at the same time focusing sufficiently on development. </p>
<p>But my experience is limited. It's quite possible that such teams exist, especially in smaller organizations and start-ups.</p>
<p>My experience as a Scrum Master is that I can usually take care of at most 2 teams. And then it's a full time job. It's not something that a developer does on the side.</p>
<p>In many organizations, this is seen differently. But they likely don't understood that a Scrum Master is a leadership position. And that has an impact on the effectiveness of the teams.</p>
<p>I believe that a lot of frustration that comes from sloppy Scrum implementations could be avoided. And one factor is to have an experienced Scrum Master.</p>
<p>To be a good Scrum Master, it's not enough to attend a certification course that just takes several days. Those courses are fine, but they only teach the basics. The real challenges come with practice.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
