<?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[ 开源 - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ 开源 - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Wed, 03 Jun 2026 17:04:23 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/tag/open-source/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ freeCodeCamp 课程重大更新在圣诞节上线 ]]>
                </title>
                <description>
                    <![CDATA[ 圣诞快乐，campers！🎄 freeCodeCamp 刚刚发布了大量免费的学习工具，方便大家在假期里体验： 🏗️ 新的认证全栈开发者课程上线啦！ 🗨️ 新的开发者英语 CEFR B1 级别课程 🤳 我们的移动应用程序进行了重大更新 freeCodeCamp 认证全栈开发者路径 以下是全新的认证全栈开发者路径的完整内容，非常丰富： 🛠️ 64 个工作坊 – 涵盖从 HTML 到 SQL 到 Python 的互动式分步骤编程课程（现已上线 42 个） 🏛️ 513 堂讲座 – 涵盖计算机科学概念的短视频，包含测试你是否理解的选择题（现已上线 313 个） ⚗️ 83 个实验室 – 从空白编辑器和测试套件开始，你需要构建项目以通过所有测试（现已上线 60 个） 📰 62 份复习材料 – 每个模块的综合主题列表，帮助你复习并准备测验和考试（现已上线 46 份） 🔬 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/christmas-2025-freecodecamp-curriculum-updates/</link>
                <guid isPermaLink="false">676a4d346b2a470461e6e4f3</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 社区 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Tue, 24 Dec 2024 05:19:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/12/19f1c48b-0d23-4bdf-882b-9f008e288719.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/christmas-2025-freecodecamp-curriculum-updates/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Major freeCodeCamp Curriculum Updates Now Live in 2025</a>
      </p><!--kg-card-begin: markdown--><p>圣诞快乐，campers！🎄 freeCodeCamp 刚刚发布了大量免费的学习工具，方便大家在假期里体验：</p>
<p>🏗️ 新的认证全栈开发者课程上线啦！</p>
<p>🗨️ 新的开发者英语 CEFR B1 级别课程</p>
<p>🤳 我们的移动应用程序进行了重大更新</p>
<h2 id="freecodecamp">freeCodeCamp 认证全栈开发者路径</h2>
<p>以下是全新的认证全栈开发者路径的完整内容，非常丰富：</p>
<p>🛠️ 64 个工作坊 – 涵盖从 HTML 到 SQL 到 Python 的互动式分步骤编程课程（现已上线 42 个）</p>
<p>🏛️ 513 堂讲座 – 涵盖计算机科学概念的短视频，包含测试你是否理解的选择题（现已上线 313 个）</p>
<p>⚗️ 83 个实验室 – 从空白编辑器和测试套件开始，你需要构建项目以通过所有测试（现已上线 60 个）</p>
<p>📰 62 份复习材料 – 每个模块的综合主题列表，帮助你复习并准备测验和考试（现已上线 46 份）</p>
<p>🔬 66 个测验 – 确认你掌握全栈开发概念和工具（现已上线 46 个）</p>
<p>🏔️ 1 个终极项目 – 你将为自己的作品集构建一个大型独特的项目，此项目将由 freeCodeCamp 社区的教师进行评审（2025 年上线）</p>
<p>🤺 1 次期末考试 – 全面的监考式认证考试，共 90 个问题，将在 freeCodeCamp 的新开源考试环境中进行（2025 年上线）</p>
<p>即使你以前已经学习过其中的一些主题，我还是建议你从头开始学习。</p>
<p>你可以立即开始学习<a href="https://www.freecodecamp.org/learn/full-stack-developer/">新的认证全栈开发者课程</a>。</p>
<h2 id="cefrb1">开发者英语课程 CEFR B1 级别</h2>
<p>去年圣诞节，我们发布了 CEFR A2 级别的英语课程。</p>
<p><img src="https://cdn.hashnode.com/res/hashnode/image/upload/v1735002125376/5eec4303-900b-4423-980a-cfa68a2962a0.png" alt="5eec4303-900b-4423-980a-cfa68a2962a0" width="600" height="400" loading="lazy"></p>
<p>经过一年的努力，我很高兴地告诉大家，我们不仅上线了所有内容，还推出了相当一部分 B1 级别课程。</p>
<p>认证考试也将在 2025 年上线。</p>
<p>你可以尝试我们的 <a href="https://www.freecodecamp.org/learn/b1-english-for-developers/">CEFR B1 级别开发者英语认证课程</a>。</p>
<h2 id="freecodecampiphoneandroid">freeCodeCamp iPhone 和 Android 应用程序</h2>
<p>freeCodeCamp 移动应用程序比之前更加出色。我们的 Flutter 代码库刚刚收到 1,000 个 commits！</p>
<p>你现在可以：</p>
<p>📺 观看我们的课程</p>
<p>📚 阅读我们的书籍</p>
<p>🤳 直接在手机上快速学习课程</p>
<p>在 iPhone/Android 上下载并留下五星好评。⭐️⭐️⭐️⭐️⭐️ 😉</p>
<p><a href="https://play.google.com/store/apps/details?id=org.freecodecamp&amp;hl=zh_CN">获取 Android 应用</a></p>
<p><a href="https://apps.apple.com/cn/app/freecodecamp/id6446908151">获取 iPhone 应用</a></p>
<h2 id="2025">2025 年将会很精彩。</h2>
<p>再次感谢所有为 freeCodeCamp 课程和我们的众多开源项目做出贡献的人们。</p>
<p>任何人都可以随时在论坛和 Discord 上获得 camper 们的帮助，这太棒了。</p>
<p>鼓励你的朋友参与进来。大家可以从<a href="https://contribute.freecodecamp.org">我们的开源贡献文档</a>开始。</p>
<p>最后，感谢所有捐款支持 freeCodeCamp 使命的人们。我们才刚刚开始。🥞</p>
<p>请鼓励你的朋友也来支持我们的慈善事业。我们共同努力，让每个人都能获得免费的世界级教育。你可以和全球 11,043 位慷慨的人们一起成为我们的<a href="https://www.freecodecamp.org/donate">支持者</a>。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 祝贺 freeCodeCamp 全球开源社区 2024 Top Contributors ]]>
                </title>
                <description>
                    <![CDATA[ 对于 freeCodeCamp 社区来说，2024 年是极富成效的一年。我们为实现为所有人创建开放式学习资源的使命积蓄了巨大的动力。 在过去的 12 个月中，freeCodeCamp 社区取得了以下成就：  * 在我们的 GitHub 开源仓库合并了 2,455 个代码贡献  * 在 YouTube 上发布了 193 个免费的完整视频教程  * 通过 freeCodeCamp 出版社发布了 850 篇编程教程和 5 本免费书籍  * 翻译了 150 多万字的英文资源，让母语是其他语言的人们更容易学习我们的课程和教程 我非常感谢今年参与志愿贡献的善良的人们。我们在多个方面取得了实质性进展。 以下是按贡献类别列出的 top contributors 的完整名单。 GitHub Top Contributors  * Anna [https://github.com/a2937]  * ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/freecodecamps-top-open-source-contributors-of-2024/</link>
                <guid isPermaLink="false">67243df18c1e8204aca0b68b</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 社区 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Fri, 01 Nov 2024 03:25:34 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2024/11/d8ef629c-64b8-4f80-bb57-b5f6b00bfa23.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/freecodecamps-top-open-source-contributors-of-2024/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/freecodecamps-top-open-source-contributors-of-2024/</a>
      </p><p>对于 freeCodeCamp 社区来说，2024 年是极富成效的一年。我们为实现为所有人创建开放式学习资源的使命积蓄了巨大的动力。</p><p>在过去的 12 个月中，freeCodeCamp 社区取得了以下成就：</p><ul><li>在我们的 GitHub 开源仓库合并了 <strong>2,455<strong> 个代码贡献</strong></strong></li><li>在 YouTube 上发布了 <strong><strong>1</strong>93<strong> 个免费的完整视频教程</strong></strong></li><li>通过 freeCodeCamp 出版社发布了 <strong>850<strong> 篇编程教程</strong></strong>和 <strong>5<strong> 本免费书籍</strong></strong></li><li>翻译了 <strong>150<strong> 多万字</strong></strong>的英文资源，让母语是其他语言的人们更容易学习我们的课程和教程</li></ul><p>我非常感谢今年参与志愿贡献的善良的人们。我们在多个方面取得了实质性进展。</p><p>以下是按贡献类别列出的 top contributors 的完整名单。</p><h2 id="github-top-contributors"><strong>GitHub Top Contributors</strong></h2><ul><li><a href="https://github.com/a2937">Anna</a></li><li><a href="https://github.com/lasjorg">Lasse Jørgensen</a></li><li><a href="https://github.com/Supravisor">Supravisor</a></li><li><a href="https://github.com/gagan-bhullar-tech">Gagan Bhullar</a></li><li><a href="https://github.com/gikf">Krzysztof G.</a></li><li><a href="https://github.com/altsun">Duong The Pham</a></li><li><a href="https://github.com/Re1nGer">Re1nGer</a></li><li><a href="https://github.com/RGHANILOO">RGHANILOO</a></li><li><a href="https://github.com/mmatsumoto1026">Manabu Matsumoto</a></li><li><a href="https://github.com/Nitz2611">Nitish sharma</a></li><li><a href="https://github.com/royjohnlee">Roy John Lee</a></li><li><a href="https://github.com/1jds">James</a></li><li><a href="https://github.com/zxc-w">zxc-w</a></li><li><a href="https://github.com/jnahan">jnahan</a></li><li><a href="https://github.com/dyx9">Yixuan Dai</a></li><li><a href="https://github.com/Rabberpoli">Giovanni Ruberto</a></li><li><a href="https://github.com/shootermv">Moshe</a></li><li><a href="https://github.com/alagumuthiah">Alagu Muthiah</a></li><li><a href="https://github.com/iLtc">Alan Luo</a></li><li><a href="https://github.com/OrestSonich">Orest Sonich</a></li><li><a href="https://github.com/DeepaPrasanna">Anne Deepa Prasanna</a></li><li><a href="https://github.com/AndrewYturaldi">Andrew M. Yturaldi</a></li><li><a href="https://github.com/sanskriti2005">Sanskriti</a></li><li><a href="https://github.com/srikanth-kandi">Srikanth Kandi</a></li><li><a href="https://github.com/PedroRamos360">Pedro Ramos</a></li><li><a href="https://github.com/JBhrayn">Jose Bhrayn Colina</a></li><li><a href="https://github.com/shanmukh-sai2003">Korada Shanmukh Sai</a></li><li><a href="https://github.com/Vijaychandra-Govindapalle">Vijaychandra Govindapalle</a></li><li><a href="https://github.com/weilirs">Lawrence Li</a></li><li><a href="https://github.com/JamesCartar">Hein Htet</a></li><li><a href="https://github.com/sulaiman-dev">Sulaiman</a></li><li><a href="https://github.com/jeremylt">Jeremy L Thompson</a></li><li><a href="https://github.com/Ritesh2351235">Ritesh S Hiremath</a></li><li><a href="https://github.com/WilliamSpanfelner">William Spanfelner</a></li><li><a href="https://github.com/praizjosh">Josh</a></li><li><a href="https://github.com/Deep512">Deep Dhanuka</a></li><li><a href="https://github.com/abhinavkgrd">Abhinav Kumar</a></li><li><a href="https://github.com/Mikey-Esteban">Mikey Esteban</a></li><li><a href="https://github.com/jayAardvark">Jr Cenina</a></li><li><a href="https://github.com/iprime2">Sushil Gupta</a></li><li><a href="https://github.com/jayanth920">jayanth920</a></li><li><a href="https://github.com/LouizaMak">Louiza Mak</a></li><li><a href="https://github.com/CracktheDom">CracktheDom</a></li><li><a href="https://github.com/Lalith246">Lalith Kanakamedala</a></li><li><a href="https://github.com/kevin-wu01">Kevin</a></li><li><a href="https://github.com/sanjeevmurmu">Sanjeev Murmu</a></li><li><a href="https://github.com/devXaks">Akshat Tripathi</a></li><li><a href="https://github.com/dwrik">dwrik</a></li><li><a href="https://github.com/mcehme">Michael Ehme</a></li><li><a href="https://github.com/patrickwcode">Patrick Wauschek</a></li><li><a href="https://github.com/andrebdinis">André Barreira Dinis</a></li><li><a href="https://github.com/LuG-r">Lucas Gracia</a></li><li><a href="https://github.com/ChiaraTrt">Chiara</a></li><li><a href="https://github.com/vaibhav-ace">Vaibhav-Ace</a></li><li><a href="https://github.com/cheenu-1824">cheenu-1824</a></li><li><a href="https://github.com/vic-fb">Vicky Fernandez Busch</a></li><li><a href="https://github.com/katereverie">Jiantao (Felix)</a></li><li><a href="https://github.com/gova646">Govardhan</a></li><li><a href="https://github.com/Auxdible">Steven Primeaux</a></li><li><a href="https://github.com/JeevaRamanathan">JeevaRamanathan</a></li><li><a href="https://github.com/Lalithkumarponnambalam">Lalithkumarponnambalam</a></li><li><a href="https://github.com/bulhaa">Hammadh</a></li><li><a href="https://github.com/Arnav-2004">Arnav</a></li><li><a href="https://github.com/ajcruise007">Anugrah</a></li><li><a href="https://github.com/PrajvalaRC">Prajvala R C</a></li><li><a href="https://github.com/shivasaikrishnagadeela">Shiva Sai Krishna Gadeela</a></li><li><a href="https://github.com/developwithabhinav">developwithabhinav</a></li><li><a href="https://github.com/itsmacr8">ITS MAC</a></li><li><a href="https://github.com/mayankkamboj47">Mayank Kamboj</a></li><li><a href="https://github.com/netanelben">Nate Ben</a></li><li><a href="https://github.com/israelone">Israel Lopez</a></li><li><a href="https://github.com/jozzbruer">Joz-Bruer Quince</a></li><li><a href="https://github.com/sahilintech">Sahil Chauhan</a></li><li><a href="https://github.com/tsirianni">Tobias Sirianni Melo</a></li><li><a href="https://github.com/sohamtembhurne">Soham Tembhurne</a></li><li><a href="https://github.com/mccarreon">mccarreon</a></li><li><a href="https://github.com/anikaitprasar">Anikait Prasar</a></li><li><a href="https://github.com/edwinhung">Edwin Hung</a></li><li><a href="https://github.com/MikhailWahib">Mikhail Wahib</a></li><li><a href="https://github.com/ytrkptl">Yatrik Patel</a></li><li><a href="https://github.com/pramod74">Pramod Lumb</a></li><li><a href="https://github.com/shivam-0510">Shivam Gupta</a></li><li><a href="https://github.com/clarencepenz">Clarence</a></li><li><a href="https://github.com/olawanlejoel">Joel Olawanle</a></li><li><a href="https://github.com/yeldarx">Yeldar Kudaibergenov</a></li><li><a href="https://github.com/AxlSou">Axel Soubielle Almada</a></li><li><a href="https://github.com/Kashinathpat">Kashinath Patkar</a></li><li><a href="https://github.com/WOLFRIEND">Oleksandr Tkachenko</a></li><li><a href="https://github.com/v-i-k-a-s">v-i-k-a-s</a></li><li><a href="https://github.com/farshed">Faisal Arshed</a></li><li><a href="https://github.com/usamabasharat">Usama Basharat</a></li><li><a href="https://github.com/budblack">budblack</a></li></ul><h2 id="-top-contributors"><strong>论坛 Top Contributors</strong></h2><ul><li><a href="https://forum.freecodecamp.org/u/hbar1st">Hanaa B.</a></li><li><a href="https://forum.freecodecamp.org/u/Teller">Teller</a></li><li><a href="https://forum.freecodecamp.org/u/JeremyLT">Jeremy</a></li><li><a href="https://forum.freecodecamp.org/u/stephenmutheu">Stephen Mutheu</a></li><li><a href="https://forum.freecodecamp.org/u/lasjorg">Lasse</a></li><li><a href="https://forum.freecodecamp.org/u/pkdvalis">pkdvalis</a></li><li><a href="https://forum.freecodecamp.org/u/hasanzaib1389">Hassan Zaib</a></li><li><a href="https://forum.freecodecamp.org/u/Cody_Biggs">CODY BIGGS</a></li><li><a href="https://forum.freecodecamp.org/u/bbsmooth">Bruce B</a></li><li><a href="https://forum.freecodecamp.org/u/igorgetmeabrain">Doug Badger</a></li><li><a href="https://forum.freecodecamp.org/u/DanielHuebschmann">DanielHuebschmann</a></li><li><a href="https://forum.freecodecamp.org/u/ArielLeslie">Ariel Leslie</a></li><li><a href="https://forum.freecodecamp.org/u/zuhameer6">Zuhaira Ameer</a></li><li><a href="https://forum.freecodecamp.org/u/a2937">Anna</a></li><li><a href="https://forum.freecodecamp.org/u/Ray13">Raymond</a></li><li><a href="https://forum.freecodecamp.org/u/sanity">sanity</a></li><li><a href="https://forum.freecodecamp.org/u/toan">Toan</a></li><li><a href="https://forum.freecodecamp.org/u/opudoprince">Opudo Prince</a></li><li><a href="https://forum.freecodecamp.org/u/DobarBREND">Vladimir Jovanović</a></li><li><a href="https://forum.freecodecamp.org/u/be_happy"><em><em>Infinity</em></em></a></li><li><a href="https://forum.freecodecamp.org/u/HungryBee">HungryBee</a></li><li><a href="https://forum.freecodecamp.org/u/bappyasif">a b</a></li><li><a href="https://forum.freecodecamp.org/u/robheyays">Robert H.</a></li><li><a href="https://forum.freecodecamp.org/u/MostafaElbadry">MostafaElbadry</a></li><li><a href="https://forum.freecodecamp.org/u/GrannyIsA-Dreamer">GrannyIsA-Dreamer</a></li><li><a href="https://forum.freecodecamp.org/u/JuniorQ">Arakhsh Qanit</a></li><li><a href="https://forum.freecodecamp.org/u/ios-man">ios-man</a></li><li><a href="https://forum.freecodecamp.org/u/marcusparsons">Marcus Parsons</a></li><li><a href="https://forum.freecodecamp.org/u/ambradnum">Alan Bradnum</a></li><li><a href="https://forum.freecodecamp.org/u/constantcode9909">Mohamed Amine (Mike)</a></li><li><a href="https://forum.freecodecamp.org/u/a1legalfreelance">A1legalfreelance</a></li><li><a href="https://forum.freecodecamp.org/u/danielbailey0629">Daniel Bailey</a></li><li><a href="https://forum.freecodecamp.org/u/Jyothsna13">Jyothsna Lakshminarayanan</a></li><li><a href="https://forum.freecodecamp.org/u/albert_kucz">Albert Kucz</a></li><li><a href="https://forum.freecodecamp.org/u/MrSanyi">SanyiDiriba</a></li><li><a href="https://forum.freecodecamp.org/u/bijiyiqi2017">William Miller Jr</a></li><li><a href="https://forum.freecodecamp.org/u/aldehyde">Aldrin Sean Pereira</a></li><li><a href="https://forum.freecodecamp.org/u/SpookyBlump">SpookyBlump</a></li><li><a href="https://forum.freecodecamp.org/u/luisclaudioc">Luis Costantin</a></li><li><a href="https://forum.freecodecamp.org/u/0x74h51N">Tahsin Önemli</a></li><li><a href="https://forum.freecodecamp.org/u/CrlosZgz">Carlos Bernad</a></li><li><a href="https://forum.freecodecamp.org/u/madhavvattackattu">Madhav Mohan</a></li><li><a href="https://forum.freecodecamp.org/u/christ_harper">Christ-yvan KEMAJOU</a></li><li><a href="https://forum.freecodecamp.org/u/aaronvincent6411">Aaron P Laju</a></li><li><a href="https://forum.freecodecamp.org/u/kevinSmith">Kevin Smith</a></li><li><a href="https://forum.freecodecamp.org/u/Alabastor">Alabastor</a></li><li><a href="https://forum.freecodecamp.org/u/Answer_Alyosha">Answer</a></li><li><a href="https://forum.freecodecamp.org/u/cherry-27">⛤Cherry-27⛤</a></li><li><a href="https://forum.freecodecamp.org/u/m-stanleysk">M</a></li><li><a href="https://forum.freecodecamp.org/u/ablairmorris">ablairmorris</a></li><li><a href="https://forum.freecodecamp.org/u/franciscomelov">Francisco Ecatl Melo Valle</a></li><li><a href="https://forum.freecodecamp.org/u/ziggybryson">Anthony Bryson Jr.</a></li><li><a href="https://forum.freecodecamp.org/u/moT01">Tom M</a></li><li><a href="https://forum.freecodecamp.org/u/Losarig">Alex</a></li><li><a href="https://forum.freecodecamp.org/u/ibrahim_aq">Ibrahim Aq</a></li><li><a href="https://forum.freecodecamp.org/u/admit8490">Andrey D</a></li><li><a href="https://forum.freecodecamp.org/u/mailforworkon">mailforworkon</a></li><li><a href="https://forum.freecodecamp.org/u/AbbyGTech">AbbyGTech</a></li><li><a href="https://forum.freecodecamp.org/u/OpeRichards">Opeyemi Richard</a></li><li><a href="https://forum.freecodecamp.org/u/stroudy91">Stroudy91</a></li><li><a href="https://forum.freecodecamp.org/u/miketandy">Mike</a></li><li><a href="https://forum.freecodecamp.org/u/Blman">Tadesse Agegnehu</a></li><li><a href="https://forum.freecodecamp.org/u/Samuel-54">Samuel Diriba</a></li><li><a href="https://forum.freecodecamp.org/u/Cryptic_X">Cryptic</a></li><li><a href="https://forum.freecodecamp.org/u/hiekamara1">Easside MJ. Kamara</a></li><li><a href="https://forum.freecodecamp.org/u/KoduFCC">KoduFCC</a></li><li><a href="https://forum.freecodecamp.org/u/shy_away">shy_away</a></li><li><a href="https://forum.freecodecamp.org/u/Sebastian_W">Sebastian Włodarczyk</a></li><li><a href="https://forum.freecodecamp.org/u/surelyalice">Kesa Elizabeth Stallman</a></li><li><a href="https://forum.freecodecamp.org/u/KTO">Kyle O'Leary</a></li><li><a href="https://forum.freecodecamp.org/u/Glory1">💜💜purpleglow🌟🌟</a></li><li><a href="https://forum.freecodecamp.org/u/mohamedelmir">mohamed elmir</a></li><li><a href="https://forum.freecodecamp.org/u/KaiG">Kai G</a></li><li><a href="https://forum.freecodecamp.org/u/jpccdirect">jpccdirect</a></li><li><a href="https://forum.freecodecamp.org/u/lucatardi">Luca Tardito</a></li><li><a href="https://forum.freecodecamp.org/u/CodingCoding">Logan Drake Cody</a></li><li><a href="https://forum.freecodecamp.org/u/millicentbowers">Millie Bowers</a></li><li><a href="https://forum.freecodecamp.org/u/MilesWeb">MilesWeb</a></li><li><a href="https://forum.freecodecamp.org/u/sulemankhalil44">suleman khalil</a></li><li><a href="https://forum.freecodecamp.org/u/ghulamshabirbaloch">ghulamshabirbaloch</a></li><li><a href="https://forum.freecodecamp.org/u/diegog">Diego</a></li><li><a href="https://forum.freecodecamp.org/u/fourleagues">Maestro Goldring</a></li></ul><h2 id="-top-contributors-1"><strong>翻译 Top Contributors</strong></h2><ul><li>Afonso Branco</li><li>rustamdocstranslator</li><li>Madlen</li><li>Alan Luo</li><li>LisaGo</li><li>majidah</li><li>Karel Vanhelden</li><li>SeunghyunKim</li><li>Nadja Sellinat</li><li>Kevin Matthew</li><li>Siyana Zdravkova</li><li>Ricardo Cuauro</li><li>Liu dakang</li><li>Álvaro Dávila</li><li>Ira Bohach</li><li>Laureline</li><li>Nils Goeke</li><li>ViktoriaKushnir0-</li><li>ピンク人</li><li>sohyun</li><li>kimploo</li><li>franciscomelov</li><li>Andriana Cabrera</li><li>Kostiantyn Melnyk</li><li>athen</li><li>JulianLobonAguilar</li><li>moonki kim</li><li>Suzie</li><li>Kasia</li><li>mamaruo</li><li>VL</li><li>Solomiia Karpachova</li><li>Diana Kolosovska (Діана Колосовська)</li><li>steven ding</li><li>Elias Pereyra</li><li>nin3lee</li><li>Juanma</li><li>Naelko</li><li>Álvaro Dávila</li><li>Tamiris</li><li>Devan</li><li>Leslie Suh</li><li>Dario</li><li>mix bo</li><li>Eduardo Lima</li><li>isaura-ribeiro</li><li>nighttheduck</li><li>Caroline Andrade</li><li>salvatore luciano</li><li>Nikolai</li><li>Frankline Were</li><li>Mikadifo</li><li>MaxiNZ</li><li>SleepyGogo</li><li>Brendo Arruda</li><li>rkang13</li><li>TikaZ</li><li>shaudvetis</li><li>Minh Tuấn Nguyễn</li><li>wdthor</li><li>BeGeosDev</li><li>Kristian Pavic</li><li>Dalton Cuenca</li><li>jonathanq</li><li>Erick</li><li>Sreya Satheesh</li><li>Freddy R</li><li>Wilmer Gulcochía Sánchez</li><li>Shannon</li><li>André Garcia</li><li>Saikrishna Anumula</li><li>Sharvio</li><li>David Gómez Redondo</li><li>Jimmy Yem</li><li>Lucy Macartney</li><li>vLeov</li><li>Sunce</li><li>1615_P._Enrique</li><li>Ener Octavio Buitrago Camelo</li><li>ProjektMing</li><li>nrached</li><li>Camila</li><li>Maria Luz Davico</li><li>EricF</li><li>Bobby M</li><li>lime</li><li>irabucha</li><li>Filippo Crespi</li><li>MrTL3</li><li>Li Chuan (李川)</li><li>Rodrigo Lajas</li><li>Jarvis Hack</li><li>invoker</li><li>claudiomavi</li><li>Kato Tsune (加藤恒)</li><li>yk1537</li><li>Jose Zambrano</li><li>Takkapi</li><li>BlackAndRed.eth</li><li>leopard355</li><li>DariaShu</li><li>Daniel R. da Silva</li><li>Adham Muhammadjonov</li><li>Davi Stadlinger</li><li>w w</li><li>KenGan</li><li>cezin17</li><li>Dylan Gabriel Diroché</li><li>luluhwenceslau</li><li>Chinchu Ori</li><li>albasantalo</li><li>Dira R P</li><li>William Hincapié</li><li>aldid95</li><li>Fran Martinez</li><li>Yao990815</li><li>Miracle</li><li>Julian Andres Lasso Figueroa</li><li>pame.gon</li><li>watanaki</li><li>Faisal Hanafi</li><li>Jiwon</li><li>Abo_AbdelSalam</li><li>Vé</li><li>Lu Mu (辂木)</li><li>martinvostatek</li><li>Patrick Hähnel</li><li>Stanley S</li><li>Alexia Javadd</li><li>peperluiz</li><li>Lina Guio</li><li>adnen rebai</li><li>Pasan Hewavitharana</li><li>Monir Adam</li><li>Adi Nugroho</li><li>YumiClmpn</li><li>Daniel Garcia Sanchez</li><li>bugrahankaramollaoglu</li><li>Hannibal_TN</li><li>Ucky Deni Ulinnuha</li><li>David Beyer</li><li>Nicolás Folli</li><li>IM Grigore</li><li>Bill Gao</li><li>Baris</li><li>Simón San Juan Gallardo</li><li>Eralpozcan</li><li>Maria Fernanda Rios</li><li>Tsukistar (月落星河)</li><li>Tao</li><li>Gabriel Kraemer</li><li>mementog</li><li>petyaDeveloper</li><li>TrueJackWu</li><li>Nicolvs</li><li>Juan Diego Jaimes</li><li>Cássio Barth</li><li>Aekkapob Pangtan</li><li>Sergitxin</li><li>Bettina Neuwirth</li><li>juanalbglz</li><li>Marta Escriche</li><li>adrianna</li><li>pcaballero</li><li>Nico Van Pletzen</li><li>Rafael Quintero</li><li>Ozat21</li><li>Dinto</li><li>orikes</li><li>fanqie</li><li>Kamil Kliczbor</li><li>Francisco Mancuello</li><li>Roberto Perez</li><li>Luis Aguilar</li><li>kersen</li><li>miller-danilo</li><li>castrovca</li><li>ChristianMoya</li><li>Felipe Navarro</li><li>Felipe Hernández</li><li>DongHyeon</li><li>Denisse Lemos</li><li>Meer Sajib</li><li>AR Dhrubo</li><li><a href="https://www.freecodecamp.org/italian/news/author/paola/">Paola Rosati</a></li><li><a href="https://www.freecodecamp.org/italian/news/author/andrea-sisti/">Andrea Sisti</a></li><li><a href="https://www.freecodecamp.org/japanese/news/author/charlotte-stone/">Charlotte Stone</a></li><li><a href="https://www.freecodecamp.org/japanese/news/author/saki/">Saki Basken</a></li><li><a href="https://www.freecodecamp.org/japanese/news/author/yuki/">Yuki Shibata</a></li><li><a href="https://www.freecodecamp.org/japanese/news/author/yuusuke/">YUUSUKE OKAMOTO</a></li><li><a href="https://www.freecodecamp.org/espanol/news/author/cotyar/">Constanza Areal</a></li><li><a href="https://www.freecodecamp.org/espanol/news/author/elias-pereyra/">Elias Ezequiel Pereyra Gomez</a></li><li><a href="https://www.freecodecamp.org/espanol/news/author/diego-lopez/">Diego Lopez</a></li><li><a href="https://www.freecodecamp.org/espanol/news/author/cristian-fernando-villca-gutierrez/">Cristian Fernando Villca Gutierrez</a></li><li><a href="https://www.freecodecamp.org/espanol/news/author/franciscomelov/">Francisco Melo V.</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/hezean/">HeZean</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/mingxun/">Mingxun Liu</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/tsukistar/">Tsukistar</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/james/">James Z. Zhang</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/hu-qi/">huqi</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/junowei/">JunoWei</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/yiwei/">YiWei</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/luojiyin/">luojiyin</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/herosql/">herosql</a></li><li><a href="https://www.freecodecamp.org/chinese/news/author/nin3/">李小宁</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/afonso">Afonso Branco</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/krislagerstrom">Kris Lagerström</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/filipe-torres">Filipe Barbosa</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/david">David Esdras</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/joao">João Eduardo Gomes</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/luisfelipelc">Luis Felipe L. C.</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/marcelo-pena">Marcelo Pena</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/zendefta">Gabriel Balbueno</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/sabrina">Sabrina Alves</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/analaurareis">Ana Laura Reis</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/author/isabel">Isabel de Souza</a></li></ul><h2 id="youtube-top-contributors"><strong>YouTube Top Contributors</strong></h2><ul><li><a href="https://youtube.com/@programacaocomramon">Ramon Rodrigues</a></li><li><a href="https://www.youtube.com/@_LeoDev">Leosbel Poll Sotomayor</a></li><li><a href="https://www.youtube.com/@CodingTube">David Ruiz</a></li><li><a href="https://www.youtube.com/@programacion-es">Pedro Plasencia</a></li><li><a href="https://www.youtube.com/channel/UCCPJTSHMeae1Ll9uuG-zlkA">David Choi</a></li><li><a href="https://www.youtube.com/channel/UCrvxjsSrcpInnd4NIGDHt2g">Sergie Code</a></li><li><a href="https://www.youtube.com/leonardocastillo79">Leonardo Jose Castillo Lacruz</a></li><li><a href="https://www.youtube.com/@carpicoder">Carpi Coder</a></li><li><a href="https://www.youtube.com/@AlexCGDesign">Jordan Alexander Cruz Garcia</a></li><li><a href="https://www.youtube.com/channel/UC_XaEmy0Rz49GkrhtpzqWlw">Luis Canary</a></li><li><a href="https://youtube.com/@1littlecoder">Abdul M</a></li><li><a href="https://youtube.com/@analyst_adithya">Vyas Adithya</a></li><li><a href="https://youtube.com/@anthonygg_">AnthonyGG</a></li><li><a href="https://youtube.com/@BoualiAli">Ali Bouali</a></li><li><a href="https://youtube.com/@codeafuture">Alen Omeri</a></li><li><a href="https://youtube.com/@codeddesign">Matthew Hlazo</a></li><li><a href="https://youtube.com/@codegenix">Code Genix</a></li><li><a href="https://youtube.com/@codeheadq">Amini</a></li><li><a href="https://youtube.com/@CodeLab98">Code Lab</a></li><li><a href="https://youtube.com/@CodingCleverly">Haris Iftikhar</a></li><li><a href="https://youtube.com/@CodingMoney">Mukhtar Mukhtar</a></li><li><a href="https://youtube.com/@CoffeeNCode">Aba Codes</a></li><li><a href="https://youtube.com/@CounterSyntax">Dauda Kolo</a></li><li><a href="https://youtube.com/@dailycodework">Simpson Alfred</a></li><li><a href="https://youtube.com/@DanVega">Dan Vega</a></li><li><a href="https://youtube.com/@DivRhino">Div Rhino</a></li><li><a href="https://youtube.com/@hayk.simonyan">Hayk Simonyan</a></li><li><a href="https://youtube.com/@hnasr">Hussein Nasser</a></li><li><a href="https://youtube.com/@itsdineshvaryani">Dinesh Varyani</a></li><li><a href="https://youtube.com/@kantancoding">Georgio Tunson</a></li><li><a href="https://youtube.com/@kerolloz">Kerollos Magdy</a></li><li><a href="https://youtube.com/@krishnaik06">Krish Naik</a></li><li><a href="https://youtube.com/@Kulkarniankita">Ankita Kulkarni</a></li><li><a href="https://youtube.com/@pattvira">Patt Vira</a></li><li><a href="https://youtube.com/@ProgrammingwithUmair321">Umair Jameel</a></li><li><a href="https://youtube.com/@quantum-soar">Michael Minaca</a></li><li><a href="https://youtube.com/@reactwithutkarsh">Utkarsh Seth</a></li><li><a href="https://youtube.com/@RobertsTech139">Aleksa Robavs</a></li><li><a href="https://youtube.com/@robotbobby9">Bobby Roe</a></li><li><a href="https://youtube.com/@sangammukherjee">Sangam Mukherjee</a></li><li><a href="https://youtube.com/@shandilyacodes">Ramendu</a></li><li><a href="https://youtube.com/@StevenCodeCraft">Steven Garcia</a></li><li><a href="https://youtube.com/@the_rings_of_saturn">Emilian Kasemi</a></li><li><a href="https://youtube.com/@TheCodeAngle">Deji Adesoga</a></li><li><a href="https://youtube.com/@TheCodeDealer">Wilson Mucheke</a></li><li><a href="https://youtube.com/@TheQuackLearner">Henry Ly</a></li><li><a href="https://youtube.com/@tommys_codebase">Thomas Burns</a></li><li><a href="https://youtube.com/@tweakdesigns">Ashokkumar Chavada</a></li><li><a href="https://youtube.com/@vincibits">Paulo Dichone</a></li><li><a href="https://youtube.com/@vladdata741">Vlad Gheorghe</a></li><li><a href="https://youtube.com/@vukrosic">Vuk Rosić</a></li><li>Anthony Aragues</li><li>Andrew Brown</li><li><a href="https://www.youtube.com/@1stcode">Zak Ali</a></li><li><a href="https://www.youtube.com/@asaprogrammer_">Burak Orkmez</a></li><li><a href="https://www.youtube.com/@AyushSinghSh">Ayush Singh</a></li><li><a href="https://www.youtube.com/@bootdotdev">Lane Wagner</a></li><li><a href="https://www.youtube.com/@CodeBucks">Code Bucks</a></li><li><a href="https://www.youtube.com/@CodingAddict">John Smilga</a></li><li><a href="https://www.youtube.com/@CodingQuests">Omar Zaki</a></li><li><a href="https://www.youtube.com/@CybernaticoByNishant">Nishant Singh</a></li><li><a href="https://www.youtube.com/@DestinationFAANG">Parth Vyas</a></li><li><a href="https://www.youtube.com/@doabledanny">Dan Adams</a></li><li><a href="https://www.youtube.com/@elliotarledge">Elliot Arledge</a></li><li><a href="https://www.youtube.com/@haidermalik3402">Haider Malik</a></li><li><a href="https://www.youtube.com/@HiteshChoudharydotcom">Hitesh Choudhary</a></li><li><a href="https://www.youtube.com/@JSLegendDev">JSLegendDev</a></li><li><a href="https://www.youtube.com/@KeertiPurswani">Keerti Purswani</a></li><li><a href="https://www.youtube.com/@mdalmamunit427">Md Al Mamun</a></li><li><a href="https://www.youtube.com/@NiklasZiermann">Niklas Ziermann</a></li><li><a href="https://www.youtube.com/@Radu">Dr. Radu Mariescu-Istodor</a></li><li><a href="https://www.youtube.com/@SMDS_Studio">Rohan from Self Made Data Scientist</a></li><li><a href="https://www.youtube.com/@Smoljames">James McArthur</a></li><li><a href="https://www.youtube.com/c/CodeWithStein">Stein Helset</a></li><li><a href="https://www.youtube.com/c/RexJonesII">Rex Jones</a></li><li><a href="https://www.youtube.com/channel/UCvFsd8VBn5WZTJLEM-vZwkg">Piyush Itankar</a></li><li><a href="https://youtube.com/@codewithlari">Alaribe Bright</a></li><li>Brijen Makwana</li><li>Dr. Chuck</li><li>Dr. Immanuel Trummer</li><li>Dr. Lance Martin</li><li>Fatos Morina</li><li>Kshitij Sharma</li><li>Tatev from LunarTech</li><li>Tristan Willcox</li><li>Zubin Pratap</li></ul><h2 id="-top-contributors-2"><strong>专栏 Top Contributors</strong></h2><ul><li><a href="https://freecodecamp.org/news/author/joanayebola">Joan Ayebola</a></li><li><a href="https://freecodecamp.org/news/author/dotslashbit">Sahil Mahapatra</a></li><li><a href="https://freecodecamp.org/news/author/manishshivanandhan">Manish Shivanandhan</a></li><li><a href="http://xn--matu-dpa.sh/">Matéu.sh</a></li><li><a href="https://freecodecamp.org/news/author/tiagomonteiro">Tiago Capelo Monteiro</a></li><li><a href="https://freecodecamp.org/news/author/vaheaslanyan">Vahe Aslanyan</a></li><li><a href="https://freecodecamp.org/news/author/Tobilyn77">Oluwatobi</a></li><li><a href="https://freecodecamp.org/news/author/Daiveed">David Jaja</a></li><li><a href="https://freecodecamp.org/news/author/tomerpacific">Tomer</a></li><li><a href="https://freecodecamp.org/news/author/KunalN25">Kunal Nalawade</a></li><li><a href="https://freecodecamp.org/news/author/samyakjainblog">Samyak Jain</a></li><li><a href="https://freecodecamp.org/news/author/nathansebhastian">Nathan Sebhastian</a></li><li><a href="https://freecodecamp.org/news/author/pltvs">Alex Pliutau</a></li><li><a href="https://freecodecamp.org/news/author/Oluwadamisi">Oluwadamisi Samuel</a></li><li><a href="https://freecodecamp.org/news/author/CodeHemaa">Ophy Boamah</a></li><li><a href="https://freecodecamp.org/news/author/reedbarger">Reed</a></li><li><a href="https://freecodecamp.org/news/author/anjanbaradwaj">Anjan Baradwaj</a></li><li><a href="https://freecodecamp.org/news/author/officialrajdeepsingh">Rajdeep Singh</a></li><li><a href="https://freecodecamp.org/news/author/SmoothTech">Timothy Olanrewaju</a></li><li><a href="https://freecodecamp.org/news/author/dbclinton">David Clinton</a></li><li><a href="https://freecodecamp.org/news/author/FahimFBA">Md. Fahim Bin Amin</a></li><li><a href="https://freecodecamp.org/news/author/TheAnkurTyagi">Ankur Tyagi</a></li><li><a href="https://freecodecamp.org/news/author/ashutoshkrris">Ashutosh Krishna</a></li><li><a href="https://freecodecamp.org/news/author/Ijay">Ijeoma Igboagu</a></li><li><a href="https://freecodecamp.org/news/author/grantdotdev">Grant Riordan</a></li><li><a href="https://freecodecamp.org/news/author/elizabethmeshioye">Elizabeth Lola</a></li><li><a href="https://freecodecamp.org/news/author/atapas">Tapas Adhikary</a></li><li><a href="https://freecodecamp.org/news/author/anshulsanghi">Anshul Sanghi</a></li><li><a href="https://freecodecamp.org/news/author/Clifftech">Isaiah Clifford Opoku</a></li><li><a href="https://freecodecamp.org/news/author/CaesarSage">Destiny Erhabor</a></li><li><a href="https://freecodecamp.org/news/author/danieltunj">Daniel Adetunji</a></li><li><a href="https://freecodecamp.org/news/author/hunor">Hunor Márton Borbély</a></li><li><a href="https://freecodecamp.org/news/author/Tioluwani">Oyedele Tioluwani</a></li><li><a href="https://freecodecamp.org/news/author/nyayicfanny">Fanny Nyayic</a></li><li><a href="https://freecodecamp.org/news/author/jcubic">Jakub T. Jankiewicz</a></li><li><a href="https://freecodecamp.org/news/author/DanielKehoe">Daniel Kehoe</a></li><li><a href="https://freecodecamp.org/news/author/Kamaldeen">Kamaldeen Lawal</a></li><li><a href="https://freecodecamp.org/news/author/josevnz">Jose Vicente Nunez</a></li><li><a href="https://freecodecamp.org/news/author/prankurpandeyy">Prankur Pandey</a></li><li><a href="https://freecodecamp.org/news/author/asfakahmed">Asfak Ahmed</a></li><li><a href="https://freecodecamp.org/news/author/obumnwabude">Obum</a></li><li><a href="https://freecodecamp.org/news/author/Spruce">Spruce Emmanuel</a></li><li><a href="https://freecodecamp.org/news/author/Koded001">Temitope Oyedele</a></li><li><a href="https://freecodecamp.org/news/author/marco-venturi">Marco Venturi</a></li><li><a href="https://freecodecamp.org/news/author/sleekcodes">Austin Asoluka</a></li><li><a href="https://freecodecamp.org/news/author/askvikram">Vikram Aruchamy</a></li><li><a href="https://freecodecamp.org/news/author/DanielAsaboro">Daniel Asaboro</a></li><li><a href="https://freecodecamp.org/news/author/huericnan">Eric Hu</a></li><li><a href="https://freecodecamp.org/news/author/Toria">Victoria Burabari Poromon</a></li><li><a href="https://freecodecamp.org/news/author/anantchowdhary">Anant Chowdhary</a></li><li><a href="https://freecodecamp.org/news/author/kealanparr">Kealan Parr</a></li><li><a href="https://freecodecamp.org/news/author/OlehRomanyuk">Oleh Romanyuk</a></li><li><a href="https://freecodecamp.org/news/author/Okosaleo">Okosa Leonard</a></li><li><a href="https://freecodecamp.org/news/author/HijabiCoder">Fatuma Abdullahi</a></li><li><a href="https://freecodecamp.org/news/author/boolfalse">San B</a></li><li><a href="https://freecodecamp.org/news/author/developeraspire">Franklin Okolie</a></li><li><a href="https://freecodecamp.org/news/author/chrisblakely01">Chris Blakely</a></li><li><a href="https://freecodecamp.org/news/author/codenil">Niladri S. Jyoti</a></li><li><a href="https://freecodecamp.org/news/author/kerneldevgr">Nikolaos Panagopoulos</a></li><li><a href="https://freecodecamp.org/news/author/Xtephen">oghenekparobo Stephen</a></li><li><a href="https://freecodecamp.org/news/author/keyurparalkar">Keyur Paralkar</a></li><li><a href="https://freecodecamp.org/news/author/AyaNabilOthman">Aya Nabil Othman</a></li><li><a href="https://freecodecamp.org/news/author/TantoluwaAlabiHerita">Tantoluwa Heritage Alabi NB</a></li><li><a href="https://freecodecamp.org/news/author/ashutoshbw">Ashutosh Biswas</a></li><li><a href="https://freecodecamp.org/news/author/MuhToyyib">Akande Olalekan Toheeb</a></li><li><a href="https://freecodecamp.org/news/author/GhoulKingR">Oduah Chigozie</a></li><li><a href="https://freecodecamp.org/news/author/codewithshahan">Programming with Shahan</a></li><li><a href="https://freecodecamp.org/news/author/bhav09">Bhavishya Pandit</a></li><li><a href="https://freecodecamp.org/news/author/Dotcodes">Abimbola Adedotun Samuel</a></li><li><a href="https://freecodecamp.org/news/author/REXTECH">Ifeanyi Otuonye</a></li><li><a href="https://freecodecamp.org/news/author/gor8808">Gor Grigoryan</a></li><li><a href="https://freecodecamp.org/news/author/trayalex812">Alex Tray</a></li><li><a href="https://freecodecamp.org/news/author/andrico1234">Andrico Karoulla</a></li><li><a href="https://freecodecamp.org/news/author/gatwirival">valentine Gatwiri</a></li><li><a href="https://freecodecamp.org/news/author/bajcmartinez">Juan Cruz Martinez</a></li><li><a href="https://freecodecamp.org/news/author/sieis">Eamonn Cottrell</a></li><li><a href="https://freecodecamp.org/news/author/dera10">Chidera Humphrey</a></li><li><a href="https://freecodecamp.org/news/author/toobaj">Tooba Jamal</a></li><li><a href="https://freecodecamp.org/news/author/balapriyac">Bala Priya C</a></li><li><a href="https://freecodecamp.org/news/author/snowolohijere">Faith Olohijere</a></li><li><a href="https://freecodecamp.org/news/author/Musab19">Musab Habeeb</a></li><li><a href="https://freecodecamp.org/news/author/oluwatobiss">Oluwatobi Sofela</a></li><li><a href="https://freecodecamp.org/news/author/THEJOHNCALEB">John Caleb</a></li><li><a href="https://freecodecamp.org/news/author/AmrDeveloper">Amr Hesham</a></li><li><a href="https://freecodecamp.org/news/author/andrewbaisden">Andrew Baisden</a></li><li><a href="https://freecodecamp.org/news/author/Hyemiie">Yemi Ojedapo</a></li><li><a href="https://freecodecamp.org/news/author/kaushal-joshi">Kaushal Joshi</a></li><li><a href="https://freecodecamp.org/news/author/chelmerrox">Losalini Rokocakau</a></li><li><a href="https://freecodecamp.org/news/author/irorochad">Iroro Chadere</a></li><li><a href="https://freecodecamp.org/news/author/Olabisi09">Olabisi Olaoye</a></li><li><a href="https://freecodecamp.org/news/author/hamdaanaliquatil">Hamdaan Ali</a></li><li><a href="https://freecodecamp.org/news/author/suleolanrewaju">Sule-Balogun Olanrewaju</a></li><li><a href="https://freecodecamp.org/news/author/Derekvibe">Okoro Emmanuel Nzube Derek</a></li><li><a href="https://freecodecamp.org/news/author/kdk">Nibesh Khadka</a></li><li><a href="https://freecodecamp.org/news/author/doroh">Chepkirui Dorothy</a></li><li><a href="https://freecodecamp.org/news/author/alex-anie">Alex Anie</a></li><li><a href="https://freecodecamp.org/news/author/jpromanonet">Juan P. Romano</a></li><li><a href="https://freecodecamp.org/news/author/Zubs">Zubair Idris Aweda</a></li><li><a href="https://www.freecodecamp.org/espanol/news/author/leonardo/">Leonardo José Castillo Lacruz</a></li></ul><h2 id="discord-top-contributors"><strong>Discord Top Contributors</strong></h2><ul><li>plamoni</li><li>jeremylt</li><li>Versailles</li><li>Science99</li><li>rhombert</li><li>localhost</li><li>goks563</li><li>Razzle Dazzle</li><li>hana</li><li>SaintPeter</li><li>Maestro</li><li>xCoffeeMan</li><li>Tex</li><li>Jim</li><li>bradtaniguchi</li><li>Mohammed_malleck</li><li>andrewdmitriev39r</li><li>ilenia</li><li>ArialLeslie</li><li>Chara</li><li>SaintElGandoSmokio</li><li>CapslockHero</li><li>g0vX</li><li>tgrtim</li><li>alpox</li><li>AlexG</li><li>dark</li><li>Lycelia</li><li>WangGang</li><li>Saburo</li><li>Bordin</li><li>Dylan</li><li>bulhaa</li><li>bro keeps whining</li><li>Tek</li></ul><p>freeCodeCamp 社区中有成千上万的参与者，这里我只是列出其中贡献最多的一些人们。</p><p>如果你有兴趣作为 freeCodeCamp 社区的开源贡献者，我建议你<a href="https://contribute.freecodecamp.org/#/">阅读我们的贡献者指南</a>，并加入我们的<a href="https://discord.gg/KVUmVXA">贡献者 Discord</a>。</p><p>再次感谢大家，happy coding。🏕️</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 技术文档工程师如何参与开源贡献 ]]>
                </title>
                <description>
                    <![CDATA[ 可能想到开源贡献，你就会觉得畏惧，尤其是如果你之前从未参与过开源贡献，或者你习惯的是写文档而不是写代码。 本指南将帮助技术文档作者开启开源项目贡献之旅，并概述在开始贡献时，你可能会遇到的常见误区。 另外，本指南会重点介绍一些参与开源贡献的好处，也会提供一些便于技术文档作者开始参与开源贡献的资源。 你能学到什么？ 本文内容包括：技术文档作者参与开源贡献的方式、好处、一些潜在的坏处，以及一些新手入门资源。 什么是开源？ 开源是一种软件开发与发布的协作方式。世界各地的人们通过为软件添加功能、修复bug（错误）、回答问题、翻译文本或写作教程来做开源贡献。 为什么要贡献？ 为开源软件做贡献是技术文档作者和其他知识工作者回馈社会并为社会带来改变的最佳方式之一。 你可以帮忙改进你每天都在使用的软件，或者你可以从开源界前辈那儿学到东西。此外，参与贡献也是一种结识志趣相投的朋友的好途径。当你所做的贡献被人赞赏时，你会觉得自己是社区的一部分。 你可能会想自己应该什么时候参与贡献呢？嗯，如果你是开源新手，按你自己的节奏参与贡献就好啦——不要担心过早地尝试做太多。你会找到自己觉得舒适的节奏。  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-contribute-to-open-source-for-technical-writers/</link>
                <guid isPermaLink="false">642a9adfeb0a820685b6aaae</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Narcissus91 ]]>
                </dc:creator>
                <pubDate>Wed, 25 Oct 2023 04:26:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/04/pexels-william-fortunato-6393024.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/how-to-contribute-to-open-source-for-technical-writers/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Contribute to Open Source –&nbsp;a Guide for Technical Writers</a>
      </p><!--kg-card-begin: markdown--><p>可能想到开源贡献，你就会觉得畏惧，尤其是如果你之前从未参与过开源贡献，或者你习惯的是写文档而不是写代码。</p>
<p>本指南将帮助技术文档作者开启开源项目贡献之旅，并概述在开始贡献时，你可能会遇到的常见误区。</p>
<p>另外，本指南会重点介绍一些参与开源贡献的好处，也会提供一些便于技术文档作者开始参与开源贡献的资源。</p>
<h2 id="">你能学到什么？</h2>
<p>本文内容包括：技术文档作者参与开源贡献的方式、好处、一些潜在的坏处，以及一些新手入门资源。</p>
<h2 id="">什么是开源？</h2>
<p>开源是一种软件开发与发布的协作方式。世界各地的人们通过为软件添加功能、修复bug（错误）、回答问题、翻译文本或写作教程来做开源贡献。</p>
<h2 id="">为什么要贡献？</h2>
<p>为开源软件做贡献是技术文档作者和其他知识工作者回馈社会并为社会带来改变的最佳方式之一。</p>
<p>你可以帮忙改进你每天都在使用的软件，或者你可以从开源界前辈那儿学到东西。此外，参与贡献也是一种结识志趣相投的朋友的好途径。当你所做的贡献被人赞赏时，你会觉得自己是社区的一部分。</p>
<p>你可能会想自己应该什么时候参与贡献呢？嗯，如果你是开源新手，按你自己的节奏参与贡献就好啦——不要担心过早地尝试做太多。你会找到自己觉得舒适的节奏。</p>
<p>为开源做贡献不仅可以增加你的技能，还可以发展你的社区人脉，甚至创造自由工作的机会。</p>
<p>要成为一名活跃的贡献者需要花一些时间积累必要的知识和技能（尤其是因为通常文档写作所需要的技能是不同于编程的），但是，这些时间是值得投入的。</p>
<h2 id="">参与贡献会面临的挑战</h2>
<p>技术文档作者在开始参与开源项目贡献时，会面临一些挑战。最常见的一项挑战就是不确定如何最大化做出贡献，特别是如果你还对项目一无所知。</p>
<p>你可能也不清楚你的任务应该做到什么程度或者这个任务对贡献者有什么期望。对于这个问题，有几个解决办法：你可以阅读 <code>README</code> 文件和/或文档，看看里面有没有贡献指南。你也可以与项目团队成员联系，并寻求帮助。</p>
<h2 id="">如何参与开源项目？</h2>
<p>首先，在<a href="https://github.com/">GitHub</a>上找到你想要参与贡献的一个项目。你可以<a href="https://chinese.freecodecamp.org/news/github-search-tips/">阅读这份教程</a> 查看如何在GitHub上进行搜索并找到项目。</p>
<p>然后，打开README文件，确保你理解里面提到的说明。</p>
<p>接着，点击屏幕右上角的Fork按钮，将这个repo（仓库）fork（复制）下来。</p>
<p><img src="https://lh5.googleusercontent.com/x3IyU70meecZi1qYS4_CCZW0cOZqpcTdVfKjG3_TpM1TJj_tH15FhNaKmrAL2bl8fTU7fcUAditd6AzqJbJItmCavBxQObpD2bAJCRlYds-sX-Z3iyA4b_pajXsOnAJM1_8tbPdbyOGNrXyxCfu1Qk-x3AyDrtDrFxbbxlmIaSSwaj3kYX87ELMUSQ" alt="x3IyU70meecZi1qYS4_CCZW0cOZqpcTdVfKjG3_TpM1TJj_tH15FhNaKmrAL2bl8fTU7fcUAditd6AzqJbJItmCavBxQObpD2bAJCRlYds-sX-Z3iyA4b_pajXsOnAJM1_8tbPdbyOGNrXyxCfu1Qk-x3AyDrtDrFxbbxlmIaSSwaj3kYX87ELMUSQ" width="523" height="99" loading="lazy"></p>
<p>使用下列命令将fork（复制）的仓库复制到你的本地电脑：</p>
<pre><code class="language-bash">git clone &lt;链接到仓库&gt;
</code></pre>
<p>当你点击代码下拉菜单时，会看到仓库链接。</p>
<p>复制好后，打开包含你的新fork的目录，开始添加你的贡献。</p>
<p>完成后，使用下列说明将你的修改推送到GitHub：</p>
<pre><code class="language-bash">git status //显示哪些修改已经分阶段完成
git add . // 在复制的仓库里添加更改
git commit -m "changes" //对复制的仓库进行一次提交
git branch -M changes //创建一个新的分支
git push -u origin changes //推送修改
</code></pre>
<p>将修改推送到复制的仓库后，GitHub页面会弹出提示创建一个Pull Request（PR，拉取请求）。创建PR，等待项目维护者将你复制的仓库合并到主仓库。</p>
<p>如果你不久前fork了该项目，<strong>请确保将上游的修改纳入你的本地仓库</strong> 。</p>
<p>如果你遇到一个大文件，并且还没有安装<code>git-lfs</code>的话，就用这条命令<code>brew install git-lfs</code>去安装一个git-lsf。</p>
<p>Git LFS（Large File Storage大文件存储）是由Atlassian、GitHub以及其他开源贡献者开发的Git扩展。它通过缓慢下载大文件的相关版本（译注：将音频、视频、数据集、图形等大文件存放在远程服务器上）来减少文件在仓库中的影响。</p>
<p>你也可以根据这个<a href="https://docs.github.com/en/repositories/working-with-files/managing-large-files/installing-git-large-file-storage">文档</a> 安装<code>git-lfs</code>。</p>
<h3 id="">开源贡献的最佳实践</h3>
<ol>
<li>确定一个你可以提供帮助的领域，然后在GitHub上找到相关的项目。</li>
<li>阅读任何可能与你感兴趣的项目或程序相似的文档。这样你就会更了解贡献会涉及什么以及其他人做了什么贡献。</li>
<li>搜索标注了good first issue（适合第一次做开源贡献的人的任务）的问题，并通读这些问题——这些问题通常是很容易解决的。</li>
<li>遵循项目的贡献指南，准备好你的代码。</li>
<li>写一个详细的PR，给出你的解决方案，并解释为什么你的方案可以解决当前问题。如果有必要，附上相关资源的链接。</li>
<li>提交你的PR以待审阅。项目团队会讨论是否将你的PR合入仓库，并将结果更新给你。</li>
<li>如果他们决定不接受你的PR，你就询问如何能解决他们的顾虑，这样他们之后就会重新考虑接受PR。</li>
<li>如果他们确实接受了你的PR请求，记得表示感谢！</li>
<li>继续寻找要解决的新问题，并在此过程中分享你的进步！</li>
</ol>
<h2 id="">我能做什么类型的贡献？</h2>
<p>你可以通过多种方式为项目做贡献，包括为bug修复或功能新增提PR、编写软件使用文档、改进已有文档、翻译文档和修改拼写错误。</p>
<p>在深入参与贡献某个项目之前，你应该首先挑选一个你感兴趣的项目，并通读该项目的文档。</p>
<p>参与开源项目的文档写作，有助于将自己打造成行业专家并为将来获得自由职业机会做准备。</p>
<p>在为开源项目写文档时，技术文档作者始终应牢记的一点是，文档读者主要是开发人员。这意味着相较于其他类型的文档，读者需要在技术文档中看到更多的技术细节。</p>
<h2 id="">去哪里找开源项目？</h2>
<p>有很多地方都能找到开源项目。GitHub是最受欢迎的地方，但在BitBucket、Gitlab和其它网站也有开源项目的仓库。</p>
<p>如果你有一个想法，但还没有对应的开源项目，可以先把你的想法和计划放在一个<code>README</code>文件中。如果你不确定如何开始为一个已有的项目做贡献，那么可以查看该项目的文档或通读一些PR，然后提交自己的PR。</p>
<h2 id="">示例项目</h2>
<ul>
<li><a href="https://github.com/h5bp/html5-boilerplate">HTML5 Boilerplate项目</a> 是一个受Web网页开发者欢迎的开源项目。项目支持通过HTML、CSS和Javascript代码来创建网站或网页应用。</li>
<li><a href="https://github.com/twbs">Bootstrap框架</a> 也是一个开源项目，是一个帮助开发者快速创建响应式网站的工具集合。</li>
<li><a href="https://jekyllrb.com/docs/contributing/">Jekyll</a> 是一个用Ruby编写的静态网站生成器，为个人博客而设计。</li>
<li><a href="https://github.com/reactjs/reactjs.org">React.js文档</a> 上有官方的React.js使用文档。</li>
<li><a href="https://github.com/github/docs">GitHub pages</a> 包含所有你需要知道的GitHub信息。</li>
<li><a href="https://github.com/galaxyproject/training-material">Galaxy项目（培训资料）</a> 是Galaxy项目的一个培训资料集。该项目是一个基于网页的开放平台，用于数据密集型的计算研究，其范围超出了生物科学。</li>
<li><a href="https://github.com/cncf">CNCF（云原生计算基金会）</a> CNCF是开源的云原生计算，托管Kubernetes和Prometheus等项目，使云原生无处不在且可持续。</li>
</ul>
<p>你还可以看看<a href="https://developers.google.com/season-of-docs">谷歌文档之季</a>，它帮助开源项目优化文档，同时让技术熟练的技术文档作者获得开源方面的经验。</p>
<p>不同的贡献方式有很多，你总能找到适合自己的。</p>
<h2 id="">总结</h2>
<p>对技术文档作者和内容创作者来说，参与开源贡献是一种很好的与世界分享知识的方式。</p>
<p>参与开源贡献的方式有很多，总之，人人皆可贡献。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 11 琚致远：多一份踏实和耐心，解锁技术旅程中更多可能性 ]]>
                </title>
                <description>
                    <![CDATA[ 2019 年的夏天，我用文字的形式采访了致远。那时候他刚大学毕业，他说自己正在努力成为一名优秀的 Web 全栈工程师，希望自己未来可以踏踏实实，继续做自己喜欢的事情，在此前提下，能够鼓励、帮助身边的人自我实现。 这个 9 月，我邀请他作为播客嘉宾，聊聊他的学习、工作和生活，发现他这几年确实持续着这种状态：踏实地做喜欢的事情，也为他人提供帮助，不仅是一位优秀的开发者，也逐渐成为经验丰富的创业者。 琚致远致远在 7 岁时接触计算机，小学、中学时自学编程，还尝试写程序帮助老师管理资料。在大学期间他带着同学一起承接技术项目，逐渐熟悉项目管理流程。他也帮助同学们学习编程，比如推荐他们使用 freeCodeCamp 的课程学习 Web 开发。 在经历了去德国做交换生、加入海外远程开发团队和网易研究院工作之后，他进入一个全球化的创业公司，担任  global team leader，也维护这个公司捐赠给 Apache 软件基金会的开源 API 网关项目 APISIX。 在节目中，致远聊到他如何适应从工程师转做客户支持，如何平衡商业和开源，以及给印度开发者捐赠最新款的苹果电脑，这些丰富的体验给 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/interview-ju-zhi-yuan-web-developer-unlock-possibilities-in-tech/</link>
                <guid isPermaLink="false">6515bc9a64289f03e60ed6e0</guid>
                
                    <category>
                        <![CDATA[ 播客 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ Web ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 28 Sep 2023 13:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/09/Chinese-3.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>2019 年的夏天，我用文字的形式采访了致远。那时候他刚大学毕业，他说自己正在努力成为一名优秀的 Web 全栈工程师，希望自己未来可以踏踏实实，继续做自己喜欢的事情，在此前提下，能够鼓励、帮助身边的人自我实现。</p><p>这个 9 月，我邀请他作为播客嘉宾，聊聊他的学习、工作和生活，发现他这几年确实持续着这种状态：踏实地做喜欢的事情，也为他人提供帮助，不仅是一位优秀的开发者，也逐渐成为经验丰富的创业者。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/09/WechatIMG140.jpeg" class="kg-image" alt="WechatIMG140" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/09/WechatIMG140.jpeg 600w, https://chinese.freecodecamp.org/news/content/images/size/w1000/2023/09/WechatIMG140.jpeg 1000w, https://chinese.freecodecamp.org/news/content/images/2023/09/WechatIMG140.jpeg 1080w" sizes="(min-width: 720px) 720px" width="1080" height="1071" loading="lazy"><figcaption>琚致远</figcaption></figure><!--kg-card-begin: html--><iframe width="100%" height="180" frameborder="no" scrolling="no" seamless="" src="https://share.transistor.fm/e/ea96fb9e" title="嵌入内容" loading="lazy"></iframe><!--kg-card-end: html--><p>致远在 7 岁时接触计算机，小学、中学时自学编程，还尝试写程序帮助老师管理资料。在大学期间他带着同学一起承接技术项目，逐渐熟悉项目管理流程。他也帮助同学们学习编程，比如推荐他们使用 freeCodeCamp 的课程学习 Web 开发。</p><p>在经历了去德国做交换生、加入海外远程开发团队和网易研究院工作之后，他进入一个全球化的创业公司，担任 &nbsp;global team leader，也维护这个公司捐赠给 Apache 软件基金会的开源 API 网关项目 APISIX。</p><p>在节目中，致远聊到他如何适应从工程师转做客户支持，如何平衡商业和开源，以及给印度开发者捐赠最新款的苹果电脑，这些丰富的体验给我挺多启发，也让我想起 4 年前我在那篇访谈文章里写的：淡泊明志，宁静致远，愿我们始终年轻。</p><p>希望你也喜欢这期节目，期待你把致远的故事分享给更多朋友，当然也欢迎你给我们发邮件分享自己的故事。你可以在<a href="https://www.freecodecamp.org/chinese/news/freecodecamp-podcast-in-chinese/">这篇文章</a>里找到我们的邮箱地址。</p><p>欢迎在 <a href="https://chinese.freecodecamp.org/">https://chinese.freecodecamp.org/</a> 查看更多免费的编程学习资源。</p><h2 id="-"><strong>更多关于嘉宾的信息</strong></h2><ul><li><a href="https://github.com/juzhiyuan">GitHub</a></li><li><a href="https://juzhiyuan.me/">博客</a></li></ul><h2 id="--1"><strong>主要话题</strong></h2><ul><li>04:06 小学初中自学编程</li><li>05:33 脚本小子找回被盗的 QQ</li><li>06:39 投入 Web 开发</li><li>08:39 第一个正式个人项目</li><li>12:12 大学两年赚 20 多万</li><li>13:06 组建小型远程开发团队</li><li>15:32 怎么使用这么多钱</li><li>18:25 教同学们学 Web 开发</li><li>20:35 去德国做交换生</li><li>22:20 家庭的支持</li><li>24:57 不适应网易研究院的安逸节奏</li><li>26:39 在远程团队拓展技术</li><li>29:29 给 Ant Design 做贡献</li><li>31:59 为 APISIX 贡献 dashboard</li><li>36:28 从开源贡献者到创业伙伴</li><li>37:48 基于开源项目做企业版</li><li>39:25 如何进入 Apache 软件基金会</li><li>44:32 成为年纪最小的 Apache Member</li><li>46:38 在基金会中的收获</li><li>51:31 离用户最近</li><li>56:25 工程师转做客户支持</li><li>58:19 全球团队每周只开会半小时</li><li>60:38 平衡开源和商业利益</li><li>64:29 给印度开发者捐赠 MacBook</li><li>66:26 做好 2B 产品</li><li>71:23 参与进去</li></ul><h2 id="--2"><strong>提到的资源</strong></h2><ul><li>《琚致远：优秀 Web 全栈工程师的成长之路》(<a href="https://www.freecodecamp.org/chinese/news/fcc-devtalk-ju-zhi-yuan-growth-path-of-an-excellent-full-stack-web-developer/">https://www.freecodecamp.org/chinese/news/fcc-devtalk-ju-zhi-yuan-growth-path-of-an-excellent-full-stack-web-developer/</a>)</li><li><a href="https://ant.design/">Ant Design</a></li><li><a href="https://www.apache.org/">Apache 软件基金会</a></li><li><a href="https://apisix.apache.org/zh/">Apache APISIX</a></li><li><a href="https://api7.ai">API7.ai</a></li><li><a href="https://juzhiyuan.me/p/b2b-startup-customers-want-solutions">B2B Startup: Customers Want Solutions Than Software</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 9 Rick：在开源世界里追求下一份“疯狂” ]]>
                </title>
                <description>
                    <![CDATA[ 我们今天的嘉宾是《开源面对面》播客的发起人和主播 Rick。 RickRick 有多年研发工作经验，热衷于贡献开源，也通过很多方式帮助人们走近开源，比如以开源的方式维护一个播客。 他在学生时期对电子产品很有兴趣，大学时他自己组装电脑，开始摸索着学习软件开发，接着毕业后从事开发工作。 在工作几年后，Rick 逐渐为开源软件项目、持续集成工具 Jenkins 的中文本地化做贡献，有很多有意思的体验，比如收到 Jenkins 创始人 KK 的邮件、为中文版的工作提供支持，组织线上线下的技术交流活动，招募更多人参与翻译，通过和世界各地的开发者们沟通来练习英语。这些体验是在日常的开发工作中很难获得的。他形容自己在刚开始参与开源贡献时不计成本地投入大量时间。现在，他对于平衡参与开源和本职工作的时间，有了更全面的思考。 2021 年，Rick 和朋友们发起《开源面对面》播客，采访开源社区里的人们。他希望这个播客能帮助听众、嘉宾以及协作的伙伴都获得成功，给更多普通人带来价值。那他是如何以开源的方式维护这个播客、获得越来越多人的支持的？这个问题就留给大家在我们的节目中探索啦。 与回顾自己过往的 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/interview-rick-pursuing-the-next-thing-in-the-open-source-world/</link>
                <guid isPermaLink="false">6502bf18e5e37203f8d412e4</guid>
                
                    <category>
                        <![CDATA[ 播客 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 14 Sep 2023 13:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/09/Chinese--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>我们今天的嘉宾是《开源面对面》播客的发起人和主播 Rick。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/09/Rick.jpg" class="kg-image" alt="Rick" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/09/Rick.jpg 600w, https://chinese.freecodecamp.org/news/content/images/size/w1000/2023/09/Rick.jpg 1000w, https://chinese.freecodecamp.org/news/content/images/size/w1600/2023/09/Rick.jpg 1600w, https://chinese.freecodecamp.org/news/content/images/2023/09/Rick.jpg 1987w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Rick</figcaption></figure><!--kg-card-begin: html--><iframe width="100%" height="180" frameborder="no" scrolling="no" seamless="" src="https://share.transistor.fm/e/fb514337" title="嵌入内容" loading="lazy"></iframe><!--kg-card-end: html--><p>Rick 有多年研发工作经验，热衷于贡献开源，也通过很多方式帮助人们走近开源，比如以开源的方式维护一个播客。</p><p>他在学生时期对电子产品很有兴趣，大学时他自己组装电脑，开始摸索着学习软件开发，接着毕业后从事开发工作。</p><p>在工作几年后，Rick 逐渐为开源软件项目、持续集成工具 Jenkins 的中文本地化做贡献，有很多有意思的体验，比如收到 Jenkins 创始人 KK 的邮件、为中文版的工作提供支持，组织线上线下的技术交流活动，招募更多人参与翻译，通过和世界各地的开发者们沟通来练习英语。这些体验是在日常的开发工作中很难获得的。他形容自己在刚开始参与开源贡献时不计成本地投入大量时间。现在，他对于平衡参与开源和本职工作的时间，有了更全面的思考。</p><p>2021 年，Rick 和朋友们发起《开源面对面》播客，采访开源社区里的人们。他希望这个播客能帮助听众、嘉宾以及协作的伙伴都获得成功，给更多普通人带来价值。那他是如何以开源的方式维护这个播客、获得越来越多人的支持的？这个问题就留给大家在我们的节目中探索啦。</p><p>与回顾自己过往的成绩相比，Rick 觉得更令自己感到兴奋的是不断在开源世界里追求下一份“疯狂”。希望收听这期节目的你能从他的分享中得到一些能量，保持思考保持年轻。</p><p>如果你喜欢我们的节目，请记得在收听播客的平台上给我们五星或者好评，并把节目推荐给更多朋友。</p><p>欢迎在 <a href="https://chinese.freecodecamp.org/">https://chinese.freecodecamp.org/</a> 查看更多免费的编程学习资源。</p><h2 id="-"><strong>更多关于嘉宾的信息</strong></h2><ul><li><a href="https://github.com/LinuxSuRen">GitHub</a></li></ul><h2 id="--1"><strong>主要话题</strong></h2><ul><li>03:34 技术旅程的起点</li><li>10:08 什么时候开始接触开源软件</li><li>11:56 为 Jenkins 中文版做贡献</li><li>15:10 非常社区化的 Jenkins 社区</li><li>21:33 Jenkins logo 趣味设计</li><li>24:02 没有黑洞的开源社区</li><li>27:38 中文本地化</li><li>29:37 收到 Jenkins 创始人 KK 的邮件</li><li>33:27 working in public</li><li>33:42 在社区中的声誉</li><li>38:09 免费学英语的好环境</li><li>43:05 降低预期</li><li>46:40 首先让自己变得更成功</li><li>48:16 平衡工作和贡献的时间</li><li>55:38 站在舞台上是什么体验</li><li>65:10 社区是个万花筒</li><li>72:40 DevRel 开发者关系</li><li>77:38 1700 个项目</li><li>79:08 发起播客的初衷</li><li>82:38 开源的播客</li><li>85:05 公开和帮助别人</li><li>90:12 被听众吐槽“太烂了”</li><li>91:32 用声音记录改变</li><li>93:09 帮普通人打破限制</li><li>96:40 追求下一份“疯狂”</li><li>98:58 欢迎参与《开源面对面》协作</li></ul><h2 id="--2"><strong>提到的资源</strong></h2><ul><li><a href="https://osf2f.net/">开源面对面</a></li><li><a href="https://docs.oracle.com/javase/8/docs/technotes/tools/windows/javadoc.html">Javadoc</a></li><li><a href="https://www.jenkins.io/">Jenkins</a></li><li><a href="https://www.jenkins-zh.cn/">Jenkins 中文社区</a></li><li><a href="https://baike.baidu.com/item/Sun%20Microsystems/6064586">SUN 公司</a></li><li><a href="https://cd.foundation/">持续交付基金会 CDF</a></li><li><a href="https://www.linuxfoundation.org/zh/chinese">Linux 基金会 LF</a></li><li><a href="https://www.atlassian.com/software/jira">Jira</a></li><li><a href="https://skywalking.apache.org/">Apache Skywalking</a></li><li><a href="https://www.apache.org/">Apache 基金会</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Ep. 7 水歌：在开源社区中成长，在开放生态中为社会创造价值 ]]>
                </title>
                <description>
                    <![CDATA[ 在开源社区中成长和贡献 20 年是一种什么样的体验？ 这期节目我们邀请了嘉宾水歌。他是一位 Web 全栈工程师，是 WebCell 前端开源框架作者，也是一位创业者。 水歌水歌在念初三的时候，抱着试一试的心态，在 Ubuntu 网站上填表申请免费操作系统的安装光盘，然后真的收到从欧洲寄来的 9 张 CD 和 1 张 DVD，这开启了他在开源世界中的旅程。 在接下来将近 20 年的时间里，他在高中和大学校园里创办 IT 社团、在本地城市组织 freeCodeCamp 社区技术交流活动、开发开源框架、发起开源市集、组织开源实训、推广“开放式协作”的理念......他持续在开源社区中贡献和成长，也帮助身边的人们成长。 接下来，我们从水歌的分享中感受一位开发者的成长经历，以及如何应用技术在开放生态中为社会创造价值。 如果你喜欢我们的节目，请记得在收听播客的平台上给我们五星或者好评，并把节目推荐给更多朋友。 欢迎在 https://chinese.freecodecamp.org/ 查看更多免费的编程学习资源。 主要话题  * 03:35 技术旅程的起点  * 07:36 第一次了 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/interview-shuige-a-developer-growing-in-the-open-source-community/</link>
                <guid isPermaLink="false">64f0c694c9a32803ff3cf687</guid>
                
                    <category>
                        <![CDATA[ 播客 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Miya Liu ]]>
                </dc:creator>
                <pubDate>Thu, 31 Aug 2023 17:05:54 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/08/Chinese--3-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>在开源社区中成长和贡献 20 年是一种什么样的体验？</p><p>这期节目我们邀请了嘉宾水歌。他是一位 Web 全栈工程师，是 WebCell 前端开源框架作者，也是一位创业者。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2023/08/TechQuery-WebCell-cap.jpg" class="kg-image" alt="TechQuery-WebCell-cap" srcset="https://chinese.freecodecamp.org/news/content/images/size/w600/2023/08/TechQuery-WebCell-cap.jpg 600w, https://chinese.freecodecamp.org/news/content/images/size/w1000/2023/08/TechQuery-WebCell-cap.jpg 1000w, https://chinese.freecodecamp.org/news/content/images/2023/08/TechQuery-WebCell-cap.jpg 1082w" sizes="(min-width: 720px) 720px" width="1082" height="1082" loading="lazy"><figcaption>水歌</figcaption></figure><!--kg-card-begin: html--><iframe width="100%" height="180" frameborder="no" scrolling="no" seamless="" src="https://share.transistor.fm/e/aa82ae2d" title="嵌入内容" loading="lazy"></iframe><!--kg-card-end: html--><p>水歌在念初三的时候，抱着试一试的心态，在 Ubuntu 网站上填表申请免费操作系统的安装光盘，然后真的收到从欧洲寄来的 9 张 CD 和 1 张 DVD，这开启了他在开源世界中的旅程。</p><p>在接下来将近 20 年的时间里，他在高中和大学校园里创办 IT 社团、在本地城市组织 freeCodeCamp 社区技术交流活动、开发开源框架、发起开源市集、组织开源实训、推广“开放式协作”的理念......他持续在开源社区中贡献和成长，也帮助身边的人们成长。</p><p>接下来，我们从水歌的分享中感受一位开发者的成长经历，以及如何应用技术在开放生态中为社会创造价值。</p><p>如果你喜欢我们的节目，请记得在收听播客的平台上给我们五星或者好评，并把节目推荐给更多朋友。</p><p>欢迎在 <a href="https://chinese.freecodecamp.org/">https://chinese.freecodecamp.org/</a> 查看更多免费的编程学习资源。</p><h2 id="-"><strong>主要话题</strong></h2><ul><li>03:35 技术旅程的起点</li><li>07:36 第一次了解开源</li><li>12:05 在高中创办技术社团</li><li>15:30 自己动手解决问题</li><li>19:39 开源的核心是“开放式协作”</li><li>24:22 开源社区的人们在做什么</li><li>26:00 通过编程改善书店的工作流</li><li>33:12 为 jQuery 做第一次开源贡献</li><li>34:42 新手如何给开源项目做贡献</li><li>37:35 JavaScript 开源生态</li><li>41:32 如何做自己的开源项目</li><li>43:18 选择什么开源许可证</li><li>49:51 英语水平是参与开源的障碍吗</li><li>52:30 通过办技术活动提升自信</li><li>58:46 成为微软 MVP</li><li>63:08 因为台湾开源社区的启发发起开源市集</li><li>70:26 用开源的理念创业</li><li>85:13 最重要的是“主动”</li></ul><h2 id="--1"><strong>更多关于嘉宾的信息</strong></h2><ul><li><a href="https://tech-query.me/">博客</a></li><li><a href="https://github.com/TechQuery">GitHub</a></li></ul><h2 id="--2"><strong>提到的资源</strong></h2><ul><li><a href="https://ubuntu.com/">Ubuntu</a></li><li><a href="https://www.discuz.vip/">discuz</a></li><li><a href="https://tech-query.me/community/open-source-in-one-word/">开源</a></li><li><a href="https://web-cell.dev/">WebCell</a></li><li><a href="https://mvp.microsoft.com/zh-cn">微软 MVP</a></li><li><a href="https://idea2.app/">idea2app</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何使用 GitHub Actions 实现开源项目的自动化 ]]>
                </title>
                <description>
                    <![CDATA[ 如今，开发人员经常使用自动化工具来有效地管理任务，并简化他们的日常活动。GitHub Actions 就是这些流行的工具之一。 你可能会同意我的观点：软件（包括开源软件）对效率的要求很高。在这种自动化工具的帮助下，维护者可以将重复性的工作自动化，并专注于更重要的任务，如编写高质量的代码、审核贡献，以及围绕项目创建一个活跃的社区。 我曾经不得不手动完成一些本可以自动化的任务，所以我觉得我有资格分享如何使用 GitHub Actions 来节省时间。 我花了大半天的时间去研究我的一个已经吸引了贡献者的迷你 Python 项目 [https://github.com/larymak/Python-project-Scripts]。我给新的贡献者写热情洋溢的欢迎词，检查最近 pull requests，以确保他们遵守项目的规则比如 README 文件和说明、如果需要的话提供截图，等等。 但我不知道的是，我可以自动执行其中一些任务以及更多任务，以减少自己的工作量。我可以在 GitHub Actions 的帮助下做到这一点。 在本指南中，我将分享更多关于 GitHub Actions 的 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/automate-open-source-projects-with-github-actions/</link>
                <guid isPermaLink="false">64257c76e32a7606487d5e9f</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ GitHub ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 自动化 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Chengjun.L ]]>
                </dc:creator>
                <pubDate>Thu, 30 Mar 2023 10:21:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2023/03/OOP--4-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/automate-open-source-projects-with-github-actions/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Use GitHub Actions to  Automate Open-Source Projects</a>
      </p><p>如今，开发人员经常使用自动化工具来有效地管理任务，并简化他们的日常活动。GitHub Actions 就是这些流行的工具之一。</p><p>你可能会同意我的观点：软件（包括开源软件）对效率的要求很高。在这种自动化工具的帮助下，维护者可以将重复性的工作自动化，并专注于更重要的任务，如编写高质量的代码、审核贡献，以及围绕项目创建一个活跃的社区。</p><p>我曾经不得不手动完成一些本可以自动化的任务，所以我觉得我有资格分享如何使用 GitHub Actions 来节省时间。</p><p>我花了大半天的时间去研究我的一个已经吸引了贡献者的<a href="https://github.com/larymak/Python-project-Scripts">迷你 Python 项目</a>。我给新的贡献者写热情洋溢的欢迎词，检查最近 pull requests，以确保他们遵守项目的规则比如 README 文件和说明、如果需要的话提供截图，等等。</p><p>但我不知道的是，我可以自动执行其中一些任务以及更多任务，以减少自己的工作量。我可以在 GitHub Actions 的帮助下做到这一点。</p><p>在本指南中，我将分享更多关于 GitHub Actions 的信息，以及我如何使用它。我将向你展示如何利用它来自动化项目的各个方面，从欢迎新贡献者到分配任务、检查代码质量等等。我们一起来让你的项目更加高效、更具有交互性。</p><h2 id="github-actions-"><strong>GitHub Actions 是什么</strong></h2><p>GitHub Actions 是一种工具，可让你在 GitHub 仓库中执行不同的自动化操作。它允许你创建自定义工作流，你可以使用这些工作流来自动化开发过程，例如构建、测试和部署代码。</p><p>将此工具与其他 GitHub 功能集成后，你可以转变你的项目管理程序，让每个参与其中的人都更加愉快，更加有参与感。</p><h3 id="-github-actions"><strong>如何在你的仓库中设置 GitHub Actions</strong></h3><p>一切都从根文件夹开始。默认情况下，GitHub Actions 通常集成在你的 GitHub 仓库中，因此你无需在安装时注册单独的账户。但是你需要执行几个步骤才能访问它的功能。</p><ul><li>在你的 GitHub 仓库中，在顶部导航选项卡上，你将看到 <strong><strong>Actions</strong></strong> 选项卡。单击它，你可以访问推荐的工作流列表以及创建自己的工作流的选项。</li><li>现在，根据项目的性质，你可以选择从可用列表中选择一个已经创建的工作流，也可以选择自己创建一个。由于你了解项目的全部内容以及可能需要自动化的内容，因此我建议你自己设置一个新的工作流程。这将使你更好地了解正在发生的事情。</li><li>要设置新的工作流程，请单击 <strong><strong>Set up a workflow yourself</strong></strong>（自行设置工作流程）。这将带你进入一个工作流创建界面，其中包含一个名为 <code>main.yml</code> 的新 YAML 文件。既然你选择编写自己的工作流程，在这里，我应该提到了解 YAML 非常重要。</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2023/03/actions-tab.png" class="kg-image" alt="actions-tab" width="600" height="400" loading="lazy"></figure><p>在幕后发生的事情是，一旦你单击此选项，就会在 <code>main.yml</code> 文件旁边创建两个文件夹。如果你之后访问你的仓库或查看文件名之前的路径，你将看到：<code>.github/workflows/&lt;filename&gt;</code>。</p><ul><li>在 <code>main.yml</code> 文件中是你定义工作流程的地方，在编写完所有内容后，你可以提交更改（commit the changes），就像对仓库进行更改时所做的那样。这样，你就设置了工作流，它将根据 YAML 文件中定义的触发器运行。</li></ul><p>或者，你仍然可以在你最喜欢的代码编辑器中完成这一切。你需要做的就是将仓库克隆到你的计算机上，在项目的根文件夹中创建一个 <code>.github</code> 文件夹，在其中创建另一个名为 <code>workflows</code> 的文件夹，最后添加一个扩展名为 <code>.yml</code> 的文件并将你的脚本写入这个文件。</p><p>在下面的示例中，我将引用我在项目中实现的代码来帮助你理解。</p><h2 id="github-actions--1">GitHub Actions 组件</h2><p>GitHub Actions 主要由三个主要组件组成，包括：</p><ul><li>工作流（Workflows） - 这些是定义自动化过程的规则集。它们在 YAML 文件中定义，该文件存储在 <code>.github/workflows</code> 目录中。</li><li>事件（Events） - 它们启动工作流。例如，你可以将事件设置为在创建 PR 或新开 issue 时运行工作流。要在工作流中定义事件，请使用关键字 <code>on</code> 后跟事件名称。</li></ul><p>例如：</p><pre><code class="language-yaml">on:
    issues:
        types: [opened]
    pull_request_target:
        types: [opened]
</code></pre><ul><li>任务（Jobs） - 这些构成了工作流程。默认情况下，任务是同时运行的。要在给定的工作流中定义你的任务，请使用关键字 <code>jobs</code>，后跟每个任务及其配置的唯一标识符。</li></ul><p>例如：</p><pre><code class="language-yaml">jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Check out repository
        uses: actions/checkout@v2
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.10
      - name: Install dependencies
        run: |
          pip install -r requirements.txt
</code></pre><p>所有这些组件确保一组特定的规则被成功执行。现在看看我们的项目。</p><h2 id="-issue-pull-request">如何自动化管理 issue 和 pull request</h2><p>管理 issue 和 pull request 可能是一项非常耗时的工作，尤其是对于大型开源项目。但有了 GitHub Actions，维护者就可以把这些流程自动化，把更多的时间花在编码和与社区互动上。</p><h3 id="-issue-pull-request-">如何创建 issue 和 pull request 模板</h3><p>如果你是一个活跃的开源贡献者，你有可能遇到过一个指南，告诉你在创建 issue 或提交 PR 时应该包括什么。这种模板的主要目的是提供指导，确保贡献者提供所有必要的信息。</p><p>现在，让我们看看你如何在你的项目中创建这个模板：</p><ul><li>第一步是确保在仓库的 root 中有一个 <code>.github</code> 目录，如果你还没有的话。</li><li>在 <code>.github</code> 文件夹内，创建两个文件夹 <code>ISSUE_TEMPLATE</code> 和 <code>PULL_REQUEST_TEMPLATE</code>。</li><li>在这两个文件夹中，添加代表你想自动化内容的 markdown 文件：例如，你可以将 <code>feature_request.md</code> 和 <code>issue_report.md</code> 作为 issue 模板，将 <code>pull_request_template.md</code> 作为 PR 模板。</li></ul><p>下面是我在 <code>pull_request_template.md</code> 文件中写的内容，作为参考。这是一个简单的指南，告诉贡献者在提交 pull request 之前应该包括什么。</p><pre><code class="language-markdown">**Related Issue(s):**
Please provide a title for this pull request.

**Description:**
Please provide a brief description of the changes you are proposing.

**Checklist:**

-   [ ] I have read and followed the [contributing guidelines](/CONTRIBUTING.md).
-   [ ] I have included a README file for my project.
-   [ ] I have updated the main README file where necessary.
-   [ ] I have included a requirements.txt file.
-   [ ] I have added tests that prove my changes are effective or that my feature works.
-   [ ] All new and existing tests pass.

**Screenshots**
If applicable, add screenshots to help explain behavior of your code.

**Additional Notes:**
Please provide any additional information about the changes you are proposing.
</code></pre><p>如需更详细的解释，请在<a href="https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/about-issue-and-pull-request-templates">这里</a>查看 GitHub Action 关于 issue 和 pull request 模板的文档。</p><h3 id="-">欢迎新的贡献者并表彰社区的努力</h3><p>作为一个维护者，与社区打交道是很重要的，因为你有机会与你的朋辈直接互动并获得反馈。但如果你正在运行一个吸引众多贡献者的大型项目，你可能不会经常有机会直接与社区互动。</p><p>在 GitHub Actions 的帮助下，你可以完成其中的一些任务，比如欢迎新的贡献者，认可他们的努力，并为现有的社区成员创造一个积极的氛围。</p><p>如果你正在管理一个小项目，你可能可以直接与社区互动，但仍然利用自动化来完成一些工作。</p><p>例如，这里有一些示例代码，当新的贡献者创建 pull request 或在仓库上创建一个新的 issue 时，我通过这些代码来欢迎他们。在其中，你可以看到我有一条信息，感谢他们的努力，也向他们保证我将尽快审核他们提交的修改。尽管如此，如果需要额外的东西或提出新的想法，我还是会通过对话去跟进。</p><pre><code class="language-yaml">name: Welcome New Contributors

on:
    issues:
        types: [opened]
    pull_request_target:
        types: [opened]

jobs:
    welcome:
        runs-on: ubuntu-latest
        steps:
            - name: Welcome Issue
              if: github.event_name == 'issues'
              uses: actions/github-script@v5
              with:
                  script: |
                      const issue = context.issue;
                      const repo = context.repo;
                      const issueAuthor = context.payload.sender.login;
                      const welcomeMessage = `
                        Hi @${issueAuthor}! :wave:
                        Thank you for creating an issue in our repository! We appreciate your contribution and will get back to you as soon as possible.
                      `;
                      github.rest.issues.createComment({
                        ...repo,
                        issue_number: issue.number,
                        body: welcomeMessage
                      });
            - name: Welcome Pull Request
              if: github.event_name == 'pull_request_target'
              uses: actions/github-script@v5
              with:
                  script: |
                      const pr = context.issue;
                      const repo = context.repo;
                      const prAuthor = context.payload.sender.login;
                      const welcomeMessage = `
                        Hi @${prAuthor}! :wave:
                        Thank you for submitting a pull request! We appreciate your contribution and will review your changes as soon as possible.
                      `;
                      github.rest.issues.createComment({
                        ...repo,
                        issue_number: pr.number,
                        body: welcomeMessage
                      });
</code></pre><p>除了这个简单的工作流程外，如果你正在领导一个更复杂的项目，你可以考虑编写一个更详细的工作流程，能够自动为贡献者分配徽章、标签或自定义标题。</p><p>同样，你也可以选择添加一个工作流，在贡献者的 pull request 被合并或 issue 被关闭时对其表示感谢。你可以查看 <a href="https://docs.github.com/en/actions/managing-issues-and-pull-requests/using-github-actions-for-project-management">GitHub Action 文档</a>，了解详细的指南。</p><h2 id="-qa-">如何实现代码 QA 的自动化</h2><p>对于大多数开发人员来说，编写高质量的代码是非常重要的，特别是如果他们正在创建与消费者有关的应用。虽然一个项目的成功取决于精心编写和测试的代码，但有时审核修改可能会花些时间，甚至会使用户正需要的功能延迟上线。</p><p>在代码自动化工具的帮助下，你可以保持一致的编码风格，并快速和容易地识别潜在的错误，保持你的项目整洁。</p><p>那么，如何用 GitHub Actions 设置持续集成（CI），整合代码 formatting 和 linting 工具，并在项目中使用自动化代码审核服务？</p><p>持续集成（CI）帮助你实现流程自动化，如构建、测试和验证代码更改。就像其他自动化代码一样，CI 代码写在一个 <code>.yml</code> 文件中，存储在 <code>.github/workflows</code> 文件夹中。</p><p>下面是一个 Python 项目 CI 工作流程的例子，它在向仓库的 <code>main</code> 分支 pull request 时运行。它测试 Python 多个版本的代码，安装必要的依赖，并使用 <code>unittest</code> 模块运行测试。</p><pre><code class="language-yaml">name: Python CI

on:
  push:
    branches:
      - main
  pull_request:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: [3.7, 3.8, 3.9, 3.10]

    steps:
    - uses: actions/checkout@v2
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v2
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run tests
      run: |
        python -m unittest discover
</code></pre><p>除了上面的代码，如果你想保持代码风格的一致性，你可以整合代码 formatting 和 linting 工具，如 <code>black</code>、<code>isort</code> 或 <code>flake8</code>。为此，你只需要在 <code>requirements.txt</code> 文件中加入这些工具，该文件已经包含在上述代码中。下面的代码块运行这些工具。</p><pre><code class="language-yaml">#...
    # ...
    - name: Run black for code formatting
      run: |
        black --check .
    - name: Run isort for import sorting
      run: |
        isort --check --diff .
    - name: Run flake8 for linting
      run: |
        flake8 .
</code></pre><p>如果它发现任何代码格式问题，CI 构建将失败。要解决这个问题，你必须手动检查日志。请查看这个关于<a href="https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python">构建和测试 Python</a> 的指南，了解更多的例子。</p><p>上面的想法只是你可以在项目中使用的一些自动程序。对于一个更复杂的应用，你可以考虑增加工作流程，用 Sphinx 或 MkDocs 等工具生成文档，自动化依赖性更新，自动化发布管理和项目跟踪，等等。</p><h2 id="-github-actions-">关于构建自定义 GitHub Actions 的提示</h2><p>在 <a href="https://github.com/marketplace?type=actions">GitHub Actions 市场</a>上已经有很多预制的 action。但有时你可能想要或需要定制工作流程以满足你的需求。</p><p>为此，你可以选择 JavaScript 或 Docker 容器，并与社区分享。</p><p>这里有一些可以遵循的最佳做法：</p><ul><li>了解问题 - 就像其他项目一样，在开始构建之前，确保你了解要解决的问题以及你将如何解决它。</li><li>选择正确的技术栈 - 如上所述，可以使用 JavaScript 或 Docker 编写 GitHub Actions。请确保选择最适合你的需求和理解的方式。</li><li>确保你遵守最佳的编码实践，以便别人能够轻松地理解和阅读你的代码。</li><li>利用已有的软件包，如 <code>@actions/core</code> 和 <code>@actions/github</code>，它们提供了与 GitHub Actions 环境和 GitHub API 的简单互动。</li><li>在成功创建自己的工作流程后，你有可能想要发布它。无论你是否发布，请确保测试你的 action 是否有潜在的问题或错误。</li></ul><p>通过这些简单的技巧，你可以创建一个自定义的 GitHub Action 来自动完成项目中的一些主要/基本任务。除了上面的提示，你可以在<a href="https://docs.github.com/en/actions/creating-actions">官方文档</a>中找到更多关于创建自定义 action 的详细信息。</p><h2 id="--1">总结</h2><p>在本指南中，我们看到了 GitHub Actions 能给我们的项目带来的好处。它不仅简化了生产流程，而且还允许我们自定义 action 以适应项目需要。</p><p>这仅仅是我们能实现的东西的一小部分。我鼓励你更好地理解和探索不同的方法，以进一步用 GitHub Actions 改进你的开源项目。让我们拥抱自动化，利用它来完成更多工作。</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 初学者的开源项目参与指南 ]]>
                </title>
                <description>
                    <![CDATA[ 听到开源的时候你脑海中会浮现什么画面？在编程世界中，开源是开源软件（OSS）的统称。开源软件建立在对所有人开放查看、更改、扩展和分发的源代码之上。 本文将讨论开源软件和其生态系统的各个方面。包括为开源项目贡献的条件、你需要掌握的技能、如何维护开源项目、挑战和资源，以及一些你可以开始着手尝试的激动人心的项目。 在开始之前，让我简单介绍一下我自己以及我对开源社区的兴趣。 我每天都会使用开源项目、产品和服务，我也参与贡献开源项目提升自我。我维护着一些向初学者提供 Web 编程教学的开源项目。 你可以在我的 GitHub 资料 [https://github.com/atapas]上查看我的开源项目。 如果你尚未开始贡献开源项目，我将通过这篇文章分享我自己的经验帮助你开启开源之旅。 开源是如何运作的？ 开源项目包含以下人物和元素： 项目维护者：维护者有一位或者多位，他们启动开源项目、管理项目、制定决策、集思广益并且和贡献者、用户以及营销平台密切接触。 项目维护者拥有额外的权利来控制项目的各个方面。 项目贡献者：启动开源项目的维护者是早期贡献者。随着项目的壮大，更多人了解到项目 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/a-practical-guide-to-start-opensource-contributions/</link>
                <guid isPermaLink="false">631c76bd5826d307a3f9c429</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ PapayaHUANG ]]>
                </dc:creator>
                <pubDate>Fri, 09 Sep 2022 02:36:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/09/Book-PNG.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>原文：</strong> <a href="https://www.freecodecamp.org/news/a-practical-guide-to-start-opensource-contributions/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Open Source for Developers – A Beginner's Handbook to Help You Start Contributing</a>
      </p><!--kg-card-begin: markdown--><p>听到<code>开源</code>的时候你脑海中会浮现什么画面？在编程世界中，开源是开源软件（OSS）的统称。开源软件建立在对所有人开放查看、更改、扩展和分发的源代码之上。</p>
<p>本文将讨论开源软件和其生态系统的各个方面。包括为开源项目贡献的条件、你需要掌握的技能、如何维护开源项目、挑战和资源，以及一些你可以开始着手尝试的激动人心的项目。</p>
<p>在开始之前，让我简单介绍一下我自己以及我对开源社区的兴趣。</p>
<p>我每天都会使用开源项目、产品和服务，我也参与贡献开源项目提升自我。我维护着一些向初学者提供 Web 编程教学的开源项目。</p>
<p>你可以在我的 <a href="https://github.com/atapas">GitHub 资料</a>上查看我的开源项目。</p>
<p>如果你尚未开始贡献开源项目，我将通过这篇文章分享我自己的经验帮助你开启开源之旅。</p>
<h2 id="">开源是如何运作的？</h2>
<p>开源项目包含以下人物和元素：</p>
<p><code>项目维护者</code>：维护者有一位或者多位，他们启动开源项目、管理项目、制定决策、集思广益并且和贡献者、用户以及营销平台密切接触。</p>
<p>项目维护者拥有额外的权利来控制项目的各个方面。</p>
<p><code>项目贡献者</code>：启动开源项目的维护者是早期贡献者。随着项目的壮大，更多人了解到项目并且愿意参与贡献。</p>
<p>项目越大，贡献者越多。任何人都可以查看项目代码、修改代码、请求校对并将改变并入项目中。</p>
<p><code>源代码和文档库</code>：维护者将项目源代码保存在一个中心化的源代码库（例如 GitHub）。这样所有贡献者就可以访问代码并且参与贡献。</p>
<p><code>项目许可证</code>：每一个开源项目都必须指定一个分发许可证，给用户和使用者提供清晰的信息。</p>
<p>有各种各样的许可证，维护者可以根据项目做选择。比较广泛被采用的许可证包括：MIT、 Apache License 2.0、 GNU General Public License（GPL）3.0 等。</p>
<p><code>贡献指南</code>：OSS 项目的维护者创建贡献指南帮助贡献者理解合并请求（pull request）的流程、标准、范围等。</p>
<p><code>行为准则指南</code>：行为准则指南讨论各种指导方针、对贡献者的协同和行为期望，以及如何提出和解决 issue（问题）。</p>
<p><code>项目文化</code>：项目文化随着项目社区发展而变化。虽然维护者对其影响重大，但贡献者也有同样的责任来维护一个健康学习、分享和成长的文化。</p>
<p><code>社区</code>：随着项目发展，围绕项目的社区也发展起来。组织社区交流的常用平台有 GitHub Discussions 和 Discord。</p>
<p><code>分发</code>：开源项目应该接触到终端用户和消费者，所以应该有一个分发模型将代码转化为最终的产品，进行交付。</p>
<p><code>用户/客户</code>：用户和客户是开源团队通过源代码构建产品的消费者。</p>
<p>让我们查看下面的图片，图片是一个包含维护者和开发者的开源项目社区。</p>
<p>中心化的仓库里包含源代码。贡献者 <code>fork（分叉）</code>（你马上要学到这个术语）<code>upstream repository（上游仓库）</code>并贡献。一旦完成，项目维护者将其 <code>merges（合并）</code>到主分支（main branch）。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/07/opensource-model.png" alt="开源项目运作模型的高层视角" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>开源项目运作模型的高层视角</figcaption>
</figure>
<p>如果你不熟悉 fork、 branch、 merge 这些词，不用担心！我们马上就会讨论这些词，请继续阅读。</p>
<p>现在让我们讨论一下开源软件是如何交付给用户/客户的。</p>
<p>下面的图片显示了一种可能性的高层视角。开源项目应具有构建-打包-部署机制，该机制使用持续集成和持续部署（CI/CD）流程。</p>
<p>每当<code>main branch（主分支）</code>的代码发生改动，CI/CD 工作流就开始自动工作：构建源代码、打包并部署，供终端用户和目标客户能够使用。</p>
<figure class="kg-card kg-card-image kg-card-hascaption">
    <img src="https://www.freecodecamp.org/news/content/images/2022/07/deploy.png" alt="从源代码到用户的高层视角" class="kg-image" width="600" height="400" loading="lazy">
    <figcaption>从源代码到用户的高层视角</figcaption>
</figure>
<p>请注意：CI/CD 或者其他部署机制并不是开源软件开发的一部分，但了解它有助于理解 OSS 端到端的工作模型。</p>
<h2 id="">开源项目贡献是什么意思？</h2>
<p><code>开源</code>贡献就是使用一切办法来提升开源项目。一个常见的误解是你只能贡献源代码，完全不是这样。</p>
<p>贡献源代码是参与开源项目的一种形式，但是还有其他方式：</p>
<ul>
<li>项目的文档。提高文档质量，帮助贡献者和用户更容易参与和使用。</li>
<li>测试应用、发现问题，并在问题管理系统创建问题（issue）。</li>
<li>参与代码校对，帮助提高项目的编码标准。</li>
<li>编写单元测试、端到端测试，使得应用的质量更高。</li>
<li>创建如文章、视频之类的内容来提升项目的知名度。</li>
<li>帮助创建兴趣社区。</li>
</ul>
<p>以上都是重要的开源贡献方面。</p>
<h2 id="">参与开源贡献的好处</h2>
<p>贡献开源项目对于开发者来说好处多多，但是主要的好处有：</p>
<ul>
<li>抓住机会、提高技能水平</li>
<li>提高软件/应用的代码和文档水平</li>
<li>接触想法相似的朋友、建立人脉和社区</li>
<li>理解应用开发和维护的流程</li>
<li>从 Pull Request 反馈中学习</li>
<li>学习如何管理自己的开源项目</li>
</ul>
<h2 id="">开源迷思</h2>
<p>我们已经了解了开源模型和它的好处。接下来我们就要学习如何作为项目的<code>维护者</code> 和<code>参与者</code>来开启开源之旅。</p>
<p>在开始之前，让我们先消除一些迷思。</p>
<p>❌ <strong>迷思</strong>：我不了解代码，开源不适合我。</p>
<p>✅ <strong>事实</strong>：开源不仅仅是编写代码！你可以通过改善文档、测试、创建媒体、内容等各种方式参与进来。所以不要让不具备编码技能成为你参与开源项目的绊脚石。</p>
<p>❌ <strong>迷思</strong>：我知道怎么写代码，但是我对开源项目使用的技术不熟悉，我不能贡献。</p>
<p>✅ <strong>事实</strong>：相反，这是学习新东西绝佳的机会！开源生态系统提供足够的时间和耐心让你学习和参与贡献。</p>
<p>❌ <strong>迷思</strong>：开源项目的维护标准不如企业。</p>
<p>✅ <strong>事实</strong>：完全不对，实际上有非常多的企业软件来源于开源软件，所以认为开源项目的质量和标准不高不对。</p>
<p>❌ <strong>迷思</strong>：开源项目难以维护。</p>
<p>✅ <strong>事实</strong>：开源项目是由贡献者支持的。维护者主要的工作是设定范围、创建路线图、创建社区以及保持社区的贡献热情。</p>
<p>许多开源项目的维护者甚至不需要编写代码。只要维护者提供必要的支持，贡献者就可以将项目运作起来。</p>
<p>❌ <strong>迷思</strong>：开源软件总是免费的。</p>
<p>✅ <strong>事实</strong>：大多数开源项目是免费的，但不是所有的都是。这是由项目的许可证所决定的。有一些许可证要求必须让使用和分发免费。你需要格外注意项目许可证信息，了解 OSS 到底免费到什么程度。</p>
<p>❌ <strong>迷思</strong>：开源项目只适合初学者。</p>
<p>✅ <strong>事实</strong>：许多开发者认为开源项目是为初学者和学生设计的，实际上任何人都可以参与进来。对于主题专家来说，利用他们的知识和经验来增强开源项目是有意义的。</p>
<h2 id="">开始参与开源需要具备什么条件？</h2>
<p>开发者想要快速开始参与开源项目需要了解一些基本技能。这些是可选的，但是如果具备，你将更享受参与开源贡献。</p>
<h3 id="git">了解 Git 基础</h3>
<p>如果你已经了解 Git 的概念及其主要用途，那么你已经前进了一大步。Git 在开源世界中无处不在，你不能忽视它。</p>
<p>你至少要了解以下话题：</p>
<ul>
<li>什么是 Git，它是怎么运作的？</li>
<li>仓库是什么？</li>
<li>如何复制（clone）一个仓库？</li>
<li>如何 stage/un-stage（暂存/取消暂存）修改？</li>
<li>如何 commit（提交）你的修改？</li>
<li>如何编写更好的提交消息？</li>
<li>如何解决合并冲突？</li>
<li>如何将你的修改推送（push）到远程仓库？</li>
<li>如何从远程仓库拉取（pull）修改？</li>
</ul>
<p>如果你尚不了解 Git，我推荐你观看这个视频，了解 Git 的概念和上面提到的用例：<a href="https://www.youtube.com/watch?v=vWtu4mzUgQo">为初学者揭开 Git 的神秘面纱</a>。</p>
<h3 id="github">熟悉 GitHub</h3>
<p><a href="https://github.com/">GitHub</a> 上有超过 1.28 亿个公开仓库，其中很大一部分是开源项目。你想要参与贡献的开源项目可能在 GitHub 上，所以你应该学习如何使用 GitHub。</p>
<p>作为开源项目的贡献者，你应该知道：</p>
<ul>
<li>如何 fork（分叉）一个仓库？</li>
<li>如何找到仓库的 URL 并 clone（克隆）仓库？</li>
<li>如何创建一个 Pull Request？</li>
<li>如何校对一个 Pull Request？</li>
</ul>
<p>作为一个项目维护者，你应该知道：</p>
<ul>
<li>如何创建一个仓库？</li>
<li>如何为项目添加许可证信息？</li>
<li>如何创建贡献指南和行为准则指南？</li>
<li>如何创建提交 issue 和 pull requests 的标准？</li>
<li>如何合并 pull requests？</li>
</ul>
<p>你可以关注下面的 Twitter thread，它分步骤讲解了上面的所有信息：</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Do you have public GitHub repositories? <br><br>Here are 10 tips to help you with,<br><br>🤝 Gain more engagements<br>💻 Code contributions<br>⭐ Acknowledgment of work(like stars, maybe sponsors)<br> 🔥 Building followers on GitHub<br><br>A Mega Thread<br><br>🧵 👇</p>— Tapas Adhikary (@tapasadhikary) <a href="https://twitter.com/tapasadhikary/status/1440296182396309513?ref_src=twsrc%5Etfw">September 21, 2021</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</figure><!--kg-card-begin: markdown--><h3 id="fork">学习如何 fork（分叉）一个仓库</h3>
<p>Fork（分叉）是一个重要的概念。大部分<code>开源</code> 项目不允许贡献者直接在仓库创建分支。取而代之的工作流如下：</p>
<ul>
<li>fork（分叉）仓库。</li>
<li>clone（克隆）分叉后的仓库。</li>
<li>编写修改。</li>
<li>从 UPSTREAM（上游）提取修改。</li>
<li>创建从分叉仓库到基础仓库的 pull request。</li>
</ul>
<p>在我和众多贡献者的工作经验中，大部分人觉得理解 fork（分叉）的概念有点困难。</p>
<p>你可以通过这个视频学习 fork的概念：<a href="https://www.youtube.com/watch?v=h8suY-Osn8Q">如何分叉一个 GitHub 仓库</a>。同时你可以在这个 <a href="https://github.com/atapas/fork-me">GitHub 仓库</a>练习分叉，这是为初学者设计来提升信心的仓库。</p>
<h3 id="mergeconflicts">学习解决合并冲突（Merge Conflicts）</h3>
<p>如果询问任意一位开发者对解决待合并冲突的看法，你得到的答案会是不那么简单。遇到得越多，自然就更熟练。了解解决合并冲突的过程，并且思考背后的逻辑和如何具体操作十分有必要。</p>
<p>这里有一份<a href="https://chinese.freecodecamp.org/news/resolve-merge-conflicts-in-git-a-practical-guide/">解决合并冲突实用指南</a>，欢迎查阅。</p>
<h3 id="markdown">学习 Markdown 语法</h3>
<p>文档是任何开源项目的基础。<code>Readme.md</code>文件介绍了项目，如何设置、运行、部署等。</p>
<p><code>Contributing.md</code>文件介绍如何给项目做贡献。</p>
<p><code>CODE_OF_CONDUCT.md</code>文件介绍了对贡献者行为和参与的期望。当然，你可以基于自己的项目，编写任意 <code>.md</code>文件。</p>
<p><code>md</code>代表着 markdown（标记语言），是一种在 GitHub 上用于写文档的语法。了解基础的语法有助于你流畅地编写文档。</p>
<p>这里有一个开源项目提供了 <a href="https://github.com/atapas/markdown-cheatsheet">Markdown 语法</a>，可以复制和使用。欢迎查阅。</p>
<h3 id="">发展你的软技能</h3>
<p><code>开源</code>是许多开发者工作、学习和共同创建的天地。若想成为一位贡献者，仅仅具备技术技能不足以让你在此畅游。</p>
<p>让我们来看看开发者需要具备的一些软技能：</p>
<ul>
<li><strong>耐心</strong>：<code>耐心</code>是所有开发者必备的技能。当你在学习新知识，排查复杂问题的 bug，和其他人一起工作、谈判，给予和吸收意见的时候都需要耐心。事情常常不如预期的节奏推进，所以你需要保持耐心面对现状。</li>
<li><strong>好奇心</strong>：<code>好奇</code>使人进步。参与开源贡献将拥有无限可能。你需要对解决问题充满好奇心。好奇心不仅适用于解决技术难题，也适用于和他人一起工作。</li>
<li><strong>责任心</strong>：在开源生态中，你可能不会经常和人见面及交流。你必须对所有查询、任务、请求以及委任于你的事情<code>负责</code>。许多伟大的倡议往往因为人们缺乏责任心而不了了之。</li>
<li><strong>谦逊之心</strong>：<code>谦虚</code>是成功的关键。有学识但不谦逊的人往往不适合团队协作。</li>
</ul>
<h2 id="">如何开始参与开源项目贡献？</h2>
<p>让我们来看看如何开始参与开源项目贡献。下面的清单提供了一些链接和资源助你马上开启开源贡献之旅。</p>
<h3 id="githubexplore">GitHub Explore</h3>
<p>GitHub Explore 会向你展示你感兴趣的仓库，你可以给特定仓库设置提醒。</p>
<p>同时，你可以使用话题和趋势来寻找仓库。使用 GitHub Explore 来寻找最合适你的技能、需求以及对你最有启发的项目。你可以通过这个地址查看：<a href="https://github.com/explore/">https://github.com/explore/</a>。</p>
<h3 id="freecodecamp">如何参与 freeCodeCamp 的开源项目？</h3>
<p>freeCodeCamp 的仓库绝对是一个宝藏，它提供了许多资源和知识帮助你开启开源之旅。你可以通过这个地址查看：<a href="https://github.com/freeCodeCamp/how-to-contribute-to-open-source">https://github.com/freeCodeCamp/how-to-contribute-to-open-source</a>。</p>
<h3 id="contributorninja">Contributor Ninja</h3>
<p>这个网站供你选择一系列编程语言：JavaScript、 HTML、 Rust、 Go 等。你可以通过卡片选择对应的仓库，简单方便，是一个不错的开始。你可以通过这个地址查看： <a href="https://contributor.ninja/">https://contributor.ninja/</a>。</p>
<h3 id="firstcontributions">First Contributions</h3>
<p>这是一个巨大的清单，包含供你查找和过滤的开源项目。每个项目都有编写清晰的文档。你可以通过这个地址查看：<a href="https://firstcontributions.github.io/">https://firstcontributions.github.io/</a>。</p>
<h3 id="codetriage">CodeTriage</h3>
<p>CodeTriage 是一个包含巨量开放 issue 项目的清单。它将 issue 和文档归类后分发给你。这个网站十分有用，你可以通过这个地址查看：<a href="https://www.codetriage.com/">https://www.codetriage.com/</a>。</p>
<h3 id="upforgrabs">Up For Grabs</h3>
<p>这里包含了各种各样的开源项目，你可以基于自己兴趣筛选。你可以通过这个地址查看：<a href="https://up-for-grabs.net/#/">https://up-for-grabs.net/#/</a></p>
<h3 id="firsttimersonly">First Timers Only</h3>
<p>如果你之前从未参与开源贡献，并且跃跃欲试，可以考虑阅读这个网站。</p>
<p>在阅读的过程中，你或许会碰到我们讨论过的资源，这个网站能量满满。你可以通过这个地址查看：<a href="https://www.firsttimersonly.com/">https://www.firsttimersonly.com/</a>。</p>
<h3 id="opensourcefriday">Open Source Friday</h3>
<p>你本周五或者下周五有什么打算？花点时间给你使用或者喜欢的软件做点贡献？推荐你查看这个网站并且注册。你可以通过这个地址查看：<a href="https://opensourcefriday.com/">https://opensourcefriday.com/</a>。</p>
<p>希望这些资源对你来说有帮助。另外，你还可以查看这个 Twitter thread 以及相关的回应，你或许会有所收获。</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-embed-card"><blockquote class="twitter-tweet"><p lang="en" dir="ltr">Looking forward to contributing to OPENSOURCE? Here are 8 RESOURCES to get you started immediately.<br><br>A 🧵  👇</p>— Tapas Adhikary (@tapasadhikary) <a href="https://twitter.com/tapasadhikary/status/1435590663035310086?ref_src=twsrc%5Etfw">September 8, 2021</a></blockquote>
<script async="" src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</figure><!--kg-card-begin: markdown--><h2 id="">开源项目维护者</h2>
<p>到目前为止我们讨论的都是开源项目的贡献者，如果止步于此这篇文章就不完整，所以我们也讲讲开源项目维护者相关的内容。</p>
<p>作为项目维护者，你应该遵循一些标准使得其他人能够理解并且参与贡献你的项目仓库。</p>
<ul>
<li>提供项目明确的名字和介绍。你也可以添加项目相关的话题。</li>
<li>添加清晰的<code>Readme.md</code>文件介绍项目的目标、如何使用、设置等。如果说源码是项目的心脏，那 README 文件就是项目的脸面。</li>
<li>建立社区档案。开源仓库维护者可以通过它来检查工作、了解哪里需要帮助。</li>
<li>建立编码行为准则。</li>
<li>创建贡献指南。</li>
<li>决定 issue 的模板。</li>
<li>创建 Pull Request（PR）模板。</li>
<li>激活 GitHub 赞助。</li>
</ul>
<p><a href="https://www.freecodecamp.org/news/increase-engagement-on-your-public-github-repositories/">你可以通过阅读这篇文章</a> 了解更多细节。</p>
<h2 id="">在结束之前......</h2>
<p>就这么多！到这里，我们就到了本文的结尾。希望这篇文章对你有所启发，并且给了你足够的动力开始为开源做贡献。</p>
<p>在我们结束之前，我想再提几个开源项目和仓库：</p>
<ul>
<li><a href="https://github.com/EddieHubCommunity">EddieHub</a></li>
<li><a href="https://github.com/reactplay">ReactPlay</a></li>
<li><a href="https://github.com/topics/hacktoberfest">Hacktoberfest</a></li>
<li><a href="https://github.com/firstcontributions/first-contributions">First Contributions</a></li>
<li><a href="https://github.com/deleteman/the-hive">The Hive</a></li>
</ul>
<p>这个列表可以继续增加，但让我停在这里。如果你喜欢阅读本文，或有任何疑问想要联系我，可以在以下地方找到我：</p>
<ul>
<li><a href="https://twitter.com/tapasadhikary">Twitter</a></li>
<li><a href="https://www.linkedin.com/in/tapasadhikary/">LinkedIn</a></li>
<li><a href="https://github.com/atapas">GitHub</a></li>
<li><a href="https://youtube.com/tapasadhikary">YouTube</a></li>
</ul>
<!--kg-card-end: markdown--><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 谷歌文档之季（Google Season of Docs）项目申请指南 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：How to Crack the Google Season of Docs Application Process for 2020 [https://www.freecodecamp.org/news/cracking-google-season-of-docs-2020/]，作者： Edidiong Asikpo [https://www.freecodecamp.org/news/author/edidiong/] 近年，有调查 [https://cdn2.hubspot.net/hubfs/4008838/Resources/The-2019-Tidelift-managed-open-source-survey-results.pdf] 表明良好的文档对开发者如何选择和使用开源非常重要。 2019年首届Google Season of Docs（GSoD，即谷歌文档之季）项目，共收到了近450份技术写作者的申请，最终有50多名技术写作者被录取。 作为入选参加GSoD项目的技术写作者之一，我想分享一些关于如何为GSoD项目做准备并制作有竞争力申请书的想法。 目录 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/cracking-google-season-of-docs/</link>
                <guid isPermaLink="false">62d68ab48d13aa0845c629b6</guid>
                
                    <category>
                        <![CDATA[ 文档 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                    <category>
                        <![CDATA[ 谷歌 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Narcissus91 ]]>
                </dc:creator>
                <pubDate>Tue, 19 Jul 2022 07:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/07/nick-morrison-FHnnjk1Yj7Y-unsplash-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/cracking-google-season-of-docs-2020/">How to Crack the Google Season of Docs Application Process for 2020</a>，作者：<a href="https://www.freecodecamp.org/news/author/edidiong/">Edidiong Asikpo</a></p><!--kg-card-begin: markdown--><p>近年，有<a href="https://cdn2.hubspot.net/hubfs/4008838/Resources/The-2019-Tidelift-managed-open-source-survey-results.pdf">调查</a>表明良好的文档对开发者如何选择和使用开源非常重要。</p>
<p>2019年首届Google Season of Docs（GSoD，即谷歌文档之季）项目，共收到了近450份技术写作者的申请，最终有50多名技术写作者被录取。</p>
<p>作为入选参加GSoD项目的技术写作者之一，我想分享一些关于如何为GSoD项目做准备并制作有竞争力申请书的想法。</p>
<h1 id="">目录</h1>
<ul>
<li><a href="#what-is-google-season-of-docs">Google Season of Docs是什么？</a></li>
<li><a href="#who-is-eligible-to-participate-in-the-program">哪些人有资格参与该项目？</a></li>
<li><a href="#benefits-of-participating">参与该项目的好处</a></li>
<li><a href="#5-tips-to-ace-your-gSoD-application">让你的GSoD申请脱颖而出的5个建议</a></li>
<li><a href="#my-gSoD-experience">我的GSoD项目经验</a></li>
<li><a href="#useful-resources">有用的参考资源</a></li>
</ul>
<h1 id="what-is-google-season-of-docs">Google Season of Docs是什么？</h1>
<p>文档之季是一个由谷歌组织的年度项目。其目标是连接开源组织与技术文档写作者，促进开源领域中的文档协作和提升。</p>
<p>这项活动非常重要，因为通过开源项目的文档，用户不仅可以理解该项目，还可以为项目做出贡献。</p>
<p>在项目期间，入选的技术写作者将花费3-5个月的时间来构建一套新的文档、改进现有文档的结构、开发一个急需的教程或改进一个开源组织的贡献流程和指南。</p>
<h1 id="who-is-eligible-to-participate-in-the-program">哪些人有资格参与该项目？</h1>
<p>根据<a href="https://developers.google.com/season-of-docs/docs">谷歌的规则</a>，在注册时你必须已年满18岁。你还必须有技术写作者的实践经验，并且有资格在你的居住国工作。</p>
<p>如果你符合这些资格，就可以申请参加GSoD项目。</p>
<h1 id="benefits-of-participating">参与该项目的好处</h1>
<p>参加文档之季项目，有很多好处，比如：</p>
<h3 id="">你可以获得一笔津贴</h3>
<p>在完成GSoD项目后，你会获得由谷歌支付的一笔津贴。值得注意的是，这项津贴是可选的，因此你必须在申请阶段表明你希望获得津贴。</p>
<p>津贴金额是基于申请人所在地区的情况来计算的。有关津贴的完整详细信息，请参考<a href="https://developers.google.com/season-of-docs/docs/tech-writer-stipends">此处</a>。</p>
<h3 id="">你可以提高自己的技能</h3>
<p>参与GSoD项目的另一个明显好处是，可以提高你的技术写作技能。</p>
<h3 id="">你可以扩大自己的人际圈子</h3>
<p>除了提高自己在技术写作方面的技能，你还有机会与在开源领域做着了不起事情的人一起工作。</p>
<p>就我而言，我有机会与<a href="https://www.videolan.org/index.html">VideoLAN组织</a>合作，这意味着我必须与该组织的社长和项目的主要贡献者密切合作。</p>
<h3 id="">你可以获得推荐和介绍</h3>
<p>在申请任何工作时，一封好的推荐信往往有助于提高你申请的成功率。</p>
<p>与文档之季项目的导师紧密合作，将有机会获得丰富的推荐和介绍资源。</p>
<h3 id="">你可以获得未来进入谷歌的机会</h3>
<p>如果你准备申请谷歌的技术写作职位，那么与其他申请人相比，你简历中的文档之季项目经验会让你有更多优势。</p>
<h3 id="">你可以成为一个开源贡献者</h3>
<p>除了上述所有好处之外，参加文档之季项目意味着您可以为开源项目做出贡献。这有助于人们打破开源贡献仅适用于软件开发人员的刻板印象。</p>
<h1 id="5-tips-to-ace-your-gSoD-application">让你的GSoD申请脱颖而出的5个建议</h1>
<p>以下5个建议，帮助你为GSoD项目做准备和制作有竞争力申请书。</p>
<h3 id="">在你的博客上创建和发表文章</h3>
<p>在GSoD项目中被录取为技术写作者的最重要标准之一是能够证明你以前有写作经验。</p>
<p>谷歌和你想从事项目的拟派导师需要确信你是从事该项目工作的合适人选。这意味着他们希望能看到你创作的大量优质文档和文章。</p>
<p>值得一提的是，现在去创建一个博客或在现有博客上发布更多内容还不算太晚。</p>
<p>如果您已经有一个博客，那么在你提交申请之前、期间及之后发表更多优质文章是个不错的方法。如果你没有任何博客，那么使用<a href="https://hashnode.com/devblog">Hashnode's Devblog</a>或你喜欢的平台创建一个博客并发布优质文章仍为时不晚。</p>
<h3 id="">选择合适的开源项目</h3>
<p>事实上，我再怎么强调选择合适的开源项目的重要性也不为过。这是因为它对你是否能进入该项目有重大影响。</p>
<p>以下是我对选择合适项目的想法：</p>
<ul>
<li>认真查看所有<a href="https://developers.google.com/season-of-docs/docs/participants">已录取的项目</a>，并尝试选出至少5个你感兴趣的项目。</li>
<li>选出至少5个项目后，再次浏览，将项目数量缩减至2到3个。</li>
<li>虽然可能在申请阶段只专注于一个项目是合理的，但我鼓励你至少申请两个项目，这样你至少被一个项目录取的机会就会更大。</li>
<li>对于你选择的每个项目，加入其所在组织的沟通渠道，并让项目的维护者知道你对该项目的兴趣。这样，你将能够与导师建立关系。另外，请注意，导师选择人时并不仅仅因为申请人拥有必要的技能，还因为他们认为申请人能够与他们合作。因此，当你向导师发送信息时，要明确说明你的需求。最重要的是不要因为他们没有立即回复而感到沮丧，因为大多数导师都是有其他全职工作的志愿者。</li>
<li>不要被动等待。对项目进行大量研究，去发现并理解你需要了解的所有内容，如果你有任何疑问，请向该项目的拟派导师寻求帮助，或询问该社区的其他成员。</li>
<li>最重要的是，在研究过程中，写下任何有用的信息。一些信息在将来若你被某项目录取后，可能会用上。而一些信息可以用于优化你的提案。</li>
</ul>
<h3 id="">撰写一份提案</h3>
<p>很多人不知道这一点，但写一份提案是至关重要的。它让你清楚地了解项目的目标、你完成项目所需的时间线、你需要了解的内容等等。</p>
<p>除此之外，写提案还可以向你的导师展示你对该项目的目标、为什么你认为你是这个角色的合适人选、你的经验、项目时间线等等。</p>
<p>写完提案后，将其发送给项目的导师进行审核。他们的审核将帮助你从导师的角度了解项目的要求。我在Resources部分添加了我的GSoD提案的链接。</p>
<h3 id="">至少为开源组织做出一项贡献</h3>
<p>文档之季项目并不像Google Summer of Code（GSoC，即谷歌编程之夏）项目那样要求你对感兴趣的开源项目至少做出一项贡献。但是做出贡献绝对可以提高你被录取的机会，所以试试吧。</p>
<h3 id="">在申请截止日期后仍在社区中保持活跃</h3>
<p>提交申请后，尽量在该开源组织中保持活跃。这可以最大程度地向导师们表明，你对这个项目和开源社区充满热情。</p>
<h1 id="my-gSoD-experience">我的GSoD项目经验</h1>
<p>在去年的GSoD项目中，我有机会与<a href="https://www.videolan.org/index.html">VideoLAN组织</a>合作开展VLC用户文档现代化（重写）项目。</p>
<p>在我的提案被VideoLAN组织接受后，我的导师和我就商定了我在GSoD项目中要实现的目标。</p>
<p>这些就是我的目标：</p>
<ol>
<li>重构文档。</li>
<li>更新文档以适应VLC的现代版本。</li>
<li>使用Sphinx和ReadtheDocs将用户文档迁移到Gitlab。</li>
<li>删除过时的图像和信息。</li>
<li>重写用户文档，使其易于理解。</li>
<li>使用国际化版Sphinx进行翻译。</li>
</ol>
<p>我对VideoLAN组织和<a href="https://www.videolan.org/vlc">VLC</a>有了更多的了解，我发现了很多我从未了解的VLC功能，并且我学会了如何使用Sphinx文档平台并重构文本。</p>
<p>我的技术写作技巧也得到了极大的提高。总的来说，参加GSoD项目是2019年我经历的最好的事情之一。</p>
<h1 id="useful-resources">有用的参考资源</h1>
<p>以下是一份有用的资源列表，帮助你了解更多关于文档之季项目和技术写作的信息。</p>
<ul>
<li><a href="https://docs.google.com/document/d/1sjHn5OGVZB0EbWHFL9_9Ty63oCF2itlYww2bf9Qhwtc/edit?usp=sharing">My Accepted Season of Docs proposal</a></li>
<li><a href="https://medium.com/@EdidiongAsikpo/gsod-project-report-modernize-rewrite-the-vlc-user-documentation-aede033e1124">Google Season of Docs Project Report</a></li>
<li><a href="https://edidiongasikpo.com/open-source-contributions-a-catalyst-for-growth-b823fc5752b1">Open Source Contributions: A catalyst for Growth</a></li>
<li><a href="https://developers.google.com/season-of-docs/docs/tech-writer-guide">Technical Writer's Guide</a></li>
<li><a href="https://seasonofdocs.slack.com/">Season of Docs Slack channel</a></li>
<li><a href="https://github.com/BolajiAyodeji/awesome-technical-writing">Awesome Technical Writing</a></li>
</ul>
<p>喜欢这篇文章？Twitter上关注我<a href="https://twitter.com/Didicodes">@Didicodes</a>。</p>
<!--kg-card-end: markdown--> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何为开源项目做贡献 ]]>
                </title>
                <description>
                    <![CDATA[ 原文：How to Contribute to Open-Source Projects – A Beginner's Guide [https://www.freecodecamp.org/news/how-to-contribute-to-open-source-projects/] ，作者：Ankita Tripathi [https://www.freecodecamp.org/news/author/ankita-tripathi/] 如果你一直在考虑为一个开源项目做贡献，你可能正在权衡这样做的利弊。 你可能会听到这样的话：开源项目不会帮助你成长，或者它们不能改变你的职业轨迹，还有，你的贡献肯定不会为你的简历增添光彩。 如果你曾经听到过这样的话，这些人可能对为开源项目做贡献的好处了解不多，而实际上好处是很多的。 在这篇文章中，我将分享贡献机会和以及如何开始贡献。 许多人认为，开发人员总是在孤岛上工作，与外界没有任何联系。 但现在的开发者不一定是这样的，他们：  * 在公开场合创造东西  * 在社交媒体上很活跃，而且  * 积极与世界各地的人联系 事实上，开源项 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-contribute-to-open-source-projects/</link>
                <guid isPermaLink="false">626bf158395ec5063718afc4</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ luojiyin ]]>
                </dc:creator>
                <pubDate>Fri, 29 Apr 2022 10:08:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2022/04/open-source-contributions.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>原文：<a href="https://www.freecodecamp.org/news/how-to-contribute-to-open-source-projects/">How to Contribute to Open-Source Projects – A Beginner's Guide</a>，作者：<a href="https://www.freecodecamp.org/news/author/ankita-tripathi/">Ankita Tripathi</a></p><!--kg-card-begin: markdown--><p>如果你一直在考虑为一个开源项目做贡献，你可能正在权衡这样做的利弊。</p>
<p>你可能会听到这样的话：开源项目不会帮助你成长，或者它们不能改变你的职业轨迹，还有，你的贡献肯定不会为你的简历增添光彩。</p>
<p>如果你曾经听到过这样的话，这些人可能对为开源项目做贡献的好处了解不多，而实际上好处是很多的。</p>
<p>在这篇文章中，我将分享贡献机会和以及如何开始贡献。</p>
<p>许多人认为，开发人员总是在孤岛上工作，与外界没有任何联系。</p>
<p>但现在的开发者不一定是这样的，他们：</p>
<ul>
<li>在公开场合创造东西</li>
<li>在社交媒体上很活跃，而且</li>
<li>积极与世界各地的人联系</li>
</ul>
<p>事实上，开源项目比其他任何东西都更能将开发者聚集在一起进行合作。</p>
<h1 id="">什么是开源？</h1>
<p>你可能经常听到关于开源项目和在公开场合构建项目的说法，但这些术语是什么意思？</p>
<p>最简单的是，它意味着你所创造的东西是免费的，开放给任何人使用。它还意味着，随着合作的进行，你的项目会不断变得更好。</p>
<h2 id="">开放的博客平台</h2>
<p>使用开源，你可以让其他人自由地学习或参与构建你现有的项目。</p>
<p>现在有很多平台可以让开发者有机会公开写作。有 Hashnode、Dev.to、谷歌的 Dev Library，还有更多。我们甚至可以称这些开发者为 “Developer-as-a-blogger”（DaaB），因为他们的博客贡献。:)</p>
<p>我已经在 Dev Library 工作了一年多。我现在已经看到了来自 80 多个国家的近 2000 多份稿件，相当不错！</p>
<h2 id="">如何开始编写技术教程</h2>
<p>但是，作为一个开发者，你怎么知道你的博客创作之旅从哪里开始呢？</p>
<p>让我们关注以下提示：</p>
<ul>
<li><strong>不要被冒名顶替综合症打败</strong>。无论你在技术职业中处于什么位置，冒名顶替综合症可能会不时地出现。即使有 7-8 年的经验，我有时也会流汗，认为自己是否足够好。</li>
</ul>
<p>所以，不要担心。开始写作的最好方法是在你建立一个项目时尝试写作。解释给自己听，就像你在和朋友说话一样，帮助他们理解它。这样一来，任何读到你的教程的人都会知道如何建立这个项目。</p>
<ul>
<li><strong>同一主题存在许多文章</strong>。这就是典型的情况。在世界上 70 亿人中，很可能有其他人正在写你写过的主题。</li>
</ul>
<p>但你描述、定义和展示功能的方式将是不同的，专注于此。</p>
<ul>
<li><strong>我甚至如何开始？</strong>。空白页的焦虑是存在的。为了克服这个问题，开始创建具有高级主题的部分。如果你愿意的话，可以制定一个大纲。然后开始在其中添加内容。确保添加更多的步骤、要点和视觉效果。</li>
</ul>
<p>为了更好地组织和编辑你的内容，你可以参考谷歌的技术写作课程和风格指南，如 <a href="https://chinese.freecodecamp.org/news/developer-news-style-guide/">freeCodeCamp 的</a> 和 <a href="https://styleguide.mailchimp.com/">MailChimp 的</a>。</p>
<ul>
<li><strong>如何进行首次贡献</strong>。第一次贡献是特别的，但也是令人不知所措的。为了确定合适的 GitHub repo，寻找你专业领域的开源项目。与那些在你的技术栈中做出贡献的人建立联系。了解流程并开始贡献。</li>
</ul>
<p>现在我们已经了解了这些要点，你已经准备好启动你的开源之旅了。</p>
<h2 id="">我的开源之旅</h2>
<p>为了帮助你开始为你的专业领域的项目做贡献，我将在一分钟内分享一些提示和指南。但首先，再介绍一下我的情况。</p>
<p>直到 2019 年，我都不知道开源这个词。是的。我在社交媒体上并不活跃，除了 LinkedIn，那里没有人谈论开源。</p>
<p>总而言之，我的视野相当狭窄。</p>
<p>但由于我是一名科技作家，我是一个名为 Write the Docs 的全球科技作家社区的活跃成员。我在浏览他们的 Slack 频道时，发现了 Google Season of Docs。</p>
<p>我浏览了参与组织的名单，发现了一个有趣的组织。然后，我通过他们的 Slack 频道联系了他们，并提出担任志愿者。</p>
<p>在 <code>The Good Docs Project</code> 做了一年的志愿者，我得到了很多机会。我们为各种使用情况创建了开源模板，例如：</p>
<ul>
<li>用于全球开放空间组织的词汇表模板</li>
<li>一个入职模板</li>
<li>一个 API 模板</li>
<li>文档模板</li>
</ul>
<p>一年后，在建立人脉并积累经验后，我申请成为参与者。 Metanorma 组织看到了我的志愿服务经验，并选择了我参加 GSoD'21。正是这样，我成为了不断发展的开源社区的一员</p>
<h1 id="">如何开始为开源项目做贡献</h1>
<p>当你开始做贡献时，不要只关注结果——要关注过程。</p>
<p>以下是一些帮助你开始贡献的要点：</p>
<h3 id="gitgithub">学习 Git 和 GitHub</h3>
<p>在寻找可供贡献的仓库之前，先对 Git 命令和 <a href="https://lab.github.com/">GitHub 平台</a> 进行实践了解。:） 获得对以下内容的基本了解:</p>
<ul>
<li>如何复刻（fork） repo</li>
<li>如何进行提交（commit）</li>
<li>如何合并（merge）提交的内容</li>
<li>如何提出拉取请求（pull request，简称 PR）</li>
</ul>
<p>在许多其他的 Git/GitHub 概念中，这些是最重要的一些。</p>
<p>如果你想了解更多，这里有一些有用的资源：</p>
<ul>
<li><a href="https://www.freecodecamp.org/news/git-and-github-for-beginners/">Git 和 GitHub 教程 - 面向初学者的版本控制</a></li>
<li><a href="https://www.freecodecamp.org/news/git-and-github-crash-course/">Git 与 GitHub 快速指南</a></li>
</ul>
<h3 id="">浏览一些项目</h3>
<p>现在你已经很熟悉这些工具和软件了，你如何决定从哪个项目开始？</p>
<p>嗯，首先，从你感兴趣的主题开始。浏览 <a href="https://github.com/topics">github topics</a>，搜索你想做的事情。例如，如果你想浏览有关 Python 的项目，那么你可以用 <a href="https://github.com/topics/python">这个</a>。</p>
<p>除非是非常小众的东西，否则你应该找到大量有关你所选主题的项目来开始你的贡献。</p>
<p>一旦你找到了一个项目，就去找那个 repo 的初学者友好问题。为此，输入 github.com/[所有者]/[仓库]/contribute。选择一个问题来开始贡献。你可以在 “适合初学者的第一个问题（good first issue for beginners）”标签下找到这些问题。</p>
<p>如果你在 GitHub 上一直很活跃，你的探索页面（explore page）会显示一些基于你过去的贡献、收藏或复刻的精心推荐。</p>
<h3 id="">参与开源计划</h3>
<p>参加主要组织举办的开源项目。如果不是作为贡献者，那就作为志愿者来学习、构思、贡献，然后参加。</p>
<p>例如：</p>
<ul>
<li><a href="https://summerofcode.withgoogle.com/">Google Summer of Code</a></li>
<li><a href="https://developers.google.com/season-of-docs">Google Season of Docs</a></li>
<li><a href="https://www.outreachy.org/">Outreachy</a></li>
</ul>
<h3 id="">大量探索</h3>
<p>开源贡献的最大盲点是没有进一步观察或没有探索。</p>
<p>开源项目并不局限于代码贡献。其他各种贡献的方式有：</p>
<h4 id="">更新文献</h4>
<p>对于任何项目来说，拥有一个详尽的 README 是很重要的。因此，潜心改进你最喜欢的项目的 README，使之更容易为他人所用。</p>
<p>那么，你是如何做到这一点的呢？</p>
<p>嗯，对于 Metanorma 项目：</p>
<ul>
<li>在下载本地版本后，我执行了文档中提到的操作。这有助于我找出遗漏的步骤、错误或任何变动。</li>
<li>接下来，我对现有的文档进行了定性和定量的分析。这帮助我找出缺失的 URL，以及难以理解的部分。</li>
<li>找到这些部分后，我建立了一个适当的信息结构。然后，文档的信息结构将帮助你专注于内容。</li>
</ul>
<h4 id="">帮助进行设计</h4>
<p>组织确实需要他们的项目设计师。因此，如果您是设计师，请为开源组织创建海报、视觉效果或轮播。</p>
<h4 id="">成为社区建设者</h4>
<p>开源是关于社区的一切。人们走到一起，一起编码，一起贡献，并一起改进项目。</p>
<p>成为这些开源项目的社区人员。把贡献者聚集在一起。与他们一起履行各种职能：</p>
<ul>
<li>分配任务</li>
<li>解决问题</li>
<li>组织聚会</li>
<li>建立大使计划</li>
<li>举办研讨会</li>
<li>创建时事通讯</li>
</ul>
<h4 id="">本地化的帮助</h4>
<p>帮忙把项目翻译成你熟悉的语言。假设你是一个以西班牙语为母语的人。在你的社区寻找一些项目。把主要的项目从英语翻译成西班牙语，这样项目就能被全世界更多的人使用。</p>
<p>要了解一些其他的贡献方式，请参考 freeCodeCamp 的<a href="https://github.com/freeCodeCamp/how-to-contribute-to-open-source">这个仓库</a>。</p>
<h1 id="">需要贡献的开源项目</h1>
<p>这是一个各种开源项目的列表，这些项目有一个活跃的社区，等待人们的贡献。他们有从初级到专家级的问题。</p>
<ul>
<li><a href="https://supertokens.com/">Supertokens</a>。Supertokens 是一个开源的 auth0 替代品，它允许你在 30 分钟内设置认证。该项目提供企业内部部署，给予你对用户数据库的所有权。要做出贡献，请关注他们的 <a href="https://github.com/supertokens/supertokens-core">GitHub repo</a>。</li>
<li><a href="https://www.nimbleedge.ai/">Nimble Edge</a>。Nimble edge 是一个去中心化的平台，它正在把世界从传统的云计算带向边缘计算。从云计算到边缘计算的转变将允许设备之间进行智能通信，共享工作负载，并相应地使用云。要做出贡献，请关注他们的 <a href="https://github.com/NimbleEdge">GitHub repo</a>，留意问题，并开始贡献。</li>
<li><a href="https://devlibrary.withgoogle.com/?utm_source=freecodecamp-blog&amp;utm_medium=submit&amp;utm_campaign=freecodecamp-blog">Dev library</a>。Dev Library 是谷歌新的开源平台，显示由外部开发者使用任何谷歌技术（Android、Angular、Flutter、Firebase、谷歌云、机器学习）创建的内容。该平台被划分为产品领域，显示可以贡献的优质项目。要做出贡献，请关注任何开源项目并挖掘贡献。</li>
<li><a href="hhttps://www.codetriage.com/">Codetriage</a>：通过从这个金矿中找到任何开源 repo 开始贡献。</li>
<li><a href="https://thegooddocsproject.dev/">The Good Docs 项目</a>。The Good Docs 是一个创建模板的开源社区，以消除空白页的焦虑感。该社区希望为任何事物创建模板。如果你觉得你也有一个模板的想法，请加入他们的 slack 频道。要做出贡献，请关注他们的 <a href="https://github.com/thegooddocsproject/templates">GitHub repo</a>，加入他们的 slack 频道，并开始贡献。</li>
</ul>
<p>我们在 Dev Library 上也看到了一些开发者使用谷歌技术的令人难以置信的工作。有些人建立了<a href="https://devlibrary.withgoogle.com/products/angular/repos/trungk18-angular-spotify">使用 Angular 的 Spotify</a> 的克隆应用，有些人建立了<a href="https://devlibrary.withgoogle.com/products/ml/repos/dimitreOliveira-melanoma-classification">一个项目</a>，使用皮肤病变图像检测黑色素瘤（一种皮肤癌），而有人创建了一个 <a href="https://devlibrary.withgoogle.com/products/android">Whatsapp 图像采集器副本</a>。</p>
<p>当然 freeCodeCamp 本身也是一个开源项目。freeCodeCamp 可以成为你学习和贡献于开源的首选平台。</p>
<h2 id="">结束语</h2>
<p>那么你怎么看--是时候开始为开源做贡献了？</p>
<p>看看 Angular 领域的开源专家、GitHub 明星人物 Santhosh Yadav 是如何分享的：</p>
<blockquote>
<p>“对开源的贡献以我从未想象过的方式帮助了我。我开始时是把它作为回馈社区的一种方式，并得到了社区的认可。然后我成为了 Angular GDE，也是印度的第一个 GitHub 明星。</p>
<p>OSS 帮助我深入学习技术，并帮助我找到了一份好工作。我甚至做了 1 年半的顾问，我的开源工作帮助我轻松地获得了客户。</p>
<p>我能够给我的家人一个好的生活。在开始开源之前，我有 10 年的时间是靠定期领工资生活的，而它改变了我的生活”。</p>
</blockquote>
<p>这些故事告诉我们，开源贡献可以改变你的职业轨迹。不管你的工作情况如何——开始为开源项目做贡献吧。</p>
<!--kg-card-end: markdown--><p></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何为开源项目做贡献——入门指南 ]]>
                </title>
                <description>
                    <![CDATA[ 如果你是一名开发者，你可能会遇到“开源”这个词。如果你曾想知道它的全部内容以及如何为其做贡献，那么你来对地方了。 在 2020 年的 Hacktoberfest 期间，我抛开了所有我对如何以及贡献什么的恐惧，并为开源世界做出了我的第一个贡献。 由于对我来说是第一次，我从一些对初学者友好的项目开始，然后慢慢提高。 而现在，如果你是新手，你可能想知道开源到底是什么？ 如何开始？ 你应该期待什么？ 在本文中，我们将涵盖所有这些内容甚至更多。 什么是开源？ 开源是指在许可证的许可下向公众提供可以查看、使用、修改和分发的源代码。 无论是个人、公司、小型企业、非营利组织还是政府机构，开源代码通常符合企业或个人的最大利益。 为开源项目做出贡献是一种学习、教授、分享和积累经验的有益方式。 你应该为开源项目做出贡献的原因有很多，例如：  * 改进你每天使用的软件  * 如果需要，可以找一位导师  * 学习新技能  * 分享你的技能  * 更深入地了解你正在使用的软件  * 建立声誉并帮助你发展你的事业  * 另外，它本身很有趣，会让你感觉很棒 你为开源项目做贡献的原因是什么？ 回复这篇文章 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-contribute-to-open-source-projects-beginners-guide/</link>
                <guid isPermaLink="false">60be131c176e4005380a7c24</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Li Jia Qi ]]>
                </dc:creator>
                <pubDate>Mon, 07 Jun 2021 12:30:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/06/uide-to-writting-a-good-readme-file--1--1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>如果你是一名开发者，你可能会遇到“开源”这个词。如果你曾想知道它的全部内容以及如何为其做贡献，那么你来对地方了。</p>
<p>在 2020 年的 Hacktoberfest 期间，我抛开了所有我对如何以及贡献什么的恐惧，并为开源世界做出了我的第一个贡献。 由于对我来说是第一次，我从一些对初学者友好的项目开始，然后慢慢提高。</p>
<p>而现在，如果你是新手，你可能想知道开源到底是什么？ 如何开始？ 你应该期待什么？ 在本文中，我们将涵盖所有这些内容甚至更多。</p>
<h2 id="">什么是开源？</h2>
<p>开源是指在许可证的许可下向公众提供可以查看、使用、修改和分发的源代码。</p>
<p>无论是个人、公司、小型企业、非营利组织还是政府机构，开源代码通常符合企业或个人的最大利益。</p>
<p>为开源项目做出贡献是一种学习、教授、分享和积累经验的有益方式。 你应该为开源项目做出贡献的原因有很多，例如：</p>
<ul>
<li>改进你每天使用的软件</li>
<li>如果需要，可以找一位导师</li>
<li>学习新技能</li>
<li>分享你的技能</li>
<li>更深入地了解你正在使用的软件</li>
<li>建立声誉并帮助你发展你的事业</li>
<li>另外，它本身很有趣，会让你感觉很棒</li>
</ul>
<p><em>你为开源项目做贡献的原因是什么？ 回复这篇文章或通过 <a href="https://twitter.com/larymak1">larymak 1</a> 告诉我。</em></p>
<h2 id="">如何为开源做贡献</h2>
<p>为开源项目做贡献并不一定意味着你必须为代码库做贡献。 你可以通过多种不同方式为开源做贡献，例如：</p>
<ul>
<li>你可以在项目文档中添加描述以详细说明某一点</li>
<li>你可以针对特定的项目提供指南</li>
<li>你可以添加示例来展示代码的工作原理</li>
<li>你可以为项目编写教程</li>
<li>你可以为项目添加翻译</li>
<li>你可以回答有关项目的问题（比如在 Stack Overflow 或 Reddit 上）</li>
<li>你可以对其他贡献者提供建议</li>
<li>你可以修复错误并正确地安排项目的工作文件夹</li>
</ul>
<p>所有包括但不限于这些方式都可以为开源项目做贡献。</p>
<h2 id="">为开源项目做贡献之前需要了解的内容</h2>
<p>每个开源社区都是不同的。 每个社区都有不同的人，有着不同的角色和奖励。 他们每个人都有自己的职责和预期贡献。</p>
<h3 id="">一个典型的开源项目会有这些人：</h3>
<ul>
<li><strong>作者</strong> - 创建项目的人。 他们有权为其他成员分配角色以帮助维护项目。</li>
<li><strong>所有者</strong> - 所有者拥有项目的管理所有权（<em>可以与作者为同一人</em>）</li>
<li><strong>维护者</strong> - 这些人负责推动项目的愿景和目标。他们通常是对项目方向负责并致力于改进项目的人</li>
<li><strong>贡献者</strong> - 贡献者以一种或多种方式加入到项目中。他们遵循相同的代码审查流程，遵守相同的代码风格要求等等。</li>
<li><strong>社区成员/用户</strong> - 这些有价值的社区成员可以提供相关功能、错误报告等反馈。</li>
</ul>
<h3 id="">所有开源项目都应该具备的重要元素</h3>
<p>每个开源项目都应该有以下指南和信息：</p>
<ul>
<li><a href="https://choosealicense.com/">License</a> - 如果一个项目没有开源许可证，那它就不是开源的。许可证有助于保护开源贡献者和用户。没有这种保护，企业和精明的开发者通常不会接触该项目。如果你想知道如何获得开源许可证，请单击 <a href="https://choosealicense.com/">此处</a> 以了解更多信息。</li>
<li>README - 这是一本说明如何开始项目的手册。一个好的 README 应该包含潜在的贡献者想要了解的有关项目的所有不同内容。你可以阅读更多关于如何编写一个好的 README 文件 <a href="https://chinese.freecodecamp.org/news/how-to-write-a-good-readme-file/">点击这里</a>。</li>
<li>How to Contribute - 这些指南帮助人们做出贡献并展示需要什么类型的贡献者（<em>这个文件不是必须的</em>）</li>
<li><a href="https://opensource.guide/code-of-conduct/">CODE_OF_CONDUCT</a> - 这是一份文件，用于确定你对贡献者和参与者的行为方式的期望。采纳并遵守行为准则有助于为你的社区创造一个积极的环境。</li>
</ul>
<p>要创建一个开源项目，你需要创建一个环境，可以让人们分享他们的挑战并进行深入讨论。这个可以通过以下工具实现：</p>
<ul>
<li>Issue Tracker（问题追踪器） - 人们在这里讨论与项目相关的问题</li>
<li>Pull Requests（拉取请求） - 这是人们审查正在进行更改的地方</li>
<li>Synchronous Chat Channel（同步聊天频道） - 这是专门供人们分享他们的想法并进行对话的地方（如 Slack、Discord 等）</li>
</ul>
<h2 id="">如何找到你想要贡献的开源项目？</h2>
<p>既然知道了开源项目如何运作，那么是时候找到一个可贡献的开源项目了。</p>
<p>贡献在各个层面都有效——不要过分思考你将如何去做，而是想想你已经使用过的一些项目，如何对它们进行改进提高。</p>
<blockquote>
<p>研究表明，大约 30% 的贡献是文档、错别字修复甚至是翻译。</p>
</blockquote>
<p>如果你是第一次贡献（每个人在某个时候都是这样），这儿有一些网址可以让你开始拥抱开源世界：</p>
<ul>
<li><a href="https://github.com/larymak/Python-project-Scripts">Python Project Scripts</a></li>
<li><a href="https://opensourcefriday.com/">Open Source Friday</a></li>
<li><a href="https://habitica.com/static/front">Hebatica</a></li>
<li><a href="https://pinaxproject.com/">Pinax</a></li>
<li><a href="https://www.firsttimersonly.com/">First Timers Only</a></li>
<li><a href="https://www.codetriage.com/">Code Triage</a></li>
<li><a href="https://24pullrequests.com/">24 Pull Requests</a></li>
<li><a href="https://contributor.ninja/">Contributor Ninja</a></li>
<li><a href="https://github.com/firstcontributions/first-contributions">First Contribution</a></li>
</ul>
<p><em>在开源软件的世界中，问题会很快得到报告和修复。 所以，如果你想解决一个问题，一定要尽快解决它。</em></p>
<h3 id="">如何选择开源项目？</h3>
<p>找到你想要贡献的项目后，让它符合以下标准，以确保它是一个不错的选择：</p>
<p>首先，你需要检查：</p>
<ul>
<li>它有许可文件吗？</li>
<li>最新提交是什么时候完成的？ 是最近的吗？ （也就是说，项目是否在积极维护/工作？）</li>
<li>它有多少贡献？</li>
<li>人们多久提交一次？</li>
</ul>
<p>如果你看到最近有很多活动，那很好，这意味着它有一个活跃的社区来维护它。</p>
<p>其次，你应该继续检查以下内容：</p>
<ul>
<li>有多少未解决的问题？</li>
<li>维护者需要多长时间才能做出回应？ 回应及时吗？</li>
<li>是否对某个问题进行了积极的讨论？</li>
<li>问题是否会定期关闭？</li>
<li>有多少开放的拉取请求？</li>
<li>最新的拉取请求最近多久合并？ 是最近吗？</li>
<li>是否首先审查拉取请求？ （他们应该是）</li>
<li>维护者是否感谢人们的贡献？</li>
</ul>
<p>如果上述所有条件都满足你的需求，那就去做吧，开始为这些项目做贡献。</p>
<h2 id="">在进行开源项目之前需要考虑什么？</h2>
<p>所以你迫不及待地要开始致力于自己的第一个开源项目了。让我们来了解一些可能会帮助你选择项目的方法。</p>
<h3 id="">项目使用什么编程语言？</h3>
<p>任何应用程序背后最基本的技术都是它使用的编程语言。GitHub 上一些最流行的语言包括但不限于JavaScript、Python、Java、Ruby 和 PHP。</p>
<p>你的能力和兴趣也许会契合众多项目，所以选择一个你感觉舒服的项目即可。</p>
<h3 id="">项目类型</h3>
<p>在你确定了你想要使用的语言后，你需要选择你喜欢的项目类型。只需概览一圈并选择一个你感兴趣的主题的项目即可。</p>
<p>项目一旦确定，你一定想要有一番作为。你将通过提交拉取请求来做到这一点。现在让我们来详细说说这个。</p>
<h2 id="pullrequest">如何提交拉取请求（Pull Request）？</h2>
<p>如果你处于这个阶段，已经找到了一个项目，你就可以继续了。让我们来谈谈如何实际提交拉取请求。</p>
<p>首先，什么是拉取请求？ 这是你在 GitHub 中请求更新的方式，也是你将代码合并到另一个分支之前让某人检查你的代码的方式。</p>
<h3 id="pr">提交 PR 的步骤</h3>
<ul>
<li>Fork 存储库<br>
在右上角，你将看到“fork”一词。 单击它，将在你的帐户中创建同一个项目的副本。 URL 将更改为：</li>
</ul>
<pre><code>https://github.com/&lt;YourUserName&gt;/projectname
</code></pre>
<ul>
<li>将其 Clone 到你的本地<br>
在你的电脑上，如果安装了 Git，请打开 CMD 并运行此命令。 如果你还没有 Git，请参阅 <a href="https://git-scm.com/">此处</a>，它将向你展示如何开始使用 Git。 然后继续执行以下步骤：</li>
</ul>
<pre><code>git clone https://github.com/&lt;YourUserName&gt;/&lt;projectname&gt;
</code></pre>
<p>这会在你的本地电脑上创建项目的副本。现在你已经克隆了存储库，我们需要做两件事：</p>
<p>首先，你需要创建一个分支。切换到你电脑上的存储库目录（如果你还没切换的话）：你可以通过以下方式执行此操作：</p>
<pre><code>cd project folder name
</code></pre>
<p>使用 git checkout 命令创建一个分支：</p>
<pre><code>git checkout -b your-new-branch-name
</code></pre>
<p>比如：</p>
<pre><code>git checkout -b lary-mak-blog
</code></pre>
<p>接下来，你需要进行必要的更改并提交这些更改。 在进行更改和添加新文件之后，将这些更改添加到你创建的分支中了。</p>
<p>要查看你做的所有更改，请运行 <code>git status</code> 命令：</p>
<pre><code>git status
</code></pre>
<p>这会显示你最近做的所有更改。现在添加它们，使用 <code>git add *</code> 命令：</p>
<pre><code>git add *
</code></pre>
<p>现在使用 <code>git commit</code> 命令提交这些更改：</p>
<pre><code>git commit -m "&lt;initial commit&gt; "
</code></pre>
<ul>
<li>将更改推送到 GitHub<br>
你可以使用 `git push 命令轻松完成此操作：</li>
</ul>
<pre><code>git push origin &lt;add-your-branch-name&gt;
</code></pre>
<p>用你之前创建的分支的名称替换 <code>&lt;add-your-branch-name&gt;</code>。</p>
<ul>
<li>提交你的更改以供审核<br>
如果你转到 GitHub 上的存储库并刷新页面，你将看到“Compare and pull request”按钮。 单击该按钮。</li>
</ul>
<p>很快，维护者会将你的所有更改合并到该项目的主分支中（除非他们需要你的更改）。 合并更改后，你将收到一封通知电子邮件。</p>
<p>对其他存储库的拉取请求类似于“Push”。 但是，它允许做一些事情：</p>
<p>首先，它允许你为其他存储库做贡献，而无需管理权限来对存储库进行更改。</p>
<p>其次，它允许其他人查看你的更改并提出更正、添加、编辑等建议。</p>
<p>第三，它让管理员可以控制添加到他们项目存储库中的内容。</p>
<h3 id="">在完成第一个拉取请求后，下一步做什么？</h3>
<p>恭喜你！ 刚刚完成了作为开源贡献者经常遇到的标准工作流程！fork -&gt; clone -&gt; edit -&gt; pull request</p>
<p>现在，你可以继续寻找其他项目并做出更多的贡献。 并且一定要留意<a href="https://www.digitalocean.com/">Digital Ocean</a>举办的开源月，这样你就可以参加<a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a>并有机会赢取一些很有意思的东西。</p>
<h2 id="">为开源做贡献的好处</h2>
<p>既然你已经了解了如何为开源做出贡献，那么做贡献有好处有什么呢？</p>
<ul>
<li>为开源项目做贡献的人比仅仅使用该技术的人更深入地了解该技术</li>
<li>你可以根据在现实世界中有效和无效的经验，专注于添加和利用对企业有益的功能</li>
<li>它可以建立你的士气和声誉。 为开源项目做贡献的人得到其他社区成员的见解和经验</li>
<li>对开源的贡献可以清晰地了解一个项目的未来</li>
<li>如果你使用 GitHub ，你在该平台上做的很大一部分事情都是公开的。利用这一点来发挥你的优势，在贡献和与其他贡献者交流时，始终做到最好。因为你永远不知道谁在看着你，你的下一个雇主可能就在那里😊</li>
</ul>
<h3 id="">为什么你应该为开源做贡献？</h3>
<p>作为一名开发者，以下我认为你应该为开源做出贡献的原因：</p>
<ul>
<li>它可以帮助你编写更清晰的代码</li>
<li>它可以帮助社区和同行了解你。这种认可可以为你的职业生涯带来很多机会</li>
<li>它可以帮助你了解有关项目的更多信息</li>
<li>它提高了你的编码技能</li>
</ul>
<p>更多有关信息，请阅读 <a href="https://github.com/freeCodeCamp/how-to-contribute-to-open-source">freeCodeCamp 的指南</a>。</p>
<p>感谢你读到这里！</p>
<p>与我联系 <a href="https://twitter.com/larymak1">Twitter</a> | <a href="https://www.instagram.com/nextgencoders/">Insta</a> | <a href="https://www.youtube.com/channel/UCrT1ARRZfLOuf6nc_97eXEg">YouTube</a> | <a href="https://www.linkedin.com/in/hillary-nyakundi-3a64b11ab/">LinkedIn</a> | <a href="https://github.com/larymak">GitHub</a></p>
<p>请分享你的宝贵意见，感谢你的诚实反馈！</p>
<p>享受编程吧❤</p>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/how-to-contribute-to-open-source-projects-beginners-guide/">How to Contribute to Open Source Projects – A Beginner's Guide</a>，作者：<a href="https://www.freecodecamp.org/news/author/larymak/">Hillary Nyakundi</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 送你一份美味又营养十足的开源社区贡献指南！ ]]>
                </title>
                <description>
                    <![CDATA[ 在这篇文章里，我想和你分享我对开源的理解。 让我们先从简单的开始。 你知道什么是产品吗？你日常轻松购买的某种东西就是产品，比如餐馆里的卷饼。但是要制作这款产品就需要遵循一定的步骤：在餐馆里，懂食谱的厨师熟练地使用相同的配方和相同的成分，确保每份卷饼味道可口。 你不仅可以通过贡献开源来进入某个技术领域，实现职业转型或促进现有职业的发展，还能以此来帮助社区！ 在大多数餐馆，如果你走进去询问厨师：“我非常喜欢您做的卷饼，可以把制作配方给我吗？”，他们通常都会拒绝——因为配方并非开源。开源就是除了产品本身，你还能够获得制作产品的食谱和配方，然后你在家里也可以制作出同样的卷饼。 图片来自 Pixabay，作者 samuelfernandezrivera 现在假设你开始制作卷饼了，但你不想吃那么多肉，于是用鳄梨取而代之。在这种情况下，你拿到了食谱并用鳄梨代替了肉，接着完全按照剩余的步骤进行下去，然后看看做出的卷饼是什么样子的。 结果可能是你做的卷饼比餐馆里的还要好吃。如果餐馆是以开源项目的形式运作的，你就可以对厨师说：“嘿，你的卷饼很好吃，但我加了一些鳄梨之后味道更棒了！可以把这个配方 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-definitive-guide-to-contributing-to-open-source/</link>
                <guid isPermaLink="false">5de8fae1ca1efa04e196a8eb</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Hunter Wang ]]>
                </dc:creator>
                <pubDate>Sun, 02 May 2021 11:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/12/12.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>在这篇文章里，我想和你分享我对开源的理解。</p><p>让我们先从简单的开始。</p><p>你知道什么是产品吗？你日常轻松购买的某种东西就是产品，比如餐馆里的卷饼。但是要制作这款产品就需要遵循一定的步骤：在餐馆里，懂食谱的厨师熟练地使用相同的配方和相同的成分，确保每份卷饼味道可口。</p><p>你不仅可以通过贡献开源来进入某个技术领域，实现职业转型或促进现有职业的发展，还能以此来帮助社区！</p><p>在大多数餐馆，如果你走进去询问厨师：“我非常喜欢您做的卷饼，可以把制作配方给我吗？”，他们通常都会拒绝——因为配方并非开源。开源就是除了产品本身，你还能够获得制作产品的食谱和配方，然后你在家里也可以制作出同样的卷饼。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-2.png" class="kg-image" alt="image-2" width="600" height="400" loading="lazy"><figcaption>图片来自 Pixabay，作者 samuelfernandezrivera</figcaption></figure><p>现在假设你开始制作卷饼了，但你不想吃那么多肉，于是用鳄梨取而代之。在这种情况下，你拿到了食谱并用鳄梨代替了肉，接着完全按照剩余的步骤进行下去，然后看看做出的卷饼是什么样子的。</p><p>结果可能是你做的卷饼比餐馆里的还要好吃。如果餐馆是以开源项目的形式运作的，你就可以对厨师说：“嘿，你的卷饼很好吃，但我加了一些鳄梨之后味道更棒了！可以把这个配方加入到你的食谱中哦。”</p><p>此时厨师就扮演了产品维护者的角色，他们可能会接受你的建议，也可能认为添加鳄梨是个坏主意，不符合餐馆的理念。无论如何，通过分享对项目的修改，你成为了一名开源贡献者。</p><p>恭喜你！</p><h2 id="-">可以为开源项目做哪些贡献？</h2><p><a href="https://www.mozilla.org/en-US/firefox/new/">Firefox </a>浏览器就是开源项目的一个范例。它是由数千行源代码和如何将此源代码转换为可用产品（如 Web 浏览器）的指令组成。这些代码是公开的，每个人都能获取、阅读、评审或构建它。每个想要修改 Firefox 的人都可以更改源代码并构建自定义版本。不仅如此，每个人还可以将自定义的修改反馈给项目维护者。</p><p>然而，代码并不是开源项目的全部，还有用户界面和图形设计。没错，即使像 Vim 这样的终端程序也有自己的图形界面。</p><p>你无需编写代码即可为开源做贡献！</p><p>除了界面，还有用户交互、可用性和用户体验（UX）等等——这些在近几十年来越来越重要。如果你拥有设计背景，精于艺术或心理学，你就可以在 UI/UX 领域施展能力。产品的另一个组成部分是媒体，包括声音、图形或视频，这些元素虽然不是所有项目必备的，但也挺常见。</p><p>文档是项目中经常被忽视的一部分。改进文档也是向开源社区做贡献的一种方式。如果你热衷于文字创作、文章编辑或翻译，那你也能成为开源社区的贡献者。</p><p>此外，开源项目经常缺少市场运营人员，如果你能解决运营问题，整个社区都会随之受益，因为这会吸引更多潜在的贡献者。</p><p>最后还有法务工作者，这类人群在普通开源项目中相当罕见，多见于大型项目。有很多律师为开源项目处理法务问题，而他们中的大多数都是志愿者。</p><p>如果你可以写散文、画画、制作音乐，是一个好的营销人员，或者是律师，那么，开源社区需要你！</p><p>如果你觉得自己无法胜任设计、修改代码、编写许可证等工作，不必担心，你依然可以做出贡献，比如报告一个错误或提出修改建议。</p><p>最好的状态是这样的：每个成员都贡献出一点点时间、一点点努力、一点点经验，整个社区协作产出一款出色的产品，而且通常是一款免费产品！</p><p>觉得自己不是一位创造者？去发现 bug、或者向程序猿提需求吧！</p><h2 id="--1">为什么值得我花时间？</h2><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/forum/uploads/default/original/1X/37dfbe4ee9d5be14a5f85874dbd8d107a12aa4a4.jpeg" class="kg-image" alt="2" width="600" height="400" loading="lazy"></figure><p>为什么向开源社区做贡献是值得的？为什么你要在提建议、写代码或翻译文章上花费时间，而不是出去走走玩玩？有很多理由， 所有理由的前提是：对开源社区做出的贡献是公开可见的，每个人都能看见其他任何人所做的事情，这种感觉非常棒！</p><h3 id="--2">提升竞争力</h3><p>当你在编写代码，设计界面，或者绘制图形时，你就是在学习，这对那些正在寻求职业转型的人来说是很好的锻炼机会。在开源世界，没有人会在意你是一个资深开发人员还是一个园艺工人，真正重要的是你所做贡献的质量。当你在开源项目中证明了自己，你将获得宝贵的经验，不用再觉得自己是刚从训练营毕业的新手，你已经是社区的正式成员，所有人都看得到你的贡献。</p><p>当你在某项技术工作中遇到困难，想要转型做别的，那么参与开源贡献是一个很好的途径。比如，你是一名 COBOL 开发者，想要成为一名 UX 设计师 ，那么从现在开始尝试改进 Firefox 的交互体验，为开源做出贡献吧。如果你的建议被社区接受，那么你就可以在简历中新增一项工作经历：Firefox 交互设计师。像这样，你既能学到有用的知识，又能丰富自己的经历，一箭双雕。</p><h3 id="--3">提升知名度</h3><p>加入开源社区之后，你会很快地认识新的小伙伴，接触共事的团队成员，你可以向他们学习并与他们交流想法。</p><p>另一个加入开源社区的好处是你会自动地获得更多的曝光机会。举个例子，有人通过访问你所在的开源项目找到你的 YouTube 频道，或者通过 LinkedIn 为你提供工作机会。</p><p>目前 IT 行业招聘人员们寻找人才的一个重要渠道就是 GitHub，把你的代码发布到 GitHub 就相当于编写了一份所有人都能验证的简历，而无需联系你之前的雇主或者客户。如果你的个人 GitHub 资料包含了跳转到领英或个人主页的链接，那么你找到梦想中工作的机会将大幅增加。</p><p>记住，你甚至都不必拥有特定领域的从业经历，对于招聘者来说，你对开源的贡献就是你具备经验的最好凭证！</p><h3 id="--4">寻找工作机会或新的客户</h3><p>如果你真的很优秀，你将会获得为开源项目工作的有偿 offer。这主要是指那些有稳定财务来源的开源项目，可能是获得公司或者非营利组织的支持。</p><h3 id="--5">招募贡献者</h3><p>你还可以招募到一些有潜力的新人。如果你做了一些酷炫且有用的项目，请毫不犹豫地把它开源，这样就有机会让其他人帮你改进。</p><h3 id="--6">帮助他人</h3><p>另一个参加开源的好处是，你将有机会为他人做一些有意义的事情并且获得尊敬。你收到的所有“感谢”将让你觉得你所花费的心血都是值得的，而且你也拥有了参与一些很棒项目的经历。</p><h3 id="--7">有机会接触到很棒的统计数据</h3><p>很多人很喜欢统计数据，对他们而言，<a href="https://github.com/">GitHub</a> 就是一块宝藏。我们在 GitHub 上的每一次提交，都会在一个日历上产生绿色方块标记，每天的提交数越多，对应方块的颜色越明亮。当我们连续几天都有提交时，类似于每天打卡，GitHub 会保留分数以供将来参考。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-3.png" class="kg-image" alt="image-3" width="600" height="400" loading="lazy"><figcaption><a href="https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/undefined">GitHub</a> 贡献数据（不是我的）</figcaption></figure><p>如何找到你的第一个项目？</p><p>你可以通过多种方式找到想要贡献的项目。首先，像火狐和安卓这样的重量级项目拥有庞大的用户基数，需要大量的修改和优化。一旦你向这种项目提交了代码，你的修改将会被数百万人看到。你可以访问 GitHub 看看有哪些流行的仓库，比如，目前 GitHub上拥有最多 star 的项目是 <a href="https://github.com/freeCodeCamp/freeCodeCamp">freeCodeCamp</a>。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-4.png" class="kg-image" alt="image-4" width="600" height="400" loading="lazy"><figcaption>GitHub上拥有<a href="https://github.com/search?q=stars:%3E1&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;s=stars&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;type=Repositories">最多 star 的仓库</a></figcaption></figure><p>如果你是个新手，我不会推荐上面第一种方式。一个庞大项目最大的优势往往也是它最不好的地方。每个人都想做出贡献，但是维护人员的数量是极为有限的。如果你真的想产生影响，不如试试一些小规模的、处于上升阶段的项目。<a href="https://github.com/trending">GitHub Trending</a> 就是一个好的方法。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-5.png" class="kg-image" alt="image-5" width="600" height="400" loading="lazy"><figcaption>GitHub上的<a href="https://github.com/trending">热门项目</a></figcaption></figure><p>另一种方式是选择 <em>awesome</em> 项目作为第一次贡献者，这是比较节省精力的方法。<em>awesome</em> 项目是一个链接列表的大集合。比如，<a href="https://github.com/alebcay/awesome-shell">awesome-shell</a> 列出了一些酷炫的命令行工具，而 awesome-JavaScript 列出了每天涌出的优秀 JS 框架， 当然还有 <a href="https://github.com/hackerkid/Mind-Expanding-Books">Mind Expanding Books</a> 和 <a href="https://github.com/sindresorhus/awesome">awesome_lists</a> 等等。</p><p>为什么说这是个好办法？因为给这些项目做贡献的门槛比较低，而贡献的成就感更容易刺激产生多巴胺，多巴胺又会刺激做下个贡献。一旦皮球开始滚动，就很难让它停下来了。</p><p>我推荐的最后一个方法是参加大型开源活动，比如每年十月举办的 <a href="https://hacktoberfest.digitalocean.com/">Hacktoberfest</a>，参与者需要提交5次 Pull Request（即 5 次贡献），每个完成任务的参与者都会从赞助方那里领取到精美的礼物（T恤或贴纸）。为了让降低参与门槛，活动网站上会列出一些入门的示例项目以供选择。</p><p>另一个类似的活动是 <a href="https://summerofcode.withgoogle.com/">Google Summer of Code</a>。你可以参考往期的项目列表，也许这回给你带来灵感！哦对了，这里还有一个 <a href="https://github.com/MunGell/awesome-for-beginners">Awesome First PR Opportunities</a> 列表。</p><p>如果你希望持续不断地参与开源，你需要先找到适合的项目，这样的话对你自身的提高大有裨益，也能保证高质量的工作。</p><h2 id="--8">如何做出有价值的贡献？</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-6.png" class="kg-image" alt="image-6" width="600" height="400" loading="lazy"><figcaption>图片来自 <a href="https://unsplash.com/?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">Unsplash</a>，作者 <a href="https://unsplash.com/@rawpixel?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">rawpixel</a></figcaption></figure><p>我们现在了解了为什么贡献开源以及在哪里参与开源，现在我们讨论一下如何让我们的贡献变得有价值。毫无意义的贡献是不会被接受的，所以最好有所准备。</p><h3 id="--9">我们需要尊重工作须知</h3><p>首先，我们需要尊重他人制定的工作须知。在许多项目中，你可以找到像 <code>CONTRIBUTORS.md</code> 这样的文档，它说明了做贡献的首选方式。如果项目中没有 <code>CONTRIBUTORS.md</code>，你也可以阅读 <code>README.md</code> 或项目 wiki 页面，熟悉并理解这些规则，然后按照规则参与开源。</p><p>如果你没有遵循开发指南列出的规则，很可能在 review 之前就被拒绝。那些规则就是为了节省维护者的时间的，如果你不遵守，那么维护者会认为你对待其它工作的时候也经常粗心大意。</p><h3 id="--10">思考你的贡献对他人有着怎样的价值</h3><p>当我们知道了怎样参与开源，下一步让我们思考一下我们的贡献究竟对他人有着怎样的价值。想象有一家生产定制西服的公司，你在门店里买了一套西服然后穿着它去了酒吧。你突发灵感，把开瓶器挂在了西服上，这样每次去酒吧喝酒的时候，你都能随时使用衣服上的开瓶器打开啤酒了。</p><p>于是你把这个“伟大的想法”告诉了裁缝，让他在制作西服时顺便挂上一个开瓶器。然而，无论你的想法多么具有独创性，裁缝都是不可能同意的，就像开源项目的维护者不会接受一个与其观念不同的代码提交。这并不是说你的工作很差或者毫无价值，而是你提交的功能特性仅仅适用于极小部分用户，不能代表大部分用户的需求。既然每个功能都需要维护成本并确保其稳定性，项目维护者自然就需要确保每个功能点都能为大多数用户带来价值。</p><h3 id="--11">详尽沟通</h3><p>如果你提交的不是功能点的修改，而是一篇报告，那么你一定详细描述，尽可能地把问题的背景解释清楚。这点建议当你在报告 bug 时格外有用。你描述得越详细，别人在修复问题时就会更容易直击要害。请记住，列出可能的用例和预期的行为，忽略与报告不相关的任何细节。比如，你想让某个元素变成绿色，因为这能够与竞品相匹配，那么你长篇累牍地描述竞争的背景则会显得有点多余。</p><h3 id="--12">运行、测试、校验，提交前仔细检查</h3><p>在提交代码之前要详细地检查和测试，确保你的更改针对的是当前的开发版本，而不是某个历史版本。记住你只需运行一次测试，而项目维护者需要每天运行各种各样的测试，为了节省他们时间，你需要确保一切都运行正常。这也体现出你严谨的态度，而不是马马虎虎地提交一份半成品。</p><h3 id="--13">直面批评</h3><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-7.png" class="kg-image" alt="image-7" width="600" height="400" loading="lazy"><figcaption>图片来自 <a href="https://unsplash.com/?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">Unsplash</a>，作者 <a href="https://unsplash.com/@sickhews?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">Wes Hicks</a></figcaption></figure><p><br>请记住这点：你每次在网上发布一些东西的时候，都是把自己暴露在攻击之下。不管你发布的是一句评论，一张照片，一篇文章，还是一份代码，你都可能受到批评。所以，请对批评的声音持开放的态度，这样会有助于你的成长。</p><p>有些批评甚至是毫无根据的。因此，在你分享自己的工作之前，需要想想如何处理各种各样的批评，这样你才会为那些终将到来的批评做好准备，而不是每次都默默地慢慢消化。</p><h3 id="--14">我们的最佳想法并非对所有人都是最佳的</h3><p>首先，你能想到的最佳想法可能并不是对所有人都是如此，请千万记住这点。当有人告诉你开瓶器跟西服根本就不搭的时候，不要觉得受到了冒犯。如果这是项目维护者的观点，你一定要尊重，这将会是你下次参与开源项目的宝贵经验。或者你也可以参与那些接受你的“最佳想法”的项目。</p><h3 id="--15">我们最好的作品可能并不符合标准</h3><p>尽管话很难听，但你的最佳作品可能并不符合标准。我亲身经历过这种事情，我参与了一个项目，本想在第一次提交时就做到完美（但只是我认为的“完美”），毕竟我知道需要注意哪些事情。但是结果我收到了一份指导我如何写出好代码的教程——我发送了代码，过段时间收到了答复，几乎每一行代码都被高亮标记出来，有趣的是，所有的评论都是有理有据并且准确的。我眼中的完美在专家眼中却并非如此。我根据批注做出了修改然后重新提交了代码，这次我只收到了五个批注。</p><p>即使你已经做得很好了，仍会有人推动你去做得更好，这就是代码 reviewer 的目的。他们并不是在批评或责怪你，而是在帮助你，请记住这点！</p><h3 id="--16">即使我们做到了能做的一切，还是可能被拒绝</h3><p>有时你仅仅得到一个简短直接的回复， “no”，这让你感觉无能为力。你仍然坚信把开瓶器挂在西服上是个好主意，这时该怎么办？是时候创造你自己的项目了。在开源世界里，在已存在项目的基础上创建新项目的行为叫作“新建分支”。</p><p>相应的，新项目被称为原项目的“分支”。比如，Ubuntu 就是 Debian 的一个分支。如果维护者拒绝把你的代码合入他的项目，你可以考虑新建一个分支，自己成为项目维护者。当然只在极端情况下才应这样做，因为这不仅给两方维护者带来负担，也会给社区造成困惑。如果你不幸恰好收到了 “no”，你应该好好想想得到这个答复背后的原因，这将会成为你未来宝贵的经验。</p><h3 id="--17">网络暴力无处不在</h3><p>现在来谈谈网络暴力。</p><p>互联网给人一种匿名感，涌现了一种亚文化：“键盘侠”（或者“网络喷子”）以故意诋毁他人为乐。这种亚文化被称为“网络暴力”。我自己还没遇到这种情况，但我推荐你阅读 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/undefined">Ragen Chastain</a> 写的文章 “<a href="https://betterhumans.coach.me/the-complete-guide-to-understanding-and-dealing-with-online-trolls-4a606ae25c2c">The Complete Guide to Understanding and Dealing With Online Trolls</a>”，它将帮助你为这种令人不适的遭遇做好准备。</p><h2 id="--18">通过开源赚钱</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-8.png" class="kg-image" alt="image-8" width="600" height="400" loading="lazy"><figcaption>图片来自 <a href="https://unsplash.com/?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">Unsplash</a>，作者 <a href="https://unsplash.com/@rawpixel?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">rawpixel</a></figcaption></figure><p>如果你已经读到了这里，你可能会想是不是有可能在为开源项目工作的同时赚点外快。</p><p>当然可以！</p><p>虽然软件本身通常是免费使用的，但是会有其它方式让你利用开源项目赚钱。赚钱是一门艺术，因为一些办法只适用于你自己，在别人那里却不管用，它是门“伪科学”。</p><h3 id="--19">普遍适用的方法</h3><p>我最喜欢的方法就是“捐款”按钮，你可以在我的一个叫 <a href="https://doomhammer.github.io/songcorder/#tips-welcome">Songcorder</a> 的项目中看到这是怎样的。捐款人可以通过 PayPal 支付大于 15 美元的捐款，或者点击 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/undefined">Buy me a Coffee</a> 支付小于 15 美元的捐款。</p><p>（你也可以在这里 <a href="https://www.freecodecamp.org/donate">https://www.freecodecamp.org/donate</a> 为 freeCodeCamp 捐款，你的每 1 美元捐款将为全世界人们提供 50 小时免费的编程教育机会。）</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-9.png" class="kg-image" alt="image-9" width="600" height="400" loading="lazy"></figure><p>除了通用的按钮之外，还有一些开源项目专用的方法，比如 Gittip/<a href="https://en.liberapay.com/explore/repositories">Liberapay</a>（后者经常换名字）。有趣的是，Liberapay 所支持的最受欢迎的仓库是 <a href="https://github.com/sindresorhus/awesome">awesome</a>。</p><p>这与 <a href="https://flattr.com/">Flattr</a> 很类似。你可以选择每月要捐的金额，当你认可某些作品时，作品的作者将获得捐款的一部分。也就是说，如果你决定每月向开源项目捐 5 美元，在某月你认可 4 个项目的工作（通过 star 或者点击 Flattr 按钮），那么每个项目的作者将会得到 1.25 美元。就是这么简单。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/12/image-10.png" class="kg-image" alt="image-10" width="600" height="400" loading="lazy"><figcaption><a href="https://en.liberapay.com/explore/repositories">与 Liberapay 关联的仓库</a></figcaption></figure><p>除了支持整个项目，你也可以直接（近乎直接）向开发者捐款。<a href="https://tip4commit.com/">Tip4Commit</a> 就是以这种方式运作的，支持者向某项目的账户存入一定数量的比特币，然后每个开发者就可以从这个账户分到一笔钱了。</p><p>另一个可能的方法是 <a href="https://www.patreon.com/">Patreon</a>，支持者将固定金额的现金分配给他们选择的任何开发者，而不是平均分配预算。如果你想了解这种方式是否适合你，可以阅读 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/undefined">Erika Sauter</a> 写的文章《<a href="https://medium.com/art-for-lunch/why-patreon-is-dope-af-for-creators-687e2e1bc3c1">Why Patreon is Dope AF for Creators</a>》。享有盛誉的 <a href="https://www.patreon.com/sindresorhus">Sindre Sorhus</a> 就是最主要的开源维护者之一，而像 <a href="https://www.patreon.com/homebrew">Homebrew</a> 和 <a href="https://www.patreon.com/linuxbrew">Linuxbrew</a> 这种颇具规模的项目同样也使用 Patreon 筹集资金。</p><p>如果你把开源视为业余爱好，那么你可以尝试上面提到的所有方法。幸运的话，它们甚至可以让你将兴趣变成全职工作。然而，实际上，如果你想使开源项目成为你的日常工作，一个常见的方式是提供咨询服务，比如向企业客户出售专业功能或者帮助企业客户部署和定制产品。很多企业缺乏利用开源项目解决其内部需求的能力，而谁又能比原始项目的维护者更能胜任这项工作呢？</p><p>如果你在帮助别人的同时能够获得报酬，那就这样去做吧！</p><h3 id="--20">众筹</h3><p>为开源项目筹集资金的一种流行方法是众筹，有很多提供这类服务的平台。比如， <a href="https://www.kickstarter.com/">Kickstarter</a> 为开源语音助手 <a href="https://www.kickstarter.com/projects/aiforeveryone/mycroft-mark-ii-the-open-voice-assistant">Mycroft Mark II</a> 筹集了启动资金。另一个平台 <a href="https://www.indiegogo.com/">Indiegogo</a>为电子邮件客户 <a href="https://www.indiegogo.com/projects/geary-a-beautiful-modern-open-source-email-client">Geary</a> 主持了一场众筹活动，但很可惜，这个项目未能达成它的预期目标。<a href="https://mediagoblin.org/">MediaGoblin</a> 甚至在没有任何第三方的情况下启动了自己的 <a href="https://mediagoblin.org/pages/campaign.html">众筹系列活动</a>。</p><p>如果担心你无法找到很多众筹者，那么你可以尝试融资。在我的印象中，有至少两个提供融资的基金会，其中一个是著名的 <a href="https://travis-ci.com/">Travis CI</a> 公司旗下的 <a href="https://foundation.travis-ci.org/grants">Travis Foundation</a>，另一个是开发了 <a href="https://www.mozilla.org/en-US/firefox/new/">Firefox</a> 浏览器的<a href="https://www.mozilla.org/en-US/grants/">Mozilla</a> 基金会。</p><p>目前我介绍的大多数工具和方法都是适用于开源项目维护者的，而开源贡献者也可以通过做“悬赏任务”来赚钱。项目方在某个平台发布需求，贡献者完成这些需求即可获得奖励。目前 <a href="https://www.bountysource.com/">Bountysource</a> 似乎是最受欢迎的众包平台。</p><p>如果你更喜欢将加密货币作为付款方式，<a href="http://gitcoin.co/">Gitcoin</a> 是一个与众包具有相似原理的平台。想做更多的了解，可以看 <a href="https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/undefined">Vivek Singh</a> 写的文章《<a href="https://medium.com/gitcoin/everything-you-need-to-know-about-gitcoin-fe2e3e292a21">Everything You Need to Know About Gitcoin</a>》。</p><p>带薪实习是另一个有效的方法，有两个备受欢迎的选择：</p><ul><li><a href="https://summerofcode.withgoogle.com/">Google Summer of Code</a>——面向学生</li><li><a href="https://www.outreachy.org/">Outreachy</a>——面向技术领域的少数派</li></ul><p>或者，如果你真的对开源充满激情，为什么不加入一家专注于开发开源软件的公司呢？有很多这样的选择，就像咨询一样，你将获得报酬，并同时能够为社区做点事情。</p><p>这是一个双赢的选择！</p><h3 id="--21">更多方法</h3><p>如果你还想寻找更多通过开源赚钱的灵感，可以看看 GitHub 上的 <a href="https://github.com/nayafia/lemonade-stand">lemonade-stand</a> 项目，或者在那里留下你的看法。开源，一切皆有可能！</p><h2 id="--22">遇到志同道合的人</h2><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/forum/uploads/default/original/1X/04a841151ca3a5def89bd7ed52d1b5d150ce1ae4.jpeg" class="kg-image" alt="12" width="600" height="400" loading="lazy"><figcaption>图片来自 <a href="https://unsplash.com/?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">Unsplash</a>，作者 <a href="https://unsplash.com/@bamagal?utm_source=medium&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;utm_medium=referral">“My Life Through A Lens”</a></figcaption></figure><p>到目前为止我尚未提到的是：无论产品、项目还是技术，都是整个开源活动的一小部分，开源最重要的组成部分是丰富多彩的社区！当你开始为开源做出贡献，你会很快结识很多新朋友，你可以向他们学习，可以为他们提供帮助，也可以与他们交换思想。</p><p>每个项目都有专属的社区，而且也有很多地方让众多拥有不同背景的开源爱好者聚集起来。</p><p>你可以加入一些在线交流社群，比如领英的 <a href="https://www.linkedin.com/groups/65688/">Linux &amp; Open Source</a>。你也可以加入很多有趣的 <a href="https://gitter.im/">Gitter</a> 频道，Gitter 是为开源社区打造的即时通讯软件。当然，还有一些邮件组、论坛或平台（如 GitHub）让大家互相协作和交流。但是，如果你想亲自结识志趣相投的人，请考虑访问或加入线下黑客空间。</p><p>在黑客空间，人们将对实践的热爱传递到软件世界之外。不管你是对软件、硬件还是 DIY 和手工制作感兴趣，都可以去这些空间。有一个维基百科页面专门列举出了<a href="https://wiki.hackerspaces.org/List_of_ALL_Hacker_Spaces">所有的黑客空间</a>，找到离你最近的那个，去拜访他们，你将被思想与行动碰撞所迸发的火花点燃！</p><p>原文：<a href="https://www.freecodecamp.org/news/the-definitive-guide-to-contributing-to-open-source-900d5f9f2282/">The Definitive Guide to Contributing to Open Source</a>，作者：<a href="https://www.freecodecamp.org/news/author/doomhammer/">Piotr Gaczkowski</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 开源项目负责人指南 ]]>
                </title>
                <description>
                    <![CDATA[ 你有没有想过拥有自己的开源项目？我敢打赌，你一定有——因为你正在读这篇文章。 也许你现在正在考虑这事儿。也许你来这里是为了了解应该对开源项目有何期望，你将面临哪些挑战，以及如何应对这些挑战。好吧，你来对地方了。 以下指南基于我个人拥有一个开源项目中的经验。我指的是拥有一个开源项目，而不仅是向一个开源项目做贡献。这两者之间有着巨大的差别，我们将学习为什么。 所以让我们从开源项目负责人终极指南开始吧…… 目录  * 介绍  * 什么是开源  * 为什么要启动一个开源项目  * 如何发起一个开源项目  * 如何编写文档  * 如何推广你的开源项目  * 如何管理议题与拉取请求  * 如何实现流程自动化  * 版本管理 我是谁 我叫 Jeb，这几年一直在维护几个开源项目。其中最受欢迎的一个是 @angular-builders [https://github.com/just-jeb/angular-builders]，它也是我从中学到最多东西的一个开源项目。在写这篇文章的时候，它在 GitHub 上有约九百颗星，月下载量大约一百万。 是的，它与 Angular 或 React  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/ultimate-owners-guide-to-open-source/</link>
                <guid isPermaLink="false">6072e446b3b14e058ee04b6d</guid>
                
                    <category>
                        <![CDATA[ 开源 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Nicholas Zhan ]]>
                </dc:creator>
                <pubDate>Sat, 10 Apr 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2021/04/mark-konig-fbKMKNVJjwo-unsplash.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>你有没有想过拥有自己的开源项目？我敢打赌，你一定有——因为你正在读这篇文章。</p>
<p>也许你现在正在考虑这事儿。也许你来这里是为了了解应该对开源项目有何期望，你将面临哪些挑战，以及如何应对这些挑战。好吧，你来对地方了。</p>
<p>以下指南基于我个人<strong>拥有</strong>一个开源项目中的经验。我指的是拥有一个开源项目，而不仅是向一个开源项目做贡献。这两者之间有着巨大的差别，我们将学习为什么。</p>
<h3 id="">所以让我们从开源项目负责人终极指南开始吧……</h3>
<h2 id="">目录</h2>
<ul>
<li><a href="#%E6%88%91%E6%98%AF%E8%B0%81">介绍</a></li>
<li><a href="#%E9%82%A3%E4%B9%88%E4%BB%80%E4%B9%88%E6%98%AF%E5%BC%80%E6%BA%90">什么是开源</a></li>
<li><a href="#%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E5%90%AF%E5%8A%A8%E4%B8%80%E4%B8%AA%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE">为什么要启动一个开源项目</a></li>
<li><a href="#%E5%A6%82%E4%BD%95%E5%8F%91%E8%B5%B7%E4%B8%80%E4%B8%AA%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE">如何发起一个开源项目</a></li>
<li><a href="#%E5%A6%82%E4%BD%95%E4%B8%BA%E4%BD%A0%E7%9A%84%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE%E7%BC%96%E5%86%99%E6%96%87%E6%A1%A3">如何编写文档</a></li>
<li><a href="#%E5%A6%82%E4%BD%95%E6%8E%A8%E5%B9%BF%E4%BD%A0%E7%9A%84%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE">如何推广你的开源项目</a></li>
<li><a href="#%E5%A6%82%E4%BD%95%E7%AE%A1%E7%90%86%E8%AE%AE%E9%A2%98%E4%B8%8E%E6%8B%89%E5%8F%96%E8%AF%B7%E6%B1%82">如何管理议题与拉取请求</a></li>
<li><a href="#%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%B5%81%E7%A8%8B%E8%87%AA%E5%8A%A8%E5%8C%96">如何实现流程自动化</a></li>
<li><a href="#%E7%89%88%E6%9C%AC%E7%AE%A1%E7%90%86">版本管理</a></li>
</ul>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_now0_4liLR7fJcvvnWWStQ.jpeg" alt="1_now0_4liLR7fJcvvnWWStQ" width="600" height="400" loading="lazy"></p>
<h2 id="">我是谁</h2>
<p>我叫 Jeb，这几年一直在维护几个开源项目。其中最受欢迎的一个是 <a href="https://github.com/just-jeb/angular-builders">@angular-builders</a>，它也是我从中学到最多东西的一个开源项目。在写这篇文章的时候，它在 GitHub 上有约九百颗星，月下载量大约一百万。</p>
<p>是的，它与 Angular 或 React 这样的大型项目相差甚远，但是我觉得我有足够的经验和你分享，帮助你避免重蹈覆辙。更重要的是，帮助你了解拥有一个开源项目的成本。</p>
<h2 id="">那么什么是开源</h2>
<p>首先，让我们建立共同语言，并在关键术语和定义上达成共识。</p>
<p>什么开源（open source）？</p>
<p>这里是一个非常通用的<a href="https://www.wikiwand.com/en/Open_source_(disambiguation)">定义</a>，来自著名的开源百科全书（亦称维基百科）：</p>
<blockquote>
<p><a href="https://en.wikipedia.org/wiki/Open_source">开源</a>是指允许复制或修改的信息向公众开放的概念。</p>
</blockquote>
<p>或者，从<a href="https://en.wikipedia.org/wiki/Open-source_model">软件开发</a>模式来看：</p>
<blockquote>
<p>开源模式是一种去中心化的<a href="https://en.wikipedia.org/wiki/Software_development">软件开发</a>模式，鼓励<a href="https://en.wikipedia.org/wiki/Open_collaboration">开放协作</a>。</p>
<p><a href="https://en.wikipedia.org/wiki/Open-source_software_development">开源软件开发</a>的一个主要原则是<a href="https://en.wikipedia.org/wiki/Peer_production">对等生产</a>，源代码、<a href="https://en.wikipedia.org/wiki/Blueprint">蓝图</a>和文档等产品免费向公众开放。</p>
</blockquote>
<p>以维基百科为例，我们有编辑文章的人（贡献者），也有批准编辑的人（经验更加丰富的成员、版主）。</p>
<p>如果我们将其投射到软件世界，那些编辑们将形成一个开源项目的核心团队，而做贡献的人就是贡献者。</p>
<p>维基百科是一个非常庞大的开源项目，但这一切都是从一个<a href="https://en.wikipedia.org/wiki/History_of_Wikipedia">小东西</a>开始的。维基百科诞生自新百科全书（Nepedia），它的创建是有原因的：</p>
<blockquote>
<p>尽管邮件列表里有很多感兴趣的编辑，还有一个全职主编 <a href="https://en.wikipedia.org/wiki/Larry_Sanger">Larry Sanger</a>（威尔士聘请的<a href="https://en.wikipedia.org/wiki/Philosophy">哲学</a>研究生）在场，但新百科全书的内容写作还是非常缓慢，第一年只写了 12 篇文章。</p>
</blockquote>
<p>所以第一个问题来了……</p>
<h3 id="">为什么你应该关注开源</h3>
<p>你可以想象，将某些东西开放给更多人的一个主要的原因是 <em>为了招募协作者（collaborator）</em>。</p>
<blockquote>
<p>Together we’re strong.<br>
(Zarya, 2016)</p>
</blockquote>
<p>在写这篇文章的时候，维基百科<a href="https://en.wikipedia.org/wiki/Wikipedia:Wikipedians">拥有</a> 37899499 个注册账户，其中有 134022 个账户正在积极编辑。</p>
<p>想想看…… <strong>134022 名活跃的协作者</strong>。噢，它<a href="https://en.wikipedia.org/wiki/Special:Statistics">还有六百万的内容页</a>！</p>
<p>如果新百科全书（维基百科的前身，Nupedia）没有转向开源，这个数字还会是这样吗？我对此表示高度怀疑。</p>
<p>在软件领域也没有什么不同。为了解决某个问题，你必须写代码。为了解决一个大问题，你必须写很多代码。而为了妥善解决这个问题，你必须写出高质量的代码，做出高质量的设计，等等。</p>
<p>所有的这些都需要资源。说实话，你可能还没有这些资源。毕竟，你需要交房租。</p>
<h2 id="">为什么要启动一个开源项目</h2>
<p>虽然招募协作者是一个合理的动力，但几乎没有人仅仅因为这个原因就启动一个新的开源项目。你的理由可能会有所不同，但是我们来聊聊最流行的理由吧。</p>
<h3 id="1">#1 你想解决一个没有免费解决方案的问题</h3>
<p>你遇到一个问题，但没有任何东西可以为你解决它（或者有，但是要花钱），所以你不得不自己解决它。你设法解决了这个问题，你对自己的工作感到非常兴奋，而且你认为其他人可以从中受益，所以你把这个项目开源了。</p>
<h3 id="2">#2 你想成为发起人</h3>
<p>你想成为一个开源项目的发起人，你想在你的简历上写上那漂亮的一行。你真自以为是（毕竟，我们都是人）。如果这是你的<em>主要理由</em>，那么我向你保证——读完本指南之后，你会重新考虑的，这么做可能很不值得。</p>
<h3 id="3">#3 你想比别人更好地解决一个问题</h3>
<p>你面临一个问题，有一个开源项目实际上为你解决了这个问题，但是它不够好（在你看来）或者它没有你需要的确切功能。</p>
<p>如果你仅仅因为这个就创建一个新的开源项目，那么你 <em>很有可能</em>处于第二种情况（自以为是）。让自己成为一个贡献者，然后为现有的项目创建一个 PR 吧。</p>
<p>如果那个现有的项目有不同的愿景，创建 PR 并不可行，那么你应该考虑通过在你的项目中重用它的功能来扩展它，或者 <a href="https://help.github.com/en/github/getting-started-with-github/fork-a-repo">复刻（fork）</a>它，这可能会让你以后省去很多头疼的事情。</p>
<h3 id="4">#4 你想通过创建一个开源项目来解决一个问题</h3>
<p>你面临一个问题，并且现在没有任何人为你解决过它。所以，你认为从一开始就以开源的方式解决问题是一个非常好的想法。</p>
<p>在我看来，并不是。</p>
<p>解决这个问题，确保它对你有用，然后进入第一种情况。</p>
<p>这是我最常发现人们创建新的开源项目的四个动力。但是在这篇指南中，我们将主要关注第一种情况。</p>
<p>原因很简单——我相信，如果你发起开源项目的<em>主要原因</em>不是热衷于分享或者贡献你所做的东西，那么这就不成立了。</p>
<p>在相当长的一段时间内，你帮助别人这一事实可能是你得到的唯一回报。如果这不是你要找的那种满足感，那么你或许应该就此打住，不要再浪费你的时间了。</p>
<p>另一个相当流行场景值得一提：有些公司将它们的部分代码开放给社区。例如 Angular（由 Google 维护）、React（由 Facebook 维护）、VSCode（由微软维护）等等。</p>
<p>它们的理由可能各有不同，但是赢得协作者和为社区做贡献肯定是少不了的。</p>
<p>虽然我不能否认这种做法的重要性，但是这种情况与其它的情况有很大不同，因为维护这些项目的雇员们会因自己的工作<strong>得到报酬</strong>。</p>
<p>如果你在一家考虑创建开源项目的公司工作，那么这里的大部分内容对你来说还是有意义的，但是动力可能有所不同。</p>
<h3 id="">那么你是否应该创建一个开源项目呢？</h3>
<p>如果要我用一句话对这部分进行总结的话，那就是：</p>
<blockquote>
<p>确保你的意图符合你的期望。</p>
</blockquote>
<p>要相信，你想拥有一个开源项目与你实际拥有一个开源项目并不相同，你将会这接下来的几章中看到。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_6OX0spWqVQZxG3ue5D_EBA.jpeg" alt="1_6OX0spWqVQZxG3ue5D_EBA" width="600" height="400" loading="lazy"></p>
<h2 id="">如何发起一个开源项目</h2>
<p>所以你现在处于第一种情况——你有某个问题的解决方案，并且你渴望与世界分享。让我们再强调一遍：</p>
<ol>
<li>它与你的自负无关</li>
<li>你不是希望从中获益</li>
<li>你真的想要帮助有着相同问题的其他人</li>
</ol>
<p>对于所有这些问题，如果你的答案都是肯定的，那么这里是一份为你准备的快速检查单，让你确保你做的是正确的事情：</p>
<ol>
<li>确保开源是正确的形式。如果它只是某个你想与世界分享的小东西，那么一篇博客文章可能就足够了。</li>
<li>仔细检查是否已经有类似的项目存在。或许你的解决方案对某个已有的开源项目来说是一个绝佳的 PR。</li>
</ol>
<h3 id="">为即将到来的事情做好准备</h3>
<p>正如我所提到的，拥有一个开源项目会带来很多挑战。</p>
<p>其中最突出的一点就是，它需要你投入大量时间。你为项目做的一切都需要时间，无论是写代码、管理议题（issues）、更新依赖、与人交谈、回答问题等等。</p>
<p>你每多投入一分钟到你的开源项目中，你本可以投入到你的家庭、爱好、健康和其它的一切中的时间就会少一分钟。</p>
<p>你能做的唯一一件能让这种情况变好的事情就是开始委派任务。当（或者我应该说“如果”）你有足够多的协作者时，你可以将部分责任外包给你信任的人。</p>
<h3 id="">代码分离</h3>
<p>所以我们开始了，你有一个针对特定问题的解决方案，并且你认为其他人可以从中受益。这个解决方案仍然集成在你的代码库中，你可能并不想让整个代码库开源（除非你真的想）。</p>
<p>首先你需要将这部分代码从代码库中的其它代码分离出来。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/idigomnotoya-refactoring.jpg" alt="idigomnotoya-refactoring" width="600" height="400" loading="lazy"></p>
<p>这最终会意味着将要开源的所有代码都会位于一个单独的目录中。</p>
<h3 id="">让代码变得通用</h3>
<p>确保新目录中的代码是通用的，同时也不局限于你那特定的问题。如果需要的话，写一个抽象层。</p>
<p>举个例子，我发起<a href="https://github.com/just-jeb/angular-builders">angular-builders</a> 的时候，有一个非常具体的需求（来自<a href="https://github.com/just-jeb/electron-angular-native">我其它的开源项目之一</a>），就是为 Angular 构建添加一个自定义原生模块加载器。</p>
<p>我本可以创建<strong>原生模块构建器</strong>，它只用于这个目的。然而，我意识到我可以以相对较低的代价创建一个更加通用的解决方案，来解决相似（但不相同！）问题。</p>
<p><a href="https://github.com/just-jeb/angular-builders/tree/master/packages/custom-webpack">custom-webpack</a> 构建器就是这样诞生的。</p>
<h3 id="">保持简单</h3>
<p>通用的方案会非常棒，但要注意别过头了。</p>
<p>过早优化（premature optimization）和过度泛化（over-generalization）是软件工程中两个非常著名的问题。你应该找到那个最佳的点，你的解决方案可以解决你的问题之外的问题，<em>但是不能解决世界上所有的问题</em>。</p>
<p>如果你建立了一个量表，其中你那特定问题的解决方案是 1 ，而世界上所有问题的解决方案是 100，那么你应该从 2 开始。</p>
<p><em>你的通用代码应该能比你的特定代码多解决几个问题。</em></p>
<h3 id=""><a href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">吃自己的狗粮</a></h3>
<p>坚持在你的代码库中使用这部分通用代码——这样可以确保你去除不必要的部分，只留下必需的。它可以确保你要开源的代码能够正常工作。</p>
<p><em>记住，你是你的开源项目的第一个用户。</em></p>
<h3 id="">别被告了</h3>
<p>如果你正从公司的代码库中提取代码，咨询一下你的上级，如果需要的话，也咨询下法律部门。确保他们支持你的提议，并且你打算开源的那部分代码不会违反公司的知识产权。</p>
<p>这也能帮你决定哪个<a href="https://opensource.org/licenses">开源协议</a>更加适用于你的项目。</p>
<p>当一切正常，代码已经分离并且足够通用，你也得到了所有的批准（如果需要的话），那么就是时候向世界开放它了。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_oT-ftfrBJ_BvmaZk2zumpg.jpeg" alt="1_oT-ftfrBJ_BvmaZk2zumpg" width="600" height="400" loading="lazy"></p>
<p>当你的开源代码分离完成并且通用化，就可以把它从你的代码库中完全分开了。</p>
<h3 id="">公开你的代码</h3>
<p>首先，你需要开放你项目的源代码（在一天结束时，这让它成为了一个开源项目！）。</p>
<p>在线托管源代码的<a href="https://stackify.com/source-code-repository-hosts/">选择有很多</a>，但是我们将会采用默认的——GitHub。</p>
<ol>
<li>在 GitHub 上<a href="https://help.github.com/en/github/getting-started-with-github/create-a-repo">创建一个新仓库</a></li>
<li>克隆该仓库</li>
<li>将源代码从你之前创建的目录（暂时不要删除这个目录）移动到这个仓库</li>
<li>提交并推送（Commit &amp; push）——就这样，它现在是一个开源项目了。</li>
</ol>
<p><em>不是吗？</em></p>
<h3 id="">创建一个包</h3>
<p>你的项目已公开，但是没有人使用它（包括你，因为你正在自己更大的代码库中使用这份代码的副本）。并且，没有人知道它的存在。</p>
<p>此外，你的项目在网上公开的唯一形式是<em>源代码</em>，而使用它的唯一方式就是将它复制-粘贴进代码库中。这种方式并不是很方便，对不对？</p>
<p>为了恰当地分发你的项目，你需要：</p>
<ol>
<li>从源代码创建一个包</li>
<li>将这个包放到某个公开的程序包注册中心中。（根据你的生态系统进行选择，例如，对 Java 来说可能是 <a href="https://search.maven.org/">Maven Central Repository</a>，对 JavaScript 来说可能是 <a href="https://www.npmjs.com/">Npm Package Registry</a>，等等）。</li>
</ol>
<p>这时，你要为你的新仓库添加一个构建链，确定项目的名字，等等。</p>
<p>我并不打算对整个过程进行分解，因为它非常依赖于你的生态系统、工具集和你使用的编程语言。</p>
<p>你可能无所不包，对你来说，确定新项目，添加构建链，发布程序包都是小菜一碟。如果是这样的话，那就好办了！</p>
<p>你可能习惯于只写代码，从未面对过所有的这些定义、配置、工件和类似的东西。对你来说，这可能是一个全新的新世界。</p>
<p>如果你是后者，就该学习了。我向你保证，要不了多久就能达成目标。</p>
<h3 id="">不论如何</h3>
<p>当你完成脑海中所有缺失拼图的拼装，你就学会了有关程序包注册中心的一切。并且你的程序包已经发布了，<em>那时，也只有那时你才能真正地认为你的项目开源了</em>。</p>
<p><em>这时，你可以告诉人们：“嘿，我已经有你那问题的解决方案了，你只需要把这个包添加到你的项目中，然后使用它就行了！”</em></p>
<h3 id="">进行完整性检查</h3>
<p>确保你的项目在开始像病毒一样传播之前能够正常工作。</p>
<p>对程序包的完整性检查，实际上就是从你那更大的代码库中删除通用的目录，并改用这个公开的程序包。</p>
<p>毕竟，<em>你是你的开源项目的第一个用户</em>。</p>
<h3 id="">如何处理你的代码库中的进一步开发问题</h3>
<p>当你开始在你的代码库中使用这个程序包时，开发流程可能会发生变化。在之前，开源代码是你代码库的一部分——你可以立即使用所做的更改。</p>
<p>但是现在，它与你代码中使用的任何其它第三方软件包一样，都是外部的软件包。</p>
<p>因此，当你在崭新的开源项目中开发新的功能时，必须先发布它，才能在你那更大的代码库中使用它。然而，如果你不确定它是否可行，你就不能发布它。因为一旦发布，就可能会影响其他用户。</p>
<p>为了避免发布有问题的版本，你可以做以下几件事情：</p>
<ol>
<li>用测试覆盖你的代码，包括单元测试和端到端测试。<br>
<em>我认为我不需要跟你讲测试是多么的重要。</em></li>
<li>在本地打包并安装新版本的程序包到你那更大的代码库中。<br>
<em>验证一切按预期工作之后，你就可以发布它了。</em></li>
<li>发布一个 Beta 版本，仅开放给那些明确希望使用该版本的用户，而不是全世界。<br>
<em>例如，在 npm 的程序包注册中心中，<a href="https://docs.npmjs.com/cli/dist-tag">dist tags</a> 就可以用于这个目的。</em><br>
<em>默认的 tag 是 <code>default</code>，当你运行 <code>npm install mypackage</code> 时，它实际上会运行 <code>npm install mypackage@latest</code>。当你用另一个 tag（比如 <code>beta</code>） 发布一个新版本时，人们只有显式地从这个 tag 安装才能获取到最新的版本：<code>npm install mypackage@beta</code>。</em></li>
</ol>
<h3 id="">小结</h3>
<p>与前一节的纯理论不同，这一节实际上会要求你做一些事情。根据你经验和学习能力，可能需要花费你几天甚至几周的时间来完成这个必需步骤，而我们甚至还没有开始呢。</p>
<p>这就是为什么我有责任再问你一次：</p>
<blockquote>
<p>你真的准备好将宝贵的时间奉献给社区了吗？</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_z5sGJuWoz02x3uSBaF4tLg.jpeg" alt="1_z5sGJuWoz02x3uSBaF4tLg" width="600" height="400" loading="lazy"></p>
<h2 id="">如何为你的开源项目编写文档</h2>
<p>这篇文章的前两部分是针对那些正在考虑创建开源项目的人写的。我想让他们知道应该期望什么，并帮他们在开源世界里开个头。</p>
<p>这一部分，以及后面的部分，也会与那些已经在维护开源项目并希望有所改进的人们有关。</p>
<h3 id="">这一部分的基线：</h3>
<blockquote>
<p>你已经有了一个开源项目，我们可以在 GitHub 上访问它，并且可以很容易地通过某个程序包注册中心使用它。</p>
</blockquote>
<h3 id="">为什么你需要文档，它应该包含哪些内容？</h3>
<blockquote>
<p>一个没有文档的开源项目毫无生命可言</p>
</blockquote>
<p>之所以说毫无生命，是因为没有人会深入你的代码，去了解应该如何使用它。在此之前，甚至没有人知道你的代码是干嘛的。</p>
<p>所以你的文档应该基本上包含这两部分的内容——<em>它是做什么的</em>以及<em>如何使用它</em>。这两点是文档的奠基石，是文档的必备内容。</p>
<h3 id="">如何写项目描述</h3>
<p>人们在进入某个 GitHub 仓库时，首先看到的就是项目的描述信息。因此，一个好的描述应该简明扼要地回答“它是做什么的”这个问题。例如：</p>
<p><a href="https://github.com/facebook/react">React</a>:</p>
<blockquote>
<p><em>一个声明式的、高效且灵活的 JavaScript 库，用于构建用户界面。<a href="https://reactjs.org/">https://reactjs.org</a></em></p>
</blockquote>
<p><a href="https://github.com/moment/moment">Moment.js:</a></p>
<blockquote>
<p><em>在 JavaScript 中解析、验证、操作并展示日期。<a href="http://momentjs.com/">http://momentjs.com</a></em></p>
</blockquote>
<p><a href="https://github.com/just-jeb/angular-builders">Angular builders</a> （这个项目是我的）：</p>
<blockquote>
<p><em>Angular 构建门面扩展（Jest 与自定义 webpack 配置）</em></p>
</blockquote>
<p>你可以在仓库的 <code>About</code> 部分编辑描述信息：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screen-Shot-2021-03-11-at-10.20.43-1.png" alt="Screen-Shot-2021-03-11-at-10.20.43-1" width="600" height="400" loading="lazy"></p>
<h3 id="readmemd">如何写 README.MD 文件</h3>
<p>README.MD 是一个位于你的项目根目录中的文件，用 <a href="https://docs.github.com/cn/github/writing-on-github/basic-writing-and-formatting-syntax">Markdown 语法</a>编写，它包含别人需要知道的有关你的项目所需要的一切信息。</p>
<p>README 文件应该包含一个详细的描述（在“它是做什么的”这个问题上进行展开），以及关于“如何使用你的开源项目”的详细说明。</p>
<p>说明的内容应该覆盖每一个公共 API，最好是有使用示例。</p>
<p>这里编写良好 API 文档的几个要点：</p>
<ul>
<li><strong>最简法则</strong>——API 和示例越简单，使用者就越容易理解它是做什么的以及如何使用它。</li>
<li><strong>条理清晰</strong>——对所有的 API 方法都使用相同的模板和可视化结构。这样，你就可以定义自己的语言，向使用者传达 API。</li>
<li><strong>变身用户</strong>——总是从用户的角度编写 API 描述。假设你对项目的内部一无所知，并且这份文档就是你的全部。</li>
<li><strong>保持最新</strong>——随着项目的演进，API 可能会发生变化。确保你的 README 文件总是包含最新的 API 和示例。</li>
</ul>
<p>README 可以（但不是必须的）包含以下内容：</p>
<ul>
<li>贡献指南的链接</li>
<li>贡献者名单</li>
<li>变更日志的链接</li>
<li>最新版本</li>
<li>协议</li>
<li>构建状态</li>
<li>下载次数</li>
<li>用于快速反馈的聊天链接</li>
</ul>
<p><a href="https://github.com/aws-amplify/amplify-js">这里</a>是一个优秀 README 的示例。</p>
<h3 id="">何为徽标</h3>
<p>徽标（Badge）是一种很好的方式，可以直观地显示项目的基本信息，例如：构建状态、版本、协议以及项目使用的各种工具。</p>
<p>选择有很多，但是我推荐你使用 <a href="https://shields.io/">shields.io</a> 的徽标。他们的徽标很丰富。</p>
<p>给 README 文件添加徽标真的非常简单：</p>
<ol>
<li>前往 <a href="https://shields.io/">shields.io</a></li>
<li>选择合适的分类</li>
<li>点击你想要添加到 README 的徽标</li>
<li>填写需要的信息（如果需要的话）</li>
<li>从下拉菜单中选择 Copy Markdown</li>
<li>将 markdown 粘贴到你的 README 文件中</li>
</ol>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-141342.png" alt="Screenshot-2021-03-12-141342" width="600" height="400" loading="lazy"></p>
<p>徽标通常放在 README 文件的顶部，就在详细描述的前面。它看起来像这样：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_hgG8kurYMkdAsMXxji4iVg.png" alt="1_hgG8kurYMkdAsMXxji4iVg" width="600" height="400" loading="lazy"></p>
<h3 id="">确保你进行了测试</h3>
<p>API 参考很棒，但是没有什么比使用你的公共 API 的真实代码更好了。</p>
<p>完善文档的最佳方式之一就是用描述性测试来覆盖代码。有时，测试比任何文档更能解释代码。</p>
<h3 id="">小结</h3>
<p>在这一部分，我们只覆盖了文档的基础知识。例如，除了 README 和描述信息，还有很多其它内容。随着项目的发展和问题（issue）的出现，它们将成为文档的组成部分。</p>
<blockquote>
<p>然而，对于任何一个像样的开源项目来说，拥有一份覆盖公共 API 的 README 文件只是最低要求。</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/david-menidrey-16ep3TGZR-0-unsplash.jpeg" alt="david-menidrey-16ep3TGZR-0-unsplash" width="600" height="400" loading="lazy"></p>
<h2 id="">如何推广你的开源项目</h2>
<p>我们已经讨论过发起一个项目意味着什么，如何以最佳的方式去做，以及如何为它写好的文档。</p>
<p>现在，我们就来聊聊如何将公众的注意力吸引到你的项目上来，以及如何在吸引与正确管理贡献者上面对项目进行优化。</p>
<h3 id="">这一部分的基线是：</h3>
<blockquote>
<p><em>你已经有了一个开源项目，人们可以在 GitHub 上访问它，它有良好的文档，并且可以很容易地通过某个程序包注册中心使用它。</em></p>
</blockquote>
<h3 id="">如何宣传你的项目</h3>
<p>咱们开门见山吧：随着项目的发展，你根本无法独自处理每件事情。所以，如果你想让项目长久生存下去，繁荣昌盛，你需要更多的人参与到项目中来。</p>
<p>为了让更多的人参与到你的项目中，你需要更多的人知道它，更重要的是相信它。</p>
<p>根据我的经验，将你的开源项目暴露给合适的受众的最佳方式是 <strong>使用知名的资源渠道</strong>，并写一篇关于项目的博客文章。</p>
<p>资源渠道可以是纯面向开发的（比如 dev.to），也可以不是（比如 Medium）。</p>
<p>所有这些资源之间都有一个共同点：它们都有既定的受众，并且是相关的受众。</p>
<p>你也可以在不同在线资源之间<a href="https://en.wikipedia.org/wiki/Crossposting">交叉发表</a>你的文章，从而覆盖到更到的受众。但是要注意，交叉发表有几个弊端：</p>
<ul>
<li>每个平台可能都有各自不同的标记语言，你不得不重新调整所有的格式</li>
<li>维护性——如果某部分内容变了（事情 <em>会</em> 发生变化），你就需要在所有的资源中对你的博客进行更新</li>
</ul>
<p>如果你选择 Medium，我会高度推荐你将自己的文章提交到某个<a href="https://getgist.com/top-50-medium-publications/">大型专栏</a>。这将要求你做更多的事情，因为你需要让你的文章满足专栏的要求。但是它也能确保更多的受众接触到你的文章，更重要的是，<em>相关</em>的受众。</p>
<p>你还可以决定选择 <a href="https://help.medium.com/hc/en-us/articles/360018834314-Stories-that-are-part-of-the-metered-paywall">metered paywall</a>（你可以从中赚钱！）：</p>
<blockquote>
<p>属于付费专区的故事也可以通过主题分发给 Medium 读者，这些主题可在我们的主页、主题页、每日摘要和应用程序中被推荐。</p>
</blockquote>
<p>我无法告诉你哪种方式更好，但是我个人更喜欢专栏，因为它能确保你的文章被读者看到，而不是像“符合发布条件”一词这么模糊。</p>
<p>如果你的博客广为传播，那么它就可以产生级联效应，为你的开源项目带来更多的人。</p>
<p>例如，如果你的 GitHub 项目在发表文章之后的一天之内收获了几十颗星，就可以进入 GitHub 的<a href="https://github.com/trending">趋势</a>页，这本身也是另一个暴露源。</p>
<p>让你的博文更加优秀的几个要点：</p>
<ul>
<li>以问题陈述作为开始，它甚至可以是博客的标题。<br>
<em>人们通常是在寻找某个特定问题的解决方案，在他们决定花时间读你的文章之前，他们应该知道你的文章是否是他们正在寻找的东西。这里是我写的一篇文章的<a href="https://medium.com/angular-in-depth/customizing-angular-cli-build-an-alternative-to-ng-eject-v2-c655768b48cc">示例</a>。</em><br>
<em>如你所见，它在标题中清晰地阐述了它所解决的问题。</em><br>
<em>如果你在谷歌搜索“Customizing Angular build”，它将会出现在排名靠前的几个结果中，并且你可以直接从搜索页面上看到它解决了哪个问题。</em></li>
<li>描述一下你的项目为什么要解决了这个问题，它是如何解决的。</li>
<li>提供一份详细的逐步指导，从安装开始，以可以正常运行的示例结束。<br>
<em>有很多开发者都更喜欢可以正常运行的示例，而不是博客文章。</em></li>
<li>在发表文章之前，先获取一些反馈。<br>
<em>让你的朋友们仔细阅读你的文章，不要告诉他们你的文章是关于什么的，看它们能够自己说出来。如果他们做不到，那么很有可能是你的文章不够清晰，你需要写得更加详细。</em></li>
</ul>
<p>在发表博文之后，在社交媒体上与你的朋友、家人和马路上的陌生人分享。</p>
<p>这将会增加你的项目的曝光度——但是你也要让人们<em>愿意</em>向你的项目做贡献。</p>
<h3 id="">项目如何吸引贡献者</h3>
<p>最好的办法就是与他人一起发起一个开源项目。通过这种方式，你从一开始就能拥有一个可以一起分担责任的团队。</p>
<p>然而，并不总是如此。</p>
<p>如果你独自发起开源项目，你必须吸引贡献者。根据我的经验，有两种类型的贡献者：</p>
<ol>
<li>想要产生影响并在找项目做贡献的人（虽然很少见，但是也有）。</li>
<li>使用你的程序包并且发现了缺陷或者缺少某些功能的人。</li>
</ol>
<p>在这两种情况下，只在 GitHub 上分享你的源代码并写一篇关于如何使用它的博文是不够的。以下是一些可以使人们愿意做贡献的事情：</p>
<h4 id="">一个待实现清单</h4>
<p>它可能包含已知缺陷、规划的功能或者其它的东西。这个清单会让第一类贡献者更容易选择正确的事项并发起 PR。</p>
<p>它可以是一个独立的清单，你也可以（或许是应该）使用 GitHub 上的议题（issues）和标签（labels）。</p>
<h4 id="">一份 <a href="https://docs.github.com/cn/github/building-a-strong-community/setting-guidelines-for-repository-contributors">贡献者指南</a></h4>
<p>基本的贡献者指南应该解释仓库的结构，包含关于构建并运行项目与测试的逐步指导。扩展的指南可以包含架构、设计决策、行为准则等。</p>
<p><a href="https://github.com/atom/atom/blob/master/CONTRIBUTING.md">Atom 的贡献者指南</a>就是一个很好的例子。千万不到低估它的价值！随着项目的发展，这需要花费大量的时间，我希望我从一开始就创建它，并随着项目的发展逐渐更新。</p>
<p>不幸的是，我没有人指出它的重要性，而<a href="https://github.com/just-jeb/angular-builders">我的项目</a>今天都还没有贡献者指南。它一直在我的待办清单上，但总有比它更紧急的事情。</p>
<h4 id="">感谢你的贡献者们</h4>
<p>在项目的主页列出贡献者们，这会让他们有更多的动力去做贡献。</p>
<p>只添加他们的名字就够了，但是我将会推荐你使用 <a href="https://github.com/all-contributors/all-contributors">All Contributors</a>。它不仅能为你的所有贡献者创建带有个人资料图片和徽标的精美部分，还能通过创建 PR 来自动添加新的贡献者，将贡献者添加到这个区域。</p>
<h3 id="">小结</h3>
<p>我们在这一部分讨论了增加项目曝光度以及赋予人们初始动力去创建 PR 或议题的几件事情。</p>
<blockquote>
<p>但是这并不能让他们坚持做贡献者，也不能确保他们完成已开始的工作。</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_tyzBkDXaXjRW4UIEWBikzQ.jpeg" alt="1_tyzBkDXaXjRW4UIEWBikzQ" width="600" height="400" loading="lazy"></p>
<h2 id="">如何管理议题与拉取请求</h2>
<p>既然我们已经探索了共享信息和如何让你的开源项目变得更具吸引力，让我们来讨论一下<em>贡献</em>吧，它是每个开源项目的圣杯。</p>
<h3 id="">什么是开源贡献？</h3>
<p>对一个开源项目的贡献是指由所有者以外的人所做的任何改变。在实践中，它有两种形式：</p>
<h4 id="">议题</h4>
<p>这里是 GitHub 关于议题（issues） 的<a href="https://docs.github.com/cn/github/managing-your-work-on-github/about-issues">描述</a>：</p>
<blockquote>
<p><em>你可以在仓库中使用议题收集用户反馈，报告软件漏洞，并且组织要完成的任务。议题不只是一个报告软件漏洞的地方。</em></p>
</blockquote>
<p>简而言之，议题可以是需要采取某种行动的任何信息。</p>
<h4 id="pr">拉取请求（PR）</h4>
<p>这里是 GitHub 关于拉取请求（Pull Request，PR）的<a href="https://docs.github.com/cn/github/collaborating-with-issues-and-pull-requests/about-pull-requests">描述</a>：</p>
<blockquote>
<p><em>拉取请求可让你在 GitHub 上向他人告知你已经推送到仓库中分支的更改。在拉取请求打开后，你可以与协作者讨论并审查潜在更改，在更改合并到基本分支之前添加跟进提交。</em></p>
</blockquote>
<p>简而言之，拉取请求就是对项目的实际修改。</p>
<h3 id="pr">如何使用议题和 PR</h3>
<p>那么，你应该如何使用议题和 PR，又该如何处理贡献者创建的议题与 PR 呢？</p>
<h4 id="">以身作则</h4>
<p>我能给你的最好建议是，结合某个具体的工作方法<em>以身作则</em>。这意味着，当你开发新功能时，你应该为这个功能创建一个 PR，在它满足你所有的要求之后就进行合并。</p>
<p>你应该在发现缺陷或者一些缺失功能时创建议题。</p>
<p>这个方法不仅能组织好你的工作，让你的项目变得井井有条，还能给贡献者们提供一个参考，他们可以从中学习并调整自己的议题与 PR。</p>
<p>此外，如果你的标准很高（即你相信每个 PR 都应该有适当的文档、测试覆盖等等），那么你应该像对待任何其他贡献者一样对待你自己。你不能要求别人做你自己都没有做的事情。</p>
<p>还有就是，有时候你对贡献者应该比对自己更宽容。在你的项目处于初期阶段，没有很多贡献者时，更应该这样。这就涉及到了下面这一点。</p>
<h4 id="">感谢一切付出</h4>
<p>与他人协作就是要相互尊重。你应该尊重你的贡献者们，耐心地回答他们的问题（即便问题看起来很简单），礼貌地对待<em>建设性批评</em>。</p>
<p>记住：对贡献者工作的感谢至关重要。如果某人只是创建了一个议题（即使这个议题没有经过深入研究，甚至没有重现），感谢他们。他们费力地把自己的椅子挪到离桌子近一点的地方，坐直身子，然后打了一点他们认为对你有用的东西，感谢他们。如果需要的话，用礼貌而又尊重的方式向他们询问更多的细节。</p>
<p>如果某人创建的 PR 没有满足你的高标准，感谢他们。感谢他们并礼貌地请求他们修改代码/编写测试/添加文档，等等。给他们一个你的 PR 的链接作为参考，或者给他们一个贡献指南的链接。</p>
<p>建设性地积极对话将会给予那些贡献者们额外的动力，让他们继续工作。</p>
<h4 id="vs">质量 vs 数量</h4>
<p>最终，几乎总会有一个折衷（除非你自己拥有一个像 Angular 或 React 这样的大型开源项目）。你可以决定不放低标准，哪怕是一点点也不行，很有可能你最终会自己完成所有的工作。</p>
<p>或者，你可以决定放低对贡献者的标准（但是这可能会让你的标准显得毫无用处，因为它们没有被执行）。</p>
<p>我了解到，每个贡献者都需要使用不同的方法。这真的是由他们个人及其对贡献的兴趣决定的。</p>
<p>你应该考虑议题的紧急性、贡献者的经验、代码的复杂度、所需修复或功能的复杂度、贡献者的动机等因素。</p>
<p>通常，当议题非常重要时，我会礼貌地请求贡献者进行更改，然后等个几天，如果没有任何进展，我就会自己进行更改。至于那些没那么重要的（有了会更好）修复或者功能，我通常会把它们完全留给社区。</p>
<p>随着议题和 PR 数量的增长，跟踪、确定优先级并对它们进行分类就会成为一项艰巨的任务。这意味着标签会变得异常重要。</p>
<h4 id="">使用有用的标签</h4>
<p><a href="https://docs.github.com/cn/github/managing-your-work-on-github/managing-labels">GitHub 的标签</a>是让议题和 PR 保持优先级与组织性的好工具。虽然你可以通过标签进行搜索和过滤，但是我发现最有用的还是它可以帮助可视化项目的整体状态。</p>
<p>这样，你可以进入“议题”页，看到大部分议题都被打上了 <code>bug</code> 标签（这意味着你应该停下来集中精力修复它们，而不是往前推进了）。</p>
<p>或者，你可以看见大部分议题（issue）都被标记为 <code>enhancement</code> 或需要 <code>features</code>。<code>priority</code> 是另一个有用的标签，可以帮你首先关注到重要的东西。</p>
<p>此外，你的贡献者可以（也会）从你使用的标签中受益。例如，回到<strong>吸引贡献者</strong>，一些人可以进入议题页（issues），然后直观地地识别出那些需要社区帮忙处理的议题（<code>help-wanted</code>、<code>pr-welcome</code>，等等）。</p>
<p>除了职责单一的标签（比如 <code>bug</code> 或 <code>enchancement</code>）外，我推荐你使用标签来限定议题/PR 的范围。例如：</p>
<ul>
<li><code>priority:low</code>，<code>priority:high</code></li>
<li><code>required:investigation</code>，<code>required:tests</code>，<code>required:docs</code></li>
<li>或者在单仓库的情况下： <code>packages:package1</code>，<code>packages:package2</code> 等等</li>
</ul>
<p>这里是一个使用了标签的议题页，它来自我的项目：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-141634.png" alt="Screenshot-2021-03-12-141634" width="600" height="400" loading="lazy"></p>
<p>标签让你可以快速地分辨出哪些问题是需要你（或你的贡献者）注意的，这些问题与哪个组件相关以及需要什么才能继续进行。</p>
<h4 id="pr">使用 PR 和议题模板</h4>
<p>我强烈建议你花几分钟时间，为<a href="https://docs.github.com/cn/communities/using-templates-to-encourage-useful-issues-and-pull-requests/configuring-issue-templates-for-your-repository">议题</a>和 <a href="https://docs.github.com/cn/communities/using-templates-to-encourage-useful-issues-and-pull-requests/creating-a-pull-request-template-for-your-repository">PR</a> 定义模板。</p>
<blockquote>
<p><em>利用议题和拉取请求模板，可以自定义和标准化你希望贡献者在你的仓库中打开议题和拉取请求时加入的信息。</em></p>
</blockquote>
<p>这将为你节省大量的时间，因为你不需要对每个问题或 PR 进行附加信息或更改的请求。有时候你还是需要这样做（因为有些贡献者根本不关注模板），但是它发生的频率要比不创建模板少得多。</p>
<p>这里是默认议题的一个例子，你可以看到对应的模板是何时在你的仓库中定义的：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-141725.png" alt="Screenshot-2021-03-12-141725" width="600" height="400" loading="lazy"></p>
<h4 id="github">使用 GitHub 的应用程序与操作</h4>
<p>有很多的 GitHub <a href="https://docs.github.com/cn/actions/creating-actions/about-actions">应用程序和操作</a>可以帮你管理 PR 与议题。相关应用程序和操作的数量仍在不断增长，但是我个人发现这些功能最有用：</p>
<ul>
<li><a href="https://github.com/marketplace/stale">Stale bot</a></li>
<li><a href="https://github.com/marketplace/wip">WIP</a></li>
<li><a href="https://github.com/dkhmelenko/autoapproval">Autoapproval</a></li>
<li><a href="https://github.com/actions/labeler">PR labeler</a></li>
</ul>
<h4 id="">及时响应</h4>
<p>如果我在其它开源项目上打开了一个议题或 PR，并且等了很长时间才收到回复，那么我就会对它失去兴趣。<a href="https://github.com/greenkeeperio/monorepo-definitions/pull/24">这里</a>是一个例子：</p>
<ul>
<li>最初的响应非常快，只花了两天</li>
<li>讨论的成果丰富</li>
<li>PR 仍然处于打开状态，但却没有关于到底是什么少了/错了的更新</li>
</ul>
<p>最终，我转向了另一个包。</p>
<p>如果你不及时响应，这也会发生在你的项目上：如果你要花两周的时间响应一个需要你处理的 PR，而不是等待你要求的贡献者更改，那么你就会失去用户（即潜在的贡献者）。</p>
<p>所以帮你自己一个忙——及时响应。不一定要立马解决某人的问题，但是，即便是让用户知道你会在下周研究他们的议题，也给了他们一些确定性和时限。</p>
<p>坏消息是，你应该信守诺言。如果你的诺言有时没有完成，不要担心——我们所有人都有自己的生活，如果你因一些紧急的事情推迟了你在开源上的工作，是可以理解的。</p>
<p>如果发生了这种情况，就给一个简短的更新——又不是什么大事儿，只需要写一两个字，让人们知道他们一直在等待的那个功能被推迟了。</p>
<h3 id="">如何确定议题的优先级</h3>
<p>有几种方法可以帮你确定最重要议题的优先级。</p>
<p>首先，应该如何识别出最重要的议题呢？我个人认为，最重要的议题就是用户最想要的那些东西，不管它是新功能、缺陷修复，还是其它东西。</p>
<p>有时候，用户会在议题中表现出他们的兴趣，但是他们很有可能不会这么做。因此，我给大家介绍一种了解用户对哪些东西感兴趣的简单方法：</p>
<p>GitHub 上的每个项目都有一个 “Insights” 选项，其中有一部分叫 “Traffic"：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142214.png" alt="Screenshot-2021-03-12-142214" width="600" height="400" loading="lazy"></p>
<p>你可以在这部分的底部找到热门内容表（Popular Content table），它可以让你深入了解哪些页面是使用者们访问得最多的：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142309.png" alt="Screenshot-2021-03-12-142309" width="600" height="400" loading="lazy"></p>
<p>这个表中展示的议题是访问频率最高的那些议题，因此对你的用户来说，它们最有可能是最重要的。</p>
<p>甄别出最重要的议题后，你需要在议题页面突出它们。这里是几种方式：</p>
<h4 id="">固定议题</h4>
<p>每个仓库可以有最多三个固定议题（pinned issue）。固定议题出现在议题页面的顶部，所以几乎不可能忽略他们：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142429.png" alt="Screenshot-2021-03-12-142429" width="600" height="400" loading="lazy"></p>
<h4 id="">添加标签</h4>
<p>我们已经讨论过<em>使用</em>标签了，并且对 <code>help-wanted</code> 和 <code>priority:high</code> 标签的应用来说，这是一个绝佳的例子。这些标签会让潜在的贡献者们知道这个议题很重要，并且他们的任何帮助都会被感谢。</p>
<h4 id="">持续集成</h4>
<p>在将每个拉取请求合并到主干（master，或者 main）之前，先进行构建和测试，这将让你对即将合并到主干分支的代码充满信心（取决于测试的覆盖程度）。</p>
<p>尽管我不能不提到它是 PR 管理过程的一部分，但是它是一项任务的<em>自动化</em>，否则你不得不自己做，这样它就与 PR 管理没有直接关系了。</p>
<p>你仍然可以检出（check out）每个 PR，在本地构建，运行测试，然后在一切都通过之后进行合并（这样的话，持续集成就与 PR 管理没有直接关系）。不过别担心，我们将会在下一部分详细介绍持续集成。</p>
<h3 id="">小结</h3>
<p>让你的项目保持整洁有序非常重要，因为，我们都知道，整洁是一种美德。它不仅让管理过程更加高效，还能改善项目给人的总体印象。</p>
<blockquote>
<p>PR 和议题（以及代码库）是开源项目门面的不可或缺的一部分。不要低估它们的价值。</p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_n8_iSirZKBjHRufT6silGw.jpeg" alt="1_n8_iSirZKBjHRufT6silGw" width="600" height="400" loading="lazy"></p>
<h2 id="">如何实现流程自动化</h2>
<p>管理贡献（即议题和 PR）的一个自然部分是自动化——可能是 OSS 项目管理中最重要的方面之一。</p>
<h3 id="">为什么要自动化？</h3>
<p>如果说我在拥有一个开源系统的这些年里学到了什么，那就是你要做的例行事项越少，你就有越多的空闲时间用于实际的工作（比如修复缺陷或者开发新功能）。因此，我力求<strong>尽可能自动化</strong>。</p>
<p>这里是我希望我们如何实现这个目标的方式：首先检查两个工作流程（非自动化和全自动化），看你有多少时间实际上是花在例行事项上的。然后，我们将探讨如何实现改进的工作流程，让我们有更多的时间来修复缺陷。</p>
<h3 id="">最糟糕的情况——没有自动化</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142749.png" alt="Screenshot-2021-03-12-142749" width="600" height="400" loading="lazy"></p>
<p>如你所见，在没有任何自动化的情况下，所有的工作都由你来做。仅仅对于一个缺陷修复来说，你就需要做很多工作，更重要的是，<em>每次</em>修复缺陷或开发新功能时，你都要做这些工作！</p>
<p>现在我们来看看另一种情况。</p>
<h3 id="">最好的情况——一切都是自动化的</h3>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142807.png" alt="Screenshot-2021-03-12-142807" width="600" height="400" loading="lazy"></p>
<p>在这种情况下，你只需要做必须要做的事情——检查代码和（偶尔）批准拉取请求，其他的一切都是自动完成的。</p>
<p>科幻小说？不，它被称为<strong>持续集成（continuous integration）</strong> 和 <strong>持续部署（continuous deployment）</strong>。在这里，我们并不会深入构建脚本和特定系统配置的细节。相反，我们将会查看让它发挥作用所需的工具，我将会让你自己决定具体细节。</p>
<h3 id="ci">什么是持续集成（CI）?</h3>
<blockquote>
<p><em>持续集成（CI）是一种自动将代码改动从多个贡献者集成到单个软件项目中的实践。 CI 过程由自动工具组成，这些工具会在集成之前断言新代码的正确性。</em></p>
</blockquote>
<p>一个非常基础的 CI 运行将会包括 <strong>构建（build）</strong> 和 <strong>单元测试（unit tests）</strong>，但是并不局限于这两种。可能也会包含各种各样的静态代码分析工具、链接器等等。这里的标准由你定。</p>
<h3 id="">为什么你应该使用端到端测试</h3>
<p>构建和单元测试可以为你提供有关代码变动的快速反馈，所需时间相对较短，并且在出现问题的时候迅速失败。但是端到端（end-to-end，E2E）测试在 CI 中有着特殊的地位。</p>
<p>端到端测试不仅应该覆盖代码的正确性，还应该覆盖到你的部署流程、包的完整性等等。</p>
<p>我自己也意识到了这一点，当我不小心发布了一个不包含代码的新版本包。构建通过了，单元测试和端到端测试也没有问题（这一次是通过链接测试项目的构建输出目录来安装的）。哪里失败了呢？在打包阶段。</p>
<p>这里有一个关键点：端到端测试应该像真实用户使用那样测试你的软件包。</p>
<p>为了达到这个目标，我推荐以下几步：</p>
<ol>
<li>在你的 CI 运行期间，启动一个本地的包注册中心。每个语言/生态系统都有几个选择，例如对 Java 或 Scala 项目来说，你可以用 <a href="https://blog.sonatype.com/using-nexus-3-as-your-repository-part-1-maven-artifacts">Nexus 仓库</a>，对 JavaScript 来说，可以使用 <a href="https://github.com/verdaccio/verdaccio">Verdaccio</a>（我在 <a href="https://github.com/just-jeb/angular-builders">@angular-builders</a>中使用它）。</li>
<li>有一个使用你的软件包的独立项目（它可以位于同一个仓库中）。这个仓库中的测试应该测试你的打包功能。</li>
<li>配置这个项目使用本地包注册中心。</li>
<li>构建完你的包之后，将其发布到本地包注册中心（在你的 CI 系统中启动）</li>
<li>安装改包的最新版本（你刚才构建的那个）到你的测试项目中。</li>
<li>运行测试。</li>
</ol>
<p>这不仅可以测试软件包的完整性和可靠性，还可以在进行持续部署时给你省去一些工作。</p>
<h3 id="ci">CI 系统是如何工作的</h3>
<p>很多 CI 系统都有针对开源项目的免费计划，其中有 <a href="https://travis-ci.com/">Travis CI</a>、<a href="https://circleci.com/">CircleCI</a>、<a href="https://www.appveyor.com/">AppVeyor</a>、<a href="https://github.com/features/actions">GitHub Actions</a> 等。</p>
<p>它们的功能都比较多，做的事情也基本相同：检出你的代码到虚拟机、运行你定义的脚本（通常运行构建和测试），然后向 GitHub 报告成功或失败。</p>
<p>所有这些系统都有一个用于和 GitHub 集成的 <a href="https://github.com/marketplace?category=continuous-integration&amp;type=apps">应用程序</a>，它们当中的集成过程也非常类似：</p>
<ol>
<li>在平台上注册。</li>
<li>在你的 GitHub 账户中安装对应的应用程序。</li>
<li><a href="https://github.com/settings/installations">配置对所选仓库的访问</a>。</li>
<li>创建一个配置文件（比如 <code>travis.yaml</code>），定义构建矩阵、所需构建链和 CI 脚本。</li>
<li>将它推送到主干。</li>
</ol>
<p>这会使你的 CI 在每个 PR 上运行，并向 GitHub 报告状态——但是这还不够。你真正想要的是在 PR 通过所有检查之前，阻止合并到主干分支。</p>
<p>这可以通过定义分支保护规则来实现。为了定义这些规则，你需要前往你仓库的 <strong>Setting</strong> 中的 <strong>Branch</strong> 部分，然后点击 <strong>Add rule</strong> 按钮：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142547.png" alt="Screenshot-2021-03-12-142547" width="600" height="400" loading="lazy"></p>
<p>然后选择多选框 <strong>Require status checks to pass before merging</strong>：</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/Screenshot-2021-03-12-142635.png" alt="Screenshot-2021-03-12-142635" width="600" height="400" loading="lazy"></p>
<p>如你所见，相应的 GitHub Apps 多选框也已经出现在了这里，所以剩下的唯一一件事情就是启用它们。</p>
<p>具体的构建脚本由你的生态系统、编写项目的语言、你所使用的框架等决定。因此，我不会在这里进行介绍——你需要自己检查 CI 系统的文档，了解具体细节。然而，你现在对什么是 CI 以及它是如何自动化你的 PR 有了很好的认识，让我们继续前进吧。</p>
<h3 id="cd">持续部署（CD）是如何工作的</h3>
<blockquote>
<p><em>持续部署（CD）是一个软件发布过程，它使用自动化测试来验证对代码库的更改是否正确和稳定，以便立即自动部署到生产环境中。</em></p>
</blockquote>
<p>在我们的情况中，生产环境就是程序包在包注册中心中公开可用的时候。这是一个无法返回的阶段，因为一旦发布，就不能取消发布了，因为程序包是公开可用的（因此，它可能正被使用）。</p>
<p>持续部署有多种策略，具体策略取决于项目及其复杂程度。但是在我看来，发行（release）只应该基于主干分支，因为这会让工作流变得非常简单。具体做法如下：</p>
<ol>
<li>每个 PR 要么代表一个缺陷修复，要么代表一个新功能。</li>
<li>代码在进入主干之前经过了测试（包括端到端测试）。</li>
<li>主干分支是受保护的分支，所以只要你不合并失败的 PR，它就会保持稳定。</li>
<li>每个合并到主干的 PR 都会触发主干 CI 运行，CI 最终会发布一个新版本。</li>
</ol>
<p>这将确保所有的发布都是按顺序进行的，并且可以很容易地将某些 PR 与特定的版本联系起来。</p>
<p>为了自动化程序包的发行过程，你需要做几件事情：</p>
<ol>
<li>基于提交信息自动升级版本。</li>
<li>基于提交信息自动更新 CHANGELOG。</li>
<li>自动发布程序包到公共程序包仓库。</li>
<li>自动在 GitHub 上发行。</li>
</ol>
<p>给大家带来一个好消息：语义化版本（<a href="https://github.com/semantic-release/semantic-release">semantic-release</a>）已经支持所有这些功能了。坏消息是：你需要花一些时间才能让它发挥作用（但是最终会有所回报）。</p>
<h3 id="semanticrelease">Semantic-release 是如何工作的</h3>
<blockquote>
<p><em>semantic-release 自动化整个程序包发行工作流程，包括：确定下个版本号、生成发行说明和发布程序包。</em></p>
<p><em>这消除了人类感情和版本号之间的直接联系，严格遵循 <a href="http://semver.org/">语义化版本</a> 版本规范。</em></p>
</blockquote>
<p>我们不会在这里介绍整个集成过程，因为它们有良好的文档，也没有理由在这里进行复述。不过，我还是会提几点：</p>
<ul>
<li>在你开始 Semantic Release 之前，确保你理解 <a href="https://semver.org/">语义化版本声明</a> 和 <a href="https://www.conventionalcommits.org/en/v1.0.0/">约定式提交</a> 的格式。</li>
<li>为了使 semantic-release 能够良好地工作，你应该强制执行某些提交消息格式。为此，你可以将 <a href="https://github.com/conventional-changelog/commitlint">Commitlint</a> 作为一个 <a href="https://github.com/typicode/husky">husky</a> 预提交钩子运行。当有人创建本地提交时，它将强制执行常规提交，但对于直接从 GitHub Web UI 进行的提交就无能为力了（这通常发生在有人想要快速修复他们的 PR 时）。因此，我建立你通过 <a href="https://github.com/marketplace/actions/commit-linter">commitlint GitHub Action</a> 对其进行备份。</li>
</ul>
<p>在将语义化发行设置为工作流的一部分之后，你差不多就快完成了，你不再需要在这些常规过程上花时间。尽管你还可以进行另一项优化。</p>
<h3 id="">如何保持项目的更新</h3>
<p>如果你的项目没有外部依赖，跳过这一部分。然而，大多数项目都依赖于其它程序包，而其它程序包往往会发生变化。</p>
<p>使项目保持最新的依赖关系很重要，但这很耗时。幸运的是，我们有一个解决方案。实际上，有一些，例如 <a href="https://greenkeeper.io/">Greenkeeper</a>、<a href="https://renovate.whitesourcesoftware.com/">Renovate</a> 和 <a href="https://dependabot.com/">Dependabot</a>。</p>
<p>它们的想法几乎相同，因此我只引用 Dependabot 的 “How it works” 部分：</p>
<blockquote>
<p><strong>1. Dependabot checks for updates</strong><br>
<em>Dependabot pulls down your dependency files and looks for any outdated or insecure requirements.</em></p>
</blockquote>
<blockquote>
<p><strong>2. Dependabot opens pull requests</strong><br>
<em>If any of your dependencies are out-of-date, Dependabot opens individual pull requests to update each one.</em></p>
</blockquote>
<blockquote>
<p><strong>3. You review and merge</strong><br>
<em>You check that your tests pass, scan the included changelog and release notes, then hit merge with confidence.</em></p>
</blockquote>
<p>你可能已经注意到，他只在你有能发挥作用的 CI 时才有意义。</p>
<h3 id="">小结</h3>
<p>如果你有一个全自动化的 CI/CD 闭环，并且在你的 OSS 仓库中有一个新打开的议题，你可以在几分钟内提供一个缺陷修复。</p>
<p>实际上，你可以在你的手机上进入 GitHub 移动版，修复一两行缺陷代码，然后提交。剩余的事情就自动完成了，你的客户马上就能得到一个新的版本。</p>
<p>我自己就能够快速、轻松地向客户多次提供修复版本。</p>
<blockquote>
<p><em>拥有强大的自动化能力并不是为了腾出一些时间进行休闲娱乐，而是要把时间用在真正重要的事情上，并提高响应能力。</em></p>
</blockquote>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_6k7J2Dj1iz0c901UExzjWg.jpeg" alt="1_6k7J2Dj1iz0c901UExzjWg" width="600" height="400" loading="lazy"></p>
<h2 id="">版本管理</h2>
<p>在这篇指南的最后，我想谈一谈版本管理，对于任何拥有大量用户的 OSS 项目来说，版本管理总是很重要。你将会了解到版本符号、中断性变更、向后移植，等等。</p>
<h3 id="">什么是软件版本控制？</h3>
<p>咱们来看一下维基百科对软件版本控制（software versioning）的解释吧。</p>
<blockquote>
<p><em>软件升级版本控制（Software upgrade versioning）是将唯一的版本名称或版本号分配给<a href="https://en.wikipedia.org/wiki/Computer_software">计算机软件</a>的唯一状态的一个过程。</em></p>
<p><em>现代计算机软件通常采用两种不同的软件版本控制方案进行版本跟踪——可能在一天内增长很多次的<a href="https://en.wikipedia.org/wiki/Software_versioning#Internal_version_numbers">内部版本号</a>，比如修订控制号，还有一个就是发行版本，它变化得通常没这么快，比如语义化版本<a href="https://en.wikipedia.org/wiki/Software_versioning#cite_note-semver-1">[1]</a>或<a href="https://en.wikipedia.org/wiki/Code_name#Project_code_name">项目代号</a>。</em></p>
</blockquote>
<p>确实，有很多方法可以唯一标识你的软件产品的版本。</p>
<p>最广为人知的方式就是给它起一个名字。</p>
<p>地球上的绝大多数人，甚至包含那些与技术有着间接关系的人，都可能听说过安卓的冰淇淋三明治（Ice Cream Sandwich）和棉花糖（Marshmallow）或 Mac OS 的美洲豹（Leopard），以及它的冷冻表亲雪豹（Snow Leopard），还有 Big Sur。</p>
<p>程序员可能听过 Eclipse 及其天体版本 Luna、Mars 和 Photon。</p>
<p>所有这些都是软件产品的大版本号。</p>
<p>尽管名字非常适合市场营销，但是它们有时候也会让人感到困惑。</p>
<p>实际上，谷歌已经在它们的安卓版本名字中取消了对糖果的使用，因为它们：</p>
<blockquote>
<p><em>多年以来都听到用户在反馈：这些名字总是不能让全球社区中的每个人都有直观的理解。</em></p>
</blockquote>
<p>没错，但也许只是我们还没进化到从动物种类推断出版本号的程度，尽管雪豹（Snow Leapard）比美洲豹（Leopard）要酷很多。</p>
<p>天体和糖果都是比较容易理解的概念，但前提是你必须按照字母的出现顺序命名（像安卓和 Eclipse 这样）。但是有一点可以肯定——没有什么方法能够比数字更好地确定连续的情况。</p>
<p>因此，如果你将你的软件产品的第一个版本命名为“Product 1”，将第二个版本命名为“Product 2”，那么就可以很直观地说第二个版本是最新的，不是吗？</p>
<p>然而，不同于不暴露 API 的独立软件产品，那些被其他软件（比如 OSS 产品主体部分）使用的软件需要更好的版本控制，而不仅仅是一串数字。</p>
<p>例如，如果我们用一个简单的数字序列进行版本控制，用户如何能区分出缺陷修复和中断现有 API 的变更呢？</p>
<p>答案就是……语义化版本。</p>
<h3 id="">什么是语义化版本？</h3>
<p>语义化版本（又称 SemVer）是一个广泛采用的版本管理方案，它使用格式为 <code>MAJOR.MINOR.PATCH</code> 的三位数字序列。</p>
<p>规则很简单——给定一个版本号 <code>MAJOR.MINOR.PATCH</code>，分别在不同的情况下递增不同的版本：</p>
<ul>
<li>当你进行了不兼容的 API 变更时，递增 <code>MAJOR</code> 版本</li>
<li>当你以向后兼容的方式添加了一个功能时，递增 <code>MINOR</code> 版本</li>
<li>当你进行了向后兼容的缺陷修复时，递增 <code>PATCH</code> 版本</li>
</ul>
<p>预发行和构建元数据的其他标签可以作为 <code>MAJOR.MINOR.PATCH</code> 格式的扩展使用。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/versioning.png" alt="versioning" width="600" height="400" loading="lazy"></p>
<p>它提供了一种简洁明了的方式，来将软件产品中的变更传递给你的用户。</p>
<p>但是最重要的是，它被所有种类的包管理器和构建工具（比如 <a href="https://docs.npmjs.com/about-semantic-versioning#using-semantic-versioning-to-specify-update-types-your-package-can-accept">NPM</a> 和 <a href="https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm#MAVEN8903">Maven</a>）广泛使用，这些工具允许用户依赖 <em>某个范围内</em> 的版本，而不是某个特定的版本。</p>
<p>例如，声明版本区间 <code>^2.2.1</code> 而不是显式的版本号 <code>2.2.1</code> 将会让用户接受任何向后兼容的缺陷修复或将会在 <code>2.2.1</code> 版本之上发布的新功能。</p>
<p>也就是说，构建工具和包管理器依赖用户和包的所有者之间的约定——这个约定是由 SemVer 定义的。</p>
<p>那意味着你要全权负责——你就是那个给中断性变更和小型变更下定义的人。你可以不小心将一个中断性变更作为缺陷修复（补丁版本）发布，并且它<em>将会</em>破坏依赖某个范围的构建。</p>
<p>破坏构建是一件非常恐怖的事情，所以我推荐你使用带有预定义消息格式的 <code>semantic-release</code> 和提交格式的强制工具。</p>
<p>你可以在 <a href="https://semver.org/">Server.org</a> 的官网找到更多有关语义化版本的信息。</p>
<p>既然我们已经学了如何<em>识别</em>中断性变更，我们就来聊聊如何<em>引入</em>它们吧。</p>
<h3 id="">如何管理中断性变更</h3>
<p>中断性变更（breaking change）是那些对公开 API 的变更，这些变更以不兼容的方式移除、重命名或更改了你与用户之间的约定。</p>
<p>理想情况下，你将会在你的代码中保持向后兼容，并且永远不会引入中断性变更。但是，你会意识到现实的残酷的。</p>
<p>软件在不断演进，你的代码也是。用户的需求会变，你的 API 也会变。你作为一名开发者在成长，你的产品也在成长。</p>
<p>因此，特别是作为一个不拿工资的开源开发者，你就是不能容许你自己维护的项目中存在的所有遗留代码。有时，你需要移除它们。</p>
<p>问题是如何移除？</p>
<p>与往常一样，需要进行权衡。你会更清楚这个或其它的变更对用户的影响。</p>
<p>你不必不惜代价地保持向后兼容，也不必在每个旧版本中实现所有的新功能。但是，这毫无疑问是你<em>应该</em>考虑到的事情。</p>
<p>如果用户的迁移成本比较低，那么进行中断性变更是可以的，在较老的版本中不支持这个功能也很合理。</p>
<p>然而，如果迁移成本很高，绝大多数用户无法承担的话，你或许应该先考虑让这个变更向后兼容，然后发布一个废弃警告。</p>
<p>废弃警告通常和新的 API 一起发布，旧的 API 仍然受到支持。这样一来，用户就有时间进行迁移。在他们完成迁移之后，你就可以再下个大版本中安全地移除废弃警告和旧的 API 了。</p>
<p>无论如何，不管你何时引入中断性变更，都要确保有一份迁移指南，包含迁移的每一步。</p>
<p>此外，出于礼貌，你最好给用户留下为中断性变更做准备的时间，尤其是在没有宽限期的情况下（新旧 API 都支持）。</p>
<p>一个解释中断性变更、其背后的原因以及预期的时间范围的预先通知是非常有用的。这个通知可以是一条推特、一篇博客文章，甚至是任何带有废弃警告的新的小版本。</p>
<p>记住，虽然中断性变更基本上是一个负面体验，但是一个<em>突然</em>的中断性变更却是一个<em>非常</em>负面的体验。</p>
<h3 id="">自动迁移</h3>
<p>我们可以将中断性变更分为两类——非确定性（non-determinstic）变更与确定性（determinstic）变更。</p>
<p>非确定性变更是指那些你无法预测迁移工作结果的变更，比如将某个 API 的特定部分完全移除。</p>
<p>在这种情况下，由用户自己决定是否要用第三方库替换它、自己实现它。</p>
<p>确定性变更是指那些给定代码 <code>X</code> 和用户输入 <code>I</code>，允许你将其转变为代码 <code>Y</code> 的变更（即通过输入可以明确地知道输出）。比如，改变函数名或者导入语句。</p>
<p>如果你引入了一个确定的中断性变更，你可以编写一个自动化程序，修改用户的代码库，并将其调整为新的 API。</p>
<p>有了这种自动化，你就不必担心向后兼容和详细的迁移指南了。你给用户提供一种不需任何努力就能升级他们代码的方式，这对软件更新至关重要。</p>
<p>然而，这里也存在固有的权衡。写代码需要花时间，就像编写迁移指南一样。当然，编写将复杂代码流迁移到新 API 的代码比编写替换函数名的代码花费更多的时间。</p>
<p>有时，你并不能负担起这个时间。</p>
<p>如果你决定这么做，有一些工具可以帮你实现目标。</p>
<p>其中最广为人知且语言无关的就是 Facebook 的 <a href="https://github.com/facebook/codemod">Codemode</a>。</p>
<blockquote>
<p><em>codemod 是一个工具/库，可以帮助你重构大规模代码库，重构可以部分自动化，但仍然需要人工监督和偶尔干预。</em></p>
</blockquote>
<p>还有一些更加复杂的工具，它们使用 <a href="https://en.wikipedia.org/wiki/Abstract_syntax_tree">抽象语法树（AST）</a>，可以用于更加复杂的任务，而不仅仅是查找并替换。</p>
<p>例如，Facebook 的另一个库（只适用于 JS/TS）被称为 <a href="https://github.com/facebook/jscodeshift">JSCodeShift</a>。或者 <a href="https://github.com/ranyitz/code-migrate">code-migrate</a>——一个允许你比较容易地编写迁移指南的工具（还是只适用于 JS/TS），为用户提供一个漂亮的基于命令提示符的 CLI 界面。</p>
<p><img src="https://www.freecodecamp.org/news/content/images/2021/03/1_aFlF8Vx0-thA0EutbBgiUA.png" alt="1_aFlF8Vx0-thA0EutbBgiUA" width="600" height="400" loading="lazy"></p>
<p>一些大型 OSS 项目甚至有他们自己的解决方案。其中有一个例子就是 <a href="https://angular.io/guide/schematics">Angular schematics</a> ——一个基于模板的代码生成器，支持复杂逻辑。</p>
<p>自动代码迁移可以作为一个单独的程序包（比如 <code>my-cool-oss-migrate-v4-v5</code>）发布，并作为迁移指南中的一个步骤被提到。</p>
<p>另外，迁移可以是包含中断性变更的大版本的一部分，可以在用户在代码库中安装该版本后执行。具体由你决定。</p>
<h3 id="">移植</h3>
<p>另一个惯例就是将重要的变更移植到以前的版本中。例如，在某个主要发行版本（此版本包含中断性变更）之后发现了一个严重缺陷，但是这个缺陷也存在于之前的版本中。</p>
<p>这时，你不能指望用户们因为这一个缺陷就去进行繁琐的迁移。相反，检出老的修订版本，在它的上面进行修复，然后以该老版本的小版本发行，可能会很复杂。</p>
<blockquote>
<p><em>解决方案：为每个大版本建立一个受保护的分支。</em></p>
</blockquote>
<p>每当你计划发行一个大版本时，就从主分支创建出一个命名为 <code>c.x.x</code> 的分支，其中 <code>c</code> 就是当前的大版本号。把所有这样的分支设置为受保护的分支（就像主分支一样），这样你就不会在不经意间破坏到它们。然后，在你不得不从一个新的大版本中移植某个功能或缺陷修复的任何时候，你可以在这个分支上重新实现它，也可以（如果可能的话）从主分支挑选（cherry-pick）对应的提交。</p>
<p>此外，有一个策略值得一提：为<em>下一个</em>大版本创建一个单独的分支（而不是只为之前大版本创建分支）。</p>
<p>这通常适用于大规模项目（比如 Webpack 或 Babel），这些项目在每个新的大版本中多有很多的变更。</p>
<p>为即将到来的大版本建立一个单独的分支允许在其上开展工作，并将其发布进行测试，同时仍然将最相关的版本（在其上开展工作）保留在主分支。</p>
<p>新版本发布之后，它的分支就成为主分支，下个大版本的新分支也会被创建。</p>
<h2 id="">最后的想法</h2>
<p>我希望你喜欢这篇指南，现在已经对拥有一个开源项目意味着什么有了一个更好的理解。</p>
<p>最后，我想和大家分享一件事，在拥有一个开源项目时，你应该使用牢记。</p>
<h3 id="">倾听用户的声音</h3>
<p>这听起来可能有点违反直觉，但事实就是这样——你并不是唯一一个定义路线图的人，用户也定义了它。实际上，用户定义了路线图的绝大部分。</p>
<p>如果你拥有一个开源项目，你维护它的目的是为了帮助他人，而不是你自己。</p>
<p>准备多个反馈渠道。有些用户只有一个快速的问题，你可以在一秒钟内给出答案。</p>
<p>也有潜在的贡献者想要讨论路线图，但是他们又不想公开讨论，那么给他们一个联系你的途径。提供一个 Slack 或 Discord 的链接，分享你的 Twitter 账户，等等。渠道越多越好。</p>
<p>说到渠道，如果你有任何问题或想法，可以随时在 <a href="https://twitter.com/_Just_JeB_">Twitter</a> 上直接给我发消息。</p>
<!--kg-card-end: markdown--><p>原文：<a href="https://www.freecodecamp.org/news/ultimate-owners-guide-to-open-source/">How to Be a Good Open Source Project Owner – The Ultimate Guide</a>，作者：<a href="https://www.freecodecamp.org/news/author/jeb/">JeB Barabanov</a></p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
