<?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[ workflow - 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[ workflow - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 27 May 2026 16:21:41 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/workflow/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 Automate CI/CD with GitHub Actions and Streamline Your Workflow ]]>
                </title>
                <description>
                    <![CDATA[ CI/CD stands for Continuous Integration and Continuous Delivery. It is a system or set of processes and methodologies that help developers quickly update codebases and deploy applications. The Continuous Integration (CI) part of CI/CD means that deve... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/automate-cicd-with-github-actions-streamline-workflow/</link>
                <guid isPermaLink="false">67fd2db6c741f3f1aec5ecd2</guid>
                
                    <category>
                        <![CDATA[ github-actions ]]>
                    </category>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chidiadi Anyanwu ]]>
                </dc:creator>
                <pubDate>Mon, 14 Apr 2025 15:45:58 +0000</pubDate>
                <media:content url="https://cdn.hashnode.com/res/hashnode/image/upload/v1744638276204/5cf04403-6bf0-4bf1-b9d3-89722bd90425.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>CI/CD stands for Continuous Integration and Continuous Delivery. It is a system or set of processes and methodologies that help developers quickly update codebases and deploy applications.</p>
<p>The Continuous Integration (CI) part of CI/CD means that developers can always integrate or merge their changes into the shared repository without breaking anything. Continuous Delivery, on the other hand, means that the code changes are automatically prepared for release after testing and validation.</p>
<p>CI/CD primarily involves various stages like building, testing, staging and deployment.</p>
<ul>
<li><p><strong>Build phase:</strong> This is where the code and its dependencies are compiled into a single executable. This is the first phase of Continuous Integration, and is triggered by an event like pushing code to the repository.</p>
</li>
<li><p><strong>Test phase:</strong> Here, the built artifacts are tested to be sure that the code runs as expected.</p>
</li>
<li><p><strong>Staging:</strong> Here, the application is run in a production-like environment so as to be sure it is production ready.</p>
</li>
<li><p><strong>Deployment:</strong> Here, the application is automatically deployed to the end-users.</p>
</li>
</ul>
<p>In this article, I’m going to explain how GitHub Actions works. I’ll also talk about basic GitHub Actions concepts, and then we’ll use it to build an example CI/CD pipeline.</p>
<h2 id="heading-what-is-github-actions">What is GitHub Actions?</h2>
<p>GitHub Actions is a service or feature of the GitHub platform that lets developers create their own CI/CD workflows directly on GitHub. It runs jobs on containers hosted by GitHub. The tasks are executed as defined in a YAML file called a workflow. This workflow file has to live on the <em>.github/workflows</em> folder on the repository for it to work.</p>
<h2 id="heading-basic-github-actions-concepts">Basic GitHub Actions Concepts</h2>
<p>GitHub Actions consists of events, jobs, tasks, runners, workflows, and various other features. Here is a brief explanation of the main concepts:</p>
<p><strong>Events:</strong> An event is basically something that happened. With GitHub, an event can be a push (when you push your code to the repository), a pull request, or even a cron job. These events trigger the CI/CD process.</p>
<p><strong>Tasks:</strong> When you use CI/CD, you want to be able to trigger an activity that should be done automatically. That activity is known as a task or step in GitHub. It could be building your code or testing it or deploying it.</p>
<p>Each of those tasks has to be defined by commands. A GitHub Actions task usually consists of the name, and the instructions on what to do in the form of a command which starts with  <code>- run:</code> or an Action which starts with <code>- uses:</code>.</p>
<pre><code class="lang-yaml"><span class="hljs-attr">steps:</span>
  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">code</span>
    <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v3</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Set</span> <span class="hljs-string">up</span> <span class="hljs-string">Node.js</span>
    <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/setup-node@v3</span>
    <span class="hljs-attr">with:</span>
      <span class="hljs-attr">node-version:</span> <span class="hljs-number">16</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Install</span> <span class="hljs-string">dependencies</span>
    <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">install</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Run</span> <span class="hljs-string">tests</span>
    <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">test</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Build</span> <span class="hljs-string">project</span>
    <span class="hljs-attr">run:</span> <span class="hljs-string">npm</span> <span class="hljs-string">run</span> <span class="hljs-string">build</span>

  <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span>
    <span class="hljs-attr">run:</span> <span class="hljs-string">echo</span> <span class="hljs-string">"Deploy step goes here"</span>
</code></pre>
<p><strong>Runner:</strong> A GitHub runner is a server that runs your tasks. It executes what is defined in your GitHub workflow. You can use your own runners or you can use the GitHub runners.</p>
<p><strong>Job:</strong> A job is a collection of steps that are being executed on the same runner. Jobs are defined in a file called the workflow.</p>
<p><strong>Workflow:</strong> The GitHub workflow is a series of jobs defined in a YAML file, that are triggered upon an event. The events do not trigger individual tasks. They can only trigger workflows. Then the tasks in the jobs of the workflow are executed.</p>
<p><strong>Contexts:</strong> These provide a way to access information about workflows, jobs, and environments in GitHub. They are accessed with the expression <code>$${{ &lt;context&gt; }}</code>. Examples include <code>github</code>, <code>env</code>, <code>vars</code>, and <code>secrets</code>. The <code>github</code> context is used to access information about the workflow. For example:</p>
<pre><code class="lang-yaml"><span class="hljs-string">$${{github.repository}}</span> <span class="hljs-comment"># should tell the name of the repository</span>

<span class="hljs-string">$${{github.actor}}</span>  <span class="hljs-comment"># should tell the username of user that initially triggered the workflow</span>
</code></pre>
<p><strong>Secrets:</strong> This is used to store and access sensitive information that’s used by, and is available to, the workflow. Secrets are redacted when printed to the log. An example is $${{secrets.GITHUB_TOKEN}}.</p>
<h2 id="heading-how-to-build-a-simple-cicd-pipeline">How to Build a Simple CI/CD Pipeline</h2>
<p>Here, we’re going to build an example workflow to deploy a simple HTML and CSS website to GitHub Pages. Follow the steps below:</p>
<ol>
<li><p>Go to the sample code in my repository and fork it from <a target="_blank" href="https://github.com/chidiadi01/StaticPage-Starter">here</a>.</p>
</li>
<li><p>Go to the settings tab in the GitHub repository:</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744220928970/d2f62ae0-49be-4770-b931-59e5bc28e20e.png" alt="Settings tab" class="image--center mx-auto" width="908" height="39" loading="lazy"></p>
<ol start="3">
<li><p>Go to the Pages settings:</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744220974335/4aeac1df-be0d-493d-98d3-fb9ea4d48ca0.png" alt="Pages settings menu" class="image--center mx-auto" width="347" height="480" loading="lazy"></p>
</li>
<li><p>Set the deployment source to the <code>main</code> branch:</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744290941501/365d8b5d-1265-42be-9de4-d3a07b984736.png" alt="Setting deployment source to main branch in GitHub pages" class="image--center mx-auto" width="858" height="369" loading="lazy"></p>
</li>
<li><p>Go to the General Actions settings and scroll down to the bottom:</p>
</li>
<li><p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744221468786/d94fe477-65a3-49dc-85ea-6ab8cb2f9c63.png" alt="Find General Actions setting" class="image--center mx-auto" width="355" height="568" loading="lazy"></p>
<p> At the bottom, set the Workflow permissions to read and write:</p>
</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744221589612/4f5b1cf2-8343-4da8-ad61-21ba76319ffc.png" alt="Set workflow permissions to read and write" class="image--center mx-auto" width="898" height="394" loading="lazy"></p>
<ol start="7">
<li><p>In the GitHub repository, you can clone it to your PC or press the fullstop (.) on your keyboard to open GitHub Codespaces, the online version of VS Code.</p>
</li>
<li><p>Go to the sidebar and click on create a new file:</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744292745424/a3ca0a1e-13cf-4182-8425-9c3500e01e3d.png" alt="Creating new file" class="image--center mx-auto" width="924" height="394" loading="lazy"></p>
</li>
<li><p>Create a workflows folder and file. You can call it <code>deploy.yaml</code>.</p>
<p> <img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744292931628/300665a5-d517-46b1-9b30-21dd4bc228a6.png" alt="Creating a workflows folder and file named deploy.yaml" class="image--center mx-auto" width="335" height="215" loading="lazy"></p>
</li>
<li><p>Copy this code into the file:</p>
</li>
</ol>
<pre><code class="lang-yaml"><span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span> <span class="hljs-string">Static</span> <span class="hljs-string">HTML</span> <span class="hljs-string">and</span> <span class="hljs-string">CSS</span> <span class="hljs-string">to</span> <span class="hljs-string">GitHub</span> <span class="hljs-string">Pages</span>

<span class="hljs-comment"># Trigger the workflow on push to the main branch</span>

<span class="hljs-attr">on:</span>
  <span class="hljs-attr">push:</span>
    <span class="hljs-attr">branches:</span>
      <span class="hljs-bullet">-</span> <span class="hljs-string">main</span>
<span class="hljs-comment"># Define what operating system the job should run on</span>
<span class="hljs-attr">jobs:</span>
  <span class="hljs-attr">deploy:</span>
    <span class="hljs-attr">runs-on:</span> <span class="hljs-string">ubuntu-latest</span>
    <span class="hljs-attr">permissions:</span>
      <span class="hljs-attr">contents:</span> <span class="hljs-string">write</span>

    <span class="hljs-attr">steps:</span>
    <span class="hljs-comment"># Step 1: Checkout the repository</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Checkout</span> <span class="hljs-string">Code</span>
      <span class="hljs-attr">uses:</span> <span class="hljs-string">actions/checkout@v4</span>

    <span class="hljs-comment"># Step 2: Check the files that have been checked out</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Display</span> <span class="hljs-string">files</span>
      <span class="hljs-attr">run:</span> <span class="hljs-string">ls</span>

    <span class="hljs-comment"># Step 3: Deploy to GitHub Pages</span>
    <span class="hljs-bullet">-</span> <span class="hljs-attr">name:</span> <span class="hljs-string">Deploy</span>
      <span class="hljs-attr">uses:</span> <span class="hljs-string">peaceiris/actions-gh-pages@v4</span>
      <span class="hljs-attr">with:</span>
        <span class="hljs-attr">github_token:</span> <span class="hljs-string">${{</span> <span class="hljs-string">secrets.GITHUB_TOKEN</span> <span class="hljs-string">}}</span>
        <span class="hljs-attr">publish_dir:</span> <span class="hljs-string">./</span> <span class="hljs-comment"># The HTML and CSS files lie in the root directory, hence that should be the publish directory</span>
</code></pre>
<ol start="11">
<li>Commit the code. You should see the job running when you go back to the repo:</li>
</ol>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744292376966/93d6078c-02c3-41f4-a4b5-09639522bbbe.png" alt="Running job" class="image--center mx-auto" width="904" height="53" loading="lazy"></p>
<p>When you’re done, go back to the home page of the repository and click on the Deployments section. There, you will see the GitHub Pages link to the deployment:</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1744293345646/e523a2b9-73a6-4ecf-9df8-99e03b457ad1.png" alt="GitHub Pages link" class="image--center mx-auto" width="516" height="338" loading="lazy"></p>
<p>When you’re done, your repository should look like <a target="_blank" href="https://github.com/chidiadi01/StaticPage-Final">this</a>.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>In this article, you learned about how the CI/CD process works. We also covered the basic concepts of GitHub Actions. Finally, we created an example CI/CD pipeline with GitHub Actions. If you enjoyed this article, share it with others. You can also reach me on <a target="_blank" href="https://linkedin.com/in/chidiadi-anyanwu">LinkedIn</a> or <a target="_blank" href="https://x.com/chidiadi01">X</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Use SonarLint to Write Cleaner Code ]]>
                </title>
                <description>
                    <![CDATA[ When you're building a coding project, the better it is, the more fun it'll be to use. And the prouder you'll be of your hard work, right? Also, writing quality and performant code helps your program or website work as expected – which should be ever... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/use-sonarlint-to-write-cleaner-code/</link>
                <guid isPermaLink="false">66d4609233b83c4378a51822</guid>
                
                    <category>
                        <![CDATA[ clean code ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Visual Studio Code ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Okosa Leonard ]]>
                </dc:creator>
                <pubDate>Thu, 18 Jan 2024 23:58:39 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/01/slint.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>When you're building a coding project, the better it is, the more fun it'll be to use. And the prouder you'll be of your hard work, right?</p>
<p>Also, writing quality and performant code helps your program or website work as expected – which should be every developer's goal.</p>
<p><a target="_blank" href="https://docs.sonarsource.com/sonarcloud/improving/sonarlint/">SonarLint</a> is a tool that helps you make sure your code is top-notch. It's like having a friendly guide who checks your code to see if it's well-written and doesn't have mistakes.</p>
<h2 id="heading-what-is-sonarlint">What is SonarLint?</h2>
<p>SonarLint is an open-source code analysis tool that helps you find and resolve security and code quality problems in your source code as you're writing it. This plugin works with several integrated development environments (IDEs), including well-known ones like IntelliJ IDEA, Eclipse, and Visual Studio.</p>
<p>SonarLint's main purpose is to give you immediate feedback on possible problems with your code, including security flaws, bugs, and other recommended practices for programming. SonarLint analyzes code in the background while you create or change it in your IDE, giving you instant feedback and frequently exposing problems right in the code editor.</p>
<p>SonarLint is a component of the larger SonarQube ecosystem.</p>
<p>In this article, I'll teach you how to use SonarLint to help you write quality code.</p>
<h2 id="heading-why-is-sonarlint-useful">Why is SonarLint Useful?</h2>
<p>Let's imagine that building a website is like constructing a house. You want your house to be safe and well-designed, right? Well, SonarLint is like having a thorough inspector who checks your work as you build, making sure everything is just right.</p>
<p>Here's why SonarLint is important in web development:</p>
<ol>
<li><p><strong>Catch Mistakes Early (Code Quality):</strong> Assuming you were building a staircase, and accidentally put a step in the wrong place, SonarLint is like a smart friend who tells you immediately, "Hey, you might have made a mistake here!" It helps catch small errors in your code before they become big problems.</p>
</li>
<li><p><strong>Follow the Blueprint (Coding Standards):</strong> When building a house, you follow a blueprint to make sure everything fits together. In coding, there are also rules (like a blueprint) on how to write good code. SonarLint helps you stick to these rules, making your code easy to read and work with.</p>
</li>
<li><p><strong>Keep It Secure (Security):</strong> Just like you'd want your house to have good locks on the doors, you'd want your website to be secure. SonarLint checks your code for potential security issues, ensuring there are no "unlocked doors" that could let bad things happen.</p>
</li>
<li><p><strong>Work Together Well (Collaboration):</strong> Imagine that each builder in your team used a different kind of tool. It would be chaos! SonarLint helps your team work together smoothly by making sure everyone follows the same coding standards. This way, everyone can understand and contribute to the project easily.</p>
</li>
<li><p><strong>Save Time and Effort (Efficiency):</strong> Fixing mistakes after the whole house is built would take a lot of time and effort. SonarLint helps you fix issues as you go, saving you from returning and redoing things. It's like having a helpful friend who stops you from making mistakes in the first place.</p>
</li>
<li><p><strong>Learn and Improve (Education):</strong> SonarLint does not only point out mistakes but also explains why they might be a problem. It's like having a coding teacher who helps you understand how to write better code. This way, you learn and become a better developer over time.</p>
</li>
</ol>
<p>So, in the world of web development, SonarLint is your coding buddy, and it makes sure your JavaScript "house" is strong, secure, and well-organized from the ground up. It's a valuable tool in your workflow and helps you create high-quality websites that everyone can enjoy.</p>
<p>But you still may be wondering why you need this tool. You have a debugger already installed in your IDE and it can already track the errors in your environment.</p>
<p>Well, integrating SonarLint complements your debugger by focusing on code quality and security during development.</p>
<p>While a debugger helps to find and fix runtime issues, SonarLint analyzes code in real time, identifies bugs and potential vulnerabilities, and enforces coding standards.</p>
<p>You can also customize and configure coding rules based on your project's specific requirements and coding standards.</p>
<p>This proactive approach enhances overall code quality and ensures cleaner, more maintainable code before it reaches the debugging stage. This leads to fewer errors and smoother development workflows.</p>
<p>Before we get into the details of how to set up and use SonarLint, let's look at what makes code high-quality.</p>
<h2 id="heading-code-quality-metrics">Code Quality Metrics</h2>
<p>Be the best cookbook author! When writing code there are specific guidelines you must follow.</p>
<p>Just like when you're cooking up a new recipe or want to follow a traditional one, you should make sure anyone who reads it can follow along, and that the recipe you wrote down results in a good dish.</p>
<p>In the same sense, when writing code, it's always important to make your code readable so that other developers can understand it easily and so your code works as it's supposed to. Code quality metrics are like measuring how well you followed the recipe.</p>
<p>Here's a breakdown:</p>
<p><strong>Readability (Clarity):</strong> This is similar to making sure your recipe instructions are clear. The code should be easy for others (or future you) to understand.</p>
<p><strong>Maintainability (Ease of Changes):</strong> If you had to change ingredients in your recipe (code), it should be easy to switch things without chaos.</p>
<p><strong>Performance (Speed):</strong> As you'd want your meal ready quickly, efficient code is expected to run fast. Code quality metrics check how fast your code is executed.</p>
<p><strong>Reliability (Consistency):</strong> A good recipe always tastes the same. Similarly, reliable code consistently produces the correct results.</p>
<p><strong>Security (Safety):</strong> Just like checking if ingredients are safe to eat, code quality metrics look for potential dangers in your code that could be exploited.</p>
<p>These should be your goals when writing quality code. And SonarLint can help you accomplish them.</p>
<h2 id="heading-how-to-set-up-sonarlint-and-integrate-with-your-ide">How to Set Up SonarLint and Integrate with Your IDE</h2>
<p>An IDE (Integrated Development Environment) is a software application that helps developers write and debug code more effectively. IDEs include a code editor and compiler or interpreter.</p>
<p>In this article, you'll see how to install SonarLint using VS Code extensions.</p>
<h3 id="heading-how-to-install-sonarlint-with-vs-code">How to Install SonarLint with VS Code</h3>
<p>First, install VS Code or open the application if you've already installed it.</p>
<p>Next, head over to the Extensions tab on VS Code and download the SonarLint extension.</p>
<p>To use the SonarLint extension for JavaScript, TypeScript, or CSS, you should have a minimum version of <code>14.17.0</code> of Node.js installed on your system (especially if you want to use <a target="_blank" href="https://docs.sonarsource.com/sonarlint/vs-code/team-features/connected-mode/">Connected Mode</a> with Sonar Cloud).</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/01/sonar.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Install SonarLint in VS Code</em></p>
<p>Now that you've installed SonarLint, running an analysis on your code should be easy and it should start immediately after you open a new file.</p>
<p>This means SonarLint will start working and catching errors in your code as you write them on your IDE. Now let's look at an example in the next section.</p>
<h3 id="heading-how-to-use-sonarlint-in-your-ide">How to Use SonarLint in Your IDE</h3>
<p>Now let's look at how you can get the best out of SonarLint on your IDE. SonarLint is also a wonderful teacher, helping you better understand how to write clean code and giving you more information about why you have an error.</p>
<p>So instead of scouring the web to figure out what's wrong with your code, SonarLint explains why it has given you an error.</p>
<p>Here's an example of how to use it.</p>
<p>To be able to see the interface where we'll be working, open your terminal on VS Code – you can use Ctrl + backtick (`) to do this. I'm currently working on a project in React.js, and I didn't notice that I have duplicate border property names in my CSS class. Luckily, SonarLint caught this issue.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/01/sonarlint.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>A CSS error caught by SonarLint</em></p>
<p>If you click on the light bulb, you'll see an option to fix the code by deactivating the CSS rule or to be blunt removing the extra border which I have in my CSS class in this instance. There's also another option for opening a description rule so you can understand why you're getting that error.</p>
<p>So SonarLint gives you two options:</p>
<ol>
<li><p>It offers an option that gives you the ability and resources to understand why you have that error with the "Open description of rule".</p>
</li>
<li><p>It offers a solution to the error of the code which it has found.</p>
</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/01/sonarlint-another.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Options offered by SonarLint to help fix and understand this problem</em></p>
<p>If you click on the open description rule, SonarLint opens another tab in VS Code to help you understand why it has thrown that error and how you can write cleaner/better code.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/01/sonarlint-teacher.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Tab opened by SonarLint in VSCode to help understand the error</em></p>
<p>As you can see, SonarLint is an excellent teacher and your best buddy as you continue to build and work on your IDE.</p>
<p>Another great thing about SonarLint is that it works with multiple programming languages. So whatever programming language you're using, chances are that SonarLint can handle it.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>SonarLint is like having a coding buddy that helps you become a better programmer. As you write code, it's like having a teacher right there with you, pointing out ways to improve.</p>
<p>Imagine having a super-smart friend who does not just spot mistakes but also explains why they're wrong and shows you how to fix them.</p>
<p>Before your code gets to the testing stage, SonarLint checks for mistakes and makes sure your program runs smoothly. It's like having a superpower to catch issues early, saving you time and effort.</p>
<p>But that's not all! SonarLint is also like a security guard for your code. It watches out for any potential weak points that could let bad things happen. By learning from SonarLint, you can write better code and become more aware of keeping your code safe and secure.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Use Playbooks to Execute an Incident Recovery Plan ]]>
                </title>
                <description>
                    <![CDATA[ A playbook is the official, formal written record that describes policies and processes that will reliably produce a working deployment of an organization's resource stack. When it comes to generating predictable results, the playbook is the plan. I'... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/use-playbooks-for-incident-recovery/</link>
                <guid isPermaLink="false">66b9966222379234769e45f5</guid>
                
                    <category>
                        <![CDATA[ Disaster recovery ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ David Clinton ]]>
                </dc:creator>
                <pubDate>Wed, 31 May 2023 01:28:09 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/05/pexels-mateusz-dach-353644.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>A playbook is the official, formal written record that describes policies and processes that will reliably produce a working deployment of an organization's resource stack. When it comes to generating predictable results, the playbook <em>is</em> the plan.</p>
<p>I'll describe all the key elements of a good playbook in just a moment. But it's important to emphasize that a playbook on its own is more or less useless unless your team is able to read it and convert it into real-world results. </p>
<p>To do that you'll need to make sure every relevant member of your team is completely familiar with their roles and how they'll be expected to carry them out. That'll require you to distribute copies of the plan and ensure that everyone gets the training they'll need to perform perfectly when the time arrives.</p>
<p>This article comes from my <a target="_blank" href="https://www.udemy.com/course/intro-cyber-security-framework-planning/?referralCode=23853458BE14AFFAEFF2">Introduction to Cybersecurity course</a>. If you'd like, you can follow the video version here:</p>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/Qqo6qcDFBwU" 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-how-to-define-playbook-scope">How to Define Playbook Scope</h2>
<p>At any rate, a good plan begins with clear definitions:</p>
<ul>
<li>Where can you find up-to-date and clean copies of the source code? </li>
<li>Where should your production environment be hosted? In a public cloud like AWS? On-premises? </li>
<li>What is the infrastructure supposed to accomplish? </li>
<li>What's the scope of your operation: what scale of hardware resources will it require?</li>
</ul>
<p>A playbook should also clearly define the policies that must be followed through the rebuilding process: </p>
<ul>
<li>How is organizational data to be protected? </li>
<li>What decisions must be made only by senior company officers? </li>
<li>Are there restrictions on what software and third party solutions can be used...or from which countries they can be acquired? </li>
<li>Are there stack components that <em>must</em> remain local, or can everything live in the cloud?</li>
</ul>
<h2 id="heading-how-to-define-the-tools">How to Define the Tools</h2>
<p>Perhaps the core of any playbook is the section addressing the software and deployment tools and procedures that you'll use at every stage of your workflow. </p>
<p>This section should include the complete code for the scripts handling moving resources from code to deployment, along with links to all the software code in use, and instructions for authenticating to the services you'll be using.</p>
<h2 id="heading-how-to-define-the-participants">How to Define the Participants</h2>
<p>IT deployments are performed by people. But which people? </p>
<ul>
<li>Who do you speak to who has access to a credit card so you can purchase needed resources? </li>
<li>Who has access to the key codebases and online accounts you'll need? </li>
<li>Who's responsible for testing and signing off before code is pushed to production? </li>
<li>What if that person isn't available? </li>
</ul>
<p>Each and every role relating to the project you're documenting needs to be defined, and the person responsible must be identified – along with current contact information.</p>
<p>Beyond operational contacts, the playbook should also include a complete company communications directory. If you're paying someone a paycheck each month, the odds are they'll be expected to perform some important function during a recovery. So you'll want a reliable source for contact information – preferably containing multiple contact endpoints for each person.</p>
<h2 id="heading-how-to-document-your-recovery">How to Document Your Recovery</h2>
<p>Recovery operations can be chaotic. But it's nevertheless critically important that log records for every step – pre-, post-, and during recovery – should be kept. So log generation and storage should also be part of your playbook. </p>
<p>Even if you don't have the time to read them right now, they'll be invaluable later as you try to review events and figure out exactly what happened. The existence of accurate and reliable logs and other records might actually be legally mandated.</p>
<p>Any code review and application testing you would normally incorporate in your deployment lifecycles should be included in your recovery playbook. After all, bugs and failures aren't going to be any more fun after a crisis than they were before it. The actual code for all the scripts that would normally power your testing should be included here, too.</p>
<h2 id="heading-how-to-keep-your-playbook-current">How to Keep Your Playbook Current</h2>
<p>Finally, your playbook should be regularly updated to reflect changes to your application and its supporting environment. Naturally, you want to keep all details up-to-date, including changes to the personnel responsible for specific roles, along with their correct contact information.</p>
<p>A complete playbook created for a relatively complex operation can easily run into the hundreds of pages. When you add the task of coordinating the actions of all the many individuals who will be involved in your recovery, the whole thing might feel a bit hard to manage. Unfortunately, you just have to do this: there's really no alternative.</p>
<h2 id="heading-how-to-automate-your-recovery">How to Automate Your Recovery</h2>
<p>Well, there's almost no alternative. Remember how I told you that you should include complete operations scripts and links to your code base in the playbook? Do you think our playbook could be convinced to <em>play itself</em>? Why not?</p>
<p>Think about it. Orchestration tools like Ansible or Terraform – or cloud-specific tools like Amazon's CloudFormation – allow you to very closely define every layer of your infrastructure in a format that can be invoked and launched with a single command. </p>
<p>In theory at least, there's no reason why you couldn't build your playbook as an actual script, complete with commands to pull software repos, launch complex virtual networks and compute instances, and route DNS domains. That would be a fantastic example of the power of infrastructure as code.</p>
<h2 id="heading-how-to-test-your-playbook">How to Test Your Playbook</h2>
<p>While we're still on the topic of plans and playbooks, I should add one more very important note. If you're going to go to all the trouble of researching and then writing a playbook, you don't want to discover in the middle of a crisis that your plans don't actually work. </p>
<p>The safe assumption is that <em>nothing</em> in technology will work unless it's been carefully and repeatedly tested in advance. That's true of recovery playbooks, and it's just as true of backups: until you've successfully restored a backup archive into a real environment, you should assume it'll fail.</p>
<p>With what you've now seen about the scope, tools, documentation, updates and automation for playbooks, you're now all set to get to work creating your own. Well don't let me get in your way!</p>
<p><em>This article comes from my <a target="_blank" href="https://www.udemy.com/course/intro-cyber-security-framework-planning/?referralCode=23853458BE14AFFAEFF2">Introduction to Cybersecurity course</a>.</em> <em>And there's much more technology goodness available at <a target="_blank" href="https://bootstrap-it.com/">bootstrap-it.com</a></em></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 5 Linux Utilities to Improve Your Programming Workflow ]]>
                </title>
                <description>
                    <![CDATA[ By Rishabh Rawat Working as a Software Developer, there are always new tools and frameworks coming out that can completely change your workflows – for the better (or worse?). Either way, there is always the possibility to optimize how you do things d... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/5-linux-utilities-for-better-programming-workflow/</link>
                <guid isPermaLink="false">66d460c551f567b42d9f8499</guid>
                
                    <category>
                        <![CDATA[ Linux ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 24 Aug 2022 11:55:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/08/linux-shell-utilities-cover.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Rishabh Rawat</p>
<p>Working as a Software Developer, there are always new tools and frameworks coming out that can completely change your workflows – for the better (or worse?).</p>
<p>Either way, there is always the possibility to optimize how you do things day-to-day.</p>
<p>This article contains some Linux utilities that have recently replaced my overused and under-productive daily programming workflow.</p>
<p>You will learn about those utilities and how they are a better alternative to their counterparts.</p>
<p>Let's begin.</p>
<h2 id="heading-how-to-use-mcfly">How to Use Mcfly</h2>
<p>Do you relentlessly hit <code>up arrow</code> on the terminal until you get the command you ran previously? I've been there. I didn't know I could optimize this, so I was using it religiously for quite some time.</p>
<p>Then I got introduced to <code>ctrl + r</code>. It allows you to search through your command history and has wildcard search. Wow.</p>
<p>Results? My finger tapping exercise was over from the first day. Again, I thought this must be the peak DX for such a small utility. I was so wrong.</p>
<p>So what? Well, there's a better <code>ctrl-r</code> for you. Introducing Mcfly 🦋.</p>
<p>In addition to the regular <code>ctrl+r</code> feature, it has some extra niceness:</p>
<ol>
<li><p>The suggestions are customized using a neural network which considers your current working directory and recently executed commands.</p>
</li>
<li><p>It tracks exit status of commands (you probably don't want to run a failed command again), timestamp, and other useful information.</p>
</li>
<li><p>You can use <code>%</code> as a wildcard to match multiple characters.</p>
</li>
</ol>
<p>Here are the suggestions I got on two different repositories, based on my shell history:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/mcfly-in-git-project.png" alt="mcfly giving context aware suggestions in the shell" width="600" height="400" loading="lazy"></p>
<p><em>suggestions include a build script specific to this project</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/mcfly-in-different-git-project.png" alt="mcfly giving context aware suggestions in the shell" width="600" height="400" loading="lazy"></p>
<p><em>project has a different build script</em></p>
<p>You can install Mcfly from <a target="_blank" href="https://github.com/cantino/mcfly#installation">here</a>.</p>
<h2 id="heading-how-to-use-cheatsh">How to Use Cheat.sh</h2>
<p>Who loves reading man pages? I don’t. When I’m struggling with a command, the last thing I want to read is a man page. Not because it's not helpful, but it is overwhelming.</p>
<p>I often just need quick examples that I can grab on the go and use. When I found <a target="_blank" href="https://tldr.sh/">TLDR pages</a>, I was the happiest person. Now with Cheat (sheets), I’m even happier.</p>
<p>Cheat gives you access to the <a target="_blank" href="https://github.com/cheat/cheatsheets/">cheatsheets</a> for potentially every command you will ever need — only examples, without the encyclopedia.</p>
<p>If you do not want to install the utility, you can get the cheatsheet using CURL like this:</p>
<pre><code class="lang-bash">curl cheat.sh/uptime
</code></pre>
<p>So instead of installing the cheatsheets on your machine, you are fetching the information for only the command you need. You can visit <a target="_blank" href="https://cheat.sh/">cheat.sh</a> and use it on your browser as well.</p>
<p>Here is how the output of the above command looks:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/Image-Pasted-at-2022-8-19-13-56.png" alt="Cheatsheet output for uptime command" width="600" height="400" loading="lazy"></p>
<p><em>Cheatsheet output for uptime command</em></p>
<p>You will find a lot of examples in the <a target="_blank" href="https://github.com/cheat/cheat">codebase</a>.</p>
<h2 id="heading-how-to-use-git-open">How to Use Git Open</h2>
<p>I often need to open the GitHub repository of the project I'm working on in the browser. It may be to check for comment updates on the Pull Request I raised, change repository settings, or just about anything that will require the GitHub repository page.</p>
<p>Well, we have a utility even for this!</p>
<p>Running <code>git open</code> will open your current working repository on your browser. By default, it opens the remote page for the branch you are on. You can even go ahead and create an alias for the commands to avoid typing the whole thing.</p>
<p>Here are some of alias ideas for you:</p>
<pre><code class="lang-bash"><span class="hljs-built_in">alias</span> go=<span class="hljs-string">"git open"</span>
<span class="hljs-built_in">alias</span> blog=<span class="hljs-string">"git open https://github.com/&lt;username&gt;/blog &lt;branch&gt;"</span>
</code></pre>
<p>Check out Git Open on Github <a target="_blank" href="https://github.com/paulirish/git-open">here</a>.</p>
<h2 id="heading-how-to-use-bat">How to Use Bat</h2>
<p>We have all done <code>cat</code>, right? Bat is just that but has syntax highlighting, nice formatting and styling options, and git diff support. It is very versatile, integrates easily with other tools, and provides custom theming options as well.</p>
<p>Let's a take a look. This is our express server file using <code>cat</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/Image-Pasted-at-2022-8-19-16-26.png" alt="output of cat command" width="600" height="400" loading="lazy"></p>
<p><em>output of cat command</em></p>
<p>The above output has no syntax highlighting which decreases the readability of the code. Let's do the same using <code>bat</code>:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/Image-Pasted-at-2022-8-19-16-27.png" alt="output of bat command" width="600" height="400" loading="lazy"></p>
<p><em>output of bat command</em></p>
<p>This is clearly more readable. It has the appropriate syntax highlighting automatically applied (without any config), provides the file name, and line numbers.</p>
<p>Feel free to start using it <a target="_blank" href="https://github.com/sharkdp/bat">here</a>.</p>
<h2 id="heading-how-to-use-jq">How to Use Jq</h2>
<p>Jq is a command-line processor for JSON. You can slice and dice your JSON, perform projection to only show certain fields, and extract only the required information from a (huge) JSON. No more overwhelming the terminal output.</p>
<pre><code class="lang-javascript">[
  {<span class="hljs-string">"value"</span>: <span class="hljs-number">1</span>, <span class="hljs-string">"rating"</span>: <span class="hljs-number">2</span> },
  {<span class="hljs-string">"value"</span>: <span class="hljs-number">2</span>, <span class="hljs-string">"rating"</span>: <span class="hljs-number">4</span> },
  {<span class="hljs-string">"value"</span>: <span class="hljs-number">3</span>, <span class="hljs-string">"rating"</span>: <span class="hljs-number">5</span> }
]
</code></pre>
<p>Accessing a key from an array looks like this:</p>
<pre><code class="lang-javascript">jq <span class="hljs-string">'.[0] | { value }'</span>
</code></pre>
<p>We are asking for the first element in the array and projecting only the <code>value</code> field:</p>
<pre><code class="lang-javascript">{
  <span class="hljs-string">"value"</span>: <span class="hljs-number">1</span>
}
</code></pre>
<p>To learn more, head over to their <a target="_blank" href="https://stedolan.github.io/jq/tutorial/">official tutorial</a>.</p>
<p>They also have a handy online playground. I have created a snippet <a target="_blank" href="https://jqplay.org/s/E2-xscbiHba">here</a>. Feel free to tweak it and play around.</p>
<p>You can even take it a step further with <a target="_blank" href="https://github.com/simeji/jid">jid</a>. It is an interactive JSON digger that leverages Jq. It provides you very convenient suggestions and an auto-complete feature.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>These were some of the utilities that expanded the horizon for me and made me realise that there is always a better way to do things. You just need to keep Googling. Starting with "how to do X" and "better alternatives to X".</p>
<p>I use these utilities quite often in my daily programming workflow. I hope at least one of them will be useful to you.</p>
<p>I would love to know what utilities are crucial to your daily workflow – do you use any of the ones mentioned in this article?</p>
<p>Liked the article? <a target="_blank" href="https://rrawat.com/newsletter">Get biweekly improvement pills on backend web development</a> 💌.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Use Apache Airflow to Schedule and Manage Workflows ]]>
                </title>
                <description>
                    <![CDATA[ Apache Airflow is an open-source workflow management system that makes it easy to write, schedule, and monitor workflows. A workflow as a sequence of operations, from start to finish. The workflows in Airflow are authored as Directed Acyclic Graphs (... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-use-apache-airflow-to-manage-workflows/</link>
                <guid isPermaLink="false">66d460f2a326133d12440a7c</guid>
                
                    <category>
                        <![CDATA[ apache ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Sameer Shukla ]]>
                </dc:creator>
                <pubDate>Fri, 13 May 2022 15:11:17 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/05/My-project--1-.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Apache Airflow is an open-source workflow management system that makes it easy to write, schedule, and monitor workflows.</p>
<p>A workflow as a sequence of operations, from start to finish. The workflows in Airflow are authored as Directed Acyclic Graphs (DAG) using standard Python programming.</p>
<p>You can configure when a DAG should start execution and when it should finish. You can also set up workflow monitoring through the very intuitive Airflow UI.</p>
<p>You can be up and running on Airflow in no time – it’s easy to use and you only need some basic Python knowledge. It's also completely open source.</p>
<p>Apache Airflow also has a helpful collection of operators that work easily with the Google Cloud, Azure, and AWS platforms.</p>
<p>In this article we are going to cover</p>
<ul>
<li><p>What are Directed Acyclic Graphs (DAGs)?</p>
</li>
<li><p>What are Operators?</p>
</li>
<li><p>How to Create your First DAG</p>
</li>
<li><p>A Use-Case for DAGs</p>
</li>
<li><p>How to Set Up Cloud Composer</p>
</li>
<li><p>How to Run the Pipeline on Composer</p>
</li>
</ul>
<h2 id="heading-what-are-directed-acyclic-graphs-or-dags">What are Directed Acyclic Graphs, or DAGs?</h2>
<p>DAGs, or Directed Acyclic Graphs, have nodes and edges. DAGs should not contain any loops and their edges should always be directed.</p>
<p>In short, a DAG is a data pipeline and each node in a DAG is a task. Some examples of nodes are downloading a file from GCS (Google Cloud Storage) to Local, applying business logic on a file using Pandas, querying the database, making a rest call, or uploading a file again to a GCS bucket.</p>
<h3 id="heading-visualizing-dags">Visualizing DAGs</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-47.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Correct DAG with no loops</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-48.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Incorrect DAG with Loop</em></p>
<p>You can schedule DAGs in Airflow using the schedule_interval attribute. By default it’s "None" which means that the DAG can be run only using the Airflow UI.</p>
<p>You can schedule the DAG to run once every hour, every day, once a week, monthly, yearly or whatever you wish using the cron presets options (@hour, @daily, @weekly, @hourly, @monthly, @yearly).</p>
<p>If you need to run the DAG every 5 mins, every 10 mins, every day at 14:00, or once on a specific day like every Thursday at 10:00am, then you should use these cron-based expressions.</p>
<p>*/5 * * * * = Every 5 minutes</p>
<p>0 14 * * * = Every day at 14:00</p>
<h2 id="heading-what-are-operators">What are Operators?</h2>
<p>A DAG consists of multiple tasks. You can create tasks in a DAG using operators which are nodes in the graph.</p>
<p>There are various ready to use operators available in Airflow, such as:</p>
<ul>
<li><p>LocalFilesystemToGCSOperator – use it to upload a file from Local to GCS bucket.</p>
</li>
<li><p>PythonOperator – use it to execute Python callables.</p>
</li>
<li><p>functionEmailOperator – use it to send email.</p>
</li>
<li><p>SimpleHTTPOperator – use it to make an HTTP Request.</p>
</li>
</ul>
<h2 id="heading-how-to-create-your-first-dag">How to Create Your First DAG</h2>
<p>The example DAG we are going to create consists of only one operator (the Python operator) which executes a Python function.</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> airflow <span class="hljs-keyword">import</span> DAG
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">from</span> airflow.operators.python_operator <span class="hljs-keyword">import</span> PythonOperator

<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">message</span>():</span>
    print(<span class="hljs-string">"First DAG executed Successfully!!"</span>)

<span class="hljs-keyword">with</span> DAG(dag_id=<span class="hljs-string">"FirstDAG"</span>, start_date=datetime(<span class="hljs-number">2022</span>,<span class="hljs-number">1</span>,<span class="hljs-number">23</span>), schedule_interval=<span class="hljs-string">"@hourly"</span>,
         catchup=<span class="hljs-literal">False</span>) <span class="hljs-keyword">as</span> dag:

    task = PythonOperator(
        task_id=<span class="hljs-string">"task"</span>,
        python_callable=message)

task
</code></pre>
<p>The first step is to import the necessary modules required for DAG development. The line <code>with DAG</code> is the DAG which is a data pipeline that has basic parameters like <code>dag_id</code>, <code>start_date</code>, and <code>schedule_interval</code>.</p>
<p>The <code>schedule_interval</code> is configured as @hourly which indicates that the DAG will run every hour.</p>
<p>The task in the DAG is to print a message in the logs. We have used the PythonOperator here. This operator is used to execute any callable Python function.</p>
<p>Once the execution is complete, we should see the message “First DAG executed Successfully” in the logs. We are going to execute all our DAGs on GCP Cloud Composer.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-49.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Airflow UI</em></p>
<p>After successful execution, the message is printed on the logs:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-50.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Logs</em></p>
<h2 id="heading-a-use-case-for-dags">A Use-Case for DAGs</h2>
<p>The use-case we are going to cover in this article involves a three-step process.</p>
<p>In step one, we will upload a .csv file in some input GCS bucket. This file should be processed by PythonOperator in the DAG. The function which will be executed by the PythonOperator consists of Pandas code, which represents how users can use Pandas code for transforming the data in the Airflow Data Pipeline.</p>
<p>In step two, we'll upload the transformed .csv file to another GCS bucket. This task will be handled by the GCSToGCSOperator.</p>
<p>Step three is to send the status email indicating the that the pipeline execution is completed which will be handled by the EmailOperator.</p>
<p>In this use-case we will also cover how to notify the team via email in case any step of the execution failed.</p>
<h2 id="heading-how-to-install-cloud-composer">How to Install Cloud Composer</h2>
<p>In GCP, Cloud Composer is a managed service built on Apache Airflow. Cloud Composer has default integration with other GCP Services such as GCS, BigQuery, Cloud Dataflow and so on.</p>
<p>First, we need to create the Cloud Composer Environment. So search for Cloud Composer on the search bar and click on "Create Environment" as shown below:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-51.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Create Environment</em></p>
<p>In the Environments option, I am selecting the "Composer 1" option as we don’t need auto-scaling.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-54.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Once we select the type of composer we need, we'll need to do some basic configuration just like in any GCP managed service ("Instance Name", "Location", and so on).</p>
<p>The node count here should always be 3 as GCP will setup the 3 services needed for Airflow.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-56.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Once we're done with that, it'll set up an Airflow instance for us. To upload a DAG, we need to open the DAGs folder shown in ‘DAGs folder’ section.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-57.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Airflow Instance</em></p>
<p>If you go to the "Kubernetes Engine" section on GCP, we can see 3 services up and running:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-58.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Kubernetes Engine</em></p>
<p>All DAGs will reside in a bucket created by Airflow.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-59.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Airflow Instance bucket for DAGs</em></p>
<h2 id="heading-how-to-create-and-run-the-pipeline-on-composer">How to Create and Run the Pipeline on Composer</h2>
<p>In the Pipeline, we have two buckets. input_csv will contain the csv which requires some transformation, and the transformed_csv bucket will be the location where the file will be uploaded once the transformation is done.</p>
<p>The entire pipeline code is the following:</p>
<pre><code class="lang-python"><span class="hljs-keyword">from</span> airflow <span class="hljs-keyword">import</span> DAG
<span class="hljs-keyword">from</span> datetime <span class="hljs-keyword">import</span> datetime
<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd

<span class="hljs-keyword">from</span> airflow.utils.email <span class="hljs-keyword">import</span> send_email
<span class="hljs-keyword">from</span> airflow.operators.python_operator <span class="hljs-keyword">import</span> PythonOperator
<span class="hljs-keyword">from</span> airflow.operators.email_operator <span class="hljs-keyword">import</span> EmailOperator
<span class="hljs-keyword">from</span> airflow.providers.google.cloud.transfers.gcs_to_gcs <span class="hljs-keyword">import</span> GCSToGCSOperator


<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">transformation</span>():</span>
    trainDetailsDF = pd.read_csv(<span class="hljs-string">'gs://input_csv/Event_File_03_16_2022.csv'</span>)
    print(trainDetailsDF.head())


<span class="hljs-keyword">with</span> DAG(
        dag_id=<span class="hljs-string">"pipeline_demo"</span>,
        schedule_interval=<span class="hljs-string">"@hourly"</span>,
        start_date=datetime(<span class="hljs-number">2022</span>, <span class="hljs-number">1</span>, <span class="hljs-number">23</span>),
        catchup=<span class="hljs-literal">False</span>
) <span class="hljs-keyword">as</span> dag:
    buisness_logic_task = PythonOperator(
        task_id=<span class="hljs-string">'ApplyBusinessLogic'</span>,
        python_callable=transformation,
        dag=dag)

    upload_task = GCSToGCSOperator(
        task_id=<span class="hljs-string">'upload_task'</span>,
        source_bucket=<span class="hljs-string">'input_csv'</span>,
        destination_bucket=<span class="hljs-string">'transformed_csv'</span>,
        source_object=<span class="hljs-string">'Event_File_03_16_2022.csv'</span>,
        move_object=<span class="hljs-literal">True</span>,
        dag=dag
    )

    email_task = EmailOperator(
        task_id=<span class="hljs-string">"SendStatusEmail"</span>,
        depends_on_past=<span class="hljs-literal">True</span>,
        to=<span class="hljs-string">'youremail'</span>,
        subject=<span class="hljs-string">'Pipeline Status!'</span>,
        html_content=<span class="hljs-string">'&lt;p&gt;Hi Everyone, Process completed Successfully! &lt;p&gt;'</span>,
        dag=dag)

    buisness_logic_task &gt;&gt; upload_task &gt;&gt; email_task
</code></pre>
<p>In the first task, all we are doing is creating a DataFrame from the input file and printing the head elements. In the logs it looks like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-60.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>DataFrame Head</em></p>
<p>In the second task, GCSToGCSOperator, we have used the attribute move_object=True which will delete the file from the Source bucket.</p>
<p>Once we upload the file to the bucket, we can see that the DAG is being scheduled. The name of the DAG is "pipeline_demo".</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-61.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>DAGs</em></p>
<p>Note that in case if you encounter any "import errors" after uploading or executing a DAG, something like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-62.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>You can upload these missing packages through the "PYPI Packages" option in GCP. This will update the environment after few minutes.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-63.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Updating environment with missing Packages</em></p>
<p>To open an Airflow UI, Click on the "Airflow" link under Airflow webserver.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-64.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Airflow Instance, click Airflow link to Open UI</em></p>
<p>The Airflow UI looks like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-65.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>Upon successful execution of Pipeline, here's what you should see:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/05/image-66.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p>In order to send email if a task fails, you can use the on_failure_callback like this:</p>
<pre><code class="lang-python"><span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">notify_email</span>(<span class="hljs-params">contextDict, **kwargs</span>):</span>
    title = <span class="hljs-string">"Airflow alert: {task_name} Failed"</span>.format(**contextDict)
    body = <span class="hljs-string">"""
    Task Name :{task_name} Failed.&lt;br&gt;
    """</span>.format(**contextDict)
    send_email(<span class="hljs-string">'youremail’, title, body)



buisness_logic_task = PythonOperator(
    task_id='</span>ApplyBusinessLogic<span class="hljs-string">',
    python_callable=transformation,
    on_failure_callback=notify_email,
    dag=dag)</span>
</code></pre>
<p>We're doing the notification email configuration on composer through Sendgrid. Also, once you are done with Cloud Composer, don't forget to delete the instance as it cannot be stopped.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Apache Airflow is a fairly easy-to-use tool. There's also a lot of help now available on the internet and the community is growing.</p>
<p>GCP simplified working with Airflow a lot by creating a separate managed service for it.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Improve and Automate Your Web Development Workflow ]]>
                </title>
                <description>
                    <![CDATA[ The modern age of Web Development is incredible. We have a plethora of frameworks and libraries to help us work more efficiently, tons of quality resources to learn from, and numerous projects to inspire us. My decade-long journey as a web developer ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-improve-your-web-development-workflow/</link>
                <guid isPermaLink="false">66bdffdf422f318982ba47c3</guid>
                
                    <category>
                        <![CDATA[ automation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Tapas Adhikary ]]>
                </dc:creator>
                <pubDate>Mon, 01 Nov 2021 15:47:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/10/freeCodeCamp-Cover-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The modern age of Web Development is incredible. We have a plethora of frameworks and libraries to help us work more efficiently, tons of quality resources to learn from, and numerous projects to inspire us.</p>
<p>My decade-long journey as a web developer may not be very different from many of your journeys. But lately, I have been more focused on getting things done quickly with quality. It is not only about what and how we code. It is also about how we test, debug, and finally ship/deploy the application.</p>
<p>In this article, you will learn a few web development workflows that can help you develop, test, build, and deploy faster.</p>
<h2 id="heading-browser-console-a-web-devs-best-friend">Browser Console – A Web Dev's Best Friend</h2>
<p>In my early days of development, the browser's console used to be my best friend (and it still is today). </p>
<p>You can try out all your JavaScript logic, code snippets, and code ideas directly in the console. It works like a charm when you want to try out proofs-of-concept of your logic in the console before putting the code in the app.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-83.png" alt="Image" width="600" height="400" loading="lazy">
<em>JavaScript Program in the Browser's Console</em></p>
<p>You can launch the DevTools (for Chrome, and available in other browsers, too) using the <code>F12</code> key from your favorite browser. Next, you can navigate to the <code>console</code> tab to start writing and experimenting with the code.</p>
<h2 id="heading-thats-for-javascript-logic-though">That's for JavaScript logic, though...</h2>
<p>The browser's console is a great way to try out the logic part, but it is not sufficient to build and test a web application on the go. </p>
<p>If you are getting started with any popular framework or library like <code>Angular</code>, <code>React</code>, <code>Vue</code>, or <code>Svelte</code>, they've got you covered. You will have a complete infrastructure to develop, test, run, and see the changes almost in realtime.</p>
<p>However, suppose you are doing a project with plain JavaScript, HTML5, and CSS (I'm in love with this combo). In that case, you may not need any particular infrastructure. </p>
<p>Here are a couple of options to get you started.</p>
<h3 id="heading-vs-code-live-server-or-anything-equivalent">VS Code + Live Server or Anything Equivalent</h3>
<p>Suppose you are using Visual Studio Code as your preferred editor/IDE for web development. In that case, you can install an extension called <code>Live Server</code>. It launches a local development Server with a live reload feature for static and dynamic pages.</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer">https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer</a></div>
<p>Once installed, you can right-click on the entry point HTML file (usually an <code>index.html</code> file) of the app and open it with Live Server.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-85.png" alt="Image" width="600" height="400" loading="lazy">
<em>Launch the App using the Live Server</em></p>
<p>Alternatively, you can try the <code>Go Live</code> option from VS Code's status bar.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-86.png" alt="Image" width="600" height="400" loading="lazy">
<em>Alternate way to Go Live</em></p>
<p>This workflow works really well to develop and test your web app incrementally. It provides hot reloading, so you do not need to refresh the browser to see the latest changes. It happens automatically.</p>
<p>In case you are not using VS Code, there might be other alternatives for your favorite IDE.</p>
<h3 id="heading-with-the-npx-serve-command">With the npx serve Command</h3>
<p>The <code>npx</code> stands for Node Package Execute. It comes with <code>npm</code> to execute any package you want from the npm registry without installing it locally. <a target="_blank" href="https://www.npmjs.com/package/serve">serve</a> is a utility to help you serve a static site, single-page app locally.</p>
<p>To use it, open a command prompt at the root of the project folder and type this:</p>
<pre><code class="lang-shell">npx serve
</code></pre>
<p>You will get a URL to access the app locally.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-84.png" alt="Image" width="600" height="400" loading="lazy">
<em>Using npx serve</em></p>
<p>Both of these methodologies are very helpful to run and test the app <code>locally</code>. But you may need a bit more sophisticated workflow to build and deploy the app to test the production version simultaneously.</p>
<h2 id="heading-a-more-sophisticated-workflow">A More Sophisticated Workflow</h2>
<p>The last thing you want is for your application to not behave the same way in the production as it does locally. It could be a nightmare if you discover it close to deadline.</p>
<p>A better approach would be to develop functionality, test it locally, and then deploy and preview it on a production-like infrastructure. If all goes well, then you can launch it to production. You can do all that in a fully automated way within a few minutes.</p>
<p>I have started following a workflow that helps me to achieve these tasks:</p>
<div class="embed-wrapper">
        <blockquote class="twitter-tweet">
          <a href="https://twitter.com/tapasadhikary/status/1451041822285783040"></a>
        </blockquote>
        <script defer="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script></div>
<p>Some fantastic cloud-based hosting services are available that help you remove many complexities with building, deploying, and hosting your web apps. Here are a few you can check out (my favorites are Vercel and Netlify):</p>
<ul>
<li><a target="_blank" href="https://heroku.com/">Heroku</a></li>
<li><a target="_blank" href="https://netlify.com/">Netlify</a></li>
<li><a target="_blank" href="https://vercel.com/">Vercel</a></li>
<li><a target="_blank" href="https://surge.sh/">Surge</a></li>
<li><a target="_blank" href="https://firebase.com/">Firebase</a></li>
<li><a target="_blank" href="https://fly.io/">Fly</a></li>
</ul>
<p>It is standard practice to manage and track your source code changes using a Version Control System like Git and an app like GitHub. If you do not have an account on <a target="_blank" href="http://github.com/">GitHub</a>, you can create one now.</p>
<p>If you are looking for a GitHub repo guide to increase engagement on your public repositories, you can read this article I wrote:</p>
<div class="embed-wrapper"><div class="embed-loading"><div class="loadingRow"></div><div class="loadingRow"></div></div><a class="embed-card" href="https://www.freecodecamp.org/news/increase-engagement-on-your-public-github-repositories/">https://www.freecodecamp.org/news/increase-engagement-on-your-public-github-repositories/</a></div>
<p>Alright, coming back to our topic. The hosting services mentioned above have integrations with GitHub. It means you can connect a particular repository in GitHub to build the source code from it and deploy it to a CDN by the hosting services. </p>
<p>The best part is, all these happen automatically every time you push your commits to a repository branch. For each pull request, you get a preview URL to test your changes in a production-like infrastructure. Isn't that cool? </p>
<p>Once you're satisfied with testing, you just merge the pull request to the master (or main) branch to build and deploy your app/site from there.</p>
<p>So, what does the workflow look like at a high level? Take a look at the image below:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/workflow-1.png" alt="Image" width="600" height="400" loading="lazy">
<em>An Automated Workflow</em></p>
<ul>
<li>We, as developers, create a GitHub repository for our source code and commit, push the initial code to it.</li>
<li>We perform a few easy steps with the hosting provider (like Vercel, Netlify) to integrate the GitHub repository.</li>
<li>Next, we create branches in the repository to implement features or fix bugs. Netlify, Vercel, or other services will create a deployable build, deploy it on a CDN, and provide us a preview URL for each branch.</li>
<li>We then use this URL to test the feature. We can also share this URL publicly with our stakeholders.</li>
<li>Once we're done, we merge the PR, and the changes in the master or main branch are also built and deployed automatically.</li>
</ul>
<p>This workflow helps me the most with my web development. I just focus on delivering my code changes to GitHub, and the rest all happens automatically.</p>
<p>Let's now go through the quick steps of deploying a simple web app on Vercel. It's pretty similar to other platforms which I'll leave for you to explore.</p>
<h3 id="heading-how-to-deploy-a-web-app-on-vercel">How to Deploy a Web App on Vercel</h3>
<ul>
<li>Sign up with <a target="_blank" href="https://vercel.com/">Vercel</a> and login. Then click on the <code>New Project</code> button:</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-95.png" alt="Image" width="600" height="400" loading="lazy">
<em>Select a New Project</em></p>
<ul>
<li>Next, configure and import a GitHub repository:</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-96.png" alt="Image" width="600" height="400" loading="lazy">
<em>Configure GitHub Repo</em></p>
<ul>
<li>Now install Vercel on your GitHub organization where this repo exists.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-97.png" alt="Image" width="600" height="400" loading="lazy">
<em>Install Vercel on GitHub</em></p>
<ul>
<li>You'll need to provide access to all the repositories or select the ones you want Vercel to manage. Then save the changes.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-98.png" alt="Image" width="600" height="400" loading="lazy">
<em>Select Repository</em></p>
<ul>
<li>Now control comes back to the Vercel interface and you can import the repository from there.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-99.png" alt="Image" width="600" height="400" loading="lazy">
<em>Import the Selected Repo to Deploy</em></p>
<ul>
<li>You can select the entry point of the project root directory and deploy.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-100.png" alt="Image" width="600" height="400" loading="lazy">
<em>A Basic Configuration</em></p>
<ul>
<li>The deployment may take a while depending on the type of your web project. Once it's done, you will get a screen like the below confirming it.</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/10/image-101.png" alt="Image" width="600" height="400" loading="lazy">
<em>Done!</em></p>
<p>Great, I hope that was easy. Please explore it further, and I'm sure you will love it.</p>
<h2 id="heading-before-we-end">Before We End...</h2>
<p>I hope you found the article insightful and informative. My DMs are open on Twitter if you want to discuss further.</p>
<p>Let's connect. I share my learnings on JavaScript, Web Development, and Blogging on these platforms as well:</p>
<ul>
<li><a target="_blank" href="https://twitter.com/tapasadhikary">Follow me on Twitter</a></li>
<li><a target="_blank" href="https://www.youtube.com/tapasadhikary?sub_confirmation=1">Subscribe to my YouTube Channel</a></li>
<li><a target="_blank" href="https://github.com/atapas">Side projects on GitHub</a></li>
</ul>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Terraform Workflow: How to Work Individually and in a Team ]]>
                </title>
                <description>
                    <![CDATA[ By Serhii Vasylenko A workflow, or a pattern of the work, gives you a standardized way to do something.  It is extremely helpful in a team, and can benefit you even if you work individually. A good workflow enables you to streamline a process, organi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/terraform-workflow-working-individually-and-in-a-team/</link>
                <guid isPermaLink="false">66d460f0a3a4f04fb2dd2e61</guid>
                
                    <category>
                        <![CDATA[ Devops ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Infrastructure as code ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Terraform ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 16 Sep 2020 08:08:29 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/09/tf-workflows.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Serhii Vasylenko</p>
<p>A workflow, or a pattern of the work, gives you a standardized way to do something. </p>
<p>It is extremely helpful in a team, and can benefit you even if you work individually. A good workflow enables you to streamline a process, organize it, and make it less error-prone.</p>
<p>This article summaries several approaches when working with Terraform, both individually and in a team. I tried to gather the most common ones, but you might also want to develop your own.</p>
<p>The common requirement for all of them is a version control system (such as Git). This is how you ensure nothing is lost and all your code changes are properly versioned tracked.</p>
<p>Table of contents:</p>
<ul>
<li><a class="post-section-overview" href="#heading-basic-concepts">Basic Concepts</a></li>
<li><a class="post-section-overview" href="#heading-core-individual-workflow">Core individual workflow</a></li>
<li><a class="post-section-overview" href="#heading-core-team-workflow">Core team workflow</a></li>
<li><a class="post-section-overview" href="#heading-team-workflow-with-automation">Team workflow with automation</a></li>
<li><a class="post-section-overview" href="#heading-import-workflow">Import workflow</a></li>
</ul>
<h2 id="heading-basic-concepts">Basic Concepts</h2>
<p>Let’s define the basic actions first. </p>
<p>All described workflows are built on top of three key steps: Write, Plan, and Apply. Nevertheless, their details and actions vary between workflows.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-79.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><strong>Write</strong> – this is where you make changes to the code.</p>
<p><strong>Plan</strong> – this is where you review changes and decide whether to accept them.</p>
<p><strong>Apply</strong> – this is where you accept changes and apply them against real infrastructure.</p>
<p>It's a simple idea with a variety of possible implementations.</p>
<h2 id="heading-core-individual-workflow">Core individual workflow</h2>
<p>This is the most simple workflow if you work alone on a relatively small TF project. This workflow suits both local and remote backends well.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-78.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-write">Write</h3>
<p>You clone the remote code repo or pull the latest changes, edit the configuration code, then run the <code>terraform validate</code> and <code>terraform fmt</code> commands to make sure your code works well.</p>
<h3 id="heading-plan">Plan</h3>
<p>This is where you run the <code>terraform plan</code> command to make sure that your changes do what you need. This is a good time to commit your code changes changes (or you can do it in the next step).</p>
<h3 id="heading-apply">Apply</h3>
<p>This is when you run <code>terraform apply</code> and introduce the changes to real infrastructure objects. Also, this is when you push committed changes to the remote repository.</p>
<h2 id="heading-core-team-workflow">Core team workflow</h2>
<p>This workflow is good for when you work with configuration code in a team and want to use feature branches to manage the changes accurately.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-80.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-write-1">Write</h3>
<p>Start by checking out a new branch, make your changes, and run the <code>terraform validate</code> and <code>terraform fmt</code> commands to make sure your code works well.</p>
<p>Running <code>terraform plan</code> at this step will help ensure that you'll get what you expect.</p>
<h3 id="heading-plan-1">Plan</h3>
<p>This is where code and plan reviews happen.</p>
<p>Add the output of the <code>terraform plan</code> command to the Pull Request with your changes. It would be a good idea to add only the changed parts of the common output, which is the part that starts with "<em>Terraform will perform the following actions</em>" string.</p>
<h3 id="heading-apply-1">Apply</h3>
<p>Once the PR is reviewed and merged to the upstream branch, it is safe to finally pull the upstream branch locally and apply the configuration with <code>terraform apply</code>.</p>
<h2 id="heading-team-workflow-with-automation">Team workflow with automation</h2>
<p>In a nutshell, this workflow allows you to introduce a kind of smoke test for your infrastructure code (using <code>plan</code>) and also to automate the feedback in the CI process.</p>
<p>The automated part of this workflow consists of a speculative plan on commit and/or Pull Request (PR ), along with adding the output of <code>plan</code> to the comment of the PR. A speculative plan mean just to show the changes, and not apply them afterward.</p>
<p>‌‌</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-81.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-write-2">Write</h3>
<p>This step is the same as in the previous workflow.</p>
<h3 id="heading-plan-2">Plan</h3>
<p>This is where your CI tool does its job. </p>
<p>Let’s review this step by step:</p>
<ol>
<li>You create a PR with the code changes you wish to implement.</li>
<li>The CI pipeline is triggered by an event from your code repository (such as webhook push) and it runs a speculative plan against your code.</li>
<li>The list of changes (a so-called "plan diff") is added to PR for review by the CI.</li>
<li>Once merged, the CI pipeline runs again and you get the final plan that's ready to be applied to the infrastructure.</li>
</ol>
<p><strong>Apply</strong></p>
<p>Now that you have a branch (i.e. main) with the fresh code to apply, you need to pull it locally and run <code>terraform apply</code>.</p>
<p>You can also add the automated apply here – step 5 in the picture below. This may be very useful for disposable environments such as testing, staging, development, and so on.</p>
<p>The exact CI tool to be used here is up to you: Jenkins, GitHub Actions, and Travis CI all work well. </p>
<p>An important thing to note is that the CI pipeline must be configured in a bi-directional way with your repository to get the code from it and report back with comments to PR.</p>
<p>As an option, you may consider using Terraform Cloud which has a lot of functionality, including the above mentioned repo integration, even with the free subscription.</p>
<p>If you have never worked with Terraform Cloud before and want to advice to get started, I'll provide the links at the end of this article.</p>
<h2 id="heading-import-workflow">Import workflow</h2>
<p>‌‌This workflow refers to a situation when you have some objects already created (i.e., up and running), and you need to manage them with Terraform.</p>
<p>Suppose we already have an S3 bucket in AWS called "someassetsbucket" and we want to include it into our configuration code.‌‌</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/09/image-82.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h3 id="heading-prepare">Prepare</h3>
<p>You should create a resource block to be used later for the real object you’re going to import. </p>
<p>You don’t need to fill the arguments in it at the start, so it may be just a blank resource block, for example:</p>
<pre><code>resource <span class="hljs-string">"aws_s3_bucket"</span> <span class="hljs-string">"assets"</span> {
‌‌
}
</code></pre><h3 id="heading-import">Import</h3>
<p>Now you need to import the information about the real object into your existing Terraform state file.</p>
<p>This can be done with the <code>terraform import</code> command, for example:</p>
<pre><code>terraform <span class="hljs-keyword">import</span> aws_s3_bucket.assets <span class="hljs-string">"someassetsbucket"</span>
</code></pre><h3 id="heading-write-3">Write</h3>
<p>Now you need to write the corresponding Terraform code for this bucket.</p>
<p>To avoid modifying your real object on the <code>terraform apply</code> action, you should specify all needed arguments with the exact values from the import phase.</p>
<p>You can see the details by running the <code>terraform state show</code> command, for example:</p>
<pre><code>terraform state show aws_s3_bucket.assets
</code></pre><p>The output of this command will be very similar to the configuration code. But it contains both arguments and attributes of the resource, so you need to clean it up before applying it.</p>
<p>You can use one of the following tactics:</p>
<ul>
<li>either copy/paste it, and then run <code>terraform validate</code> and <code>terraform plan</code> several times to make sure there are no errors like "<em>argument is not expected here</em>" or "<em>this field cannot be set</em>"</li>
<li>or you can pick and write only the necessary arguments</li>
</ul>
<p>In any case, be sure to refer to the documentation of the resource during this process.</p>
<h3 id="heading-plan-3">Plan</h3>
<p>The goal is to have a <code>terraform plan</code> output showing "<em>~ update in-place</em>" changes only.</p>
<p>However, it is not always clear whether the real object will be modified or only the state file will be updated. This is why you should understand how a real object works and know its life cycle to make sure it is safe to apply the plan.</p>
<h3 id="heading-apply-2">Apply</h3>
<p>This is usual the <code>terraform apply</code> action. </p>
<p>Once applied, your configuration and state file will correspond to the real object configuration. </p>
<h2 id="heading-wrapping-up"><strong>Wrapping up</strong></h2>
<p>Here is an overview of Terraform Cloud for those who never worked with it before: ‌‌<a target="_blank" href="https://www.terraform.io/docs/cloud/overview.html">Overview of Terraform Cloud Features</a></p>
<p>And here is a nice tutorial to start with: <a target="_blank" href="https://learn.hashicorp.com/collections/terraform/cloud-get-started">Get Started - Terraform Cloud</a></p>
<p>Also, here is an overview of workflows at scale from the HashiCorp CTO which might be useful for more experienced Terraform users: <a target="_blank" href="https://www.hashicorp.com/resources/terraform-workflow-best-practices-at-scale">Terraform Workflow Best Practices at Scale</a></p>
<p>Thank you for reading. I hope you will try one of these workflows, or develop your own!‌‌</p>
<p>‌‌</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Create a Self-Documenting Makefile ]]>
                </title>
                <description>
                    <![CDATA[ My new favorite way to completely underuse a Makefile? Creating personalized, per-project repository workflow command aliases that you can check in. Can a Makefile improve your DevOps and keep developers happy? How awesome would it be if a new develo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/self-documenting-makefile/</link>
                <guid isPermaLink="false">66bd8f81c1ca1df1936e29e3</guid>
                
                    <category>
                        <![CDATA[ Devops ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Victoria Drake ]]>
                </dc:creator>
                <pubDate>Mon, 10 Aug 2020 13:59:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/08/cover-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>My new favorite way to completely underuse a Makefile? Creating personalized, per-project repository workflow command aliases that you can check in.</p>
<p>Can a Makefile improve your DevOps and keep developers happy? How awesome would it be if a new developer working on your project didn’t start out by copying and pasting commands from your README? What if instead of:</p>
<pre><code class="lang-shell">pip3 install pipenv
pipenv shell --python 3.8
pipenv install --dev
npm install
pre-commit install --install-hooks
# look up how to install Framework X...
# copy and paste from README...
npm run serve
</code></pre>
<p>… you could just type:</p>
<p><code>make start</code></p>
<p>…and then start working?</p>
<h2 id="heading-making-a-difference">Making a difference</h2>
<p>I use <code>make</code> every day to take the tedium out of common development activities like updating programs, installing dependencies, and testing. </p>
<p>To do all this with a Makefile (GNU make), we use <a target="_blank" href="https://www.gnu.org/software/make/manual/make.html#Rules">Makefile rules</a> and <a target="_blank" href="https://www.gnu.org/software/make/manual/make.html#Recipes">recipes</a>. Similar parallels exist for POSIX flavor make, like <a target="_blank" href="https://pubs.opengroup.org/onlinepubs/9699919799/utilities/make.html#tag_20_76_13_04">Target Rules</a>. Here’s a <a target="_blank" href="https://nullprogram.com/blog/2017/08/20/">great article</a> on POSIX-compatible Makefiles.</p>
<p>Here’s some examples of things we can <code>make</code> easier (sorry):</p>
<pre><code class="lang-makefile"><span class="hljs-section">update: ## Do apt upgrade and autoremove</span>
    sudo apt update &amp;&amp; sudo apt upgrade -y
    sudo apt autoremove -y

<span class="hljs-section">env:</span>
    pip3 install pipenv
    pipenv shell --python 3.8

<span class="hljs-section">install: ## Install or update dependencies</span>
    pipenv install --dev
    npm install
    pre-commit install --install-hooks

<span class="hljs-section">serve: ## Run the local development server</span>
    hugo serve --enableGitInfo --disableFastRender --environment development

<span class="hljs-section">initial: update env install serve ## Install tools and start development server</span>
</code></pre>
<p>Now we have some command-line aliases that you can check in. Great idea! If you’re wondering what’s up with that weird <code>##</code> comment syntax, it gets better.</p>
<h2 id="heading-a-self-documenting-makefile">A self-documenting Makefile</h2>
<p>Aliases are great, if you remember what they all are and what they do without constantly typing <code>cat Makefile</code>. Naturally, you need a <code>help</code> command:</p>
<pre><code class="lang-makefile"><span class="hljs-meta"><span class="hljs-meta-keyword">.PHONY</span>: help</span>
<span class="hljs-section">help: ## Show this help</span>
    @egrep -h '\s<span class="hljs-comment">##\s' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'</span>
</code></pre>
<p>With a little command-line magic, this <code>egrep</code> command takes the output of <code>MAKEFILE_LIST</code>, sorts it, and uses <code>awk</code> to find strings that follow the <code>##</code> pattern. It then prints a helpful formatted version of the comments.</p>
<p>We’ll put it at the top of the file so it’s the default target. Now to see all our handy shortcuts and what they do, we just run <code>make</code>, or <code>make help</code>:</p>
<pre><code class="lang-text">help                 Show this help
initial              Install tools and start development server
install              Install or update dependencies
serve                Run the local development server
update               Do apt upgrade and autoremove
</code></pre>
<p>Now we have our very own personalized and project-specific CLI tool!</p>
<p>The possibilities for improving your DevOps flow with a self-documenting Makefile are almost endless. You can use one to simplify any workflow and produce some very happy developers.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Automate Your Life and Everyday Tasks with Zapier ]]>
                </title>
                <description>
                    <![CDATA[ Every day, we perform hundreds of small tasks. On their own, they don’t take much time. But they can add up, especially if you consider that time for a whole year.  But we’re technologists and it’s 2020. How can we use tools like Zapier to make robot... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-automate-your-life-and-everyday-tasks-with-zapier/</link>
                <guid isPermaLink="false">66b8e3400cedc1f2a4f70693</guid>
                
                    <category>
                        <![CDATA[ automation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Colby Fayock ]]>
                </dc:creator>
                <pubDate>Thu, 23 Jul 2020 16:27:16 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2020/07/zapier.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Every day, we perform hundreds of small tasks. On their own, they don’t take much time. But they can add up, especially if you consider that time for a whole year. </p>
<p>But we’re technologists and it’s 2020. How can we use tools like Zapier to make robots do these things for us?</p>
<ul>
<li><a class="post-section-overview" href="#heading-what-is-zapier">What is Zapier?</a></li>
<li><a class="post-section-overview" href="#heading-what-can-we-do-with-zapier-zaps">What can we do with Zapier Zaps?</a></li>
<li><a class="post-section-overview" href="#heading-zap-1-get-a-text-if-its-going-to-rain-with-zapier">Zap 1: Get a text if it’s going to rain with Zapier</a></li>
<li><a class="post-section-overview" href="#heading-zap-2-print-a-test-every-week-with-google-cloud-print">Zap 2: Print a test every week with Google Cloud Print</a></li>
<li><a class="post-section-overview" href="#heading-zap-3-smashing-magazine-job-alerts-with-gmail">Zap 3: Smashing Magazine Job Alerts with Gmail</a></li>
</ul>
<div class="embed-wrapper">
        <iframe width="560" height="315" src="https://www.youtube.com/embed/12oAIHHEJMw" 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-zapier">What is Zapier?</h2>
<p><a target="_blank" href="https://zapier.com/">Zapier</a> is an automation tool that connects all of the apps you love and builds powerful fully automated workflows. Whether it’s automating sending an email or making sure that new blog post gets a tweet, we can remove the manual steps of mundane tasks to focus on other things that art important.</p>
<p>Each time you create a new workflow, you’re creating a “Zap”. It’s essentially Zapier’s way to give a name to the workflow you create.</p>
<h2 id="heading-what-can-we-do-with-zapier-zaps">What can we do with Zapier Zaps?</h2>
<p>The brilliant part about Zapier is each app integration makes its API available via Zapier to other app integrations giving you a ton of options to connect and build powerful workflows.</p>
<p>Particularly, we’re going to learn how to do a few things:</p>
<ul>
<li>Sending a text every morning if it’s going to rain</li>
<li>Set up a weekly print job to keep your ink fresh</li>
<li>Receive emails for new jobs on Smashing Magazine’s job board</li>
</ul>
<p>While each of these tasks are small, they end up saving you a lot of time. And if you’re creative, you can build upon these workflows to customize a whole lot more.</p>
<h2 id="heading-getting-started-with-a-zapier-account">Getting started with a Zapier account</h2>
<p>Before we get into setting up workflows, you’ll need an account.</p>
<p><a target="_blank" href="https://zapier.com/">Signing up for Zapier</a> is free and you get 5 free Zaps to start, so we don’t have to worry about cost here.</p>
<p>Now let’s get into the Zaps.</p>
<h2 id="heading-zap-1-get-a-text-if-its-going-to-rain-with-zapier">Zap 1: Get a text if it’s going to rain with Zapier</h2>
<p>To get an idea of how this works, we’ll start with something simple. We’re going to set up a Zap that will send us a text message if the weather predicts rain.</p>
<p>To get started, click the big <strong>Make a Zap</strong> button on the top left of the page when you’re logged into your account.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-make-new-zap.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Making a new Zap</em></p>
<p>Here, Zapier wants to know the first app we want to connect. Since we’re going to base our Zap on the weather, search for “weather” and select <strong>Weather by Zapier</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/weather-by-zapier.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Selecting the Weather by Zapier integration</em></p>
<p>It will then ask you to choose a <strong>Trigger Event</strong>, where you’ll select “Will It Rain Today?”, then you can click the <strong>Continue</strong> button.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-weather-will-it-rain.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Choosing the Will it Rain Today? event</em></p>
<p>When choosing Weather as an event, it requires a little bit of information to give us a personalized prediction. Particularly, it requires your Latitude and Longitude, which we can look up using <a target="_blank" href="https://www.latlong.net/">latlong.net</a>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/latitude-longitude-finder.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Finding latitude and longitude with latlong.net</em></p>
<p>You can then enter your <strong>Latitude</strong> and <strong>Longitude</strong> into the <strong>Customize Forecast</strong> screen of Zapier, select your <strong>Units</strong> which defaults to <strong>Fahrenheit</strong>, and then click the big <strong>Continue</strong> button.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-customize-weather-forcast.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Configuring forecast with latitude and longitude</em></p>
<p>At this point, you can click <strong>Test Trigger</strong>, which simply makes sure it’s working, and click <strong>Continue</strong> again.</p>
<p>Now we’re going to tell Zapier what to do with the information once it knows it’s going to rain.</p>
<p>In the "Do this..." panel, search for “sms” and select <strong>SMS by Zapier</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/sms-by-zapier.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Selecting SMS by Zapier</em></p>
<p>We’re going to leave the <strong>App</strong> and <strong>Event</strong> as the defaults, so the next screen you can just click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-sms-action-event.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>SMS App and Event</em></p>
<p>Now, for Zapier to send you a text, it needs to verify that your phone number belongs to you or that the phone number is knowingly signing up for these texts. To do that, it sends you a one-time PIN that you’ll enter.</p>
<p>So click <strong>Sign in to SMS by Zapier</strong>, which will open a popup window.</p>
<p>Here, enter your phone number, and choose Sms or Call as the verification method at which point it will contact you with a PIN.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/sign-in-to-sms-by-zapier.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Sign in to SMS by Zapier and send a PIN</em></p>
<p>With that PIN, enter it into the field and click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/sms-by-zapier-enter-pin.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Entering the SMS verification PING</em></p>
<p>At this point the window will close and move you back to the original flow. Here, click <strong>Continue</strong> again.</p>
<p>Now we get to customize the text that we receive.</p>
<p>In the <strong>From Number</strong> field, Zapier gives a bunch of phone numbers you can use. You can either select one number to always send from, which you can set up as a contact so you know it’s Zapier, or you can select <strong>Random</strong>, which will use a random number every time.</p>
<p>Then, click inside of <strong>Message</strong>, and it will bring up some options. I want to know everything possible if it’s going to rain, including the probability, max temperature, and summary, so we can select all or as much as we want and again click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/sms-zapier-configure-message.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Configuring Weather message</em></p>
<p>Finally we get to test if our Zap worked. At this point everything should be configured, so click the <strong>Test &amp; Review</strong> button and you should receive a sample text!</p>
<p><em>Note: If you choose a single From Number, you might be limited in how frequent you can receive texts, so if you don’t get it right away, that might be why. Setting random helps prevent that issue, but the the number isn’t consistent.</em></p>
<p>And once you’re happy with the configuration, you can click <strong>Turn On Zap</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-turn-on-zap.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Turning on the SMS Zap</em></p>
<p>You’ll now get texts in the morning if the weather is predicting rain!</p>
<h2 id="heading-zap-2-print-a-test-every-week-with-google-cloud-print">Zap 2: Print a test every week with Google Cloud Print</h2>
<p>This one doesn’t sound exciting, but have you ever gone through a long period of time where you didn’t print something, only to end up with dried out printer heads or worse yet, a now unsalvageable printer?</p>
<p>We can avoid this by simply running a weekly print job that keeps our printer ink nice and fresh.</p>
<p>For this, we’ll use <a target="_blank" href="https://www.google.com/cloudprint/learn/">Google Cloud Print</a>. To make this work, you’ll need to already have this configured with your Google account.</p>
<p>Let’s create a new Zap and this time for our “When this happens…” search for and select <strong>Schedule by Zapier</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/schedule-by-zapier.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Selecting Schedule by Zapier</em></p>
<p>We can then select a <strong>Trigger Event</strong> of <strong>Every Week</strong> and click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-schedule-trigger-every-week.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Setting Trigger Event as Every Week</em></p>
<p>Next, you can choose the <strong>Day Of The Week</strong> and <strong>Time Of Day</strong> you’d like to print. I personally run this job weekly at 8pm on Sundays right before the start of a new week. Once configured, click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-schedule-sunday-8pm.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Configuring Zapier schedule</em></p>
<p>At this point, we can click <strong>Test</strong> trigger, which just like before makes sure it’s working properly, and then we can click <strong>Continue</strong>.</p>
<p>Now, for our “Do this…” we want to print, so search for and select <strong>Google Cloud Print</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-google-cloud-print.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Selecting Google Cloud Print</em></p>
<p>And for the action, select <strong>Submit Print Job</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-action-event-send-print-job.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Setting Submit Print Job as Action Event</em></p>
<p>At this point, you’ll need to sign into Google Cloud Print. This will open a window and have you log in through Google so that Zapier can interface with the service.</p>
<p>Once connected, click <strong>Continue</strong>.</p>
<p>Now we can configure out print job. Here we’ll want to define what we print.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-google-cloud-print-configuration.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Configuring Print Job in Zapier</em></p>
<p>In the above, we’re configuring:</p>
<ul>
<li><strong>Which Printer:</strong> the printer we want to print to connected to Google Cloud Print</li>
<li><strong>Content:</strong> this can be a URL to a document, HTML, or plain text. I’m using a URL which is a simple test page I made that has some color in it</li>
<li><strong>Content Type:</strong>  you’ll want to set this depending on what you set in Content. If you set a URL like I did, it should be URL</li>
<li><strong>Title Of Print Job:</strong> the name of the job so you can see it in the print logs</li>
<li><strong>Number of Copies:</strong> probably just want 1 so it doesn’t waste ink and paper</li>
<li><strong>Color or Monochrome:</strong> you’ll want to explicitly set this if you want color. The idea is to refresh all of the ink cartridges, so only printing black won’t help the color ink, so in my case, I selected color</li>
</ul>
<p>The rest of the fields are optional, feel free to customize to your liking.</p>
<p>With our configuration set, click <strong>Continue</strong>, and similar to before, we can click <strong>Test</strong> to see our print job in action and if we’re happy, we can click <strong>Turn on Zap</strong>!</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-print-test.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Test print from Zapier print job</em></p>
<p><em>If you want to use the same document, you can find it here: <a target="_blank" href="https://fay.io/printer-test.pdf">https://fay.io/printer-test.pdf</a></em></p>
<h2 id="heading-zap-3-smashing-magazine-job-alerts-with-gmail">Zap 3: Smashing Magazine Job Alerts with Gmail</h2>
<p>If we’re looking for a job, it can be a pain to have to visit every job board every day (or every hour, am I right?). But we can automate this process when the job board supports it.</p>
<p>Luckily, job boards like Smashing Magazine and a whole lot of others provide RSS feeds which we can hook right in to Zapier to automate getting an email whenever a new job is posted.</p>
<p>To get started, let’s create a new Zap, and this time, search for RSS and select <strong>RSS by Zapier</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/rss-by-zapier.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Selecting RSS by Zapier</em></p>
<p>For our <strong>Trigger Event</strong>, select <strong>New Item in Feed</strong>, then click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-rss-new-feed-item.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Setting New Item in Feed as Trigger Event</em></p>
<p>At this point, we want to enter a feed URL. This will be the URL to the XML RSS feed that websites make available. For Smashing Magazine, you can find it here:</p>
<p><a target="_blank" href="https://www.smashingmagazine.com/jobs/feed">https://www.smashingmagazine.com/jobs/feed</a></p>
<p>So enter that URL above into <strong>Feed URL</strong> (you can leave <strong>Username</strong> and <strong>Password</strong> blank), and keep <strong>Different GUID</strong> selected for <strong>What Triggers A New Feed Item</strong>. Then click <strong>Continue</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-rss-feed-configuration.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Setting RSS Feed URL</em></p>
<p>Same as usual, now you can test the trigger to make sure it works. If the RSS feed is valid, this will be smooth, otherwise you might see an error. The above URL should be valid!</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-rss-found-feed-item-test.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Testing the RSS feed</em></p>
<p>Next, we need to choose what we want to do with the new item. Since we want it emailed, we can choose our email service, which in my case is Gmail.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-gmail.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Selecting Gmail in Zapier</em></p>
<p>For our action, we want to <strong>Send Email</strong>.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-gmail-send-email-trigger.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Setting Action Event as Send Email</em></p>
<p>Next, you want to sign in to your account, similar to what we did with Google Cloud Print. This should be your Google account that you use Gmail with.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-sign-in-to-gmail.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Sign in to Gmail</em></p>
<p>Now when we customize our email, we want to include the following:</p>
<ul>
<li><strong>To:</strong> wherever you want these sent to, probably the same account you signed into Gmail with</li>
<li><strong>From:</strong> select your Gmail account</li>
<li><strong>From Name:</strong> can be anything you’ll recognize, like I’ll use Colbybot</li>
<li><strong>Subject:</strong> can be whatever you’d like, but a helpful idea could be “New Job Alert:" followed by selecting the title from the dropdown selection</li>
<li><strong>Body Type:</strong> you can leave as Plain</li>
<li><strong>Body:</strong> I would recommend including all tokens you’ll find helpful including the Title, Description, and Link</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-gmail-email-configuration.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Configuring job notification email</em></p>
<p>Once you’re done configuring, you can hit continue. Then, similar to before, click <strong>Test &amp; Review</strong>, and you should receive your test email.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2020/07/zapier-gmail-test-email.jpg" alt="Image" width="600" height="400" loading="lazy">
<em>Test job alert email</em></p>
<p>Finally if you’re happy with the configuration, turn on the Zap, and enjoy your job search!</p>
<h2 id="heading-what-else-can-you-do">What else can you do?</h2>
<h3 id="heading-more-ideas">More Ideas</h3>
<p>Here’s more ideas to get you moving in the right direction:</p>
<ul>
<li><strong>Post Tweets to Slack:</strong> every time an account tweets or someone from a list of accounts tweets, post that tweet to Slack</li>
<li><strong>File Github Bugs to Jira:</strong> whenever someone tags a Github Issue with a label of “bug”, create a new ticket in Jira with that Issue details</li>
<li><strong>Post RSS Items to Twitter:</strong> do you write your own content? Set up an RSS feed to automatically post a tweet with your new blog post</li>
</ul>
<h3 id="heading-not-google-assistant">Not Google Assistant</h3>
<p>The only thing that it’s missing for me right now is Google Assistant, otherwise I would have included some Zap ideas for that. <a target="_blank" href="http://ifttt.com/">IFTTT</a> supports Google Assistant for simpler flows, but Zapier can get more powerful.</p>
<h3 id="heading-webhooks">Webhooks</h3>
<p>Zapier supports web hooks — meaning you can really do whatever you want. Though this <a target="_blank" href="https://zapier.com/apps/webhook/integrations">is a premium feature</a>, you can set up some custom workflows based off of new data Zapier sees or accept requests that you post to trigger other automations.</p>
<h2 id="heading-whats-your-favorite-zap">What's your favorite Zap?</h2>
<p>Love hearing new creative ways to use Zapier. <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[ 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 automate your project and Github repo setup from the command line ]]>
                </title>
                <description>
                    <![CDATA[ This post comes out of an irritation I faced personally, when I was first learning to code - setting up my local repo and syncing with Github. I learned by doing projects (often freeCodeCamp ones!). But I needed to make sure I didn't lose my hard wor... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/automate-project-github-setup-mac/</link>
                <guid isPermaLink="false">66d461c438f2dc3808b7912a</guid>
                
                    <category>
                        <![CDATA[ automation ]]>
                    </category>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Scripting ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Zubin Pratap ]]>
                </dc:creator>
                <pubDate>Tue, 20 Aug 2019 08:59:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/08/octo.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>This post comes out of an irritation I faced personally, when I was first learning to code - setting up my local repo and syncing with Github.</p>
<p>I learned by doing projects (often freeCodeCamp ones!). But I needed to make sure I didn't lose my hard work, and that others could see the hard work I was putting in, so every project <em>had</em> to go on Github. <a target="_blank" href="https://www.freecodecamp.org/news/learned-to-code-job-ready-and-heres-why/">The more complete projects I had on Github, the easier it would be for recruiters</a>. But the steps required to set up a project, initialise a repo, and sync with Github were really annoying and repetitive, so I decided to solve the problem.</p>
<p>Bad news: this isn't going to be a big, fancy, detailed and technically sexy post. It's going to be very un-sexy.</p>
<p>Good news: you don't need to be a shell scripting god(dess) to do it.</p>
<p>So my typical project setup work flow usually goes like this:</p>
<ol>
<li><p>Go to my <code>../projects</code> folder and run <code>mkdir project-of-some-name</code> to create a folder with the name <code>project-of-some-name</code>.</p>
</li>
<li><p><code>cd</code> into that project folder and do <code>git init</code> to initialise a local git repo in there.</p>
</li>
<li><p>run <code>touch README.MD</code> to create the <code>README</code> file, open it and add some basic descriptions, including links to the resources / tutorials I was implementing in that project. Save the file.</p>
</li>
<li><p>run <code>git add .</code> and then <code>git commit -m ' ...some initial commit message...</code></p>
</li>
<li><p>open a browser, go to Github, login, create a new (remote) repository, copy the url, return to my terminal, make sure I was in the correct project folder <code>project-of-some-name</code>...then run the git scripts needed to set up the remote repo as the 'upstream' repo and connect my local repo to it. Then, finally, I can run a <code>git push</code> and my local commit would get pushed up</p>
</li>
<li><p>lie down and take a nap, exhausted from this repetitive process.</p>
</li>
</ol>
<p>Admittedly, this was my process, but I liked to stay organised and always be able to access my projects so I can refer to them.</p>
<p>Since automation is a great way to practice your coding skills, I decided to write a small shell script that automates these horrible and repetitive steps. The script is at the bottom of this post, and be warned - it's not sophisticated or fancy. But it sure gets the job done, and I don't need to log in to Github and fool around will all those steps!</p>
<p>Before you copy the script, you need to know how to run it on your Mac. So below are the steps you need to implement to be able to use the script to automate your setup workflow.</p>
<ol>
<li><p>I keep my scripts in my root/home folder, in a sub-folder called <code>scripts</code>. I suggest you do the same or similar. To get to the root/home folder, in your terminal type <code>cd ~</code> because the tilda ( <code>~</code> )is the symbol for the home folder. In your Mac Finder app it shows up as the one with a house icon. So all my scripts are stored in <code>~/scripts</code></p>
</li>
<li><p>This matters because to run a shell script from any directory in the terminal, you have to type out the full path. In my case I have to type out <code>~/scripts/git-script.sh</code> to run the script. But we're getting ahead of ourselves.</p>
</li>
<li><p>copy the code chunk at the bottom of this post and then open a text editor, paste it in and then save it as <code>[filename].sh</code>. The <code>.sh</code> is the extension for shell scripts. Save the file in the directory you want to save it at - again I recommend <code>~/scripts</code> as the folder to save your scripts in.</p>
</li>
<li><p>Navigate to that folder in your terminal. To be safe run <code>ls</code> in the terminal to check that you can see the script is there. If it's not you're in the wrong folder or step 3 didn't successfully complete.</p>
</li>
<li><p>Make the shell script executable. To do that you type the following in the terminal: <code>chmod +x &lt;&lt;the-correct-filename.sh&gt;&gt;</code>. This is the unix way to make a shell script "executable". I'm not confident I fully understand what that means, other than it's needed to make any shell scripts you write executable, so don't ask me and I won't lie to you.</p>
</li>
<li><p>navigate to your projects folder and make a new folder that you intend to house your project. Effectively, you've got to do this: <code>mkdir</code> - create a <code>project-of-some-name</code> inside the folder where you keep all your projects. So your project will eventually be placed inside <code>my-computer/my-projects/project-of-some-name</code>. <code>cd</code> into this folder and then type <code>pwd</code> to get the full path. Copy that - you will need to paste it shortly. It should look like <code>my-computer/my-projects/project-of-some-name</code></p>
</li>
<li><p>open your terminal again, and then type <code>~/scripts/</code>&lt;&lt;the-correct-filename.sh&gt;&gt;``. The script runs! You will be guided through some input... The main steps are:</p>
<blockquote>
<p>what do you want to call your Github repo (<strong>don't use spaces-</strong> 'my-awesome-project' is good. Don't use 'my awesome project' as the repo name.</p>
<p>Enter a description that shows up in the Github repo's description. For this it's safe to use spaces.</p>
</blockquote>
</li>
</ol>
<blockquote>
<p>Enter the project path you got in step 6, the one that you get after typing <code>pwd</code> in the terminal and getting something like <code>my-computer/my-projects/project-of-some-name</code></p>
<p>enter your Github username (not email address) and then your Github password. Be careful as you type as these values don't show up on the screen.</p>
<p>....that's it. The script will set up your git repo locally inside <code>my-computer/my-projects/project-of-some-name</code> and then create a <code>README.MD</code> (blank) and then commit it locally, then set up a remote repo in Github (log you in via API) etc and then push everything up!</p>
<p>finally, you will see that the terminal you were interacting with has changed the currently active directory to your project folder. It will now be at <code>my-computer/my-projects/project-of-some-name</code> and you can type in <code>ls</code> and see the <code>README.MD</code> file. If you then type <code>git status</code> you will see your local repo's status (the state of your local project) and if you type in <code>git remote</code> it will show you the Github url for your project!</p>
</blockquote>
<p>Done! Happy Coding!</p>
<p>Annnd.....finally......here is the script! I've commented each step so you can reason your way through it.</p>
<pre><code class="lang-plaintext"># Make executable with chmod +x &lt;&lt;filename.sh&gt;&gt;

CURRENTDIR=${pwd}

# step 1: name of the remote repo. Enter a SINGLE WORD ..or...separate with hyphens
echo "What name do you want to give your remote repo?"
read REPO_NAME

echo "Enter a repo description: "
read DESCRIPTION


# step 2:  the local project folder path
echo "what is the absolute path to your local project directory?"
read PROJECT_PATH

echo "What is your github username?"
read USERNAME

# step 3 : go to path 
cd "$PROJECT_PATH"


# step 4: initialise the repo locally, create blank README, add and commit
git init
touch README.MD
git add README.MD
git commit -m 'initial commit -setup with .sh script'


# step 5 use github API to log the user in
curl -u ${USERNAME} https://api.github.com/user/repos -d "{\"name\": \"${REPO_NAME}\", \"description\": \"${DESCRIPTION}\"}"

#  step 6 add the remote github repo to local repo and push
git remote add origin https://github.com/${USERNAME}/${REPO_NAME}.git
git push --set-upstream origin master

# step 7 change to your project's root directory.
cd "$PROJECT_PATH"

echo "Done. Go to https://github.com/$USERNAME/$REPO_NAME to see." 
echo " *** You're now in your project root. ***"
</code></pre>
<h4 id="heading-thanks-for-reading">Thanks for reading!</h4>
<p>If you would like to learn more about my journey into code, check out <a target="_blank" href="http://podcast.freecodecamp.org/53-zubin-pratap-from-lawyer-to-developer">episode 53</a> of the <a target="_blank" href="http://podcast.freecodecamp.org/">freeCodeCamp podcast</a>, where Quincy (founder of freeCodeCamp) and I share our experiences as career changers that may help you on your journey. You can also access the podcast on <a target="_blank" href="https://itunes.apple.com/au/podcast/ep-53-zubin-pratap-from-lawyer-to-developer/id1313660749?i=1000431046274&amp;mt=2">iTunes</a>, <a target="_blank" href="https://www.stitcher.com/podcast/freecodecamp-podcast/e/59201373?autoplay=true">Stitcher</a>, and <a target="_blank" href="https://open.spotify.com/episode/4lG0RGpzriG5vXRMgza05C">Spotify</a>.</p>
<p>I will also hold a few AMAs and webinars in the coming months. If this is of interest to you please let me know by going <a target="_blank" href="http://www.matchfitmastery.com/">here</a>. And of course, you can also Tweet me at <a target="_blank" href="https://twitter.com/zubinpratap">@ZubinPratap</a>.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ The tools I use speed up my workflow and make myself more productive ]]>
                </title>
                <description>
                    <![CDATA[ By Egwuenu Gift Nearly every developer works with different tools on a daily basis to help them achieve their goals or complete specific tasks. In this post, I’ll outline the tools I use for my day to day activities. First thing I’ll like to do is de... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-tools-i-use-speed-up-my-workflow-and-make-myself-more-productive-fb6f457e242e/</link>
                <guid isPermaLink="false">66c3629b9539e75f2cc24a50</guid>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technology ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2019 16:02:34 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/0*mMyPDNu4VX8YBAki" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Egwuenu Gift</p>
<p>Nearly every developer works with different tools on a daily basis to help them achieve their goals or complete specific tasks. In this post, I’ll outline the tools I use for my day to day activities. First thing I’ll like to do is define a workflow.</p>
<h3 id="heading-what-is-a-workflow">What is a Workflow?</h3>
<p>A workflow is a series of events or tasks that processes a set of data. Workflows occur across every kind of business and industry. They are the paths that describe how something goes from being a work in progress to complete, or raw to processed.</p>
<p>Here’s an example: I have a workflow for writing articles. I start by looking for ideas for a post. Next, I create an outline. Then writing the actual content of the post to publishing all these are series of events to achieving a task.</p>
<p>As a developer, I tend to make use of certain tools that help speed up the process of completing a specific task. Even though a lot of these processes might be different for everyone, I still feel the need to share this with you. In the end, no knowledge is lost, right?</p>
<h3 id="heading-tools-i-use-to-help-speed-up-productivity">Tools I use to help speed up productivity</h3>
<p>This is going to be a broad list so I’ll try and split them into different categories, I’ll be highlighting the tools I use when coding, writing, and other tools I think you will find helpful in general.</p>
<h4 id="heading-coding-tools">Coding Tools</h4>
<p><strong>GitKraken</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/YK72CPA3QZeuwEetGzzlsmQPyffANI-st1cM" alt="Image" width="800" height="437" loading="lazy">
<em>GitKraken Homepage</em></p>
<p>I found out about this tool recently from a friend and I really love using it. I’m a big fan of using the command line over using GUI but this tool is much different. GitKraken is a GitHub client application that works just like the command line you are already used to but with intuitive UI/UX that makes for a great experience when you are using this over the command line.</p>
<p><strong>Insomnia</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/OEaTeU1EGtcvxSAgz6HzULk9oZn4tG2MB1XB" alt="Image" width="800" height="436" loading="lazy">
<em>Insomnia Homepage</em></p>
<p>This tool is another one I really like using. It is similar to Postman but also allows your query GraphQL endpoints which are cool right. Insomnia is a Powerful HTTP and GraphQL tool belt that is available on Mac, Linux and Windows platforms. Its features include GraphQL support, SVG and image previews, AWS authentication, etc.</p>
<p><strong>Visual Studio Code</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/wCgseNJdJY2Sgs0ivjspGSayXwUbsXtOWgph" alt="Image" width="800" height="436" loading="lazy">
<em>Visual Studio Code Homepage</em></p>
<p><a target="_blank" href="https://code.visualstudio.com/">Visual Studio Code</a> is a code editor that I really love using. I have been using for over a couple of years now and I’ve not found any reason to stop. With constant improvements and new features added regularly, this is my go-to choice for a code editor.</p>
<p><strong>Dash</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/cRJUlR2A4k64GrBBpwP3VoWOcsqRlmK1Xazj" alt="Image" width="800" height="374" loading="lazy">
<em>Dash website</em></p>
<p><a target="_blank" href="https://kapeli.com/dash">Dash</a> is a Mac application for developers that give you access to over 200+ API documentation offline for free. You can create your own docsets or even request for docs that are not included. For Windows users, an alternative for this app is Zeal App.</p>
<p><strong>SourceTree</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/1vuptJQ0D9PfspidRB5xNmoAEcsJgHQGqgur" alt="Image" width="800" height="435" loading="lazy">
<em>Sourcetree Homepage</em></p>
<p>Ever wanted to use GUI instead of the command line for Git? Then SourceTree is your best bet. I already mentioned GitKraken and they both do the same job — I usually alternate between both apps occasionally. So I’ll say use what works best for you they are both great apps.  </p>
<p><strong>Postico</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/JEXdp6P1sWsTtAgtGHEgv4lUrGDVKkPBB65p" alt="Image" width="800" height="345" loading="lazy">
<em>Postico Homepage</em></p>
<p><a target="_blank" href="https://eggerapps.at/postico/">Postico</a> is one client app for Postgres. It has a beautiful UI and it’s easily accessible. I prefer using this to other apps I’ve found or even using the Postgres command line.</p>
<p><strong>Hyper</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/OdXxNEkMdJJ2mI47Vk2CyXX54sRSGxjJM9ZY" alt="Image" width="800" height="436" loading="lazy">
<em>Hyper Homepage</em></p>
<p><a target="_blank" href="https://hyper.is">Hyper</a> is one tool I love using. It is, in fact, my default terminal for coding. Hyper is easily customizable with a lot of plugins to integrate into it making it a great choice for me.</p>
<h4 id="heading-writing-tools">Writing Tools</h4>
<p><strong>Notion</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Gc9GA6TDJTvj8yhDrhbCU8mwVKPAueMzqhK9" alt="Image" width="800" height="437" loading="lazy">
<em>Notion website</em></p>
<p><a target="_blank" href="https://notion.so">Notion</a> is a tool for almost everything you need. I’ve yet to come in contact with anyone with negative thoughts about this tool. It is super helpful. You can write, plan and collaborate with Notion.</p>
<p><strong>Dropbox Paper</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/WAF9nfEeQ5FRWPTbDmsgFrQHdaKa85acY9DE" alt="Image" width="800" height="433" loading="lazy">
<em>Dropbox paper website</em></p>
<p><a target="_blank" href="https://paper.dropbox.com">Paper by Dropbox</a> is a great tool for writing. I frequently use this in creating notes, writing a post, and a lot of other things. It supports markdown formatting.</p>
<p><strong>Bear App</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/-H4lfB070PrGtmfM8AisAK6z78tB53-3WQss" alt="Image" width="800" height="435" loading="lazy">
<em>Bear Website</em></p>
<p>I like variety, so pardon me If I have shared a lot of apps that perform similar tasks. Bear App is an app for crafting and writing anything. It can be used for writing articles, jotting down notes, and also as a todo list app.</p>
<p><strong>Caret</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/WfblHrqnsgTMDgWHk-E0I7v4Y6DCKxGTWy9G" alt="Image" width="800" height="432" loading="lazy"></p>
<p><a target="_blank" href="https://caret.io">Caret</a> is a markdown editor for Mac, Windows and Linux users. It enables you to write content in Markdown and also ships with quite a number of features that are really useful like dark mode which I really love.</p>
<h4 id="heading-deploying">Deploying</h4>
<p><strong>Netlify</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/k2HcUgs5PYHtbwel1MsqHzADF07bEyHKGzMt" alt="Image" width="800" height="430" loading="lazy">
<em>Netlify website</em></p>
<p><a target="_blank" href="https://www.netlify.com/">Netlify</a> is a tool I love using for deploying my apps. It is a unified platform that automates your code to create high-performant, easily maintainable sites, and web apps.</p>
<p><strong>GitHub Pages</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UWGYDVulQWrvppMzLnqpCzJTXAqckCFmS1nR" alt="Image" width="800" height="385" loading="lazy">
<em>GitHub Pages Website</em></p>
<p><a target="_blank" href="https://pages.github.com/">GitHub Pages</a> is quite useful when you need to spin up a deployed version of your website for free. With a few steps of setup from your git repository, you have a deployed website. I use this a lot.</p>
<p><strong>Zapier</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/fzuNBT9uo05hYXWRBfvHywKYdCwMrBXZhCKG" alt="Image" width="800" height="428" loading="lazy">
<em>Zapier website</em></p>
<p><a target="_blank" href="https://zapier.com/">Zapier</a> is an automation tool for automating virtually anything you can think of. I use it for automating tweets sent out when I publish a new article by creating a zap with my twitter account and my RSS feed.</p>
<h4 id="heading-miscellaneous">Miscellaneous</h4>
<p><strong>Rocket</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/pnJGV02WwJfza-Pbdbna6uh9zQIdrKHpF-w1" alt="Image" width="800" height="381" loading="lazy">
<em>Rocket website</em></p>
<p><a target="_blank" href="https://rocket.peachs.co/r/near-spy-5459">Rocket</a> is a slack-style emoji for your Mac. It works just like the emoji finder in Slack. Enter a colon when you want to use an emoji, type its name, and hit enter again to insert. It’s much more convenient than using Mac’s built-in emoji keyboard.</p>
<p><strong>Numi</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/lBHzqFuNp6wXR-ebXa8vXUplKSHL4t4K7EP2" alt="Image" width="800" height="431" loading="lazy">
<em>Numi Homepage</em></p>
<p><a target="_blank" href="https://numi.io/">Numi</a> is a calculator app for your Mac. This is not just a calculator, I must say, because its features are much more than that. It blew my mind when I discovered I could convert virtually anything with it, i.e convert dollars to naira, my local currency! ?</p>
<p><strong>Taskade</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/VRcfCA4rHjUb6ToTR9TuoleRackrhOJlrq9p" alt="Image" width="800" height="430" loading="lazy">
<em>Taskade website</em></p>
<p><a target="_blank" href="https://www.taskade.com/">Taskade</a> is an application with a lot of features. I use this for todo lists, my weekly planner, and also for creating notes. Meanwhile, there are a whole lot of things that can be done with this app. No wonder it is tagged as an instant collaboration tool for Agile teams.</p>
<p><strong>RecordIt</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/xzEGIXyCrbnavhRaHgLioOsxGZFZpbJEFbDt" alt="Image" width="800" height="432" loading="lazy">
<em>Recordit website</em></p>
<p><a target="_blank" href="http://recordit.co/">RecordIt</a> is an application for recording screencasts. I find this really helpful for when I need to create a quick demo or show how a particular thing works in gif format.</p>
<p><strong>Aware</strong></p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/Md1t7qiYhFfZAPEiRTOnU6qH0BIZWRAn6KbR" alt="Image" width="800" height="408" loading="lazy">
<em>Aware website</em></p>
<p><a target="_blank" href="https://awaremac.com/">Aware</a> is a Mac application that helps you keep track of how long you’ve been actively using your computer. I use this keep track of the time I spend working or completing a particular task.</p>
<h4 id="heading-conclusion"><strong>Conclusion</strong></h4>
<p>I hope you find all these tools listed useful and start using them to make your job a lot easier. The idea is to share with you tools I found helpful, and really I’d like it if you can also share with me tools you have found useful that are not listed here. Let’s all stay productive!</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ A better web development workflow: Confluence, Airtable and more ]]>
                </title>
                <description>
                    <![CDATA[ By Vince MingPu Shao Working as a front-end developer for nearly two years, I’ve got helpful experience from being part of several web development projects of design/digital agencies. One obvious but valuable lesson I’ve learnt is that collaborating ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/a-better-web-development-workflow-confluence-airtable-jira-abstract-e626ef4ff5bc/</link>
                <guid isPermaLink="false">66d4617137bd2215d1e245f8</guid>
                
                    <category>
                        <![CDATA[ Design ]]>
                    </category>
                
                    <category>
                        <![CDATA[ management ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ workflow ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Thu, 04 Apr 2019 17:38:58 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*K3DXpE4GwzoHTtFrrvF6Rw.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Vince MingPu Shao</p>
<p>Working as a front-end developer for nearly two years, I’ve got helpful experience from being part of several web development projects of design/digital agencies.</p>
<p>One obvious but valuable lesson I’ve learnt is that collaborating between each groups with one goal but distinct responsibilities and purposes is not easy. There’re different aspects and levels of difficulties in terms of collaboration, and the specific part of which I’d like to address here is workflow process.</p>
<p>Based on my experience, and with the help from my designer and developer friends, I built a website development workflow designed for small team (5–15 people). The system is composed of <a target="_blank" href="https://www.atlassian.com/software/confluence">Confluence</a>, <a target="_blank" href="https://www.atlassian.com/software/jira">Jira</a>, <a target="_blank" href="https://airtable.com/">Airtable</a> and <a target="_blank" href="https://www.abstract.com/">Abstract</a>. In this article, I’ll share the why and how of the this workflow.</p>
<h3 id="heading-motivation-for-building-a-new-workflow"><strong>Motivation for building a new workflow</strong></h3>
<p>To deliver a customized website without using templates provided by <a target="_blank" href="https://www.wpbeginner.com/beginners-guide/how-to-choose-the-best-website-builder/">website builders</a>, the minimum talent requirements includes a designer, developer and project manager. After participating in a couple of cases, I had a sense that there was something wrong with the workflow we had: important information was always not aligned both internally between different roles and externally to the client. This inefficient communication was clearly slowing down the development cycle and hurting the team.</p>
<p>So I started to solve this problem.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/OvSIwKWcr0uLNPIPbzpIfRHQS9zaHGbsbAbi" alt="Image" width="800" height="367" loading="lazy">
_Google search workflow great resources: [workflow definition](https://medium.com/eightshapes-llc/system-features-step-by-step-e69c90982630" rel="noopener" target="_blank" title=""&gt;Design systems features, <a href="http://styleguides.io/" target="_blank">style guide resources</a> and &lt;a href="https://www.projectmanager.com/training/define-workflow-process" rel="noopener" target="<em>blank" title=")</em></p>
<p>I Google searched resources about establishing and improving a workflow. Though I learned a lot from all the great resources, I found nearly none of which was for web development projects in a design/digital agency. It was either a design system or coding guidelines that scoped in design or front-end roles, or a workflow that was built for a team with its own product.</p>
<p>As a result, I decided to cherry pick the parts I needed to solve our problems, and formed a customized workflow for website development.</p>
<h3 id="heading-problems-and-goals"><strong>Problems and goals</strong></h3>
<p>Following are the problems I inspected from our existing workflow, and the corresponding improvement goals:</p>
<h4 id="heading-1-waterfall-methodology"><strong>1. Waterfall methodology</strong></h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/DoyhUSqgX3dzSOt-H13itXsiXmdgnBidIS0V" alt="Image" width="800" height="514" loading="lazy">
<em>waterfall model abstract demo</em></p>
<p><strong>Problem:</strong> Based on my experience, website projects adopt a waterfall approach because clients don’t have a concept of a minimum viable product (MVP). Instead of splitting functionalities from views and modulization, clients tend to think about the site in a traditional page-by-page way, which forces both designers and developers to work page by page in sequence. This causes them to lose a universal perspective across the project. This situation results in lots of back-and-forth redundant revisions between pages.</p>
<p><strong>Goal:</strong> Changing the mindset of clients is both arrogant and unrealistic. The goal is to find a way to separate requirements from views as soon as possible and develop in as as modulized a way as possible internally based on page-by-page model.</p>
<h4 id="heading-2-universal-design-tokens-and-components-managed-by-both-designers-and-developers"><strong>2. Universal design tokens and components managed by both designers and developers</strong></h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/vvgm0WaDEKF0T2cOXCKFxtTvQU8cv1542eZe" alt="Image" width="800" height="514" loading="lazy">
_design tokens from [Salesforce](https://www.lightningdesignsystem.com/design-tokens/" rel="noopener" target="<em>blank" title=")</em></p>
<p><strong>Problem:</strong> This is a common issue that a lot of articles have shared great solutions to, which mostly propose building a design system that’s managed by <a target="_blank" href="https://github.com/davidhund/styleguide-generators#user-content-nodejs">style guide/library generators</a>. Though it is great solution, managing an extra site that barely provided edit permission to designers was not appropriate in our situation.</p>
<p><strong>Goal:</strong> Except for creating universal design tokens and languages that designers, developers and managers can all understand, build a system that allows everyone to manage the assets in a synchronous way.</p>
<h4 id="heading-3-accurate-updated-progress-dashboard"><strong>3. Accurate, updated progress dashboard</strong></h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/FwCH5YpT2UsHNFtkhBFjwA0X5EYvii65dZ2G" alt="Image" width="800" height="514" loading="lazy">
<em>we need an editable and accessible progress dashboard</em></p>
<p><strong>Problem:</strong> Though issue trackers, kanban, and more project management models are useful and practical, most of them failed to act as a straightforward, flexible and friendly progress dashboard. This kind of dashboard would save the team a lot of time because it would prevent team members from actively reporting or asking about the current situation of specific tasks. It also makes managers’ lives easier if they have a clear knowledge of the entire project without too much effort.</p>
<p><strong>Goal:</strong> Build a dashboard system that provides edit permission for individuals in charge of specific tasks.</p>
<h3 id="heading-workflow-diagram"><strong>Workflow diagram</strong></h3>
<p>Before we dive into the detail introduction of the management tools stack, let’s take a look at the abstract simplified workflow I organized. It’s pretty much just a visualization of a normal workflow that most agencies have, but there’s two points to be noted here.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/KJYSglCts4eVtawsVirn4A5Yk0q9uX0mb8kL" alt="Image" width="800" height="403" loading="lazy">
<em>workflow diagram I designed</em></p>
<h4 id="heading-1-developer-evaluation"><strong>1. Developer evaluation</strong></h4>
<p>First, when requirements or issues coming from the client are approved and documented by manager, with the exception of sending the task to a designer, they also go to a developer for evaluation. In this process, the developer reviews the specification of the task, checking if there are any rather complicated functions or features included. If it’s positive, the developer could start working on it or notify the designer about the potential problems beforehand.</p>
<h4 id="heading-2-single-source-of-truth"><strong>2. Single source of truth</strong></h4>
<p>Also notice that after design deliverable is approved by the client, and before handing the task over to the developer’s hand, it goes through a process of <strong>register/modify/delete over design store</strong> conducted by the designer. This is because the developer should always be exposed to one and only one source of design store, which contains constantly maintained and updated assets ready for development.</p>
<p>Now we can dive into the management tools stack I prepared and see how the tools help us solve our problems.</p>
<h3 id="heading-the-tools-stack"><strong>The tools stack</strong></h3>
<p>After experimenting with various options on the market, the stack I’m proposing here is composed of <a target="_blank" href="https://www.atlassian.com/software/confluence">Confluence</a>, <a target="_blank" href="https://www.atlassian.com/software/jira">Jira</a>, <a target="_blank" href="https://airtable.com/">Airtable</a> and <a target="_blank" href="https://www.abstract.com/">Abstract</a>. In addition to basic introduction and few key application examples, I’ll not cover all the details of using the tools.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/gsTUQmkRJBddtnziPdjtqnVDMbVjnhBXhPTU" alt="Image" width="800" height="325" loading="lazy">
_[ABEM](http://atomicdesign.bradfrost.com/" rel="noopener" target="_blank" title=""&gt;atomic design and &lt;a href="https://css-tricks.com/abem-useful-adaptation-bem/" rel="noopener" target="<em>blank" title=")</em></p>
<p>Note: the system assumes that the development team adopts the <a target="_blank" href="http://atomicdesign.bradfrost.com/">atomic design methodology</a> and <a target="_blank" href="https://css-tricks.com/abem-useful-adaptation-bem/">ABEM</a> naming system.</p>
<h3 id="heading-1-confluence"><strong>1. Confluence</strong></h3>
<p><strong>Role:</strong> information and resource center</p>
<p>Though it’s intimidating at first, <a target="_blank" href="https://www.atlassian.com/software/confluence">Confluence</a> provides a powerful workspace that’s easy to organize, and it has tons of features, integration of apps, and customized templates. It’s definitely not a universal solution to all problems, but it’s perfect for documentation of specifications, requirements, meeting notes and more.</p>
<p>Therefore, Confluence in this stack works as an information and resource center, which means every related link and detail about this project should be documented properly in here.</p>
<p>My favorite advantage of Confluence is the ability to customize document templates. This feature makes it really convenience to standardize the workflow.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/zukI9t8HsDbd772oHP5IU5AYp0FdmHsLxccu" alt="Image" width="800" height="462" loading="lazy">
<em>developer evaluation stage</em></p>
<h4 id="heading-example-component-functionality-review"><strong>Example:</strong> Component functionality review</h4>
<p>I mentioned the <strong>developer evaluation process</strong> above, which is actually a complicated job. This is because this process includes basic information of the component, a developer’s <a target="_blank" href="https://www.vinceshao.com/blog/how-to-design-ui-states-and-communicate-with-developers-using-fsm-table">FSM review</a> (if necessary), FAQ space and more. But the flexibility of the template and tools Confluence provides makes this super easy. Just build a template in configuration settings and you’re good to go.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/S58FbHZlVK5HY-YykmaxzZIb51ggDDM2gvzu" alt="Image" width="800" height="452" loading="lazy">
<em>custom template for component review in Confluence</em></p>
<h3 id="heading-2-jira"><strong>2. Jira</strong></h3>
<p><strong>Role:</strong> issue tracking and action type management</p>
<p>Also a member of the Atlassian family, <a target="_blank" href="https://www.atlassian.com/software/jira">Jira</a> is a super powerful issue tracking and project planning software. My favorite part about it is making customized issue workflows. Since there are tons of great tutorials on how to utilize power of Jira, the only thing I want to point out here is using issue type as mentioned below.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/qoZ5zv8GbyTHSKRLnEj8g2oI6ybCj6xreaTG" alt="Image" width="800" height="462" loading="lazy">
<em>designer update design store</em></p>
<h4 id="heading-example-update-developer-on-changes-of-design-store-by-issue-typehttpsconfluenceatlassiancomjiraportfolioserver024configuring-initiatives-and-other-hierarchy-levels-934716034html"><strong>Example:</strong> Update developer on changes of design store by <a target="_blank" href="https://confluence.atlassian.com/jiraportfolioserver024/configuring-initiatives-and-other-hierarchy-levels-934716034.html">issue type</a></h4>
<p>To ensure that developers are building the components based on correct design views, they need to be notified whenever something in the design store is being updated, which includes actions like <strong>register, modify and delete</strong>. So, as a component is updated, the designer should open an issue with the responsible developer assigned and the correct issue/action type selected.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/T7JTRAHQx4Pix-oLPoiMXbQP2weMpxoskBFv" alt="Image" width="800" height="439" loading="lazy">
_[Jira issue types function](https://confluence.atlassian.com/jiraportfolioserver024/configuring-initiatives-and-other-hierarchy-levels-934716034.html" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-3-airtable"><strong>3. Airtable</strong></h3>
<p><strong>Role:</strong> component management and progress dashboard</p>
<p><a target="_blank" href="https://airtable.com">Airtable</a>, a mixture of spreadsheet and database, is the thing that makes this stack work. There’s two amazing features that support my workflow: four types of view transition in single table and related content linking. I’ll showcase two examples of using these two features here.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/peF16s69oSsbNSBglXcfYq5EepGzbXF9HNi8" alt="Image" width="800" height="463" loading="lazy">
<em>developer starts working on the task</em></p>
<h4 id="heading-example-1-component-management"><strong>Example 1:</strong> Component management</h4>
<p>How do you manage your component library? We chose not to use a style guide generator, because it’s not accessible for designers to edit. Using the Sketch component library wasn’t appropriate either, because it’s has too many limitations if we tried to use it outside the scope of the software itself.</p>
<p>I wouldn’t say Airtable is a perfect solution, but it’s the easiest and most flexible option I could think of. Take a look at the demo template of the component management table here:</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/h825KA9cEz3P3tgn911Lq8GHP9nXGDp8RSGc" alt="Image" width="800" height="489" loading="lazy">
<em>component table</em></p>
<p>Once a newly registered design view that’s ready to be developed programmatically is submitted to the developer, they would asses the view based on the ABEM system, and register it into the table. There are 9 columns in the table, including:</p>
<p><strong>1. Name:</strong> naming of the component in ABEM principle</p>
<p><strong>2. Preview:</strong> screenshot or exported image of component</p>
<p><strong>3. Linked page:</strong> link to the page contains this component</p>
<p><strong>4. Children component:</strong> link to children components contains this one</p>
<p><strong>5. Modifier:</strong> checks if there’s style variations (ex: — active, — red)</p>
<p><strong>6. Component category:</strong> a general category classification (ex: text, hero, sidebar)</p>
<p><strong>7. Development status:</strong> status of development progress (pending, assigned, in progress, complete, in revision)</p>
<p><strong>8. Assignee:</strong> developer responsible for this component</p>
<p><strong>9. Atomic level:</strong> atomic category of this component (atom, molecule, organism)</p>
<p>The best thing here is that you can reference data in both the same and other tables. This connection of dots prevents things from getting messier as the scale grows. Also notice that you can filter, sort and change views easily.</p>
<h4 id="heading-example-2-page-development-status"><strong>Example 2:</strong> Page development status</h4>
<p>Since the assumption here is that we’ll inevitably asses development progress page by page, a table template designed for this purpose is necessary. This table can be a progress dashboard for both internal teams and shared with client at the same time.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/UBnBd4zGsyJu7Yeiq01oSwuvSB8J1R39muZx" alt="Image" width="800" height="488" loading="lazy">
<em>page list table</em></p>
<p>Any information about the page, including deadline, InVision prototype link, assignee, and children component can be organized here. Note that it’s very convenient to document and update design, front-end, and back-end development status at the same time.</p>
<h3 id="heading-4-abstract"><strong>4. Abstract</strong></h3>
<p><strong>Role:</strong> single source of truth and design assets version control</p>
<p><a target="_blank" href="https://www.abstract.com/">Abstract</a> is <a target="_blank" href="https://github.com/">GitHub</a> for <a target="_blank" href="https://www.sketchapp.com/">Sketch</a> assets that saves designers from the hell of copying and pasting files. It’s out of this article’s scope to demonstrate details of managing version control flow. The key takeaway here is that Abstract is the design store that acts as the <strong>single source of truth</strong>. Designers should keep updating master branch to the latest version of confirmed design and then notify developers. On the other hand, developers should only take design assets in the master branch as reference.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/gyVsOvJOSx72uhwZNAPIV0nrHNh5DfuZsrMa" alt="Image" width="800" height="439" loading="lazy">
_[Abstract branch template](https://www.abstract.com/how-it-works/" rel="noopener" target="<em>blank" title=")</em></p>
<h3 id="heading-more-work-to-be-done">More work to be done</h3>
<p>From my own experience, development of the entire project after adopting this new workflow has been at least two times faster than before. It’s not a perfect solution, because it still requires lots of manual labor to update and maintain.</p>
<p>But I think it could be aa helpful reference to website development teams searching for aa better workflow, and hopefully more people can share their workflows in the future!</p>
<hr>
<p><em>?<a target="_blank" href="https://medium.com/as-a-product-designer/a-better-web-development-workflow-confluence-airtable-jira-abstract-zh-24fc8d5b8329">中文</a></em><a target="_blank" href="https://medium.com/as-a-product-designer/a-better-web-development-workflow-confluence-airtable-jira-abstract-zh-24fc8d5b8329"><em>版連結 (Chinese version)</em></a>  <em>/ Originally posted on</em> <a target="_blank" href="https://www.vinceshao.com/blog/a-better-web-development-workflow-confluence-airtable-jira-and-abstract"><em>vinceshao.com</em></a></p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
