<?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[ project management - 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[ project management - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 15:48:30 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/project-management/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <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[ A Beginner Developer's Guide to Scrum ]]>
                </title>
                <description>
                    <![CDATA[ Let me guess: you’re learning to code…alone. You’ve been grinding through tutorials. You've built a portfolio site, maybe deployed a few projects on GitHub. And now you're trying to land a job or join a team. Then the interviews start. Suddenly, peop... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-beginner-developers-guide-to-scrum/</link>
                <guid isPermaLink="false">68813c7579e092b166d373b6</guid>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Developer ]]>
                    </category>
                
                    <category>
                        <![CDATA[ interview ]]>
                    </category>
                
                    <category>
                        <![CDATA[ guide ]]>
                    </category>
                
                    <category>
                        <![CDATA[ education ]]>
                    </category>
                
                    <category>
                        <![CDATA[ learning ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Aditya Vikram Kashyap ]]>
                </dc:creator>
                <pubDate>Wed, 23 Jul 2025 19:48:05 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1753300058064/7046dd6c-1d9e-4f06-9ca1-65b3bb7eec83.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Let me guess: you’re learning to code…alone.</p>
<p>You’ve been grinding through tutorials. You've built a portfolio site, maybe deployed a few projects on GitHub. And now you're trying to land a job or join a team.</p>
<p>Then the interviews start.</p>
<p>Suddenly, people ask:</p>
<ul>
<li><p>"Are you familiar with Agile?"</p>
</li>
<li><p>"Have you worked in a Scrum environment?"</p>
</li>
<li><p>"What’s your experience with sprints?"</p>
</li>
</ul>
<p>Cue the imposter syndrome. Because no one teaches this stuff in JavaScript 101.</p>
<p>This guide is for you.</p>
<p>I’ll help make the Scrum process – a very common way developers work together – <em>make actual sense</em>. I’ll walk you through the basics, but also tell you what developers actually <em>do</em>, how standups feel when you're new, and what’s expected of you when you’re no longer coding in a vacuum.</p>
<p>Let’s break it down.</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-what-even-is-scrum">What Even Is Scrum?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-three-roles-in-scrum-and-who-does-what">The Three Roles in Scrum (and Who Does What)</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-the-scrum-rhythm-what-a-sprint-actually-looks-like">The Scrum Rhythm: What a Sprint Actually Looks Like</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-who-attends-the-ceremonies">Who attends the Ceremonies:</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-standups-where-you-talk-like-a-human-not-a-robot">Standups: Where You Talk Like a Human, Not a Robot</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-sprint-planning">Sprint Planning</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-whats-a-user-story-and-why-does-it-sound-like-a-childrens-book">What’s a User Story and Why Does It Sound Like a Children’s Book?</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-what-counts-as-done-definition-of-done-and-why-its-important">What Counts as “Done”? Definition of Done and Why It’s Important</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-demos-retros-and-saying-the-hard-things">Demos, Retros, and Saying the Hard Things</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-tools-you-might-encounter">Tools You Might Encounter</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-if-youre-preparing-for-a-job-heres-what-you-can-do">If You’re Preparing for a Job, Here’s What You Can Do</a></p>
</li>
<li><p><a class="post-section-overview" href="#heading-final-thoughts">Final Thoughts</a></p>
</li>
</ul>
<h2 id="heading-what-even-is-scrum"><strong>What Even Is Scrum?</strong></h2>
<p>Scrum is not a tool. It’s not a software. It’s not some elite thing only PMs care about.</p>
<p>It’s a lightweight framework that helps software teams build things incrementally, together, in short focused cycles called sprints.</p>
<p>Scrum is used by everyone from FAANG teams to indie dev shops because it helps:</p>
<ul>
<li><p>Keep teams aligned</p>
</li>
<li><p>Deliver working software fast</p>
</li>
<li><p>Course-correct often</p>
</li>
<li><p>Spot problems early (before they go nuclear)</p>
</li>
</ul>
<p>It’s the opposite of the old-school “build for a year and pray it works” model.</p>
<h2 id="heading-the-three-roles-in-scrum-and-who-does-what"><strong>The Three Roles in Scrum (and Who Does What)</strong></h2>
<p>Scrum officially defines three roles. Here's what that means in practice:</p>
<h3 id="heading-1-product-owner-po"><strong>1. Product Owner (PO)</strong></h3>
<p>Think: Vision-holder. They decide <em>what</em> the team builds and <em>why</em>. A product owner:</p>
<ul>
<li><p>Writes user stories (think of these as feature requests written from a user’s point of view)</p>
</li>
<li><p>Prioritizes the work</p>
</li>
<li><p>Clarifies what success looks like</p>
</li>
<li><p>Says “yes” or “not yet” to features</p>
</li>
</ul>
<h3 id="heading-2-scrum-master-sm"><strong>2. Scrum Master (SM)</strong></h3>
<p>Think: Air-traffic controller meets therapist. They make sure the process works. The are master Facilitators, like between Dev and PO’s. A Scrum Master:</p>
<ul>
<li><p>Facilitates meetings</p>
</li>
<li><p>Removes blockers (“Your AWS access is stuck? I’ll escalate it.”)</p>
</li>
<li><p>Coaches the team on Scrum practices</p>
</li>
<li><p>Doesn’t manage people – manages <em>flow</em></p>
</li>
</ul>
<h3 id="heading-3-developers-you"><strong>3. Developers (YOU!)</strong></h3>
<p>Think: Builders. You write code, test it, ship it, fix it, and improve it. You also:</p>
<ul>
<li><p>Break down stories into tasks</p>
</li>
<li><p>Pick up work from the team board (like Jira or Trello)</p>
</li>
<li><p>Communicate progress</p>
</li>
<li><p>Demo what you’ve built at the end of the sprint</p>
</li>
</ul>
<p>You might also work with designers, testers, or DevOps folks – but within Scrum, you’re all “developers” building a product together.</p>
<h2 id="heading-the-scrum-rhythm-what-a-sprint-actually-looks-like"><strong>The Scrum Rhythm: What a Sprint Actually Looks Like</strong></h2>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1752809790048/253fd92b-1ebe-4f3e-bfbc-48719676dc82.png" alt="253fd92b-1ebe-4f3e-bfbc-48719676dc82" class="image--center mx-auto" width="900" height="530" loading="lazy"></p>
<p>Image Source: <a target="_blank" href="https://www.invensislearning.com/blog/what-are-scrum-ceremonies/">https://www.invensislearning.com/blog/what-are-scrum-ceremonies/</a></p>
<h3 id="heading-understanding-the-scrum-cycle"><strong>Understanding the Scrum Cycle</strong></h3>
<p>So, what does it <em>actually</em> look like when a team uses Scrum to build software?</p>
<p>Let’s walk through a full sprint – not just the buzzwords, but what really happens when a group of humans tries to plan, build, review, and improve together. Think of this as your backstage pass to the rhythm of modern teamwork.</p>
<h3 id="heading-step-1-build-and-refine-the-product-backlog">📦 Step 1: Build and Refine the Product Backlog</h3>
<p>Before any coding starts, the team needs to agree on <em>what</em> they might build – not just this week, but in the near future too.</p>
<p>That’s where the <strong>Product Backlog</strong> comes in. This is a big, running list of everything the product might need – features, bug fixes, improvements, ideas, and maybe a few wild dreams. It’s like the wishlist for the product, but more organized (ideally).</p>
<p>The Product Owner is responsible for maintaining and prioritizing this list. They decide what’s most important to work on based on customer needs, business goals, and feedback.</p>
<p>But the PO doesn’t do this in isolation. Enter the <strong>Backlog Refinement meeting</strong>.</p>
<p>In these sessions, the Scrum Team – that’s the PO, the Scrum Master (SM), and the Developers – come together to:</p>
<ul>
<li><p><strong>Review</strong> the most important upcoming items</p>
</li>
<li><p><strong>Clarify</strong> any vague or confusing parts of each task</p>
</li>
<li><p><strong>Break big items</strong> down into smaller, buildable pieces called <strong>user stories</strong></p>
</li>
<li><p><strong>Estimate effort</strong> (how much time or complexity is involved for each story)</p>
</li>
</ul>
<p>This meeting makes sure the team isn’t caught off guard in the sprint – that they understand the work ahead and can actually start sprinting when the time comes.</p>
<h3 id="heading-step-2-sprint-planning-what-are-we-building-this-time">🧭 Step 2: Sprint Planning – What Are We Building This Time?</h3>
<p>Now that we’ve got a solid backlog, it’s time to pick what to build <em>right now</em>.</p>
<p>At the start of each sprint (which typically lasts 1 to 4 weeks), the team holds a <strong>Sprint Planning meeting</strong>. This meeting sets the stage for the entire sprint – it’s like the huddle before the big game.</p>
<p>In Sprint Planning, the team:</p>
<ul>
<li><p>Reviews the top items from the backlog</p>
</li>
<li><p>Discusses what can realistically be completed based on their availability and capacity</p>
</li>
<li><p>Chooses a handful of these stories to commit to</p>
</li>
<li><p><strong>Defines a Sprint Goal</strong> – a simple statement that captures the purpose of this sprint</p>
</li>
</ul>
<p>For example, the Sprint Goal might be:<br>🎯 <em>“Allow users to reset their passwords.”</em></p>
<p>Every user story chosen should contribute to that goal. The collection of these stories becomes the <strong>Sprint Backlog</strong> – basically, the to-do list for the sprint.</p>
<p>So when we say:</p>
<p>“The team selects an ordered list of user stories to comprise the Sprint Backlog for the next sprint, which will be achievable to satisfy the Sprint Goal...”</p>
<p>We’re really just saying:<br>👉 <em>“Pick a realistic number of important tasks that, if completed, will help us hit our target for the sprint.”</em></p>
<p>Not too vague. Not too ambitious. Just achievable and focused.</p>
<h3 id="heading-step-3-daily-standups-stay-in-sync">☀️ Step 3: Daily Standups – Stay in Sync</h3>
<p>Now the sprint is underway! But how does everyone stay aligned and avoid working in silos?</p>
<p>That’s where the <strong>Daily Standup</strong> comes in. Every day – usually in the morning – the team has a quick check-in (about 15 minutes) where each person answers three questions:</p>
<ol>
<li><p><strong>What did I do yesterday?</strong></p>
</li>
<li><p><strong>What am I working on today?</strong></p>
</li>
<li><p><strong>Is anything blocking me?</strong> (that is, am I stuck?)</p>
</li>
</ol>
<p>Example:</p>
<p>“Yesterday I set up the login API integration. Today I’ll work on the UI validation. I’m blocked on getting access to the staging database — may need help.”</p>
<p>These standups keep the team in sync and surface blockers early so they can be addressed quickly. They’re not about micromanaging or showing off. They’re about visibility and support.</p>
<h3 id="heading-whats-a-sprint-burndown-chart">📉 What’s a Sprint Burndown Chart?</h3>
<p>You might hear your team mention a “burndown chart.” No, this isn’t about things going down in flames (hopefully).</p>
<p>A <strong>Sprint Burndown Chart</strong> is a graph that shows how much work is left in the sprint – day by day.</p>
<ul>
<li><p>The <strong>y-axis</strong> is the amount of work remaining (often measured in story points or tasks)</p>
</li>
<li><p>The <strong>x-axis</strong> is the number of days left in the sprint</p>
</li>
</ul>
<p>The line should ideally trend downward as work gets completed – hence “burning down.” If it flattens out or slopes up, that’s a red flag that the team might be stuck, behind schedule, or not updating the board.</p>
<p>Think of it as a visual heartbeat of the sprint. You can learn more via a practical example <a target="_blank" href="https://youtu.be/2K84aZn9AY8?si=tS8oMGxVD0CYtnlw">in this video</a>.</p>
<h3 id="heading-step-4-sprint-review-show-what-youve-built">🖥️ Step 4: Sprint Review – Show What You’ve Built</h3>
<p>At the end of the sprint, the team holds a <strong>Sprint Review</strong> (also called a “demo”). This is where you show what was actually built during the sprint.</p>
<ul>
<li><p>The <strong>Developers</strong> demo working features – live, not just screenshots</p>
</li>
<li><p>The <strong>Product Owner</strong> reviews whether the Sprint Goal was achieved</p>
</li>
<li><p>Stakeholders may ask questions, give feedback, or suggest tweaks</p>
</li>
</ul>
<p>This meeting isn’t just for show – it’s a feedback loop. It helps the team validate that what they built is useful, usable, and meets expectations. If changes are needed, those get added to the backlog for future sprints.</p>
<h3 id="heading-step-5-sprint-retrospective-look-back-to-move-forward">🔍 Step 5: Sprint Retrospective – Look Back to Move Forward</h3>
<p>Once the review is done, the team shifts focus from <em>what</em> they built to <em>how</em> they worked together.</p>
<p>Enter the <strong>Sprint Retrospective</strong> – a meeting to reflect on the process, not the product.</p>
<p>The team discusses:</p>
<ul>
<li><p>✅ What went well</p>
</li>
<li><p>❌ What didn’t go so well</p>
</li>
<li><p>🔁 What could be improved next time</p>
</li>
</ul>
<p>This isn’t about pointing fingers. It’s about learning, adapting, and continuously improving how the team collaborates.</p>
<p>The <strong>Scrum Master</strong> often facilitates this meeting and helps turn feedback into action items for the next sprint. For example:</p>
<p>“We underestimated testing time. Next sprint, let’s budget for QA earlier.”</p>
<p>The best teams take retros seriously. Why? Because even if your code is perfect, your <em>process</em> needs tuning too – and small process changes often lead to big gains.</p>
<h3 id="heading-scrum-is-a-loop">♻️ Scrum Is a Loop</h3>
<p>Here’s the rhythm:</p>
<ol>
<li><p>Plan the sprint</p>
</li>
<li><p>Check in daily</p>
</li>
<li><p>Build and demo the product</p>
</li>
<li><p>Reflect and improve</p>
</li>
</ol>
<p>Then do it all over again – with slightly better coordination and slightly more trust each time.</p>
<p>It’s not about being fast. It’s about being intentional, consistent, and collaborative.</p>
<h3 id="heading-example-sprint">Example Sprint</h3>
<p>Let’s say, for example, that your team does 4-week sprints. (Keep in mind that Sprints can differ by team, nature of product, release cycles, and so on.)</p>
<p>Here’s the rough beat:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Week</strong></td><td><strong>What Happens (Sprint Ceremonies)</strong></td><td><strong>Your Role</strong></td></tr>
</thead>
<tbody>
<tr>
<td>1</td><td><strong>Sprint Planning</strong></td><td>Help estimate effort, pick what to build</td></tr>
<tr>
<td>1-4</td><td><strong>Daily Stand ups</strong> (15 mins)</td><td>Share what you’re doing &amp; any blockers</td></tr>
<tr>
<td>1-3</td><td><strong>Development Time</strong></td><td>Code, test, commit, fix, push, repeat</td></tr>
<tr>
<td>3.5-4</td><td><strong>Sprint Review</strong></td><td>Demo what you built</td></tr>
<tr>
<td>4</td><td><strong>Sprint Retrospective</strong></td><td>Reflect on how the sprint went as a team</td></tr>
</tbody>
</table>
</div><p>Scrum works in <strong>loops</strong>. Every 2-4 weeks (depending on your cadence and sprint cycle), your team should have working, demo-able software to show for it – even if it’s small.</p>
<p>And no, it’s not about “speed.” It’s about consistency, communication, and collaboration.</p>
<h2 id="heading-who-attends-the-ceremonies"><strong>Who attends the Ceremonies:</strong></h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Ceremony</strong></td><td><strong>Who Attends</strong></td><td><strong>Why They’re There</strong></td></tr>
</thead>
<tbody>
<tr>
<td><strong>Sprint Planning</strong></td><td>Product Owner (PO), Scrum Master (SM), Development Team</td><td>To define what will be delivered and how the work will be accomplished</td></tr>
<tr>
<td><strong>Daily Standup</strong></td><td>Development Team, Scrum Master (optional), PO (optional)</td><td>To sync on progress, share blockers, and coordinate efforts</td></tr>
<tr>
<td><strong>Sprint Review</strong></td><td>Development Team, Scrum Master, Product Owner, Stakeholders</td><td>To demo the work, get feedback, and assess if goals were met</td></tr>
<tr>
<td><strong>Sprint Retrospective</strong></td><td>Development Team, Scrum Master, Product Owner (optional)</td><td>To reflect on the process, identify what worked/what didn’t, and improve the next sprint</td></tr>
<tr>
<td><strong>Backlog Refinement</strong></td><td>Product Owner, Development Team, Scrum Master (optional)</td><td>To clarify upcoming stories, estimate work, and prepare for future sprint planning</td></tr>
</tbody>
</table>
</div><p>Now lets dive deeper and understand practically how each of these ceremonies work:</p>
<h2 id="heading-standups-where-you-talk-like-a-human-not-a-robot"><strong>Standups: Where You Talk Like a Human, Not a Robot</strong></h2>
<p>So how does the team actually stay connected day to day? That’s where standups come in.</p>
<p>Every morning, your team meets briefly – usually on Zoom or in a circle – and you answer 3 questions:</p>
<ol>
<li><p>What did I work on yesterday?</p>
</li>
<li><p>What will I work on today?</p>
</li>
<li><p>What’s blocking me? Any impediments?</p>
</li>
</ol>
<p>Example:</p>
<p>"Yesterday I cleaned up the signup validation logic. Today I’m working on the email verification flow. I’m stuck on SendGrid config – might need help setting up credentials."</p>
<p>It’s not about impressing anyone. It’s about keeping everyone in sync. Some days you’ll say, “I spent the whole day debugging a CSS bug that turned out to be a semicolon.” That’s okay.</p>
<p>How does it work?</p>
<p>The Scrum Master gathers everyone in a huddle room, the PO and Dev Team included, and opens the the Standup. They are the facilitator of the ceremony. Everyone gets a chance to answer the 3 questions above (usually about 2-5 minutes each). It’s not a full report – it’s quick. When one person is done, they pass it on to someone else.</p>
<p>This ensures there is team cohesion and transparency.</p>
<p><a target="_blank" href="https://youtu.be/q_R9wQY4G5I?si=W1AcvcLXB-mnUM1f">Here is a video example of a standup</a>.</p>
<h2 id="heading-sprint-planning"><strong>Sprint Planning</strong></h2>
<p>The goal of the planning meeting is to answer the questions “What are we going to work on, and how are we going to do it?” It is critical for the team to have a shared goal and a shared commitment to this goal before beginning this ceremony.</p>
<p>Participants should:</p>
<ul>
<li><p>Measure growth</p>
</li>
<li><p>Sync with the Scrum Master</p>
</li>
<li><p>Sync with the Product Owner</p>
</li>
</ul>
<p>Sprint planning happens just before the sprint starts, and usually lasts for an hour or two. In this meeting, the team goes over a collection of <strong>user stories</strong> and discuss, plan, measure, and prioritize. This is where they decide what is going to be in scope for their upcoming sprint cycle.</p>
<p>The Product Owner will have a prioritized view of things in the backlog. They work with the team on each object or customer experience. Together, as a group they go through and make calculations, deciding to what they can commit.</p>
<h2 id="heading-whats-a-user-story-and-why-does-it-sound-like-a-childrens-book"><strong>What’s a User Story and Why Does It Sound Like a Children’s Book?</strong></h2>
<p>So you might be wondering: how do you know what to work on? What to build? So much work, so little time? Thats where <strong>user stories</strong> come in.</p>
<p>In Scrum, teams don’t just write vague tasks like “code the login.” Instead, they write user stories – short, human-centered feature descriptions that describe what the user needs, why they need it, and what success looks like.</p>
<p>Here’s an example:</p>
<p><em>As a user, I want to be able to reset my password, so I can access my account if I forget it.</em></p>
<p>User stories are the scaffolding of teamwork. They’re written with empathy, not just efficiency. And each one comes with <strong>acceptance criteria</strong> – a checklist that clarifies what “done” actually means:</p>
<ul>
<li><p>A “Forgot Password” link is visible</p>
</li>
<li><p>Clicking it shows a form</p>
</li>
<li><p>An email gets sent with a reset link</p>
</li>
</ul>
<p>Once a story is agreed upon, developers break it down into tasks, like “build form,” “hook into backend,” or “handle email validation.” It’s collaborative, not prescriptive. And user stories have priority so you know what’s the most important and what’s the least.</p>
<p>A helpful rule of thumb many teams use is the <a target="_blank" href="https://medium.com/@nic/writing-user-stories-with-gherkin-dda63461b1d2"><strong>Gherkin</strong>-style "Given–When–Then"</a> format:</p>
<ul>
<li><p><strong>Given</strong> some initial context</p>
</li>
<li><p><strong>When</strong> an event occurs</p>
</li>
<li><p><strong>Then</strong> a specific outcome should happen</p>
</li>
</ul>
<p>This ensures that everyone – devs, testers, and product owners – shares the same understanding of behavior and expectations.</p>
<p><a target="_blank" href="https://www.youtube.com/watch?v=7hoGqhb6qAs">Here is a great video example</a> thats outlines how to draft effective and powerful user stories.</p>
<h2 id="heading-what-counts-as-done-definition-of-done-and-why-its-important"><strong>What Counts as “Done”? Definition of Done and Why It’s Important</strong></h2>
<p>Now you might be wondering – how do I know when a task is done and can be closed out?</p>
<p>The <strong>Definition of Done</strong> is a type of documentation in the form of a <strong>team agreement</strong>. The Definition of Done identifies the conditions that need to be achieved in order for the product to be considered done (as in <strong>potentially shippable</strong>).</p>
<p>This is how we know that we "did the thing right". Meaning, we built the correct level of quality into the product. The Definition of Done is not the same as the acceptance criteria, which are written by the product owner to help us know we did the "right thing".</p>
<p>Every team has a Definition of Done – it’s not just “I pushed code.” It could mean:</p>
<ul>
<li><p>Code is written</p>
</li>
<li><p>Reviewed by a peer</p>
</li>
<li><p>Merged into main</p>
</li>
<li><p>Tested on staging</p>
</li>
<li><p>Possibly deployed</p>
</li>
</ul>
<p>This clarity keeps teams honest and accountable. No “it works on my machine” energy here. The DoD sets a quality bar. It prevents ambiguity, rework, and “it works on my machine” moments. When every card on the board passes the same finish line, teams move faster – and trust each other more.</p>
<p>Everyone should know what done is in a team. Either its Done as per DoD standards or its not.</p>
<p><a target="_blank" href="https://youtu.be/pYOJyQoBT3U?si=nVygkQQx79NaAOo4">Here is a beautiful video</a> highlighting the impotence of DoD.</p>
<h2 id="heading-demos-retros-and-saying-the-hard-things"><strong>Demos, Retros, and Saying the Hard Things</strong></h2>
<p>Once you’ve built the product, then comes demos (showcasing your work) and retros (analysis as a team on what when well and what areas to improve on).</p>
<p>In the retro, everyone’s encouraged to speak up:</p>
<ul>
<li><p>What went well?</p>
</li>
<li><p>What didn’t?</p>
</li>
<li><p>What should we try next time?</p>
</li>
</ul>
<p>Example:</p>
<p>“We missed a lot of stories because we didn’t account for testing time. Maybe we buffer next sprint with fewer tasks.”</p>
<p>The goal is not to blame – it’s to <em>improve</em>. Over time, this feedback loop becomes gold. The Scrum Master usually facilitates, collects feedback (via tools like Parabol, Miro, or sticky notes), and helps turn insights into actionable experiments for the next sprint.</p>
<p>Over time, retros become the heartbeat of team evolution.</p>
<p><a target="_blank" href="https://youtu.be/5eu1HotNmWs?si=1DZaSmztB6rHyawj">Here is a video</a> highlighting the importance of a Retro and Sprint Review.</p>
<h3 id="heading-why-retrospection-matters-more-than-you-think">🧠 Why Retrospection Matters More Than You Think</h3>
<p>The Sprint Retrospective is more than just another meeting. It’s a mirror for your team – a safe, structured space to pause, reflect, and improve together.</p>
<p>You discuss:</p>
<p>✅ what went well</p>
<p>❌ what did not go well</p>
<p>🔁 what could we do better next time</p>
<p>Great teams don't just deliver great software, they continually deliver better ways of working.</p>
<p>This is why many experienced Scrum practitioners consider the retro to be the most important event in Scrum. Code is deployed once, but process improvements grow exponentially, sprint after sprint.</p>
<h2 id="heading-tools-you-might-encounter"><strong>Tools You Might Encounter</strong></h2>
<p>Scrum doesn’t require software, but real-world teams use a variety of tools:</p>
<ul>
<li><p><strong>Jira</strong> – Tracks sprints, issues, velocity</p>
</li>
<li><p><strong>Trello</strong> – Simple board, good for small teams</p>
</li>
<li><p><strong>Slack</strong> – Where standups often happen if async</p>
</li>
<li><p><strong>Notion / Confluence</strong> – Docs, retros, notes</p>
</li>
<li><p><strong>GitHub Projects</strong> – Lightweight planning for devs</p>
</li>
</ul>
<p>Don’t worry if you’re not fluent in these yet. They’re tools – you’ll learn them on the job.</p>
<h2 id="heading-if-youre-preparing-for-a-job-heres-what-you-can-do"><strong>If You’re Preparing for a Job, Here’s What You Can Do</strong></h2>
<ul>
<li><p>✍️ Practice writing user stories from your side projects</p>
</li>
<li><p>🧪 Run a mini-sprint: Plan your weekend project, set goals, and “review” it at the end</p>
</li>
<li><p>🤝 Contribute to an open-source project that uses Scrum or Agile workflows</p>
</li>
<li><p>🧾 Write about what you learned – maybe as a tutorial (<em>hint hint</em>)</p>
</li>
</ul>
<h2 id="heading-final-thoughts"><strong>Final Thoughts</strong></h2>
<p>So to recap, Scrum is a simple yet powerful way for teams to work together, stay organized, and deliver results quickly. It runs in short cycles called <strong>sprints</strong>, where the team plans what to do, checks in daily, shows their progress at the end, and reflects on how to improve.</p>
<p>The four key ceremonies – <strong>Sprint Planning</strong>, <strong>Daily Scrum</strong>, <strong>Sprint Review</strong>, and <strong>Sprint Retrospective</strong> – help keep everyone aligned and focused. With clear roles and regular feedback, Scrum makes it easier to handle changes, solve problems early, and continuously get better as a team.</p>
<p>But scrum isn’t a magic spell. It’s just a way for humans to build complex things – together – without falling apart.</p>
<p>You don’t need to be a Scrum Master. You don’t need a certification. But if you understand how sprints work, what’s expected of you, and how to show up to meetings with clarity and candor, you’re 10 steps ahead of most.</p>
<p>Scrum helps teams talk, plan, build, and learn. And now? You can too.</p>
<p>If you liked this, please do share. You never know who it might help out.</p>
<p>Until then…keep learning, unlearning, and relearning!!!</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[ What is a ROM? ROM Price and Cost Estimate ]]>
                </title>
                <description>
                    <![CDATA[ ROM stands for Rough Order of Magnitude. It is a project management guideline to determine the estimated range of costs for a project. This article will explain: Who should use a ROM When to use a ROM How to calculate a ROM Simple example of a ROM ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-a-rom-price-and-cost-estimate-2/</link>
                <guid isPermaLink="false">66b8de2cfedc3fd92fddb76c</guid>
                
                    <category>
                        <![CDATA[ finance ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Eamonn Cottrell ]]>
                </dc:creator>
                <pubDate>Fri, 16 Dec 2022 17:27:32 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/12/12.15.22-What-is-a-ROM.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>ROM stands for <strong>Rough Order of Magnitude</strong>. It is a project management guideline to determine the estimated range of costs for a project.</p>
<p>This article will explain:</p>
<ol>
<li>Who should use a ROM</li>
<li>When to use a ROM</li>
<li>How to calculate a ROM</li>
<li>Simple example of a ROM</li>
</ol>
<h2 id="heading-who-should-use-a-rom">Who Should Use a ROM</h2>
<p>Project Managers use rough orders of magnitude to determine initial cost ranges for upcoming projects. Many organizations and most software organizations use project managers to lead projects.</p>
<p>Their role involves leading their project team, defining the goals of the project, reporting on the progress to the company stakeholders, and seeing the project through to completion.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/pm.gif" alt="Image" width="600" height="400" loading="lazy">
<em>man with blank stare listening to man trying to explain something</em></p>
<p>Who else can use a ROM? You! 👊 As you'll see, the concept of a ROM is very simple to grasp and can be useful in myriad circumstances. </p>
<h2 id="heading-when-to-use-a-rom">When to Use a ROM</h2>
<p>ROMs are extremely important for project managers in the <strong>early stages</strong> of a project's planning. They're used to decide whether or not a project is going to be feasible or not.</p>
<p>Rough Orders of Magnitude can be used to prepare a project business case (an analysis of the potential benefits of the project) before a project is committed to.</p>
<h2 id="heading-how-to-calculate-a-rom">How to Calculate a ROM</h2>
<p>Calculating a ROM is pretty straightforward. It is meant to provide a <strong>range of the possible cost of a project</strong> and you can find it using the following formulas:</p>
<p><code>Lower Bound = ROM Estimate x 0.75</code></p>
<p><code>Upper Bound = ROM Estimate x 1.75</code></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/fred.gif" alt="Image" width="600" height="400" loading="lazy">
<em>Fred Flinstone counting on fingers</em></p>
<p>During the planning phases of a project, the project manager can come up with an estimate of the costs involved. From here, using the above formulas, they can then calculate a lower boundary in case the project ends up being less expensive and an upper boundary in case it goes over budget.</p>
<p>Since it is helpful to have more room on the upper boundary to avoid running out of funding if it does go over budget, the rough order of magnitude's upper boundary is considerably higher.</p>
<h2 id="heading-rom-example">ROM Example</h2>
<p>You've probably calculated a ROM without knowing it. 💡</p>
<p>Say you're going to the movies with a friend. You figure there will be ticket costs plus refreshment costs. Maybe $20 a ticket since you're going to the latest Nolan IMAX film and then another $30 a person since popcorn is more expensive than steaks at the movies.</p>
<p>This puts you at $100 total for both of you. </p>
<p>The Lower Bound in a ROM calculation would be <code>$100 x 0.75 = $75</code>.</p>
<p>The Upper Bound would be <code>$100 x 1.75 = $175</code>.</p>
<p>You probably don't do this exact math in your head, but you likely have figured there could be extra expenses. You go into the date thinking you could spend as much as $150, for instance.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/12/movie.gif" alt="Image" width="600" height="400" loading="lazy">
<em>Angry Bird eating popcorn at movies</em></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Rough Orders of Magnitude are extremely important in organizational projects. It is vital to decide at the onset whether or not the project is feasible. And the principals behind ROMs are both common sense and easy to calculate. </p>
<p>I hope this has been helpful to you!</p>
<p>You can find and follow me on <a target="_blank" href="https://www.linkedin.com/in/eamonncottrell/">LinkedIn</a>. I'd love if you said hey! 👋</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Freelance Project Management – 10 Tips to Help You Work with Clients ]]>
                </title>
                <description>
                    <![CDATA[ I've recently wrapped up a freelance client website using Trello for project management.  I've wasted hours on projects in the past due to a lack of organization, processes, and general good practices. So this time I wanted to sharpen my project mana... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-trello-to-manage-freelance-web-projects/</link>
                <guid isPermaLink="false">66b8de09d68a0821bf8c474d</guid>
                
                    <category>
                        <![CDATA[ Freelancing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ organization ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Eamonn Cottrell ]]>
                </dc:creator>
                <pubDate>Wed, 17 Aug 2022 20:51:45 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/08/trello-project-mgmt.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I've recently wrapped up a freelance client website using <a target="_blank" href="https://trello.com/">Trello</a> for project management. </p>
<p>I've wasted hours on projects in the past due to a lack of organization, processes, and general good practices. So this time I wanted to sharpen my project management skills in a way that would be replicable for my future self.</p>
<p>My perspective is particularly honed because I've worked for many years as a small business operator. I had to source contract and agency work before getting into web development myself.</p>
<p>The premise of this kind of one-man-shop project management comes from Brett at <a target="_blank" href="https://www.designjoy.co/">DesignJoy</a>:</p>
<div class="embed-wrapper">
        <blockquote class="twitter-tweet">
          <a href="https://twitter.com/brettfromdj/status/1509737097040519170?lang=en"></a>
        </blockquote>
        <script defer="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
<p>Below are some lessons learned after I implemented this over the course of a few weeks.</p>
<ol>
<li>Organization is key</li>
<li>Time restraints are tricky</li>
<li>Deliver on time</li>
<li>Define the scope</li>
<li>Define the process</li>
<li>Test, test...and keep testing</li>
<li>Polish is important</li>
<li>Results matter most</li>
<li>Previews are good</li>
<li>Let the client lead when possible</li>
</ol>
<h2 id="heading-organization-is-key">Organization is Key</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/shawnanggg-r2A6WYI8YIg-unsplash-1.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Prior to Trello, I was doing a combination of email, texts, and Google chat. That's fine when you're starting out and have one client at a time. But having one place where all communication about a single project lives saves time and effort. </p>
<p>Clarity on the order of events was incredibly helpful too. I set up lists where different tasks would live:</p>
<ul>
<li>Directions, assets, and general information in the first column</li>
<li>Task queue in second column</li>
<li>Active work in third column</li>
<li>Work ready for client review in fourth column</li>
<li>Approved work in the fifth column</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/sequence.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>It's a very simple but effective setup that allows for asynchronous communication (I have had zero phone calls so far) and a clearly defined pipeline for requests/work/review.</p>
<p>I grant the client full access to the Trello Board and they're able to rearrange the queue such that the work that needs to happen first gets put at the top.</p>
<p>From there, I grab the top item, and work on one thing at a time in active work. This is valuable for the client to see what I'm working on. And, bonus – it's incredibly helpful for people like me who are easily distracted from one task by wanting to go do another one "real quick". </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/stayontarget.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-time-restraints-are-tricky">Time Restraints are Tricky</h2>
<p>Hot take: don't set time restraints unless you have to. Often I resist the urge to add a note about timing for delivery. It's common to do this when talking to people, but unless I'm asked for a scope of delivery, I leave this off.</p>
<p>This allows me room to expand on design work, try out different implementations for coding, and not be crunched on non-time sensitive items.</p>
<p>Deadlines are just tricky. A lot of times you have to move them after you set them. And a lot of times they're arbitrary to begin with. I avoid them unless I have no other choice. </p>
<p>That said, if you're not disciplined enough to put in the hours without them...you may need to have a few. 😂</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/goodpoint.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-deliver-on-time">Deliver on Time</h2>
<p>It's unlikely that you'll have zero time restraints, though. Otherwise, the project may drift on in perpetuity. And then, caught in its numbing undertow, you'll turn around in 6 months only to realize how little you've progressed and how much anxiety lingers under the surface as a result of a lack of closure.</p>
<p>You don't want this. 🚫</p>
<p>So, when you do have a deadline, deliver before it. Give yourself some room so that you can likely deliver ahead of schedule, and at the very least deliver on time.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/ontime.gif" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-define-the-projects-scope">Define the Project's Scope</h2>
<p>What are we building? What are the guardrails? Is it a marketing page? Is it an ecommerce site? Will it require skills beyond my knowledge? There are many questions like these to answer up front.</p>
<p>Starting out, it's easy to want to say yes to any and everything. And in most cases, go for it! There were a couple things in my last project that I had to research and figure out mid-stream. </p>
<p>But, try insofar as is possible to define the scope up front so that you can structure your project well and have a good idea of what it will take to get from start to finish.</p>
<p>Your client may or may not know their own scope. You will be a very helpful resource for them throughout the process, especially if they are not technically proficient.</p>
<h2 id="heading-define-your-process">Define Your Process</h2>
<p>This is where Trello really helped me with some of my natural weak spots. Organizing the board and setting it up to be as simple as possible for both of us really paid off as we worked together.</p>
<p>At the onset, I built a template card with instructions. This both defined the process for me, and gave a reference for my client.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/image-118.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The process of working on tasks throughout the project was extremely straightforward and left little room for confusion. On tasks where explanation was needed, screenshots, notes, and checklists were available to box up issues into containers.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/notes.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-test-test-and-test-again">Test, Test, and Test Again</h2>
<p>You can never test enough, and there will likely be things that slip through anyway. At least that's been my experience! Always test on mobile devices and not just the Chrome Dev Tools. </p>
<p>I broke some image gallery functionality and didn't realize it until client sent screenshots from his cell phone.</p>
<p>Not ideal! 😅🤦‍♂️</p>
<h2 id="heading-polish-is-important">Polish is Important</h2>
<p>Get the meta tags and favicon stuff right. Depending on the platform you're developing on, this may be done for you, but just make sure you've taken care of it before launch. It's easy to overlook things like this.</p>
<p>If you're doing these yourself, I found some helpful tools to generate and test them:</p>
<ul>
<li><a target="_blank" href="https://metatags.io/">https://metatags.io/</a></li>
<li><a target="_blank" href="https://realfavicongenerator.net/">https://realfavicongenerator.net/</a></li>
<li><a target="_blank" href="https://socialcarding.com/">https://socialcarding.com/</a></li>
<li><a target="_blank" href="https://developers.facebook.com/tools/debug/">https://developers.facebook.com/tools/debug/</a></li>
<li><a target="_blank" href="https://cards-dev.twitter.com/validator">https://cards-dev.twitter.com/validator</a>st</li>
</ul>
<h2 id="heading-results-matter-most">Results Matter Most</h2>
<p>I overrode some Bootstrap 5 CSS in my main.css. I tweaked an npm package. Your client doesn't care what you do, or about the perfect best practices. Results matter most. </p>
<p>Don't break stuff, but that aside, you may bend some rules to simplify things if you need to.</p>
<p>Your client wants you to do awesome. Concern yourself with the best way to get them the results they desire.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/you-did-good-job-meme.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-previews-are-good">Previews are Good</h2>
<p>Clients are not always technically savvy. Descriptions, screenshots, and so on are often insufficient for them to grasp and approve what you're working on. Be able to send them a working preview build when possible. </p>
<p>I developed this project using GitHub for my codebase and Netlify for deployment. <a target="_blank" href="https://docs.netlify.com/site-deploys/deploy-previews/">Deploy previews are a built in feature at Netlify</a>, and you can share URLs based on pull/merge request numbers. That way, if there is a working site up and running, the client can preview changes separately.</p>
<h2 id="heading-let-the-client-lead-when-possible">Let the Client Lead when Possible</h2>
<p>Hold your feelings and opinions loosely. This is their project, not yours. It's easy to get that backwards.</p>
<p>But the client is in charge and knows what they want even if they don't know how to get there or even how to describe it. </p>
<p>Part of our job as developers is coaxing that out of them by using the tools we are proficient with. Communication, organization, and teamwork are equally or more important than our technical toolkit.</p>
<p>As a freelancer, we are valuable assets to their business and should be pointing toward serving them well during the course of all our work.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/annie-spratt-gq5PECP8pHE-unsplash.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Let them lead when possible. </p>
<p>Make suggestions when asked or when it's necessary. </p>
<p>But be helpful above all. </p>
<p>Empathy 😊 is the name of the game. </p>
<p>Master this and the coding will often be the easy part.</p>
<h2 id="heading-thanks-for-reading">Thanks for Reading 👊</h2>
<p>I hope this has been helpful for you! </p>
<p>Come say hey 👋 over on Twitter: <a target="_blank" href="https://twitter.com/EamonnCottrell">https://twitter.com/EamonnCottrell</a></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[ What is PMP Certification? And How to Get PMP Exam Training ]]>
                </title>
                <description>
                    <![CDATA[ PMP certification is type of a project management certification offered by the Project Management Institute (PMI). It is globally recognized. Many experts in the project management field consider PMP certification to be a "gold standard". PMP stands ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-pmp-certification-pmp-training/</link>
                <guid isPermaLink="false">66b8d68fb7a8332d9a6b20a7</guid>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Quincy Larson ]]>
                </dc:creator>
                <pubDate>Wed, 06 Apr 2022 04:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/04/sven-mieke-fteR0e2BzKo-unsplash.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>PMP certification is type of a project management certification offered by the Project Management Institute (PMI). It is globally recognized. Many experts in the project management field consider PMP certification to be a "gold standard".</p>
<p>PMP stands for Project Management Professional. It's a designation awarded by PMI to people who successfully complete the PMP exam. </p>
<p>The exam tests your knowledge and understanding of the project management framework and how to apply it in a real-world setting. </p>
<p>This is only one of the 8 certifications offered by PMI, and is often the first certification a project manager will get. Some other popular certifications include:</p>
<ul>
<li>The Certified Associate in Project Management (CAPM)</li>
<li>The PMI-ACP (Agile Certified Practitioner)</li>
<li>and the PMI-PBA (Professional in Business Analysis)</li>
</ul>
<h3 id="heading-what-is-the-history-of-the-pmi">What is the history of the PMI?</h3>
<p>The Project Management Institute (PMI) is a global professional association for project managers. PMI was founded in 1969 and is headquartered in Newtown Square, Pennsylvania, United States.</p>
<p>As of March 2018, PMI has more than 700,000 members and credential holders in more than 195 countries.</p>
<h3 id="heading-who-is-eligible-for-pmp-certification">Who is eligible for PMP certification?</h3>
<p>To be eligible for PMP certification, you must have a minimum of 4,500 hours of project management experience and a high school diploma (or equivalent, such as a GED in the US). You must also pass the PMP exam.</p>
<h3 id="heading-is-the-pmp-exam-hard">Is the PMP exam hard?</h3>
<p>The PMP exam is considered to be challenging, but not impossible. If you are well-prepared and have a strong understanding of the project management framework, you stand a good chance of success.</p>
<h3 id="heading-is-pmp-certification-equivalent-to-a-degree">Is PMP certification equivalent to a degree?</h3>
<p>PMP certification is not equivalent to a degree. A degree typically requires a greater time and financial investment than certification. </p>
<p>This said, both a degree and a certification can demonstrate your knowledge and expertise in project management.</p>
<h3 id="heading-what-are-the-benefits-of-pmp-certification-training">What are the Benefits of PMP Certification Training?</h3>
<p>There are many benefits to PMP certification training. PMP certification is globally recognized and demonstrates that you have the experience and education to lead and manage projects. </p>
<p>PMP certification also gives you access to a network of other certified project managers who can provide support and guidance, and it can help you earn a higher salary.</p>
<h3 id="heading-is-it-worth-getting-a-pmp-certification">Is it worth getting a PMP certification?</h3>
<p>There is no one-size-fits-all answer to whether or not PMP certification is worth it. It depends on factors such as your career goals, work experience, and employer's expectations. However, in general, PMP certification can be beneficial in terms of career advancement and earning potential. </p>
<p>The certification is globally recognized and can help you advance their career in project management.</p>
<h2 id="heading-what-are-the-different-types-of-pmp-certification-training">What are the Different Types of PMP Certification Training?</h2>
<p>There are several different types of PMP certification training available to help you prepare for the PMP certification exam. You can find online courses, in-person courses, and online practice exams, among other resources. </p>
<p>The type of training you choose should be based on your learning style and the time you have available to prepare for the exam.</p>
<ul>
<li><strong>Online Courses</strong>: Online PMP certification training courses are convenient and allow you to learn at your own pace. You can usually find online courses in a variety of formats, including video, audio, and text. You can also find online practice exams to help you prepare for the actual exam.</li>
<li><strong>In-Person Courses</strong>: In-person PMP certification training courses are often more expensive than online courses, but they offer the benefit of being able to attend live lectures and get feedback from instructors. You can also get more hands-on experience with the material than you would from an online course.</li>
<li><strong>Online Practice Exams</strong>: Online practice exams are a great way to prepare for the actual exam. These exams are usually based on the PMP exam content outline. They can help you identify your strengths and weaknesses. You can also find online practice exams that are specific to the type of PMP certification you are pursuing.</li>
</ul>
<p>The type of PMP certification training you choose will depend on your learning style and the time you have available to prepare for the exam. You can find online courses, in-person courses, and online practice exams to help you prepare for the PMP certification exam.</p>
<h3 id="heading-how-much-does-pmp-certification-training-cost">How Much Does PMP Certification Training Cost?</h3>
<p>The cost of PMP certification training can vary depending on where you take the course and how long the course is. Expect to pay between $500 and $1,500 for a course that is between 35 and 40 hours long.</p>
<h3 id="heading-where-to-find-pmp-certification-training">Where to Find PMP Certification Training</h3>
<p>Some popular providers of PMP training include the PMI itself. You can also read the PMBOK (Project Management Body of Knowledge), a book published by the PMI.</p>
<p>There are also schools that provide training for the exam. And you may be able to find some free learning resources and YouTube channels.</p>
<h3 id="heading-does-freecodecamporg-offer-pmp-certification-training">Does freeCodeCamp.org offer PMP Certification Training?</h3>
<p>Not yet. We may explore this in the future. For now, I recommend shopping around for courses through those providers I mentioned earlier.</p>
<p>If you are serious about becoming a PMP, know that it takes several years of hard work and study.</p>
<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[ How to Be a Good Open Source Project Owner – The Ultimate Guide ]]>
                </title>
                <description>
                    <![CDATA[ By JeB Barabanov Have you ever thought about having your own open source project? I bet you have — you’re reading this article.  Maybe you are thinking about it right now. Maybe you came here to learn what to expect, what challenges you’re going to f... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/ultimate-owners-guide-to-open-source/</link>
                <guid isPermaLink="false">66d45f319208fb118cc6cfbf</guid>
                
                    <category>
                        <![CDATA[ community ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ projects ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 15 Mar 2021 13:50:21 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/03/mark-konig-fbKMKNVJjwo-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By JeB Barabanov</p>
<p>Have you ever thought about having your own open source project? I bet you have — you’re reading this article. </p>
<p>Maybe you are thinking about it right now. Maybe you came here to learn what to expect, what challenges you’re going to face, and how to deal with them. Well, you’ve come to the right place.</p>
<p>The following guide is based on my personal experience in <strong>owning</strong> an open source project. And I do mean owning – not just contributing to – an open source project. There is a big difference, and we’re going to learn why.</p>
<h3 id="heading-so-lets-get-started-withthe-ultimate-owners-guide-to-open-source">So let's get started with...The Ultimate Owners Guide to Open Source</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/mark-konig-fbKMKNVJjwo-unsplash-1.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-table-of-contents">Table of contents</h2>
<ul>
<li><a class="post-section-overview" href="#heading-first-a-bit-about-me">Intro</a></li>
<li><a class="post-section-overview" href="#heading-so-what-is-open-source">What is Open Source</a></li>
<li><a class="post-section-overview" href="#heading-why-start-an-open-source-project">Why Start an Open Source Project</a></li>
<li><a class="post-section-overview" href="#heading-how-to-start-an-open-source-project">How to Start an Open Source Project</a></li>
<li><a class="post-section-overview" href="#heading-how-to-write-documentation-for-your-open-source-project">How To Write Documentation</a></li>
<li><a class="post-section-overview" href="#heading-how-to-publicize-your-open-source-project">How to Publicize Your Open Source Project</a></li>
<li><a class="post-section-overview" href="#heading-how-to-manage-issues-and-pull-requests-in-your-open-source-project">How to Manage Issues and Pull Requests</a></li>
<li><a class="post-section-overview" href="#heading-how-to-automate-your-process">How to Automate Your Process</a></li>
<li><a class="post-section-overview" href="#heading-version-management">Version management</a></li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_now0_4liLR7fJcvvnWWStQ.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-first-a-bit-about-me">First, A Bit About Me</h2>
<p>My name is Jeb and I’ve been maintaining a few open source projects for a couple of years. The most popular one and the one from which I’ve learnt the most is <a target="_blank" href="https://github.com/just-jeb/angular-builders">@angular-builders</a>. At the moment of writing it has ~900 stars on Github and about 1M monthly downloads.</p>
<p>Yes, it’s not even close to huge projects like Angular or React – but I feel that I have enough experience to share with you to help you avoid the same mistakes I made. And more importantly, to help you understand the cost of owning an open source project.</p>
<h2 id="heading-so-what-is-open-source">So What is Open Source?</h2>
<p>Let’s first establish a common language and align on key terms and definitions.<br>What is open source? Here is a very generic <a target="_blank" href="https://en.wikipedia.org/wiki/Open_source_(disambiguation)">definition</a> from a well known <em>Open Source</em> Encyclopedia (aka Wikipedia):</p>
<blockquote>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Open_source">Open source</a> is the concept of the information allowing the replication or modification of something being open to the public.</p>
</blockquote>
<p>or, in terms of <a target="_blank" href="https://en.wikipedia.org/wiki/Open-source_model">software development</a> models:</p>
<blockquote>
<p>The open-source model is a decentralized <a target="_blank" href="https://en.wikipedia.org/wiki/Software_development">software development</a> model that encourages <a target="_blank" href="https://en.wikipedia.org/wiki/Open_collaboration">open collaboration</a>.  </p>
<p>A main principle of <a target="_blank" href="https://en.wikipedia.org/wiki/Open-source_software_development">open-source software development</a> is <a target="_blank" href="https://en.wikipedia.org/wiki/Peer_production">peer production</a>, with products such as source code, <a target="_blank" href="https://en.wikipedia.org/wiki/Blueprint">blueprints</a>, and documentation freely available to the public.</p>
</blockquote>
<p>In the case of Wikipedia, we have those who edit the articles (contributors) and those who approve the edits (more experienced members, moderators). </p>
<p>If we project it onto the software world, the editors would form a core team of an open source project and the contributors would be, well, contributors.</p>
<p>Wikipedia is a huge open source project but it all started from <a target="_blank" href="https://en.wikipedia.org/wiki/History_of_Wikipedia">something small</a>. Wikipedia was born from Nupedia and it was created for a reason:</p>
<blockquote>
<p>Despite its mailing list of interested editors, and the presence of a full-time editor-in-chief, <a target="_blank" href="https://en.wikipedia.org/wiki/Larry_Sanger">Larry Sanger</a>, a graduate <a target="_blank" href="https://en.wikipedia.org/wiki/Philosophy">philosophy</a> student hired by Wales, the writing of content for Nupedia was extremely slow, with only 12 articles written during the first year.</p>
</blockquote>
<p>So here’s where the first question comes into play...</p>
<h3 id="heading-why-should-you-bother-with-open-source">Why Should You Bother With Open Source?</h3>
<p>As you can imagine, one of the main reasons for opening something to the wider audience is <em>to gain collaborators.</em></p>
<blockquote>
<p>Together we’re strong.<br>(Zarya, 2016)</p>
</blockquote>
<p>At the moment of writing this article, Wikipedia <a target="_blank" href="https://en.wikipedia.org/wiki/Wikipedia:Wikipedians">has</a> 37,899,499 registered accounts of which 134,022 are actively editing.</p>
<p>Just think of it… <strong>134,022 active collaborators.</strong> Oh, and it <a target="_blank" href="https://en.wikipedia.org/wiki/Special:Statistics">has 6M content pages</a>!</p>
<p>Would the numbers have been the same if Nupedia didn’t move to an open source model? I highly doubt it.</p>
<p>Nothing is different when it comes to software. In order to solve a certain problem you have to write code. In order to solve a big problem you have to write a lot of code. And in order to solve it properly, you have to write high quality code, make a high quality design, and so on. </p>
<p>All this requires resources<em>,</em> which, let’s be honest, you probably don't have. You have a rent to pay, after all.</p>
<h2 id="heading-why-start-an-open-source-project">Why Start an Open Source Project?</h2>
<p>While gaining collaborators is a reasonable incentive, almost no one starts a new open source project solely because of that. Your reasons might be different, but let’s talk about most popular ones.</p>
<h3 id="heading-1-you-want-to-solve-a-problem-for-which-no-free-solution-exists">#1 You want to solve a problem for which no free solution exists</h3>
<p>You face a problem, but there is nothing out there that solves it for you (or there is something, but it costs money) so you have to solve it yourself. You manage to solve it, you’re really excited about your work, and you think others can benefit from it. So you open source the project.</p>
<h3 id="heading-2-you-want-to-be-a-founder">#2 You want to be a founder</h3>
<p>You want to be recognized as a founder of an open source project, and you want that fancy line in your CV. You have an ego (we’re all human, after all). If this is the <em>main reason</em> for you, then I promise you – after reading this guide you’ll reconsider. It’s likely not worth it.</p>
<h3 id="heading-3-you-want-to-solve-a-problem-better-than-someone-else-does">#3 You want to solve a problem better than someone else does</h3>
<p>You face a problem, and there is an open source project that actually solves it for you but it’s not good enough (in your opinion) or doesn’t have the exact feature you need. </p>
<p>If you create a new open source project solely because of this, then <em>most probably</em> you’re at #2 (ego). Make yourself a contributor, and create a PR to the existing project instead.</p>
<p>If the existing project has a different vision and making a PR is not an option, you should consider either extending it by reusing its functionality in your project or <a target="_blank" href="https://help.github.com/en/github/getting-started-with-github/fork-a-repo">forking</a> it. It may save you a lot of headache later.</p>
<h3 id="heading-4-you-want-to-solve-a-problem-by-creating-an-open-source-project">#4 You want to solve a problem by creating an open source project</h3>
<p>You face a problem and there is nothing out there that solves it for you. So you think that starting the solution as open source from the very beginning is a very good idea.</p>
<p>In my opinion, it’s not.</p>
<p>Solve the problem, make sure it works for you, and after that go to #1.</p>
<p>These are the four incentives I most commonly find for people creating a new open source project. But in this guide we’re going to focus mainly on scenario #1.</p>
<p>The reason is simple — I believe that if your <em>main reason</em> for starting an open source project is anything other than eagerness to share and contribute what you've made, then this won’t hold.</p>
<p>For quite a long time the fact that you’re helping someone might be the only reward you get. And if this is not the kind of satisfaction you’re looking for, then maybe you should stop here and not waste your time.</p>
<p>There is another quite popular scenario which is worth mentioning: there are companies that open part of their code to the community. Examples of this are Angular (maintained by Google), React (maintained by Facebook), VSCode (maintained by Microsoft) and more.</p>
<p>Their reasons may vary, but gaining collaborators and contributing to community are surely among them.</p>
<p>While I can’t argue with the importance of this practice, this scenario is quite different from the others because employees that maintain such projects <strong>get paid</strong> for their job.</p>
<p>If you work at a company that considers the possibility of creating an open source project, the majority of the content here will be still relevant for you, however the incentives might be different.</p>
<h3 id="heading-so-should-you-create-an-open-source-project">So should you create an open source project?</h3>
<p>If I had to summarize this part in one sentence it would be:</p>
<blockquote>
<p>Make sure your intentions match your expectations.</p>
</blockquote>
<p>Believing that you want to have an open source project is not the same as actually having one, as you will see in the following chapters.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_6OX0spWqVQZxG3ue5D_EBA.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-start-an-open-source-project">How to Start an Open Source Project</h2>
<p>So you’re in scenario #1 – you have a solution for a specific problem and you’re eager to share it with the world. Let’s emphasize it again:</p>
<ol>
<li>It’s not about your ego</li>
<li>You’re not hoping to benefit from it</li>
<li>You truly want to help others with the same problem</li>
</ol>
<p>If you answered yes to all of these things, then here is a quick checklist for you to make sure you’re doing the right thing:</p>
<ol>
<li>Make sure that open source is the right format. If it’s something small that you want to share with the world, then a blog post might be just enough.</li>
<li>Double check that a similar project doesn’t exist already. Maybe your solution makes a perfect PR for an established open source project.</li>
</ol>
<h3 id="heading-be-prepared-for-whats-coming">Be prepared for what’s coming</h3>
<p>As I mentioned, owning an open source project carries with it a lot of challenges.</p>
<p>One that stands out is that it requires a lot of your time. Everything that you do for your project requires time, whether it’s writing code, managing issues, updating dependencies, talking to people, answering questions, and so on. </p>
<p>Every minute that you invest into your open source is a minute that you could have but didn’t invest in your family, your hobby, your health and what not.</p>
<p>The only thing that you can do to make this better is to start delegating. When (or should I say “if”) you have enough collaborators, you can outsource part of your responsibilities to the people you trust.</p>
<h3 id="heading-code-separation">Code separation</h3>
<p>So here we go, you have a solution for your specific problem and you think others can benefit from it. It is still integrated within your code base and you probably don’t want to make the whole code base open source (unless you do).</p>
<p>First you have to separate this code from the rest of your code base.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/idigomnotoya-refactoring.jpg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>…which will eventually mean that all the code that is going to be opened will reside in a separate directory.</p>
<h3 id="heading-make-the-code-generic">Make the code generic</h3>
<p>Make sure that the code in the new directory is generic and is not bound to your specific problem. Make an abstraction layer if needed.</p>
<p>As an example, I started <a target="_blank" href="https://github.com/just-jeb/angular-builders">angular-builders</a> with a very specific need (coming from <a target="_blank" href="https://github.com/just-jeb/electron-angular-native">one of my other open source projects</a>) of adding a custom loader for native modules to Angular build.</p>
<p>I could have created <em>native-module-builder</em> which would serve only this very purpose. However, I realized that at a relatively low cost I could create a more generic solution that would solve similar (but not the same!) problems.  </p>
<p>This is how <a target="_blank" href="https://github.com/just-jeb/angular-builders/tree/master/packages/custom-webpack">custom-webpack</a> builder was born.</p>
<h3 id="heading-keep-it-simple">Keep it simple</h3>
<p>Generic is great, but be careful not to get too excited about that.</p>
<p>Premature optimization and over-generalization are two very well known problems in software engineering. You should find this sweet spot where your solution solves problems other than yours but <em>not all the problems in the world.</em></p>
<p>If you build a scale where the solution for your specific problem is 1 and a solution for all the world problems is 100 then you should start with 2.</p>
<p><em>Your generic code should be able to solve a a few more problems than your specific code.</em></p>
<h3 id="heading-eat-your-own-dog-foodhttpsenwikipediaorgwikieatingyourowndogfood"><a target="_blank" href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">Eat your own dog food</a></h3>
<p>Keep using this generic code in your code base at every step — doing so makes sure you eliminate the unnecessary parts and leave only what’s needed. It also ensures that the code you’re going to open is working properly.</p>
<p><em>Remember, you are the very first user of your open source project.</em></p>
<h3 id="heading-dont-get-sued">Don’t get sued</h3>
<p>If you’re extracting the code from your company code base, consult with your superiors and if needed with the legal department. Make sure that they support your initiative and that the code you’re going to open is not subject to the IP (intellectual property) of your company. </p>
<p>This will also help you to decide which <a target="_blank" href="https://opensource.org/licenses">open source license</a> is more suitable for your project.</p>
<p>When everything is working, the code is separated and is generic enough, and you have all the approvals (if needed), then it is time to open it to the world.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_oT-ftfrBJ_BvmaZk2zumpg.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Once your open source code is separated and generalized it’s time to disconnect it completely from your code base.</p>
<h3 id="heading-go-public-with-your-code">Go public with your code</h3>
<p>First, you have to open the source code of your project (at the end of the day that is what makes it an Open Source Project!).</p>
<p>There are <a target="_blank" href="https://stackify.com/source-code-repository-hosts/">different options</a> for hosting source code online, but we’ll go with the default — GitHub.</p>
<ol>
<li><a target="_blank" href="https://help.github.com/en/github/getting-started-with-github/create-a-repo">Create a new repo</a> on GitHub</li>
<li>Clone the repository</li>
<li>Move the sources from the directory you previously created (don’t remove the directory yet).</li>
<li>Commit &amp; push — voilà it’s now an open source project.</li>
</ol>
<p><em>Or is it?</em></p>
<h3 id="heading-create-a-package">Create a package</h3>
<p>Your project is publicly available, but no one is using it (including you, since you’re using a copy of this code within your larger code base). And no one is aware of its existence.</p>
<p>Furthermore the only format in which your project is publicly available on the web is the <em>source code</em>. And the only way to consume it is copy-pasting the code into a code base. Not a very convenient way, right?</p>
<p>In order to properly distribute your project, you have to:</p>
<ol>
<li>Create a package out of the source code</li>
<li>Make this package available on one of the public package registries (depends on your ecosystem, for example, for Java it might be <a target="_blank" href="https://search.maven.org/">Maven Central Repository</a>, in the case of JavaScript it might be <a target="_blank" href="https://www.npmjs.com/">Npm Package Registry</a> and so on)</li>
</ol>
<p>This is when you add a build chain to your new shiny repository, define your project's name, and more.</p>
<p>I’m not going to break down the whole process because it is very dependent on your ecosystem, set of tools and language you are using.</p>
<p>You might be an all around person to whom defining a new project as well as adding a build chain and publishing the package is a piece of cake. If this is the case — good for you!</p>
<p>You also might be a person that is used to only writing code but has never faced all these definitions, configurations, artifacts and stuff like that. It might be a whole new world to you.</p>
<p>If you're that person, it's time to learn. Not going to be quick, I promise you that, but we'll get there.</p>
<h3 id="heading-in-any-case">In any case...</h3>
<p>When you’re done filling in all the missing puzzle pieces in your head, you’ve learned everything about the relevant package registry, and your package is actually published, <em>then</em> <em>and only then</em> can you truly consider your project open source.</p>
<p><em>At this point you can actually tell people: “Hey, I already have a solution to your problem, just add this package to your project and use it!”</em></p>
<h3 id="heading-perform-a-sanity-check">Perform a sanity check</h3>
<p>Before your project goes viral, make sure it works.</p>
<p>A sanity check for your package would be actually removing the generic directory from your larger code base and use the publicly available package instead.<br>After all, <em>you’re the very first user of your open source project</em>.</p>
<h3 id="heading-how-to-handle-further-development-on-your-code-base">How to Handle Further Development on your Code Base</h3>
<p>When you start using the package in your code base, the development flow is likely to change. Previously, the now-open-source-code was part of your code base – you could consume the changes right away. </p>
<p>But now it’s as much of an external package as any other 3rd party package used in your code.</p>
<p>Thus, when you develop a new feature in your shiny new open source project, you’ll have to publish it first in order to be able to consume it in your larger code base. However you cannot publish it if you aren’t positive it works, because once published it might affect other users.</p>
<p>So here are a few things you can do in order to avoid publishing broken versions:</p>
<ol>
<li>Cover your code with tests, both unit tests and end-to-end tests.<br><em>I don’t think I have to convince you how important the tests are.</em></li>
<li>Package and install the new version of the package locally, into your larger code base.<br><em>Once verified that everything works as expected</em>, <em>you may publish it.</em></li>
<li>Publish a beta version which is available only to those who explicitly want it rather than to the whole world.<br><em>For example in</em> the <em>npm package registry there are</em> <a target="_blank" href="https://docs.npmjs.com/cli/dist-tag"><em>dist tags</em></a> <em>that can be used for this purpose.</em><br><em>The default tag is</em> <code>_latest_</code> <em>and when you run</em> <code>_npm install mypackage_</code> <em>it effectively runs</em> <code>_npm install mypackage@latest_</code><em>. When you publish a new version under another tag, for instance</em> <code>_beta_</code><em>,</em> people <em>will have to explicitly install from this tag in order to get the latest version:</em><br><code>_npm install mypackage@beta_</code> <em>.</em></li>
</ol>
<h3 id="heading-wrapping-it-up">Wrapping it up</h3>
<p>Unlike the previous part, which was completely theoretical, this part actually requires some work from you. Depending on your experience and learning abilities it might take you a few days or even weeks to complete this mandatory step. And we haven't even started yet.</p>
<p>This is why it is my duty to ask you again:</p>
<blockquote>
<p>Are you fully prepared to give a decent amount of your precious time to the community?</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_z5sGJuWoz02x3uSBaF4tLg.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-write-documentation-for-your-open-source-project">How to Write Documentation for your Open Source Project</h2>
<p>The first two parts of this article were targeted to those who are considering creating an open source project. I wanted to let them know what to expect and give them a head start in the open source world.</p>
<p>This part, as well as the upcoming ones, will also be relevant to people who already maintain an open source project and want to improve at what they do.</p>
<h3 id="heading-the-baseline-for-this-part">The baseline for this part:</h3>
<blockquote>
<p>You already have an open source project, it is available on GitHub, and it can be consumed easily via one of the package registries.</p>
</blockquote>
<h3 id="heading-why-do-you-need-documentation-and-what-should-it-contain">Why Do You Need Documentation, and What Should It Contain?</h3>
<blockquote>
<p>An open source project without documentation is a dead project</p>
</blockquote>
<p>It is dead because no one will dive into your code to find out how it should be used. And even before <em>how</em>, no one will even know <em>what</em> your code is supposed to do.</p>
<p>So these are basically the two things that your documentation should contain — <em>what</em> and <em>how</em>. These are the corner stones, the must-haves of documentation.</p>
<h3 id="heading-how-to-write-a-description-of-your-project">How to Write a Description of Your Project</h3>
<p>The description is the first thing everyone sees when they enter a GitHub repository. Therefore a good description should answer in a short and informative manner the <em>what</em> question. For example:</p>
<p><a target="_blank" href="https://github.com/facebook/react">React</a>:</p>
<blockquote>
<p><em>A declarative, efficient, and flexible JavaScript library for building user interfaces. <a target="_blank" href="https://reactjs.org/">https://reactjs.org</a></em></p>
</blockquote>
<p><a target="_blank" href="https://github.com/moment/moment">Moment.js:</a></p>
<blockquote>
<p><em>Parse, validate, manipulate, and display dates in</em> J_ava_Sc<em>ript. <a target="_blank" href="http://momentjs.com/">http://momentjs.com</a></em></p>
</blockquote>
<p><a target="_blank" href="https://github.com/just-jeb/angular-builders">Angular builders</a> (this one is mine):</p>
<blockquote>
<p><em>Angular build facade extensions (Jest and custom webpack configuration)</em></p>
</blockquote>
<p>You can edit description in the <code>About</code> section of your repository:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screen-Shot-2021-03-11-at-10.20.43-1.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-how-to-write-a-readmemd-file">How to Write a README.MD File</h3>
<p>README.MD is a file in the root directory of your project, written with <a target="_blank" href="https://help.github.com/en/github/writing-on-github/basic-writing-and-formatting-syntax">Markdown syntax</a>, which contains all the information someone needs to know about your project.</p>
<p>The README file should contain a detailed description (which expands on the <em>what</em> question) and very detailed instructions on <em>how</em> to use you project.<br>The instructions should cover every single piece of <em>public API</em>, preferably with usage examples.</p>
<p>Here are a few points for writing a good API documentation:</p>
<ul>
<li><strong>Keep it simple</strong> – The simpler the API and the example, the easier for a user to understand what it does on how to use it</li>
<li><strong>Keep it structured</strong> – Use the same template and visual structure for every API method. This way you’ll define your own language for communicating the API to the user.</li>
<li><strong>Be a user</strong> – Always write API description from the user's perspective. Assume that you know nothing about the internals and this documentation is all you have.</li>
<li><strong>Keep it up to date</strong> – As your project evolves, the APIs might change. Make sure that your README file always contains the most current APIs and examples.</li>
</ul>
<p>The README can (but doesn’t have to) contain the following things:</p>
<ul>
<li>Link to a contribution guide</li>
<li>List of contributors</li>
<li>Link to a change log</li>
<li>Latest version</li>
<li>License</li>
<li>Build status</li>
<li>Downloads counter</li>
<li>Link to a chat for fast feedback</li>
</ul>
<p><a target="_blank" href="https://github.com/aws-amplify/amplify-js">Here</a> is a an example for what a good README could look like.</p>
<h3 id="heading-what-are-badges">What Are Badges?</h3>
<p>Badges are a fairly good way to visually expose the essential info about your project, such as: build status, version, license and various tools used by your project.</p>
<p>There are quite a few options, but I’d recommend you use <a target="_blank" href="https://shields.io/">shields.io</a> badges.<br>They have a badge for literally everything.</p>
<p>Adding a badge to your README file is really simple:</p>
<ol>
<li>Go to <a target="_blank" href="https://shields.io/">shields.io</a></li>
<li>Choose the appropriate category</li>
<li>Click on a badge you’d like to add to your README</li>
<li>Fill in the required information (if any)</li>
<li>Choose Copy Markdown from a drop down menu</li>
<li>Paste the markdown into your README file</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-141342.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The badges are usually put at the top of the README file right before the detailed description. This is what it looks like:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_hgG8kurYMkdAsMXxji4iVg.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-make-sure-you-have-tests">Make Sure You Have Tests</h3>
<p>API reference is great, but nothing compares to real code using your public APIs.</p>
<p>One of the best ways to complement your documentation is having good code coverage with descriptive tests. Sometimes tests explain the code better than any documentation.</p>
<h3 id="heading-wrapping-it-up-1">Wrapping it up</h3>
<p>In this part we’ve only covered the basics of documentation. There's a lot more than just a README or a description, for example. As your project grows and issues arise, they become an integral part of the documentation.</p>
<blockquote>
<p>However, having a README file that covers the public API is the bare minimum for any decent open source project</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/david-menidrey-16ep3TGZR-0-unsplash.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-publicize-your-open-source-project">How to Publicize Your Open Source Project</h2>
<p>We’ve already discussed what it means to start a project, how to do it optimally, and how to write good documentation for it.</p>
<p>Now let's talk about drawing the public's attention to your project and optimizing it to both attract and correctly manage contributions.</p>
<h3 id="heading-the-baseline-for-this-part-is">The baseline for this part is:</h3>
<blockquote>
<p><em>You already have an open source project, it is available on GitHub, it's well-documented and can be consumed easily via one of the package registries.</em></p>
</blockquote>
<h3 id="heading-how-to-spread-the-word-about-your-project">How to Spread the Word About Your Project</h3>
<p>Let’s address the elephant in the room: as your project grows, you simply wont be able to handle everything by yourself. So you'll need more people to work on the project if you want it to live long and prosper.</p>
<p>To get more people involved in your project you need more people to know about it and above all else to believe in it.</p>
<p>From my experience the best way to expose your open source to the right audience is to <strong>use one of the well known resources</strong> and write a blog post about your project.</p>
<p>The resource might be purely dev-oriented (like dev.to<em>)</em> or not (like Medium).</p>
<p>One commonality between all these resources is that they have an established audience and it is the relevant audience.</p>
<p>You can also <a target="_blank" href="https://en.wikipedia.org/wiki/Crossposting">cross-post</a> your article between various online resources so that you cover an even larger audience. But be aware – cross-posting has a few downsides:</p>
<ul>
<li>Each of these platforms may have a different mark up language and you’ll have to redo all the formatting</li>
<li>Maintenance — if something changes (and things <em>will</em> change) you’ll need to update your blog post across all of the resources.</li>
</ul>
<p>If you go for Medium, I’d highly recommend you submit your article to one of the <a target="_blank" href="https://getgist.com/top-50-medium-publications/">large publications</a>. It will require additional effort on your end, since you’ll have to align your article with the publication's requirements. But it will also ensure that your article is exposed to a large and, which is even more important, <em>relevant</em> audience.</p>
<p>You can also decide to go behind a <a target="_blank" href="https://help.medium.com/hc/en-us/articles/360018834314-Stories-that-are-part-of-the-metered-paywall">metered paywall</a> (you can earn money from doing this!):</p>
<blockquote>
<p><em>Stories that are part of the paywall are also eligible for distribution to Medium readers through topics, which power recommendations on Medium on our home page, on our topic pages, in our Daily Digest and in our apps</em></p>
</blockquote>
<p>I can’t tell you which one is better, but my personal preference is publications because it ensures your article is exposed, instead of the vague “eligible for distribution” term.</p>
<p>If your blog post goes viral then it can create a cascading effect and add even more leads to your open source project. </p>
<p>For example, if after publishing the article your Github project received a few dozens of stars in one day it can get to the Github <a target="_blank" href="https://github.com/trending">Trending</a> page which is in itself another source of exposure.</p>
<p>A few points to make your blog post great:</p>
<ul>
<li>Start with a problem statement. It might even be the title of the blog post.<br><em>Usually people are looking for a solution to a specific problem and before they decide</em> to invest <em>the time to read your post they should have an idea whether it’s what they’re looking for.</em> <a target="_blank" href="https://medium.com/angular-in-depth/customizing-angular-cli-build-an-alternative-to-ng-eject-v2-c655768b48cc">Here's an example</a> of an article I wrote.<br><em>As you can see it clearly states the problem that it solves in the title.</em><br><em>If you google “Customizing Angular build” this is</em> one of the first _result_s <em>you’ll get and right from the search page you can see which problem it addresses.</em></li>
<li>Describe why and how exactly your project solves this problem</li>
<li>Provide a detailed step-by-step guide, starting with installation and finishing with a working example.</li>
<li>Create an example project that uses your open source and link to the sources in the blog post.<br><em>There are lots of developers who prefer a working example to any blog post.</em></li>
<li>Get some feedback before publishing it.<br><em>Make your friends go over it without telling them what it’s about and see if they can figure it out themselves. If they can’t then probably it’s not that clear and you need to elaborate.</em></li>
</ul>
<p>After you’ve published your blog post, make sure you share it on social media, with your friends, your family, and strangers on the street.</p>
<p>This will increase your project’s exposure – but you also have to make people <em>want</em> to contribute to your project.</p>
<h3 id="heading-how-to-make-your-project-attractive-to-contributors">How to Make your Project Attractive to Contributors</h3>
<p>The best thing is to start an open source with other people. This way from the very beginning you have a team with which you can split the burden.</p>
<p>However, that’s not always the case.</p>
<p>If you started alone, you have to attract contributors. And in my experience there are two types:</p>
<ol>
<li>Someone who wants to make an impact and looks for a project to contribute to (these are rare but still exist).</li>
<li>Someone that uses your package and found either a bug or lack of certain functionality.</li>
</ol>
<p>In both cases just having your source code shared on Github and a single blog post on how to use it are not enough. Here are a coupe of things that can make people want to contribute:</p>
<h4 id="heading-have-a-pending-implementation-list">Have a pending implementation list.</h4>
<p>It might contain known bugs, planned features, or something else. This list will make it simpler for contributors of type #1 to pick the right item and issue a PR.<br>It can be a standalone list or you can (and probably should) use issues and labels on GitHub.</p>
<h4 id="heading-have-a-contributors-guidehttpshelpgithubcomengithubbuilding-a-strong-communitysetting-guidelines-for-repository-contributors">Have a <a target="_blank" href="https://help.github.com/en/github/building-a-strong-community/setting-guidelines-for-repository-contributors">contributors guide</a>.</h4>
<p>A very basic contributors guide should explain the repository structure and have a step-by-step guide for building and running your project and tests. The expanded guide can contain architecture, design decisions, code of conduct and more.</p>
<p>A good example is <a target="_blank" href="https://github.com/atom/atom/blob/master/CONTRIBUTING.md">Atom’s contributors guide</a>. Don’t underestimate it’s value! It’s something that takes a decent amount of time to make when the project has grown, and I wish I created it at the very beginning and updated it gradually as the project evolved.</p>
<p>Unfortunately, I didn’t have someone to point out its importance, and today <a target="_blank" href="https://github.com/just-jeb/angular-builders">my project</a> has no contributors guide. It’s always on my TODO list but there is always something more urgent than that.</p>
<h4 id="heading-recognize-your-contributors">Recognize your contributors.</h4>
<p>Listing your contributors on the main page of the project will give them additional incentive to make a contribution.</p>
<p>Just adding user names can be enough, but I’d recommend that you use <a target="_blank" href="https://github.com/all-contributors/all-contributors">All Contributors</a>. Apart of creating a fancy section with profile images and badges for your all your contributors, it automates the addition of new contributors by creating PRs that add contributors to this section.</p>
<h3 id="heading-wrapping-it-up-2">Wrapping it up</h3>
<p>In this part we’ve discussed several things that will increase your project’s exposure and provide people with an initial incentive to open a PR or an issue.</p>
<blockquote>
<p>But this won’t keep them as contributors, nor will it make sure they will finish the work they started.</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_tyzBkDXaXjRW4UIEWBikzQ.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-manage-issues-and-pull-requests-in-your-open-source-project">How to Manage Issues and Pull Requests in Your Open Source Project</h2>
<p>Now that we've explored sharing information and making your open source project more attractive, let's discuss <em>contributions,</em> the holy grail of every open source project. </p>
<h3 id="heading-what-are-open-source-contributions">What are open source contributions?</h3>
<p>A contribution to an open-source project is any change that’s done by a person other than the owner. In practice it comes in two forms:</p>
<h4 id="heading-issues">Issues</h4>
<p>Here’s what Github <a target="_blank" href="https://help.github.com/en/github/managing-your-work-on-github/about-issues">says</a> about issues:</p>
<blockquote>
<p><em>You can collect user feedback, report software bugs, and organize tasks you'd like to accomplish with issues in a repository. Issues can act as more than just a place to report software bugs.</em></p>
</blockquote>
<p>In a nutshell, an issue is any piece of information that requires some sort of action.</p>
<h4 id="heading-pull-requests-prs">Pull requests (PRs)</h4>
<p>Here’s what Github <a target="_blank" href="https://help.github.com/en/github/collaborating-with-issues-and-pull-requests/about-pull-requests">says</a> about pull requests:</p>
<blockquote>
<p><em>Pull requests let you tell others about changes you’ve pushed to a branch in a repository on GitHub. Once a pull request is opened, you can discuss and review the potential changes with collaborators and add follow-up commits before your changes are merged into the base branch.</em></p>
</blockquote>
<p>In a nutshell, a pull request is an actual change to the project.</p>
<h3 id="heading-how-to-work-with-issues-and-prs">How to Work with Issues and PRs</h3>
<p>So how do you actually work with issues and PRs, and how do you approach issues and PRs created by contributors?</p>
<h4 id="heading-use-a-personal-example">Use a Personal Example</h4>
<p>The best advice I can give you is to <em>use a personal example</em> to incorporate a certain work method. This means that when you’re working on a new feature you should create a PR for this and merge it once it meets all your standards.</p>
<p>And when you find a bug or think of some missing functionality you should create an issue. </p>
<p>Not only will this method organize your work and bring order to your project, it will also provide contributors with a reference from which they can learn and adapt their issues and PRs accordingly.</p>
<p>Additionally, if you have high standards (meaning that you believe that every PR should come with proper documentation, test coverage, and so on) then you should treat yourself just like you would any other contributor. You can’t demand from others something what you’re not doing yourself. </p>
<p>Moreover, sometimes you should be even more lenient towards the contributors than to yourself. Especially if your project is at an early stage and doesn’t have a lot of contributors. This brings us to the following point.</p>
<h4 id="heading-all-work-is-appreciated">All Work is Appreciated</h4>
<p>Collaborating with others is all about mutual respect. You should respect your contributors. Be patient when answering their questions (even ones that seem simple) and be polite when providing <em>constructive criticism</em>. </p>
<p>Remember: it’s vital to appreciate your contributors’ work. If someone just created an issue (even without thorough research, even without reproduction) — thank them. They bothered to move their chair a bit closer to the table, they sat up straight and typed something they thought could be beneficial to you. Thank them and if needed, ask for additional details in a polite and respectful manner.</p>
<p>If someone created a PR that doesn’t meet your high standards — thank them. Thank them and ask politely to make code changes/write tests/add documentation and so on. Give them a link to one of your PRs for reference or provide them with a link to the contribution guide. </p>
<p>A constructive and positive conversation will give those contributors additional incentive to continue their work. Or it won’t…</p>
<h4 id="heading-quality-versus-quantity">Quality Versus Quantity</h4>
<p>Eventually, there’s almost always a tradeoff (unless you own a huge open source project, like Angular or React). You can decide that you’re not easing up your standards, not even for a little bit, and most probably you’ll end up implementing all of the work yourself.</p>
<p>Or, you can decide that you’re lowering the standards for contributors (but this would make your standards futile as they’re not applied).</p>
<p>I’ve learned that every contributor requires a different approach. It really depends on the person and their personal interest in their contribution.</p>
<p>You should take into account such factors as the urgency of the issue, the experience of the contributor, the complexity of your code, the complexity of the required fix or feature, the contributor’s motivation, and more. </p>
<p>Usually, I politely ask for changes, wait for a few days, and if nothing happens I make the changes myself, given of course that the issue is considerably important.<br>As for less important (nice-to-have) fixes or features — I usually leave them entirely to the community.</p>
<p>Over time as the number of issues and PRs grows it becomes an ambitious task to keep track of, prioritize, and categorize them. This means that labels become incredibly important.</p>
<h4 id="heading-use-helpful-labels">Use Helpful Labels</h4>
<p><a target="_blank" href="https://help.github.com/en/github/managing-your-work-on-github/about-labels">Github labels</a> is a great tool for keeping your issues and PRs prioritized and organized. While this allows you to search and filter by labels, what I find most helpful here is it’s ability to aid in the visualization of the overall state of your project. </p>
<p>Thus, you can enter the “Issues” page and see that most of your issues are labeled as <code>bug</code>(meaning that you should stop pushing forward and instead focus on fixing them.) </p>
<p>Alternatively, you can see that most of the issues are labeled as <code>enhancement</code> or required <code>features</code>. <code>priority</code> is another useful label that helps you focus on the significant things first.</p>
<p>Additionally, your contributors can (and will) benefit from you using labels. For example, going back to <strong>Getting collaborators</strong>, someone can enter the “Issues” page and visually identify the issues that require the help of the community (<code>help-wanted</code>, <code>pr-welcome</code>, and so on.) </p>
<p>Aside from the labels with single responsibility (like <code>bug</code> or <code>enhancement</code> ), I recommend using labels for scoping an issue/PR or putting it on a certain scale. For example:</p>
<ul>
<li><code>priority:low</code> , <code>priority:high</code></li>
<li><code>required:investigation</code> , <code>required:tests</code> , <code>required:docs</code></li>
<li>Or in the case of mono repo: <code>packages:package1</code> , <code>packages:package2</code> etc.</li>
</ul>
<p>Here is an example of the labeled issues page from my project:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-141634.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Labels make it pretty easy to distinguish at a quick glance what the issues are that require your (or your contributors’) attention, to which component these issues are related, and what is required in order to proceed.</p>
<h4 id="heading-use-pr-and-issue-templates">Use PR and Issue Templates</h4>
<p>I highly recommend that you spend a few minutes of your time and define templates for <a target="_blank" href="https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository">Issues</a> and <a target="_blank" href="https://help.github.com/en/github/building-a-strong-community/creating-a-pull-request-template-for-your-repository">PRs</a>.</p>
<blockquote>
<p><em>With issue and pull request templates, you can customize and standardize the information you’d like contributors to include when they open issues and pull requests in your repository.</em></p>
</blockquote>
<p>This will save you a lot of time since you won’t have to respond to each issue or PR with a request for additional information or changes. You’ll still have to do it sometimes (because there are contributors that simply don’t pay attention to the templates) but it will happen far less often than it would if you didn’t create templates.</p>
<p>Here is an example of a default issue that you see when the corresponding template is defined in your repository:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-141725.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-use-github-apps-and-actions">Use Github Apps and Actions</h4>
<p>There are quite a few <a target="_blank" href="https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-actions#comparing-github-actions-to-github-apps">Github apps and actions</a> that can help you manage PRs and Issues. The list constantly grows, but I personally find these to be most useful:</p>
<ul>
<li><a target="_blank" href="https://github.com/marketplace/stale">Stale bot</a></li>
<li><a target="_blank" href="https://github.com/marketplace/wip">WIP</a></li>
<li><a target="_blank" href="https://github.com/dkhmelenko/autoapproval">Autoapproval</a></li>
<li><a target="_blank" href="https://github.com/actions/labeler">PR labeler</a></li>
</ul>
<h4 id="heading-make-sure-youre-responsive">Make Sure You're Responsive</h4>
<p>If I open an issue or a PR to another open-source project and it takes an eternity to get a response, then I switch. <a target="_blank" href="https://github.com/greenkeeperio/monorepo-definitions/pull/24">Here</a> is one example:</p>
<ul>
<li>The initial response was quite quick, taking only two days</li>
<li>The discussion was pretty fruitful</li>
<li>The PR is still open with no updates on what exactly is missing/wrong</li>
</ul>
<p>As a result, I switched to another package.</p>
<p>The same will hold true for your project if you’re not responsive: if it takes you two weeks to respond to PRs that are waiting for you, instead of pending for contributor’s changes required by you, then you’ll lose users (i.e. potential contributors). </p>
<p>So do yourself a favor — be responsive. It doesn’t have to be an immediate solution to someone's problem but even letting the user know that you’ll look into their issue next week already gives them some certainty and time frames.</p>
<p>The bad news is that you should stand by your promises. If these get away from you from time to time, don’t worry — we all have personal lives and it’s understandable if you had some urgent matters which postponed your work on the open-source. </p>
<p>If this occurs then give a short update — it’s not a big deal, just write a word or two to let people know that the feature they’ve been waiting for has been postponed.</p>
<h3 id="heading-how-to-prioritize-your-issues">How to Prioritize your Issues</h3>
<p>There are a few methods that can help you prioritize your most important issues. </p>
<p>First, how should someone identify the most important issues? As I see it, the most important issues are the ones that users want the most, whether it's a new feature, a bug-fix, or something else. </p>
<p>Sometimes a user will express their interest in the issue but most likely they won’t. Therefore, I present to you quite a simple way to know what users are interested in:</p>
<p>Every project on Github has an “Insights” tab, with a “Traffic” section:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142214.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>At the bottom of this section you can find the Popular Content table which gives you insights into which pages are most viewed by your visitors:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142309.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The issues listed in this table are the most visited issues and therefore are most like to be important to the users.</p>
<p>When you have identified the most important issues you need to highlight them on the issues page. Here are a few ways to do that:</p>
<h4 id="heading-pin-the-issue">Pin the issue</h4>
<p>You can have up to three pinned issue per repository. Pinned issues appear at the top of your issues page so it’s nearly impossible to miss them:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142429.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h4 id="heading-add-a-label">Add a label</h4>
<p>We already talked about <em>using</em> the labels, and this is an excellent example for <em>applying</em> the <code>help-wanted</code> as well as <code>priority:high</code> labels. Those labels will let the potential contributors know that this issue is important and that any help is appreciated.</p>
<h4 id="heading-continuous-integration">Continuous Integration</h4>
<p>Having every Pull Request built and tested before it is merged into the master will give you a decent amount of confidence in the code you’re about to merge into your master branch (depending on the test coverage). </p>
<p>While I couldn’t but mention it as a part of the PR management process, it’s an <em>automation</em> of a task that otherwise you’ll have to do yourself, therefore it is not directly related to PR management. </p>
<p>You can still check out every PR, build it locally, run the tests, and merge if everything is green (therefore Continuous Integration is not directly related to the PRs management). Don’t worry though, we’ll cover it in detail in the next section.</p>
<h3 id="heading-wrapping-it-up-3">Wrapping it up</h3>
<p>It’s very important to keep your project clean and organized because — as we all know — cleanliness is next to godliness. Not only does it make the management process more effective, but it also improves the overall impression of your project.</p>
<blockquote>
<p>PRs and issues (along with the codebase) are integral parts of your open source projects facade. Don’t underestimate their value.</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_n8_iSirZKBjHRufT6silGw.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-how-to-automate-your-process">How to Automate Your Process</h2>
<p>A natural part of managing contributions (that is, issues and PRs) is automation — probably one of the most important aspects of OSS project management.</p>
<h3 id="heading-why-automate">Why automate?</h3>
<p>If there is anything I’ve learned over the years of owning an open-source system, it’s that the less routine work you have to do yourself the more free time you have for actual work (like fixing bugs and developing new features). Therefore, I seek to <strong>automate whatever I can.</strong></p>
<p>Here’s how I’d like us to approach this aim: let’s first examine both workflows, (the non-automated and the fully-automated) to see how much of your time is actually put into routine tasks. We’ll then go into how we can achieve an improved workflow leading to more time to fix bugs.</p>
<h3 id="heading-worst-case-no-automation">Worst case — no automation</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142749.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>As you can see, in a case where nothing is automated, you do all the work. It is a lot of work just for a bug fix, and on top of that, this is the work that <em>you’ll</em> have to do <em>every time</em> there is a bug fix or a new feature! </p>
<p>Now let’s take a look at an alternate scenario.</p>
<h3 id="heading-best-case-everything-is-automated">Best case — everything is automated</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142807.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In this case you only do what you have to do — inspect the code and (sometimes) approve the pull request. Everything else is done automatically.</p>
<p>Science fiction? No, it’s called <strong>continuous integration</strong> and <strong>continuous deployment</strong>. We’re not going to get into the details of building scripts and system-specific configurations here. Instead we’ll review the tools you need to make it work and I’ll let you decide on the specifics yourself.</p>
<h3 id="heading-what-is-continuous-integration-ci">What is Continuous integration (CI)?</h3>
<blockquote>
<p><em>Continuous integration (CI) is the practice of automating the integration of code changes from multiple contributors into a single software project. The CI process is comprised of automatic tools that assert the new code’s correctness before integration.</em></p>
</blockquote>
<p>A very basic CI run would include <strong>build</strong> and <strong>unit tests</strong>, however it is not limited to these two. It might also include all kinds of static code analysis tools, linters, and so on. This is where you define your standards.</p>
<h3 id="heading-why-you-should-use-end-to-end-tests">Why You Should Use End-to-End Tests</h3>
<p>Build and unit tests provide you with quick feedback for code changes, take a relatively short time, and fail quickly if something goes wrong. But end-to-end (E2E) tests have a special place in CI. </p>
<p>E2E tests should cover not just the correctness of the code but also your deployment flow, package integrity, and so on. </p>
<p>I myself realized this when I accidentally published a new version of a package that didn’t contain any code. The build has passed, the unit tests were green as well as E2E tests (those at a time were installed by linking the build output directory from the test project). Where did it fail? In the packaging phase. </p>
<p>A key takeaway here: E2E tests should test your packages as if it was used by a real user.</p>
<p>In order to achieve this I recommend the following:</p>
<ol>
<li>During your CI run, start up a local package registry. Each language/ecosystem has a few options, for example for Java or Scala projects you have the <a target="_blank" href="https://blog.sonatype.com/using-nexus-3-as-your-repository-part-1-maven-artifacts">Nexus Repository</a>, and for JavaScript there is <a target="_blank" href="https://github.com/verdaccio/verdaccio">Verdaccio</a> (which I’m using in <a target="_blank" href="https://github.com/just-jeb/angular-builders">@angular-builders</a>)</li>
<li>Have a separate project that makes use of your package (this can reside in the same repo). The tests in this project should test your package’s functionality.</li>
<li>Configure this project to use the local package registry.</li>
<li>After your package is built, publish it to the local package registry (started up in your CI system).</li>
<li>Install the latest version of the package (that you’ve just published) into your test project.</li>
<li>Run the tests.</li>
</ol>
<p>Not only will it test your package integrity and reliability, but it will also save you some work when it comes to continuous deployment.</p>
<h3 id="heading-how-a-ci-system-works">How a CI System Works</h3>
<p>There are plenty of CI systems that have a free plan for open source projects, among them <a target="_blank" href="https://travis-ci.com/">Travis CI</a>, <a target="_blank" href="https://circleci.com/">CircleCI</a>, <a target="_blank" href="https://www.appveyor.com/">AppVeyor</a>, <a target="_blank" href="https://github.com/features/actions">Github Actions</a>, and others. </p>
<p>They are all more of the same and do basically the same in that they check out your code to a virtual machine, run a script that you define (usually run build and tests), and then report either a success or a failure to GitHub.</p>
<p>All of these systems have an <a target="_blank" href="https://github.com/marketplace?category=continuous-integration&amp;type=apps">app</a> for integration with GitHub and the integration flow is pretty similar in all of them:</p>
<ol>
<li>Register on the platform.</li>
<li>Install the corresponding app in your GitHub account.</li>
<li><a target="_blank" href="https://github.com/settings/installations">Configure access</a> to the selected repositories.</li>
<li>Create a configuration file (like <code>travis.yaml</code> ) that defines the build matrix, required build chain, and CI script.</li>
<li>Push it to the master</li>
</ol>
<p>This will make your CI run on every PR and report the status to GitHub – but this isn’t enough. What you really want is to block the merge to the master branch until the PR has passed all the checks.</p>
<p>This is done by defining the branch protection rules. In order to define those, you should go to the “<strong>Branches”</strong> section in your repository “<strong>Settings”</strong> and press the “<strong>Add rule”</strong> button:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142547.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Then check the “<strong>Require status checks to pass before merging”</strong> checkbox:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142635.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>As you can see, the corresponding Github Apps checkboxes already appear here, so the only thing that’s left is to enable them. </p>
<p>The exact build script really depends on your ecosystem, the language your project is written in, the frameworks you’re using, and more. Therefore we won’t cover it here — you’ll have to check out the documentation of the CI system yourself to get into specifics. However, you now have a pretty good idea of what CI is and how it automates your PRs, so let’s move on.</p>
<h3 id="heading-how-continuous-deployment-cd-works">How Continuous Deployment (CD) Works</h3>
<blockquote>
<p><em>Continuous Deployment (CD) is a software release process that uses automated testing to validate if changes to a codebase are correct and stable for immediate autonomous deployment to a production environment.</em></p>
</blockquote>
<p>In our case, the production environment is when a package is publicly available in a package registry. This is a point-of-no-return phase, as once you have published it you cannot un-publish it since this is publicly available (and hence potentially in use).</p>
<p>There are multiple strategies for continuous deployment which really depend on the project and its complexity. But in my opinion, releases should be made solely from a master branch as this makes the workflow pretty easy. Here’s how:</p>
<ol>
<li>Each PR represents either a bug fix or a new feature.</li>
<li>The code is tested (including E2E) before it even gets to the master.</li>
<li>The master is a protected branch so as long as you don’t merge failing PRs the master stays stable.</li>
<li>Every PR merge to a master triggers a master CI run which eventually releases a new version.</li>
</ol>
<p>This will ensure that all the releases are sequential and will make it really easy to associate certain PR with specific versions.</p>
<p>To automate package releases, we’ll need a few things:</p>
<ol>
<li>Automatic version advancement based on commit messages.</li>
<li>Automatic CHANGELOG updates based on commit messages.</li>
<li>Automatic package publishing to a public package repository.</li>
<li>Automatic release on Github.</li>
</ol>
<p>Good news everyone: all of these are already supported by <a target="_blank" href="https://github.com/semantic-release/semantic-release">semantic-release</a>. Bad news: you’ll have to invest some time to make it work (but eventually it pays off).</p>
<h3 id="heading-how-semantic-release-works">How Semantic-release Works</h3>
<blockquote>
<p><em>semantic-release automates the whole package release workflow including: determining the next version number, generating the release notes and publishing the package.</em>  </p>
<p><em>This removes the immediate connection between human emotions and version numbers, strictly following the <a target="_blank" href="http://semver.org/">Semantic Versioning</a> specification.</em></p>
</blockquote>
<p>We won’t be covering the whole integration process here as they have very good documentation and there is no reason to recapitulate it here. I will mention a few points though:</p>
<ul>
<li>Make sure that you understand <a target="_blank" href="https://semver.org/">semantic versioning specification</a> and the <a target="_blank" href="https://www.conventionalcommits.org/en/v1.0.0/">conventional commits</a> format before you start with Semantic Release.</li>
<li>To make semantic-release work well, you should enforce certain commit message formats. To do so you can run <a target="_blank" href="https://github.com/conventional-changelog/commitlint">commitlint</a> as a <a target="_blank" href="https://github.com/typicode/husky">husky</a> precommit hook. It will enforce conventional commits when someone creates a local commit, but it can’t do anything about commits that are performed directly from the GitHub web UI (which often happens when someone wants to make a quick fix to their PR). Therefore I recommend that you back it up by <a target="_blank" href="https://github.com/marketplace/actions/commit-linter">commitlint Github Action</a>.</li>
</ul>
<p>After you set up the semantic release as part of your workflow, you’re pretty much done and you no longer have to spend your time on these routine processes. Although there is one more optimization you can do.</p>
<h3 id="heading-how-to-keep-the-project-up-to-date">How to Keep the Project Up to Date</h3>
<p>If your project has no external dependencies — skip this part. However, most projects depend on other packages, and other packages tend to change. </p>
<p>Keeping your project up to date with its dependencies is important but <em>it is time-consuming</em>. Luckily for us, there is a solution. In fact, there are a few of them such as <a target="_blank" href="https://greenkeeper.io/">Greenkeeper</a>, <a target="_blank" href="https://renovate.whitesourcesoftware.com/">Renovate</a>, and <a target="_blank" href="https://dependabot.com/">Dependabot</a>. </p>
<p>The idea is pretty much the same in all of them so I’ll just quote Dependabot’s “How it works” section:</p>
<blockquote>
<p><em><strong>1. Dependabot checks for updates</strong></em><br><em>Dependabot pulls down your dependency files and looks for any outdated or insecure requirements.</em></p>
<p><em>2.</em> <strong><em>Dependabot opens pull requests</em></strong><br><em>If any of your dependencies are out-of-date, Dependabot opens individual pull requests to update each one.</em></p>
<p><em>3.</em> <strong><em>You review and merge</em></strong><br><em>You check that your tests pass, scan the included changelog and release notes, then hit merge with confidence.</em></p>
</blockquote>
<p>As you may have noticed it only makes sense when you have a working CI.</p>
<h3 id="heading-wrapping-it-up-4">Wrapping it up</h3>
<p>If you have a fully automated CI/CD cycle and a new issue is opened in your OSS repository, you can provide a bug fix within minutes. </p>
<p>In fact, you can enter the mobile Github version from your phone, fix the buggy line or two, and commit the code. The rest is done automatically, and your customers are provided with a new version right away. </p>
<p>I myself was able to quickly and painlessly get a fixed version to my customers multiple times.</p>
<blockquote>
<p><em>Having great automation is not about freeing</em> up <em>some time for leisure, it’s about dedicating your time to really important things and increasing your responsiveness.</em></p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_6k7J2Dj1iz0c901UExzjWg.jpeg" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-version-management">Version Management</h2>
<p>To conclude the guide I'd like to talk about Versions Management, an aspect that always becomes relevant for any OSS project that has a decent number of users.<br>You’ll learn about version notations, breaking changes, back-ports, and more.</p>
<h3 id="heading-what-is-software-versioning">What is Software Versioning?</h3>
<p>Let’s see what Wikipedia has to say about software versioning.</p>
<blockquote>
<p><em><strong>Software upgrade versioning</strong></em> is the process of assigning either unique <em>version names</em> or unique <em>version numbers</em> to unique states of <a target="_blank" href="https://en.wikipedia.org/wiki/Computer_software">computer software</a>.  </p>
<p>_Modern computer software is often tracked using two different software versioning schemes — <a target="_blank" href="https://en.wikipedia.org/wiki/Software_versioning#Internal_version_numbers">internal version number</a> that may be incremented many times in a single day, such as a revision control number, and a <em>release version</em> that typically changes far less often, such as semantic versioning<a target="_blank" href="https://en.wikipedia.org/wiki/Software_versioning#cite_note-semver-1">[1]</a> or a <a target="_blank" href="https://en.wikipedia.org/wiki/Code_name#Project_code_name">project code name</a>._</p>
</blockquote>
<p>Indeed, there are multiple ways of uniquely identifying your software product version.</p>
<p>The most widely known way is by giving it a name.</p>
<p>The vast majority of people on Earth, even those indirectly connected to technology, have probably heard of Android Ice Cream Sandwich and Marshmallow or Mac OS Leopard, its frozen cousin Snow Leopard, and Big Sur.</p>
<p>Programmers have probably heard about Eclipse with its celestial bodies Luna, Mars, and Photon.</p>
<p>All these are major versions of software products.</p>
<p>Though names are great for marketing, they can also be confusing sometimes.<br>In fact, Google has dropped the usage of candies in their Android version names because they:</p>
<blockquote>
<p><em>Heard feedback over the years from users that the names weren’t always intuitively understandable by everyone in the global community</em></p>
</blockquote>
<p>And rightfully so, yet perhaps we just haven’t evolved enough to extrapolate version numbers from animal species, even though Snow Leopard is much cooler than Leopard.</p>
<p>Celestial bodies and candies are a bit easier concepts to grasp, but only if you name them alphabetically (as Android and Eclipse do). But one thing is certain — there is no better way to determine succession than numbers.</p>
<p>Thus, if you name the first version of your software product “Product 1” and the second version “Product 2” it’s pretty intuitive to say that the second version is the more recent, isn’t it?</p>
<p>However, unlike standalone software products that don’t expose APIs, software that is consumed by other software (like the majority of OSS products) needs better versioning than just a sequence of numbers.</p>
<p>For example, if we used a simple numbers sequence for versioning, how would the user distinguish between a bug fix and a change that is breaking the existing API?</p>
<p>The answer is…semantic versioning.</p>
<h3 id="heading-what-is-semantic-versioning">What is Semantic Versioning?</h3>
<p>Semantic version (also known as SemVer) is a widely adopted version scheme that uses a sequence of 3 digits in the following format: <code>MAJOR.MINOR.PATCH</code> .<br>The rules are simple — given a version number <code>MAJOR.MINOR.PATCH</code>, increment the:</p>
<ul>
<li><code>MAJOR</code> version when you make incompatible API changes</li>
<li><code>MINOR</code> version when you add functionality in a backwards compatible manner</li>
<li><code>PATCH</code> version when you make backwards compatible bug fixes.</li>
</ul>
<p>Additional labels for pre-release and build metadata are available as extensions to the <code>MAJOR.MINOR.PATCH</code> format.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/versioning.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>It provides a clear and concise way to communicate the changes in your software product to your users.</p>
<p>But most importantly, it is widely adopted by all kinds of package managers and build tools (like <a target="_blank" href="https://docs.npmjs.com/about-semantic-versioning#using-semantic-versioning-to-specify-update-types-your-package-can-accept">NPM</a> and <a target="_blank" href="https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8903">Maven</a>), which allows users to depend on a specific <strong>range of versions</strong> rather than on a specific version.</p>
<p>For example, specifying the version range <code>^2.2.1</code> rather than an explicit version <code>2.2.1</code>would let the user accept any backwards compatible bug fixes or new features that will be released on top of version <code>2.2.1</code>.</p>
<p>That said, build tools and package managers rely on a contract between a user and a package owner — a contract that is defined by SemVer.</p>
<p>That means the responsibility is <em>yours</em>— you’re the one who defines what a breaking change is and what a minor change is. You can accidentally release a breaking change as a bug fix (patch version) and it <em>will</em> break builds that depend on a range.</p>
<p>Breaking builds is a horrible thing to do so I’d recommend you use <code>semantic-release</code> with a predefined message format together with a commits format enforcement tool.</p>
<p>You can find more info about Semantic Versioning on the official website, <a target="_blank" href="https://semver.org/">semver.org</a>.</p>
<p>Now, that we learned about <em>identifying</em> the breaking changes, let’s talk about <em>introducing</em> them.</p>
<h3 id="heading-how-to-manage-breaking-changes">How to Manage Breaking Changes</h3>
<p>Breaking changes are changes to your public API that remove, rename, or change your contracts with the user in an incompatible way.</p>
<p>Ideally, you would maintain backward compatibility in your code and wouldn’t introduce any breaking changes ever. But then you wake up to a harsh reality.</p>
<p>Software is evolving and so does your code. The needs of the users change and so does your API. You grow as a developer and so does your product.</p>
<p>Therefore, especially as an open-source developer who doesn’t get paid for their job, you just can’t allow yourself to maintain all the legacy code that exists in your project. Sometimes, you need to get rid of it.</p>
<p>The question is how?</p>
<p>As always, it is a tradeoff. You would know better how this change or another impacts the users.</p>
<p>You don’t <em>have</em> to maintain backward compatibly at any cost, nor do you have to implement all the new features in every old version. But it is certainly something that you <em>should</em> take into account.</p>
<p>If the migration cost is relatively low for the user, then it’s fine to make a breaking change and it’s quite reasonable to not support this feature in older versions.</p>
<p>However, if the migration cost is high and the vast majority of users cannot afford this effort, you should probably consider making this change backward compatible at first and releasing a deprecation warning.</p>
<p>A deprecation warning is often released together with a new API, while the old API is still supported. This way the users have time to migrate. Once they do, in the next major version, the deprecation warning and the old API can be safely removed.</p>
<p>In any case whenever you introduce a breaking change make sure you have a migration guide that has step-by-step instructions for the migration.</p>
<p>In addition, as an act of courtesy, it would be very nice of you to <em>give users the time</em> to prepare for a breaking change, especially if it doesn’t have a grace period (where both old and new APIs are supported). </p>
<p>A little heads-up that explains the breaking change, the reasoning behind it, and the expected time frame is very helpful. It can be a tweet, a blog post, or even a new minor version of your product with a deprecation warning.</p>
<p>Remember that while a breaking change is essentially a negative experience, a <em>sudden</em> breaking change is an <em>extremely</em> negative experience.</p>
<h3 id="heading-automatic-migration">Automatic Migration</h3>
<p>We can divide breaking changes into two categories — non-deterministic and deterministic.</p>
<p>Non-deterministic are the ones in which you can’t predict the outcome of the migration effort, for example when you completely remove a certain portion of an API.</p>
<p>In this case, it’s up to the user to decide whether they want to replace it with some other 3rd party library, implement it themself, or depreciate it as well.</p>
<p>Deterministic changes are the ones that, given code <code>X</code> and user input <code>I</code>, allow you to transform it into code <code>Y</code>. For example, changing a function name or an import statement.</p>
<p>If you introduce a deterministic breaking change you can write an automation that will change the user’s codebase and adjust it to the new API. </p>
<p>With this automation in place, you won’t have to care about backward compatibility and detailed migration guides. You provide the user with a way to upgrade their code with zero effort from their side, which is crucial in software updates.</p>
<p>However, there is an inherent tradeoff here as well. Writing code takes time, just as writing a migration guide does. And naturally, writing code that migrates a complex code flow into a new API will take more time than writing code that replaces a function name with a new one.</p>
<p>Sometimes you just can’t afford this kind of effort.</p>
<p>In case you do decide to go for it, there are tools that can help you achieve what you want.</p>
<p>The most widely known and language agnostic one is <a target="_blank" href="https://github.com/facebook/codemod">Codemode</a> by Facebook.</p>
<blockquote>
<p><em>codemod is a tool/library to assist you with large-scale codebase refactors that can be partially automated but still require human oversight and occasional intervention.</em></p>
</blockquote>
<p>There are also more sophisticated tools that use <a target="_blank" href="https://en.wikipedia.org/wiki/Abstract_syntax_tree">AST</a> and can be used for more complicated tasks than just Find &amp; Replace.</p>
<p>For example, another Facebook library (JS/TS specific) called <a target="_blank" href="https://github.com/facebook/jscodeshift">JSCodeShift</a>.<br>Or <a target="_blank" href="https://github.com/ranyitz/code-migrate">code-migrate</a> — a tool (again JS/TS specific) that allows you to write a guided migration relatively easy and provides a user with nice CLI based prompts.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_aFlF8Vx0-thA0EutbBgiUA.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Some big OSS projects even have a solution of their own. One example for such a solution is <a target="_blank" href="https://angular.io/guide/schematics">Angular schematics</a> — a template-based code generator that supports complex logic.</p>
<p>Automatic code migration can be published as a separate package (like <code>my-cool-oss-migrate-v4-v5</code> ) and mentioned as a step in the migration guide. </p>
<p>Alternatively, the migration can be a part of your major version that contains breaking changes and be executed upon installation of this version in the user’s codebase. The choice is yours.</p>
<h3 id="heading-back-porting">Back-porting</h3>
<p>Another common practice is back-porting important changes to previous versions. For example, a critical bug has been found after a major release (with a breaking change) but it also applies to a previous version.</p>
<p>In this case, you can’t expect your users to perform a tedious migration because of a single bug. On the other hand, checking out the older revision, implementing the fix on top of it, and releasing it as a minor bump of an older version might be cumbersome.</p>
<blockquote>
<p><em>The solution: have a protected branch per major version.</em></p>
</blockquote>
<p>Every time you plan to release a major version you create a branch from the main branch named <code>c.x.x</code> where <code>c</code> is the current major version number.<br>You make all such branches protected (just as the main branch) so that you don't accidentally break them. Then, anytime you have to back-port a feature or a bug fix from a newer major version, you either reimplement it on this branch or (if possible) cherry-pick the commits from the main branch.</p>
<p>In addition, a strategy that is worth mentioning is having a separate branch for the <em>next</em> major version as well (as opposed to only having branches for previous major versions).</p>
<p>This is usually relevant for large scale projects (like Webpack or Babel) that have a lot of changes in every new major version.</p>
<p>Having a separate branch for the upcoming major version allows working on it and having it published for testing, while still keeping the most relevant version (and working on it) in the main branch.</p>
<p>Once the new major version is published, its branch becomes a main branch and a new branch is created for the next major version.</p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>I hope you enjoyed this guide, and have a pretty good understanding now of what it means to own an open source project. </p>
<p>In the end I’d like to share with you one thing that you should always keep in mind while owning an open-source project.</p>
<h3 id="heading-listen-to-your-users">Listen to Your Users</h3>
<p>It might sound counter-intuitive, but that is the truth — you’re not the only one who defines the road map, users define it too. In fact, users define most of it.<br>If you own an open-source project then you do it to help others, not yourself.</p>
<p>Have multiple channels for feedback. There are users that only have a quick question to which you can provide an answer within a second. </p>
<p>There are potential contributors that would like to discuss the roadmap but don’t want to do this in public. Give them a way to contact you. Provide a link to Slack or Discord, share your Twitter account, and so on. The more channels the better.</p>
<p>Speaking of channels, you're always welcome to DM me on <a target="_blank" href="https://twitter.com/_Just_JeB_">Twitter</a> in case you have any questions or thoughts.</p>
<p>You can also <a target="_blank" href="https://www.justjeb.com/">read more articles like this on my blog</a>.  </p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Legacy Code Tips – How to Take Over an Existing Project and its Codebase ]]>
                </title>
                <description>
                    <![CDATA[ By Milecia McGregor Working as a developer means you need to know how to dive into existing code bases. When you inherit a project, there are a lot of specifics that you don't know, like why some of the code is written a certain way. So when it's tim... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/taking-over-an-existing-project/</link>
                <guid isPermaLink="false">66d4604e8812486a37369d19</guid>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 17 May 2020 16:01:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/05/exisiting-proj.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Milecia McGregor</p>
<p>Working as a developer means you need to know how to dive into existing code bases. When you inherit a project, there are a lot of specifics that you don't know, like why some of the code is written a certain way.</p>
<p>So when it's time to go into a hand off meeting, you need to know what questions to ask. This is the best time you will have to get the information you need to get up and running.</p>
<p>These questions come up in every project. You could be starting a new job or working on a different project at your current company. Regardless, here are a few things you should bring up in transfer meetings.</p>
<h2 id="heading-know-what-its-supposed-to-do">Know what it's supposed to do</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/what-it-does.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>What exactly is this application used for and who uses it? Without this context, it's going to be really hard figuring out how to implement new features or fix bugs.</p>
<p>Ask about the overall use of the app. Learn about the workflow for different parts of the app and how users move through it. If there's a task list, get a walk-through or more details about each of the items on the list.</p>
<p>This is one of the rare moments everyone is prepared to focus on answering questions about the project. So if there is <em>anything</em> you're unclear on, don't leave that meeting without getting a better understanding of it.</p>
<p>Of course things come up once you start digging in, but this is your chance to preempt a large chunk of confusion. Try and get a high level understanding of the app before you dive into specific questions. Learning about the industry the app operates in can help answer questions that come up in your development as well.</p>
<h2 id="heading-know-how-source-control-is-handled">Know how source control is handled</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/source-control.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>While most projects use Git, not everyone uses GitHub. Some projects could be hosted in BitBucket, Azure DevOps, or even on a SVN. You need to know where code is kept in version control so you can pull it down to your machine and also so you can do troubleshooting when those inevitable production bugs appear.</p>
<p>Make sure that you have access to the code repository and that you have the right level of permissions to do the work you need. When you receive the your login credentials, check them immediately.</p>
<p>The sooner you can find little problems like these, the smoother the project will go in the long run. Fix a small bug and do a quick commit to make sure that you can push up your local branches to wherever the remote repository is.</p>
<p>Also, take a quick look at everyone who has access to the repository. This will be useful info when it's time for pull requests and code reviews. This is also the time to ensure that only the necessary people have access to the code.</p>
<p>Note any users you are unfamiliar with and check with a project manager or someone to see if they still need access.</p>
<h2 id="heading-know-how-to-run-the-project">Know how to run the project</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/run-code.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The hardest part of taking on a new project can be getting it set up and running on your machine the first time. There are a lot of one-time commands that can be lost if the process hasn't been well documented.</p>
<p>A few things you need to check that might not be obvious include your env variables, the versions of the software you're running, and the file names you are referencing. </p>
<p>Other things that might come up are setting up a new local database and loading the seed data and changing any connection strings to APIs or databases.</p>
<pre><code>REACT_APP_NAME=<span class="hljs-string">"Boogaloo"</span>
REACT_APP_API=<span class="hljs-string">"https://not-staging.morwl.com/api"</span>
API_KEY=ij2i0r9j02tt904tn93
</code></pre><p>If you are going through setup and you notice yourself running into issues, make sure you're documenting them so that it's easier for the next developer to do it. Plus you never know when you'll need to factory reset your computer and those notes will come in handy.</p>
<p>Once you have the app running, check that everything is functioning like it does in development or production. You should see the same behavior across all of the environments until people start pushing changes.</p>
<h2 id="heading-know-the-testing-process">Know the testing process</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/testing.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>There are many different forms of testing that your app can go through and you need to know how that process works. Unit tests are common in most projects to some degree so always check for those. Some companies do integration testing to make sure no breaking changes sneak into the build or deploy pipelines.</p>
<p>Other places even have dedicated software testers that will run through user scenarios to see how things will work when real users see the updates. You need to be aware of all the steps your app will go through.</p>
<p>When you start this new project, looking at the tests can give you a good idea of how the app works. If there aren't any tests in the project then this is your chance to start adding them. Having some code coverage sets the tone for the app in the future that there should probably be more tests added as the code developed.</p>
<pre><code class="lang-jsx"><span class="hljs-keyword">import</span> React <span class="hljs-keyword">from</span> <span class="hljs-string">'react'</span>;
<span class="hljs-keyword">import</span> ReactDOM <span class="hljs-keyword">from</span> <span class="hljs-string">'react-dom'</span>;
<span class="hljs-keyword">import</span> { configure, shallow } <span class="hljs-keyword">from</span> <span class="hljs-string">'enzyme'</span>;
<span class="hljs-keyword">import</span> Adapter <span class="hljs-keyword">from</span> <span class="hljs-string">'enzyme-adapter-react-16'</span>;
<span class="hljs-keyword">import</span> Items <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/components/Items'</span>;
<span class="hljs-keyword">import</span> CreateItemModal <span class="hljs-keyword">from</span> <span class="hljs-string">'../src/components/CreateItemModal'</span>;

configure({ <span class="hljs-attr">adapter</span>: <span class="hljs-keyword">new</span> Adapter() });
jest.mock(<span class="hljs-string">'../__mocks__/getAllItemsMockRequest.js'</span>);

describe(<span class="hljs-string">'Items component works'</span>, <span class="hljs-function">() =&gt;</span> {
    it(<span class="hljs-string">'Items renders without crashing'</span>, <span class="hljs-function">() =&gt;</span> {
        <span class="hljs-keyword">const</span> div = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'div'</span>);
        ReactDOM.render(<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Items</span> /&gt;</span></span>, div);
        ReactDOM.unmountComponentAtNode(div);
    });

    it(<span class="hljs-string">'should toggle CreateItemModal'</span>, <span class="hljs-function">() =&gt;</span> {
        <span class="hljs-keyword">const</span> div = <span class="hljs-built_in">document</span>.createElement(<span class="hljs-string">'div'</span>);
        <span class="hljs-keyword">const</span> ItemComponent = shallow(<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">Items</span> /&gt;</span></span>, div);
        ItemComponent.find(<span class="hljs-string">'#add-item-icon'</span>).simulate(<span class="hljs-string">'click'</span>);
        expect(ItemComponent.contains(<span class="xml"><span class="hljs-tag">&lt;<span class="hljs-name">CreateItemModal</span> /&gt;</span></span>)).toBe(<span class="hljs-literal">true</span>);
        ReactDOM.unmountComponentAtNode(div);
    });
});
</code></pre>
<p>Working with software testers is usually a more involved process. There's typically some kind of system in place like Jira or Basecamp where bugs and features can be discussed and tracked through sprints. Follow the process they have in place and it'll help get your code to the deploy phase faster and more consistently.</p>
<h2 id="heading-know-the-deploy-process">Know the deploy process</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/deploy-process.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Although cloud services have just about taken over the hosting needs for most companies, you might still need to work with a physical server. Having this information will help you understand the deploy strategy you will be working with.</p>
<p>Is there a continuous build/deploy process in place or will you need to do manual deploys from your machine? Know how migrations should be handled across the different environments. Get all of the common parts of deploying an app clarified for this particular app.</p>
<p>Little wonky things happen with the cloud services that only the people who handled the deploys before know about so make sure you ask if there is any weird behavior you should look out for. Since you've already fixed a small bug to check that you can push up your changes, go ahead and deploy that small fix to the development environment.</p>
<pre><code class="lang-yml"><span class="hljs-attr">version:</span> <span class="hljs-number">2</span>
<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">build:</span>
    <span class="hljs-attr">docker:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">image:</span> <span class="hljs-string">circleci/&lt;language&gt;:&lt;version</span> <span class="hljs-string">TAG&gt;</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">checkout</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">&lt;command&gt;</span>
  <span class="hljs-attr">test:</span>
    <span class="hljs-attr">docker:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">image:</span> <span class="hljs-string">circleci/&lt;language&gt;:&lt;version</span> <span class="hljs-string">TAG&gt;</span>
    <span class="hljs-attr">steps:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">checkout</span>
      <span class="hljs-bullet">-</span> <span class="hljs-attr">run:</span> <span class="hljs-string">&lt;command&gt;</span>
<span class="hljs-attr">workflows:</span>
  <span class="hljs-attr">version:</span> <span class="hljs-number">2</span>
  <span class="hljs-attr">build_and_test:</span>
    <span class="hljs-attr">jobs:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">build</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">test</span>
</code></pre>
<p>This is your test to see if you really understand how the deploys will work. Hopefully you won't have to do many manual deploys and you'll work with CI/CD pipelines so the process will stay consistent.</p>
<h2 id="heading-know-who-you-can-turn-to-for-different-parts-of-the-project">Know who you can turn to for different parts of the project</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/team.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Unless you are responsible for the entire application from the front-end all the way to the database, there are probably other people who cover parts of the code or system you'll never touch. It's important to know who those people are so you know who to turn with questions.</p>
<p>Plus this is a great way to get to know other teams that work on the project and learn what they do. If it's just you working on every part of a project, make sure that you get every login credential that you can because it'll be up to you to answer all the questions.</p>
<h2 id="heading-know-which-third-party-services-the-project-uses">Know which third-party services the project uses</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/third-party.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>When you start debugging issues, knowing where to turn for documentation is the fastest way to fix things. That means knowing what services the application uses and where they're used. One way to find this is to check the <em>package.json</em> or <em>App.config</em> file of your project to see what's installed.</p>
<pre><code class="lang-json">{
    <span class="hljs-attr">"name"</span>: <span class="hljs-string">"dog-finder"</span>,
    <span class="hljs-attr">"version"</span>: <span class="hljs-string">"0.1.0"</span>,
    <span class="hljs-attr">"scripts"</span>: {
        <span class="hljs-attr">"build"</span>: <span class="hljs-string">"npm install"</span>,
        <span class="hljs-attr">"start"</span>: <span class="hljs-string">"npm run build &amp;&amp; concurrently --kill-others \"node ./server.js\" \"http-server\""</span>
    },
    <span class="hljs-attr">"dependencies"</span>: {
        <span class="hljs-attr">"concurrently"</span>: <span class="hljs-string">"^5.1.0"</span>,
        <span class="hljs-attr">"cors"</span>: <span class="hljs-string">"^2.8.5"</span>,
        <span class="hljs-attr">"express"</span>: <span class="hljs-string">"^4.17.1"</span>,
        <span class="hljs-attr">"johnny-five"</span>: <span class="hljs-string">"^1.4.0"</span>,
        <span class="hljs-attr">"path"</span>: <span class="hljs-string">"^0.12.7"</span>
    }
}
</code></pre>
<p>This will help you sort out a lot of issues that come up in production and it'll help you ask better questions. You'll also need credentials for most services so that will likely come up when you try to run the project the first time. </p>
<p>A few big advantages to looking at the third-party services early are to learn about any version compatibility changes and any known issues.</p>
<p>A common complaint you'll run into on older projects is that the app doesn't work the way it used to and no one knows why. Looking at these services is a quick and easy place to start looking while you get ready to take over.</p>
<h2 id="heading-know-the-best-way-to-get-in-touch-with-the-decision-makers">Know the best way to get in touch with the decision makers</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/decision-maker.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Even though you are taking over the primary development of a project, there will still be someone like a project manager that will guide the tasks you work on. Get their contact information as soon as you get approval to start on the project. This is one of the people that will be able to get your high level questions answered.</p>
<p>If you're working with a smaller company it would also be good to have the contact info of someone like the CEO or CTO because they will be able to give you a direct yes or no on many of the questions you have. </p>
<p>For example, if you've researched a new database service that will decrease their bill by 10% and increase the overall performance of the app, you want to know if you can make those changes or not.</p>
<p>Learn who the people are that can give you approval or guidance for the next steps you take and then save their emails and phone numbers.</p>
<p>One instance this is especially crucial is if there's a fire in production. When you can get those quick decisions immediately, that can save a company thousands of dollars so they will understand if you call them.</p>
<h2 id="heading-know-what-your-timeline-is">Know what your timeline is</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/timeline.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Sometimes it's so easy to get wrapped up in the minute details that when a timeline is thrown out, agreeing makes sense. </p>
<p>Before you fully commit to any length of work, make sure that you've done a proper evaluation of what you are being asked to do with the resources you're provided. Do a quick code sweep to get an idea of what you'll be working with and see how long it takes for people to respond to your initial questions.</p>
<p>That way when you are given a deadline you can explain why it is or isn't reasonable for the amount of work being asked. You always want to give realistic estimates on so that your client or project manager doesn't get other people's hopes up. It's better to tell them upfront if something will take longer or not as long as they expect.</p>
<p>When you have reasonable expectations, it makes the whole project flow better for everyone. There aren't as many panicked sessions of coding and you are able to deliver quality code that won't have to be debugged in production.</p>
<h2 id="heading-know-what-the-scope-of-your-work-is">Know what the scope of your work is</h2>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/scope.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>The scope of projects tends to slowly expand as you make progress. You start getting a little feedback here and there about "little tweaks" that should be made. Then it turns into a question of what takes priority over what and it's not the original work you started with.</p>
<p>One way to prevent scope creep is to agree on a set list of tasks or a specific functionality that needs to be implemented. Anything else can be written down and brought up in another part of the project work, but not right now. </p>
<p>Once the work has been agreed on, then there should be a clear finish state that the project will be in at the end.</p>
<h2 id="heading-final-thoughts">Final Thoughts</h2>
<p>Taking over an existing project is a special skill because it's not something you do all the time. Some people work on one product or product line for a bulk of their career, so setting up new projects only happens every now and then.</p>
<p>Although if you ever do consulting or freelance work, you'll need to know how to do this with confidence on a regular basis. Usually there are small configuration changes that you have to figure out and once you set them you never have to worry about them again.</p>
<p>These are just a few things I try to check for when I'm setting up a new project. Some of these tips apply to open source projects as well. Do you have anything you always check for when you're getting set up?</p>
<hr>
<p>I write about other random stuff in tech too, like air guitars and VR. You should follow me on <a target="_blank" href="https://twitter.com/FlippedCoding">Twitter</a> to learn about that cool stuff.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Agile and How You Can Become an Epic Storyteller ]]>
                </title>
                <description>
                    <![CDATA[ Running a team of developers is hard. Trying to coordinate a mountain of work while keeping everyone productive is a challenge itself. But on top of that, you have to keep open communications with a client. How can we use agile to relieve some of tho... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-agile-and-how-youcan-become-an-epic-storyteller/</link>
                <guid isPermaLink="false">66b8e3940cedc1f2a4f706a1</guid>
                
                    <category>
                        <![CDATA[ Software Requirements ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ development process  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Software Engineering ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Colby Fayock ]]>
                </dc:creator>
                <pubDate>Tue, 12 May 2020 14:45:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/05/intro-to-agile-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Running a team of developers is hard. Trying to coordinate a mountain of work while keeping everyone productive is a challenge itself. But on top of that, you have to keep open communications with a client. How can we use agile to relieve some of those pain points?</p>
<ul>
<li><a class="post-section-overview" href="#heading-what-is-agile">What is agile?</a></li>
<li><a class="post-section-overview" href="#heading-what-are-some-concepts-you-should-know">What are some concepts you should know?</a></li>
<li><a class="post-section-overview" href="#heading-stories">Stories</a></li>
<li><a class="post-section-overview" href="#heading-epics">Epics</a></li>
<li><a class="post-section-overview" href="#heading-sprints">Sprints</a></li>
</ul>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/1GPYnoG_nkE" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<h2 id="heading-what-is-agile">What is agile?</h2>
<p>Agile is a software development methodology that stems from the idea of breaking up large amounts of work into smaller pieces. This gives product managers, developers, and any stakeholder a better understanding of the work.</p>
<p>Historically, software development was a slow process where major changes to requirements could put large strains on teams. </p>
<p>When following the agile methodology, the smaller chunks of work help teams become more flexible, and dare I say <em>agile</em>. And in the process it helps them deliver features faster and respond to changes quicker.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/jira-project-board.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Example Jira project board from <a target="_blank" href="https://www.atlassian.com/software/jira">atlassian.com/software/jira</a></em></p>
<p>These ideas have been broken up into different frameworks of approaching this methodology. Two of the common ones are <a target="_blank" href="https://www.scrum.org/resources/what-is-scrum">Scrum</a> and <a target="_blank" href="https://en.wikipedia.org/wiki/Kanban_(development)">Kanban</a>. </p>
<p>For this walkthrough, most of these concepts follow along the Scrum framework, but there are certainly concepts that apply to both and others.</p>
<h2 id="heading-what-are-some-concepts-you-should-know">What are some concepts you should know?</h2>
<p>I'd argue half of being productive as a developer in an agile world is simply understanding the terms. Typically the project manager runs the show, so if you can be on the same page with what they're talking about, it will make the process a lot easier.</p>
<p>There are books, courses, and certifications based around learning the nuances of the agile methodology. I'm not going to go deep into some of the philosophical aspects or some of the deeper parts, but I'm going to cover a good set of key concepts that will help you hit the ground running when you start your new job with an agile team.</p>
<h2 id="heading-stories">Stories</h2>
<p>A story is typically the smallest defined piece of work. This usually comes in the form of a new ticket that you create in the project tool you're using whether it's <a target="_blank" href="https://www.atlassian.com/software/jira">Jira</a> or even <a target="_blank" href="https://help.github.com/en/github/managing-your-work-on-github/about-issues">Github Issues</a>.</p>
<h3 id="heading-expressing-stories">Expressing stories</h3>
<p>When working on a project, you'll probably run into a variety of ways people express stories. But a good guideline is to work through the concept of the word "story" itself and explain the work that needs to be done in that way.</p>
<p>For instance, if you would like to provide the ability for the people who use your website to share a blog post on Twitter, you may want to write the story as: As a reader, I want to share the post I just read to Twitter.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/jira-story-summary.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Creating a new story in Jira</em></p>
<p>Using that pattern of "as a [person], I want to [action]" helps provide context as what state somebody may be in when visiting their site and what they're trying to achieve. This can be particularly helpful if you're developing features for people who are logged in that are different from guests.</p>
<h3 id="heading-details-and-requirements">Details and requirements</h3>
<p>While the title of a story is an important representation of the work, you'll also want to provide additional specifics. </p>
<p>At a minimum, that should be done by adding a thorough description and a set of acceptance criteria that can help give the developer context and requirements. Depending on the team, this can also include tools like tags or categorizations that make it easier for the team to visualize groups of work.</p>
<p>Providing a strong set of requirements helps both the developer working on the story and the person reviewing it have a measurement to determine if it's actually complete. Without it, everyone's just guessing.</p>
<p>A good way to phrase these are: verify [requirement]. Back to my example of sharing a post on Twitter, maybe some of the requirements to that story would be:</p>
<ul>
<li>Verify when clicking the share button a new tweet is created</li>
<li>Verify the tweet includes a link to the current blog post</li>
</ul>
<h3 id="heading-amount-of-work-or-level-of-difficulty">Amount of work or level of difficulty</h3>
<p>Each story is represented by a number of points. Those points are a way to express how much effort a team of developers expects one story to be. That effort can mean a variety of things though whether it's simply how difficult the team expects the work to be or the amount of risk or uncertainty a particular story has.</p>
<p>One way teams represent this is with the <a target="_blank" href="https://en.wikipedia.org/wiki/Fibonacci_number">fibonacci sequence</a>, where the amount of points can be 1, 2, 3, 5, 8, etc. Where a negligible text update might be 1 point, adding a new form to a page could be 3 points.</p>
<p>Typically you'll want to avoid pointing stories too high, as you get above 5 points, there's more than likely a way you can break up the work to make it more manageable. While you could easily create a massive 13 point story to accomplish all aspects of a feature, it usually makes sense to tackle the work in smaller, more focused chunks.</p>
<p>Either way, these points all add up together to give your team a rough estimate of how much work a group of stories would take to complete.</p>
<h2 id="heading-epics">Epics</h2>
<p>While stories have a goal of defining a bite-sized piece of work, epics are a way to group those pieces of work together to represent a feature.</p>
<h3 id="heading-defining-stories-as-a-feature">Defining stories as a feature</h3>
<p>A good way to explain this is with another example. If you're working on an application that requires the integration of authentication, you may want to create a new epic simply called "Authentication". </p>
<p>Inside that epic, you could find stories like:</p>
<ul>
<li>As a guest, I want to sign into the application with my email address</li>
<li>As an authenticated user, I want to change my password</li>
<li>As the security team, I want to prevent spam and abuse of user authentication</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/jira-epic-authentication.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Example of an Authentication epic in Jira</em></p>
<p>With your epic defined, you're giving your team a path to calling a feature complete while also understanding the entire scope of that work. This is important when it comes to planning out the work to be done.</p>
<p>Defining your stories in your epic gives you a sense of how much work something takes, but it doesn't help you figure out how long it would take, which is where sprints come in.</p>
<h2 id="heading-sprints">Sprints</h2>
<p>Sprints are a way of planning out how the work will actually get done. While similar to epics in that they are a way to group chunks of work, sprints typically represent a period of time in which a particular chunk of work will be done.</p>
<h3 id="heading-time-per-sprint">Time per sprint</h3>
<p>A common way of defining a sprint is two weeks of work. During those two weeks, your team will have a particular velocity, or average amount of work you can complete, for an individual sprint. This velocity is represented by a number of points that is a sum of the average velocity of each of the developers working on that sprint.</p>
<h3 id="heading-points-per-sprint">Points per sprint</h3>
<p>Though many fiercely argue you shouldn't use time to represent that velocity, points will roughly translates to an average amount of time of work for each developer. While 1 point for an experienced developer could be 1 hour, that same 1 point could mean 3 hours for a less experienced developer.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/05/jira-project-roadmaps.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Example project roadmap from <a target="_blank" href="https://www.atlassian.com/software/jira">atlassian.com/software/jira</a></em></p>
<p>But once you have this number of points that your team averages in a sprint, you'll know how many story points you can expect to plan to be completed. This planning goes sprint to sprint as you spread out a group of stories or an epic so you can predict when a feature will be complete.</p>
<h2 id="heading-how-agile-fits-with-your-team">How agile fits with your team</h2>
<p>Try to remember that the Agile methodology through Scrum, Kanban, or any other framework is just that – a framework. While it's probably a good idea to follow the process when you first start out, listen to your team and try to mold it to your own experiences.</p>
<p>Each team works a little bit differently and forcing a process onto that team can cause more harm than good, but there will always be a learning curve for any process. Fight the eye rolls until everyone gets the hang of it and have frequent retrospectives to see what works and what doesn't.</p>
<p>At the end of the day, the processes your team follows should mostly be invisible, working for you instead of against you. Find what works best for your team and share your experiences for others to learn!</p>
<h2 id="heading-whats-your-teams-process">What's your teams process?</h2>
<p><a target="_blank" href="https://twitter.com/colbyfayock">Share with me on Twitter!</a></p>
<div id="colbyfayock-author-card">
  <p>
    <a href="https://twitter.com/colbyfayock">
      <img src="https://res.cloudinary.com/fay/image/upload/w_2000,h_400,c_fill,q_auto,f_auto/w_1020,c_fit,co_rgb:007079,g_north_west,x_635,y_70,l_text:Source%20Sans%20Pro_64_line_spacing_-10_bold:Colby%20Fayock/w_1020,c_fit,co_rgb:383f43,g_west,x_635,y_6,l_text:Source%20Sans%20Pro_44_line_spacing_0_normal:Follow%20me%20for%20more%20JavaScript%252c%20UX%252c%20and%20other%20interesting%20things!/w_1020,c_fit,co_rgb:007079,g_south_west,x_635,y_70,l_text:Source%20Sans%20Pro_40_line_spacing_-10_semibold:colbyfayock.com/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_68,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_145,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_222,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_295,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/v1/social-footer-card" alt="Follow me for more Javascript, UX, and other interesting things!" width="2000" height="400" loading="lazy">
    </a>
  </p>
  <ul>
    <li>
      <a href="https://twitter.com/colbyfayock">? Follow Me On Twitter</a>
    </li>
    <li>
      <a href="https://youtube.com/colbyfayock">?️ Subscribe To My Youtube</a>
    </li>
    <li>
      <a href="https://www.colbyfayock.com/newsletter/">✉️ Sign Up For My Newsletter</a>
    </li>
  </ul>
</div>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Remote Teams Guide: How to Manage Your Remote Software Development Team ]]>
                </title>
                <description>
                    <![CDATA[ By Alexandra Cote Guides to help you work remotely seem to have swept through the Internet these days.  Do this, avoid that, stay productive, and all those run-of-the-mill tips we’ve already tried out. So instead of talking about how your remote team... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/remote-teams-manager-guide/</link>
                <guid isPermaLink="false">66d45d5cb3016bf139028d09</guid>
                
                    <category>
                        <![CDATA[ Career ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ remote work ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ teamwork ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 15 Apr 2020 15:48:06 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/04/remote-teams.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Alexandra Cote</p>
<p>Guides to help you work remotely seem to have swept through the Internet these days. </p>
<p><em>Do this</em>, <em>avoid that</em>, <em>stay productive</em>, and all those run-of-the-mill tips we’ve already tried out.</p>
<p>So instead of talking about how your remote team needs to schedule out their day effectively or clean their desk, <strong>here I am focusing on the hands-on tips you can apply to manage your software development team while working remotely.</strong></p>
<p>First, we need to understand the exact meaning of “remote teams”. </p>
<p>This will allow you to clearly see that having even one individual who’s working separately means you should improve the way in which you manage your team and the process they use for remote team collaboration and task execution.</p>
<h2 id="heading-what-are-remote-teams-really">What are remote teams really?</h2>
<p>Today, millions of companies are faced with <a target="_blank" href="https://mktodyssey.wordpress.com/2019/12/09/career-paths/">remote work</a> situations in one form or another. Whether they’re fully-distributed organizations, have a couple of employees working from another part of the world, or just regularly work with external collaborators.</p>
<p>The first thing that comes to your mind when you think of remote teams is something like: different people working from all parts of the world and distinct time zones on a single project and having the same general goals.</p>
<p>In reality, there are many remote teams that have employees in a single country or even in one city. It’s just that everyone works from their own home, without having to go to the office. ? This saves on costs while managing remote teams.</p>
<p><img src="https://lh4.googleusercontent.com/845bx8-McvMV-Pkl8NjnTX2Ihf7QaDh_xpqsfgwuAML1pE25KL9wRMIwZGvtN5koYBSd7VMB1YVNj33oPAOKzd2XVQ3bi_1I-E-0AtY04pkQDg8QmBr9dQHFM3ZqXonITVhIXMbW" alt="managing remote teams" width="600" height="400" loading="lazy">
<em><a target="_blank" href="https://giphy.com/gifs/yosub-money-donald-duck-cash-xTiTnqUxyWbsAXq7Ju">Source</a></em></p>
<p>But many companies (software development included) have offices in multiple countries. When your US team members talk to their colleagues from the UK, they’re essentially collaborating remotely. So remote team communication is a must in these cases even if everyone is in the office. </p>
<p>This being said, whether work is done from an office or not is not necessarily a defining factor for remote teams. The problems you could experience lie solely within the communication and work processes.</p>
<h2 id="heading-best-practices-for-managing-remote-software-development-teams-across-multiple-time-zones">Best practices for managing remote software development teams across multiple time zones</h2>
<p>Since you’re probably used to all the “<em>do this to be productive</em>” rants, I’ll try to tell you what you might not know.</p>
<h3 id="heading-hire-the-right-people-for-your-remote-teams">Hire the right people for your remote teams</h3>
<p>People are the heart of any team.</p>
<p><strong>So if you hire the right professionals [and humans] for your team, you’re halfway to success.</strong></p>
<p>On the hiring and interviewing process, here are some of the best tips from Shannon Hogue, Global Head of Solutions Engineering, @<a target="_blank" href="https://karat.com/">Karat</a>:</p>
<blockquote>
<p>“I always tell hiring managers to start at the review and work back to determine which core competencies should be listed in a job description. Then, to keep things standard across a global network of Interview Engineers, we put those competencies into structured scoring rubrics for each interview.  </p>
<p>Here are 3 quick steps for building a structured rubric that can help keep everyone on the same page, be it for hiring or managing:  </p>
<p>Identify what competencies are both relevant and important to assess.  </p>
<p>For each competency, list observable behavior and results as checkboxes (select all) and/or radio buttons (choose one).  </p>
<p>Write down an “algorithm” to help interviewers summarize a completed rubric into a single conclusion.  </p>
<p>For example, if Technical Communication is a relevant competency you might list it on the rubric with a specific scale.”</p>
</blockquote>
<p>Here’s what Shannon’s example could look like:</p>
<p><img src="https://lh5.googleusercontent.com/nN0XsdRv1_DL-PP2-__qTXI9SmBxHR11s5AcMgYUtL9S27TW_4i0lafGRVvhlg2js3tATGVhZny-kP5PzkuuNctsFcq8T-G9vZHLVpQAlUYcnQZBvESOTFmzHhQNz_raPokKiM4x" alt="remote teams communication" width="600" height="400" loading="lazy"></p>
<p><strong>Beyond any hiring tip, effective remote work also imposes a question on whether your office workers will</strong> <a target="_blank" href="https://www.entrepreneur.com/article/347376"><strong>adapt to the new lifestyle</strong></a><strong>.</strong> </p>
<p>If you’re switching from an office team to a distributed one or even if you want to hire someone who hasn’t worked remotely before, you need to guarantee they’ll fit in the team and work efficiently in your remote team even before day #1.</p>
<p>For software developers the demand is so high that you’ll often bump into this problem:</p>
<p><em>How do I make sure that who I’m hiring is the perfect fit within our team when they haven’t worked remotely at all?</em> ?</p>
<p>Perhaps tech professionals are some of the easiest to assess beforehand. Check out any of their side projects, if they own a business or do freelancing, and even look at their online presence. </p>
<p>A developer who’s only been putting work for their official job and has no GitHub repositories and projects to boast is clearly not going to be someone you’ll trust right away.</p>
<p><strong>Trust and accountability are the 2 main attributes to consider beyond any hard skills.</strong> </p>
<p>These two character traits (which we often ignore because we’re too focused on business results) can predict whether that person will fit within your team culture. And, even more importantly, if they’re willing to stay with your company for many years to come and dedicate themselves to your project.</p>
<p>From then on, managing remote teams is also a matter of how you handle their training.</p>
<h3 id="heading-onboarding-and-training">Onboarding and training</h3>
<p><strong>The trial period all HR experts recommend exists for a good reason.</strong> It allows you to literally SEE how they work, collaborate, and get along with the rest of the team.</p>
<p>Many managers make the mistake of hiring a developer, letting them start the trial weeks, but not monitoring what they’re actually doing. </p>
<p>Don’t assume that someone who seems skilled and experienced will deliver the same commitment and quality of work to you too. May I say this is the best and only time to be a micromanager and literally oversee all of their actions.</p>
<p><strong>But do offer your help within the first days by making sure they have all resources needed and making the appropriate introductions to your team.</strong> </p>
<p>Get them involved in the code writing process for your project as soon as possible so you can get a better feel of how they conduct their work. I’ll also advise you to try a pair programming session during the hiring process too. More on this procedure later in this guide.</p>
<h3 id="heading-prepare-the-right-work-methods">Prepare the right work methods</h3>
<p>This is largely the manager’s decision. Team feedback is only valid when everyone knows the relevant best practices and benefits of each work method. This doesn’t mean you can't get their input on the methods they’d prefer to use. However, letting them take care of the decision process will only give rise to conflicts and postpone the choice for the time being since there simply will be too many opinions for you to sort out.</p>
<blockquote>
<p>“While you do not want to micromanage a remote team, you certainly want to set up clear minimum administrative processes. For a previous remote team I had to manage, this included setting-up very precisely the infamous JIRA workflow.  </p>
<p>While it is good to leave a remote team some freedom, work also needs to be clearly organized, so there should be a few processes that have very precise descriptions. In development, the most important of such processes are issues management, and also the build process. This should be described in detail, and followed strictly.  </p>
<p>To make sure key processes are respected, there should be set points when work needs to stop until the process is followed. As an example, I gave strict orders to my business team not to look at any incident that is not documented.” - Nicolas de Mauroy, CEO @<a target="_blank" href="https://openlowcode.com/">Open Lowcode</a></p>
</blockquote>
<p><strong>But how close should supervision really be?</strong></p>
<p>Surprisingly – not that in depth. </p>
<p>Keep your devs under your radar only enough to guarantee that all processes run smoothly and you’re able to maintain a trust both ways. Yes, <a target="_blank" href="https://on.code42.com/go/2019-data-exposure-report-success/">50% of data breaches</a> across all industries are caused by insiders, but that doesn’t mean you must force everyone to track their time or record their screens.</p>
<p><strong>Developers should really only have to track their time in 2 instances:</strong></p>
<ol>
<li>They/you really want to improve your work processes.</li>
<li>They’re getting paid by the hour.</li>
</ol>
<p>Your role as a manager goes beyond the person who is seemingly in charge of everything. You’re a liaison. That key link between one team member and another, helping your development team collaborate with operations, marketing, design, customer support, and sales while also ensuring all team members are <a target="_blank" href="https://thriveglobal.com/stories/why-youre-not-happy-with-your-career/">happy</a> and their needs are met.</p>
<p>I’m super disappointed to tell you that only <a target="_blank" href="https://www.gallup.com/workplace/236552/managers-engaged-jobs.aspx">35% of managers</a> are engaged with their work. How is this going to motivate someone else? </p>
<p>Employees who are supervised by highly-engaged managers are in turn going to be better and happier performers themselves. This will boost your employee retention rates and create that long-lasting company-worker bond most companies can never attain.</p>
<p>This takes me to the importance of knowing when and how to communicate. Both ways.</p>
<h3 id="heading-craft-your-remote-team-collaboration-plan">Craft your remote team collaboration plan</h3>
<p>Collaboration goes hand-in-hand with your work method and how you manage tasks. It’s the little things like crafting clear task descriptions and expectations that add up to distinguish a positive collaboration experience from a chaotic one.</p>
<p><a target="_blank" href="https://www.linkedin.com/in/tinjothomasc/">Tinjo Thomas</a>, Design Technologist @Coredes Interactive also recommends the following two tweaks you can make:</p>
<blockquote>
<p>“1. Always set a due date for each task even though your developers are experts and can make estimates themselves.  </p>
<ol start="2">
<li>If you are giving instructions to only one or two people, don't send the message to the whole group. Reach out to every individual in private. People spend a lot of time reading unnecessary conversations on channels.”</li>
</ol>
</blockquote>
<h3 id="heading-on-meetings">On meetings</h3>
<p>Meetings are honestly a very controversial topic. Managers love to call meetings. Devs, though, hate most of them but are afraid to voice their thoughts.</p>
<p>To keep meetings relevant, here are some actionable points to keep in mind:</p>
<blockquote>
<p>“On a more macro-level, knowledge sharing can happen through a weekly team meeting with a Q&amp;A via video whereby the members of the team can share what they learned from the codebase with each other as well as ask questions. In terms of knowledge sharing through team meetings - you can have several types of meetings.   </p>
<p>The overall idea for these is to encourage collaboration in an effort to turn explicit knowledge into tacit knowledge. So you can have brainstorming sessions or meetings geared more towards lessons learned (this can be in the form of a demo or presentation). All done entirely remotely.” - Emil Hajric, CEO @<a target="_blank" href="https://helpjuice.com/">Helpjuice</a></p>
</blockquote>
<p>One huge mistake first-time remote team managers make is filling up entire days with meetings:</p>
<blockquote>
<p>“First-time remote team managers need to be quite aware of the differences between collaborative work [like Scrum meetings and software architecture design] and individual focus work [like coding]. It is important to schedule time and ensure everyone can contribute to the collaborative session, but then leave your professionals alone to do what they were hired to do, write great software.” - Pedro Henriques, Co-Founder &amp; CEO @<a target="_blank" href="https://www.bridgein.pt/">BRIDGE IN</a></p>
</blockquote>
<p>You’ll want to always remember to press that record button during meetings. We’re not necessarily fans of paper trails, but you’ll need them to avoid bothering your team with issues that have already been discussed:</p>
<blockquote>
<p>“You should be recording and saving absolutely everything from remote team meetings and strategy sessions. While working remotely, we've noticed a huge uptick in productivity when managers and team members can refer directly to meetings instead of having to play phone tag or email back and forth for simple information. It's a huge boon to workflow across the board and should really become the new normal with the increase in remote team management.” - Alexander M. Kehoe, Co-Founder and Operations Director @<a target="_blank" href="https://caveni.com/">Caveni</a></p>
</blockquote>
<p>Keeping up-to-date with all changes is even more important when your team’s distributed. But remote teams have different approaches to how they make sure they don’t just communicate, but also apply and consider every opinion.</p>
<p>Here’s where the real-time vs asynchronous communication battle comes in. Everything’s already been said about this. So the conclusion is:</p>
<p><strong>There’s a right time for each type of communication.</strong> A predisposition for certain types of tasks will also make your remote team more likely to go for one method of communication over the other.</p>
<p>Just like the video vs written communication issue.</p>
<p>The Voro team, for instance, has used their office and remote communication tests to conclude that written collaboration worked best for them:</p>
<blockquote>
<p>“My #1 tip for managing a remote team is to default to written communication rather than video calls. This forces you to clarify your thinking and communicate succinctly. When we all worked in the same office, it was easy to walk over to someone’s desk to talk through a problem. It would waste a great deal of time to replicate that with a scheduled video call.  </p>
<p>Since we are 100% remote, more of our communication has been written, and we try to memorialize most of that in internal documents, so we continue to move fast and share institutional knowledge seamlessly.” - Tomas Hoyos, CEO @<a target="_blank" href="https://www.voro.com/">Voro</a></p>
</blockquote>
<h3 id="heading-invest-more-time-in-one-on-ones">Invest more time in one-on-ones</h3>
<p>With one-on-ones, you’re focusing more on sharing the status of specific tasks and individual activities, while every single member on your team gets to make their own suggestions. One-on-ones are commonly held between one team leader and the other members at a time. </p>
<p>Having these twice a month is your best bet to make sure everything gets covered. Holding them weekly is too often as you won’t have time to focus on your other tasks because you’re too busy with meetings.</p>
<p>These one-on-one meetings are also a good opportunity for you to hold reviews and updates on the OKRs. To facilitate the feedback and ideation process, Charles Ahmadzadeh, CTO @<a target="_blank" href="https://bunch.ai/">Bunch</a> uses checklists during these meetings:</p>
<blockquote>
<p>“I like to use checklists with my team. I'll ask each team member to create a checklist each day of what needs to be done before ending the day and before submitting their work. We review these checklists in 1:1s to spot patterns.  </p>
<p>I mostly use this to help others around me grow or keep myself accountable to the feedback I receive from the team.  </p>
<p>The good thing about them is that they work no matter how senior you are (even astronauts live by checklists). They’re easy to share in 1:1, even if your team is remote, and very simple to use, as long as you’re committed to improving yourself.”</p>
</blockquote>
<p><strong>NOTE ON OBJECTIVES AND KEY RESULTS:</strong> Team leaders can establish these at a team and individual level by also taking into account suggestions from developers. </p>
<p>For instance, each department or team can have specific targets: to release a feature on time, avoid more than 2 major bugs after a release, keep the error rate low, etc. Individually, each member should take care of one release so that every single team member will know how to handle them. </p>
<p><strong>Here’s an actionable idea:</strong> Use <a target="_blank" href="https://trackjs.com/">TrackJS</a> [or other error tracking tool for your programming language]. Every member can choose a top error and fix it. This allows members to increase their accountability and learn new things to avoid freezing their skills.</p>
<h3 id="heading-pair-programming-finally-getting-the-attention-it-deserves">Pair programming finally getting the attention it deserves</h3>
<p><strong>Now is also the best time to experiment with pair programming.</strong> This practice allows two developers to work simultaneously, often on the same tasks. While this is usually done from the same computer, you can switch it up a bit and make use of tools like TeamViewer or screen sharing.</p>
<p>Pair programming also helps distributed teams improve the quality of their code, tighten bonds between colleagues, transfer information and know-how from one dev to another, increase their own accountability, and speed up the entire development process. </p>
<p>Does this make you feel like you’ve been missing out on all its benefits? ? Just keep in mind some best practices if you want to get started with using the pair programming practice on a regular basis. </p>
<p>By using common sense, you probably won’t have both developers working on the same thing for 8 hours straight. Instead, distribute tasks evenly and allot a specific time slot for them to actually work together. Dealing with multiple time zones? Pair programmers within similar work schedules.</p>
<h3 id="heading-communicate-beyond-work-with-your-remote-teams">Communicate beyond work with your remote teams</h3>
<p>We’re all humans. <strong>So we can’t work, work, work all the time.</strong> How about you implement some activities for people to destress twice a week as part of your remote team management process?</p>
<p>Playing board games online. Having a #watercooler channel on Slack. Finding some creative online team building activities. These are all ideas to help your remote teams unwind and get their mind off anything that’s stressing them out.</p>
<p>Pedro Henriques also shared his thoughts on the importance of implementing this type of downtime while working remotely:</p>
<blockquote>
<p>“Remote teams need to deliberately schedule slack time and create informal virtual watercooler moments. In the office, the watercooler or coffee machine is often the place for spontaneous discussions about various topics ranging from a nasty software bug to vent about office politics or even troubles in personal life. These discussions are not superfluous. They’re absolutely critical for team cohesion. Therefore managers should actively promote them, but make sure not to attend.”</p>
</blockquote>
<h3 id="heading-choose-the-right-tools-the-basics-will-do-there-are-no-magical-solutions">Choose the right tools: The basics will do, there are no magical solutions</h3>
<p>I’ve seen so many “best tools for remote work” lists the Internet could really crash for good.</p>
<p>Nah, but really, stop looking for the best apps and miraculous software to somehow save your remote teams.</p>
<p>We already know everyone is using Slack and Zoom to collaborate and the ones who don’t use these are probably doing so because of small issues they had or costs they wanted to lower. </p>
<p>For instance, from all apps I’ve tested for this purpose Google Meet was the fastest and most accurate one but guess what? My clients are using Zoom already. No room to impose another tool.</p>
<p>The key point is not to waste weeks trying to find the right tools for your team. Others have already done this. There are thousands of options out there. All of them are copying features from each other so you end up with the same tool in dozens of versions. </p>
<p><strong>So here’s your stack:</strong></p>
<p>Jira - Slack - Zoom - GitHub - InVision - a bug tracking tool - every developer’s code editor</p>
<p>Test these [preferably the free versions first] and only look for alternatives if you have huge issues that are stilting your workflow. My two cents.</p>
<p><strong>Also, some wise words from Tinjo Thomas:</strong></p>
<blockquote>
<p>“Don't try to save money on bug tracking or team management tools. You will know why it’s important when things don’t get done as you expected.”</p>
</blockquote>
<p><strong>Know a remote team manager who could use these tips?</strong> Share this remote team management article with your network to keep improving remote work processes.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Free Flowchart Creator and Workflow Diagram Apps – A Guide for Managers ]]>
                </title>
                <description>
                    <![CDATA[ By Alexandra Cote If you want to get more technical with your product management skills, being able to work with flowchart or diagram creator apps is surely on your list. The following guide aims to save you hours of time you’d otherwise spend resear... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/flow-chart-creator-and-workflow-diagram-apps/</link>
                <guid isPermaLink="false">66d45d58b3016bf139028cf3</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ product ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Product Management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 01 Apr 2020 15:58:55 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/04/diagrams-featured-image-PM.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Alexandra Cote</p>
<p>If you want to get more technical with your product management skills, being able to work with flowchart or diagram creator apps is surely on your list.</p>
<p>The following guide aims to save you hours of time you’d otherwise spend researching the best diagramming solution for your project while at the same time perfecting the design of your flowcharts.</p>
<p><strong>As a general rule, a flowchart or diagram is used to communicate requirements, processes, and workflows in a logical way so complex concepts will be a little less complicated.</strong> </p>
<p>In product management, workflows are commonly used to describe:</p>
<ul>
<li>User flows</li>
<li>Processes and other systems involved in them</li>
<li>Dependencies between systems and inputs, outputs, or other conditions</li>
</ul>
<p><strong>I’ve tested and reviewed several tools for creating flowcharts and workflows over the past few years. Here, I've picked 5 that you must try out to describe your product’s funnels and flows.</strong> </p>
<p>But first…</p>
<h2 id="heading-why-are-diagrams-so-powerful-in-product-management">Why are diagrams so powerful in product management?</h2>
<p>While the whole idea of using flowcharts and diagrams might be overlooked or seem like it’s an unnecessary step, there are several benefits to using diagrams in PM:</p>
<ul>
<li>It simplifies all processes</li>
<li>It helps you spot issues or weak points at a glance</li>
<li>It allows you to find any duplicate parts of a process</li>
<li>It establishes clear funnels</li>
<li>It supports your Quality Assurance team during the creation of test scenarios</li>
<li>It acts as a roadmap for software architecture</li>
</ul>
<h2 id="heading-so-how-do-you-choose-the-best-diagramming-software">So how do you choose the best diagramming software?</h2>
<p>Creating any kind of diagram is a fairly easy process. Building a successful one, though, takes a bit more research and time. </p>
<p>That’s why you need to choose a tool that will help you save hours of work while also giving you the predefined requirements you’ll need to build accurate diagrams and keep the process fun.</p>
<p><strong>The key aspects to pay attention to when choosing a flowchart creator software solution are:</strong></p>
<ul>
<li>Availability of ready-made templates</li>
<li>Lots of choices for shapes and arrows to work with</li>
<li>Extra tools or integrations</li>
<li>Exporting options</li>
<li>Strong collaboration features</li>
<li>Ease of use from the beginning</li>
</ul>
<p>To make it easier for you to select your next tool for building diagrams, I’ve highlighted all of these aspects for every individual solution across the following reviews.</p>
<p><strong>Next up are my favorite free flowchart creator and workflow diagram app picks you need to take into consideration.</strong></p>
<h2 id="heading-5-free-flowchart-creator-and-workflow-diagram-tools">5 free flowchart creator and workflow diagram tools</h2>
<h3 id="heading-lucidcharthttpswwwlucidchartcom"><a target="_blank" href="https://www.lucidchart.com/">Lucidchart</a></h3>
<p><img src="https://lh5.googleusercontent.com/4XqjKdeU8wSgqkxWzMt_GdiM5xXEUVAALO3Y_JualcvZREZDBJoSnIRgG-44e5goH2WR60Q4Ovqg2gZ49ijiLxEYTe3EGpepzZO--eLhGDLEwoyadUy9ec1I1qEV-mnbKBE69Uvd" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Lucidchart should be your top-of-mind solution for creating customer experience maps and systems diagrams in particular. From the very beginning, the tool makes it easy for product managers to select the type of flowcharts they want to create. Matter of fact, the onboarding process and resources available online make it a tool with a fast learning curve. </p>
<p>From the very beginning, you’ll get all possible templates needed for you to create product strategies, create roadmaps and product flows, and even pitch your ideas to stakeholders. With ready-made templates and literally thousands of shapes and arrows to choose from, there are endless opportunities for product managers to create their materials in no time.</p>
<p>Also, if you’re like me and like to add a few too many colors, this diagram app comes with a bunch of theme options to help you nail the design of your creations. Bonus points for customization here from non-designers.</p>
<p>The reason I’ve placed Lucidchart first on this list is that it’s a complete flowchart creator tool. Collaboration options are some of the strongest with comments that can be left on charts just like you would in Google Docs, slides that can be used to present your diagrams, and even sharing and exporting options. </p>
<p>If you’d like to take it all one step further, you can choose from dozens of integrations with tools you might already be using like Slack, GitHub, or Salesforce.</p>
<p>You can also check out my video tutorial on using the tool so you won’t have to find your way around Lucidchart yourself.</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/C_x6DBHg9Zw" style="aspect-ratio: 16 / 9; width: 100%; height: auto;" title="YouTube video player" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" loading="lazy"></iframe></div>
<p><strong>Pros</strong></p>
<ul>
<li>Free plan available</li>
<li>Easy to learn</li>
<li>Lots of templates and elements to choose from</li>
<li>Strong collaboration features</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Limited space for free accounts</li>
<li>No desktop app</li>
</ul>
<h3 id="heading-drawiohttpsappdiagramsnet"><a target="_blank" href="https://app.diagrams.net/">Draw.io</a></h3>
<p><img src="https://lh5.googleusercontent.com/lRcWtq0jGjseQVtaEKBIudsn6QVSGHjL3LjkKDUK8EJdkgyGI6LiMROiR2PmFgEy3rJFiutOymZSAwiGsz_8vVHwXwjSod6FvBphQRmTQ3IMyP14UPXCfaaVHT5pmLMK-f1pqH_Y" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Draw.io is a top choice for many PMs since the tool’s free, so you might have already been using it for several other business processes. Since the tool belongs to Google the interface is similar to other Google Apps like Docs and Slides that you’re probably working with anyway.</p>
<p>Compared to Lucidchart, Draw.io might be harder to use for non-designers since there are no theme colors to choose from if you want to make your diagrams eye-appealing. </p>
<p>Whenever you want to create a new diagram, you’ll get to choose from a series of templates ordered by their structure. There are no specifics for product management. </p>
<p>The flowchart tool does save itself through lots of elements you can use on your workspace. I advise you to use the search bar to find a specific item or element faster.</p>
<p>Since the tool is so simple that even a child could use it, Draw.io is missing the advanced functionalities and collaboration features that would otherwise allow you to communicate with your team directly on the document. To do this, you’ll need to integrate it with a tool like Confluence or Quip.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free to use</li>
<li>Clear interface which makes it easy to get accustomed to</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Limited templates</li>
<li>No collaboration options</li>
<li>No mobile apps</li>
<li>Few integrations</li>
</ul>
<h3 id="heading-createlyhttpscreatelycom"><a target="_blank" href="https://creately.com/">Creately</a></h3>
<p><img src="https://lh3.googleusercontent.com/wIzjzzCLCpQzTSxdJ9SSlOyG2XPzM325E9jzR5M4lzKSlUwNe4us0A07eArJzUTkg3oHBE9_jc8JpziAsEKt2pBr-2T6zA4HfVnE7KjiFusp2ItgUhbTQDBjKTYrzV797Iuzwidw" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Creately is only a free workflow diagram app if you can accept the fact that all of your design will be public and you’re limited to 5 documents. Team plans start at $12 which is a fairly decent price considering you’re getting all the features with it.</p>
<p>I specifically found their onboarding process handy since it introduces you to the tool so you won’t start and have no idea what to do next. </p>
<p>In many ways, the tool is similar to Lucidchart. You’ve got lots of templates to choose from, all of which are ordered by their purpose. Then you’ve got your elements which are some of the most beautiful I’ve seen, along with other styles and theme options to help product managers who aren’t that skilled at design too.</p>
<p>One thing people struggle with while using Lucidchart is file organization, a feature that Creately nails by turning their tool into an alternate file storage app. The tool also eases the process of working with several elements by integrating Google search so you can find images to use without leaving the app.</p>
<p>In terms of collaboration, Creately works similarly to a prototyping tool, allowing people to leave comments on the exact element they have feedback to offer on. Collaboration is done in real-time via the online or desktop version of the app.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Lots of templates to pick from</li>
<li>Theme options</li>
<li>Communication options</li>
<li>File organization option</li>
<li>Works offline too</li>
<li>Easy to learn</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>The free option only allows you to create public content</li>
<li>Some features are still under development but will be released soon</li>
</ul>
<h3 id="heading-whimsicalhttpswhimsicalcom"><a target="_blank" href="https://whimsical.com/">Whimsical</a></h3>
<p><img src="https://lh5.googleusercontent.com/yPdeookgGEJ2cvCl3SwoOfk02gkF7GglBfTeFMrDVz_3XrLfSk78R8eLMitEOTg-GMl1s0u3y3LFcGskYG-wkVLf9gN5hKjSVGCgYWhNnJ3FCEVW4OAoXd2xF6dy493d5rMjdhOd" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Whimsical is a user-friendly visual communication tool that’s commonly used to create wireframes but has separate options for putting together flowcharts, mind maps, and sticky notes.</p>
<p>While the tool is highly visual, there aren’t that many template options to choose from. This is because the app is centered around creating basic wireframes and flowcharts for internal use only. Shapes and connectors are also limited, but there are hundreds of icons to go for if you want to add some extra color to a mind map or flowchart.</p>
<p>On to the benefits of using the tool: collaborating on each project takes fewer than two steps, with comments being placed on every single element you want to leave immediate feedback on. All work is easy to share, export, and even embed.</p>
<p>Ever been annoyed by losing your past versions for a product development flowchart you were supposed to show to your stakeholders? Whimsical is one of the few tools that has a fully-featured file versioning option that records every single change you’re making on a chart so you can restore better versions.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Strong design options</li>
<li>Easy to learn</li>
<li>Sharing and exporting options</li>
<li>Lots of icons to add to your creation</li>
<li>File versioning</li>
<li>Free version available</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Limited template options</li>
</ul>
<h3 id="heading-canvahttpswwwcanvacom"><a target="_blank" href="https://www.canva.com/">Canva</a></h3>
<p><img src="https://lh4.googleusercontent.com/iemgbjhSztdlv4CgHXHto5ZyEwD4hal7mA6HyGo1yfqw6Zg2vM2NiDQ0ItWWzv0y5BMYV2EaQvAf0Igq5CJRkcJhag8K3SLdl28HbgX8ZPexfq1Ricj0bNukq2YHNhErdz0oS-39" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Canva is not really a common option since it’s usually used by marketing and social media teams who need highly-visual content to display publicly. If you’re also looking to create a flowchart to present on your social networks, in your pitch deck, or to any other stakeholders, it’s definitely worth giving it a try.</p>
<p>Not only is it easy to use, but the fact that it’s a general app instead of being tailored only to building diagrams also means it has thousands of elements and icons you can choose from. Illustrations, arrows of all kinds, customizable charts, you name it. Even videos.</p>
<p>As for the sharing options, they’re top-notch. You can export your content into any file type you want, resize your workspace to share it on multiple platforms, and use the presentation mode, complete with notes for presenters. </p>
<p>Once you invite your team into the tool, you’ll be able to leave comments on your designs to keep everyone on the same page.</p>
<p><strong>Pros</strong></p>
<ul>
<li>Free option</li>
<li>Extremely easy to use</li>
<li>Versatile</li>
<li>Focused on great design</li>
<li>Lots and lots of options for elements</li>
<li>Collaboration options</li>
</ul>
<p><strong>Cons</strong></p>
<ul>
<li>Limited template options for product management</li>
</ul>
<h2 id="heading-havent-decided-yet">Haven’t decided yet?</h2>
<p>Start by creating a list of your own requirements. Are you in need of strong templates so you don’t have to build everything from scratch? Or maybe you can give up on lots of elements as long as collaboration options are on point. </p>
<p>Based on your own needs and goals, go over the above list to pick an option that works best for you and give it a try. Each option has its own unique features that distinguish it from the others:  </p>
<ul>
<li>Lucidchart - lots of template options for PM</li>
<li>Draw.io - super easy to use</li>
<li>Creately - most features in one tool</li>
<li>Whimsical - clear interface for internal use</li>
<li>Canva - focused on design</li>
</ul>
<p>If you have any other tips on helping product managers choose their next flowchart creator workflow diagram app, let me know.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Apply Agile Framework to Data Science Projects ]]>
                </title>
                <description>
                    <![CDATA[ By Black Raven In this article, we'll discuss how agile principles and values can be applied to the way you approach data science projects. Project management methodologies are commonly used to get projects done or get a product (often referred to as... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/applying-agile-methodology-to-data-science-projects/</link>
                <guid isPermaLink="false">66d45dd5706b9fb1c166b91e</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ clients ]]>
                    </category>
                
                    <category>
                        <![CDATA[ customer ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Data Science ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sat, 28 Mar 2020 07:22:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/03/1_AZ_AWktR7nuirzHudbFimA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Black Raven</p>
<p>In this article, we'll discuss how agile principles and values can be applied to the way you approach data science projects.</p>
<p>Project management methodologies are commonly used to get projects done or get a product (often referred to as a tool) produced. They are, in general, processes and frameworks which break down the overall objective to individual tasks organised on a timeline. This can be adapted and used to approach data science projects.</p>
<p>In the past, the traditional <a target="_blank" href="https://en.wikipedia.org/wiki/Waterfall_model"><strong>Waterfall methodology</strong></a> (dated way back to 1970) has been very popular. It defines all requirements and parameters of the product at the start, so that the project team can work towards this target in sequential phases. </p>
<p>This method has been successful in the manufacturing industry where product specifications seldom vary with time. It requires very extensive upfront planning, and ideally, the output product is exactly the same as specified in the beginning.</p>
<p>But the Waterfall methodology started to become unsuitable for software projects. Because of this, many <a target="_blank" href="https://thedigitalprojectmanager.com/project-management-methodologies-made-simple/">popular project management methodologies</a> have emerged over the years, especially in the software development industry. Let me share the most popular one.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/1_5QuiHM9Tp1RnKfVFiIk2fg.png" alt="Image" width="600" height="400" loading="lazy">
<em>Waterfall vs Agile. Figure by Author.</em></p>
<h2 id="heading-agile-framework">Agile Framework</h2>
<p><a target="_blank" href="https://en.wikipedia.org/wiki/Agile_software_development">Agile</a> is a way of working developed in 2001, and is a widely used to manage software development projects. It is suitable for fast-paced development cycles and has provision for changing specifications throughout the design and build process. It is flexible, and strives for iterative incremental improvement in the product through team collaboration. In short, Agile is to plan, build, test, learn, repeat.</p>
<p>Agile teams are responsive to the unpredictable requirements as the project unfolds, through iterative work processes. Below are <a target="_blank" href="https://agilemanifesto.org/principles.html"><strong>Agile principles</strong></a> which serve as a framework (guideline) to the way of working:</p>
<ul>
<li>Customer satisfaction through early and continuous software delivery</li>
<li>Accommodate changing requirements throughout the development process</li>
<li>Frequent delivery of working software, as the working software is the primary measure of progress</li>
<li>Collaboration and interaction between the business stakeholders (client) and developers (vendor) throughout the project, including face-to-face communication within the development team</li>
<li>Support, trust, and motivate the people involved</li>
<li>Agile frameworks to support a consistent development pace</li>
<li>Attention to technical detail and design enhances agility</li>
<li>Simplicity in looking for solutions</li>
<li>Regular reflections in the self-organising team on how to become more effective</li>
</ul>
<p>Agile projects are characterized by a series of tasks that are conceived, executed and adapted as the situation demands. However, Agile focus is not on what to do, but <strong>how to think</strong>. Agile values and places <a target="_blank" href="https://agilemanifesto.org/"><strong>priority</strong></a> on:</p>
<ul>
<li>Individuals and interactions (rather than processes and tools)</li>
<li>Working software (rather than comprehensive documentation)</li>
<li>Customer collaboration (rather than contract negotiation)</li>
<li>Response to change (rather than following a predefined rigid plan)</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/1_aaIzYNWVd7LDnmzV6VBP5g.png" alt="Image" width="600" height="400" loading="lazy">
<em>Agile way of working. Figure by Author.</em></p>
<h2 id="heading-agile-practices-and-data-science">Agile practices and Data Science</h2>
<p>While Agile principles and priorities are employed for greater productivity, most of them can be leveraged for data science (DS) projects. </p>
<p>Moreover, data scientists do not know how to schedule the project because it is impossible to determine a specific timeline for the type of “research” and exploratory work. Most DS projects require trial and error by going down different paths and trying different techniques. They do not have an element of certainty in the output, so Agile can be used to direct the workflow.</p>
<p>Most other projects deal with what customers want, what the developers want, and what the business seeks. When working with DS, another perspective is added: <strong>what the data is telling you</strong>. </p>
<p>Data scientists cannot make any sense out of the data unless they develop a basic understanding of it. There is a lot of investigation, exploration, testing and tuning. Agile uses the concept of iteration and constant feedback in order to refine a system under development, in order to move up the <strong>Data-Value Pyramid</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/1_A1HnvWOiFiubgYJH1Wo3Gw.png" alt="Image" width="600" height="400" loading="lazy">
<em>Data-Value Pyramid. Figure by Author.</em></p>
<p>When working on DS projects, insights are not immediately achievable. Multiple iterations are needed before any insights can be discovered. </p>
<h3 id="heading-how-agile-practices-can-be-applied">How agile practices can be applied</h3>
<p>I will explain the main Agile working practices (<a target="_blank" href="https://en.wikipedia.org/wiki/Scrum_(software_development)"><strong>Scrum framework</strong></a>), and how they can be applied to DS:</p>
<p><strong>Define the business need and the project objective</strong>. This is usually driven by the product owner who is responsible for the product features and quality. It is the big picture stuff, but this is the core belief that you will refer back to as you build. </p>
<p>In DS, the product owner could be the client, the business, or the end customer (for example, end user of a prediction tool). Understand what problems the product owner is facing and tailor the project proposal to meet their needs.</p>
<p><strong>Build the backlog</strong>. Focusing on the user requirements (“user stories” in Agile), a list of tasks is derived that you need to accomplish to build product features or improve product performance. </p>
<p>The DS team builds the backlog together with the product owner to determine the product features and performance targets. The backlog could start from getting the data in the structured way before they can be analysed. Then it could be a list for feature selection or feature engineering, or a list of models to select, tune and optimise.</p>
<p><strong>Prioritise the backlog</strong>, identify the backlog tasks which will bring the most value with the least effort. </p>
<p>In DS, not every approach is worth trying, so cover the most promising ones first. When the main ones are conveyed, you might find that the remaining others are not as important as initially thought.</p>
<p><strong>Do a sprint</strong> (the actual development work). Sprints are usually two-weeks cycles where high priority tasks on the backlog are worked on. </p>
<p>In DS, each sprint could be two to four weeks depending on the team size. During the sprint, always complete the task with the highest priority before moving on to the next in line.</p>
<p><strong>Have daily standups</strong>. Standup meetings are for team members to be accountable to one another on their progress in the current sprint. Each team member take turns reporting their status — what was done the day before, what to do today, any potential obstacles. The most effective communication happens when DS team members meet face-to-face to share their work.</p>
<p><strong>Review the sprint output</strong> (sprint retrospective meeting). At the end of two weeks, there should be a functional output for the project team to demonstrate, with an incremental improvement in the product. </p>
<p>Data scientists should share the outputs before trying to perfect the processes. Get feedback from client stakeholders and prepare for the next sprint. Regular feedback is a key principle for the Agile way of iterative incremental improvement.</p>
<p><strong>Prepare for the next sprint</strong>. Identify the tasks that are going well and keep doing them, and identify those that are impediments to be removed. </p>
<p>It is important to understand that, unlike software development, DS is more experiment-based than task-based. DS helps explore data so it should be treated as multiple research experiments. Once again, build and prioritise the backlog so that the next sprint can be carried out, to work on the next improvement areas.</p>
<p><strong>Roll out the final product</strong>. When all stakeholders agree that no more improvement is needed in the product, it is ready for the final deployment. </p>
<p>DS projects follow the “law of diminishing improvement”. For example, if a model has achieved 70% accuracy, the next 5–10% improvement will take a lot more effort than before, and it also depends on the limitations in the data set. Decide in the team whether the efforts are worth the incremental improvement.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/Screenshot_1-2.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Photo by [Unsplash](https://unsplash.com/@youxventures" rel="noopener"&gt;You X Ventures on &lt;a href="https://unsplash.com/photos/Oalh2MojUuk" rel="noopener)</em></p>
<h2 id="heading-challenges-with-the-client">Challenges with the client</h2>
<p>Besides having adequate communication between the DS team and the client, the client’s expectations have to be managed. </p>
<p>All clients generally love the idea that Agile is flexible, and that it grants them more opportunities to change their mind as the project develops. However, they might not realise that such flexibility is also costly in both time and money. Here are some things you should do:</p>
<h3 id="heading-the-cost-of-flexibility">The cost of flexibility</h3>
<p>Get the client to understand that <strong>flexibility is inevitably expensive</strong>. It is like how a flexible full-fare economy ticket which allows itinerary changes will cost much more than the fixed one. Making changes also means that the client is paying for past wasted time and effort.</p>
<h3 id="heading-set-expectations">Set expectations</h3>
<p>Set the client’s expectation to commit time for frequent <strong>sprint retrospective meetings</strong> (e.g. every two weeks) to evaluate the completed sprints. </p>
<p>On top of that, the client representative in each meeting needs to be (<strong>empowered</strong> by higher management) able to make decisions on product specifications. For Agile to work, the client needs to provide continuous feedback and priority setting to keep the project moving.</p>
<h3 id="heading-trust-is-important">Trust is important</h3>
<p>Earn the client’s <strong>trust</strong> and show them that each iteration is done with the best possible efforts to deliver value and improve the product. </p>
<p>While holding the decision making power, the client also expects an iteration to have tremendous improvement. </p>
<p>Such imbalance in responsibility in the client-vendor relationship should be converted to mutual trust and willingness to experiment together. Agile’s principle in <strong>collaboration</strong> means it is a team effort in both making decisions and delivering value.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/Screenshot_2.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Photo by [Unsplash](https://unsplash.com/@youxventures" rel="noopener"&gt;You X Ventures on &lt;a href="https://unsplash.com/photos/6awfTPLGaCE" rel="noopener)</em></p>
<h2 id="heading-minimum-viable-product">Minimum Viable Product</h2>
<p>One key feature of the Agile way of working is the development of a minimum viable product (<strong>MVP</strong>). This is the <strong>most fundamental configuration of the product</strong> (or tool). </p>
<p>After the project objectives have been defined, the team makes a proposal regarding the approach to the problem. This includes building the MVP within the shortest possible time (like one month for DS projects). The MVP has only the most important functionalities, but its performance may not be the most optimal.</p>
<p>This might seem very risky – putting a less-than-finished version up for the client to test. So the team (including the client) has to be prepared for it. The purpose is to make the MVP work, test it, and see if it is really going in the correct direction of solving the problem and helping the business case. </p>
<p>The MVP will grow better, because the DS team is going to use what they have learnt from the MVP feedback to build an improved version. Agile is about continuously deploying and learning from your mistakes, and working with the client to make the product better.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/03/0_Su_JCisEQJnWBB52.png" alt="Image" width="600" height="400" loading="lazy">
_Iterative nature of Agile. Figure taken from <a class="bw cu jf jg jh ji" target="_blank" href="https://towardsdatascience.com/data-science-agile-cycles-my-method-for-managing-data-science-projects-in-the-hi-tech-industry-b289e8a72818">TowardsDataScience</a>._</p>
<blockquote>
<p>Agile is to plan, build, test, learn, repeat.</p>
</blockquote>
<h2 id="heading-ds-project-deliverable">DS project deliverable</h2>
<p>The Agile way of working allows data scientists the ability to prioritize and create roadmaps based on requirements and goals. With each iteration, data scientists can learn something new, get more refined results, and ride on them for the next incremental improvement. </p>
<p>Below are some Agile project deliverables to shape and guide project process:</p>
<ul>
<li><strong>Project vision statement</strong>: A summary that articulates the goals for the project.</li>
<li><strong>Project roadmap</strong>: The high-level view of the requirements needed to achieve the project vision.</li>
<li><strong>Project backlog</strong>: Ordered by priority, this is the full list of what is needed to support your project.</li>
<li><strong>Release plan</strong>: A timetable for the release of a working product (or tool), but not documentation. Projects should be self-documenting along the way.</li>
<li><strong>Sprint backlog</strong>: The user stories (requirements), goals, and tasks linked to the current sprint.</li>
<li><strong>Increment</strong>: The working product functionality that is presented to the stakeholders at the end of the sprint and could potentially be given to the client. The goal is not to deliver more but to get a <em>higher value</em> output.</li>
</ul>
<h2 id="heading-summary">Summary</h2>
<p>Agile is going to be adopted by more DS project teams in the near future. Many data scientists have reported that it makes them more productive. </p>
<p>This is not because the data scientists have become more skilled, but because Agile can help them optimize their projects. Instead of spending time on models that are unlikely to reveal any productive results, it is better to spend that time for other result-driven purposes.</p>
<p>Being “agile” (flexible) means you need to adopt a dynamic approach in planning and be adaptable to the changing needs of the new situation when it arises. </p>
<p><strong>The Agile environment appeals to quick action, fail quickly, discuss and evaluate, then try again using a different approach or an improved method.</strong> It works great in dynamic environments where there is a potential for changing or evolving requirements.</p>
<p>All the best to your DS projects!</p>
<p>Reference:<br><a target="_blank" href="https://towardsdatascience.com/data-science-agile-cycles-my-method-for-managing-data-science-projects-in-the-hi-tech-industry-b289e8a72818">Data-science? Agile? Cycles? My method for managing data-science projects in the Hi-tech industry.</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Give The Gift of a Tech Debt Sprint This Agile Holiday Season ]]>
                </title>
                <description>
                    <![CDATA[ Holidays can be a challenging time in software development. How can you make the most of your velocity and energize the team at the same time? The holiday challenge For a lot of teams, the holidays are a time of year when a large amount of peope take... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/give-the-gift-of-a-tech-debt-sprint-this-agile-holiday-season/</link>
                <guid isPermaLink="false">66b8e328682e4a25eed2619b</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Colby Fayock ]]>
                </dc:creator>
                <pubDate>Wed, 18 Dec 2019 15:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/12/tech-debt.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Holidays can be a challenging time in software development. How can you make the most of your velocity and energize the team at the same time?</p>
<h2 id="heading-the-holiday-challenge"><strong>The holiday challenge</strong></h2>
<p>For a lot of teams, the holidays are a time of year when a large amount of peope take off after saving their PTO for the whole year. This time is precious, especially for those who work with e-commerce after getting through a rough peak season spending long nights making sure all the promotions went as scheduled.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/12/holiday-band.gif" alt="Image" width="600" height="400" loading="lazy">
<em>SNL Holiday Band</em></p>
<p>What this means in practice, is you have a sprint with limited capacity or you have people coming in and out (depending on their schedule), carrying a lot of overhead with context switching and minimal communication throughout the week.</p>
<p>So what can be a better option?</p>
<h2 id="heading-spread-the-holiday-cheer-with-a-tech-debt-sprint"><strong>Spread the holiday cheer with a tech debt sprint</strong></h2>
<p>The reality is, your holiday sprint isn’t going to be the most productive sprint of the year. More often than not, you’re met with chaotic schedules that are hard to truly plan around.</p>
<p>For example, you have Joe visiting his family, maybe he can snag a few hours between get-togethers. Then you have Nancy who’s working the full week, but only at night, as her days are packed with holiday activities. Finally you have Todd who used his PTO early in the year, so can’t take any time off, but is working his standard 9-to-5.</p>
<p>It’s hard to imagine having a regular daily standup cadence, let alone figuring out if and when a ticket will be get completed. So instead, schedule a sprint dedicated to tackling the technical debt that’s accrued throughout the year.</p>
<h2 id="heading-wait-what-is-technical-debt-in-the-first-place"><strong>Wait, what is technical debt in the first place?</strong></h2>
<p>For a lot of devs, there’s a daily balance trying to determine whether the bug or concern that popped up warrants blowing up the scope of a ticket or if it’s better to dig in and fix it as they’re working through it. These things can take a toll on a team, leaving spirits low, knowing they’ll never actually get the opportunity to loop back and course correct.</p>
<p>Just because this concern isn’t going to bring the app down, that doesn’t mean it’s not valid and doesn’t need to be taken care of, so instead of fixing it, the next course of action is to throw it in the backlog for a rainy day.</p>
<p>The problem is, this rainy day doesn’t seem to ever come. That backlog of not-really-high-priority tickets adds up becoming a mountain that will throw you into technical bankruptcy!</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/12/holiday-ghosts-1.gif" alt="Image" width="600" height="400" loading="lazy">
<em>Ghosts of Christmas past</em></p>
<h2 id="heading-take-advantage-of-the-chaotic-schedule"><strong>Take advantage of the chaotic schedule</strong></h2>
<p>With everyone’s schedules in flux, it’s a good chance to find a backlog of narrowly scoped tickets that your team can work through on a case by case basis.</p>
<p>Have a few code paths that lack some tests? Perfect ticket. Have a few fragile functions that already have tests but need to be refactored to avoid future grief? Put it on the list.</p>
<p>This type of work–while small in the overall picture–can make a difference in how your team perceives their own work, which directly impacts their attitude towards the project.</p>
<h2 id="heading-remember-whats-best-for-your-team"><strong>Remember what’s best for your team</strong></h2>
<p>Overall, the point is to do what’s best for your team. Low spirits can impact a team’s velocity, so being able to provide these little wins can end up helping in ways you wouldn’t have thought of.</p>
<p>Whatever your strategy may be, it’s important to enjoy a stress-free holiday season whether you’re taking PTO or not.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2019/12/carlton-dancing-holiday-1.gif" alt="Image" width="600" height="400" loading="lazy">
<em>Carlton dancing during the holidays</em></p>
<div id="colbyfayock-author-card">
  <p>
    <a href="https://twitter.com/colbyfayock">
      <img src="https://res.cloudinary.com/fay/image/upload/w_2000,h_400,c_fill,q_auto,f_auto/w_1020,c_fit,co_rgb:007079,g_north_west,x_635,y_70,l_text:Source%20Sans%20Pro_64_line_spacing_-10_bold:Colby%20Fayock/w_1020,c_fit,co_rgb:383f43,g_west,x_635,y_6,l_text:Source%20Sans%20Pro_44_line_spacing_0_normal:Follow%20me%20for%20more%20JavaScript%252c%20UX%252c%20and%20other%20interesting%20things!/w_1020,c_fit,co_rgb:007079,g_south_west,x_635,y_70,l_text:Source%20Sans%20Pro_40_line_spacing_-10_semibold:colbyfayock.com/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_68,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_145,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_222,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_295,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/v1/social-footer-card" alt="Follow me for more Javascript, UX, and other interesting things!" width="2000" height="400" loading="lazy">
    </a>
  </p>
  <ul>
    <li>
      <a href="https://twitter.com/colbyfayock">? Follow Me On Twitter</a>
    </li>
    <li>
      <a href="https://youtube.com/colbyfayock">?️ Subscribe To My Youtube</a>
    </li>
    <li>
      <a href="https://www.colbyfayock.com/newsletter/">✉️ Sign Up For My Newsletter</a>
    </li>
  </ul>
</div>

<p><em>Read more of my articles on <a target="_blank" href="https://www.element84.com/blog/give-the-gift-of-a-tech-debt-sprint-this-agile-holiday-season">element84.com</a>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Project budgeting: an anti-pattern ]]>
                </title>
                <description>
                    <![CDATA[ By Bertil Muth The desired benefits of agile development are many. Customers are happier and more willing to buy. Lead time from idea to delivery is shorter. Employees are more motivated and more productive.  Sounds good, doesn't it? In practice, cer... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/project-budgeting-an-anti-pattern/</link>
                <guid isPermaLink="false">66d45de8bc9760a197a1035f</guid>
                
                    <category>
                        <![CDATA[ agile ]]>
                    </category>
                
                    <category>
                        <![CDATA[ agile development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ budget ]]>
                    </category>
                
                    <category>
                        <![CDATA[ project management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scrum ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Sun, 08 Sep 2019 07:58:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/09/1-qF4e5LHYdx78lBJUP7TJsw.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Bertil Muth</p>
<p>The desired benefits of agile development are many. Customers are happier and more willing to buy. Lead time from idea to delivery is shorter. Employees are more motivated and more productive. </p>
<p>Sounds good, doesn't it? In practice, certain behaviors stand in the way of the benefits. As a scrum master and agile coach, I see the same anti-patterns in many companies over and over again. Today's anti-pattern is about project budgeting and contracts.</p>
<h2 id="heading-fixing-the-scope-not-a-good-idea">Fixing the scope - not a good idea</h2>
<p>In many companies, the scope of delivery must be decided on first. Then someone estimates the effort and calculates the necessary budget. Finally, there is a go or no-go decision for the project.</p>
<p>It is similar for many customer supplier relationships. First, a contract must be set up that describes exactly what will be delivered. Otherwise there is no order.</p>
<p>How else could it be? How else can you, as a customer, be sure what will come out in the end?</p>
<p>As an agilist, here's my answer. Customers can't possibly know the exact end result in advance. Software development is full of surprises. The requirements of today are history tomorrow.</p>
<p>It's important to recognize the tension between predictability and changeability. You can't have both: perfect predictability of the end result at the beginning <em>and</em> maximum consideration of change requests later.</p>
<h2 id="heading-what-you-can-do-instead">What you can do instead</h2>
<p>At the beginning of agile development, it is sufficient for stakeholders to agree on a product vision, and maybe a rough roadmap. Funding can be done incrementally, sprint by sprint.</p>
<p>But what if this is not possible in your company? What if the stakeholders don't want to give up the illusion of safety that comes from clarifying requirements early?</p>
<p>Well, it's a waste of time to specify details of requirements that will change later. So what to do?</p>
<p>You can agree on user stories in advance. That makes sense. But don't define the acceptance criteria! Clarification of details is postponed to development, shortly before implementation.</p>
<p>The advantage: you can react to lessons learned from development and new customer needs.</p>
<h2 id="heading-change-management-done-right">Change management done right</h2>
<p>Either at the beginning of a project or during contract negotiation, stakeholders should agree on the mode of cooperation and the handling of changes later.</p>
<p>It is important to follow a few important principles.</p>
<p>If there are changes, a change management process that evaluates each change individually is NOT enough. Instead, a change should be related to other changes.</p>
<p>For each change that is implemented, either</p>
<ul>
<li>take another requirement out of scope, or</li>
<li>increase the duration of the project.</li>
</ul>
<p>During development, individual elements can therefore be replaced by elements that are equivalent in terms of development effort. Scrum supports this with the Product Backlog–by pulling a backlog item up, the other elements automatically have less urgency.</p>
<p>If you want to know more about agile contract design, I recommend you have a look at <a target="_blank" href="https://www.scruminc.com/agile-contracts-money-for-nothing-and/">Money for Nothing and Your Change for Free</a>.</p>
<p><em>To <a target="_blank" href="https://skl.sh/2Cq497P">get the basics of agile software development right</a>, visit my online course. If you want to keep up with what I'm doing or drop me a note, follow me on <a target="_blank" href="https://dev.to/bertilmuth">dev.to</a>, <a target="_blank" href="https://www.linkedin.com/in/bertilmuth/">LinkedIn</a> or <a target="_blank" href="https://twitter.com/BertilMuth">Twitter</a>. Or visit my <a target="_blank" href="https://github.com/bertilmuth/requirementsascode">GitHub project</a>.</em></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
