<?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" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Nikita Klimov on Medium]]></title>
        <description><![CDATA[Stories by Nikita Klimov on Medium]]></description>
        <link>https://medium.com/@engineerklimov?source=rss-9b88d8404fc9------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*Vz6Cmwk9_QSuXRSQRnizWg.jpeg</url>
            <title>Stories by Nikita Klimov on Medium</title>
            <link>https://medium.com/@engineerklimov?source=rss-9b88d8404fc9------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 03:44:16 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@engineerklimov/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Contribute to (OSS) Open Source Software]]></title>
            <link>https://medium.com/@engineerklimov/contribute-to-oss-open-source-software-56290ef6ebaa?source=rss-9b88d8404fc9------2</link>
            <guid isPermaLink="false">https://medium.com/p/56290ef6ebaa</guid>
            <category><![CDATA[developer-path]]></category>
            <category><![CDATA[improve-yourself]]></category>
            <category><![CDATA[resume-straightening]]></category>
            <category><![CDATA[open-source-contribution]]></category>
            <category><![CDATA[make-world-a-better-place]]></category>
            <dc:creator><![CDATA[Nikita Klimov]]></dc:creator>
            <pubDate>Fri, 06 Dec 2024 23:02:14 GMT</pubDate>
            <atom:updated>2024-12-06T23:02:14.837Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="AI generated image representing group of people working on open-source project" src="https://cdn-images-1.medium.com/max/1024/1*GhQrtL7OC08-KIqJqdwfRQ.png" /><figcaption>- AI point of view on open source contribution</figcaption></figure><p>We all use OSS, and, more importantly, most of the software we rely on is built on OSS. A typical part of development involves picking packages from platform sources like npm if you’re working on a JavaScript program, and adding some light glue code to make everything work together. This approach stems from one of the core principles of software development: “DRY” — don’t repeat yourself. Developers aim to reuse as much code as possible to avoid reinventing the wheel.</p><p>However, because so many developers have already done this work, finding opportunities to contribute can feel like searching for a needle in a haystack. And when you do find a gap, it’s often daunting to share your work in public, especially on projects already trusted and used by many.</p><p>This challenge is real, even for developers with several years of experience (middle or senior level), or experts from adjacent fields who have never contributed directly to OSS. But that shouldn’t stop you.</p><p>Another thing that pushed me to explore OSS contributions was insight from colleagues. A good friend of mine, who works in HR, and a developer who frequently conducts technical interviews, both emphasized how rare and impactful OSS contributions are. They told me that showcasing public work almost always sparks curiosity in interviews. It’s a great way to steer the conversation toward your strengths and make a lasting impression — even if you’re less confident in other areas.</p><p>Contributing to OSS might feel like a steep climb, but it’s worth the effort. It not only enhances your resume but also gives you valuable experience. Many developers have pet projects, but few have the courage to put them in the spotlight. This guide will help you take that first step.</p><h3>Choosing a Technology and Project</h3><p>From a practical perspective, it’s best to stick with popular technologies. Larger communities mean more solved edge cases, a wider range of tools, and better documentation. It’s still humans writing code, and more people means more shared knowledge.</p><p>According to <a href="https://github.blog/news-insights/octoverse/octoverse-2024/">GitHub 2024 Octoverse</a>, Python has surpassed JavaScript as the most popular language.</p><figure><img alt="Top programming languages on GitHub. Ranked by count of distinct users contributing to projects of each language." src="https://cdn-images-1.medium.com/max/1000/1*QJ2kE_1IPiyEaPxFxQgtIw.png" /></figure><blockquote>“There are three kinds of lies: lies, damned lies, and statistics.” — Mark Twain<br>“TypeScript (TS) is a superset of JavaScript (JS), developed and maintained by Microsoft as an open-source programming language.” — Google</blockquote><p>TypeScript is essentially extended JavaScript — it’s like English text with commas. You can write without commas, and it will still be English text, just less structured.</p><p>Looking at the chart, JavaScript and TypeScript might seem like two separate entities, but they’re really two forms of the same language. Together, they dominate the ecosystem. So, I wouldn’t say Python has truly beaten JavaScript.</p><p>With this in mind, my choice for OSS contribution is JavaScript and NodeJs as a platform. My primary area of expertise is accessibility tools, and I’m also a software tester. Naturally, I decided to contribute to an accessibility tool related to testing, written in JavaScript. I already knew about <a href="https://github.com/dequelabs/axe-core">axe-core</a>, which made it an easy decision.</p><p>You might think this reasoning is too smooth, especially since I’m skipping over the research phase. And you’re not wrong — I already had a target project in mind. That said, I still recommend carefully evaluating a project’s learning curve before committing. Otherwise, you might lose motivation halfway through.</p><h3>Tools and Basics</h3><p>Before diving in, you’ll need to learn some basics. Here’s what you’ll need:</p><ul><li><strong>Git</strong>: <em>Version control system</em></li><li><strong>JavaScript</strong>: <em>Programming language</em></li><li><strong>NodeJs</strong>: <em>JavaScript runtime</em></li><li><strong>Npm</strong>: <em>JavaScript package manager</em></li><li><strong>VSCode</strong>: <em>Integrated development environment</em></li></ul><p>Follow the official guides to download and install these tools on your PC.</p><p>From my experience, the best way to learn something is by doing. Some tools, like VSCode, are very intuitive. You won’t need hours of tutorials to figure out how to chop a stick with an axe — though you might lose a finger or two in the process. ;)</p><h3>Git</h3><p>Git is essential for committing your changes to the source code. The good news is, you don’t need to become a Git master to contribute. Just understanding the basic principles of version control systems will be enough. Think of it as editing text files with a group of other people — Git helps you synchronize everyone’s work.</p><h3>VSCode</h3><p>Notepad is fine for basic edits, but serious development requires more tools. VSCode is an integrated development environment that brings everything together. It makes navigating and searching through code easy and offers features like syntax highlighting and text formatting. Plus, you can avoid using the Git command line entirely.</p><h3>JavaScript</h3><p>You should have a basic understanding of variables, loops, and functions. But don’t stress — there are plenty of tools to help you. Personally, I like using Co-Pilot for code suggestions.</p><h3>NPM and NodeJs</h3><p>To avoid rewriting the same code over and over, developers rely on existing libraries. Tools like NPM (Node Package Manager) simplify sharing and reusing code. In our case, NPM comes bundled with NodeJs.</p><p>Think of it like climbing a tree of dependencies. At the top of the tree is your project, but beneath it lies a web of libraries and their own dependencies, each layer building on the one below. You keep climbing down until you reach the very foundation — the runtime platform code. This structure saves time and effort, letting you focus on higher-level logic instead of reinventing basic functionality.</p><p>However, this tree isn’t always safe. Somewhere deep in its roots, there could be a package with malicious code. This type of risk is called a supply chain attack, and it’s a challenge every developer should be mindful of.</p><figure><img alt="Picture represents dependency of a enterprise code on a very small open-source project" src="https://cdn-images-1.medium.com/max/385/1*phzYGwXBMGUyk9Hc8l2rgA.png" /></figure><h3>Discover Chosen Project</h3><p>First of all, you need a GitHub account; these days, it’s like Facebook for developers. I already have one: <a href="https://github.com/engineerklimov">https://github.com/engineerklimov</a>. The next step is to create a copy of the project repository — this is called a “fork.”</p><h3>Step 1: Fork and Clone the Repository</h3><ol><li>Open the project’s GitHub page (e.g., <a href="https://github.com/dequelabs/axe-core">axe-core</a>).</li><li>Click the Fork button in the top-right corner. This creates a copy of the repository in your GitHub account.</li><li>Open VSCode and go to the Source Control tab.</li><li>Click Clone Repository and choose Clone from GitHub or paste the URL of your fork.</li><li>Select a local folder where the code will be saved.</li></ol><figure><img alt="Picture shows active VS Code application" src="https://cdn-images-1.medium.com/max/1024/1*pRVq91T-QQq6lNIOAUKQjg.png" /><figcaption>VS Code application window example</figcaption></figure><h3>Restore Packages and Build the Project</h3><p>Once the project is cloned, you need to set up its dependencies and build it. Dependencies in JavaScript projects are managed using a package manager, in this case, NPM. The package.json file lists all the dependencies required to run, build, or test the project.</p><p>As I mentioned earlier, dependencies form a tree structure, where your project relies on libraries, and those libraries rely on others. However, not all projects handle dependencies the same way. The developers of axe-core have taken an exceptional approach: they reduced all production dependencies to zero. This means the dependencies section in package.json is empty, and everything the library needs for production has been implemented directly in the code.</p><p>Instead, all external libraries are listed under devDependencies, which are only used during development or testing. This is not a common practice, as many libraries depend on third-party packages in production. By doing this, axe-core avoids risks like bloated builds or vulnerabilities in deep dependencies, making the library both lightweight and secure.</p><p>Here’s how to set everything up:</p><ol><li>Open the terminal in VSCode (View &gt; Terminal).</li><li>Run the following commands:</li></ol><ul><li>Restore dependencies:</li></ul><pre> npm install</pre><p>Build the project:</p><pre>npm run build</pre><p>The npm install command downloads all the necessary development dependencies and sets up the project. After running it, you should see an output like this:</p><figure><img alt="npm output" src="https://cdn-images-1.medium.com/max/767/1*3j2RuPf4poLdUsRetH5HtA.png" /><figcaption>npm</figcaption></figure><p>The npm run build command compiles the project and prepares it for use. A successful output will look like this:</p><figure><img alt="npm build" src="https://cdn-images-1.medium.com/max/884/1*uyEq4oOvu1qIzX1nf7JFyQ.png" /><figcaption>npm</figcaption></figure><h3>Find Contribution Target</h3><p>Where should you look for a task to contribute to? Here are the three best options:</p><h3>Repository Issues</h3><p>Repository issues are like the project’s to-do list. They include reported bugs, feature requests, and other tasks. Most projects use labels to categorize issues. For example, in <a href="https://github.com/dequelabs/axe-core">axe-core</a>, you’ll find labels like good first issue or help wanted. These are more beginner-friendly and a great place to start.</p><p>Earlier, during my search, I found a good first issue that was well described. The maintainers pointed to specific files and explained what needed to be done, which made it a great starting point for understanding the project’s structure.</p><p>However, while continuing to explore, I came across an even better fit for me: updating a localization file. This task required less technical knowledge and seemed like the perfect opportunity to make my first contribution to the project. I decided to set aside the initial issue as a backup and focused on the localization task instead, as it allowed me to dive right in without overthinking the technical details.</p><h3>Past Contributions from Non-Maintainers</h3><p>Another great way to find ideas is by reviewing <a href="https://github.com/dequelabs/axe-core/pulls?q=is%3Apr+is%3Aclosed">closed pull requests</a>. Look for contributions from people outside the maintainer team, as these are more likely to be beginner-friendly.</p><p>For example, I found a localization PR: <a href="https://github.com/dequelabs/axe-core/pull/4525">chore: Update locale de.json</a>. Localization tasks often involve adding or improving translations, making them an excellent entry point for new contributors.</p><p>Localization is typically designed as a “serial task”: you can look at existing localization files and use them as templates to create or update translations for other languages. This consistency is intentional — it allows translation work to remain isolated from the rest of the code. By keeping translations in dedicated files, projects make it easier for non-technical contributors, such as translators, to work on them without needing to understand the technical details of the project.</p><p>I also found clear instructions in the project’s documentation, which guided me through the steps to add a new locale. This approach isn’t unique to axe-core — many projects handle localization in a similar way. So, if you’re looking to contribute to other projects, localization is a task worth considering, especially if you’re just starting out.</p><h3>Prepare a Pull Request</h3><p>Let’s add a new locale for axe-core. Before starting, ensure you’ve already forked the repository as described earlier. In your fork, you have two options for working on your changes:</p><h3>Option 1: Work Directly in main</h3><p>You can make changes directly in the main branch of your fork. After committing your changes, you can open a pull request from your fork’s main branch to the original repository.</p><p>This method is straightforward but has some drawbacks:</p><ul><li>Any new commits to main will be included in the pull request, which can make it harder to isolate specific changes.</li><li>If you want to work on multiple tasks, managing them in main can become messy.</li></ul><h3>Option 2: Create a New Branch (Recommended)</h3><p>Creating a separate branch for your changes is a better practice. Here’s how to do it:</p><ol><li>Open the project in VSCode.</li><li>Click on the current branch name (e.g., main) in the bottom-left corner.</li><li>Select Create New Branch, type a meaningful name (e.g., add-ru-locale), and press Enter.</li></ol><p>This approach keeps your changes isolated and makes it easier to collaborate and respond to feedback during the pull request review process.</p><figure><img alt="Process of making branch at VS Code window" src="https://cdn-images-1.medium.com/max/1024/1*lPYHqpcYVs4_nKq29Rnu2A.png" /><figcaption>Making branch in VS Code</figcaption></figure><h3>Important Notes on Branch Names</h3><p>When naming branches, avoid using spaces or special characters. Stick to alphanumeric characters, dashes (-), or underscores (_). Special symbols can cause compatibility issues in version control systems or build pipelines.</p><p>Now that you’ve chosen your approach and prepared your workspace, you can proceed to make the necessary changes for your contribution.</p><h3>Step 2: Make Changes</h3><p>For axe-core, I followed the project’s instructions to generate a new locale file by running:</p><pre>npx grunt translate --lang=ru</pre><p>This created a new ru.json file in the locales folder. My task was to translate all the English text into Russian. Automated translation tools helped speed up the process, but I manually reviewed everything to ensure accuracy.</p><h3>Step 3: Commit and Push Changes</h3><ol><li>Go to the Source Control tab in VSCode.</li><li>Stage your changes by clicking the + button next to the modified files.</li><li>Add a commit message, like Add Russian locale, and click Commit.</li><li>Push your changes to the remote repository by clicking the Sync Changes button in the bottom-right corner.</li></ol><h3>Step 4: Submit a Pull Request</h3><p>Once your changes are pushed, open your forked repository on GitHub and click Compare &amp; Pull Request. Add a clear title and description explaining your changes, then submit the pull request.</p><figure><img alt="Prcoess of preparing PR on the picture" src="https://cdn-images-1.medium.com/max/1024/1*NoBlWCxkPi36KOtQS5y1Aw.png" /><figcaption>PR preparation</figcaption></figure><h3>Maintainers’ Review and Merge</h3><p>Submitting the pull request is only half the work. The review process can be challenging, as maintainers might request changes or raise questions. Here’s how to navigate it:</p><ol><li>Be Patient: Reviews take time, especially for large or non-critical changes.</li><li>Respond Quickly: If maintainers request changes, address them promptly to keep the process moving.</li><li>Be Polite and Clear: If you disagree with feedback, explain your reasoning respectfully.</li></ol><p>For my localization task, the review process was straightforward. A maintainer requested a small adjustment, which I completed quickly. However, some automated tests failed due to unrelated issues in the pipeline. Thankfully, the maintainer merged my changes anyway, and they were included in the next release.</p><h3>Bonus: Scaling Your Contribution</h3><p>While working on the translation task, I noticed that several locales were outdated. This is a common problem in OSS projects, as text changes often go unchecked by automated tools. You can make a meaningful impact by updating translations or fixing small inconsistencies.</p><p>Take axe-core as an example: it’s downloaded 16 million times per week. Even a minor contribution like improving translations can help thousands of developers and users. So, don’t underestimate the value of small but meaningful changes.</p><h3>Final Thoughts</h3><p>Contributing to OSS might seem intimidating at first, but it’s a rewarding experience. Start small, be consistent, and remember: even a tiny improvement can make a big difference in the world of open-source software.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=56290ef6ebaa" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>