Your idea sucks

I thought I had arrived. One of my open-source projects started gaining a small following on GitHub. No more nagging self-doubt, the thousand or so star-gazers of my project provided all the validation I needed. Here was something I could conjure up in moments of doubt, reminding myself that I truly was all those things I wanted to believe about myself. I never stopped to think that the stars might not be for me.

* * *

All this got turned on it's head by one of those very people whose opinion I set so much store by. I'm thinking in particular of one person who was using my project to manage the backend data-storage for his company's platform. It was a critical function, and as the CTO of his organization, he was responsible for ensuring it was technically sound. He was very invested, professionally, in the direction of my project. This was a sharp contrast to most people I'd talked to, who were using my project for side-projects and hobbies of their own.

The combination of his expectations of me, as a maintainer, and my beliefs about my own motivations for sharing my code led to a pretty unbelievable series of events that I'll describe in a moment.

Your idea sucks

I hate feature requests. I either need to rationally explain the flaws in the request, explain how to accomplish their goal using the existing APIs, or do the work of implementing their ask (if I'm being conscientious). No matter what, feature requests require work.

Most times when I'm turning down a request, as long as I provide a short explanation that's the end of it. I got so used to this dynamic that when someone came along who challenged my explanations, the shit hit the fan.

Back to the guy I mentioned earlier. Early on, he submitted two patches -- one which removed quotes from SQL table aliases, and another which changed the scheme I used for generating table aliases. Both patches were problematic. The first would have necessitated maintaining a list of all SQL keywords and checking whether an alias coincided with a keyword and only quoting in that case. The second was strictly cosmetic, affecting the SQL being sent to the database (never seen by the user, and intentionally abstracted away by the library). I explained the issues, as I saw them, with the patches and closed them.

The next bug report I got from him was no better. In this case, he was attempting to join on the same table twice. I explained that to reference the same table twice, he would need to use a particular API. I got pissed.

photos/p1493977505.0.png

Unfortunately I don't have a record of what I wrote before I edited it, but it probably wasn't nice. For fuck's sake we're all only human.

A couple days later there was a new development on a different ticket. In this particular instance, he felt that a certain API should behave differently. I pointed him to the documentation that clearly stated how the API behaved. He responded with this (emphasis is his):

just because the quirkiness of the API is documented doesn't mean there isn't room for improvement. and i've seen no documentation/description on why you like this this design decision over other alternatives.

Our relationship entered a new phase, in which my design decisions were not only challenged (or flat-out called incorrect), but one in which it was my responsibility to defend those decisions. I didn't handle this gracefully.

This phase was all about expectations. What he felt he was owed versus what I felt was a sufficient dismissal. I felt indignant, morally outraged, and let him know, and then we entered the final, and most destructive phase.

Issue closed with extreme prejudice

I stopped responding to his tickets. Sometimes I'd delete them (or, when I couldn't, I hit "edit" and removed all the text). Sometimes I would act indignant and ask him who he thought he was, coming on the ticket tracker and demanding that I defend the aspects of my library he disagreed with. Eventually I banned him from the project.

At some point, he went to the WikiPedia page for the project, and added a new heading entitled Controversy, which said that I maliciously banned users from projects and refused to enter into discussions of technical issues. He also launched a Twitter/HackerNews/Reddit/WikiPedia shaming campaign to disparage me and the project. It was fucking crazy. I ended up begging the WikiPedia staff to remove the page for my project. Did I mention it was fucking crazy?

photos/p1493985149.09.png

In the above comments, he is referring to a situation which occurred after he was banned and one of his coworkers started making comments in a similar tone to his.

I'm bullying my own users and deserve to be embarrassed. For sharing something I work very hard on. What the fuck, I thought to myself. I mean, seriously!

Who's the bully?

He felt absolutely convinced that I was the bully. The project and it's issue tracker, once released onto GitHub, were fair game for any and all discussion. When I removed some of his comments, I was infringing on his freedom of speech, essentially. I was also revealing my true colors: I was a petty tyrant of a tiny kingdom of code and by warning others of this, he was performing a noble act.

My opinion was, of course, the opposite. I had written the code, and in the interests of helping others and improving the library, had open-sourced it. The fact that it was on GitHub did not give the project any special status, in my mind, rather it was a convenient platform for hosting the code, issue tracker, and code-review. In the end, the project was mine. It was licensed in such a way that it could be used or modified in any way, so there was nothing stopping him from taking the code and re-packaging it according to his tastes (which is exactly what he eventually did).

The answer, of course, is that both of us could have handled things more courteously. For him, I'm sure it was frustrating to feel that the issues he took the time to describe in his tickets were getting dismissed without ample discussion. For me, it was frustrating to be confronted by such an entitled attitude -- and I only say entitled because, to my thinking at the time, the library was something I ultimately owned.

Cui bono

Another way of looking at the situation is to ask who benefits from a project being open-sourced. Ideally open-source is mutually beneficial for both the end-users and the maintainer. The end-users (of which the maintainer is also one) get a continually improving product and the maintainer additionally gets a nice bullet point on the resume (or the warm feeling of external validation). Was I doing this for all the wrong reasons, I started to wonder?

I liked to tell myself that I was acting in the spirit of Ben Franklin, who wrote:

As we enjoy great advantages from the inventions of others, we should be glad of an opportunity to serve others by an invention of ours, and this we should do freely and generously.

But were my intentions really as pure as all that? Hell no. As I described earlier, this project had become a proxy; a way for me to understand myself as a developer, and from there, as a person. It was, after all, a hobby project. A creative expression. A thing with form that somehow had something to say about who I am as a person, what I value, what I consider good.

And here came a guy who wanted me to defend the things he disliked or found quirky. In the end, I think he was more right than I wanted to admit at the time. He expected a discussion of his ideas on their own merit, and as the project was not clearly identified as being my hobby, he wasn't wrong in asking for a seat at the table as an equal. This is not what he got, though, and I regret not having seen the situation more clearly at the time.

I'm sure something like this would have happened sooner if another person, heavily invested in the project but with their own ideas about how things should be done, had come around and started making changes.

The whole situation made me more aware of my own motivations for doing open-source work, and made me keenly aware of the importance of finding a balance between respecting the trust your user's have placed in you as a maintainer (based on whatever claims you're making about your library), and not compromising, for lack of a better expression, the conceptual integrity of the project when they ask for changes.

This experience also highlights that ownership can be problematic in open-source. When a project is open-sourced, can it no longer be said that it still belongs to its creator? Has it taken on a life of its own, one which must be protected by users like the one I encountered, even if that means cutting it off from it's creator? Or isn't that the whole reason we have permissive licensing and fork buttons in the first place?

Comments (17)

Konstantin | may 12 2017, at 03:36am

Well, i believe you made the right step. It's your project and it's all up to you. Don't blame yourself and feel responsible for all the shit happening around. The code is public, everyone can fork it and modify it in any way, that's github was created for.

Sam Halliday | may 09 2017, at 02:13am

I wrote up my similar experiences, see link. You don't need a permissive license to make your work available, you want a Libre license.

Next time just charge him | may 06 2017, at 09:44am

Next time you run into someone making ridiculous demands, don't argue with them, just give them a price quote. Make it much more expensive than you think it is worth to deter them from taking you up on it, and if they do take you up on it then you have a nice chunk of change.

Marco van Hilst | may 06 2017, at 01:29am

Kristofer Kayza, what kind of screwed up understanding do you need to have to view giving something away for free as an act of vending that in turn allows the "customers" of your free giveaway to expect customer support? Selling and giving away are mutually exclusive actions. On top of that, if I don't include a clause in a sale entitling the customer to support, the customer is not entitled to support. I can simply disappear once I've made the sale, just as I can disappear (or in Charles' case, selectively respond) once I've published a Git repository even if you suppose allowing access to a Git repo to be an act of vending through some strange line of reasoning.

Maybe I'm trying to view your reasoning too explicitly and you are instead suggesting that project owners should provide support because otherwise there should be no userbase for the project. To that I suggest you recognize that some project owners open source their projects without the desire to foster a userbase at the cost of their happiness and then instead of wasting your time ranting to them about how they should be running their project/living their lives you move on or, as other commenters have suggested, "fork off".

dyu | may 06 2017, at 01:15am

A similar thing happened with github.com/jborg/attic, a great backup library.

See https://github.com/jborg/attic/issues/217#issuecomment-78091278

In the end, it led to a to a fork And then the original author stopped publishing changes to the public repo :-(

For the record, I still use attic because it is reliable.

Kelvin | may 05 2017, at 10:20pm

In my opinion, I think the maintainer still owns the project, just in the master branch. If people want to fork it and make their own version, then they should do that instead of trying to dictate someone else's version. Maybe you handled it poorly, but there was nothing stopping this guy from simply forking it to try out his ideas before trying to get them put into the master branch. (Why don't they call it the trunk or stem or something? How is it a branch if it's in the middle?)

As for censorship, people need to learn that even if they have the right to free speech, being heard is a privilege. You can say whatever you want, but the admin or owner of a particular forum, be it a message board, chatroom, or real-life panel, has the right to determine what content they do and don't allow. If being heard was a right, then banning troublemakers would be illegal, and no copyright law in the universe could stop someone from "quoting" whatever they wanted. You shouldn't feel bad for banning someone who was trying to force you to make changes you didn't want to, especially when you had already given him the freedom to do that himself, or, if he didn't have the ability, to get someone else to do it for him.

On top of free speech is the right to remain silent. That's not just for arrests; you have the right not to discuss something if you don't want to. Sadly, I'm guilty of shaming people who didn't want to discuss their stance on things, but at least I can admit it. If someone wants to talk about something you don't want to, and they pressure you repeatedly, that's harassment, plain and simple, and that is when you have the right to take their privilege to be heard in your domain.

TL;DR: You may have been crass, but I think you're in the right.

elY | may 05 2017, at 08:15pm

Kristofer Kayza, you sound like a terrible person to do anything with.

Monsto Brukes | may 05 2017, at 07:55pm

I think where it went south was all about Domain.

It's your project, your domain... rats-nest and all. Someone else comes in with their own ideas about what your domain should look like and attempts to browbeat you into making it so. Invalid SQL or trivial edits notwithstanding, it's your project.

Here is the part that most people miss, and both you and dude missed it as well: When it started to go south, rather than getting indignant, angry or vengeful, you could easily <i>and justifiably</i> have said something along the lines of . . .

"This is my project, and it's the way I want to run it. If you feel it should be run or built differently, then fork the code and make the changes you feel need to be made"

The. Fucking. End. That's it. At that point any further issues or PRs can be responded with that exact phrase . . . and he can either get with his own program, or get with yours.

Nobody in open source has to put up with anyone elses shit. You absolutely made things worse by modifying and deleting shit . . . but that is a direct downline result of all parties having been less interested in a solution than they were in <i>being right</i>.

And the solution was "fork it and go away".

Fred Fnord | may 05 2017, at 06:32pm

My takeaways: 1) When in doubt, ties always go to the person who did 99% of the actual work. If someone else considers himself an 'equal stakeholder' he's being an asshole. Period. 2) Kristofer Kayza is being an asshole. Jesus, dude, get a grip and don't opine on things you know nothing about. There was never 'a time' such as you describe (c.f. parameter pointer type checking, or rather the nonexistence thereof, in C), there is no 'give me all the keywords', there is no way to retrofit every SQL engine with 'give me all the keywords', there is no sense in anything you say. Half tempted to accuse you of being the sock puppet of the person this article was written about.

Kristofer Kayza | may 05 2017, at 05:01pm

Personally, I don't think that "being generous enough to make your code available for free" is any justification for being an asshole when someone asks you to explain your logic. That guy was absolutely right, there should be no way through use or misuse of your API, for invalid SQL to be generated. There was a day when all programmers worthy of the name would have risen up and crucified a vendor (for such you are, even if the price is $0) whose response to a problem report was "you're not supposed to do that." Okay, I accept that I'm not supposed to do that - - but in that case your code should fail non-silently. THAT is proper design, and proper customer support would have been to IMPLEMENT THAT when the guy reported it.

As for having to maintain a list of all SQL keywords - - POOR BABY. What's so difficult about that?!? If it's your own implementation of SQL, you should know what the keywords are, and it should be trivial to compose and maintain a list thereof. What's the holdup?

Now I'll answer my own question. Maybe you aren't in charge of the list of available keywords, and maybe they differ depending on operating environment at the client. I can understand there being different dialects of SQL that implement slightly different sub- or super-sets of "standard" SQL. In that case, what's needed is a function, in every SQL API from every maker/vendor, to "return list of all available SQL keywords." That would make this particular feature trivial to implement. As your client/customer, I might well have assumed that such an obvious (to me) feature had long ago been implemented. If it has, then again I ask, what's the holdup? Implement the damn thing and get on with it.

The only possible difficulty here is if that function doesn't exist - - in which case it's your opportunity to become a well-known figure in the SQL community by contacting said community and proposing that it be added. If I were a member of that community, myself, I would be proposing it this very minute, for you.

Arthur Corenzan | may 05 2017, at 02:24pm

Great read, thank you. In the final paragraph you wonder about ownership of open sourced code. I think when you open source code (or anything else for that matter) what you're really giving away is the design, the intelligence behind it, not the actual code that was written. So I'd say it still yours. That implementation, in that particular form is yours. You own it, and so you should run it the way you see fit. Of course you need to respect others and their ideas, but you don't have to explain yourself, show the reason behind your calls or even discuss it unless you want to, although I'd say it is a better policy.

Kai Xia | may 05 2017, at 02:22pm

I'm a big fan of simple and elegant things, and I liked your work a lot. I truly enjoyed peewee to the extent that I wrote a long blog article about it four years ago.

I don't think I can handle this better than what you have done. Don't blame yourself on this silly thing. There's a fork button there and he should hit that button early on.

Miko | may 05 2017, at 01:36pm

I think he's a prick, and you were absolutely right in banning him.

The fact that you laid out your code for anyone to use and inspect is an altruist act as of itself. You should not be punished for this.

The fact that he wanted to technically discuss anything with you is his own problem, and if toy are not willing to provide that service, even for the most selfish of reasons, that should be your own right.

Anything else would dis-incentivise anyone from sharing his own code, while the other side has all the tools needed to fork and make the change on his own repo.

Alan | may 05 2017, at 11:11am

I was all set to agree with you, until I read your email and saw you were a Jailbird.

Go Wildcats!

R. F. | may 05 2017, at 10:57am

What a wonderful string of introspection. I admire that you can describe your own actions in a way that makes me agree that you could have handled it better. I have yet to author a truly successful project, but will keep all this in mind when someone comes along and claims their interest in it.

Tei | may 05 2017, at 09:07am

I am sorry you had this negative experience. If this help you, I managed a open source project for 6 years and everyone was helpful and nice to me. You had some bad luck.

Gary Chambers | may 05 2017, at 08:50am

It sounds like the snowflake using your superlative contribution to the community needs to get over himself. The appropriate and only response should be, "Screw!"


Commenting has been closed, but please feel free to contact me