Мы продолжаем серию интервью с разработчиками Postgres Professional, которые получили медали за вклад в ванильный PostgreSQL. Почему полезен даже не принятый сообществом патч и при чём здесь везение, сегодня расскажет Александр Пыхалов.

У Александра три или четыре медали за вклад в ванильный PostgreSQL, точное количество он не помнит. Да и зачем? Одну получил за изменения функциональности postgres_fdw, ещё одну — за исправление бага. А самую заметную медаль ему выдали за поддержку проталкивания полусоединений (semi-joins) на сторону удалённого сервера. Она позволяет полностью выполнять запросы вроде  SELECT * FROM  t1 WHERE a IN (SELECT a FROM t2 WHERE t1.b<t2.b) на удалённом сервере, если таблицы T1 и T2 расположены на одном сервере.

Большой успех и маленькие неудачи

С ванильным Postgres Александр работал давно, но контрибьютить начал только с приходом в Postgres Professional. 

Среди его последних удач: патч, который приблизил работу SQL-функций к pgSQL-функциям, вошёл в 18-ю версию PostgreSQL. Дело в том, что раньше SQL-функции Postgres использовали только машинерию generic-планов и не обращали внимания на заданные параметры. В результате планы для секционированных таблиц получались не очень: секции не отсекались, так как параметры не были известны. Александр добавил в SQL-функции использование кастомных планов, которые обрабатываются в зависимости от заданных параметров, как это реализовано в pgSQL.

Идея понравилась лидеру сообщества Тому Лейну, который закоммитил код патча, переписав его больше чем наполовину. Александр ничуть не расстроился: «Главное — не авторство коммита, а то, что SQL-функции стали намного ближе к pgSQL-функциям». 

Ещё ему удалось запушить в сообщество исправление багов, связанных с пуш-дауном foreign join в postgres_fdw. 

А вот пуш-даун соединения функции с foreign-таблицей сообщество не приняло, несмотря на все усилия Александра и его коллеги Глеба Кашкина. Возможно, ребята не обработали пограничные случаи или не рассмотрели спорные моменты, но ведь, помимо контрибьютерских, у них были более важные рабочие задачи. Времени на всё не хватило, пришлось выбирать. 

Случается, что предложенные патчи намертво застревают. Например, в сообществе очень ждали патч, который пробрасывает вычисления агрегатов над секционированной таблицей на сторону удалённого сервера. Александр с коллегами застряли на том, что нужно передавать внутреннее представление агрегата по сети, а оно было нестабильным — менялось от одной версии PostgreSQL к другой. Простая проверка версий Postgres сообщество не устроила, и большой патч завис. Позже за него брались японцы, но и они не довели дело до конца.

Отсюда мораль: время и терпение — лучшие друзья контрибьютора.

Решения небольших очевидных проблем, которые всех «достают», обычно доезжают до коммита за пару недель. Над теми же, что посложнее или не на виду, можно работать годами. И результат здесь не гарантирован. Например, Александр с коллегами подготовили большой патч — проброс стабильных выражений на удалённые foreign-серверы. Сообщество попросило его доработать, а потом в Shardman закрыли эту функциональность другими средствами, и патч стал не интересен — он до сих пор висит. 

Зачем контрибьютить в PostgreSQL

Контрибьюторство — это возможность сохранять знания и навыки. Патчи достаточно сложны, и, чтобы сообщество приняло их, авторам нужно доказать пользу и потратить на это немало сил. Иногда в процессе обсуждения одного патча приходят идеи относительно других.

Александр Пыхалов

Разработчик в Postgres Professional

Отдавая изменение сообществу, мы уменьшаем затраты на поддержку этого кода: ведь если связанный код будет эволюционировать, наш код тоже поправят. Естественно, для этого изменение должно быть востребовано. Часто в процессе обсуждения изменения мы обнаруживаем ошибки или недочёты, которые изначально не были видны. Иногда во время ревью патч эволюционирует во что-то более полезное. Но все пожелания сообщества удовлетворить сложно. Критерий «для меня патч уже достаточно хорош» здесь не действует. 

Ну и, конечно, приятно, когда твой код попадает в такой проект, как PostgreSQL.

Советы начинающим контрибьюторам

Чтобы контрибьютить в сообщество, нужно не только сильно этого хотеть, но и ответить для себя на вопрос, зачем оно вам надо. 

Александр Пыхалов

Разработчик в Postgres Professional

Бывает страшно, что ревью моего кода будет слишком поверхностным и мёрж-реквест коллеги одобрят слишком быстро. Победить этот страх можно, если отправить код на обсуждение сообществу. 

Вот пара случаев из моей практики:

  1. Предложил асинхронный мёрж-аппенд — шевеление было, но затихло. 

  2. Предложил разработать способ ограничить объём памяти для postgres_fdw (сейчас он может съесть неограниченное количество памяти). Переписка шла, но результата не было.

Даже несмотря на то, что обсуждения в обоих случаях не привели к результату, обратная связь оказалась полезной.

Как помочь патчу появиться в продукте?

Самое главное — понятно объясняйте людям, зачем нужен ваш патч, покажите его важность. Для этого чётко сформулируйте решаемую проблему и приведите примеры использования патча. С исправлением ошибок обычно проще, а вот новую функциональность надо хорошо обосновать. 

Даже востребованную функциональность можно обсуждать годами. Почему? Например, вы не учли краевые случаи, и сообщество захочет получить более качественный или обобщённый код. 

Второй фактор — удача. Потенциальный ревьювер может просто не заметить ваше сообщение. А может и заметить, тогда ваш звёздный час будет не за горами!

Удачи мы пожелаем всем, кто сомневается, надо ли начинать контрибьютить. Вперёд!