Я думал, что достиг желанного. Один из моих open-source проектов начал набирать небольшую аудиторию фолловеров на GitHub. Больше никакой нытливой неуверенности в себе, ведь около тысячи наблюдателей за звёздами следят за моим проектом — это всё, что нужно для подтверждения ценности. Это то, что можно вспоминать в моменты неуверенности. Напоминание, что я действительно достиг того, чего стою на самом деле. Никогда не думал, что звёзды могут отвернуться от меня.
* * *
Всё случилось из-за одного из тех самых людей, чьи мнения я так усердно собирал. Я говорю об одном конкретном человеке, который использовал мой проект для управления хранилищем данных бэкенда на платформе его компании. Это была критически важная функция, и как технический директор своей компании он нёс ответственность за её техническую обоснованность. Он очень профессионально вложился в сторону моей разработки. Его проект сильно отличался от большинства других, где мой код обычно использовался для сторонних или любительских задач.
Его ожидания от меня как мейнтейнера и моя собственная вера в своё желание делиться кодом — сочетание этих двух факторов привело к довольно невероятной череде событий, о которой я расскажу.
Ненавижу запросы на новые функции. Я должен или привести разумные причины для отклонения запроса — объяснить, как использовать существующие API для выполнения задачи, или выполнить работу для реализации этой функции (если я честный парень). В любом случае, запросы на новые функции заставляют трудиться.
В большинстве случаев при отклонении запроса достаточно короткого объяснения, на этом тема закрывается. Я так привык к такой динамике, что если кто-то вдруг оспаривал мои объяснения, то это дерьмо сразу попадало на вентилятор.
Вернёмся к парню, о котором я упоминал. Ранее он сделал два пулл-реквеста — один удалял кавычки из псевдонимов таблиц SQL, а другой изменял схему, по которой генерировались псевдонимы. Оба патча были проблемными. Первый требовал поддержки списка всех ключевых слов SQL и проверки, совпадает ли псевдоним с ключевым словом, — и использования кавычек только в этом случае. Второй был чисто косметическим, влияющим на то, как запросы отправляются в базу данных (это всегда скрыто от пользователя и специально вынесено на уровень абстракции библиотекой). Я объяснил проблемы патчей, как их понимал, и отклонил их.
Следующий баг-репорт от него был не лучше. В этом случае он пытался дважды присоединить ту же таблицу. Я объяснил, что для двукратной ссылки на одну таблицу нужно использовать конкретный API. Я начал злиться.
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/c19/12f/93a/c1912f93a1c59cf6b0dff32f54e2eab4.png)
К сожалению, у меня не сохранился оригинальный текст моего сообщения до редактирования, но он был не очень вежливым. Ну а какого хрена, мы же всего лишь люди.
Через пару дней появился новый тикет для разработки. Теперь он считал, что определённый API должен вести себя иначе. Я показал ему место в документации, где явно описано поведение API. Он ответил следующее (выделение его):
Наши отношения вышли на новый уровень, где мои решения архитектуры не только оспаривались (или неприкрыто назывались неправильными), но на меня возлагалась ответственность защищать их. Тут уж не до вежливости.
Этот уровень был об ожиданиях. Он чувствовал, что ему должны, а я чувствовал свободу от обязательств. Я выразил ему своё негодование и возмущение, после чего мы вошли в последнюю, самую разрушительную фазу.
Я перестал отвечать на его тикеты. Иногда я удалял их (а если не мог, то нажимал «редактировать» и стирал весь текст). Иногда в негодовании спрашивал, кем он себя возомнил, когда приходит в трекер и требует от меня объяснений по тем аспектам моей библиотеки, с которыми он не согласен. В конце концов я забанил его на проекте.
В какой-то момент он отредактировал страницу проекта на Википедии, добавил туда раздел «Полемика», в котором говорилось, что я злонамеренно банил пользователей проектов и отказывался обсуждать технические вопросы. Он также начал кампанию поливания грязью в Twitter/HackerNews/Reddit/Wikipedia, всячески понося меня и проект. Это было чертовское безумие. Закончилось тем, что я попросил сотрудников Википедии удалить страницу моего проекта. Я говорил, что это было чертовское безумие?
![](https://habrastorage.org/r/w1560/getpro/habr/post_images/e22/fd0/042/e22fd0042cfb99c59517575cdd12002e.png)
В этих комментариях он упоминает о ситуации после того, как его забанили, а один из его коллег начал делать замечания таким же тоном.
Якобы третирую собственных пользователей и заслуживаю осуждения. За свою тяжёлую работу, результат которой выложил для всех? Что за хрень, подумал я. Нет, ну в самом деле!
Он был абсолютно убеждён, что виноват именно я. Сам проект и трекер, размещённые на GitHub, были общей честной площадкой для любых обсуждений. Когда я удалил некоторые из его комментариев, то сильно ущемил его свободу слова. Я также проявил своё истинное лицо: мелкого тирана в крошечном королевстве кода, так что он совершал благородный поступок, предупреждая остальных об этом.
Конечно же, моё мнение было противоположным. Я написал код и для помощи другим и улучшения библиотеки выложил его в свободный доступ. Факт публикации на GitHub не даёт проекту какой-то особый статус, по-моему, кроме того, что это просто удобная платформа для хостинга и анализа кода, с трекером. В конце концов, проект мой. Я лицензировал его таким образом, что никому не запрещено взять код и изменить его в соответствии со своими вкусами (именно это он в конце концов и сделал).
По правде, мы оба могли бы вести себя более вежливо. Я уверен, что ему было обидно, что он тратил время на подготовку тикетов с описанием проблемы, а их закрывали без достаточного обсуждения. Мне было неприятно, что со мной спорят в таком тоне, будто имеют на это право — я так говорю, потому что в то время я думал, что библиотека полностью в моей собственности.
Другой способ взглянуть на ситуацию — посмотреть, кому выгодна публикация проекта с открытыми исходниками. В идеале, это одинаково выгодно и конечным пользователям, и мейнтейнеру. Конечные пользователи (один из которых сам мейнтейнер) получают непрерывно улучшающийся продукт, а мейнтейнер плюс к этому может добавить ещё один хороший пунктик в своё резюме (или тёплое ощущение поддержки извне). Я начал задаваться вопросом, может, я делаю всё не из правильных намерений?
Мне нравится думать, что я действую в духе Бена Франклина, который написал:
Но были ли мои намерения настолько чисты? Никак нет. Как я говорил раньше, этот проект стал своего рода промежуточным этапом; способом понять самого себя как разработчика, а оттуда — как человека. В конце концов, это был любительский проект. Творческое самовыражение. Вещь, форма которой говорила нечто обо мне как о человеке, чего я стою, что я считаю правильным.
И тут приходит парень, который заставляет меня защищать вещи, которые ему не нравятся или которые он считает странными. В конце концов, я думаю, что он был более прав, чем я готов был признать в то время. Он ожидал обсуждения его идей по их заслугам, и поскольку в проекте не было чётко обозначено, что это моё хобби, то он вполне мог просить место за столом как равный. Он его не получил, и я раскаиваюсь, что в тот момент не видел ситуацию более ясно.
Уверен, что нечто подобное случилось бы раньше, если бы другой человек, который многое вложил в проект, но имеющий собственные идеи насчёт реализации, пришёл бы и начал делать изменения.
Вся эта ситуация заставила меня более внимательно следить за своей мотивацией при работе над открытыми проектами. Я остро осознал, насколько важно искать баланс между доверием пользователей к вам как мейнтейнеру (по любым заявлениям, которые вы делаете для своей библиотеки), и между тем, чтобы не ставить под угрозу концептуальную цельность проекта, когда они просят внести изменения.
Этот опыт также показал, что сохранить право собственности может быть непросто в open-source. Если код проекта опубликован под свободной лицензией, то принадлежит ли он своему создателю? Или он получил собственную жизнь, в которой его должны защищать пользователи как тот, с которым я встретился, даже если это означает отрезать создателя? Не это ли та причина, по которой у нас есть разрешающие лицензии и кнопка «Форк»?
* * *
Всё случилось из-за одного из тех самых людей, чьи мнения я так усердно собирал. Я говорю об одном конкретном человеке, который использовал мой проект для управления хранилищем данных бэкенда на платформе его компании. Это была критически важная функция, и как технический директор своей компании он нёс ответственность за её техническую обоснованность. Он очень профессионально вложился в сторону моей разработки. Его проект сильно отличался от большинства других, где мой код обычно использовался для сторонних или любительских задач.
Его ожидания от меня как мейнтейнера и моя собственная вера в своё желание делиться кодом — сочетание этих двух факторов привело к довольно невероятной череде событий, о которой я расскажу.
Твоя идея — ерунда
Ненавижу запросы на новые функции. Я должен или привести разумные причины для отклонения запроса — объяснить, как использовать существующие API для выполнения задачи, или выполнить работу для реализации этой функции (если я честный парень). В любом случае, запросы на новые функции заставляют трудиться.
В большинстве случаев при отклонении запроса достаточно короткого объяснения, на этом тема закрывается. Я так привык к такой динамике, что если кто-то вдруг оспаривал мои объяснения, то это дерьмо сразу попадало на вентилятор.
Вернёмся к парню, о котором я упоминал. Ранее он сделал два пулл-реквеста — один удалял кавычки из псевдонимов таблиц SQL, а другой изменял схему, по которой генерировались псевдонимы. Оба патча были проблемными. Первый требовал поддержки списка всех ключевых слов SQL и проверки, совпадает ли псевдоним с ключевым словом, — и использования кавычек только в этом случае. Второй был чисто косметическим, влияющим на то, как запросы отправляются в базу данных (это всегда скрыто от пользователя и специально вынесено на уровень абстракции библиотекой). Я объяснил проблемы патчей, как их понимал, и отклонил их.
Следующий баг-репорт от него был не лучше. В этом случае он пытался дважды присоединить ту же таблицу. Я объяснил, что для двукратной ссылки на одну таблицу нужно использовать конкретный API. Я начал злиться.
![](https://habrastorage.org/getpro/habr/post_images/c19/12f/93a/c1912f93a1c59cf6b0dff32f54e2eab4.png)
К сожалению, у меня не сохранился оригинальный текст моего сообщения до редактирования, но он был не очень вежливым. Ну а какого хрена, мы же всего лишь люди.
Через пару дней появился новый тикет для разработки. Теперь он считал, что определённый API должен вести себя иначе. Я показал ему место в документации, где явно описано поведение API. Он ответил следующее (выделение его):
один факт, что причудливость API задокументирована, не означает, что нет места для улучшения. и я не видел документации/описания, почему тебе нравится именно такое решение архитектуры, а не другие альтернативы.
Наши отношения вышли на новый уровень, где мои решения архитектуры не только оспаривались (или неприкрыто назывались неправильными), но на меня возлагалась ответственность защищать их. Тут уж не до вежливости.
Этот уровень был об ожиданиях. Он чувствовал, что ему должны, а я чувствовал свободу от обязательств. Я выразил ему своё негодование и возмущение, после чего мы вошли в последнюю, самую разрушительную фазу.
Вопрос закрыт с чрезвычайным предубеждением
Я перестал отвечать на его тикеты. Иногда я удалял их (а если не мог, то нажимал «редактировать» и стирал весь текст). Иногда в негодовании спрашивал, кем он себя возомнил, когда приходит в трекер и требует от меня объяснений по тем аспектам моей библиотеки, с которыми он не согласен. В конце концов я забанил его на проекте.
В какой-то момент он отредактировал страницу проекта на Википедии, добавил туда раздел «Полемика», в котором говорилось, что я злонамеренно банил пользователей проектов и отказывался обсуждать технические вопросы. Он также начал кампанию поливания грязью в Twitter/HackerNews/Reddit/Wikipedia, всячески понося меня и проект. Это было чертовское безумие. Закончилось тем, что я попросил сотрудников Википедии удалить страницу моего проекта. Я говорил, что это было чертовское безумие?
![](https://habrastorage.org/getpro/habr/post_images/e22/fd0/042/e22fd0042cfb99c59517575cdd12002e.png)
В этих комментариях он упоминает о ситуации после того, как его забанили, а один из его коллег начал делать замечания таким же тоном.
Якобы третирую собственных пользователей и заслуживаю осуждения. За свою тяжёлую работу, результат которой выложил для всех? Что за хрень, подумал я. Нет, ну в самом деле!
Кто кого третирует?
Он был абсолютно убеждён, что виноват именно я. Сам проект и трекер, размещённые на GitHub, были общей честной площадкой для любых обсуждений. Когда я удалил некоторые из его комментариев, то сильно ущемил его свободу слова. Я также проявил своё истинное лицо: мелкого тирана в крошечном королевстве кода, так что он совершал благородный поступок, предупреждая остальных об этом.
Конечно же, моё мнение было противоположным. Я написал код и для помощи другим и улучшения библиотеки выложил его в свободный доступ. Факт публикации на GitHub не даёт проекту какой-то особый статус, по-моему, кроме того, что это просто удобная платформа для хостинга и анализа кода, с трекером. В конце концов, проект мой. Я лицензировал его таким образом, что никому не запрещено взять код и изменить его в соответствии со своими вкусами (именно это он в конце концов и сделал).
По правде, мы оба могли бы вести себя более вежливо. Я уверен, что ему было обидно, что он тратил время на подготовку тикетов с описанием проблемы, а их закрывали без достаточного обсуждения. Мне было неприятно, что со мной спорят в таком тоне, будто имеют на это право — я так говорю, потому что в то время я думал, что библиотека полностью в моей собственности.
Cui bono
Другой способ взглянуть на ситуацию — посмотреть, кому выгодна публикация проекта с открытыми исходниками. В идеале, это одинаково выгодно и конечным пользователям, и мейнтейнеру. Конечные пользователи (один из которых сам мейнтейнер) получают непрерывно улучшающийся продукт, а мейнтейнер плюс к этому может добавить ещё один хороший пунктик в своё резюме (или тёплое ощущение поддержки извне). Я начал задаваться вопросом, может, я делаю всё не из правильных намерений?
Мне нравится думать, что я действую в духе Бена Франклина, который написал:
Если мы охотно пользуемся большими преимуществами от чужих изобретений, то мы должны быть рады случаю послужить другим своим изобретением, и мы должны это делать бескорыстно и великодушно.
Но были ли мои намерения настолько чисты? Никак нет. Как я говорил раньше, этот проект стал своего рода промежуточным этапом; способом понять самого себя как разработчика, а оттуда — как человека. В конце концов, это был любительский проект. Творческое самовыражение. Вещь, форма которой говорила нечто обо мне как о человеке, чего я стою, что я считаю правильным.
И тут приходит парень, который заставляет меня защищать вещи, которые ему не нравятся или которые он считает странными. В конце концов, я думаю, что он был более прав, чем я готов был признать в то время. Он ожидал обсуждения его идей по их заслугам, и поскольку в проекте не было чётко обозначено, что это моё хобби, то он вполне мог просить место за столом как равный. Он его не получил, и я раскаиваюсь, что в тот момент не видел ситуацию более ясно.
Уверен, что нечто подобное случилось бы раньше, если бы другой человек, который многое вложил в проект, но имеющий собственные идеи насчёт реализации, пришёл бы и начал делать изменения.
Вся эта ситуация заставила меня более внимательно следить за своей мотивацией при работе над открытыми проектами. Я остро осознал, насколько важно искать баланс между доверием пользователей к вам как мейнтейнеру (по любым заявлениям, которые вы делаете для своей библиотеки), и между тем, чтобы не ставить под угрозу концептуальную цельность проекта, когда они просят внести изменения.
Этот опыт также показал, что сохранить право собственности может быть непросто в open-source. Если код проекта опубликован под свободной лицензией, то принадлежит ли он своему создателю? Или он получил собственную жизнь, в которой его должны защищать пользователи как тот, с которым я встретился, даже если это означает отрезать создателя? Не это ли та причина, по которой у нас есть разрешающие лицензии и кнопка «Форк»?