Я думал, что достиг желанного. Один из моих open-source проектов начал набирать небольшую аудиторию фолловеров на GitHub. Больше никакой нытливой неуверенности в себе, ведь около тысячи наблюдателей за звёздами следят за моим проектом — это всё, что нужно для подтверждения ценности. Это то, что можно вспоминать в моменты неуверенности. Напоминание, что я действительно достиг того, чего стою на самом деле. Никогда не думал, что звёзды могут отвернуться от меня.
* * *
Всё случилось из-за одного из тех самых людей, чьи мнения я так усердно собирал. Я говорю об одном конкретном человеке, который использовал мой проект для управления хранилищем данных бэкенда на платформе его компании. Это была критически важная функция, и как технический директор своей компании он нёс ответственность за её техническую обоснованность. Он очень профессионально вложился в сторону моей разработки. Его проект сильно отличался от большинства других, где мой код обычно использовался для сторонних или любительских задач.
Его ожидания от меня как мейнтейнера и моя собственная вера в своё желание делиться кодом — сочетание этих двух факторов привело к довольно невероятной череде событий, о которой я расскажу.
Твоя идея — ерунда
Ненавижу запросы на новые функции. Я должен или привести разумные причины для отклонения запроса — объяснить, как использовать существующие API для выполнения задачи, или выполнить работу для реализации этой функции (если я честный парень). В любом случае, запросы на новые функции заставляют трудиться.
В большинстве случаев при отклонении запроса достаточно короткого объяснения, на этом тема закрывается. Я так привык к такой динамике, что если кто-то вдруг оспаривал мои объяснения, то это дерьмо сразу попадало на вентилятор.
Вернёмся к парню, о котором я упоминал. Ранее он предложил два патча — один удалял кавычки из псевдонимов таблиц SQL, а другой изменял схему, по которой генерировались псевдонимы. Оба патча были проблемными. Первый требовал поддержки списка всех ключевых слов SQL и проверки, совпадает ли псевдоним с ключевым словом, — и использования кавычек только в этом случае. Второй был чисто косметическим, влияющим на то, как запросы отправляются в базу данных (это всегда скрыто от пользователя и специально вынесено на уровень абстракции библиотекой). Я объяснил проблемы патчей, как их понимал, и отклонил их.
Следующий баг-репорт от него был не лучше. В этом случае он пытался дважды присоединить ту же таблицу. Я объяснил, что для двукратной ссылки на одну таблицу нужно использовать конкретный API. Я начал злиться.
К сожалению, у меня не сохранился оригинальный текст моего сообщения до редактирования, но он был не очень вежливым. Ну а какого хрена, мы же всего лишь люди.
Через пару дней появился новый тикет для разработки. Теперь он считал, что определённый API должен вести себя иначе. Я показал ему место в документации, где явно описано поведение API. Он ответил следующее (выделение его):
один факт, что причудливость API задокументирована, не означает, что нет места для улучшения. и я не видел документации/описания, почему тебе нравится именно такое решение архитектуры, а не другие альтернативы.
Наши отношения вышли на новый уровень, где мои решения архитектуры не только оспаривались (или неприкрыто назывались неправильными), но на меня возлагалась ответственность защищать их. Я не мог грациозно принять такое.
Этот уровень был об ожиданиях. Он чувствовал, что ему должны, а я чувствовал свободу от обязательств. Я выразил ему своё негодование и возмущение, после чего мы вошли в последнюю, самую разрушительную фазу.
Вопрос закрыт с чрезвычайным предубеждением
Я перестал отвечать на его тикеты. Иногда я удалял их (а если не мог, то нажимал «редактировать» и стирал весь текст). Иногда в негодовании спрашивал, кем он себя возомнил, когда приходит в трекер и требует от меня объяснений по тем аспектам моей библиотеки, с которыми он не согласен. В конце концов я забанил его на проекте.
В какой-то момент он отредактировал страницу проекта на Википедии, добавил туда раздел «Полемика», в котором говорилось, что я злонамеренно банил пользователей проектов и отказывался обсуждать технические вопросы. Он также начал кампанию поливания грязью в Twitter/HackerNews/Reddit/Wikipedia, всячески понося меня и проект. Это было чертовское безумие. Закончилось тем, что я попросил сотрудников Википедии удалить страницу моего проекта. Я говорил, что это было чертовское безумие?
В этих комментариях он упоминает о ситуации после того, как его забанили, а один из его коллег начал делать замечания таким же тоном.
Якобы третирую собственных пользователей и заслуживаю осуждения. За свою тяжёлую работу, результат которой выложил для всех? Что за хрень, подумал я. Нет, ну в самом деле!
Кто кого третирует?
Он был абсолютно убеждён, что виноват именно я. Сам проект и трекер, размещённые на GitHub, были общей честной площадкой для любых обсуждений. Когда я удалил некоторые из его комментариев, то сильно ущемил его свободу слова. Я также проявил своё истинное лицо: мелкого тирана в крошечном королевстве кода, так что он совершал благородный поступок, предупреждая остальных об этом.
Конечно же, моё мнение было противоположным. Я написал код и для помощи другим и улучшения библиотеки выложил его в свободный доступ. Факт публикации на GitHub не даёт проекту какой-то особый статус, по-моему, кроме того, что это просто удобная платформа для
По правде, мы оба могли бы вести себя более вежливо. Я уверен, что ему было обидно, что он тратил время на подготовку тикетов с описанием проблемы, а их закрывали без достаточного обсуждения. Мне было неприятно, что со мной спорят в таком тоне, будто имеют на это право — я так говорю, потому что в то время я думал, что библиотека полностью в моей собственности.
Cui bono
Другой способ взглянуть на ситуацию — посмотреть, кому выгодна публикация проекта с открытыми исходниками. В идеале, это одинаково выгодно и конечным пользователям, и мейнтейнеру. Конечные пользователи (один из которых сам мейнтейнер) получают непрерывно улучшающийся продукт, а мейнтейнер плюс к этому может добавить ещё один хороший пунктик в своё резюме (или тёплое ощущение поддержки извне). Я начал задаваться вопросом, может, я делаю всё не из правильных намерений?
Мне нравится думать, что я действую в духе Бена Франклина, который написал:
Если мы охотно пользуемся большими преимуществами от чужих изобретений, то мы должны быть рады случаю послужить другим своим изобретением, и мы должны это делать бескорыстно и великодушно.
Но были ли мои намерения настолько чисты? Никак нет. Как я говорил раньше, этот проект стал своего рода промежуточным этапом; способом понять самого себя как разработчика, а оттуда — как человека. В конце концов, это был любительский проект. Творческое самовыражение. Вещь, форма которой говорила нечто обо мне как о человеке, чего я стою, что я считаю правильным.
И тут приходит парень, который заставляет меня защищать вещи, которые ему не нравятся или которые он считает странными. В конце концов, я думаю, что он был более прав, чем я готов был признать в то время. Он ожидал обсуждения его идей по их заслугам, и поскольку в проекте не было чётко обозначено, что это моё хобби, то он вполне мог просить место за столом как равный. Он его не получил, и я раскаиваюсь, что в тот момент не видел ситуацию более ясно.
Уверен, что нечто подобное случилось бы раньше, если бы другой человек, который многое вложил в проект, но имеющий собственные идеи насчёт реализации, пришёл бы и начал делать изменения.
Вся эта ситуация заставила меня более внимательно следить за своей мотивацией при работе над открытыми проектами. Я остро осознал, насколько важно искать баланс между доверием пользователей к вам как мейнтейнеру (по любым заявлениям, которые вы делаете для своей библиотеки), и между тем, чтобы не ставить под угрозу концептуальную цельность проекта, когда они просят внести изменения.
Этот опыт также показал, что сохранить право собственности может быть непросто в open-source. Если код проекта опубликован под свободной лицензией, то принадлежит ли он своему создателю? Или он получил собственную жизнь, в которой его должны защищать пользователи как тот, с которым я встретился, даже если это означает отрезать создателя? Не это ли та причина, по которой у нас есть разрешающие лицензии и кнопка «Форк»?
Автор: m1rko