Hacktoberfest 2023: How We Merged Open Source Contributions with Learning Objectives
As a company, one of our core values is to be “open by default.” At the same time, one of our goals is to use our open source investment time as a way to improve our skills as engineers and designers.
In that spirit, this year we decided to organize our open source contribution time in a way that wasn’t limited to our own open source projects. This is a short post to explain how we aligned our open source contributions with our learning goals, what contributions we made, and why it mattered.
Our Motivation
Last year, as a company, we did an exercise in participating in Hacktoberfest with our team. There were positive and negative notes but, overall, feedback around the exercise itself was positive.
This year we had specific goals and topics we wanted to focus on as a team. We decided to use open source projects as a way to learn and practice while also contributing to the community.
Therefore, this year we aligned our open source contributions with our learning purposes. As a part of our company, we conduct monthly one-on-one calls with our full-time employees. In those calls, we learn about areas and skills that our direct reports would like to improve.
The problem is that sometimes client work doesn’t give us the opportunities we need to work on said skills.
That’s why we decided to use the month of October to contribute to open source projects with the following intentions:
-
For senior engineers: We wanted them to improve their upgrading and debugging skills, so that they could improve their skills when it comes to fixing medium to high complexity bugs.
-
For mid-level engineers: We wanted them to work on features so that they could improve their skills when it came to greenfield-like projects.
Hacktoberfest Plan
This year we decided not to restrict contributions to repositories that were officially participating in Hacktoberfest .
We asked everyone to suggest repositories before we started and we quickly came up with a list of approved projects.
Senior engineers were asked to work on two kinds of issues: technical debt and bugs.
Mid-level engineers were asked to work on any kind of issue they found interesting, with a focus on new features or feature changes.
To organize that:
- We divided everyone into pairs.
- Each pair was asked to select issues from the list of approved projects.
Our Teams
This time we decided to split in teams:
Our Own Open Source Projects
When it came to our own projects, we decided to have only Ariel and Ernesto’s team work on open source projects maintained by OmbuLabs .
We focused on these projects:
- skunk : A tool to find the most complicated code without test coverage
- upjs-plato : JavaScript source code visualization, static analysis, and complexity tool
- depngn : A CLI tool to find out if your dependencies support a given version of node
- next_rails : A toolkit to upgrade your next Rails application
Approved Projects
We wanted to make sure that our teams focused on projects that were approved by our engineering management team. The list included some well-known and really useful tools that we’ve been using for years:
- https://github.com/whitesmith/rubycritic
- https://github.com/lsegal/yard
- https://github.com/Shopify/ruby-lsp
- https://github.com/freeCodeCamp/devdocs
- https://github.com/lobsters/lobsters
- https://github.com/jekyll/jekyll
- https://github.com/excid3/madmin
- https://github.com/troessner/reek
- https://github.com/rubyforgood/pet-rescue
Contributions
In terms of contributions, we considered activity on pull requests and issues as a valid contribution. We understand that sometimes you are looking to add value to an open source project, and after hours of research and trying many different things, all you can add is a comment to an existing issue. In our exercise, and in general, that counts as a contribution too!
Issues
Here are all the issues where we added value:
- https://github.com/whitesmith/rubycritic/issues/413 (Rishi)
- https://github.com/lsegal/yard/issues/1514 (Mateus)
- https://github.com/rubyforgood/casa/issues/4123 (Aysan + Fiona)
- https://github.com/rubyforgood/pet-rescue/issues/258 (Aysan + Fiona)
- https://github.com/ruby/rdoc/issues/1015 (Mateus)
- https://github.com/whitesmith/rubycritic/issues/154 (Rishi)
- https://github.com/rubyforgood/pet-rescue/issues/272 (Aysan + Fiona)
- https://github.com/Growstuff/growstuff/issues/2363 (Aysan + Fiona)
- https://github.com/openfoodfoundation/openfoodnetwork/issues/11600 (Aysan + Fiona)
- https://github.com/ruby/prism/issues/1738 (Mateus)
- https://github.com/shardlab/discordrb/issues/239 (Rishi)
Pull requests
Here are all the pull requests we submitted:
- https://github.com/rubyforgood/pet-rescue/pull/312 (Gelsey)
- https://github.com/rubyforgood/casa/pull/5284 (Aysan + Fiona)
- https://github.com/rubyforgood/pet-rescue/pull/288 (Aysan + Fiona)
- https://github.com/rubyforgood/casa/pull/5273 (Aysan + Fiona)
- https://github.com/upgradejs/upjs-plato/pull/5 (Ariel)
- https://github.com/upgradejs/upjs-plato/pull/6 (Ariel)
- https://github.com/upgradejs/upjs-plato/pull/3 (Ariel)
- https://github.com/fastruby/fast-ruby/pull/221 (Ariel + Ernesto)
- https://github.com/fastruby/next_rails/pull/112 (Ariel)
- https://github.com/fastruby/dotenv_validator/pull/67 (Ariel)
- https://github.com/fastruby/dotenv_validator/pull/66 (Ariel)
- https://github.com/fastruby/benchmark-ips/pull/1 (Ariel + Ernesto)
- https://github.com/fastruby/benchmark.fyi/pull/13 (Ernesto + Ariel)
- https://github.com/fastruby/benchmark.fyi/pull/16 (Ariel)
- https://github.com/fastruby/benchmark.fyi/pull/15 (Ariel + Ernesto)
- https://github.com/fastruby/skunk.fyi/pull/103 (Ariel)
- https://github.com/jekyll/jekyll/pull/9459 (Juan)
- https://github.com/excid3/madmin/pull/177 (Juan)
- https://github.com/freeCodeCamp/devdocs/pull/2071 (Juan)
- https://github.com/lobsters/lobsters/pull/1213 (Juan)
- https://github.com/lobsters/lobsters/pull/1214 (Juan)
- https://github.com/lobsters/lobsters/pull/1217 (Juan)
- https://github.com/troessner/reek/pull/1736 (Juan)
- https://github.com/troessner/reek/pull/1737 (Juan)
- https://github.com/troessner/reek/pull/1738 (Juan)
- https://github.com/troessner/reek/pull/1745 (Juan)
- https://github.com/troessner/reek/pull/1740 (Juan)
- https://github.com/troessner/reek/pull/1744 (Juan)
- https://github.com/troessner/reek/pull/1746 (Juan)
- https://github.com/troessner/reek/pull/1747 (Juan)
- https://github.com/freeCodeCamp/devdocs/pull/2080 (Mateus)
- https://github.com/troessner/reek/pull/1747 (Mateus)
- https://github.com/Shopify/ruby-lsp/pull/1148 (Mateus)
- https://github.com/whitesmith/rubycritic/pull/473 (Rishi)
- https://github.com/whitesmith/rubycritic/pull/471 (Rishi)
- https://github.com/whitesmith/rubycritic/pull/470 (Rishi)
- https://github.com/whitesmith/rubycritic/pull/468 (Rishi)
- https://github.com/whitesmith/rubycritic/pull/476 (Rishi)
- https://github.com/whitesmith/rubycritic/pull/474 (Rishi)
- https://github.com/whitesmith/rubycritic/pull/466 (Francois)
- https://github.com/whitesmith/rubycritic/pull/467 (Francois)
- https://github.com/troessner/reek/pull/1749 (Francois)
- https://github.com/troessner/reek/pull/1741 (Francois)
Investment Time
In total during the month of October we invested 392 hours in our open source contributions. That represents an investment of $79,000 into open source by 10 of our senior and mid-level engineers.
Next Steps
We plan to take all of our contributions across the finish line, using our regular, monthly and paid open source investment time. Outside of Hacktoberfest, on average, as a team we invest 38 hours per month on open source contributions.
We look forward to continuing our investment in the open source projects that add value to the world and our communities. We believe this is the way to hone our craft, learn new things faster, and become better professionals.