<?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[ FOSS - 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[ FOSS - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 15:48:57 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/foss/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ What is Open Source? How to Contribute to OSS Projects ]]>
                </title>
                <description>
                    <![CDATA[ In this article, we'll talk about open source software. Open source software is often considered free software.  In this article, I'll give a high-level explanation of what open source software (OSS) really is, its advantages in the modern technologi... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/what-is-open-source-software/</link>
                <guid isPermaLink="false">66b906c853c4132f77b5c305</guid>
                
                    <category>
                        <![CDATA[ Collaboration ]]>
                    </category>
                
                    <category>
                        <![CDATA[ FOSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Destiny Erhabor ]]>
                </dc:creator>
                <pubDate>Tue, 16 Aug 2022 20:23:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2022/08/pexels-ben-taylor-109998.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>In this article, we'll talk about open source software. Open source software is often considered free software. </p>
<p>In this article, I'll give a high-level explanation of what open source software (OSS) really is, its advantages in the modern technological world, how to use it, and some best practices to follow when using or contributing to an OSS project. </p>
<p>You will learn about widely used tools and techniques like GitHub and continuous integration, as well as what license to choose and how to promote diversity in open source projects.</p>
<p>You will also get to make your first open source contributions if you haven't done so already.</p>
<p>Both maintainers and contributors to open source projects should read this article.</p>
<h2 id="heading-table-of-contents">Table of Contents</h2>
<ul>
<li><a class="post-section-overview" href="#heading-what-is-oss">What is OSS</a>?</li>
<li><a class="post-section-overview" href="#heading-what-is-proprietary-software">What is Proprietary Software</a>?</li>
<li><a class="post-section-overview" href="#heading-open-source-governance-models">Open Source Governance Models</a></li>
<li><a class="post-section-overview" href="#heading-why-use-open-source-projects-advantages">Why Use Open Source Projects (Advantages)</a>?</li>
<li><a class="post-section-overview" href="#heading-how-to-work-on-an-oss-project">How to Work on an OSS Project</a></li>
<li><a class="post-section-overview" href="#heading-how-to-contribute-to-open-source-projects">How to Contribute to Open Source Projects</a></li>
<li><a class="post-section-overview" href="#heading-helpful-contribution-tips">Helpful Contribution Tips</a></li>
<li><a class="post-section-overview" href="#heading-continuous-integration-and-delivery">Continuous Integration and Delivery</a></li>
<li><a class="post-section-overview" href="#oss-licenses-and-legal-issues">OSS Licenses and Legal Issues</a></li>
<li><a class="post-section-overview" href="#how-to-chose-a-license-for-your-oss-project">How to Choose a License for Your OSS Project</a></li>
<li><a class="post-section-overview" href="#heading-how-to-build-better-open-source-software-projects">How to Build Better Open Source Software Projects</a></li>
<li><a class="post-section-overview" href="#heading-understand-that-leadership-is-not-control">Understand that Leadership is Not Control</a></li>
<li><a class="post-section-overview" href="#heading-why-many-oss-projects-fail">Why Many OSS Projects Fail</a></li>
<li><a class="post-section-overview" href="#heading-diversity-in-oss">Diversity in OSS</a></li>
<li><a class="post-section-overview" href="#heading-how-to-use-github-for-hosting-oss-projects">How to Use GitHub for Hosting OSS Projects</a></li>
</ul>
<h1 id="heading-what-is-oss">What is OSS?</h1>
<p>OSS stands for Open Source Software. This type of software has freely accessible source code under a license that lets you examine, modify, and use that code without restriction.</p>
<h1 id="heading-what-is-proprietary-software">What is Proprietary Software?</h1>
<p>As opposed to OSS, many companies use proprietary software instead. Only the owners of proprietary software have complete access to the source code. Trusted partners can inspect the code once they've signed a non-disclosure agreement.</p>
<p>When using proprietary software, you must agree to a license that limits your ability to share the product.</p>
<h1 id="heading-open-source-governance-models">Open Source Governance Models</h1>
<p>Any organization that wants to succeed needs to be organized. It's important to carefully consider how the organization make decisions and who makes them. </p>
<p>Establishing a Governance Model helps determine how you can accomplish this. Let's talk about some of these models now.</p>
<h3 id="heading-company-led-governance-model">Company-led Governance Model</h3>
<p>In this model, software development and release management is handled by a single entity. </p>
<ul>
<li>External contributions may or may not be requested.</li>
<li>Plans and release dates may not be publicly disclosed, and unofficial conversations may not be made public.</li>
<li>Software is in the open (that is, it's public) when it is released. </li>
<li>An example of this model is Android by Google.</li>
</ul>
<h3 id="heading-benevolent-dictatorship-governance-model">Benevolent Dictatorship Governance Model</h3>
<p>In this model, one individual has a dominant influence over the software – hence the term "dictator" (but in a much more positive sense here).</p>
<ul>
<li>The quality and effectiveness of the project are greatly influenced by the dictator's intelligence and managerial ability</li>
<li>As a project matures, the maintainer writes less code, which can cut down on discussions and speed up progress.</li>
<li>An example of this type of governance is Wikipedia</li>
</ul>
<h3 id="heading-board-of-governors-governance-model-tighter-regulation">Board of Governors Governance Model (Tighter Regulation)</h3>
<ul>
<li>All discussions are public via mailing lists, and collective choices are taken.</li>
<li>The governing board decides who may contribute and whether new software is accepted.</li>
<li>Releases are sometimes made less frequently, but they are carefully debugged. </li>
<li>Examples are Debian and FreeBSD</li>
</ul>
<h1 id="heading-why-use-open-source-projects-advantages">Why Use Open Source Projects (Advantages)</h1>
<p>There are quite a few advantages of going into open source development. Here are some of them:</p>
<ul>
<li>You collaborate with other contributors and often get better results</li>
<li>The source code is often more secure and higher quality </li>
<li>Using OSS best practices helps developers become better</li>
<li>It reduces the development cost</li>
<li>It decreases the time to market</li>
<li>Customers can trust the quality because there are no secrets and they know what they are getting</li>
<li>You'll have access to a vast array of inexpensive or free instructional aids for education and learning</li>
<li>It's a good way to introduce beginners to the workplace</li>
</ul>
<h1 id="heading-how-to-work-on-an-oss-project">How to Work on an OSS Project</h1>
<h2 id="heading-how-to-contribute-to-open-source-projects">How to Contribute to Open Source Projects</h2>
<p>Before contributing to open source projects, you should do some research around the project. Here are some ways to prepare:</p>
<h3 id="heading-investigate-the-project">Investigate the project</h3>
<p>Before you start working on a project, you'll want to learn more about it. First, you should identify and understand the project workflow and styles it uses. Second, you should figure out the scope and nature of the work that needs doing.</p>
<h3 id="heading-learn-about-its-communication-methods">Learn About its Communication Methods</h3>
<p>Identify how the project maintainers communicate, either through study archives, a mailing list, or some online groups or chat platform.</p>
<h3 id="heading-figure-out-how-contributions-are-submitted">Figure Out How Contributions Are Submitted</h3>
<p>Contributions to the OSS project can be in the form of a mailing list, email, or – perhaps most commonly – through the Git version control system.</p>
<h3 id="heading-study-the-projects-previous-history">Study the Project's Previous History</h3>
<p>Studying the history of the project is always a great idea so you know how it started and how it's been developed. Check if the project offers veteran contributors as mentors.</p>
<h3 id="heading-be-the-janitor-at-first">Be the Janitor at First</h3>
<p>Offer your services for testing, finding bugs, and so on before you begin to submit code. This is healthy for beginners and people new to the OSS lifestyle. It's meant to be a temporary stage.</p>
<h3 id="heading-understand-the-projects-language">Understand the Project's Language</h3>
<p>People frequently get interested in learning new programming languages by participating in open source projects that use those languages. But don't use the project as a way to <strong>learn the language</strong>.</p>
<p>Before thinking about making a software contribution, you should have some familiarity with the language. Most maintainers want qualified contributions only – they likely don't have time to teach you Python or JavaScript, for example. </p>
<p>So make sure you are proficient in the programming language(s) the project uses before contributing. Don't begin learning with a project.</p>
<h3 id="heading-be-respectful">Be Respectful</h3>
<p>Being polite and respectful is an integral part in the OSS community as it involves diverse people. Always avoid flaming and trolling, as they have no place in the open source community.</p>
<h3 id="heading-find-a-balance">Find a Balance</h3>
<p>Try to achieve a balance between asking for feedback and suggestions early in the process and delaying your requests too long and overloading maintainers with a bunch of work at once.</p>
<h3 id="heading-study-and-understand-the-projects-structure-dna">Study and Understand the Project's Structure (DNA)</h3>
<p>Most likely, the project already has a formal or informal leadership structure and a community-established culture.</p>
<p>Look into the project's purpose and the impetus behind it. Learn about how big or small the contributions typically are, how vibrant the community is, and what kind of license is being used.</p>
<h2 id="heading-helpful-contribution-tips">Helpful Contribution Tips</h2>
<p>To successfully make contributions to open source projects, there are some best practices you can follow.</p>
<p>First, you'll want to identify the maintainers, their work, and their techniques‌‌. There are projects with a single maintainer or many maintainers for individual subsystems.‌‌ </p>
<p>Maintainers have various responsibilities as well. They need to be able to understand and review all submissions and verify that they do not add unnecessary complexity or defects. They should also make sure that these changes don't conflict with existing code.</p>
<p>You can develop a rapport with project maintainers and help them with debugging, reviewing, and other tasks as needed.</p>
<p>It's also important when you're working on a project to get input early and work in the open.</p>
<p>Here are some other quick tips to keep in mind:</p>
<ol>
<li>The project probably has a lot of history, so check to make sure your issue hasn't already been resolved or someone else hasn't submitted a pull request to fix it. Your proposal might be a dated one.</li>
<li>Don't propose a fresh idea and have someone else carry it out. This shows that you're not committed to contributing.</li>
<li>If you are uncomfortable having other people look at your work often, OSS might not be the best fit for you. However, it could be an opportunity to learn how to take feedback and constructive criticism.</li>
<li>Contribute a little bit at a time – don't make a large code dump all at once.</li>
<li>Leave your ego at the door. You will sometimes get hash reviews and you need to be able to calmly internalize the feedback.</li>
<li>Do not discriminate against others.</li>
<li>Be patient and work to develop long-term professional relationships with others in the OSS community.</li>
</ol>
<h2 id="heading-continuous-integration-and-delivery">Continuous Integration and Delivery</h2>
<p>When you're working on an OSS project, there will probably be established guidelines for the codebase to prevent conflicts, since many contributors will be working together on it. Testing can also help make sure the code works as it should.</p>
<h3 id="heading-what-is-continuous-integration">What is Continuous integration?</h3>
<p>Continuous integration techniques help ensure that testing is done often and that any issues won't go undiscovered for long. CI also helps make sure that scattered developers remain in sync, even if they're collaborating remotely all over the world.</p>
<p>The different stages of continuous integration are Integration, Delivery, and Deployment.</p>
<ul>
<li><strong>Continuous Delivery</strong>: Translates to the practice of having a speedy and automatic delivery or release process once charges have been merged, and it is released to build clients.</li>
<li><strong>Continuous Deployment</strong>: When the product is actually released to clients</li>
</ul>
<p>Examples of some continuous integration tools are:</p>
<ul>
<li>Jenkins</li>
<li>CircleCI</li>
<li>GitLab</li>
<li>Travis</li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/cd.png" alt="continuous integration and delivery" width="600" height="400" loading="lazy">
<em><strong>Continuous integration and delivery process</strong>. credits: <a target="_blank" href="https://substack.com/profile/2655972-ronak-kumar-samantray">Ronak Kumar Samantray</a></em></p>
<h3 id="heading-what-benefits-do-cicd-have-for-oss">What Benefits Do CI/CD Have for OSS?</h3>
<p>When a bunch of contributors are working on various aspects of a project from various perspectives and places, it must come together and not be in conflict. Additionally, fixing one issue shouldn't lead to the emergence of new issues elsewhere. </p>
<p>To accomplish all this, you must use some automated testing. So when testing, you should take into account many factors, such as:</p>
<ul>
<li>Whether you may implement modifications that overlap at the same time.</li>
<li>Whether there are any conflicts.</li>
<li>If the project is still able to compile after the changes are applied.</li>
<li>If you make all the necessary changes, can you ship it?</li>
<li>Does it work on all possible targets?</li>
</ul>
<p>By ensuring that testing is constant, automated, and performed regularly, any problems that arise are swiftly fixed, and developers and users remain on the same page. And <strong>Continuous integration</strong> makes sure that any of these issues are minimized.</p>
<h2 id="heading-oss-licenses-an-legal-issues">OSS Licenses an Legal issues</h2>
<h3 id="heading-what-is-an-open-source-license">What is an Open Source License?</h3>
<p>An open-source license is a sort of license for software that permits the use, modification, and/or sharing of the source code, blueprint, or design under specific terms and conditions. </p>
<p>Then end users or developers can review and modify the source code, blueprint, or design for their own use cases, curiosity, or troubleshooting requirements. Although it is not always the case, open-source licensed software is typically offered free of charge.</p>
<p>There are two types of software licenses that OSS projects generally use:</p>
<ul>
<li><strong>Restrictive</strong> – the software remains open, but it has strict restrictions on any attempts to create proprietary closed goods. Changes to the code are also made available to future recipients, such as the GPL License.</li>
<li><strong>Permissive</strong> – these licenses don't demand updates and alterations to be publicly accessible, such as BSD and Apache fences.</li>
</ul>
<p>Companies should consult with lawyers, either internal or external, to ensure that they do not violate copyrights and licenses when using code from open source projects. </p>
<p>There are many different licenses, so be careful. But once an organization establishes proper standard operating procedures, they must follow them for every project. </p>
<p>OSS Licenses help gives contributors a better idea about how to use and contribute to the source code.</p>
<h3 id="heading-most-common-licenses">Most Common Licenses</h3>
<ul>
<li>GNU General Public License (GPL) </li>
<li>MIT license</li>
<li>Apache License 2.0</li>
<li>BSD 3-Clause "New" or "Revised" license</li>
<li>BSD 2-Clause "Simplified" or "FreeBSD" license</li>
<li>GNU Library or "Lesser" General Public License (LGPL)</li>
<li>Mozilla Public License 2.0</li>
<li>Common Development and Distribution License</li>
</ul>
<h3 id="heading-how-to-choose-a-license-for-your-oss-project">How to Choose a License for Your OSS Project</h3>
<p>This is a crucial choice that has to be carefully considered because it may be difficult or even impossible to switch to a different license later in the project's existence.</p>
<p>Here are some things to consider when choosing one for your project:</p>
<ul>
<li>If you need a simple and permissive license, the MIT License is succinct and direct. It gives users practically unlimited access to your project. Examples of projects that use the MIT License include .NET and Rails.</li>
<li>If you are more concerned about sharing improvements, almost everything can be done with your project under the GNU GPLv3, with the exception of disseminating closed source versions. Examples of projects employing this license include Ansible and Bash.</li>
</ul>
<p>Read more about choosing the best license for your project suit <a target="_blank" href="http://oss-watch.ac.uk/apps/licdiff/">here</a> and <a target="_blank" href="https://choosealicense.com/">here</a>.</p>
<h1 id="heading-how-to-build-better-open-source-software-projects">How to Build Better Open Source Software Projects</h1>
<h2 id="heading-understand-that-leadership-is-not-control">Understand that Leadership is not Control</h2>
<p>An effective leader allows and encourages all participants to speak up and share their ideals while contributing. This often leads to more creative, high-quality work. So remember: loosen the reins when you can.</p>
<p>According to the well-known leadership paradigm known as the "Benevolent Dictator for Life" (BDFL), a project's controllers can only do so much if they take without giving back via teaching and moderating.</p>
<p>Also, if you're a maintainer, make sure you go through some training to learn how to be a good leader. Having a good mentor, for example, is vital in helping you acquire the information and skills required to become a good maintainer.</p>
<p>If the maintainer isn't helpful or supportive, new project participants will often move on to another project if they can't connect with an experienced contributor.</p>
<p>And finally, remember that an open-source project cannot succeed without trust. Reputations are built up over time, and new members should be cognizant of the past.</p>
<h2 id="heading-why-many-oss-projects-fail">Why Many OSS Projects Fail</h2>
<p>Most successful open source projects started off small and grew slowly. It's often hard to predict which projects will be successful and which won't.</p>
<p>Some of the reasons OSS project fail are:</p>
<ol>
<li>They try to do the same thing as more mature programs.</li>
<li>They don't have good leadership.</li>
<li>There's a general lack of interest in their product/service.</li>
<li>They don't have enough developers</li>
<li>They don't have the correct license.</li>
</ol>
<p>To combat these issues, here are some things to keep in mind:</p>
<ul>
<li>Make sure you have good and effective leadership, because this leads to more creative, high-quality work.</li>
<li>Make sure your project has a well-defined governance structure and license.</li>
<li>Encourage developers working on your project by providing resources and information to help them start contributing.</li>
</ul>
<h2 id="heading-diversity-in-oss">Diversity in OSS</h2>
<p>The word "Open" in open source software (OSS) may be taken to mean a welcome, friendly environment. But this may only be a false promise if the project doesn't cultivate a welcoming atmosphere.</p>
<p>There are various forms of diversity, such as nationality and race, sex and gender identity, regional or geographic location, politics and belief systems, and so on.</p>
<p>It's important to respect and foster diversity in whatever ways you're able to do so. Some ways to foster diversity in the OSS space include:</p>
<ul>
<li>Respecting peoples beliefs and religions</li>
<li>Not being biased against contributors for any reasons relating to race, sex, gender identity, location, beliefs, and so on.</li>
<li>Valuing the contributors of all your contributors and engaging with them whenever possible.</li>
</ul>
<h2 id="heading-how-to-use-github-for-hosting-oss-projects">How to Use GitHub for Hosting OSS Projects</h2>
<p>Before GitHub, projects needed their own servers to host repositories. They also needed developers with extensive technical skills to set up, manage, and protect the repositories' integrity.</p>
<p>Developers can now primarily concentrate on the code by using GitHub or other Git hosting services like GitLab or Bitbucket.</p>
<h3 id="heading-types-of-repositories">Types of Repositories</h3>
<p>There are two types of repositories on Git:</p>
<ul>
<li><strong>Public Repositories</strong> that are accessible to everyone on the internet.</li>
<li><strong>Private Repositories</strong>, which are only accessible to you, people you explicitly share access with, and, for organization repositories, certain organization members.</li>
</ul>
<h3 id="heading-hands-on-practice-using-github-for-collaboration">Hands-on practice using GitHub for collaboration</h3>
<p>Now we'll go through some basic steps, which, when you get them down, will provide you with the ultimate superpower in effective collaboration.</p>
<p>We will understand more fully by building a name biography website. So let's dive in:</p>
<p><strong>Here's the</strong> <a target="_blank" href="https://github.com/Caesarsage/OSS-Contribution-Beginer.git"><strong>Project Repo</strong></a> <strong>so you can follow along.</strong></p>
<h4 id="heading-step-1-fork-the-repository">Step 1 – Fork the repository</h4>
<p>This is to create a copy of the repository of the project in your gitHub account for more accessibility.</p>
<p>Then, click on the <strong>project link above</strong> and then fork the repository. To fork a repository, click the fork button at the top right corner of the GitHub website of the repo.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/fork.jpg" alt="fork repository" width="600" height="400" loading="lazy">
<em>fork repository</em></p>
<h4 id="heading-step-2-clone-the-repository">Step 2 – Clone the repository</h4>
<p>Cloning is creating a copy of the code online (your repository) on your local computer so you can work on it from there.</p>
<p>Cloning the repository on your computer is sometimes referred to as using a "<strong>local repository</strong>".</p>
<p>Click the code tab on the forked project on your GitHub and then click the copy code icon as show below:</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/clone.jpg" alt="clone repository" width="600" height="400" loading="lazy">
<em>clone repository</em></p>
<p>Now let’s go to your local computer. Open your favorite code editor (mine is VSCode) and open the inbuilt terminal. Then paste the code you copied after a 'git clone' command to clone this project repository to your local computer as shown below:</p>
<pre><code class="lang-git">git clone &lt;your-copy-code&gt;
</code></pre>
<p>Now in your terminal, move to the generated project folder with the code below:</p>
<pre><code class="lang-git">cd OSS-Contribution-Beginer
</code></pre>
<h4 id="heading-step-3-create-a-branch-from-your-local-repository">Step 3 – Create a branch from your local repository</h4>
<p>Branches allow you to make changes without affecting other contributors' code and the main branch. it is always good to create your own branch when contributing to projects.</p>
<p>To do this is simple – just write the following code:</p>
<pre><code class="lang-git">git branch ‘name-of-the-branch-you-want

e.g git branch caesar-name
</code></pre>
<p>Then you can switch to the branch you just created:</p>
<pre><code class="lang-git">git checkout caesar-name
</code></pre>
<h4 id="heading-step-4-make-changes-to-the-repository">Step 4 – Make changes to the repository</h4>
<p>In this scenario, our problem is to change the <a target="_blank" href="http://README.md">README.md</a> to include your name, social media handle, and preferred emoji (you can browse how to get markdown emoji).</p>
<p>Scroll to the bottom of the <a target="_blank" href="http://README.md">README.md</a> file. Add your name, social handles, and emoji to the list. Then save the changes.</p>
<h4 id="heading-step-5-add-and-commit-your-changes">Step 5 – ADD and COMMIT your changes</h4>
<p>Adding and committing your changes is a way to save the changes you made into your local Git repository.</p>
<p>To achieve this, in your terminal run the following commands:</p>
<pre><code class="lang-git">git add .
</code></pre>
<p>Then commit the code:</p>
<pre><code class="lang-git">git commit –m “added my name bio”
</code></pre>
<h4 id="heading-step-6-push-it-online">Step 6 – Push it online</h4>
<p>All we did in <strong>step five</strong> has been on your local computer or repository. Now it's time to push it to the original online repository on GitHub.</p>
<p>You can do this with the few lines of code below:</p>
<pre><code class="lang-git">git push origin –u ‘your branch name’
i.e
git push origin –u caesar-name
</code></pre>
<p><strong>Step 7 –  Make a pull request (PR)</strong></p>
<p>You can let people know about changes you've pushed to a branch in a GitHub repository by making a pull request.</p>
<p>Before your modifications are merged into the main branch, you can examine and validate the prospective changes with collaborators and the maintainer after you submit a pull request. You can even add follow-up contributions.</p>
<p>Go to your forked repository in GitHub online, see your resent changes that you just pushed, and click on compare and pull. Then click the create pull request button.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/github-comparepr.png" alt="pull request" width="600" height="400" loading="lazy">
<em>Pull request</em></p>
<p><img src="https://www.freecodecamp.org/news/content/images/2022/08/open-a-pull-request_crop.jpg" alt="pull request" width="600" height="400" loading="lazy">
<em>pull request</em></p>
<p>Hurray! Congratulations. 🔥💡 You've successfully made your first open source contribution.</p>
<h1 id="heading-summary">Summary</h1>
<p>The open source ecosystem is a wide and interesting one, and you can benefit a lot from collaborating with others and making contributions.</p>
<p>In this article, you learned how open source projects work, what to consider when getting started, how to contribute, and how the different licenses work.</p>
<p>As always, I hope you enjoyed the article and learned something new. If you want, you can also follow me on <a target="_blank" href="https://www.linkedin.com/in/destiny-erhabor">LinkedIn</a> or <a target="_blank" href="https://twitter.com/caesar_sage">Twitter</a>.</p>
<p>Cheers and see you in the next one! ✌️</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Boost Your Programming Skills by Reading Git's Code ]]>
                </title>
                <description>
                    <![CDATA[ These days there are plenty of trendy ways to improve your programming skills and knowledge, including: Taking a free or paid online programming course Reading a programming book Picking a personal project and hacking away to learn as you code Fo... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/boost-programming-skills-read-git-code/</link>
                <guid isPermaLink="false">66d45f33f855545810e9345c</guid>
                
                    <category>
                        <![CDATA[ C ]]>
                    </category>
                
                    <category>
                        <![CDATA[ FOSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Git ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jacob Stopak ]]>
                </dc:creator>
                <pubDate>Wed, 10 Mar 2021 01:40:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2021/03/Boost-Your-Programming-Skills-by-Reading-Git-s-Code.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>These days there are plenty of trendy ways to improve your programming skills and knowledge, including:</p>
<ul>
<li><p>Taking a free or paid online programming course</p>
</li>
<li><p>Reading a programming book</p>
</li>
<li><p>Picking a personal project and hacking away to learn as you code</p>
</li>
<li><p>Following along with an online tutorial project</p>
</li>
<li><p>Keeping up to date with relevant programming blogs</p>
</li>
</ul>
<p>Each of these methods will appeal to different people, and each one has elements that will definitely make you a better programmer. If you are an intermediate or advanced coder, it is almost certain that you've tried each of these methods at least once.</p>
<p>However, there is another method that the vast majority of developers overlook, which is a shame in my opinion because it has so much to offer. This method is to <strong>learn by reading, analyzing, and understanding existing, high-quality codebases!</strong></p>
<p>We are lucky to live in a time where good code is often accessible for free via high-quality, free-and-open-source (FOSS) projects. And it takes less than a minute to clone down copies of these codebases to our local machines from sites like GitHub or BitBucket.</p>
<p>Furthermore, modern version control systems like Git allow us to view the code at any point in its development history. Clearly there is a wealth of information right in front of our noses!</p>
<p>In this article, we will discuss the original version of Git's code in order to highlight how reading existing code can help boost your coding skills.</p>
<p>We will cover why it's worth learning about Git's code, how to access Git's code, and review some related C programming concepts.</p>
<p>We will provide an overview of Git's original codebase structure and learn how Git's core functionalities are implemented in code.</p>
<p>Finally, we will recommend some next steps for curious developers to continue learning from Git's code and other projects.</p>
<h2 id="heading-why-learn-about-gits-code">Why Learn About Git's Code?</h2>
<p>Git's codebase is an incredible resource for intermediate developers to further their programming knowledge and skills. Here are 7 reasons why it's worth digging into Git's code:</p>
<ol>
<li><p>Git is probably the most popular software dev tool in use today. In short, if you're a developer, you probably use Git. Learning how Git's code works will give you a deeper understanding of an essential tool you work with every day.</p>
</li>
<li><p>Git is interesting! Git is a versatile tool that solves many interesting problems to allow developers to collaborate on code. As a curious human, I thoroughly enjoyed learning more about it.</p>
</li>
<li><p>Git's code is written in the <strong>C</strong> programming language, which offers a great opportunity for developers to branch out into an important language they may not have used much before.</p>
</li>
<li><p>Git makes use of many important programming concepts, including <em>content-addressable databases, file compression/inflation, hash functions, caching,</em> and a <em>simple</em> <em>data model</em>. Git's code illustrates how these concepts can be implemented in a real project.</p>
</li>
<li><p>Git's code and design are <em>elegant.</em> It is a great example of a functional, minimalist codebase that accomplishes its goal in a clear, effective way.</p>
</li>
<li><p>Git's initial commit is small in size – it is made up of only 10 files, containing less than 1,000 total lines of code. This is very small compared to most other projects and is very manageable to understand in a reasonable amount of time.</p>
</li>
<li><p>The code in Git's initial commit can be compiled and executed successfully. This means you can play with and test the original version of Git's code to see how it works.</p>
</li>
</ol>
<p>Now, let's take a look at how to access the original version of Git's code.</p>
<h2 id="heading-how-to-check-out-gits-initial-commit">How to check out Git's initial commit?</h2>
<p>The official copy of Git's codebase is hosted in <a target="_blank" href="https://github.com/git/git">this public GitHub repository</a>. However, I created a fork of Git's codebase and added extensive inline comments to the source code, to help developers easily read through it line by line.</p>
<p>Since I worked off of the very first commit in Git's history, I named this project <strong>Baby Git</strong>. The Baby Git codebase is located in <a target="_blank" href="https://bitbucket.org/jacobstopak/baby-git">this public BitBucket repository</a>.</p>
<p>I recommend cloning the Baby Git codebase to your local machine by running the following command in your terminal:</p>
<pre><code class="lang-sh">git <span class="hljs-built_in">clone</span> https://bitbucket.org/jacobstopak/baby-git.git
</code></pre>
<p>If you want to stick with Git's original codebase (without the extensive comments I added), use this command instead:</p>
<pre><code class="lang-sh">git <span class="hljs-built_in">clone</span> https://github.com/git/git.git
</code></pre>
<p>Browse into the new <code>git</code> directory by running the command <code>cd git</code>. Feel free to poke around the folders and files in here.</p>
<p>You'll quickly notice that in the current version of Git – the version currently checked out in your working directory – that there are <strong>a lot</strong> of files containing a lot of very long and complicated-looking code.</p>
<p>Clearly this current version of Git is too big for a single developer to realistically get acquainted with in a reasonable amount of time.</p>
<p>Let's simplify things by checking out Git's initial commit, using the command:</p>
<pre><code class="lang-sh">git <span class="hljs-built_in">log</span> --reverse
</code></pre>
<p>This shows a list of Git's commit log in reverse order, starting from Git's initial commit. Note that the first commit ID in the list is <code>e83c5163316f89bfbde7d9ab23ca2e25604af290</code>.</p>
<p>Check out the contents of this commit into the working directory by running the command:</p>
<pre><code class="lang-sh">git checkout e83c5163316f89bfbde7d9ab23ca2e25604af290
</code></pre>
<p>This <a target="_blank" href="https://initialcommit.com/blog/what-is-git-head">puts Git into a <em>detached head state</em></a> and places Git's original code files into the working directory.</p>
<p>Now run the <code>ls</code> command to list these files, and note that there are only 10 that actually contain code! (The 11th is just a README). Understanding the code in these files is totally manageable for an intermediate developer!</p>
<p><strong>Note:</strong> If you're using my Baby Git repository, you'll want to run the command <code>git checkout master</code> to abandon the detached head and move back to the tip of the master branch. This will enable you to see all the inline comments describing how Git's code works line by line!</p>
<h2 id="heading-important-c-concepts-that-will-help-you-understand-gits-code">Important C Concepts that Will Help You Understand Git's Code</h2>
<p>Before diving straight into Git's code, it helps to get a refresher on a few C programming concepts that appear throughout the codebase.</p>
<h3 id="heading-c-header-files">C Header Files</h3>
<p>A C header file is a code file ending in the <code>.h</code> extension. Header files are used to store variables, functions, and other C objects that a developer wants to include in multiple <code>.c</code> source code files using the <code>#include "headerFile.h"</code> directive.</p>
<p>If you're familiar with importing files in Python or Java, this is a comparable procedure.</p>
<h3 id="heading-c-function-prototypes-or-function-signatures">C Function Prototypes (or Function Signatures)</h3>
<p>A function prototype or signature tells the C compiler information about a function definition – the function's name, number of argument, types of arguments, and return type – without providing a function body. They help the C compiler identify function properties in situations where the function body appears after the function is called.</p>
<p>Here is an example of a function prototype:</p>
<pre><code class="lang-c"><span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">multiplyNumbers</span><span class="hljs-params">(<span class="hljs-keyword">int</span> a, <span class="hljs-keyword">int</span> b)</span></span>;
</code></pre>
<h3 id="heading-c-macros">C Macros</h3>
<p>A macro in C is essentially a rudimentary variable that is processed before code compilation in a C program. Macros are created using the <code>#define</code> directive, such as:</p>
<pre><code class="lang-c"><span class="hljs-meta">#<span class="hljs-meta-keyword">define</span> TESTMACRO asdf</span>
</code></pre>
<p>This creates a macro called <code>TESTMACRO</code> with a value of <code>asdf</code>. Wherever the placeholder <code>TESTMACRO</code> is used in the code, it will be replaced by the preprocessor (before code compilation) with the value <code>asdf</code>.</p>
<p>Macros are commonly used in a few ways:</p>
<ul>
<li><p>As a true/false switch by checking whether a macro is defined</p>
</li>
<li><p>To store a simple integer or string value to be replaced in the code in multiple locations</p>
</li>
<li><p>To store a simple (usually one-line) code snippet to be replaced in the code in multiple locations</p>
</li>
</ul>
<p>Macros are convenient tools since they enable developers to update a single line of code which influences the behavior of the code in multiple locations.</p>
<h3 id="heading-c-structs">C Structs</h3>
<p>A struct in C is a grouped set of properties that are related to a single object.</p>
<p>You are probably familiar with Classes in languages such as Java and Python. A struct is a predecessor to a class – it can be thought of as a primitive class with no methods.</p>
<pre><code class="lang-c"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">person</span> {</span>

    <span class="hljs-keyword">int</span> person_id;
    <span class="hljs-keyword">char</span> *first_name;
    <span class="hljs-keyword">char</span> *last_name;

};
</code></pre>
<p>This struct represents a person, by grouping together an ID field, along with the person's first and last names. A variable can be instantiated and initialized from this struct as follows:</p>
<pre><code class="lang-c"><span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">person</span> <span class="hljs-title">jacob</span> = {</span> <span class="hljs-number">1</span>, <span class="hljs-string">"Jacob"</span>, <span class="hljs-string">"Stopak"</span> };
</code></pre>
<p>Struct properties can be retrieved using the dot operator:</p>
<pre><code class="lang-c">jacob.person_id
jacob.first_name
jacob.last_name
</code></pre>
<h3 id="heading-c-pointers">C Pointers</h3>
<p>A pointer is a memory address of a variable – it is the memory address at which the value of that variable is stored.</p>
<p>A pointer to an existing variable can be obtained by using the <code>&amp;</code> symbol, and stored in a pointer variable declared with the <code>*</code> symbol:</p>
<pre><code class="lang-c"><span class="hljs-keyword">int</span> age = <span class="hljs-number">21</span>;

<span class="hljs-keyword">int</span>* age_pointer = &amp;age;
</code></pre>
<p>This snippet defines the variable <code>age</code> and assigns it a value of 21. Then it defines a <em>pointer to an integer</em> called <code>age_pointer</code>, and uses the <code>&amp;</code> to obtain the memory address that the value of the age variable is stored at.</p>
<p>Pointers can be <em>dereferenced</em> (i.e. obtain the value stored at the memory address), using the <code>*</code> as well.</p>
<pre><code class="lang-c"><span class="hljs-keyword">int</span> new_age = *age_pointer + <span class="hljs-number">10</span>;
</code></pre>
<p>Continuing from our previous example, we use the <code>*age_pointer</code> syntax to fetch the value stored in the pointer (21), and add 10 to it. So the <code>new_age</code> variable would contain a value of 31.</p>
<p>Now that our short segue into C programming is completed, let's get back to Git's code.</p>
<h2 id="heading-overview-of-gits-codebase-structure">Overview of Git's Codebase Structure</h2>
<p>There are ten relevant code files that make up Git's initial commit. We'll start by briefly discussing these two:</p>
<ul>
<li><p>Makefile</p>
</li>
<li><p>cache.h</p>
</li>
</ul>
<p>We'll discuss <code>Makefile</code> and <code>cache.h</code> first because they are a bit special.</p>
<p><code>Makefile</code> is a build file that contains a set of commands used to build the other source code files into executables.</p>
<p>When you run the command <code>make all</code> from the command line, the Makefile will compile the source code files and spit out the relevant executables for Git's commands. If you're interested, I wrote an <a target="_blank" href="https://initialcommit.com/blog/Learn-Git-Makefile">in-depth guide on Git's makefile</a>.</p>
<p><strong>Note:</strong> If you actually want to compile Git's code locally, which I recommend you do, you'll need to use my Baby Git version of the code mentioned above. The reason is that I made some tweaks to allow Git's original code to compile on modern operating systems.</p>
<p>Next up is the <code>cache.h</code> file, which is Baby Git's only header file. As mentioned above, the header file defines many of the function signatures, structs, macros, and other settings that are used in the <code>.c</code> source code files. If you're curious, I wrote an <a target="_blank" href="https://initialcommit.com/blog/Learn-Git-Header-Files">in-depth guide on Git's header file</a>.</p>
<p>The remaining eight code files are all <code>.c</code> source code files:</p>
<ul>
<li><p><code>init-db.c</code></p>
</li>
<li><p><code>update-cache.c</code></p>
</li>
<li><p><code>read-cache.c</code></p>
</li>
<li><p><code>write-tree.c</code></p>
</li>
<li><p><code>commit-tree.c</code></p>
</li>
<li><p><code>read-tree.c</code></p>
</li>
<li><p><code>cat-file.c</code></p>
</li>
<li><p><code>show-diff.c</code></p>
</li>
</ul>
<p>Each file (except <code>read-cache.c</code>) is named after the Git command that it contains the code for – some probably look familiar to you. For example, the <code>init-db.c</code> file contains the code for the <code>init-db</code> command used to initialize a new Git repository. As you probably guessed, this was the precursor to the <code>git init</code> command.</p>
<p>In fact, each of these <code>.c</code> files (except <code>read-cache.c</code>) contains the code for one of the original eight Git commands. The build process compiles each of these files and creates an executable file (with matching name) for each one. Once these executables are added to the filesystem path, they can be executed similarly to any modern Git command.</p>
<p>So after compiling the code using the <code>make all</code> command, the following executables are produced:</p>
<ul>
<li><p><code>init-db</code>: Initializes a new Git repository. Equivalent to <code>git init</code>.</p>
</li>
<li><p><code>update-cache</code>: Add a file to the staging index. Equivalent to <code>git add</code>.</p>
</li>
<li><p><code>write-tree</code>: Creates a tree object in the Git repository from the current index contents.</p>
</li>
<li><p><code>commit-tree</code>: Creates a new commit object in the Git repository. Equivalent to <code>git commit</code>.</p>
</li>
<li><p><code>read-tree</code>: Print out the contents of a tree from the Git repository.</p>
</li>
<li><p><code>cat-file</code>: Retrieve the the contents of an object from the Git repository, and store it in a temporary file in the current directory. Equivalent to <code>git show</code>.</p>
</li>
<li><p><code>show-diff</code>: Show the differences between files staged in the index and the current versions of those files as they exist in the filesystem. Equivalent to <code>git diff</code>.</p>
</li>
</ul>
<p>These commands are executed individually in sequence, similar to how modern Git commands are executed as a part of standard development workflows.</p>
<p>The one file we haven't discussed yet is <code>read-cache.c</code>. This file contains a set of helper functions that the other <code>.c</code> source code files use to retrieve information from the Git repository.</p>
<p>Now that we've touched on each of the important files in Git's initial commit, let's discuss some of the core programming concepts that allow Git to function.</p>
<h2 id="heading-implementation-of-gits-core-concepts">Implementation of Git's Core Concepts</h2>
<p>In this section, we'll discuss the following programming concepts that Git uses to work its magic, as well as how they were implemented in Git's original code:</p>
<ul>
<li><p>File compression</p>
</li>
<li><p>Hash function</p>
</li>
<li><p>Objects</p>
</li>
<li><p>Current directory cache (staging area)</p>
</li>
<li><p>Content addressable database (object database)</p>
</li>
</ul>
<h3 id="heading-file-compression">File Compression</h3>
<p>File compression, also know as deflation, is used for storage and performance efficiency in Git. This reduces the size of the files that Git stores on disk and increases the speed of data retrieval when Git needs to transfer these files across a network.</p>
<p>This is important since Git's local and network operations need to be as fast as possible. As a part of the data retrieval process, Git decompresses, or inflates, the files to obtain their content.</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/image-37.png" alt="Image" width="600" height="400" loading="lazy"></p>
<p><em>Source: https://initialcommit.com/blog/Learn-Git-Guidebook-For-Developers-Chapter-2</em></p>
<p>File deflation and inflation were implemented in Git's original code using the popular <code>zlib.h</code> C library. This library contains functions, structures, and properties for compressing and decompressing content. Specifically, <code>Zlib</code> defines a <code>z_stream</code> struct that is used to hold the content that is to be deflated or inflated.</p>
<p>The following <code>zlib</code> functions are used to <em>initialize</em> a stream for deflation or inflation, respectively:</p>
<pre><code class="lang-c"><span class="hljs-comment">/*
 * Initializes the internal `z_stream` state
 * for compression at `level`, which indicates
 * scale of speed versuss compression on a 
 * scale from 0-9. Sourced from &lt;zlib.h&gt;.
 */</span>
deflateInit(z_stream, level);

<span class="hljs-comment">/*
 * Initializes the internal `z_stream` state for
 * decompression. Sourced from &lt;zlib.h&gt;.
 */</span>
inflateInit(z_stream);
</code></pre>
<p>The following <code>zlib</code> functions are used to perform the actual deflation and inflation operations:</p>
<pre><code class="lang-c"><span class="hljs-comment">/*
 * Compresses as much data as possible and stops
 * when the input buffer becomes empty or the
 * output buffer becomes full. Sourced from &lt;zlib.h&gt;.
 */</span>
deflate(z_stream, flush);

<span class="hljs-comment">/*
 * Decompresses as much data as possible and stops
 * when the input buffer becomes empty or the
 * output buffer becomes full. Sourced from &lt;zlib.h&gt;.
 */</span>
inflate(z_stream, flush);
</code></pre>
<p>The actual deflation/inflation process is a bit more complex than this and involves setting several parameters of the compression stream, but we won't go into more detail here.</p>
<p>Next, we'll discuss the concept of hash functions and how they are implemented in Git's original code.</p>
<h3 id="heading-hash-functions">Hash Functions</h3>
<p>A hash function is a function that can easily transform an input into a unique output, but makes it very difficult or impossible to reverse that operation. In other words, it is a <strong>one-way function</strong>. It is not possible with today's technology to use the output of a hash function to deduce the input that was used to generate that output.</p>
<p>Git uses a hash function – specifically the SHA-1 hash function – to generate unique identifiers for the files we tell Git to track.</p>
<p>As developers, we make changes to the code files in the codebase we are working on using a text editor, and at some point we tell Git to track those changes. At this point, Git uses those file changes as inputs for the hash function.</p>
<p>The output to the hash function is called a <strong>hash*</strong>.* The hash is a hexadecimal value 40 characters in length, such as <code>47a013e660d408619d894b20806b1d5086aab03b</code>.</p>
<p><img src="https://initialcommit.com/img/initialcommit/figure5.png" alt="Git hash function" width="894" height="462" loading="lazy"></p>
<p><em>Source: https://initialcommit.com/blog/Learn-Git-Guidebook-For-Developers-Chapter-2</em></p>
<p>Git uses these hashes for various purposes that we will see in the following sections.</p>
<h3 id="heading-objects">Objects</h3>
<p>Git uses a simple data model – a structured set of related objects – to implement its functionality. These objects are the nuggets of information that enable Git to track changes to the files of a codebase. The three types of objects that Git uses are:</p>
<ul>
<li><p>Blob</p>
</li>
<li><p>Tree</p>
</li>
<li><p>Commit</p>
</li>
</ul>
<p>Let's discuss each one in turn.</p>
<h4 id="heading-blob">Blob</h4>
<p>A blob is short for a <strong>B</strong>inary <strong>L</strong>arge <strong>OB</strong>ject. When Git is told to track a file using the <code>update-cache &lt;filename.ext&gt;</code> command, (the predecessor to <code>git add</code>), Git creates a new blob using the compressed contents of that file.</p>
<p>Git takes the content of the file, compresses it using the <code>zlib</code> functions we described above, and uses this compressed content as input to the SHA-1 hash function. This creates a 40 character hash that Git uses to identify the blob in question.</p>
<p>Finally, Git saves the blob as a binary file in a special folder called the <strong>object database</strong> (more on this in a minute). The name of the blob file is the generated hash, and the contents of the blob file are the compressed file contents that were added using <code>update-cache</code>.</p>
<h4 id="heading-tree">Tree</h4>
<p>Tree objects are used to link together multiple blobs that are added to Git at once. They are also used to correlate blobs with file names (and other file metadata like permissions), since blobs don't provide any information besides the hash and compressed binary file content.</p>
<p>For example, if two changed files are added using the <code>update-cache</code> command, a tree will be created containing the hashes of those files, along with the file name that each of those blobs corresponds to.</p>
<p>What Git does next is very interesting, so pay attention. Git uses <strong>the content of the tree itself</strong> as input to the SHA-1 hash function, which generates a 40 character hash. This hash is used to identify the tree object, and Git saves this in the same special folder that blobs are saved in – the object database we'll touch on shortly.</p>
<h4 id="heading-commit">Commit</h4>
<p>You're probably more familiar with commit objects than with blobs and trees. A commit represents a set of file changes saved by Git, along with descriptive information about the change such as a commit message, the author's name, and the timestamp of the commit.</p>
<p>In Git's original code, a commit object is the result of running the <code>commit-tree &lt;tree-hash&gt;</code> command. The resulting commit object includes the specified tree object (which remember, represents a collection of file changes via one or more blobs mapped to their file names), and the descriptive information mentioned in the previous paragraph.</p>
<p>Like blobs and trees, Git identifies the commit by hashing its content using the SHA-1 hash function, and saving it in the object database. Importantly, each commit object also contains the hash of its parent commit. In this way, the commits form a chain that Git can use to represent the history of a project.</p>
<h3 id="heading-current-directory-cache-staging-area">Current Directory Cache (Staging Area)</h3>
<p>You probably know Git's staging area as the place your changed files go after using the <code>git add</code> command, patiently waiting to be committed using <code>git commit</code>. But what exactly is the staging area?</p>
<p>In Git's original version, the staging area is called the <strong>current directory cache</strong>. The current directory cache is just a binary file stored in the repository at the path <code>.dircache/index</code>.</p>
<p>As mentioned in the previous section, after changed files are added to Git using the <code>update-cache</code> (<code>git add</code>) command, Git calculates the blob and tree objects associated with those changes. The generated tree object associated with the staged files is added to the <code>index</code> file.</p>
<p>It is called a <strong>cache</strong> because it is just a temporary storage location for the staged changes to reside before being committed. When the user makes a commit by running the <code>commit-tree</code> command, the tree from the current directory cache can be supplied. It also includes other commit information like the commit message for Git to create a new commit object with.</p>
<p>At that point the <code>index</code> file is simply removed to make room for new changes to be staged.</p>
<h3 id="heading-content-addressable-database-object-database">Content Addressable Database (Object Database)</h3>
<p>The object database is Git's primary storage location. This is where all the objects we discussed above – blobs, trees, and commits – are stored. In Git's original version, the object database is simply a directory at the path <code>.dircache/objects/</code>.</p>
<p>When Git creates objects through operations such as <code>update-cache</code>, <code>write-tree</code>, and <code>commit-tree</code>, (the predecessors of <code>git add</code> and <code>git commit</code>), these objects are compressed, hashed, and stored in the object database.</p>
<p>The name of each object is the hash of its content, hence why the object database is also called a <strong>content addressable database*</strong>.* Each piece of content (blob, tree, or commit) is stored and retrieved based on an identifier generated from the content itself.</p>
<p>The modern version of Git works very much the same way. The difference is that storage formats have been optimized to use more efficient methods (especially related to data transfer over networks), but the basic principles are the same.</p>
<h2 id="heading-summary">Summary</h2>
<p>In this article, we discussed the original version of Git's code in order to highlight how reading existing code can help boost your coding skills.</p>
<p>We covered the reasons Git is a great project to learn from in this way, how to access Git's code, and reviewed some related C programming concepts. Finally, we provided an overview of Git's original codebase structure and dove into some concepts that Git's code relies on.</p>
<h2 id="heading-next-steps">Next Steps</h2>
<p>If you're interested in learning more about Git's code, <a target="_blank" href="https://initialcommit.com/store/baby-git-guidebook-for-developers">we wrote a guidebook you can check out here</a>. This book dives into Git's original C code in detail and directly explains how the code works.</p>
<p>I encourage any and all developers to explore the open-source community to try and find quality projects that interest you. Those projects will have codebases that you can clone down in a matter of minutes.</p>
<p>Take some time to poke around the code, and you might learn something you never expected to find.</p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Effective Developer Advocacy for Highly-Technical Projects ]]>
                </title>
                <description>
                    <![CDATA[ By David Nugent I'm interviewing my colleague Lennart Frantzell, a fellow developer advocate on the IBM Developer San Francisco team. Inside IBM, Lennart focuses on one of our most technically in-depth communities: Blockchain. Q: Your developer advoc... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/effective-developer-advocacy-for-highly-technical-projects/</link>
                <guid isPermaLink="false">66d45e0847a8245f78752a1c</guid>
                
                    <category>
                        <![CDATA[ Blockchain ]]>
                    </category>
                
                    <category>
                        <![CDATA[ developer relations ]]>
                    </category>
                
                    <category>
                        <![CDATA[ FOSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Free Software ]]>
                    </category>
                
                    <category>
                        <![CDATA[ marketing ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 28 Jun 2019 15:08:45 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/news/content/images/2019/06/lennart-banner.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By David Nugent</p>
<p>I'm interviewing my colleague Lennart Frantzell, a fellow developer advocate on the IBM Developer San Francisco team. Inside IBM, Lennart focuses on one of our most technically in-depth communities: Blockchain.</p>
<h3 id="heading-q-your-developer-advocacy-efforts-focus-on-projects-with-large-codebases-and-technical-architectures-that-requires-developers-to-adapt-their-mental-models-can-you-tell-us-about-them">Q: Your developer advocacy efforts focus on projects with large codebases and technical architectures that requires developers to adapt their mental models. Can you tell us about them?</h3>
<p>When I came to Silicon Valley in the late 80s I worked on one of the most exciting projects imaginable, Expert Systems, the precursor to today's AI systems and IBM's Watson project. I spend four years in Menlo Park in the childhood of Silicon Valley creating language compilers with built-in AI capabilities. As often with leading-edge technology, we didn't quite make it. Fortunately I then had the opportunity to work on a team in IBM's Silicon Valley Lab in southern San Jose that took prototypes from IBM Research and productized them. From there I moved to Object Oriented systems and have really always worked on advanced software systems. Some of which succeeded but many of which did not.  Just like in the start-up world.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rgogDjjc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/tl6sejyhjjwq07wldr5b.jpeg" alt="Hyperledger Fabric" width="600" height="400" loading="lazy"></p>
<h3 id="heading-q-how-did-you-get-started-with-programming">Q: How did you get started with programming?</h3>
<p>Originally I was majoring in Asian Studies in Sweden and I received my doctorate from the University of Stockholm. After graduation, I realized that there were no jobs in my chosen field, and I began to take an interest in computers. I took a few courses and landed a job in the IT department of the food chain Shoprite on the East Coast of the US.  Two years later IBM was advertising for a job for something called the Series/1 minicomputer, which we used at Shoprite. I was lucky to be accepted and spent the next four years writing assembler code that automated telephone switches in Seattle, which I fell in love with. And which is the reason that my oldest son with his family now lives and works in Seattle.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qV4YzgXn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/qzivpv58ffuym4qw6sm3.jpg" alt="IBM Series/1 Minicomputer" width="600" height="400" loading="lazy">
<em>IBM Series/1 Minicomputer</em></p>
<h3 id="heading-q-how-did-you-make-the-transition-from-programmer-to-developer-advocate">Q: How did you make the transition from programmer to developer advocate?</h3>
<p>I have always loved programming but I have also liked working with people, and when I got the opportunity to jump over to one of IBM's Innovation Centers and work with business partners I didn't hesitate.</p>
<p>After a few years this led me to Developer Advocacy which is really great because one meets so many developers and start ups from various geographies and countries with their own perspective on technology.</p>
<h3 id="heading-q-how-do-you-find-that-advocacy-for-deep-technical-projects-differs-from-developer-advocacy-in-general">Q: How do you find that advocacy for deep technical projects differs from developer advocacy in general?</h3>
<p>IT technology is suddenly eating the world as Marc Andreessen has pointed out. It is no longer a peripheral technology but changing society all around us.</p>
<p>One compelling example is AI, with image recognition and facial recognition. We have made amazing strides with increased image recognition capabilities, but it turns out there is a flip side to these advances: do we really want AI-systems that can trace our every step.  This is something that we as developer advocates can highlight and make people and ourselves aware of.</p>
<p>There is code but code also has a social impact, both good but also from time to time negative.</p>
<p>I enjoy putting together events that focus both on the technical but also on the social aspects of technology. I enjoy looking at the big picture, and it's exciting to work at a company like IBM that gives me free rein to work with developers and startups and not always follow a specific corporate line.</p>
<h3 id="heading-q-how-do-you-get-introductory-programmers-interested-in-a-deep-or-very-technical-ecosystem">Q: How do you get introductory programmers interested in a deep or very technical ecosystem?</h3>
<p>Start with the impact on society. I get uneasy when I encounter people who may not see the forest for the trees, i.e. the impact their code may have on society.</p>
<p>I should also mention the <a target="_blank" href="https://developer.ibm.com/patterns">IBM Code Patterns</a> -- an innovative approach to providing developers with working code around specific themes. They allow us to quickly get developers up and running in areas such as AI, Blockchain or Machine Learning, to name a few areas. Something that makes our job a lot simpler than before and that allows us and the people we talk to to quickly see how new technology is behaving in real life.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--c24PbLyO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/349neomicv0n9lujn82w.jpg" alt="Lennart" width="600" height="400" loading="lazy"></p>
<h3 id="heading-q-what-technologies-that-youve-worked-with-are-you-most-excited-about">Q: What technologies that you’ve worked with are you most excited about?</h3>
<p>Blockchain, Machine Learning and AI. These technologies are where the future is, and that are already an important part of our society.</p>
<p>For instance, a self-driving car is something you wouldn’t even imagine a few years ago, and now we’re talking not only about the underlying technology and algorithms, but also the impact on society and the freedom it can bring to people around the world.</p>
<h3 id="heading-q-lets-talk-logistics-what-types-of-events-tend-to-work-well-for-the-tech-youre-advocating">Q: Let's talk logistics. What types of events tend to work well for the tech you’re advocating?</h3>
<p>Face to face events with between 50 and 100 people present. You must remember that attendees come to these events to mingle. They want to meet people, talk, exchange opinions -- they’re not really interested  in listening to us talk for an hour or longer. All information is usually out on the web anyway.</p>
<p>They want to learn and code, sure, but it’s primarily a social event and they want to mingle and get contacts. Being able to read the audience and respond to what they want is an important skill as a developer advocate.</p>
<p>Also, we do a lot of hackathons, which are essentially long-running social events. I love working on hackathons more than almost anything else.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Egst1m0M--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/4p6421e0012o0fcjtxx3.jpg" alt="Lennart giving a workshop" width="600" height="400" loading="lazy"></p>
<h3 id="heading-q-any-best-practices-in-developer-advocacy-that-youve-been-exposed-to">Q: Any best practices in developer advocacy that you’ve been exposed to?</h3>
<p>I just went to DevRelCon SF 2019 and you could tell from the presentations that developer advocates as a group are really good at talking to an audience -— especially when they are talking about themselves!</p>
<p>Dana Oshiro from Heavybit gave a great talk at DevRelCon SF 2019. It was very factual, and not specific to developer relations but about different aspects of company fundraising, board dynamics and cashflow that are relevant to advocacy but that many advocates may not be exposed to.</p>
<p><img src="https://res.cloudinary.com/practicaldev/image/fetch/s--28Ow8rmj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://pbs.twimg.com/media/D8fQzttUEAATTxx.jpg" alt="unknown tweet media content" width="600" height="400" loading="lazy">
<em>Dana Oshiro speaks at DevRelCon SF 2019</em></p>
<h3 id="heading-q-what-do-you-want-to-learn-and-who-do-you-want-to-meet-or-partner-with">Q: What do you want to learn, and who do you want to meet or partner with?</h3>
<p>I want to spend time combining Blockchain, AI, ML and IoT, and see where that will lead. It would also be interesting to spend more time with larger startup companies who are on the way to building enterprise applications — currently, I spend a lot of time with smaller startups and individual developers, but working with larger companies will give you a more holistic view of what companies are trying to build with IBM Cloud-technology, including Blockchain and AI. I’m not working in that space currently but I am hoping to get into it very soon.</p>
<p>To get in touch with Lennart, feel free to reach out on LinkedIn: <a target="_blank" href="https://www.linkedin.com/in/lennartfrantzell/">https://www.linkedin.com/in/lennartfrantzell/</a></p>
 ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Get the most out of your Outreachy Intern application process ]]>
                </title>
                <description>
                    <![CDATA[ By Joannah Nanjekye Outreachy gives three-month paid internships for persons that are underrepresented in tech. Interns are paid a stipend of $5,500 and have a $500 travel stipend available to them. Outreachy interns work remotely with mentors from F... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/get-the-most-out-of-your-outreachy-application-process-937d4a8ab4bf/</link>
                <guid isPermaLink="false">66c34b409972b7c5c7624e5c</guid>
                
                    <category>
                        <![CDATA[ FOSS ]]>
                    </category>
                
                    <category>
                        <![CDATA[ learning ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ outreachy ]]>
                    </category>
                
                    <category>
                        <![CDATA[ tech  ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Fri, 16 Feb 2018 08:19:43 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*JaAR0XZ0p642kRjDD-pCkg.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Joannah Nanjekye</p>
<p><a target="_blank" href="https://www.outreachy.org/">Outreachy</a> gives three-month paid internships for persons that are underrepresented in tech. Interns are paid a stipend of $5,500 and have a $500 travel stipend available to them.</p>
<p>Outreachy interns work remotely with mentors from Free and Open Source Software (FOSS) communities on projects for programming, user experience, documentation, illustration and graphical design, and data science tasks.</p>
<p>I participated in Outreachy round 14 from May through August 2017 with <a target="_blank" href="https://ceph.com/">Ceph</a>. I was working on expanding S3 testing for Ceph’s Rados Gateway. This opportunity changed my career for the good. From starting me working with open source to making me a confident engineer — and giving me the platform to many job opportunities.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/rNrGiXUbdCsOsxwPqp6ZrKk9QRQKuJ-Cq4nP" alt="Image" width="757" height="323" loading="lazy">
_Image from [Planet Outreachy](https://www.planeteria.info/outreach/" rel="noopener" target="<em>blank" title=")</em></p>
<p>The Outreachy internship applications open twice a year — in February for the May through August — in September for the December through March cohorts.</p>
<p>Well, like me during my application process, you are probably wondering “How do I ace this?” if you are an applicant. From some direct messages and pings I have gotten on this in the past, I will share some thoughts.</p>
<h3 id="heading-the-process">The process</h3>
<p>Before I share my thoughts on how to go through this process, I will point out a disclaimer. These thoughts are not a guarantee that you will get in, they are just guidelines that could help you in my opinion.</p>
<p>Before you get lost in the so many details in this article, applying for an Outreachy internship is a very engaging process. It requires you to make many decisions and to commit the effort of making contributions as part of the requirements to be accepted.</p>
<p>To get the most of your application process, you need to ensure:</p>
<ul>
<li>You Start Early</li>
<li>Narrow down your project choices to two at the most</li>
<li>Set your goals</li>
<li>Engage with the community and project Mentors frequently</li>
<li>Focus on progress not perfection</li>
<li>Remember the process is much more important than the outcome</li>
</ul>
<p>Let me elaborate on these.</p>
<h4 id="heading-start-early">Start Early</h4>
<p>One of the things you need to do is <strong>not procrastinate</strong> till like a week before the deadline. The application process is engaging. You need to start the process early so that the project mentors and community get to know and interact with you and the magic you can do early in the process.</p>
<p>If the mentors get to know you early and longer, then their decisions to choose you will be more informed than if you come in days before the deadline.</p>
<h4 id="heading-narrow-down-your-project-choices">Narrow down your project choices</h4>
<p>Outreachy usually has a list of organizations and most of them have interesting projects you would love to work on. In fact, when I was applying for my Outreachy internship I wanted to be everywhere. But you can’t be. That is the fact and if you do try to be everywhere, your chances of getting accepted become few.</p>
<p>The reason you need to focus on a few projects is that this will enable you to concentrate on being a great candidate for that project. It means you will spend more time understanding the project, communicating with the mentors, and in turn making significant contributions to the project — as opposed to being everywhere and achieving half-baked progress on many projects.</p>
<h4 id="heading-set-some-goals">Set some goals</h4>
<p>After you have selected what projects you want to apply to, you will reach out to the mentors for guidance on first time tasks to work on — or you can look at the project’s issue list for potential tasks. Set some goals for what you want to work on and what kind of candidate you want to be known for.</p>
<p>For example you could say “I want to make 5 contributions for my application process and have a good proposal”. With your own goals, you won’t fall prey to unnecessary pressure. This shouldn't be a competition with other applicants. With your set goals, you are competing with your own goals and no one else.</p>
<h4 id="heading-engage-the-community-and-project-mentors-frequently">Engage the community and project Mentors frequently</h4>
<p>One of the ways you will get to understand the project and get more help on the task you are doing is by talking to the project mentors and community frequently.</p>
<p>This makes you get used to working with the mentors and community early because during your internship you will need to do this. Discuss what you are about to work on, what you are working on and even discuss the patch. This gives the impression that you know what you are doing but also helps you get feedback early enough.</p>
<p>Ask questions when you are stuck, open source projects are worked on as a community. There is no need to die with a blocker.</p>
<p>Tasks are not meant to kill people but there should be a balance between you finding a way of solving some problems independently as well.</p>
<p>Do some homework before asking, do some research on the subject before asking. If you fail to get a solution, then engage your mentors as soon as possible. Challenges keep us motivated to work on a daily basis, so try that challenge and then ask your mentor. Do not spend 2 hours on a blocker, just reach out.</p>
<h4 id="heading-progress-not-perfection">Progress not perfection</h4>
<p>When you are given a task, you may get tempted to go hide yourself in the basement so that you come up with a solution a week later with all its glory, unit tested and whatever you think in your head is the best solution to the task.</p>
<p>The focus is to commit early, and get feedback as early as possible so that you get a patch merged in the shortest time possible. Patches become perfect only after being committed. It is the feedback that we get from reviewers and community that makes patches perfect. Therefore, quit the basement and work with the community.</p>
<h4 id="heading-discuss-the-internship-project-with-mentors">Discuss the internship project with mentors</h4>
<p>There is usually a project you will be working on that you won’t start until you are accepted to be an Outreachy intern. As you make contributions, create some time to discuss the milestones of the project that you will be working on, if you are accepted, with your mentors. Let your mentor advise you on scope and time lines.</p>
<p>This will inform you on how to create a time line when you are filling in the Outreachy application form. You will fill out this form with an informed mind on the project tasks and this is a plus when they are assessing you.</p>
<p>Also, ask for feedback on the proposal/application form contents before the deadline. Feedback will always make anything you work on better.</p>
<h4 id="heading-the-process-is-much-more-important-than-the-outcome">The process is much more important than the outcome</h4>
<p>The tough truth to your Outreachy application is either you were accepted or you were not accepted to this round of Outreachy. I have had the chance of knowing how both decisions feel.</p>
<p>Now let me tell you something, the real beauty about Outreachy is the process.The first time I applied to Outreachy I didn’t get in.</p>
<p>But I learned Golang. I used that skill on my next project. I was accepted the second time and now I work on a couple of Go projects. Maybe this is not convincing enough.</p>
<p>I applied to an organization that did not accept me. But from the tasks I worked on with Python compatibility, I got inspired to write my first book about <a target="_blank" href="https://www.amazon.com/Python-Compatibility-Six-Python-Future-Libraries/dp/1484229541">Python 2 and 3 Compatibility</a>. Due to the scarcity of material on the subject, Apress gladly accepted it for publishing.</p>
<p>The application process should be attempted by everyone. Whether you get in or not, it is always a win. You will have made contributions to a project that will act as your project references for your next opportunity.</p>
<p>You will have started yourself in open source if you are a beginner to FOSS. The FOSS mentors are always willing to guide you should you want to continue with contributing.</p>
<p>You will have been introduced to and learned from the best and most welcoming people in this tech industry to prepare for your future opportunities.</p>
<p>If you forget anything here, don't forget the fact that applying to Outreachy is always a win, accepted or not. And do not forget to apply again in the next round. If you fail — keep trying till you get in.</p>
<p>Good luck to everyone applying!!! May the force be with you. As always ping me if you have any questions.</p>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
