<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: mrick</title>
    <description>The latest articles on DEV Community by mrick (@mrick).</description>
    <link>https://dev.to/mrick</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F648943%2Faba7e080-25d0-4f1f-a227-936e3cf0c025.png</url>
      <title>DEV Community: mrick</title>
      <link>https://dev.to/mrick</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mrick"/>
    <language>en</language>
    <item>
      <title>A Practical Guide to Growing Your Open Source Project: Part 1 – Contributors</title>
      <dc:creator>mrick</dc:creator>
      <pubDate>Tue, 10 Aug 2021 01:38:20 +0000</pubDate>
      <link>https://dev.to/mrick/a-practical-guide-to-growing-your-open-source-project-part-1-contributors-pj4</link>
      <guid>https://dev.to/mrick/a-practical-guide-to-growing-your-open-source-project-part-1-contributors-pj4</guid>
      <description>&lt;p&gt;&lt;em&gt;This post originally appeared in my free daily newsletter on startups and engineering.&lt;br&gt;
You can join 200+ subscribers here: &lt;a href="https://matt-rickard.com/subscribe/"&gt;https://matt-rickard.com/subscribe/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Open-source is great for engineers. It allows us to share our work and collaborate with people from around the world. But what if nobody else shows up?&lt;/p&gt;

&lt;p&gt;Getting traction and growing an open-source project is really, really difficult. I know because I've spent the last few years doing that. I've been an open-source maintainer of minikube (21k stars), skaffold (11.5k stars), kubeflow (10.6k stars), distroless (10.2k stars), and active within the Kubernetes (79k stars) and Docker (60k stars) communities.&lt;/p&gt;

&lt;p&gt;I'm going to tell you practical tips that you can use today to bring on more contributors, more users, and to develop a more vibrant community for your open-source project.&lt;/p&gt;

&lt;p&gt;These tips are based on my own experience growing open source projects – things that I did that worked, or mistakes I made.&lt;/p&gt;

&lt;p&gt;Part one is about growing the contributor base.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Make it dead easy to contribute.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We have a cognitive bias that we like things more if we feel like we had a part in building them (read: &lt;a href="https://matt-rickard.com/the-ikea-effect-in-software/"&gt;The IKEA Effect in Software Development&lt;/a&gt;). Despite this cognitive bias, most projects unwillingly make it difficult for outside contributors. Contributor onboarding can't be an afterthought. Here's how to make contributing to your project dead easy.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The build script should be one-step and with minimal dependencies.&lt;/strong&gt; Complex toolchains and environment dependencies mean friction. For skaffold, the build process was entirely dockerized – new contributors didn't have to spend time setting up their environment. No more of "but it worked on my machine".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The test script should be one-step and be as close as possible to what runs in CI.&lt;/strong&gt; When the tests pass locally, but CI runs something entirely different, contributors churn. Make sure that the test command is easy to run, something like make test or ./test.sh, and that it runs all the unit, integration, and linting tasks.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reduce flakes, or false negatives, in CI.&lt;/strong&gt; The worst feeling is when a contributor painstakingly checks that their code conforms to the project's standards and tests, only to see CI fail miserably. How do they debug that? Nobody wants to debug someone else's CI system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accept contributions, even if you have to fix them up later.&lt;/strong&gt; Onboarding contributors is an exercise in mentorship. You'll have to dedicate time upfront as these users learn the codebase and project style. This takes time. Sometimes, features need to get merged before a pull request can be fully iterated. Pull requests that are open too long become difficult to merge – my law of pull requests – &lt;a href="https://twitter.com/mattrickard/status/1370436711235260418"&gt;"The longer a pull request has been open, the longer it will take to merge."&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use the "Good First Issue" tag.&lt;/strong&gt; GitHub actually treats these as special issues, pushing them onto the GitHub feed for higher visibility. Use that to your advantage and craft well-written issues tagged as "good-first-issue". They can be as simple as backlogged bug fixes. But you have to already know how to fix the issue and it has to be contained to a small testable surface, there's a low probability that new contributors will be able to fix deep problems in your project across hundreds of files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced tip: have a way for approved contributors to re-trigger CI.&lt;/strong&gt; For example, Kubernetes, Kubeflow, and minikube use a tool called &lt;a href="https://github.com/kubernetes/test-infra/tree/master/prow"&gt;prow&lt;/a&gt; to run tests. Prow comes with a prow-bot that can accept different commands, automatically tagging issues or rerunning specific tests. Not for small projects, but this can alleviate maintainer headaches caused by trivial busy work.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Advanced tip: previews using Netlify or Vercel.&lt;/strong&gt; Especially for documentation and web applications, have previews autogenerated on pull requests. Even if contributors have gone through all the steps, it's great for them and the maintainers to visualize the changes while reviewing. This is great for non-technical contributions, such as verifying documentation changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tomorrow, in Part 2, I'll cover how to build a community for your open source project. Then, on Wednesday, Part 3 will cover the top of the funnel with potential users. If you haven't already, make sure you &lt;a href="https://matt-rickard.com/subscribe/"&gt;subscribe&lt;/a&gt; so you don't miss new posts every day.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A Surprising Fact From Stack Overflow's Developer Survey</title>
      <dc:creator>mrick</dc:creator>
      <pubDate>Wed, 04 Aug 2021 15:11:49 +0000</pubDate>
      <link>https://dev.to/mrick/a-surprising-fact-from-stack-overflow-s-developer-survey-4ha8</link>
      <guid>https://dev.to/mrick/a-surprising-fact-from-stack-overflow-s-developer-survey-4ha8</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VGF7Ms5o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cr75u27yqi6ohqj5bd7a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VGF7Ms5o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cr75u27yqi6ohqj5bd7a.png" alt="Most popular developer tools in 2021"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Every year, Stack Overflow, a question and answer site for developers, runs a survey. It is probably the largest scale data analysis of software engineers.&lt;/p&gt;

&lt;p&gt;This year showed some trends that were surprising.&lt;/p&gt;

&lt;p&gt;Docker is the fastest-growing tool among developers. In 2020, 35% of respondents said they used Docker. In 2021, 48.85% said they used Docker. If you look at estimates for the total number of developers, they range from 10 to 25 million. That's 1.4 to 3 million new users this year.&lt;/p&gt;

&lt;p&gt;For more surprising facts from this year's developer survey, check out my post on &lt;a href="https://matt-rickard.com/2021-state-of-developers/"&gt;Unexpected Developer Trends&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For expert resources on Docker and Kubernetes, check out some of my writing on the &lt;a href="https://matt-rickard.com/archive/"&gt;state of container technology&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>programming</category>
    </item>
    <item>
      <title>Reflections on 10,000 Hours of Programming</title>
      <dc:creator>mrick</dc:creator>
      <pubDate>Tue, 03 Aug 2021 23:00:26 +0000</pubDate>
      <link>https://dev.to/mrick/reflections-on-10-000-hours-of-programming-ge4</link>
      <guid>https://dev.to/mrick/reflections-on-10-000-hours-of-programming-ge4</guid>
      <description>&lt;p&gt;&lt;em&gt;This post originally appeared in my free daily newsletter on startups and engineering. &lt;br&gt;
You can join 200+ subscribers here: &lt;a href="https://matt-rickard.com/subscribe/"&gt;https://matt-rickard.com/subscribe/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The key to achieving world-class expertise in any skill, is to a large extent, a matter of practicing the correct way, for a total of around 10,000 hours — Malcolm Gladwell in Outsiders&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, I'm certainly not a world-class expert, but I have put my 10,000 hours of deliberate practice into programming. Here are 31 of my reflections on programming.&lt;/p&gt;

&lt;p&gt;These are reflections only about pure coding — no lessons sum up to "programming is about people" or "how to be a senior technical leader" (arguably more important to a career, but not the topic of this post).&lt;/p&gt;

&lt;p&gt;These reflections are just about deliberately writing code for 10,000 hours. Most don't apply to beginners. These reflections are not career advice. Think of them as lessons on being a technical guitarist, not about being a good band member. They are about becoming a better programmer for yourself.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Browsing the source is almost always faster than finding an answer on StackOverflow.&lt;/li&gt;
&lt;li&gt;In many cases, what you're working on doesn't have an answer on the internet. That usually means the problem is hard or important, or both.&lt;/li&gt;
&lt;li&gt;Delete as much code as you can.&lt;/li&gt;
&lt;li&gt;Syntactic sugar is usually bad.&lt;/li&gt;
&lt;li&gt;Simple is hard.&lt;/li&gt;
&lt;li&gt;Have a wide variety of tools and know which ones to use for the job.&lt;/li&gt;
&lt;li&gt;Know the internals of the most used ones like git and bash (I can get out of the most gnarly git rebase or merge).&lt;/li&gt;
&lt;li&gt;Build your own tools for repeated workflows. There is nothing faster than using a tool you made yourself (see: &lt;a href="https://matt-rickard.com/about/"&gt;software I wrote&lt;/a&gt;.)&lt;/li&gt;
&lt;li&gt;Only learn from the best. So when I was learning Go, I read the standard library.&lt;/li&gt;
&lt;li&gt;If it looks ugly, it is most likely a terrible mistake.&lt;/li&gt;
&lt;li&gt;If you have to write a comment that isn't a docstring, it should probably be refactored. Every new line of comments increases this probability.&lt;/li&gt;
&lt;li&gt;If you don't understand how your program runs in production, you don't understand the program itself. In my experience, the best engineers know how their program works in every environment.&lt;/li&gt;
&lt;li&gt;The above rule applies to the build pipeline as well.&lt;/li&gt;
&lt;li&gt;Use other people's code religiously.&lt;/li&gt;
&lt;li&gt;Corollary: Most code out there is terrible. Sometimes it's easier to write a better version yourself.&lt;/li&gt;
&lt;li&gt;A rough rule of thumb: never take a direct dependency on a small library that you could easily rewrite or a large library that should have been small.&lt;/li&gt;
&lt;li&gt;Know when to break the rules. For rules like "don't repeat yourself," sometimes a little repetition is better than a bit of dependency.
18.Organizing your code into modules, packages, and functions is important. Knowing where API boundaries will materialize is an art.&lt;/li&gt;
&lt;li&gt;Pick the most efficient tool most of the time, but also pick what you know. Is Arch Linux the most efficient operating system for the modern developer? For me, it is, but for most, probably not. Should you use acme? Only if you're Rob Pike.&lt;/li&gt;
&lt;li&gt;Avoid cyclomatic complexity. Novice coders don't even know that they've tangled the dependency graph until it's too late.&lt;/li&gt;
&lt;li&gt;Avoid nesting conditionals deeply. Have common sense about your conditional tests and naming convention.&lt;/li&gt;
&lt;li&gt;Name variables correctly. Again, an art.&lt;/li&gt;
&lt;li&gt;While rare, sometimes it's a problem with the compiler. Otherwise, it's always DNS.&lt;/li&gt;
&lt;li&gt;Use esoteric language features sparingly, but use them when you're supposed to, for that is the point.&lt;/li&gt;
&lt;li&gt;Technology does not diffuse equally. For example, there is a lot that frontend developers could learn from low-level engineers (especially now that everything is compiled). 26. Likewise, there are UX and usability features that JavaScript developers could teach cloud engineers.&lt;/li&gt;
&lt;li&gt;As a result, different kinds of engineers look at the world differently.&lt;/li&gt;
&lt;li&gt;Some programmers are 10x more efficient than others. I know because I've been both a 10x programmer and a -1x programmer.&lt;/li&gt;
&lt;li&gt;There's no correlation between being a 10x programmer and a 10x employee (maybe a negative one).&lt;/li&gt;
&lt;li&gt;Good APIs are easy to use and hard to misuse.
The configuration cycle goes from hardcoded values to environment variables, to CLI flags, to a configuration file, to a templated configuration file, to a DSL, to a generic bash script, and back to hardcoded values. Know where you are on this &lt;a href="https://matt-rickard.com/heptagon-of-configuration/"&gt;Heptagon of Configuration&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;All layers of abstraction are malleable. If you run into a fundamental wall, sometimes the answer is to go down a layer of abstraction. You aren't confined to the surface.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Where did I put in my 10,000 hours?&lt;/strong&gt; Well, I've been programming for about 15 years. Most recently, I worked as a professional software engineer at Google on Kubernetes and Blackstone, the private equity firm. Before that, I spent most of college in the library writing programs for my own projects instead of writing proofs (which I should have been doing as a math major). And before that, I was hacking away at all sorts of things — running a botnet on RuneScape, writing a Latin translation app for the iPhone (so I could do better on my Latin exams), creating a web clipper, or ricing up my desktop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What did I do for the 10,000 hours?&lt;/strong&gt; The most recent work was in distributed systems, but I've written code across the stack. Languages like PHP, JavaScript, Go, Ruby, Python, C#, Java, Swift. Frontend, backend, mobile, kernel, cloud, ops, and even some IT. I've worked on large-scale open-source projects like Kubernetes and maintained subprojects, which allowed me to have my code peer-reviewed by some of the best engineers.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>career</category>
      <category>productivity</category>
      <category>devjournal</category>
    </item>
    <item>
      <title>Service Reliability Math That Every Engineer Should Know</title>
      <dc:creator>mrick</dc:creator>
      <pubDate>Sun, 13 Jun 2021 19:52:19 +0000</pubDate>
      <link>https://dev.to/mrick/service-reliability-math-that-every-engineer-should-know-afg</link>
      <guid>https://dev.to/mrick/service-reliability-math-that-every-engineer-should-know-afg</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F311mw93ltrjizvstm43i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F311mw93ltrjizvstm43i.png" alt="Screen Shot 2021-06-09 at 9.50.37 AM"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>codenewbie</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
