<?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[ Free Software - 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[ Free Software - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Thu, 25 Jun 2026 10:02:52 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/news/tag/free-software/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Firestore: How to stay within the limits of Firebase's new database free tier ]]>
                </title>
                <description>
                    <![CDATA[ By Jeff M Lowery I recently started a personal project where I wanted to use a database in the cloud. There are quite a few to choose from. My main criteria was that it be something low or no cost.  Eventually I decided on Firestore, using the Spark ... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/firestoreliving/</link>
                <guid isPermaLink="false">66d45f6b38f2dc3808b790c1</guid>
                
                    <category>
                        <![CDATA[ Cloud Services ]]>
                    </category>
                
                    <category>
                        <![CDATA[ database ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Firebase ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Free Software ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Wed, 11 Dec 2019 21:48:00 +0000</pubDate>
                <media:content url="https://cdn-media-2.freecodecamp.org/w1280/5f9c9ec5740569d1a4ca3ef8.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Jeff M Lowery</p>
<p><a target="_blank" href="https://www.freecodecamp.org/news/netlify-functions-firebase-and-graphql-working-together-at-last/">I recently started a personal project</a> where I wanted to use a database in the cloud. There are quite a few to choose from. My main criteria was that it be something low or no cost. </p>
<p>Eventually I decided on <a target="_blank" href="https://firebase.google.com/docs/firestore">Firestore</a>, using the <a target="_blank" href="https://firebase.google.com/pricing">Spark Plan</a>. This plan gives me 5Gb of storage, with 50K reads and 20K writes per day for free, which at the time seemed like plenty. I soon learned that a little carelessness can blow past those transaction limits pretty fast.</p>
<p>Firestore is a NoSQL document store database. Each NoSQL database is different and my a learning curve was steeper than expected. As you know, the best teacher is adversity, and I made my share of mistakes early on. One too many, though, and I’d hit the read or write limit of the plan, which sometimes could happen within an hour or two. Then it was time to call it a day.</p>
<p>Things are better now, so I offer these lessons learned:</p>
<h3 id="heading-do-start-with-the-free-plan"><em>Do</em> start with the free plan</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-198.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@frankiefoto?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;frank mckenna / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p>Yes, it is easy to overshoot the plan’s limits, but those occurrences will force you to learn to be efficient with your reads and writes. You will become more cost-conscious of sequencing multiple database operations in an efficient way.</p>
<h3 id="heading-start-with-a-small-dataset">Start with a small dataset</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-199.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@rayhennessy?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;Ray Hennessy / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p>This may seem obvious, but by <strong>small</strong> I mean less than 100 documents total. On my project, I first created a collection with 10K documents. I later realized that I made a mistake in the data I loaded, fixed that, found another, went to fix that, but… TRANSACTION_RESOURCE_LIMIT_EXCEEDED. Welp, done for the day.</p>
<h3 id="heading-take-time-in-the-design-of-your-data-model">Take time in the design of your data model</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-200.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@kellysikkema?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;Kelly Sikkema / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p>Like the carpenter’s axiom: “Measure twice, cut once”, you don’t want to be adjusting your JSON document fields and structure piecemeal. Oh, you <em>will</em> of course, but you’ll save yourself some transactions by practicing a little foresight. Write out a schematic of documents, their fields, and their relationships first. <a target="_blank" href="https://www.freecodecamp.org/news/inserting-uml-in-markdown-using-vscode/">Visualization is the key to happiness.</a></p>
<h3 id="heading-test-and-verify-your-data-loading-scripts">Test and verify your data loading scripts</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-201.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@nasa?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;NASA / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p>You’ll need scripts to populate the database from some other source. That is the time to:</p>
<ul>
<li>verify what you loaded is what you expected</li>
<li>correctly handle the no-data case for fields</li>
</ul>
<p>I made mistakes in both cases. First, when I loaded some string data into a document field, I hadn’t immediately noticed that those strings had quotes already, so the stored strings had embedded quotes. It didn’t seem that serious an issue, but it became a pain later when writing and testing searches on that field. Because there were a lot of documents, I spent a sizable portion of my daily write quota to clean that up.</p>
<p>In the second case, I discovered that Firestore has no mechanism for determining the <a target="_blank" href="https://stackoverflow.com/questions/46806860/how-to-query-cloud-firestore-for-non-existing-keys-of-documents">existence of a property in a document</a> (there is no <em>undefined</em> check). There <em>is</em> an <a target="_blank" href="https://firebase.google.com/docs/firestore/query-data/get-data#get_a_document"><strong>exists</strong> test for documents</a>, but not for document fields. The best practice is to populate missing data fields with <strong>null</strong>, and then do null equivalence tests in a where clause to find documents with “missing” properties.</p>
<h3 id="heading-what-a-small-dataset-wont-teach-you">What a small dataset won’t teach you</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-202.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@goodfreephoto_com?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;Good Free Photos / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p>Once you worked out kinks on the small dataset, it is time to graduate to a larger one. With more documents to process, things like query efficiency, pagination and batch requests become important.</p>
<h3 id="heading-read-in-chunks-write-in-chunks">Read in chunks, write in chunks</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-203.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@picoftasty?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;Mae Mu / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p><a target="_blank" href="https://firebase.google.com/docs/firestore/manage-data/transactions">Batch operations</a> allow for multiple read/writes on the database in a single transaction. This means that if any write operation fails, then all writes fail, and the database data retains its original state. Each operation in a batch counts toward the total read/write quotas, so as such it doesn’t help usage quotas. Also, when writing via batch operations, be aware there’s a 500 operation limit per batch.</p>
<p>Be careful when correlating two documents (i.e., for every A document, there is an association by reference to a B document). Don’t fetch all of one first, then iterate through the other. That’s a good way to chew up the transaction quota when debugging.</p>
<p>It is better to fetch a subset of the first collection, then iterate through it document by document. Associate these documents with document in the second collection by fetching <strong>one</strong> that matches criteria. Continue to do this until the entire first collection has been fetched. When debugging, you can verify everything looks like it is working correctly and, if not, kill the process before a lot of transactions are run.</p>
<h3 id="heading-how-to-limit-query-results">How to limit query results</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/04/image-204.png" alt="Image" width="600" height="400" loading="lazy">
_Photo by [Unsplash](https://unsplash.com/@will0629?utm_source=ghost&amp;utm_medium=referral&amp;utm_campaign=api-credit"&gt;Will Porada / &lt;a href="https://unsplash.com/?utm_source=ghost&amp;utm_medium=referral&amp;utm<em>campaign=api-credit)</em></p>
<p>Firestore’s query language isn’t as richly expressive as SQL is, but there are still a number of ways to restrict your queries so that you don’t overfetch data. Although technically there is no size limit for a POST response body, in practical terms there is.</p>
<p>Some mechanisms for limiting query results:</p>
<p><strong>where and compound where</strong></p>
<p>You can chain multiple where clauses together, similar to adding conditional expressions to a single where clause in SQL.</p>
<pre><code>citiesRef.where(<span class="hljs-string">'state'</span>, <span class="hljs-string">'=='</span>, <span class="hljs-string">'CO'</span>).where(<span class="hljs-string">'name'</span>, <span class="hljs-string">'=='</span>, <span class="hljs-string">'Denver'</span>);
</code></pre><p><strong>limit and ranges</strong></p>
<p>You can limit the number of documents returned by a query by using chaining a limit clause at the end of the query object.</p>
<pre><code><span class="hljs-keyword">let</span> biggest = citiesRef.where(<span class="hljs-string">'population'</span>, <span class="hljs-string">'&gt;'</span>, <span class="hljs-number">2500000</span>)  .orderBy(<span class="hljs-string">'population'</span>).limit(<span class="hljs-number">2</span>);
</code></pre><p>You can also specify a range of records to retrieve via startAt/endAt or startBefore/endBefore constraints, which allows you to do cursor-based pagination.</p>
<pre><code><span class="hljs-keyword">let</span> docRef = db.collection(<span class="hljs-string">'cities'</span>).doc(<span class="hljs-string">'SF'</span>);
</code></pre><pre><code><span class="hljs-keyword">return</span> docRef.get().then(<span class="hljs-function"><span class="hljs-params">snapshot</span> =&gt;</span> {  <span class="hljs-keyword">let</span> startAtSnapshot = db.collection(<span class="hljs-string">'cities'</span>)    .orderBy(<span class="hljs-string">'population'</span>)    .startAt(snapshot);  <span class="hljs-keyword">return</span> startAtSnapshot.limit(<span class="hljs-number">10</span>).get();});
</code></pre><p><strong>in array query</strong></p>
<p>You can look for specific matches in an array. This is good for enumerated values.</p>
<pre><code><span class="hljs-keyword">const</span> usaOrJapan = citiesRef.where(<span class="hljs-string">'country'</span>, <span class="hljs-string">'in'</span>, [<span class="hljs-string">'USA'</span>, <span class="hljs-string">'Japan'</span>]);
</code></pre><p>As demonstrated, it is possible to work within the limitations of the Spark Plan as you learn about Firestore. It’s free, which is always a good place to start.</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[ Don’t limit your open source project’s potential ]]>
                </title>
                <description>
                    <![CDATA[ By Julien Danjou During the OpenStack summit a few weeks ago, I had the chance to talk to some people about my experience on running open source projects. It turns out that after hanging out in communities and contributing to many projects for years,... ]]>
                </description>
                <link>https://www.freecodecamp.org/news/the-bad-practice-in-foss-projects-management-32f66c3515f9/</link>
                <guid isPermaLink="false">66c360b8e4cb1ff6521c826d</guid>
                
                    <category>
                        <![CDATA[ Free Software ]]>
                    </category>
                
                    <category>
                        <![CDATA[ open source ]]>
                    </category>
                
                    <category>
                        <![CDATA[ openstack ]]>
                    </category>
                
                    <category>
                        <![CDATA[ General Programming ]]>
                    </category>
                
                    <category>
                        <![CDATA[ software development ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ freeCodeCamp ]]>
                </dc:creator>
                <pubDate>Tue, 21 Jun 2016 21:01:02 +0000</pubDate>
                <media:content url="https://cdn-media-1.freecodecamp.org/images/1*Xyb4yDofTG6gYGzA0mvU9w.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>By Julien Danjou</p>
<p>During the OpenStack summit a few weeks ago, I had the chance to talk to some people about my experience on running open source projects. It turns out that after hanging out in communities and contributing to many projects for years, I may be able to provide some hindsight and an external eye to many of those who are new to it.</p>
<p>There are plenty of resource explaining how to run an open source projects out there. Today, I would like to take a different angle and emphasize what you should not <em>socially</em> do in your projects. This list comes from various open source projects I’ve encountered these past years. Let’s explore these bad practices and illustrate them with examples.</p>
<h4 id="heading-dont-perceive-new-contributors-as-an-annoyance">Don’t perceive new contributors as an annoyance</h4>
<p>When software developers and maintainers are busy, there’s one thing they don’t need: more work. To many people, the instinctive reactions to external contribution is: damn, more work. And actually, it is.</p>
<p>So some maintainers tend to avoid that surplus of work. They explicitly state that they don’t want contributions, or they passive-aggressively make contributors feel un-welcome. This can take a lot of different forms, from ignoring them to being unpleasant. This allows the project maintainer to avoid coaching new contributors on how they can productively add to the project.</p>
<p>This is one of the biggest mistakes you can make in open source. If people are sending you more work, you should do whatever it takes to feel them welcome, so that they will continue working with you. Pretty soon they might become the people doing the work you are doing, instead of you. Just think: retirement!</p>
<p>Let’s take a look at my friend Gordon, who started as a Ceilometer contributor in 2013. He was doing great code reviews, but he was actually giving me more work by catching bugs in my patches and sending me patches that I had to review. Instead of being a bully so that he would stop making me rework my code and review his patches, <a target="_blank" href="http://lists.openstack.org/pipermail/openstack-dev/2013-May/008975.html">I requested that we trust him even more by adding him as a core reviewer</a>.</p>
<p>If contributors aren’t able to make their first contribution, they definitely won’t make a second one. They won’t make any. And the project may very well have lost its future maintainers.</p>
<h4 id="heading-dont-limit-your-contributors-to-just-grunt-work">Don’t limit your contributors to just grunt work</h4>
<p>When new contributors arrive and want to contribute to a particular project, they bring with them a wide range of motivations. Some of them are users, but some of them are just people looking to see what it’s like contributing to an open source project. They want the thrill of giving back to an ecosystem that they use.</p>
<p>The usual response from maintainers is to push people into doing grunt work. That means doing jobs that have no interest, little value, and probably have no direct impact on the project.</p>
<p>Some people actually don’t mind doing grunt work, but others do. Some people will love it as soon as you give them something — anything — to do and acknowledgment for their efforts. But others will feel offended that you’ve asked them to do low impact work. Be aware of this, and be sure to high-five the people doing your grunt work. That’s the only way to keep them around.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/PtYAzAz-LaY1ESGGJJLPw4TeyRqe8ccXFDtM" alt="Image" width="800" height="280" loading="lazy"></p>
<h4 id="heading-dont-forget-to-praise-even-small-contributions">Don’t forget to praise even small contributions</h4>
<p>When the first pull request a new contributor sends over is just a typo fix, some developers will feel annoyed at the prospect of wasting precious time vetting such a small contribution. And nobody cares about bad English in their documentation anyway, right?</p>
<p>My first contributions to <a target="_blank" href="https://github.com/home-assistant/home-assistant/commit/36cb12cd157b22bdc1fa28b700ca0fb751cca7a4">home-assistant</a> and <a target="_blank" href="https://github.com/marijnh/Postmodern/commit/ec537f72393e1032853b78e0b7b4d0ff98632a02">Postmodern</a> were me fixing typos in their documentation.</p>
<p>I contributed to <a target="_blank" href="http://orgmode.org/">Org-mode</a> for a few years. <a target="_blank" href="http://repo.or.cz/org-mode.git/commit/a153f5a31dffbc6b78a8c5d8d027961abe585a38">My first patch to orgmode</a> was about fixing a docstring. Then, I sent 56 patches, fixing bugs and adding fancy features. I also wrote a few external modules. To this day, I’m still #16 on the top-committer list of Org-mode, which lists 390 contributors. So I ended up being much more than a small contributor to their project. I’m pretty sure in retrospect their community was glad that they didn’t dismiss my documentation fix as a waste of their time.</p>
<h4 id="heading-dont-set-the-bar-too-high-for-new-comers">Don’t set the bar too high for new comers</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/9zgly5UpeD17kYmC8wK7DsPnEA2TQ0aNfqZr" alt="Image" width="711" height="358" loading="lazy"></p>
<p>When new contributors arrive, their knowledge about the project, its context, and the technologies can vary largely. One of the mistakes project maintainers often make is to ask contributors to perform a bunch of complicated tasks before they can contribute. This can have the effect of scaring away many contributors who are are relatively shy or introverted. They may just disappear, feeling too stupid to help.</p>
<p>Before making any comment, you should not have any assumption about their knowledge. You also should be very delicate when assessing contributor skills, as some people might feel vexed if you underestimate them too much.</p>
<p>Once their skill level has been properly evaluated (a few exchanges should be enough), you need to mentor your contributor to the right degree so they can blossom. It takes time and experience to master this, and you may likely lose some of them in the process, but it’s a path that every maintainer has to take.</p>
<p>Mentoring is a very important aspect of welcoming new contributors to your project, whatever it may be. Mentorship applies nicely outside free software too.</p>
<h4 id="heading-dont-make-people-to-make-sacrifices-in-order-to-help-you">Don’t make people to make sacrifices in order to help you</h4>
<p><img src="https://cdn-media-1.freecodecamp.org/images/lc02j3EgHpqE5-Cv7MFB5DyCZGf83DA7ChBN" alt="Image" width="500" height="281" loading="lazy"></p>
<p>This is an aspect that varies a lot depending on the project and context, but it’s really important. As a free software project, where most people will contribute on their own good will and sometimes spare time, you must not require them to make big sacrifices. This won’t work.</p>
<p>One of the worst things you can do is require contributors to fly 5,000 kilometers to meet in person to discuss the project. This puts contributors in an unfair position, based on their ability to leave their family for a week, take a plane/boat/car/train, rent an hotel, etc. This is not good, and you should do everything in your power to avoid <em>requiring</em> contributors to do this in order to participate in the project and feel included in its community.</p>
<p>Don’t get me wrong. I’m not saying that social activities should be prohibited. Quite the contrary. Just avoid excluding people when you discuss any project.</p>
<p>The same applies to any other form of discussion that makes it complicated for everyone to participate: IRC meetings (it’s hard for some people to book an hour, especially depending on the timezone they live in), video-conferencing (especially using non-free software), etc.</p>
<p>Everything that requires people to basically interact with the project in a synchronous manner for a period of time will put constraints on them that can make them uncomfortable.</p>
<p>The best medium is still e-mail and asynchronous derivatives (like bug trackers) which allow people to work at their own pace on their own time.</p>
<h4 id="heading-dont-forget-to-that-you-have-a-code-of-conduct-written-or-implied">Don’t forget to that you have a Code of Conduct — written or implied</h4>
<p>Conduct codes seem to be a trendy topic (and a touchy subject), as more and more communities open up to a wilder audience than before — which is great.</p>
<p>Actually, all communities have a code of conduct, whether it’s written with black ink, or being carried in everyone’s mind unconsciously.</p>
<p>Now, depending on the size of your community and how you feel comfortable applying it, you may want to write it down in a document, like <a target="_blank" href="https://www.debian.org/code_of_conduct">Debian did</a>.</p>
<p>Having a code of conduct does not transform your whole project community magically into a bunch of care bears who follow its guidance. But it does provide an interesting artifact that you can refer to when needed. You can throwing it at some people, to indicate that their behavior is not welcome in the project, and somehow, ease their potential exclusion — even if nobody wants to go that far generally, and that’s it’s rarely that useful.</p>
<p>I don’t think it’s mandatory to have such a paper on smaller projects. But you have to keep in mind that the implicit code of conduct will be derived from <em>your</em> own behavior. The way your leader(s) communicate with others will set the entire social mood of the project. Do not underestimate that.</p>
<p>When we started the <a target="_blank" href="http://launchpad.net/ceilometer">Ceilometer</a> project, we implicitly followed the <a target="_blank" href="https://www.openstack.org/legal/community-code-of-conduct/">OpenStack Code of Conduct</a> before it even existed, and probably set the bar a little higher. Being nice, welcoming and open-minded, we achieved a decent diversity score, with up to 25% of our core team being women — way above the current ratio in OpenStack and most open source projects!</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/haNLTaYddoJRNdL9Uq4j0SnEzOcojkL5gNuO" alt="Image" width="800" height="211" loading="lazy"></p>
<h4 id="heading-dont-make-non-native-english-speakers-feel-like-outsiders">Don’t make non-native English speakers feel like outsiders</h4>
<p>It’s quite important to be aware of that the vast majority of free software projects out there are using English as the common language of communication. This makes a lot of sense: it’s a commonly spoken language, and it seems to do the job well.</p>
<p>But a large proportion of the hackers out there are not native English speakers. Many are not able to speak English fluently. This means that the rate at which they can have a conversation might be slow, which can frustrate native English speakers.</p>
<p>The principal demonstration of this phenomena can be seen in social events (e.g. conferences) where people are debating. It can be very hard for people to explain their thoughts in English and to communicate properly at a decent rate, making the conversation and the transmission of ideas slow.</p>
<p>The worst thing that one can see in this context is a native English speaker cutting people off and ignoring them, just because they are talking too slowly. I do understand that it can be frustrating, but the problem here is not the non-native English speaking — it’s that the medium being used does not put your fellow coders on an the same even playing field that asynchronous conversation would.</p>
<p>To a lesser extent, the same applies to IRC meetings, which are relatively synchronous. Completely asynchronous media do not have this flaw, and that’s why they should also be preferred.</p>
<h4 id="heading-no-vision-no-delegation">No vision, no delegation</h4>
<p>One of the most common tragedies in the open source world is seeing a maintainer struggling with the growth of their project while other contributors are unsuccessfully trying to help them.</p>
<p>Indeed, when an influx of new contributor starts asking for new features, feedback, or directions, some maintainers choke and don’t know how to respond. This ends up frustrating contributors, who therefore may simply vanish.</p>
<p>It’s important to have a vision for your project and to communicate it. Make it clear to your contributors what you want and don’t want in your project. Transferring that in a clear (and non-aggressive, please) manner, is a good way of lowering the friction between contributors. They’ll pretty soon know whether they want to join your ship or not, and what to expect. So be a good captain.</p>
<p>If they chose to work with you and contribute, you should start trusting them as soon as you can, and delegate some of your responsibilities. These can be any tasks that you used to do yourself: review patches targeting some subsystem, fixing bugs, or writing docs.</p>
<p>Let people own an entire part of the project, so they feel responsible and care about it as much as you do. Doing the opposite — being a control-freak — is your best shot at staying alone with your open source software. And no project is going to grow and become successful that way.</p>
<p>In 2009, when Uli Schlachter sent <a target="_blank" href="http://article.gmane.org/gmane.comp.window-managers.awesome.devel/1746/match=uli+schlachter">his first patch to awesome</a>, this was more work for me. I had to review this patch, and I was already pretty busy designing the new versions of awesome and doing my day job! Uli’s work was not perfect, and I had to fix it myself. More work. And what did I do? A few minutes later, I <a target="_blank" href="http://article.gmane.org/gmane.comp.window-managers.awesome.devel/1747/match=uli+schlachter">replied to him</a> with a clear plan of what he should do, and what I thought about his work.</p>
<p>In response, Uli sent patches and improved the project. Do you know what Uli does today? He manages the awesome window manager project, and has since 2010 instead of me. I managed to transmit my vision, delegate it, and then retire!</p>
<h4 id="heading-be-careful-to-recognize-all-kinds-of-contributions">Be careful to recognize all kinds of contributions</h4>
<p>People contribute in different ways, and it’s not always with code. There are a lot of tasks surrounding free software projects: documentation, bug triage, user support, user experience design, communication, translation…</p>
<p>For example, it took a while for <a target="_blank" href="http://debian.org/">Debian</a> to recognize that they should grant their translators the status of Debian Developer. <a target="_blank" href="http://openstack.org/">OpenStack</a> is working in the same direction by trying to <a target="_blank" href="https://wiki.openstack.org/wiki/NonATCRecognition">recognize non-technical contributions</a>.</p>
<p>As soon as your project starts attributing badges to some people and creating different classes of members in the community, you should be very careful that you don’t forget anyone. That’s the easiest road to losing contributors along the road.</p>
<p><img src="https://cdn-media-1.freecodecamp.org/images/apEMscaPcDbRHgxm2XT8b0hOpQAeAKSRcynN" alt="Image" width="800" height="297" loading="lazy"></p>
<h4 id="heading-dont-forget-to-be-thankful">Don’t forget to be thankful</h4>
<p>This whole list has been inspired by many years of open source hacking and free software contributions. Let me know in the comments section if you have anything that has blocked you from contributing to open source projects. Thanks for reading!</p>
<blockquote>
<p>Original article at <a target="_blank" href="https://julien.danjou.info/blog/2016/foss-projects-management-bad-practice">https://julien.danjou.info/blog/2016/foss-projects-management-bad-practice</a></p>
</blockquote>
 ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
