<?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[ Kealan Parr - 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[ Kealan Parr - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sun, 24 May 2026 16:29:53 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/author/kealanparr/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ What is Trunk Based Development? A Different Approach to the Software Development Lifecycle ]]>
                </title>
                <description>
                    <![CDATA[ The Software Development Lifecycle (SDLC) is different at every company. The version control system used, peer review process, code review process, design review process, how you do CI, automated testing, and manual testing – all vary greatly dependi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-trunk-based-development/</link>
                <guid isPermaLink="false">66bc5609da80a491ea5a5f6d</guid>
                
                    <category>
                        <![CDATA[ development process  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Tue, 18 Jun 2024 12:55:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/01/Trunk-based-development.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>The <strong>Software Development Lifecycle</strong> (<strong>SDLC</strong>) is different at every company.</p>
<p>The version control system used, peer review process, code review process, design review process, how you do CI, automated testing, and manual testing – all vary greatly depending on where you work.</p>
<p>How a company plans, writes, builds, reviews, deploys, and releases software is optimized for their particular use-case, all with their own strengths and drawbacks in mind.</p>
<p>I started reading about how different big tech companies run their Software Development Lifecycles (<strong>SDLC)</strong> and heard the term <strong>Trunk</strong>-<strong>Based Development</strong> a few times. This is a practice Google follows and I was curious about how it's different than the way most other companies develop software.</p>
<h2 id="heading-two-different-ways-to-do-branching">Two Different Ways to Do Branching</h2>
<h3 id="heading-release-branching">Release Branching</h3>
<p>There are two common approaches to enable multiple developers to work on one codebase.</p>
<p>The first we'll refer to as the <strong>release </strong>branching<strong>** method. I've also seen it called </strong>feature branching**. But both of these same approaches follow the same general pattern.</p>
<p>Usually via Git, developers all clone the codebase (so they all have identical copies on their machines). Then they make a new feature/release branch based on <code>main</code>, and merge as the work is completed. The emphasis here is that they only merge once, at the end, when all the work is complete – and they merge the <em>whole branch</em> into <code>main</code>.</p>
<p>Here's an overview for how developers use the <strong>Release </strong>Branch<em>**</em> method:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/06/ex1.png" alt="Image" width="600" height="400" loading="lazy">
<em><strong>Release </strong>Branching<strong> </strong>development workflow visualised.</em></p>
<p>The white dots represent commits, and the bottom solid black line is <code>main</code>. This is a very simple example, as <strong>release branches</strong> often end up with far more commits than I've shown in the diagram (sometimes hundreds).</p>
<p>Developers branch off <code>main</code>, make their changes, and then when it's complete/has passed code QA, it gets merged back into <code>main</code>. That's <strong>release branching</strong>.</p>
<h3 id="heading-trunk-based-development-tbd">Trunk Based Development (TBD)</h3>
<p><strong>T</strong>runk-<strong>B</strong>ased <strong>D</strong>evelopment (TBD) is the second approach. Here, each developer splits the work they will do into small batches and merge into <code>main</code> (which is often referred to as the <strong>trunk</strong>) multiple times.</p>
<p>In small teams, they normally don't create a branch and merge the branch into the trunk. They commit <em>directly</em> into the trunk without branches.</p>
<p>In a larger team (with checks and approvals necessary for MR's), they use <em>short-lived</em> branches. One <strong>release branch</strong> with 100 commits in TBD would be 10 merge requests with 10 commits each.</p>
<p>In TBD, their code changes generally don't stay around for more than a few hours. They constantly get merged and integrated with the code everyone else is writing.</p>
<p>Jez Humble is a Site Reliability Engineer at Google, and author of <a target="_blank" href="https://www.amazon.com/dp/0321601912?tag=contindelive-20">Continuous Delivery</a>, who says "branching is not the problem, merging is the problem" – which is exactly what TBD tries to solve.</p>
<p>It aims to avoid painful merges that so often occur when it is time to merge long-lived branches that have diverged histories from the trunk, or even merge multiple branches together into one from different teams/developers before merging with the trunk.</p>
<h2 id="heading-does-tbd-work-at-scale"><strong>Does TBD Work at Scale?</strong></h2>
<p>In a <a target="_blank" href="https://www.youtube.com/watch?v=W71BTkUbdqE">Google talk</a>, Rachel Potvin, who's an Engineering Manager at Google, described one codebase that has (as of Jan 2015):</p>
<ul>
<li>1 billion files</li>
<li>2 billion lines of code</li>
<li>86 terabytes of content</li>
<li>45,000 commits per workday</li>
<li>15 million lines changed in 250,000 files per week</li>
</ul>
<p>They used TBD in this codebase and it served their use cases very well. As Google is made up of many talented (most importantly, <strong>experienced</strong>) engineers, they rarely break their builds.</p>
<p>Google also has a very thorough, strict code QA process (read about it <a target="_blank" href="https://www.freecodecamp.org/news/what-google-taught-me-about-code-reviews/">here</a>) which, when using TBD, allows for fast, efficient software delivery.</p>
<p>TBD also works well for Agile methodologies where you have to ship software frequently to get feedback from your consumers/customers. You can continually integrate and get a good snapshot of your current state.</p>
<p>Let's briefly discuss some TBD strengths.</p>
<h3 id="heading-strengths-of-tbd">Strengths of TBD</h3>
<ul>
<li>Feedback (whether from code QA, or peer review) comes quickly, as you merge daily. This can stop you from doing the wrong thing for 3 weeks, and then getting feedback that your work isn't correct at the very end, causing you to miss deadlines.</li>
<li>There's a mental benefit to TBD, where developers feel like the trunk is <strong>our</strong> code, rather than everyone having their own feature branches and thinking this branch is <strong>my</strong> code. This can foster a more collaborative culture, increasing communication.</li>
<li>It results in early integration with all the other in-flight projects/tickets and helps you promote code re-use. It's much harder to "use code" that isn't merged into <code>main</code> and you don't know when will be complete. It also stops merge hell when your 9 month old release branch needs to be merged back into the trunk.</li>
<li>Large projects with lots of work involved are forced to be broken down into smaller deliverables. This is much better for estimating timelines and also for breaking up your code into modular pieces.</li>
<li>When lots of developers work in isolation on release branches, it can be harder to spot junior developers struggling in their own branch. But if they're expected to be committing their work daily, you can monitor their daily output and assist them when necessary.</li>
<li>TBD really cleanly ties in with continuous integration. With lots of small, incremental commits to an eventual finished project, you get an always tested, always integrated codebase with (minimal) horrible merges.</li>
</ul>
<h3 id="heading-weaknesses-of-tbd">Weaknesses of TBD</h3>
<ul>
<li>One of the challenges of this approach is that you have an increased chance of breaking the trunk, and stopping lots of people from working. You have to make sure your commits run unit tests along with a good code review process so you don't lose time reverting commits all day.</li>
<li>Your commit history into <code>main</code> will likely be more verbose and it can be harder to see if something is wrong. If you are called at 3 AM and asked to fix a bug on your prod site with some dodgy commits that went on during business hours, would you prefer a day with 1 commit or 200 commits?</li>
<li>If you don't have a fast build process, you will spend a long time waiting for things to build while your team constantly commits.</li>
<li>Often times with TBD you are incrementally adding new code to do something new, but you also need the "old" paths you're replacing to still work. Because of this you need to rely on feature toggles (normally from a database) to turn things on and off. This can add an extra level of complexity with debugging.</li>
<li>A final challenge can be that, when you have constant commits, you are constantly in a state of churn. You need to make sure your team regularly pulls from the trunk and doesn't end up tripping over one another while merging things.</li>
</ul>
<h2 id="heading-how-to-release-software-with-trunk-based-development">How to Release Software with Trunk-Based Development</h2>
<p>Teams using TBD will typically have a different release process than a team using feature branches.</p>
<p>Generally, if you use release branches, you release <code>main</code> whenever you have something that gets merged in (tickets, completed projects, and so on). Or some teams release <code>main</code> on a schedule, like once every week.</p>
<p>Here's an overview of how TBD teams do their releases:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/06/ex2.png" alt="Image" width="600" height="400" loading="lazy">
<em>Overview of TBD process</em></p>
<p>In TBD, branching is used for releases to allow everyone to keep committing into <code>main</code>.</p>
<p>They provide a "snapshot" of your codebase at a stable state, ready for deployment and release.</p>
<p>The only reason the TBD diagram above may need extra details is when something goes wrong with the release of prj-123. Then we commit the result into the trunk and cherry pick the commits into our release branch to get it in a workable state as soon as possible.</p>
<p>Some places, if they are releasing regularly, don't even branch and can just release the trunk whenever it's required. It depends on your company oftentimes.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>There is a whole site based on the theory and practice of TBD. Feel free to read more <a target="_blank" href="https://trunkbaseddevelopment.com/">here</a>.</p>
<p>I hope this has explained what <strong>Trunk Based Development</strong> is and why it's used. It certainly helps alleviate some of the issues around merging long-lived branches containing major rewrites.</p>
<p>I share my writing on <a target="_blank" href="https://twitter.com/kealanparr">Twitter</a> if you enjoyed this article and want to see more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What Does "Shift Left" Mean in Software Development? ]]>
                </title>
                <description>
                    <![CDATA[ I once had a manager who, in a discussion about our project, mentioned that we needed to try and shift our work left as much as we could.  A few months later in an interview, the interviewer asked me if I knew what "shift left" meant. Unless there's ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-shift-left-in-software/</link>
                <guid isPermaLink="false">66bc5601cd8a65d579e3aa0b</guid>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 15 Apr 2024 22:25:08 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/03/Shift-Left-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I once had a manager who, in a discussion about our project, mentioned that we needed to try and <strong>shift our work left</strong> as much as we could. </p>
<p>A few months later in an interview, the interviewer asked me if I knew what "<strong>shift left</strong>" meant.</p>
<p>Unless there's a secret software-dance someone didn't tell me about, I'm now here to tell you what <strong>shift left</strong> means.</p>
<h2 id="heading-what-does-it-mean-to-shift-left-in-software">What Does it Mean to Shift Left in Software?</h2>
<p>To shift left is a technical term meaning to try and identify problems as early as you can in your software project lifecycle. </p>
<p>The 'left' means the beginning of the project, and it's a phrase that just means "let's try and catch as many of our issues, blockers, and problems as early as we can."</p>
<h2 id="heading-the-software-development-lifecycle">The Software Development Lifecycle</h2>
<p>Let's say you're starting a new job as a software engineer at a bank.</p>
<p>Your software development lifecycle may look something like this:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2024/03/image-110.png" alt="Image" width="600" height="400" loading="lazy">
<em>Example Software Development Lifecycle</em></p>
<ol>
<li>First, requirements are provided by your Product Managers.</li>
<li>Then the analysis to complete this work is completed by your Business Analysts. </li>
<li>Designs get created for the way the UI needs to look.</li>
<li>The devs do their own planning now.</li>
<li>Then the devs begin the work!</li>
<li>Piece by piece the feature gets built and the testers can test.</li>
<li>The project goes through the environments on its way to production. It passes dev. It passes test. It reaches pre-production, and is released to production.</li>
<li>The project enters a maintenance period. You check for any issues in your logs, you fix any bugs that arise.</li>
</ol>
<p>A few examples of <strong>shifting our work left</strong> in this cycle, would be the following:</p>
<ul>
<li>Checking the requirements by the technical team to make sure everything asked for can be completed, in the timeframe expected.</li>
<li>The architects get involved early in the planning stage and try to make tech documents and spot any edge cases or problems the developers might face.</li>
<li>Maybe the designers make a basic prototype from the designs, to illustrate exactly what is expected.</li>
<li>When the devs plan, they are given enough time to do a thorough review. It's not a short 15 minute meeting. They are expected to produce class diagrams, code architectural improvements, accurate estimates, they plan for their unit test suite, and they ensure relevant documentation gets updated.</li>
<li>Testers do manual testing, as well as automated testing. They use the software like a real user would!</li>
</ul>
<h3 id="heading-when-do-we-commonly-find-issues">When do we commonly find issues?</h3>
<p>Let's think about the times we could commonly catch a bug in a project. Try and think when you would prefer to catch an issue.</p>
<ul>
<li>At the end of the project, when all the code has been written, and it's already been released to production for 2 weeks</li>
<li>As you release it into the pre-production environment</li>
<li>By the tester on the <em>testing</em> environment</li>
<li>As the devs are in the middle of coding</li>
<li>As the devs are doing their planning</li>
<li>When the designs are being created</li>
<li>When the architects are making their architectural diagrams</li>
<li>As the product managers are specifying requirements</li>
</ul>
<p>The place in this timeline that you can most easily respond to the issue, lose minimal time, and quickly rectify it is <strong>right at the start</strong>. And you can help your team get there by shifting your work left.</p>
<h2 id="heading-there-are-many-ways-to-catch-errors">There Are Many Ways to Catch Errors</h2>
<p><strong>Shift left</strong> is a phrase, but it's based on a whole methodology that helps us try and catch issues early for fast iteration cycles to deliver software.</p>
<p>So what are some more steps we could try that would help us <strong>shift our work left</strong>?</p>
<p>Beyond just planning things better, what else can we do?</p>
<ul>
<li>You can lint your codebase and catch typos, common errors, and bad design.</li>
<li>You can introduce type checking into parts of your codebase you think would benefit from it.</li>
<li>You can increase your unit test coverage.</li>
<li>You can increase your integration test coverage.</li>
<li>You can introduce code QA's in your team.</li>
<li>You can introduce logging and metric alarms for deploys.</li>
</ul>
<p>Just remember, the later in the flow of your project you go, the more difficult it can be to recover from an error. Catch problems as far left as you can! 😉</p>
<p>Because if your team doesn't find the bug, you can always bet a user will.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>I hope this has been useful, and has explained what "shift left" means. Try to incorporate this way of thinking into your development lifecycle and see what happens.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Abstraction in Coding? A Guide for Beginners ]]>
                </title>
                <description>
                    <![CDATA[ I've met and talked to multiple new coders recently, and I see a common mistake they all seem to make. They don't embrace and understand abstractions in their code, or in their learning. But what are abstractions? And why are they important? Let's di... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-abstraction-in-coding/</link>
                <guid isPermaLink="false">66bc55f6da80a491ea5a5f65</guid>
                
                    <category>
                        <![CDATA[ abstraction ]]>
                    </category>
                
                    <category>
                        <![CDATA[ beginners guide ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Tue, 19 Mar 2024 22:29:31 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2024/03/EmbraceAbstractions-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I've met and talked to multiple new coders recently, and I see a common mistake they all seem to make.</p>
<p>They don't embrace and understand <strong>abstractions</strong> in their code, or in their learning.</p>
<p>But what are <strong>abstractions</strong>? And why are they important?</p>
<p>Let's dive in!</p>
<h2 id="heading-what-is-an-abstraction">What is an Abstraction?</h2>
<p>In coding, developers often use <strong>abstractions</strong> to simplify a system. <strong>Abstractions</strong> are a way of hiding complicated details from the end user, and trying to simplify whatever task you're trying to do.</p>
<p>But abstractions can be used in more than just code, so let's start with an example.</p>
<h3 id="heading-coffee-machine-abstractions">Coffee machine abstractions</h3>
<p>Imagine if you were creating a machine to make coffee for your users. There could be two approaches:</p>
<h4 id="heading-how-to-create-it-with-abstraction"><strong>How to Create it With Abstraction</strong></h4>
<ul>
<li>Have a button that says "Make coffee"</li>
</ul>
<h4 id="heading-how-to-create-it-without-abstraction"><strong>How to Create it Without Abstraction</strong></h4>
<ul>
<li>Have a button that says "Boil the water"</li>
<li>Have a button that says "Add the cold water to the kettle"</li>
<li>Have a button that says "Add 1 spoon of ground coffee to a clean cup"</li>
<li>Have a button that says "Clean any dirty cups"</li>
<li>And all the other buttons</li>
</ul>
<p>Can you see how, when we use abstraction, we don't expect the user to know how the machine makes coffee? But in the machine without abstraction, the user has to know in which order to press each button, which forces the user to understand how the coffee is made.</p>
<h2 id="heading-why-you-should-abstract-your-details">Why You Should Abstract Your Details</h2>
<p>When we use abstractions well, we make our system/codebase/task and so on much easier to understand and use. By hiding away complicated details inside a module, class, prototype, or function, we can make a super simple way to do complicated things.</p>
<p>So for example, let's say we have some complex code that ends up doing lots of complex, hard to understand math. We can wrap all that logic up in a function and provide a really easy interface where you just pass in your number and the function will do the work. </p>
<p>Developers in all languages and across all ecosystems make use of abstractions. The NodeJS team doesn't force you to understand how to modify 0's and 1's on a hard-drive to save text into a file – you can simply call the <code>writeFile</code> function.</p>
<p>When we use abstraction, we are essentially not forcing the person who uses our code to worry about the implementation details. They can just call the function and they'll get their answer back – they don't have to worry about what the function is doing "under the hood".</p>
<p><em>That's</em> the strength of abstracting details away in your code.  </p>
<p>I used to work at a company with a codebase that was 4 million lines long. Can you imagine a senior developer expecting me to understand every function? Every module? Every class? I would have NEVER merged a single change in that codebase if I did!</p>
<p>You can create a reusable, simple to understand, and easily changeable codebase by <strong>abstracting</strong> away certain details into the correct modules/separating out your code.</p>
<h2 id="heading-an-example-abstraction">An Example Abstraction</h2>
<p>Let's try and illustrate this with a code example.</p>
<p>Imagine you're working on a banking app, and you keep coming across this same weird subtraction over and over again, in different places in the code.</p>
<p><code>const res = bankAccountBalance - 1200</code></p>
<p><code>const res = bankAccountBalance – 1500</code></p>
<p><code>const res = bankAccountBalance - 1400</code></p>
<p>Why do we keep subtracting random numbers from everyone's bank balance once a year?! This is so unclear, there are zero comments explaining this?! What's happening? Is this an error?</p>
<p>Now imagine if this feature was clearer and did this:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> minusFeesInUSDollars = <span class="hljs-function">(<span class="hljs-params">bankAccountBalance </span>) =&gt;</span> {
    <span class="hljs-comment">// Our yearly fees for this account are 1200 (USD)</span>
    <span class="hljs-keyword">const</span> YEARLY_FEES = <span class="hljs-number">1200</span>;
    <span class="hljs-keyword">return</span> bankAccountBalance - YEARLY_FEES;
}
<span class="hljs-keyword">const</span> minusFeesInGBPounds = <span class="hljs-function">(<span class="hljs-params">bankAccountBalance </span>) =&gt;</span> {
    <span class="hljs-comment">// Our yearly fees for this account are 1500 (GBP)</span>
    <span class="hljs-keyword">const</span> YEARLY_FEES = <span class="hljs-number">1500</span>;
    <span class="hljs-keyword">return</span> bankAccountBalance - YEARLY_FEES;
}
<span class="hljs-keyword">const</span> minusFeesInEuros = <span class="hljs-function">(<span class="hljs-params">bankAccountBalance </span>) =&gt;</span> {
    <span class="hljs-comment">// Our yearly fees for this account are 1400 (EUR)</span>
    <span class="hljs-keyword">const</span> YEARLY_FEES = <span class="hljs-number">1400</span>;
    <span class="hljs-keyword">return</span> bankAccountBalance - YEARLY_FEES;
}
</code></pre>
<p>The example isn't perfect, because we could remove some duplication in these functions – but we have abstracted logic into "something", in this case, a function.</p>
<h2 id="heading-why-should-i-embrace-abstractions">Why Should I Embrace Abstractions?</h2>
<p>I have explained <strong>abstractions</strong> so far in the context of code, but it can apply to your learning journey as well.</p>
<p>If you can't embrace <strong>abstractions</strong> (at least when you are starting) you will never be able to understand and excel as a developer.</p>
<p>Why is this the case?</p>
<p>Well, because there is always an <strong>abstraction</strong> beneath you, that you will be tempted to try and understand. This will ultimately frustrate you, overwhelm you, and <strong>kill your learning.</strong></p>
<p> Here's an example.</p>
<ol>
<li>You start to learn React.  </li>
</ol>
<p><em>This is going well! I'm starting to learn my first few bits of code and render some things to my computer screen. This is going well. 😊</em></p>
<ol start="2">
<li>You learn that React is a library of JavaScript.  </li>
</ol>
<p><em>Okay that's cool! I should learn a little bit of JavaScript before I start with React then. I'm going to stop learning React, and learn vanilla JavaScript first.</em></p>
<ol start="3">
<li>You learn JavaScript is a programming language made up of lots of different pieces.  </li>
</ol>
<p><em>Okay this is getting more complex now. There are JavaScript engines, third party API's, different runtimes. This is getting confusing.</em></p>
<ol start="4">
<li>You try to understand how an engine interprets JavaScript code.  </li>
</ol>
<p><em>Okay! So your JavaScript code is being run, by a piece of software coded in C++. What is C++?</em></p>
<ol start="5">
<li>You start to learn C++.  </li>
</ol>
<p><em>This learning journey isn't going so well anymore. This is starting to get very confusing and much longer.</em></p>
<ol start="6">
<li>You learn that C++ is simply an extension of C.   </li>
</ol>
<p><em>What on earth is C?!</em></p>
<p>...and so on.</p>
<p>If you continue to dig deeper and deeper and deeper, into every tiny little detail, you are much more likely to quit your learning journey, and it will only be because you feel overwhelmed.</p>
<p>And if by some miracle you haven't given up, you're going to spend a much, much longer time trying to learn some basic skills you might need for a job.</p>
<h2 id="heading-how-do-you-embrace-abstractions">How Do You Embrace Abstractions?</h2>
<p>As you're learning, you're going to have to get comfortable with not fully understanding some things in your learning journey.</p>
<p>You can just "abstract" this knowledge away, and stick to the things that are relevant to what you're currently doing.</p>
<p>Don't chase down every tiny little detail that you encounter if you are new in your learning journey. Truth is, even the experts don't know everything! They normally know lots of things in a narrow area.</p>
<h2 id="heading-one-day-you-can-dig-into-the-abstractions">One Day You Can Dig into the Abstractions</h2>
<p>I don't want this article to come across like I am saying you should never delve below the abstractions you use everyday. But what I am saying is it won't help you to delve into the abstractions <strong>before</strong> you have spent a decent time coding first.</p>
<p>You should try to learn things as you need to learn them if you are early in your journey to become a developer.</p>
<p>After all, learning to code is hard enough, without committing to learning the entire ecosystem before even understanding the basics.</p>
<p>Once you start to become comfortable in your learning journey, and want to improve your skills, <a target="_blank" href="https://www.hanselman.com/blog/please-learn-to-think-about-abstractions">then learn how your abstractions work</a>.</p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>I hope this has been useful, and is encouraging if you are feeling overwhelmed with everything you're currently learning.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is DNS? Basics for Beginners ]]>
                </title>
                <description>
                    <![CDATA[ When you access a website like www.google.com, would it surprise you to learn that the URL isn't really the website address?  There is some work "under the hood" to ensure that, when you type in a human friendly name like Google, it takes you to the ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-dns-for-beginners/</link>
                <guid isPermaLink="false">66bc55f9d94fa6cb67b84529</guid>
                
                    <category>
                        <![CDATA[ computer network ]]>
                    </category>
                
                    <category>
                        <![CDATA[ dns ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Tue, 25 Jul 2023 18:07:28 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2023/02/dns.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>When you access a website like <a target="_blank" href="https://www.google.com/">www.google.com</a>, would it surprise you to learn that the URL isn't <em>really</em> the website address? </p>
<p>There is some work "under the hood" to ensure that, when you type in a human friendly name like Google, it takes you to the website you're expecting it to.  </p>
<p>So, what's happening under the hood?</p>
<h1 id="heading-what-are-urls">What are URLs?</h1>
<p>You may be familiar with what a URL is. It's a simple link to a bit of content on the web. People use URL's daily to share videos, pictures, sites, articles – almost anything on the internet.</p>
<p>URL is an acronym for <strong>Uniform Resource Locator,</strong> and we can break them down into multiple smaller "pieces". Here's what makes up a standard URL:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/02/image-264.png" alt="Image" width="600" height="400" loading="lazy">
<em>Anatomy of a URL showing the Scheme, Domain Name, Path, and Parameters</em></p>
<p>A <strong>URL</strong> is just an address for a resource. The resources differ like we discussed, but they're just pointers all over the internet to take you to content you want to view.</p>
<p>As you can see in the graphic above, the breakdown of a URL is often:</p>
<ul>
<li><strong>Scheme:</strong> this is the protocol a browser uses to access your content. Normally for websites it's HTTP (insecure), or HTTPS (secure).</li>
<li><strong>Domain name:</strong> the website name ("www.google.com" here)</li>
<li><strong>Port:</strong> a network <a target="_blank" href="https://en.wikipedia.org/wiki/Port_(computer_networking)">port</a> (80 in this example)</li>
<li><strong>Path:</strong> a path to a particular resource on the server</li>
<li><strong>Parameters:</strong> often key-value pairs, to serve extra data to the web server.</li>
</ul>
<h1 id="heading-what-are-ip-addresses">What are IP Addresses?</h1>
<p>Humans and computers navigate the web very differently. Whilst most humans use <strong>URL's</strong> like we just discussed, to communicate between computers, computers use the <strong>Internet Protocol</strong> <strong>(IP).</strong> </p>
<p>The <strong>IP</strong> is a set of rules that route and address data packets (all the data you want to view) to make sure it arrives to your computer.</p>
<p>The Internet Protocol relies on devices and domains, all having their own <strong>IP address</strong> to connect and identify all the different segments (packets!) of the internet. </p>
<p>An <strong>IP address</strong> is a series of standardised numbers that range from 0 to 255 – separated by dots. </p>
<p>If you want to see <strong>IP addresses</strong> in action, and are familiar with terminals, you can type <code>ping google.com</code> in whichever terminal you like and you can see the <strong>IP address</strong> of Google.com.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/03/image-56.png" alt="Image" width="600" height="400" loading="lazy">
<em>A screenshot from a PowerShell terminal, showing a ping command to 216.58.212.206, and 0% packet loss.</em></p>
<p>You can test this further by typing <strong>216.58.212.206</strong> directly into your browser and seeing if it takes you to Google. </p>
<p>Hopefully this small example highlights why we use <strong>URL's</strong>. If both addresses (<strong>IP address</strong> and <strong>domain name</strong>) took you to the same place, would you rather be asked to remember <strong>Google.com</strong> or <strong>216.58.212.206</strong>?</p>
<p>Note that some IP addresses change day to day (called <a target="_blank" href="https://support.opendns.com/hc/en-us/articles/227987827-What-is-a-Dynamic-IP-Address-">dynamic IP addresses</a>) – so the above <strong>IP address</strong> may not work, depending on if the IP address is dynamic or static.</p>
<p>Static IP addresses are ones that don't change – but to assign a single <strong>IP address</strong> to every machine would be impractical. It would be a logistical nightmare, too, as some people only log onto computers once a month to send an email, for example. </p>
<p>We could very realistically run out of IP addresses on today's current technology if we gave every device a unique <strong>IP address</strong> (if you want to read how IP addresses are allocated in greater detail, <a target="_blank" href="https://www.freecodecamp.org/news/ipv4-vs-ipv6-what-is-the-difference-between-ip-addressing-schemes/">read here</a>).</p>
<h1 id="heading-what-is-a-dns">What is a DNS?</h1>
<p>If we know computers communicate via the <strong>Internet Protocol</strong> and communicate using <strong>IP Addresses</strong>, how do we turn <a target="_blank" href="https://www.freecodecamp.org/news/p/addfad35-db16-4e8d-abf6-c36009bd5bca/www.google.com">google.com</a> into the website we use so regularly?</p>
<p>The answer is using a <strong>Domain Name System (DNS)</strong>. The job of the Domain Name System is to transform human readable <strong>domain names</strong> into <strong>IP addresses</strong>.</p>
<p>There are four servers specifically that we'll discuss.</p>
<h2 id="heading-dns-recursor">DNS Recursor</h2>
<p>A <strong>DNS Recursor</strong> is like a waiter in a restaurant. It acts like a "front facing" part of the system to receive orders (normally from browsers) where the waiter then heads into the back to get what is needed.</p>
<p>In reality, it's just a server that receives <strong>DNS queries</strong> from browsers and returns information.</p>
<p>There are 3 different places the DNS recursor can generally get the information from depending on if any data has been cached:</p>
<ul>
<li>Root nameserver</li>
<li>TLD nameserver</li>
<li>Authoritative nameserver</li>
</ul>
<p>So let's discuss them one by one.</p>
<h3 id="heading-what-is-a-root-nameserver">What is a Root Nameserver?</h3>
<p>The root nameserver's main job is to return the <strong>Top-Level Domain (TLD) server</strong>.  <em>**</em>  </p>
<p>This is an important step to map hostnames into IP addresses.</p>
<p>The root nameserver essentially acts like a catalogue that points to more specific locations.</p>
<h3 id="heading-what-is-a-top-level-domain-tld-server">What is a Top-Level Domain (TLD) Server?</h3>
<p>If the root nameserver acts like a catalogue, the <strong>TLD server</strong> acts like a page in a catalogue.</p>
<p>The TLD server generally returns the final part of the host-name, like <strong>com</strong> for example, in "google.com".</p>
<h3 id="heading-what-is-an-authoritative-nameserver">What is an Authoritative Nameserver?</h3>
<p>This server is like a row entry on the specific page of the catalogue.</p>
<p>The <strong>authoritative nameserver</strong> now can return the IP address for the requested hostname from the browser, back to the DNS recursor – which can hand it back to the browser.</p>
<p>DNS can be super confusing, and to understand the whole process may take a little while, so let's tie it together with a final example.    </p>
<h2 id="heading-example-request">Example Request</h2>
<p>Let's break down an example request from a user, and hopefully tie together this pretty complex process.</p>
<p>Each step in the flow starts to point closer and closer to the final address the user will eventually end up hitting.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2023/07/image-168.png" alt="Image" width="600" height="400" loading="lazy">
<em>Diagram showing the steps in the request process</em></p>
<p>Let's break down what's going on in this graphic:</p>
<h3 id="heading-step-1">Step 1:</h3>
<p>A user types 'kealanparr.com' into their browser, and the query hits the DNS recursor.</p>
<h3 id="heading-step-2">Step 2:</h3>
<p>The DNS recursor then queries a Root nameserver</p>
<h3 id="heading-step-3">Step 3:</h3>
<p>The Root nameserver then responds to the DNS recursor with the address of a Top Level Domain server (TLD) such as .com. </p>
<h3 id="heading-step-4">Step 4:</h3>
<p>The DNS recursor then makes a request to the .com TLD.</p>
<h3 id="heading-step-5">Step 5:</h3>
<p>The .com TLD server then responds with the IP address of the Domain’s nameserver, kealanparr.com.</p>
<h3 id="heading-step-6">Step 6:</h3>
<p>The DNS recursor sends a query to the domain’s nameserver.</p>
<h3 id="heading-step-7">Step 7:</h3>
<p>The IP address for kealanparr.com is then returned to the resolver from the Domain nameserver.</p>
<h3 id="heading-step-8">Step 8:</h3>
<p>The DNS recursor responds to the web browser request with the IP address of the domain requested.</p>
<h3 id="heading-step-9">Step 9:</h3>
<p>At this point, the DNS lookup has returned enough data for the browser to make the request for the web page.</p>
<ul>
<li>The browser makes a HTTP request to the IP address.</li>
<li>The server at that IP returns the webpage content to be rendered in the browser.</li>
</ul>
<h1 id="heading-conclusion">Conclusion</h1>
<p>I hope this article has helped you to understand a few networking principles that affect the websites you use everyday. </p>
<p>IP addresses, DNS, and more are all technologies most people use daily but may not be very familiar with.</p>
<p>Cloudflare has an article that was helpful as I researched for this article, which you can read <a target="_blank" href="https://www.cloudflare.com/en-gb/learning/dns/what-is-dns/">here</a>.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Markdown Cheat Sheet – How to Write Articles in Markdown Language ]]>
                </title>
                <description>
                    <![CDATA[ As a developer, you have likely heard of HTML, which stands for HyperText Markup Language. And you may know that HTML is a language used to create websites – but what does markup mean? Markup languages are languages that use tags to define different ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/markdown-cheatsheet/</link>
                <guid isPermaLink="false">66bc55e5a30f8b3984dad877</guid>
                
                    <category>
                        <![CDATA[ HTML ]]>
                    </category>
                
                    <category>
                        <![CDATA[ markdown ]]>
                    </category>
                
                    <category>
                        <![CDATA[ markup ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 22 Aug 2022 22:16:38 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/08/Markdown-cheatsheet.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As a developer, you have likely heard of <a target="_blank" href="https://en.wikipedia.org/wiki/HTML">HTML</a>, which stands for <strong>H</strong>yper<strong>T</strong>ext <strong>M</strong>arkup <strong>L</strong>anguage.</p>
<p>And you may know that HTML is a language used to create websites – but what does <strong>markup</strong> mean?</p>
<p><a target="_blank" href="https://techterms.com/definition/markup_language">Markup languages</a> are languages that use tags to define different elements within a text document. Most people are familiar with <strong>Rich Text Editors</strong> – programs that allow users to add extra formatting, images, and links to their documents.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/image-30.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>A screenshot of the GUI of the Microsoft Word software (a Rich Text Editor).</em></p>
<p>But markup languages use tags like:</p>
<ul>
<li><p>is a paragraph tag.</p>
</li>
<li><p>makes bold text.</p>
</li>
</ul>
<p>There are quite a few markup languages like <a target="_blank" href="https://en.wikipedia.org/wiki/XML">XML</a>, <a target="_blank" href="https://en.wikipedia.org/wiki/HTML">HTML</a>, and the topic of this article: <strong>Markdown</strong>.</p>
<p>Developers generally use markdown for documentation – and it is often included in most repositories. For example, I used markdown to write this article on freeCodeCamp.</p>
<p>So let's look at all we can do with markdown.</p>
<p><strong>Disclaimer:</strong> There is no unifying body or specification to standardise markdown – just some widely accepted best practices. So your mileage might vary depending on what markdown parser you're using for this cheat sheet.</p>
<h1 id="heading-markdown-cheat-sheet">Markdown Cheat Sheet</h1>
<p>Here are some of the most commonly used methods for manipulating text in markdown.</p>
<h1 id="heading-how-to-create-headers-in-markdown">How to Create Headers in Markdown</h1>
<p>There are six markdown headers, H1 thorough to H6. I'll show you how it displays visually, and also the way you create it using markdown.</p>
<p>H1's are the biggest and generally are the "main" headers, and each header after H1 gets smaller.</p>
<h1 id="heading-h1-tag">H1 tag</h1>
<p><code># H1 tag</code></p>
<h2 id="heading-h2-tag">H2 tag</h2>
<p><code>## H2 tag</code></p>
<h3 id="heading-h3-tag">H3 tag</h3>
<p><code>### H3 tag</code></p>
<h4 id="heading-h4-tag">H4 tag</h4>
<p><code>#### H4 tag</code></p>
<h5 id="heading-h5-tag">H5 Tag</h5>
<p><code>##### H5 tag</code></p>
<h6 id="heading-h6-tag">H6 tag</h6>
<p><code>###### H6 tag</code></p>
<h1 id="heading-how-to-add-typographical-emphasis-in-markdown">How to Add Typographical Emphasis in Markdown</h1>
<p>The ways you commonly add emphasis with text are bold, italics and strikethroughs. Combining too much emphasis can make words much less clear, so choose carefully how you want to emphasize each bit of text.</p>
<p>There are also subscript and superscript notation that you'll use to write the names of various chemical compounds, for example. You may also use them as part of mathematical notation.</p>
<p><strong>How to make text bold:</strong></p>
<p>Add double asterisks around your text. It'll make that text appear bold. Like this: <code>**Bold text**</code></p>
<p><em>How to make your text italic:</em></p>
<p>Add single asterisks around your text to make it appear in italics, like this: <code>*Italics*</code></p>
<p>How to <s>Strike through</s> certain text:</p>
<p>If you want to "cross something out" in text, use the strikethrough method, like this: <code>~~Strike through~~</code>.</p>
<h3 id="heading-how-to-write-subscripts-in-markdown">How to Write Subscripts in Markdown</h3>
<p>If you want to write the chemical symbol for water, for example, you can make a subscript "2" by typing <code>H~2~0</code>.</p>
<p>This results in: H<sub>2</sub>0.</p>
<h3 id="heading-how-to-write-superscripts-in-markdown">How to Write Superscripts in Markdown</h3>
<p>Say you want to write an exponent - or superscript. You do that like this: <code>X^2^</code> which results in this: X<sup>2</sup>.</p>
<h1 id="heading-how-to-make-lists-in-markdown">How to Make Lists in Markdown</h1>
<p>There are multiple types of lists in markdown. For example, you can have ordered lists and unordered lists.</p>
<p>Ordered lists are commonly used when you want to follow steps in a certain order (like following a recipe: cook the chicken...serve the dish). But unordered lists work well for things that don't require sequential steps like a recipe (a shopping list, for example).</p>
<h3 id="heading-how-to-make-an-unordered-list-in-markdown">How to Make an Unordered List in Markdown</h3>
<p>This is how the unordered list looks.</p>
<ul>
<li><p>Chili oil</p>
</li>
<li><p>Rice</p>
</li>
<li><p>Spring onions</p>
</li>
</ul>
<p>And this is how you create it in markdown:</p>
<pre><code class="lang-javascript">- Chili oil
- Rice
- Spring onions
</code></pre>
<h3 id="heading-how-to-make-an-ordered-list-in-markdown">How to Make an Ordered List in Markdown</h3>
<p>This is how the ordered list looks.</p>
<ol>
<li><p>First item</p>
</li>
<li><p>Second item</p>
</li>
</ol>
<p>And this is how you create it in markdown:</p>
<pre><code class="lang-javascript"><span class="hljs-number">1.</span> First item 
<span class="hljs-number">2.</span> Second item
</code></pre>
<h1 id="heading-how-to-create-links-in-markdown">How to Create Links in Markdown</h1>
<p>The two most common ways of linking things in markdown documents is either by hyperlinks or images. Both can help make your writing much clearer and more eloquent, and should be used where appropriate.</p>
<p>Here's what a hyperlink in text looks like:</p>
<p><a target="_blank" href="https://www.kealanparr.com">Kealan's site</a></p>
<p>And here's how you'd create that link in Markdown:</p>
<p><code>[Kealan's site](https://www.kealanparr.com)</code></p>
<p>You put the text you want to link in square brackets (here, "Kealan's site"), and then immediately follow them with parenthesis containing the URL.</p>
<p>Say you want to include an image in an article. To get it to appear like this:</p>
<p><img src="https://images.unsplash.com/photo-1660866838784-6c5158c0f979?ixlib=rb-1.2.1&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=387&amp;q=80" alt="View of natural rock landscape formations making a valley ending in a road crossing through with a blue sky." width="387" height="581" loading="lazy"></p>
<p>You simple use the following notation:</p>
<pre><code class="lang-javascript">![View <span class="hljs-keyword">of</span> natural rock landscape formations making a valley ending <span class="hljs-keyword">in</span> a road crossing through <span class="hljs-keyword">with</span> a blue sky.](https:<span class="hljs-comment">//images.unsplash.com/photo-1660866838784-6c5158c0f979?ixlib=rb-1.2.1&amp;ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&amp;auto=format&amp;fit=crop&amp;w=387&amp;q=80)</span>
</code></pre>
<p>It's similar to a regular link, but you include the exclamation point before the brackets.</p>
<h2 id="heading-how-to-use-html-in-markdown">How to Use HTML in Markdown</h2>
<p>You can use regular HTML in Markdown documents (depending on the parser that's being used).</p>
<p>So feel free to just input any valid HTML you like.</p>
<h2 id="heading-how-to-add-spacing-in-markdown">How to Add Spacing in Markdown</h2>
<p>If you want to add a horizontal line to divide up sections of a document, you can make one like this:</p>
<hr>
<p>By using three dashes like this:</p>
<pre><code class="lang-javascript">---
</code></pre>
<h2 id="heading-how-to-create-tables-in-markdown">How to Create Tables in Markdown</h2>
<p>Tables come in handy in your articles. To make a table that looks like this:</p>
<div class="hn-table">
<table>
<thead>
<tr>
<td>Name</td><td>Age</td></tr>
</thead>
<tbody>
<tr>
<td>Kealan</td><td>25</td></tr>
<tr>
<td>Jake</td><td>28</td></tr>
</tbody>
</table>
</div><p>Here's the notation you'd use:</p>
<pre><code class="lang-javascript">| Name   | Age |
| ------ | --- |
| Kealan | <span class="hljs-number">25</span>  |
| Jake   | <span class="hljs-number">28</span>  |
</code></pre>
<p>The only real "gotcha" you have to be aware of when making a markdown table is that you keep the pipes (|) vertically in line. Then your markdown table will appear as above in this article. An image to make that clearer is:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/image-139.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>A markdown table is displayed, with Name and Age as the headers and Kealan, Jake and 25 &amp; 28 as the values.</em></p>
<h2 id="heading-how-to-add-code-and-syntax-in-markdown"><strong>How to Add Code and Syntax in Markdown</strong></h2>
<p>Adding code snippets to your markdown can be incredibly helpful if you are creating documentation for developers, for example.</p>
<p>The below is a very simple JavaScript example, but almost all modern programming languages are supported (with syntax highlighting and so on).</p>
<pre><code class="lang-javascript"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">'example log'</span>)
</code></pre>
<pre><code class="lang-javascript"><span class="hljs-built_in">console</span>.log(<span class="hljs-string">'example log'</span>)
</code></pre>
<p>Just type the three backticks followed by the programming language and then enter to start writing your code. End the code block with three backticks.</p>
<h1 id="heading-how-to-add-quotes-in-markdown">How to Add Quotes in Markdown</h1>
<p>When you reference someone else's work, it is expected and courteous to credit them. One easy way you can do that is by quoting them.</p>
<p>If you want to add quotes in markdown:</p>
<blockquote>
<p>"This is a quote, from someone who is very wise" - Anonymous</p>
</blockquote>
<p>Just add this symbol, which renders it like the above quote:</p>
<p><code>&gt; "This is a quote, from someone who is very wise" - Anonymous</code></p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>I hope this has been a useful reference for you, and that you've learned a new feature of markdown you hadn't seen before.</p>
<p>There are lots more features (not even counting all the HTML variations you could create), but this article has covered the most used features.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ TypeScript Literal and Collective Types ]]>
                </title>
                <description>
                    <![CDATA[ TypeScript offers us a level of "safety" in our code by adding static types. We can guarantee that certain properties or functions are present in our code by making them conform to types. This can hugely reduce the amount of client-side errors you mi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/typescript-literal-and-collective-types/</link>
                <guid isPermaLink="false">66bc55eada80a491ea5a5f5b</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ TypeScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Tue, 07 Dec 2021 15:55:33 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/12/Literal-Types-vs-Collective-Types--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>TypeScript offers us a level of "safety" in our code by adding static types.</p>
<p>We can guarantee that certain properties or functions are present in our code by making them conform to types.</p>
<p>This can hugely reduce the amount of client-side errors you might have in your website, because it reduces human error bugs like calling functions on the wrong objects, for example.</p>
<p>TypeScript does this by utilising <strong>Collective Types</strong> and <strong>Literal Types</strong>.</p>
<p>So, what's the difference?</p>
<h1 id="heading-collective-types-in-typescript">Collective Types in TypeScript</h1>
<p><strong>Collective Types</strong> are a concept that are familiar to most developers who work with TypeScript. For example:</p>
<p><code>const addOne = (numb: number) =&gt; num + 1;</code> </p>
<p>This code uses <strong>Collective Types</strong>.</p>
<p><strong>Collective Types</strong> are types like <code>number</code>, <code>string</code>, <code>boolean</code> or <code>number[]</code>.</p>
<p>These types encompass a huge amount of variables present – the <code>number</code> type for example can cover: 1, 2, 3, 4, 5...and so on.</p>
<p>But TypeScript also offers us sub-types on these <strong>Collective Types</strong> that are stricter.</p>
<h1 id="heading-literal-types-in-typescript">Literal Types in TypeScript</h1>
<p>You can also use <em>values</em> as types, so <code>let eleven: 11 = 11</code> is totally valid TypeScript code.</p>
<p>When I first saw this, I thought it looked a little weird.</p>
<p>But it is used heavily, and can really make your code more readable.</p>
<p>You can start to construct enum-like types, and strictly only allow certain values to be assigned, for example:</p>
<p><code>type Door = 'open' | 'closed' | 'ajar'</code></p>
<p>The <code>Door</code> type can now be used throughout your code – with a stricter set of values than the <code>string</code> type would have allowed.</p>
<p>If the <code>|</code> in the above code is unclear, it is a <a target="_blank" href="https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html">Union Type</a> – and essentially means <code>OR</code>. Any type that conforms to <code>Door</code> can only be <code>open</code> OR <code>closed</code> OR <code>ajar</code>.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p><strong>Literal Types</strong> are sub-types of <strong>Collective Types</strong>. </p>
<p>We can say all Literal Types are Collective Types – but not all Collective Types are Literal Types. To make that clearer, we could say the <strong>Literal Type</strong> <code>11</code> is a <code>number</code> but not all <code>number</code> types are <code>11</code>.</p>
<p>I hope the difference between the two types is clearer now, and if you need to constrict types strictly, you can make use of <strong>Literal Types</strong>.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is Type Erasure in TypeScript? ]]>
                </title>
                <description>
                    <![CDATA[ TypeScript is a transpiled language, and there is a step in the process called type erasure. So what exactly is transpiling, and what is type erasure? Higher Level vs Lower Level Programming Languages Before we explain further, we have to understand ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-type-erasure-in-typescript/</link>
                <guid isPermaLink="false">66bc560cd94fa6cb67b8452e</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                    <category>
                        <![CDATA[ TypeScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 06 Dec 2021 19:21:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/12/TypeErasure--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>TypeScript is a <strong>transpiled</strong> language, and there is a step in the process called <strong>type erasure</strong>.</p>
<p>So what exactly is <strong>transpiling</strong>, and what is <strong>type erasure</strong>?</p>
<h1 id="heading-higher-level-vs-lower-level-programming-languages">Higher Level vs Lower Level Programming Languages</h1>
<p>Before we explain further, we have to understand higher and lower level languages.</p>
<p>Higher level languages are more abstracted than lower level languages. By abstracted I mean they're easier for humans to understand. </p>
<p>For example, you would say machine code (binary) is lower level and closer to the computer than JavaScript. Higher level languages generally are more simple to write and understand than writing lower level languages (Assembly for example) where you have to understand and deal with memory addresses directly, and so on.</p>
<p><strong>Compilation</strong> and <strong>transpilation</strong> are very similar steps, but they're not identical. I'll explain both so you know the difference.</p>
<h2 id="heading-what-is-compiling">What is Compiling?</h2>
<p>Compiling is a catch-all term for turning code that you've written into some lower-level executable for the computer (generally machine code). </p>
<p>An example of some compiled languages are Java, C# or C. Sometimes it's compiled in multiple steps, each step optimising the code and getting it closer to machine code with each "pass" it does. </p>
<p>Through this process, a high level, closer to human readable language ends up "lower" or closer to binary.</p>
<h2 id="heading-what-is-transpiling">What is Transpiling?</h2>
<p>Transpilers are sometimes referred to as "source to source compilers" – so, a short hand way of saying "source code to source code". Transpiling means converting one higher level language to another higher level language. </p>
<p>For example, TypeScript is a high level language but after it's transpiled it's turned into JavaScript (another high level language). Or Babel for example can transpile ES6 JavaScript code into ES5 JavaScript. </p>
<p>The benefits of transpiling are that you can write one high level language and still end up with another high level language.</p>
<h1 id="heading-type-erasure-in-typescript">Type Erasure in TypeScript</h1>
<p>Part of this <strong>transpiling</strong> process is called <strong>type erasure</strong>.</p>
<p><strong>Type erasure</strong> is quite simply when all the types get removed from the TypeScript code as it is transpiled to JavaScript.</p>
<p>The types you use in TypeScript can't be inspected at run-time, when JavaScript is being executed. The <strong>types</strong> are only accessible during the compilation/transpilation step. </p>
<p>TypeScript code that looks like this:</p>
<p><code>let name: string = 'Kealan';</code></p>
<p>Eventually gets compiled/transpiled to this:</p>
<p><code>let name = 'Kealan'</code></p>
<p>The output might vary depending on your specific build steps (the variable may be renamed, or inlined) but the example of <strong>type erasure</strong> still stands true.</p>
<p>This isn't just with primitive types like <code>number</code> or <code>string</code> – but even with your own custom types you may create:</p>
<pre><code>type StringType = string;

<span class="hljs-keyword">const</span> firstName: StringType = <span class="hljs-string">"Kealan"</span>;
</code></pre><h2 id="heading-type-erasure-in-practice">Type Erasure in practice</h2>
<p>More than just conceptually understanding what <strong>type erasure</strong> is, this concept explains an important step in the transpiling process where types are thrown away and aren't used in the source code you generate.</p>
<p>It also means that pieces of your code aren't even "used" in JavaScript during the transpiling step – and the code is just completely removed. So your 100 line interface you create just gets removed, and the code sent to the user is smaller.</p>
<p>You can look at an example of this in the <a target="_blank" href="https://www.typescriptlang.org/play?#code/JYOwLgpgTgZghgYwgAgApQPYHMpwLZ7TIDeAUMhciPhAFzIDOYUoWANOZQDbADWEDekxYh2nCpAQALEF2wBPAKoMIAEyHNWAbQC6pAL6lSCDCCbJ+cLnBD102XASIBeEuKo16AcgDSEKzZeHJTIPPyCyF4AwlICDEHukjJyWEoq6shaXgBScABucADKCCwADmBBkQAq8qUQxWUVbJEASv4ITZEAchiqEF46yAZAA">TypeScript playground</a>, where an interface used in the TypeScript code is absent in the transpiled JavaScript.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>I hope some of the steps TypeScript takes to turn your code into JavaScript are a little clearer, and that you have a good overview of the differences between <strong>compiling</strong> and <strong>transpiling</strong>.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is .gitkeep? How to Track and Push Empty Folders in Git ]]>
                </title>
                <description>
                    <![CDATA[ Let's say you need to completely restructure the directories of your codebase. You need to move some folders higher, move some other folders lower, and move lots of files into some new folders you're going to create. You start shifting the code aroun... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-gitkeep/</link>
                <guid isPermaLink="false">66bc55ffa30f8b3984dad87c</guid>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ how-to ]]>
                    </category>
                
                    <category>
                        <![CDATA[ version control ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 15 Nov 2021 18:07:41 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/11/Capture.JPG" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Let's say you need to completely restructure the directories of your codebase.</p>
<p>You need to move some folders higher, move some other folders lower, and move lots of files into some new folders you're going to create.</p>
<p>You start shifting the code around, checking that everything works, and adding some folders that the next project is going to need.</p>
<p>These new folders are empty at the minute. But the next project starts in 2 days and it's best if you add these new folders since you're already moving the codebase around.  </p>
<p>You push everything into your project branch and you're ready for someone to QA it. So you tell the code-reviewer you're finished on Slack.</p>
<p>They then clone your branch, and fail your code-review because you forgot to add all the new folders you promised to add.</p>
<p>Wait.... what?</p>
<h1 id="heading-what-happened">What happened?</h1>
<p><a target="_blank" href="https://git.wiki.kernel.org/index.php/Git_FAQ#Can_I_add_empty_directories.3F">git can't push empty directories.</a> It can only track files.</p>
<p>If you try to push a folder with nothing in it, although it will exist on your local machine, nothing will go into your branch.</p>
<p>So if someone tries to clone your code, they won't have the same folder structure as you do on your local machine.</p>
<p>So if it doesn't work, what do you need to do?</p>
<h1 id="heading-how-to-use-gitkeep">How to Use .gitkeep</h1>
<p>Now we know that Git only tracks files, so we know we need to add something to the folder.</p>
<p>You can add anything. You just need to add a really simple dummy file to make sure that the folder is tracked, and will be pushed.</p>
<p>You could copy and paste a text file <code>file.txt</code> with nothing in it, and that would work. You could put a PNG image of a cat.</p>
<p>A common, standardised practice to solve this exact issue, however, is to push a file called <code>.gitkeep</code> into your empty folders.</p>
<p>This isn't a feature of Git! So you could name it anything. There's nothing special about the name <code>.gitkeep</code> – some developers add <code>.gitignore</code> instead, for example.</p>
<p><code>.gitignore</code> is a little confusing, though, as you are trying to make git <strong>not</strong> ignore your file, and actually push it into your branch.</p>
<p>Either way, by adding this simple file to your folders, they'll get pushed when the time comes.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p><code>.gitkeep</code> is a common thing you will see in codebases, where an empty folder needs to be tracked via Git.</p>
<p>The name of the dummy file may not always be <code>.gitkeep</code> but you'll see the actual practice over and over again as a developer.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more of my writing.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Programming is Really Hard – But Don't Give Up ]]>
                </title>
                <description>
                    <![CDATA[ Learning to do something new is hard. Whether it's a physical feat like reaching a new best lift or a mental challenge like learning a new language – both entail months of work, multiple setbacks, and hundreds of hours of time put in. And then you st... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-get-better-at-programming-even-when-its-hard/</link>
                <guid isPermaLink="false">66bc55ddd94fa6cb67b84521</guid>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 25 Oct 2021 21:43:19 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/10/ProgrammingIsHard.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Learning to do something new is hard.</p>
<p>Whether it's a physical feat like reaching a new best lift or a mental challenge like learning a new language – both entail months of work, multiple setbacks, and hundreds of hours of time put in. And then you still might just be at an intermediate level.</p>
<p>Spending <strong>hours</strong> failing over and over again, before finally being able to do it effortlessly, is the route ahead for any beginner.</p>
<p>But being bad at something isn't fun.  </p>
<p>It's hard to continue doing something you're struggling to do.  </p>
<p>It's hard to keep coding regularly when you feel like you're making no progress with your buggy code and worse yet, <em>aren't sure</em> how to improve your situation. </p>
<p>The only way to get better is to...keep getting stuck and just persevering? That doesn't sounds very encouraging.</p>
<p>But that is exactly what is necessary for you to become great.  </p>
<p>I think learning to code is <strong>especially</strong> hard, as it is so different from most other activities, and sometimes it's hard to see which of your other skills might be transferrable to programming.</p>
<p>But because coding is challenging to do and can be so frustrating is exactly why you should do it.</p>
<h1 id="heading-why-its-good-to-do-hard-things">Why it's good to do hard things</h1>
<blockquote>
<p>Strangely, life gets harder when you try to make it easy. Exercising might be hard, but never moving makes life harder. Uncomfortable conversations are hard, but avoiding every conflict is harder. Mastering your craft is hard, but having no skills is harder. Easy has a cost.  – <strong>James Clear</strong></p>
</blockquote>
<p>I have found that the biggest leaps in my character, technical skills, and personal development normally come from something difficult I have to face.</p>
<p>There's this false idea amongst new developers that generally experienced developers know exactly what to do, and just "do it".</p>
<p>I haven't found that to be the case at all.  </p>
<p>I have been coding for 4 years and recently wanted to create an automated job that would run a Node script monthly. Then at the end of the Node script running, it would commit the file with all results to a repository on GitHub.</p>
<p>I got it all wired up pretty quick, but couldn't work out for days why this script wasn't committing anything into my repository.</p>
<p>I was trying to work out if the Node script wasn't running, or if it was running but wasn't committing.</p>
<p>I tried what felt like everything. I contacted developer friends. But they had no idea what was wrong either.  </p>
<p>Everything worked on my machine, why was this so hard?  </p>
<p>I finally solved it. The machine that was running my Node script was a different OS than what I was using (it used Ubuntu) and was a case-sensitive shell, whilst my shell wasn't case-sensitive.</p>
<p>So although it worked on my machine it "blew up" on the other machine as I had the casing of the file (that I wanted to commit with all the results in it) wrong.</p>
<p><a target="_blank" href="https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner/commit/e34fccd74d39b34ec196cac272aa759f335f4c51#diff-e727e4bdf3657fd1d798edcd6b099d6e092f8573cba266154583a746bba0f346">Here's</a> the commit where I fixed it.  </p>
<p>In that moment I just wanted the bug fixed.  </p>
<p>I was sick of not being able to properly debug the issue, as I didn't have access to the machine that was running my code. I felt like I was guessing as the feedback loop was so slow.</p>
<p>But now that I have experience doing this, I know how to optimally debug these types of situations again.</p>
<p>The only thing I'm trying to show you is that the only way to improve is to struggle and work things out. No matter how slow it feels.</p>
<p>In my experience, the only difference between the state I was in as a newbie coder who "didn't get it" and the state I'm currently in is that I just didn't quit.</p>
<h1 id="heading-investing-in-loss">Investing in Loss</h1>
<p>There's an excellent way to frame "getting better means struggling, persevering and not giving up" called <strong>Investing In Loss</strong>.</p>
<p>If you want to get good at something, <a target="_blank" href="https://bjjmentalmodels.com/investing-in-loss/">you need to spend a lot of time being bad at it.</a> View loss <em>as an investment</em>, <strong>rather than something to avoid</strong>.</p>
<p>This concept is from the book <a target="_blank" href="http://www.joshwaitzkin.com/the-art-of-learning/">The Art of Learning</a>. </p>
<p>To master any new skill, you need to go through a prolonged period of being bad before you can be good. </p>
<p>Each new part of software feels like a whole new world you have no experience with: deployments, networks, coding, data-structures, documentation, the list goes on. And there are multiple times – even when you're experienced – that you'll feel like you're a beginner again.</p>
<p>Often times the thing holding us back is our expectations of where we <em>should be</em> and losing patience with the process before we have finished it.</p>
<p>If you're good at other things, going back to being a beginner is jarring.</p>
<p>But you need to focus on <strong>viewing the loss as an investment</strong> – and not giving up too soon.</p>
<h1 id="heading-dont-quit">Don't quit!</h1>
<blockquote>
<p><em>I have not failed 10,000 times. I have not failed once. I have succeeded in proving that those 10,000 ways will not work. When I have eliminated the ways that will not work, I will find the way that will work.</em> – <strong>Thomas Edison</strong></p>
</blockquote>
<p>There are always times to cut your losses, but if programming is something you sincerely want to improve in, either for a new career or for pleasure – don't give up.</p>
<p>When I first started learning JavaScript, I spent time coding in the <strong>Eclipse</strong> code editor as I thought Java was the shorthand name for JavaScript.</p>
<p>If you aren't aware, they're not the same, and that editor doesn't (natively) work with JavaScript!  </p>
<p>There have been countless times when I was a newbie, where I have gone through interviews and felt like I completely failed them, only to be surprised later when I got a job offer.</p>
<p>Remember the reason you first started learning and just keep going. Any progress no matter how small, is valuable.</p>
<h1 id="heading-conclusion"><strong>Conclusion</strong></h1>
<p>I remember so clearly years ago a time when I was coding on freeCodeCamp and was very disheartened about how stuck I was on a particular problem.  </p>
<p>I read <a target="_blank" href="https://www.freecodecamp.org/news/make-your-hobby-harder-programming-is-difficult-thats-why-you-should-learn-it-e4627aee41a1/">this</a> article, and it was one of the many articles that formed my opinion on this topic, inspired me to keep going, and to write my thoughts in this article.</p>
<p>If you're a newbie coder, I wrote about steps I took to improve as a developer <a target="_blank" href="https://www.freecodecamp.org/news/how-to-become-a-better-developer/">here</a> and maintain a list of high quality coding resources <a target="_blank" href="https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner">here</a>.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more of my writing.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Become a Better Developer – Tips to Grow Your Coding Skills ]]>
                </title>
                <description>
                    <![CDATA[ As a developer, you probably want to improve your skills constantly. Be the best developer you can possibly be. But how you can actually improve is a tricky question to answer.   The Software industry is obsessed with the idea of 10x engineers. These... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-become-a-better-developer/</link>
                <guid isPermaLink="false">66bc55dae35f27b35395075a</guid>
                
                    <category>
                        <![CDATA[ coding ]]>
                    </category>
                
                    <category>
                        <![CDATA[ personal development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ skills development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Tue, 21 Sep 2021 15:52:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/Tips-to-improve--3-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>As a developer, you probably want to improve your skills constantly. Be the best developer you can possibly be. But <strong>how</strong> you can actually improve is a tricky question to answer.  </p>
<p>The Software industry is obsessed with the idea of <a target="_blank" href="https://www.7pace.com/blog/10x-engineers">10x engineers</a>. These are engineers who are supposedly 10 times better at their job than their peers. But how does anyone become so talented?</p>
<blockquote>
<p>"The best programmers are not marginally better than merely good ones. They are an order-of-magnitude better, measured by whatever standard: conceptual creativity, speed, ingenuity of design, or problem-solving ability." – Randall E. Stross</p>
</blockquote>
<p>Here are four actionable steps I have used myself, or seen others use to succeed in improving their skills.</p>
<p>If you are new to programming, I think <a target="_blank" href="https://stackoverflow.blog/2019/08/07/what-every-developer-should-learn-early-on/">this</a> is a great thing to read first.</p>
<h1 id="heading-teach-and-write-as-much-as-possible">Teach and Write as Much as Possible</h1>
<blockquote>
<p>“What many people underestimate is that being a good writer, whether that is through emails or through documents, allows you to be more impactful. I see many engineers ignore that skill.   </p>
<p>You might be proud about your code. You should also be equally proud of the craft of writing… Writing is a highly underestimated skill for engineers.” – Urs Hölzle (Google’s first VP of Engineering)</p>
</blockquote>
<p>You are the person who's the most responsible for your skills and development. Being a better developer is largely up to you. It's your job to improve your weaknesses and hone your craft. Being a better developer is an ongoing process that never stops, and writing helps you learn more.</p>
<p>By writing, you force the boundaries of your comfort zone. You learn about new topics to discuss, and you "<strong>put yourself out there</strong>". You start a discourse where when you're wrong, people are very happy to correct you and offer feedback.</p>
<p>The best way to become a better engineer is to teach 10 people what you know, and empower them in their development skills.</p>
<p>Put your expertise online and open source what you know. Your technical writing acts as <a target="_blank" href="https://training.kalzumeus.com/newsletters/archive/do-not-end-the-week-with-nothing">portable capital</a> as you move job to job, to show the depth and breadth of your knowledge. Writing not only showcases your skills, but <strong>develops</strong> them, too.</p>
<h1 id="heading-read-a-lot">Read A Lot</h1>
<p>Mark Twain said that the person who can read good books but chooses not to do so has no advantage over the person who actually can't read a book.</p>
<p>Reading is such a powerful tool. <a target="_blank" href="https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner#Read-a-big-well-documented-codebase">Read a big well documented open source codebase</a>, read technical books, read your colleague's code and read technical documentation.</p>
<p>Find the brightest minds on Twitter, engineers with decades of experience and people who create the specs you love. Be a fly on the wall for their conversations.</p>
<p>As a starting challenge, change your <a target="_blank" href="https://docs.github.com/en/free-pro-team@latest/github/managing-subscriptions-and-notifications-on-github/viewing-your-subscriptions">watch preferences</a> on a codebase you are most familiar with (a work repo, or an open source one). Then review and read every change (or as many as you're comfortable with) that goes into <code>master</code>/<code>main</code>.</p>
<p>If there is syntax/code you don't understand or can't work out, ask the person who did it. Learn from everyone. It will help the coder clarify what the code is doing (if you can't work it out, it mustn't be very clear!) and will help you have more context on the changes for the ecosystem you work in.</p>
<h1 id="heading-work-on-passion-projects-andor-contribute-to-oss">Work on Passion projects and/or Contribute to OSS</h1>
<blockquote>
<p>"We are what we repeatedly do. Excellence, then, is not an act, but a habit." – Aristotle</p>
</blockquote>
<p>One of the largest jumps in my skills and confidence came when I made my first major program that <a target="_blank" href="https://github.com/AnonRobot/pathFinder.js/blob/master/PathFinder.js">visualised path finding algorithms</a>. I started with Djikstra and did A* too.</p>
<p>It forced me to:</p>
<ul>
<li>plan something out start to end</li>
<li>give estimates</li>
<li>hold myself accountable</li>
<li>work on new API's I was unfamiliar with</li>
<li>plan out my own architecture</li>
<li>consider how to implement clean design patterns</li>
</ul>
<p>If you aren't sure where to start, that's ok. <a target="_blank" href="https://github.com/public-apis/public-apis">Here's</a> a link to lots of public API's you can dev against, or some project ideas I collated <a target="_blank" href="https://github.com/kealanparr/Every-link-I-wish-I-had-as-a-beginner#Find-project-ideas-1">here</a>.</p>
<p>If you haven't got a <a target="_blank" href="https://kealanparr.com/">personal website</a>, start there!</p>
<p>Even just publishing my personal project was an amazing educational experience in itself. You end up learning the entire SDLC start to end, and fill in the gaps in your knowledge. </p>
<p>For me it was deployments and CI builds that I didn't know a lot about (I use <a target="_blank" href="https://www.netlify.com/">Netlify</a>). Working out things like:</p>
<ul>
<li>How do you want to test your project?</li>
<li>How will you release it?</li>
<li>Do you want automated builds?</li>
<li><p>Do you want to buy a domain for it? </p>
<p>You begin to self-educate in an intensely practical way, as you have an end goal in sight – getting the thing online!</p>
</li>
</ul>
<p>Everyone's passion projects look different. Plough away on some open source project for a few months, and see how much you grow. When you begin to interact with people from different countries, who have their own formed opinions and who don't know you, you can't help but learn from your mistakes. </p>
<p>You get the added benefit of identifying one smart person you get on well with, from whom you can glean valuable insight based on their years of coding and expertise. </p>
<p>If this works well for you – that is, having someone with whom to discuss your tech progress – you can apply for a mentor (for free) <a target="_blank" href="https://mentors.codingcoach.io/">here</a>.</p>
<p>You don't even have to code an entire program or app, but just work on something that you enjoy. Solve <a target="_blank" href="https://leetcode.com/problemset/all/">Leetcode problems</a> or <a target="_blank" href="https://www.codewars.com/">Codewars kata</a>s. <a target="_blank" href="https://compilers.iecc.com/crenshaw/">Write a compiler and a language</a>. Or read through almost 400 ideas <a target="_blank" href="https://github.com/danistefanovic/build-your-own-x">here</a>. </p>
<p>The biggest jumps in growth came when I had a few small projects I was trying to implement. Having lots to do (<strong>that I enjoyed!</strong>) forced me to adapt to become more time-efficient and made me code quicker.</p>
<h1 id="heading-make-sure-to-exercise-and-get-plenty-of-sleep">Make Sure to Exercise and Get Plenty of Sleep</h1>
<blockquote>
<p>"It is a shame for a [person] to grow old without seeing the beauty and strength of which [their] body is capable." – Socrates</p>
</blockquote>
<p>Exercise <a target="_blank" href="https://www.health.harvard.edu/blog/regular-exercise-changes-brain-improve-memory-thinking-skills-201404097110">helps your memory and your thinking, directly and indirectly</a>. The direct benefits of exercise are many, but among other things it:</p>
<ul>
<li>allows your body to reduce insulin resistance and inflammation </li>
<li>stimulates chemicals in your brain to affect the health of brain cells</li>
<li>encourages the growth of new blood vessels in the brain, and </li>
<li>even increases the quantity and survival rate of new brain cells.</li>
</ul>
<p>Indirectly, it can help you improve your mood and sleep and reduce stress and anxiety (which, research indicates, can impair cognitive function). </p>
<p><a target="_blank" href="https://www.health.harvard.edu/blog/regular-exercise-changes-brain-improve-memory-thinking-skills-201404097110">Studies have also suggested</a> that the prefrontal cortex (clarity of thinking) and the medial temporal cortex (memory) have greater volume in people who exercise versus people who don’t.</p>
<p>Just as it's important to look after your mental health, you need to look after your physical health as well. IQ drops off as we age, and one <a target="_blank" href="https://www.ncbi.nlm.nih.gov/pmc/articles/PMC4587595/#:~:text=Advancing%20age%20is%20associated%20with,ultimately%20affects%20quality%20of%20life.&amp;text=Clinically%2C%20these%20changes%20will%20present,and%20the%20onset%20of%20dementia.">theory</a> is that the amount of oxygen our brain receives slowly declines if we get old without staying in good cardiovascular health.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>My final bit of advice that ties all of this together is to try and consistently challenge yourself.  </p>
<p>There is a middle ground while you're working normally referred to as <a target="_blank" href="https://en.wikipedia.org/wiki/Flow_(psychology)">flow</a>. It happens when you're feeling fully energized and <strong>"in the zone"</strong>. </p>
<p>If you start something too difficult <a target="_blank" href="https://99u.adobe.com/articles/18486/not-too-hard-not-too-easy-finding-flow-in-your-work">you won't complete it due to feeling overwhelmed</a>. If you start something too easy, you won't complete it due to boredom. </p>
<p>You need to do your best to balance something being difficult enough to challenge you to learn new things and make you grow your skills versus being bored to death doing something well below your skill level.  </p>
<p>This is hard to accomplish when you first begin, because everything just feels too difficult. If you find yourself here, I'd recommend starting the <a target="_blank" href="https://www.freecodecamp.org/">freeCodeCamp curriculum</a> at the very beginning and working your way through the certifications.</p>
<p>Keep a notebook of ways you can grow and what you would have done differently when you make mistakes. Be kind to yourself, and keep moving forward learning all the way.</p>
<p>I tweet my articles <a target="_blank" href="https://twitter.com/kealanparr">here</a> if you would like to read more of my writing.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Solve Einstein's Five House Riddle ]]>
                </title>
                <description>
                    <![CDATA[ I recently learned about a logic puzzle online that apparently only 2% of people can solve. There are a few different incarnations of it – some have slightly different wording, different names, or change the items in the riddle slightly. But they are... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/einsteins-riddle/</link>
                <guid isPermaLink="false">66bc55ced94fa6cb67b8451b</guid>
                
                    <category>
                        <![CDATA[ logic ]]>
                    </category>
                
                    <category>
                        <![CDATA[ puzzles ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Wed, 08 Sep 2021 15:36:22 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/09/Capture.JPG" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I recently learned about a logic puzzle online that apparently only 2% of people can solve.</p>
<p>There are a few different incarnations of it – some have slightly different wording, different names, or change the items in the riddle slightly. But they are all the exact same core problem.</p>
<p>The riddle itself is used as a benchmark in the evaluation of <a target="_blank" href="https://en.wikipedia.org/wiki/Constraint_satisfaction_problem">constraint satisfaction problems</a> for computer algorithms.</p>
<h2 id="heading-what-is-the-einstein-riddle">What is the Einstein Riddle?</h2>
<p>Even the origin of it the riddle is a little unclear. It's famously known as the <strong>Einstein Riddle</strong> because it was supposedly created by Einstein as a young man for fun. Others say it was used by Einstein to only select the smartest PhD students he would supervise. </p>
<p>But there are some claims online that it actually was invented by the author of <em>Alice's Adventures in Wonderland</em>, <a target="_blank" href="https://en.wikipedia.org/wiki/Lewis_Carroll">Lewis Carrol</a>.</p>
<p>It's highly unlikely that it was written by Einstein, but that doesn't really matter. What's important is that, with a basic understanding of truth tables (and a bit of patience), you can solve it, too.</p>
<h2 id="heading-how-to-solve-einsteins-riddle">How to Solve Einstein's Riddle</h2>
<p>I'm now going to give you a list of clues, and then you will need to answer a question at the end of the clues.</p>
<p>Just to be absolutely clear, all the clues are enough for you to solve it. You don't need any extra hints, and there aren't any assumptions I expect you to know.</p>
<blockquote>
<p>There are 5 houses painted five different colors.<br>In each house lives a person with a different nationality.<br>These five owners drink a certain type of beverage, smoke a certain brand of cigar, and keep a certain pet.<br>No owners have the same pet, smoke the same brand of cigar, or drink the same beverage.</p>
</blockquote>
<ul>
<li>The Brit lives in the red house</li>
<li>The Swede keeps dogs as pets</li>
<li>The Dane drinks tea</li>
<li>The green house is on the left of the white house</li>
<li>The person who smokes Pall Malls rears birds</li>
<li>The owner of the yellow house smokes Dunhill</li>
<li>The green house’s owner drinks coffee</li>
<li>The man living in the center house drinks milk</li>
<li>The Norwegian lives in the first (leftmost) house</li>
<li>The man who smokes Blends lives next to the one who keeps cats</li>
<li>The man who keeps horses lives next to the man who smokes Dunhill</li>
<li>The owner who smokes BlueMaster drinks beer</li>
<li>The German smokes Princes</li>
<li>The Norwegian lives next to the blue house</li>
<li>The man who smokes Blends has a neighbor who drinks water</li>
</ul>
<p>Now to solve, <strong>tell me who owns the fish</strong>?</p>
<p>I solved it, but it did take me a couple attempts and a bit of scribbling on paper.</p>
<h2 id="heading-how-i-approached-the-problem">How I Approached the Problem</h2>
<p>To solve the problem, the first thing I did was to try and group together the clues. There are two references to the green house in the clues, so I tried to "solve" and consider those two clues together when I was able to.  </p>
<p>I then also filled out the center house's beverage as one clue immediately tells you, and I was also able to immediately fill out the leftmost house's nationality.</p>
<p>I essentially drew a really basic grid and eliminated and filled in possibilities based initially just on the clues. Then as I filled in more, I was able to fill in more details on other houses.  </p>
<p>I don't want to keep going with the hints if you want to solve this for yourself, but that's a starting point.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/09/image-29.png" alt="Image" width="600" height="400" loading="lazy">
<em>A screenshot of part of a 5x5 table with every different possibility of Nationality, Color, Beverage, Pet and Smoking Cigar that can be removed on click.</em></p>
<p>To try and make it easier for anyone who wants to solve it or check their answer, I have made a basic site you can find here: <a target="_blank" href="http://einsteins-riddle.com/">http://einsteins-riddle.com/</a> – the screenshot from above is a part of the grid on the site.</p>
<p>On that site, you'll find a table with all the options laid out as clickable buttons. The grid is initially filled out with all the possibilities, and as you learn more you can remove possibilities until eventually there is only one option left. </p>
<p>At the bottom is a "Check Answer" button that will evaluate what you have left on your grid.</p>
<p>Try and solve it and see how you get on! If you prefer to do it via paper please do so.</p>
<p>I wish you luck 😊</p>
<p>If it stumps you, and you want to know how to solve it, you can find the solution <a target="_blank" href="https://udel.edu/~os/riddle-solution.html">here</a>.</p>
<h2 id="heading-why-are-truth-tables-helpful">Why are Truth Tables Helpful?</h2>
<p>I enjoy trying to work through these truth table problems, as it helps improve my clarity of thought. </p>
<p>Sometimes when I'm coding and need to carefully consider some complex Boolean states in my code (not <strong>this</strong>, and not <strong>that OR this</strong> and <strong>that</strong> (and not <strong>those</strong>)) I think that these puzzles help me reason more clearly to simplify my code.</p>
<p>They also help me technically plan out my approach to a problem, from the very beginning to the eventual solution. </p>
<p>I start from a basic set of requirements and no idea how all they fit together. But as I move along, I can go through a process of fact finding, checking edge cases, verifying/testing my logic against the requirements and finally submitting my work. All of these steps translate exactly to software development.  </p>
<p>Whenever you have a complicated set of states you are confused by, draw a basic truth table. Or however you want to represent the problem. Breaking it down into smaller and smaller problems will allow you to solve almost anything.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>I hope this has been an enjoyable brain teaser, and that you solved as much or as little as was fun for you.</p>
<p>I share my writing on <a target="_blank" href="https://twitter.com/kealanparr">Twitter</a> if you enjoyed this article and want to see more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ What is the Strangler Fig Pattern and How it Helps Manage Legacy Code ]]>
                </title>
                <description>
                    <![CDATA[ Any sufficiently old codebase eventually starts to contain legacy code. Architecture, performance, comments, and more begin to degrade the moment after they are written. Some parts of the codebase last longer than other parts, but inevitably new codi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-the-strangler-pattern-in-software-development/</link>
                <guid isPermaLink="false">66bc5604d94fa6cb67b8452c</guid>
                
                    <category>
                        <![CDATA[ Productivity ]]>
                    </category>
                
                    <category>
                        <![CDATA[ self-improvement  ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web Development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Tue, 15 Jun 2021 17:43:43 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/02/Strangler-Fig.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Any sufficiently old codebase eventually starts to contain legacy code. Architecture, performance, comments, and more begin to degrade the moment after they are written.</p>
<p>Some parts of the codebase last longer than other parts, but inevitably new coding standards emerge to reduce technical debt. Then you have to rework a large application, with zero downtime, making a "new way" of working without breaking anything in your release or development. </p>
<p>The <strong>Strangler Fig Pattern</strong> is one effective way to solve this problem.</p>
<h2 id="heading-what-is-a-strangler-fig">What is a Strangler Fig?</h2>
<p>The name <strong><a target="_blank" href="https://en.wikipedia.org/wiki/Strangler_fig">Strangler Fig Pattern</a></strong> actually comes from a collection of plants that grow by "strangling" their hosts. </p>
<p>They grow in areas where competition for light is intense, and they have evolved to have their seeds dispersed (normally by birds) to the top of a host tree where they can get sunlight easily. </p>
<p>Their roots grow down around the tree and the seedlings grow upwards to consume all the sunlight they can. This "strangles" the tree and the fig seedlings can often kill their host tree they landed on.</p>
<p>Here's an image of a Strangler Fig, which I found on Wikipedia .</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-99.png" alt="Image" width="600" height="400" loading="lazy">
_An image of a strangler fig, where the roots grow down the tree trunk to the soil whilst the seedlings grow up above the trees canopy. <a target="_blank" href="https://upload.wikimedia.org/wikipedia/commons/4/46/Ficus_watkinsiana_on_Syzygium_hemilampra-Iluka.jpg">Source</a>._</p>
<p>So how does this apply to software? 🤔</p>
<h1 id="heading-what-is-the-strangler-fig-pattern">What is the Strangler Fig Pattern?</h1>
<p>To completely re-write a large, complex codebase with lots of different interactions often with different teams results in a planning nightmare. </p>
<p>In big complicated <strong>brown-field</strong> projects like this, going <strong>big-bang</strong> (where everything is released at once) generally forces you to: </p>
<ul>
<li>understand every interaction in depth to ensure you won't break anything when you release</li>
<li>have all new bug fixes done both in the new and old codebase as you re-write it</li>
<li>keep both merged and up-to date</li>
<li>spend weeks in test</li>
<li>deal with tons of callouts and out of hours support for the new codebase's rollout </li>
</ul>
<p>To top it all off, it normally ends with developers doing a lot of overtime along with an influx of bugs.</p>
<p>One big difficulty we are trying to remove when we use the <strong>Strangler Fig</strong> is making whoever is using your software aware of where your new software is now accessible.</p>
<p>When you are rewriting your backend, for example, if you put everything on a new endpoint and kindly ask your users to point to your new endpoint. But then if something goes wrong, you may have to ask them all to point back to the old one. </p>
<p>You may end up going back and forth between these two endpoints if you have really difficult bugs, which might frustrate your users.</p>
<p>When we use the <strong>Strangler Fig pattern</strong> we can avoid all the above.</p>
<h2 id="heading-why-strangle-our-code">Why Strangle Our Code</h2>
<p>The <strong>Strangler Fig pattern</strong> aims to incrementally re-write small parts of your codebase, until after a few months/years, you have strangled all your old codebase and it can be totally removed.</p>
<p>The rough flow is: add a new part to your system that isn't used yet, switch on the new part of the code – normally with a feature flag so it coexists with the old code – and finally remove the old code.</p>
<h3 id="heading-benefits-of-the-strangler-fig-pattern">Benefits of the Strangler Fig pattern</h3>
<p>Aside from helping you avoid all the issues we've already discussed, it also:</p>
<ul>
<li>reduces your risk when you need to update things </li>
<li>starts to immediately give you some benefit piece by piece</li>
<li>allows you to push your changes in small modular pieces, easier for release</li>
<li>ensures zero down time</li>
<li>is generally more agile</li>
<li>makes your rollbacks easier </li>
<li>allows you to spread your development on the codebase over a longer period of time if you have multiple priorities.</li>
</ul>
<p>There are multiple ways of implementing the <strong>Strangler Fig pattern</strong> and it depends on the system you're removing, and so on. So let's get concrete and cover an example.</p>
<h2 id="heading-facade-payment-provider-example">Façade Payment Provider Example</h2>
<p>Let's say as an example you have a huge monolithic back-end codebase to handle payments. It is <strong>huge</strong>. A few million lines of code, with multiple endpoints, that you want to re-write into something new for your company, for a multitude of reasons.</p>
<p>Performance is now poor, the architecture is too confusing to onboard new developers, and there is lots of <a target="_blank" href="https://www.freecodecamp.org/news/antipatterns-to-avoid-in-code/">dead-code</a> you need to remove but don't want to break anything. </p>
<p>Breaking a huge codebase involving customer payments might just cause the unlucky developer who pushed up last to lose their job!</p>
<p>Okay. How do you slowly choke out this old codebase? Even more tricky, you don't want to just put a new endpoint there and force everyone to move. You have hundreds of customers using this software, they can't just flip back and forth between your endpoints if you have bugs and need to rollback.</p>
<p>Just to add one last challenge, you don't want to change your interfaces to these endpoints either. Everything being passed as arguments or returned should remain the same.</p>
<h2 id="heading-the-strangler-fig-pattern-based-solution">The Strangler Fig Pattern-based Solution</h2>
<p>We can create a façade that intercepts requests going to the legacy endpoints.</p>
<p>The new façade will hand off to the new API you've written, or hand off to the legacy API if you haven't rewritten that piece of the codebase yet.</p>
<p>This façade is essentially a <a target="_blank" href="https://en.wikipedia.org/wiki/Shim_(computing)">shim</a> to catch network requests and hand them off to the right place. </p>
<p>You can then gradually migrate across to the new API piece by piece, and your users will be unaware of any changes to your underlying code as you have correctly abstracted it away.</p>
<p>If you are doing this correctly you will generally:</p>
<ul>
<li>Just have the legacy way at the beginning</li>
<li>Make the new API </li>
<li>Make it coexist with the legacy API, where you can turn it on and off with feature flags</li>
<li>Move more and more across to the new API</li>
<li>Delete the old way when fully migrated</li>
</ul>
<p>The <strong>strangling</strong> part is happening piece by piece where you remove more and more responsibility from the legacy API and into the new API.</p>
<h2 id="heading-conclusion"><strong>Conclusion</strong></h2>
<p>I hope this has explained what the <strong>Strangler Fig Pattern</strong> is along with some of its benefits.</p>
<p>I have seen this pattern used in real software projects and it works <em>really effectively.</em> It was easily one of the most complicated projects I worked on and the <strong>Strangler Fig</strong> made it so much easier.</p>
<p>It stops you from writing software projects for months, and then crossing your fingers and sending it to production whilst hoping you haven't forgotten anything.</p>
<p>There were two invaluable resources that were very useful when I was writing this:</p>
<ul>
<li><em>Strangler Fig Application</em> by Martin Fowler <a target="_blank" href="https://martinfowler.com/bliki/StranglerFigApplication.html">here</a>, and </li>
<li><em>Avoid rewriting a legacy system from scratch, by strangling it</em> found <a target="_blank" href="https://understandlegacycode.com/blog/avoid-rewriting-a-legacy-system-from-scratch-by-strangling-it/">here</a>.</li>
</ul>
<p>I share my writing on <a target="_blank" href="https://twitter.com/kealanparr">Twitter</a> if you enjoyed this article and want to see more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Manage Code Dependencies by Shimming Your Abstractions ]]>
                </title>
                <description>
                    <![CDATA[ Dependencies are a very common part of any sufficiently mature codebase. And it's important to cleanly handle any third party code that your program relies on to function. There are multiple ways to get third party code included and updated. And I re... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/manage-code-dependencies-by-shimming-your-abstractions/</link>
                <guid isPermaLink="false">66bc55e3d94fa6cb67b84525</guid>
                
                    <category>
                        <![CDATA[ clean code ]]>
                    </category>
                
                    <category>
                        <![CDATA[ dependency management ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 19 Apr 2021 23:19:44 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/04/Always-Shim-your-Abstractions.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Dependencies are a very common part of any sufficiently mature codebase. And it's important to cleanly handle any third party code that your program relies on to function.</p>
<p>There are multiple ways to get third party code included and updated. And I read something recently which has easily become my favourite way of doing this, so I had to share it.</p>
<p>This method is to <strong>Always Shim Your Abstractions.</strong></p>
<p>To properly break down what this means, let's define each word before we talk about the bigger idea that it encompasses.</p>
<h2 id="heading-abstractions">Abstractions</h2>
<p>Developers often use <strong>abstractions</strong> in code to simplify a system.</p>
<p><strong>Abstractions</strong> are a way of hiding complicated code inside something, and they normally provide an easy interface to use it. </p>
<p>So for example, let's say we have some complex code that ends up doing lots of very specific math. We can wrap all that logic up in a function and provide a really easy interface where you just pass in your number and the function will do the work.</p>
<p>We are essentially not forcing the person who uses our code to worry about the implementation details. They can just call the function and they'll get their answer back – they don't have to worry about what the function is doing "under the hood".</p>
<p><em>That's</em> the strength of abstracting details away in your code. </p>
<p>You can abstract things away in a multitude of data structures or code architecture. And you can abstract implementation details inside a prototype, class, function or more.  </p>
<p>If you had to understand every single line of code in a big codebase (let's say a 2 million line codebase) you'd never be able to start coding.</p>
<p>You can create a reusable, simple to understand, and easily changeable codebase by <strong>abstracting</strong> away certain details into the correct modules/separating out your code.</p>
<h3 id="heading-how-code-abstraction-works">How code abstraction works</h3>
<p>An example of abstracting away logic would be: imagine if you were creating a machine to make coffee for your users. There could be two approaches:</p>
<h4 id="heading-how-to-create-it-with-abstraction">How to Create it With Abstraction</h4>
<ul>
<li>Have a button with the title "Make coffee"</li>
</ul>
<h4 id="heading-how-to-create-it-without-abstraction">How to Create it Without Abstraction</h4>
<ul>
<li>Have a button with the title "Boil the water"</li>
<li>Have a button with the title "Add the cold water to the kettle"</li>
<li>Have a button with the title "Add 1 spoon of ground coffee to a clean cup"</li>
<li>Have a button with the title "Clean any dirty cups"</li>
<li>And all the other buttons</li>
</ul>
<p>Can you see how when we use abstraction we don't expect the user to know how the machine makes coffee? But in the machine without <strong>abstraction</strong>, the user has to know in which order to press each button which forces the user to understand how the coffee is made.</p>
<p>There's one definition we need to cover before we can move on and understand the concept I introduced at the beginning (always shim your abstractions), and that's shimming.</p>
<h2 id="heading-shimming">Shimming</h2>
<p><strong>Shimming</strong> is the act of putting something in front of something else to intercept data being passed. </p>
<p>Let's look at an example of how it works.</p>
<p>Let's say a bank has a really old API that doesn't accept JSON due to some technical legacy defect. Instead it can only accept XML. We'll call this <strong>LegacyAPI</strong>.</p>
<p>But a high percentage of developers who want to hit this bank API want to send JSON. The bank refuses to change LegacyAPI as it's too risky and might break the API. So much of their system depends on it, and they can't risk doing lots of new development and taking huge parts of their system down if they make a mistake.</p>
<p>They could always <strong>shim</strong> LegacyAPI if they don't want to do new development on it.</p>
<p>They could do this by creating an API that sits "in front" of LegacyAPI. We'll call it <strong>NewAPI</strong>. </p>
<p>The wording "in front" just means the order of who first deals with the network request. By "in front" we just mean NewAPI will be the first to receive the network requests. </p>
<p>You would tell the developers they can now hit NewAPI with JSON as they wanted, and NewAPI will turn the JSON into XML for the LegacyAPI and both parties can be satisfied.</p>
<p>The bank can now expand their services (they can accept JSON, for example) via the NewAPI without changing their old legacy API that they were wary of changing.</p>
<p>This is just one example of <strong>shimming</strong>. And just to review, it is essentially adding something in front of something else to act like a man in the middle to pass data to something else.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-50.png" alt="Image" width="600" height="400" loading="lazy">
<em>A diagram of how <strong>NewAPI</strong> intercepts <strong>LegacyAPI</strong> network requests.</em></p>
<p>Hopefully you have a good understanding of what shimming is and what abstractions are. Let's bring both definitions together to define what we mean by <strong>Always Shim Your Abstractions</strong>.</p>
<h2 id="heading-why-you-should-always-shim-your-abstractions">Why You Should Always Shim Your Abstractions</h2>
<h3 id="heading-the-problem">The problem</h3>
<p>Whenever we need to manage our dependencies, we want to make sure we stop the third party code "leaking" all over our main code.</p>
<p>By "leaking", I mean that the dependency code is imported multiple times to different places that need it in your code.</p>
<p>If you let a dependency "invade" your source code, you are becoming increasingly tightly coupled to it each time you import it.</p>
<p>This can (at times!) mean you will be forced to code in the direction the library choses as you are tightly coupled to it. This may end up leading to significant cognitive overhead as you are increasingly trying to make this library work in your code, but it isn't in keeping with the rest of your architectural decisions.</p>
<p>This can make any refactoring you need to do take much longer than if you isolated it. For example, if the dependency changes, what arguments would it need to accept to create an object in the dependency?</p>
<p>In addition to it being difficult to keep your build working well with the dependency, if it no longer suits your needs or you find a better library to replace it, your refactor becomes much more difficult to actually get rid of it.</p>
<h3 id="heading-the-solution">The solution</h3>
<p>To try and stop all the above from happening, firstly let's put any dependencies we need into their own modules where they're only referenced once in your codebase. </p>
<p>This is in essence our <strong>shim</strong>.</p>
<p>Whenever you need the third party dependency, you just have to import the wrapper module we put around it, to act like a "man in the middle", to provide a level before we call into our third-party dependency.</p>
<p>This <strong>shim</strong> module also allows us to make our dependencies <strong>abstractions</strong>. The developers who need to use our third party dependencies can just use an abstraction instead (you'll probably end up just wrapping it in a function or simple class). You'll default the arguments to sensible defaults and try to remove as much of the nitty gritty implementation details as you can.</p>
<p>Anywhere else that needs this dependency will just load your module and then that module can be injected where necessary.</p>
<p><strong>Why?</strong> One big reason we already discussed is that it stops your dependencies and your code from being too tightly coupled. </p>
<p>This works when you only have it in only one module. As long as everyone that is loading your module respects an interface/data contract for that module, everywhere else "gets it for free". Then you only have to change one module for lots of other places to get access to something.</p>
<p>This then allows us to make changes far more easily, and keeps a clean separation of concerns in the code.</p>
<p>We have only spoken here about one dependency – but you can see how much worse this may get if, for example, you are relying on 25 other custom libraries and you need to understand how they work. This would generally be a pretty fragile codebase, and would be a code smell.</p>
<h2 id="heading-http-dependency-example">HTTP dependency example</h2>
<p>Let's look at an example of a dependency you might use that makes a simple HTTP client.</p>
<p>It's a basic dependency that lets you hit endpoints and pass JSON etc as data.</p>
<p>Let's imagine then we currently are using <strong>Fetch</strong> in Node and we want to use <strong>Axios</strong> (another HTTP client we want to now switch to). We've decided to drop Fetch and switch to Axios because our application is growing in complexity and we have found that Axios now fits our use-cases better.</p>
<p>If Fetch has leaked all over our codebase, then our refactor to remove it is going to be much harder than it needs to be.</p>
<p>Rather than just go to our one module where we <strong>shimmed</strong> the function call, we now have to go to every place where we use it. This creates a domino effect in the source code that inevitably will occur from changing something in multiple places.</p>
<pre><code class="lang-javascript"><span class="hljs-comment">// You're now going to have to find any place you imported fetch</span>
<span class="hljs-comment">// Any place you alias'd it</span>
<span class="hljs-comment">// And deal with any source code failures wrapping around where you have used it once it's removed</span>
<span class="hljs-comment">// Which might be more complex than just simply searching for</span>
<span class="hljs-keyword">const</span> fetch = <span class="hljs-built_in">require</span>(<span class="hljs-string">'node-fetch'</span>);
</code></pre>
<p>We can improve this by wrapping the dependency into an appropriate <strong>shimmed abstraction</strong> and isolating its usage to one place.</p>
<p>You also get a win when onboarding people. They'll be able to see abstractions called <code>API</code> or <code>DataStore</code> which become clear signposts as to what your classes do (rather than a library that a developer may not be familiar with). </p>
<pre><code class="lang-javascript"><span class="hljs-comment">// In your abstractions, you get the power to give it a descriptive</span>
<span class="hljs-comment">// name, if the current name isn't clear in your code too, maybe like:</span>

<span class="hljs-keyword">var</span> Money = <span class="hljs-built_in">require</span>(<span class="hljs-string">'dinero'</span>)
</code></pre>
<p>This won't be an issue for well known dependencies like <strong>Express</strong> or <strong>Lodash</strong> maybe. But I don't have a perfect memory of every NPM package and what they do. </p>
<p>When you've properly <strong>shimmed</strong> it, it doesn't even matter to the developers using your shim if you are using Fetch or Axios "under the hood". They'll never know the difference if you change it, as long as you are sensible with the shim.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>I hope this gave a good overview of the benefits of <strong>shimming</strong>, and how it helps you maintain your dependencies.</p>
<p>This whole article was influenced by the writings of Sarah Dayan, found <a target="_blank" href="https://twitter.com/frontstuff_io/status/1264189583220244480">here</a>, and shared with her consent.</p>
<p>I share my writing on <a target="_blank" href="https://twitter.com/kealanparr">Twitter</a> if you enjoyed this article and want to see more.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Sparse Arrays vs Dense Arrays in JavaScript — Explained with Examples ]]>
                </title>
                <description>
                    <![CDATA[ I had a really interesting bug recently that, at first glance, completely stumped me.I saw I had an array that was empty. But the length was 31. Wait, what? What are dense arrays? Dense arrays are the most well known type of Array. They are the "norm... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/sparse-and-dense-arrays-in-javascript/</link>
                <guid isPermaLink="false">66bc55e8e35f27b35395075d</guid>
                
                    <category>
                        <![CDATA[ arrays ]]>
                    </category>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 08 Mar 2021 13:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/01/UwzSmIVOo.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>I had a really interesting bug recently that, at first glance, completely stumped me.<br>I saw I had an array that was empty. But the length was 31.</p>
<p>Wait, what?</p>
<h2 id="heading-what-are-dense-arrays">What are dense arrays?</h2>
<p>Dense arrays are the most well known type of <code>Array</code>. They are the "normal" arrays most are familiar with.</p>
<p>A dense array is an array where the elements are all sequential starting at index 0.</p>
<p>In this instance, the length property of an array accurately specifies the number of elements in the array.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> array = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]  
array.length <span class="hljs-comment">// Returns 5</span>
</code></pre>
<h2 id="heading-what-are-sparse-arrays">What are sparse arrays?</h2>
<p>A sparse array is one in which the elements are not sequential, and they don't always start at 0.</p>
<p>They are essentially <code>Array</code>s with "holes", or gaps in the sequence of their indices.</p>
<p>So an example would be:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> array = [];
array[<span class="hljs-number">100</span>] = <span class="hljs-string">"Holes now exist"</span>;
array.length <span class="hljs-comment">// 101, but only 1 element</span>
</code></pre>
<p>Normally, the length property of an <code>Array</code> accurately returns the number of elements in the array, but in sparse arrays they don't. If the array is sparse, the value of the length property is greater than the number of elements.</p>
<h1 id="heading-why-can-arrays-be-sparse">Why can <code>Array</code>s be sparse?</h1>
<p><code>Array</code>s under the hood in JavaScript are <code>Object</code>s. Their keys are numbers, and their values are the elements.</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599682873904/ByiIRL0vT.png" alt="image.png" width="309" height="189" loading="lazy"></p>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> array = [];
array[<span class="hljs-number">20</span>] = {};
array[<span class="hljs-number">100</span>] = {};
array[<span class="hljs-number">19</span>] = {};
alert(array.length); <span class="hljs-comment">// Logs 101</span>
</code></pre>
<p>The <code>length</code> property on an <code>Array</code> takes the last element's index and adds one. So if you have an array with holes between index 0 through 100, and an element at index 101, the <code>length</code> will return 101, as it's the last index + 1.</p>
<p>The above happens regardless of how many elements are in the <code>Array</code>.</p>
<p>The spec specifically details this behavior if you <a target="_blank" href="http://www.ecma-international.org/ecma-262/5.1/#sec-15.4.5.2">want to read more on the ECMAScript spec here.</a></p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599597131632/RiZ59nGj3.png" alt="image.png" width="1061" height="321" loading="lazy"></p>
<h1 id="heading-how-do-you-get-a-sparse-array">How do you get a sparse array?</h1>
<p>You have seen some ways already, but there are more:</p>
<h2 id="heading-use-the-array-object">Use the <code>Array</code> object</h2>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> array = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Array</span>(<span class="hljs-number">10</span>); <span class="hljs-comment">// array initialized with no elements</span>
array.length <span class="hljs-comment">// 10</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-53.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-insert-a-keyvalue-at-a-certain-index">Insert a key/value at a certain index</h2>
<pre><code class="lang-javascript">array[<span class="hljs-number">1000</span>] = <span class="hljs-number">0</span>; <span class="hljs-comment">// Assignment adds one element </span>
array.length <span class="hljs-comment">// But .length returns 1001</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-54.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-use-the-delete-operator">Use the <code>delete</code> operator</h2>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> array = [<span class="hljs-number">1</span>, <span class="hljs-number">2</span>, <span class="hljs-number">3</span>, <span class="hljs-number">4</span>, <span class="hljs-number">5</span>]
<span class="hljs-keyword">delete</span> array[<span class="hljs-number">0</span>]
array.length <span class="hljs-comment">// .length returns 5</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-55.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-initialize-an-array-with-holes">Initialize an <code>Array</code> with holes</h2>
<pre><code class="lang-javascript">[,,,,] <span class="hljs-comment">// You have created an array with nothing but holes</span>
[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,,<span class="hljs-number">5</span>] <span class="hljs-comment">// Oh no, you mistyped a comma and entered a hole between 4 and 5!</span>
</code></pre>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/01/image-56.png" alt="Image" width="600" height="400" loading="lazy"></p>
<h2 id="heading-browser-implementation-differences">Browser implementation differences</h2>
<p>The browser you are on (as well as the version) represents sparse array's holes differently.</p>
<p>Chrome displays this the best (in my opinion) and shows <code>empty</code>.  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599687555328/dX4b8NGcj.png" alt="image.png" width="767" height="381" loading="lazy"></p>
<p>The newest version of Firefox (80.0.1 at the time of witting) shows it like so:  </p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1599598536385/vfQk4COPj.png" alt="image.png" width="813" height="256" loading="lazy"></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>The final solution of the bug I introduced at the beginning is to just check that the element isn't falsy before using it.  Something like:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">let</span> array = [,,,,]
<span class="hljs-keyword">for</span>(<span class="hljs-keyword">let</span> i = <span class="hljs-number">0</span>; i &lt; array.length; i++){
    <span class="hljs-keyword">if</span> (array[i]) {
        <span class="hljs-built_in">console</span>.log(array[i])
    }
}
</code></pre>
<p>Because the holes are falsy, it won't do the logic you are trying on any holes you have in the <code>Array</code>.</p>
<p>So why did my browser show it as empty?</p>
<p>I was using Safari and it showed nothing for the holes. So I  logged out the <code>Array</code>'s length which was 31, and when I logged out the contents it just showed me an empty array! Pretty confusing at first glance.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ How to Write for freeCodeCamp News ]]>
                </title>
                <description>
                    <![CDATA[ Writing is an important skill for a developer to have. It's how you convey your ideas, influence people, advocate for your skills and pay raises, as well as produce comments and documentation to assist others. “What many people underestimate is that... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/how-to-write-for-freecodecamp/</link>
                <guid isPermaLink="false">66bc55e0d94fa6cb67b84523</guid>
                
                    <category>
                        <![CDATA[ freeCodeCamp.org ]]>
                    </category>
                
                    <category>
                        <![CDATA[ technical writing ]]>
                    </category>
                
                    <category>
                        <![CDATA[ writing tips ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Kealan Parr ]]>
                </dc:creator>
                <pubDate>Mon, 01 Mar 2021 21:45:22 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/03/write-for-fcc--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>Writing is an important skill for a developer to have.</p>
<p>It's how you convey your ideas, influence people, advocate for your skills and pay raises, as well as produce comments and documentation to assist others.</p>
<blockquote>
<p>“What many people underestimate is that being a good writer,<br>whether that is through emails or through documents, allows you<br>to be more impactful. I see many engineers ignore that skill.   </p>
<p>You might be proud about your code. You should also be equally proud<br>of the craft of writing… Writing is a highly underestimated skill<br>for engineers.” –<strong>Urs Hölzle (Google’s first VP of Engineering)</strong></p>
</blockquote>
<p>Writing can:</p>
<ul>
<li>Impress future employers</li>
<li>Help you solidify what you recently learned</li>
<li>Share insights to other developers</li>
<li>Save others the pain of hours of research</li>
</ul>
<p><strong>freeCodeCamp</strong> can really help develop your writing skills too. They can help give you ideas based on what people are searching for, and they proof-read and edit your writing to make sure everything is explained well. Then they help publish it to a wide, diverse audience.</p>
<p>All this is done by the <strong>Editorial team</strong> and they're all really friendly and (most importantly) really useful. As you write more articles, you will learn more about who everyone is and how they can help you.</p>
<p>I'm going to briefly explain how I started writing for <strong>freeCodeCamp</strong> and my experience with it so far. We'll also touch on <strong>freeCodeCamp</strong>'s publication style guide which you can find <a target="_blank" href="https://www.freecodecamp.org/news/developer-news-style-guide/">here</a>.</p>
<h1 id="heading-who-writes-for-freecodecamp">Who writes for freeCodeCamp?</h1>
<p>There are all sorts of people who write for freeCodeCamp.</p>
<p>Some are professional teachers who run programming courses, some are indie developers, some are still learning programming, others are full-time employed software engineers...and the list goes on.</p>
<p>There are people from all different places in the world who speak many different first languages – lots of voices are represented on <strong>freeCodeCamp</strong>.</p>
<p>There are no hard prerequisites for becoming a contributor to <strong>freeCodeCamp News</strong>. They don't check whether you have a Computer Science degree (in fact, many self-taught programmers write articles on News), submit you to a test, or expect you to finish their entire curriculum before writing.</p>
<p>You just need to have some prior writing experience so you can provide samples of your work when you apply to become a contributor.</p>
<p>But there are some guidelines about the content you contribute (maybe <strong>freeCodeCamp</strong> isn't the place for your lasagne recipe).</p>
<p>I'm a full time software engineer. I write to learn more about topics I find interesting. </p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/02/image-59.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><strong>freeCodeCamp</strong> distributes their articles so widely that last month alone (January 2021) people spent 600 hours reading the articles I wrote. That's pretty cool.</p>
<h1 id="heading-what-does-freecodecamps-style-guide-cover">What does freeCodeCamp's style guide cover?</h1>
<p>The <a target="_blank" href="https://www.freecodecamp.org/news/developer-news-style-guide/">style guide</a> is the way <strong>freeCodeCamp</strong> standardises their expectations and guidelines so that all contributors know how best to research, write, and present their articles. It also helps ensure that what is published is high quality.</p>
<p>The style guide covers topics like article length, composition tips, how to write a good headline, how to choose a cover image, how not to plagiarize others' work, some rules about cross posting, and a lot more.</p>
<p>I also found it useful to take a Google technical writing course that you can find <a target="_blank" href="https://developers.google.com/tech-writing/one">here</a>. If you don't want to take the course, you can read my summary of it <a target="_blank" href="https://www.freecodecamp.org/news/what-google-taught-me-about-technical-writting/">here</a> if you don't have the 4 hours to do it all.</p>
<p>This course helped me learn some common helpful tips for technical writing, but it's not mandatory for <strong>freeCodeCamp</strong>.</p>
<h1 id="heading-how-do-freecodecamp-authors-apply">How do freeCodeCamp authors apply?</h1>
<p>If you want to apply to become a contributor to freeCodeCamp News, you should first <a target="_blank" href="https://www.freecodecamp.org/news/developer-news-style-guide/">read the style guide</a>. In it, you'll find the application form.</p>
<p>When you're filling out the application, you are asked to link to 3 articles you have written in the past. </p>
<p>If you don't have three samples, or the work you've done is private, make an account on <a target="_blank" href="https://dev.to/">dev.to</a> or <a target="_blank" href="https://hashnode.com/">Hashnode</a> and write some articles. This helps the freeCodeCamp <strong>Editorial team</strong> learn about your writing style, what you like to write about, and whether you'd be a good fit for the publication. </p>
<p>I just want to really emphasise that you should read <strong>freeCodeCamp</strong>'s <a target="_blank" href="https://www.freecodecamp.org/news/developer-news-style-guide/">style guide</a>. Read it two or three times and email the team if you aren't 100% sure about what something means. </p>
<p>If you write those 3 articles following <strong>freeCodeCamp</strong>'s style guidelines, you will hugely increase your chances of being approved as a contributor.</p>
<p>But they do also "<em>only approve a small percentage</em>" of contributor applicants, so don't be discouraged if you don't make it the first time around.</p>
<p>My best advice to get approved is to try and find what is missing from articles you are currently reading. Are you going to write the articles for total beginners or intermediates? How much detail are you going to put in? Do you have a favourite programming language? How much do you use humour? None, or lots of jokey references? How should readers apply this knowledge? </p>
<p>When I first started writing I got the genre wrong a few times (I wrote satire for one article, and some article ideas I had weren't great). But through some practice and speaking to the team, I started to improve and understand what <strong>freeCodeCamp</strong>'s genre is.</p>
<h2 id="heading-but-i-cant-write-well">But I can't write well</h2>
<p>So what? The best way to improve is by writing! If you feel like your writing skills are weak, try and set yourself a specific goal – for example to write 50 words a week on any topic. Something achievable for you, and on a topic you will enjoy.</p>
<p>Give yourself 6 months to see if you are making improvements. Reflect on what you don't like about your writing and try to address it. </p>
<p>My only other advice to improve your writing is to read more. The more I have read, the better my writing has become over time by seeing how others do it.</p>
<h2 id="heading-i-dont-know-what-to-write-about">I don't know what to write about!</h2>
<p>Write about something you want to learn about. You don't have to be an expert in something to write about it. You develop expertise by writing, discussing, and researching topics you're passionate about.</p>
<p>You can also ask the <strong>Editorial team</strong> too if you want some help once you get your contributor account.</p>
<h2 id="heading-what-if-im-wrong">What if I'm wrong?</h2>
<p>It's proof read by the team so you aren't alone. They offer a second pair of eyes, and you are able to make edits post-publishing if you misunderstood something in your research.</p>
<p>It's a good way to learn, too. When you publish something and you're wrong, people will direct message you to correct you. I have been messaged about things people thought were unclear. I thanked them and reviewed what they said, which often helped me improve that article.</p>
<p>Don't feel too scared about failure to try it!</p>
<h2 id="heading-i-write-too-slowly">I write too slowly</h2>
<p><strong>freeCodeCamp</strong> doesn't have a schedule for you. They don't email you to chase you about writing an article a week.</p>
<p>You just write as and when you want to, and the Editorial team are there to proof read and help in any way they can when you're ready. If you only want to publish once a year, go for it!</p>
<h2 id="heading-english-is-not-my-first-language">English is not my first language</h2>
<p>This is the case for many freeCodeCamp News contributors. They're practising English by writing, and contributing to the <strong>freeCodeCamp</strong> audience.</p>
<p>I hope you feel encouraged rather than intimidated to push your comfort zone boundaries if you have always wanted to try technical writing.</p>
<h1 id="heading-conclusion">Conclusion</h1>
<p>You can <a target="_blank" href="https://www.freecodecamp.org/news/developer-news-style-guide/">apply here</a> to contribute to <strong>freeCodeCamp News</strong>.</p>
<p>Part of my writing was influenced by a talk Quincy did <a target="_blank" href="https://www.youtube.com/watch?v=Ef07Hhoc5KE">here</a> about writing technical articles. I would encourage you to watch if you plan to apply to <strong>freeCodeCamp</strong> in the future. He also gives some fascinating case studies of people who began writing and some benefits that came from it.</p>
<p>I have enormously enjoyed writing for freeCodeCamp and it's been an incredibly positive experience for me. I would encourage anyone to try their hand at writing. </p>
<p>Even if you don't end up doing it at <strong>freeCodeCamp</strong> it's a skill worth investing time in, and makes you a well rounded developer.</p>
<p>I share my writing on <a target="_blank" href="https://twitter.com/kealanparr">Twitter</a> if you enjoyed this article and want to see more.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
