A recent post on Hacker News entitled "Why I still don't contribute to open source" raised a series of thoughts in my head - but then, before I could even take the time to generate the smallest of replies, Brian Curtin swooped in and made probably one of the single best comments in reply, and on the subject of contribution that I've ever read. The original post; and Brian's excellent reply were enough to get me obsessing about this subject again - eager to share my thoughts and feelings on it.
A while ago (almost exactly a year, oddly enough) I posted a question here to my blog - "Why aren't You Contributing (to Python)" - the replies to that post, both in the original comments, Hacker News, Reddit and other thoughtful responses by Tim Golden, Yaniv Aknin and Brian Curtin made me sit back and think for a long time what we - as a "python core" team could do to help reduce the friction and overall barrier to contributing to core itself. It also made me take a step back and ask myself why I contribute to Python - not just via core, but also to PyCon and the PSF.
In the replies; there was a common series of "barriers" cited - and as you read through those posts above, you will note that many of them aren't just applicable to Python-Core itself. They are applicable to open source in general. This is something important to note, as solutions to these problems identified by "us" and other projects can be globally applied to projects "suffering" from a "lack of new blood" and new contribution.
New contribution is the lifeblood of projects - it brings new, fresh perspectives and ideas, new solutions to old problems, in addition to adding bandwidth to a project's maintenance overall.
The key "barriers" were:
- Time - this is the easiest to extract; all of us are incredibly busy people. Especially people with families, or hobbies outside of just hacking on code, technology. We have our day jobs, or school - or we have wonderful little children and beautiful spouses that absorb (deservedly so) our time. This leaves a finite amount of time wherein people can contribute if it's something they have any time to do at all. Most of us don't get paid to contribute to open source projects, and even then, if we do, once again it's a finite amount of time (let's say, 25%).
- Knowledge - A lot of people cited difficulties in finding information about how to help and where help is needed. Still others mentioned they didn't even know there was a bug tracker, etc. Having a low barrier to entry - meaning a low friction method of having someone contribute something (a bug, a patch, a doc fix, etc) is critical. Hopefully the new Dev Guide helps, and hopefully the core-mentors project helps too.
- Friction - Many people cited (both publicly and privately) that they felt that responses on the bug tracker and mailing lists were extremely hostile. Not only is there a perceived high barrier - it's a high barrier loaded with friction. Ignoring the hostility, real or perceived, there's also the friction of debate over changes, and the friction of time. If I submit a patch, and nothing happens for months, I am going to be less inclined to contribute anything.
- Hostility - While I mention this in the friction part; it's important to note on it's own - people that don't feel welcome or that they can safely ask questions or explore ideas without being "yelled" at or judged harshly. Email is a terrible forum to transmit emotion, so even if the person writing the email didn't mean for it to come off as such, very frequently, emails that are short and to the point come off as cold, hard and sometimes insulting. Having a global developer community that spans cultures further complicates electronic exchanges.
- Qualifications - many people felt that they were simply unqualified to contribute, in any way. People are daunted by projects like Python, and JQuery - anything with a user base or established "niche" seems to automatically generate higher barriers and more friction due to the simple fact people are scared they are not skilled enough to contribute.
Let's assume that all of these are real barriers (I feel they are) and there's a limited number of things to counter these things in place. Why bother?
Brian's comment touches on something I think is important:
I strongly believe that everyone, and I mean everyone, is ready to contribute to OSS. On the Python project, Jesse Noller recently started a "core mentorship" group to help people put the rubber to the road. There's an almost endless amount of work to be done on CPython, and we'll literally take anyone with any amount of knowledge and help them contribute. Whether it's people contributing to OSS for the first time, or people new to contributing to Python, we can find something.
If you understand English, you can write documentation. If you can write Python code, which is obviously a common skill for someone interested in contributing to Python, there's plenty of work. If you know C, dig right in.
The group of core contributors ranges from 18 to the upper 60s, from the self-taught to multi-PhDs, from students to Googlers. I think the only people who aren't ready to contribute, wouldn't be interested in contributing in the first place.
(minor quibble: s/write documentation/improve documentation/ - see also JKM's post on great documentation, just like code, documentation contributions differ in scale)
Brian is dead right - I, like him, believe that everyone and anyone contribute to OSS, and in the local case - the Python case - everyone can contribute something no matter who they are, or what their skill set it. If you know english (especially better than I write it) then man, help with documentation - a seeming blind spot for many projects. If you're a designer, we both know most OSS needs some design help - web site designing, themeing, GUI work, and so on. The number of OSS projects out there with bad UI/UX and or just a bad interface (I'm looking at you, git) is astoundingly large.
I truly, fundamentally believe that OSS is is the perfect proof that anyone and everyone can contribute to something. Why? Code and projects are blind - or if they aren't, they should be. They don't care if you're a sentient ham sandwich, they don't care if you don't have the proper schooling, how old you are, the color of your skin, or your religious beliefs. They don't care where you are located or what you did before you contributed something. They just care about what you have contributed - doc patch, code patch or feature. That thing you have submitted should be able to stand on its own merits, regardless of anything outside of that atomic change. I'm not saying that what you've changed, proposed or patched won't be debated (see: bikesheds) - it will - but if it passes technical muster, then there should be nothing standing in the way of that change.
Why do I feel this way? Because - they (they being you - the Python community) welcomed me - I'm not qualified for contributing to something as large and amazing as Python! I'm barely qualified to raise my dog. I suffer from near constant impostor syndrome - I run across things inside of Python that frequently blow my mind, things I don't even grasp. I'm hot headed, brash and belligerent. I lead with my passion and my beliefs and I'll fight for something until I pass out from exhaustion. I overcommit, stretch myself thin. I signed up to maintain a module, then I had a kid and changed jobs. I'm not exactly a good programming citizen.
Even today, as I sit on the board of the Python Software Foundation, and I am now chair for PyCon, I look around in constant wonder and ask "why accept me"?
It's because OSS, and especially the Python community, of which I am very proud, truly doesn't care who you are - if you're a dog who can beat timsort, we'll take the patch if you can prove it. We accept social misanthropes, perfectly normal people with 2.5 kids, a dog and soccer practice on Sundays.
You've got to be passionate.
I'll admit - I'm not a cold, calculating mathematical engineer. Seriously, big surprise. What I am is insanely passionate about something, and the community around something most people consider "just a tool" (e.g. a language). I'm passionate about its community - I'm passionate about the language philosophy. My motivation comes from that very passion. The reason I am involved in OSS in any way is because I found myself incredibly passionate about something that changed my life. The reason why I steal time from my family, my job, and myself to work on these things is because they kindle a fire inside of me. Seeing something I've done help someone, make something better, change someone's life in some small way just feeds that fire.
I'm not in this due to a higher "human calling" - I don't contribute because I owe something to my fellow man - in fact, many times I've had to make the decision not to do something so I could spend more time putting food on the table for my family and myself. I contribute patches, ideas and what I can because it makes me feel good, it makes me feel rewarded and self-fulfilled.
If you're approaching contributing to a project - to a community - out of a sense that "you just should" or some broken ideal that you have to serve the greater good - it's just another job you're not passionate about. You're looking at contribution from the standpoint of a solemn duty, and not what it should be - something that is rewarding, exciting - something that when you look up and see someone using what you've made, fixed or improved you feel accomplished and awarded.
You have to pick a project, and something within that project that gives you that thrill, that fires up your passion (even if it's anger). You have to do it because you're inspired and you want to do it. Sure - there's a lot of drudge work at the end of the day - cleaning things up, fixing broken test suites, the equivalent to sweeping the floors once the party is over, but heck - you did something amazing, or some small thing that's going to change someone's life, go ahead and pick up a broom while you've still got that glow.
I contribute not from altruism; I contribute because I like to and I want to (and sometimes need to). Some part of me feels that yes, I am paying back some amount of debt - but no amount of social or moral debt will make you overcome the barriers I outlined in the preamble. Not amount of social extortion will make you pay the bill - only you can motivate you, and you have to want to do it. OSS is about scratching your itch; if something like python-core isn't itchy for you - find something that is.
After that little side rail into motivation - especially what drives me - I think it's important to go back to the mechanics. Those barriers are real - and as Brian points out, we (python-core) are working on them as a team, and the Python Software Foundation is working on them as a community. Since the original post I've been lucky to help spin up the python sprints project - the goal of which is to onboard new developers via face to face programming sprints. It's been pretty successful, and we still have lots we can and should do with it, but I like to think that we've done some work addressing the Knowledge, Friction and Qualifications issues on a local, sprint level.
People don't communicate face to face quite the same way they do on a mailing list, and a lot of people are much more comfortable sitting next to you asking questions then wading into/navigating the jungle of a mailing list. Especially when so many people expect negative "go look in the archives" and "RTFM". Mailing lists answer specific questions well, but tend to suck for getting big-picture information needed to get rolling on something.
Hence why we've also started the Python Core Mentorship program - which, if luck holds out, should be moderately successful in helping us ramp up new core developers in an environment that aims to remove the final barriers - we can't bend time. But I'll be damned if we can not lower the knowledge, friction, hostility barriers and make every person feel welcome and qualified, no matter who they are. I want the OSS world - even "my" own small corner of it to be welcoming when my children one day wander into it (if they want to).
We (as a community) have a long way to go - Python-Core as a team is still evolving - as a community, and as a development team - we have plenty of work to do to make conversations and discussions more civil, more welcoming. We have barriers that prevent us from being as diverse as we could be (notice I avoided should) - these are things we can help fix with outreach, leadership and guidance. We have to make it easy for people to contribute, and we have to make it friendly and fun. We have to take people who are afraid and make them feel confident and worthwhile (As Brian put it - "Having early success is key to having continued fun on the project.").
But Python-core isn't the center of the universe, nor should it be. The Python Software Foundation itself is simply a marketing and legal arm of a massive community. If language maintenance or community efforts aren't your thing - go find one of thousands of PyPi packages and help that project out, help it get a mentorship program, help it's docs, UX/UI. If you have a passion that's not solved - make a library and release it on github, bitbucket and PyPi and contribute that way. As I said in "Explaining the Python Software Foundation (Part 1)":
... Each and every Python programmer, author, and individual talking about Python right now is performing the mission of the PSF. Every bit of work (from writing code and documentation, to answering a question) moves Python's ecosystem forward. Every person reading this post or commenting about Python moves it forward. Essentially - if the ecosystem is a codebase - all of you have the commit bit.
Contribution can be "as small" as a documentation example (sometimes, more important than the code) - or it could be a PEP for a new language feature. Contribution could be organizing a conference, answering questions on a mailing list or introducing new people to the community and tools around you that you're passionate about. It has to be interesting and challenging to you.
You have to be fired up about it, maybe you're angry about a bug, maybe you love the tool, remember though a million bees with one sting can take down an elephant - you already know how to program, or how to write - this isn't monkeys at typewriters, this you, an intelligent and bright person working with other intelligent, bright people towards a common goal. You want to make, or contribute something awesome - you want to make the best damned hammer in history.
It can be daunting; it can feel like a shark tank - but trust in the fact that there are others out there that feel like you, and do want to help - and despite the fact that they won't express thanks (or don't know how) - everything you do contribute that's more than random nonconstructive criticism on a blog, email thread or bug report, or constantly telling people "you're doing it wrong" - is appreciated (Even when poorly expressed in an inappropriate location, constructive criticism can still prove useful in the long run).
At the end of the day, it is pretty cool to be able to do this on a modern, shipping operating system:
bender:~ jesse$ grep -r "Jesse Noller" /Library/Frameworks/Python.framework/
/Library/Frameworks/Python.framework/Resources/English.lproj/Documentation/_sources/whatsnew/2.6.txt: PEP written by Jesse Noller and Richard Oudkerk;
And yes. You can help. All of you can, all of you do.
For further reading, you can also see:
- Musings on the Culture of python-dev (Nick Coghlan)
- Status Quo wins a stalemate (Nick Coghlan)
- Addition: The Story of George - Ayttm's Most prolific non-developing contributor
- Addition: Contributing to Open source
- Addition: The development of Python and You (PyCon 2011)