PostgreSQL Logo В этой статье я хотел бы рассказать о том, как выглядит процесс разработки PostgreSQL глазами одного из контрибьютеров в этот самый PostgreSQL. Заниматься разработкой этой СУБД я начал в декабре 2015 года, когда устроился работать в компанию Postgres Professional. То есть, не так уж давно. А значит, еще свежи воспоминания о моментах, которые поначалу казались мне не вполне очевидными. Хотелось бы их законспектировать, чтобы новым людям, приходящим в нашу команду, а также всем тем, кто желает попробовать себя в роли разработчика открытой реляционной СУБД, было легче. Я расскажу о том, как выглядит процесс разработки PostgreSQL, какие инструменты я использую в своей повседневной работе, как следует оформлять патчи, и так далее. Заинтересовавшихся прошу проследовать под кат.

Набор инструментов


Вопрос, который будоражит умы миллионов — какую IDE или текстовый редактор использовать? :) Практика показывает, что разрабатывать PostgreSQL можно в чем угодно. Кто-то из моих коллег использует Sublime Text, кто-то предпочитает Vim, кто-то Emacs, также есть пользователи KDevelop и Visual Studio Code. Я лично первое время вполне успешно использовал CLion, сейчас же перешел на Vim + ctags. В общем и целом, главное, чтобы в редакторе была подсветка синтаксиса, переход к определению, возможно какие-то простые вещи вроде переименования переменных и проверки орфографии. Какие-то навороченные автоматические рафакторинги вам вряд ли понадобятся. Дело в том, что патч с результатом таких рефакторингов вряд ли так просто примут.

Второй не менее волнительный вопрос — какую ОС или дистрибутив Linux выбрать? У нас в компании многие разработчики используют Ubuntu. Также есть пользователи MacOS. Под Windows, вроде, никто не сидит — для разработки под эту платформу обычно запускают виртуалку. Есть один пользователь Arch Linux. Я лично долгое время пользовался Ubuntu, но недавно ударился головой и перешел на FreeBSD. В общем и целом, любая *nix система должна подойти.

PostgreSQL успешно компилируется GCC, CLang и Visual Studio, возможно и какими-то другими компиляторами (Intel C++ Compiler?). Более того, сообщество стремится поддерживать совместимость кода со всеми этими компиляторами. Так что компилятор вы можете использовать любой. Также вы можете использовать свой любимый отладчик, будь то GDB, LLDB, что-то встроенное в вашу IDE или какой-нибудь WinDbg.

Код PostgreSQL живет в Git. Помимо официального репозитория еще есть зеркало на GitHub, но это чисто зеркало. Открывать там issues и слать туда пуллреквесты бессмысленно. Во время разработки патча никому нет дела, какую систему контроля версий вы используете. Но патч обычно посылают в виде вывода команды git diff.

В первом приближении, вроде, ничего не забыл. Время от времени я также использую perf, tcpdump, strace/truss, dtrace, rr, lcov, различные статические анализаторы и другие инструменты. Но потребность в них возникает скорее в порядке исключения. Основные инструменты разработки — это текстовый редактор, git, компилятор, отладчик и, конечно же, мозг. Да, и еще почтовый клиент. Но об этом я расскажу ниже.

Сборка, прогон тестов и так далее


В настоящее время PostgreSQL использует Autotools. Autotools сам по себе не очень приятная штука. К тому же, не рассчитанная на Windows. Поэтому для сборки PostgreSQL под эту платформу предусмотрен специальный набор Perl-скриптов, что несколько костыльно. Мой коллега Юрий Журавлев пытается протолкнуть патч, переводящий PostgreSQL на CMake. Но там все непросто, так как текущая система расширений PostgreSQL сильно завязана на Autotools.

Все проекты, использующие Autotools, собираются примерно одинаково:

./configure --prefix=...
make -j4 -s
make check
make install

Для быстрого локального развертывания PostgreSQL я использую такой набор скриптов, многими из которых со мной поделился Стас Кельвич.

Тонкий момент, на который налетают все начинающие контрибьюторы в PostgreSQL без исключения — если вы внесли изменение в .h файл, не забудьте прогнать make clean. По умолчанию при изменении .h файла зависящие от него .c файлы не пересобираются. Если этого не знать, можно пронаблюдать широчайший спектр занимательнейших магических эффектов :)

Идея для первого патча, и как еще можно помочь проекту


Часто человека, находящегося в поисках идеи для патча, отправляют к списку TODO. На мой взгляд, это довольно вредный совет, по целому ряду причин. Во-первых, этот список не всегда находится в актуальном состоянии. Во-вторых, там есть пункты, про которые никто точно не знает, как их правильно сделать, и потому было решено просто добавить пункт в TODO, авось когда-нибудь придет прозрение. Наконец, в третьих, большинство задач из этого списка довольно сложны. Я бы советовал начать с чего-то попроще.

Проще всего поискать в коде и документации опечатки. Их там действительно много. Так происходит по той причине, что перед мержем предложенных патчей коммитеры часто их слегка переписывают, совсем чуть-чуть. В результате получается совершенно новый патч, который никто не вычитывал, отсюда и опечатки. Можно просто следить за новыми коммитами и каждую неделю присылать 1-2 патча. Исправлением комментариев к коду сложно что-то сломать, поэтому ваш патч охотно примут.

Бывает так, что какие-то куски кода можно немного отрефакторить. Это тоже довольно простое изменение. Делаем код красивее и правильнее, прогоняем тесты, если ничего не сломалось — предлагаем патч.

Исправление багов. В рассылку pgsql-bugs@ регулярно репортят баги (как правило, минорные). Обычно исправление бага — это халява. Пишем тест, воспроизводящий баг. Переписываем код так, чтобы тест больше не падал. Шлем патч.

Оптимизация. Тоже халява — код должен делать то же самое, только быстрее. Пишем бенчмарк, воспроизводящий проблему с производительностью, переписываем код так, чтобы он работал быстрее, шлем патч.

Улучшение документации и комментариев. Например, вы пытаетесь понять, как работает код, но не понимаете. Похоже, вы нашли место, где комментарии к коду можно улучшить!

Часто можно найти, что запатчить, собрав проект каким-то необычным компилятором (например, очень старой или очень новой версией GCC), на необычной платформе (ARM, PowerPC, ...) под необычной операционной системой (NetBSD, OpenIndiana). Тесты обычно не сыпятся, но пара варнингов при компиляции может проскочить. Еще часто помогает прогнать по коду какой-нибудь статический анализатор.

Если у вас нет идеи для своего патча, вы можете существенно помочь проекту, сделав code review и/или протестировав чужой патч. Программисты, как правило, очень любят писать код, но не особо любят ревьювить и тестировать его. Поэтому ревьюверов в сообществе PostgreSQL прямо реально не хватает. Ревьювером, кстати, быть довольно просто. Нужно убедиться, что патч применяется, код после этого компилируется и проходит тесты, а также что задача, которую перед собой ставил автор, при этом решена. Если вам не ясно, как это проверить, возможно, автор недостаточно хорошо это описал. Это повод задать вопрос автору в соответствующем треде и перевести патч в состояние waiting on author. А если при этом вы еще и в состоянии читать код и давать адекватные советы по переименованию переменных и разбиению процедур на несколько, то вам просто цены нет! О code review, выставлении патчей на коммитфест и различных состояниях патчей речь пойдет далее.

Про мейлинг листы и блоги


Все общение разработчиков PostgreSQL происходит в рассылке pgsql-hackers@. Еще имеет смысл подписаться на pgsql-committers@. Туда прилетают уведомления о последних мержах в мастер, иногда завязывается обсуждение конкретного коммита. Трафик в этих двух мейлинг листах не такой уж большой, это вам не LKML. Их вполне реально читать со своего основного ящика без каких-либо фильтров (правда, я читаю далеко не все треды подряд). Я лично получаю их все на рабочий e-mail.

Еще может иметь смысл подписаться на pgsql-general@ (общие вопросы) и уже упомянутый pgsql-bugs@ (багрепорты). Но, строго говоря, для разработки это не требуется.

По поводу выбора почтового клиента. В принципе, подойдет любой. Многие используют Thunderbird. Я долгое время сидел на Claws Mail, а сейчас переполз на Mutt. Видел, как кто-то из коллег использует GMail.

Хорошим тоном является не слать в рассылку HTML-письма. Текст письма по ширине стоит ограничить 72-я символами. Понятное дело, использовать можно только английский язык. Использовать аттачи, в отличие от того же LKML, не запрещается. Тяжелые аттачи лучше куда-нибудь заливать, а не слать напрямую в мейлинг лист.

В сообществе PostgreSQL, насколько мне известно, нет какого-либо code of conduct. Но это не отменяет необходимости быть вежливым, не использовать сарказм, никогда не переходить на личности, и так далее. Электронные письма, особенно на английском языке, часто получаются несколько сухими. Поэтому неплохой идеей будет использовать в тексте побольше слов вроде please, thank you, и так далее. Я лично стараюсь начинать любое письмо словами вроде «Thank you everyone for great comments!» и заканчивать чем-то вроде «As always, please don't hesitate to share any thoughts on this topic!». Попробуйте, и вы удивитесь, насколько дружелюбнее к вам станет сообщество.

Возможно, стоило бы сказать пару слов про основных действующих лиц в рассылке, таких, как Tom Lane, Simon Riggs, Robert Haas, Andres Freund, Alvaro Herrera, Bruce Momjian, и других. Но проблема в том, что действующих лиц довольно много, и кто конкретно заинтересуется вашим патчем заранее сказать трудно. Поэтому скажу лишь, что неплохой идеей будет первое время читать подписи людей, которые вам отвечают, смотреть, на каких доменах находятся их e-mail, поискать их имена в git log ну или в Google в конце-то концов.

Кстати, некоторые люди из сообщества PostgreSQL ведут блоги (которые как раз можно найти благодаря Google), на которые не лишено смысла подписаться. Я лично в настоящее время подписан на следующие связанные с PostgreSQL RSS-фиды:

# PostgreSQL
http://postgresmen.ru/news.xml
http://planet.postgresql.org/rss20.xml
http://habrahabr.ru/rss/company/postgrespro/blog/
http://www.postgrespro.ru/rss
http://www.postgresql.org/news.rss
http://postgresweekly.com/rss/1ijl6aaa
http://postgres-edu.blogspot.com/feeds/posts/default
http://feeds.feedburner.com/depesz
http://rhaas.blogspot.com/feeds/posts/default
http://amitkapila16.blogspot.com/feeds/posts/default
http://obartunov.livejournal.com/data/rss

Заметьте, что в список входит Планета PostgreSQL, которая агрегирует многие блоги, которых нет в списке.

Как послать патч


В общем случае, прежде, чем начинать работу над каким-то большим патчем, не лишено смысла написать в pgsql-hackers@ письмо-proposal с описанием того, что вы хотите сделать, как, и зачем. Может оказаться, что это никому особо и не нужно. Или наоборот, что это так нужно, что за последние лет 5 предлагалось несколько решений, о которых вы не знаете, и с которыми стоит предварительно ознакомиться. Ну или вам могут просто дать пару советов по реализации, куда стоит посмотреть, какие граничные случаи учесть, и так далее. Разработчики PostgreSQL — занятые люди, у которых своих дел хватает, так что не стоит бояться, что вашу гениальную идею кто-то тут же украдет. Скорее вам скажут, что это вряд ли будет работать, и предоставят возможность доказать обратное.

По поводу оформления кода. В PostgreSQL используется ANSI C, так что про всякие там С11, C++ или Rust сразу забудьте. Для форматирования кода используется утилита pgindent. Инструкцию по ее сборке вы найдете в исходниках PostgreSQL, в файле src/tools/pgindent/README. Перед созданием патча всегда прогоняйте код через pgindent, иначе его никто даже смотреть не станет. (Но следите за тем, чтобы pgindent не вносил изменения там, где вы ничего не меняли! В этом случае, возможно, код будет проще отформатировать вручную.) В остальном каких-то особо строгих правил нет. Просто смотрите, как оформлен код в районе того места, куда вы вонзаетесь, и старайтесь писать так же.

Когда патч готов, оправьте его в pgsql-hackers@, указав в subject метку [PATCH] и краткое описание. В теле письма расскажите, какую проблему решает патч, и каким образом он это делает. Почитайте архив рассылки, чтобы посмотреть, как это обычно выглядит. Если патч небольшой, например, исправляет пару опечаток, его могут принять сразу и без особых вопросов. В более сложных случаях патч нужно отправить на ближайший коммитфест:

PostgreSQL Commitfest

Коммитфест — это местное название спринта. Один коммитфест длится один месяц. Например, сейчас открыт сентябрьский коммитфест. Все новые патчи добавляются в него. В начале сентября начнется рассмотрение патчей из сентябрьского коммитфеста, а все новые патчи будут добавляться в ноябрьский (в октябре коммитфеста нет, месяц правятся баги и так далее). Так продолжается до марта, всего 4 коммитфеста — в сентябре, ноябре, январе и марте. Затем наступает кодфриз, правятся баги, формируются альфа- и бета-релизы.

Патчи на коммитфесте бывают в разных состояниях. Все они имеют говорящие названия. Needs review означает, что патчу требуется ревьювер. Waiting on author означает, что какие-то действия требуются со стороны автора патча. Ready for committer означает, что патч прошел кодревью и по нему больше нет вопросов. Один из коммитеров может ознакомиться с ним и либо вмержить, либо вернуть автору на доработку. Ну и так далее.

Запаситесь терпением. Если на ваш патч никто не реагирует, это не значит, что он никому не нужен. Просто сейчас все заняты другими патчами. Если ваш патч есть в коммитфесте и не висит в Waiting on author, про него никто не забудет, не переживайте. Если вам ответил ревьювер или коммитер, внимательно прочитайте ответ, внесите соответствующие изменения в патч и отправьте его новую версию. Спорить с ревьюверами или коммитерами, по моему личному опыту, занятие очень неблагодарное. Быстрее исправить код и послать исправленный патч. Более того, нередко потом понимаешь, что ревьювер или коммитер в общем-то был прав, а ты — нет. Впрочем, у некоторых моих коллег иной опыт, и они наоборот считают, что всегда нужно спорить.

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

Заключение


Дополнительные материалы для самостоятельного изучения:


Это все, о чем я хотел сегодня рассказать. Если у вас есть вопросы, я буду рад ответить на них в комментариях.
Поделиться с друзьями
-->

Комментарии (26)


  1. Tonkonozhenko
    25.08.2016 22:10
    +1

    Почему не используете гитхаб?


    1. Artem_zin
      26.08.2016 04:04
      +1

      Чтоб не контрибьютили, очевидно. Такая же беда с OpenJDK :( Мейлинг листы в 2016м == ~0 новых контрибьютеров извне.


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


      1. afiskon
        26.08.2016 11:09

        Мне кажется заниматься PostgreSQL, не работая над ним фулл тайм, вряд ли кто-то станет. Это попросту очень затратное по времени занятие. Так что «новая кровь» в лице тех кто не осилил послать git diff по почте не особо поможет. А может и навредит.


        1. Artem_zin
          26.08.2016 11:37
          +1

          Ну хз, вот например RethinkDB вполне имеет внешних контрибьюторов, Rust, Kotlin, и тд всё это сложные, большие проекты, но благодаря тому, что процесс контрибьюции всем известен и понятен он происходит.


          А то, что это контрибуция в PostgreSQL затратное по времени занятие скорее всего говорит о слабой документации и автоматизации процессов.


        1. Loriowar
          26.08.2016 16:11

          Комьюнити должно быть большим и разнообразным и если кто-то захотел что-то законтрибьютить, ему ничто не должно мешать. Чем больше людей вовлечено в процесс и может внести изменения, тем более качественным получится продукт. Осознанно отсекать часть потенциальных контрибуторов предположением, что только "фуллтайм адепты" могут вносить изменения — это не самая хорошая идея.


          1. afiskon
            26.08.2016 16:37

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


            1. cleaner_it
              27.08.2016 15:11

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


              1. vadv
                27.08.2016 15:21
                +2

                github — это вообще не явление, github — это сторонняя компания, мне кажется это одна из причин по которой не ведется разработка таких проектов как linux/kernel, freebsd или PostgreSQL на github.


    1. afiskon
      26.08.2016 11:11
      +1

      Как мне кажется, это очень мудрое решение. Разработка такого крупного проекта не должна зависеть от новых блестящих SaaS, время от времени меняющих интерфейс на новый, типа улучшенный и более удобный. Алсо GitHub пару раз в год стабильно лежит. С репозиторием PostgreSQL на моей памяти такого ни разу не случалось.


  1. rrrav
    25.08.2016 23:19
    +2

    Спасибо, очень интересно описали внутреннюю кухню разработки для Postgres «по правилам». Postgres — это, конечно, целое явление в мире ОпенСорс.

    Тонкий момент, на который налетают все начинающие контрибьюторы в PostgreSQL без исключения — если вы внесли изменение в .h файл, не забудьте прогнать make clean.

    Увы, это имеет место не только в разработке для Postgres. Поправить одну строчку в .h, и ждать полчаса на сборку всего пакета.
    И еще, хотелось бы услышать ваше мнение о ветке Postgres для 1С, насколько это соответствует стандартам разработки в мире Postgres.


    1. afiskon
      26.08.2016 11:12
      +1

      Ну справедливости ради PostgreSQL даже с флагами оптимизации на моем стареньком ноутбуке собирается за пару минут с нуля.

      Сборка PostgreSQL заточенная для 1C, насколько я знаю, никаким стандартам разработки в мире PostgreSQL не противоречит.


  1. chemtech
    26.08.2016 06:10
    +1

    Может у Вас есть время и желание проверить PostgreSQL с помощью PVS-Studio?

    «Если анализатором PVS-Studio заинтересуется кто-то из разработчиков проекта PostgreSQL, мы готовы предоставить им на время регистрационный ключ. Прошу написать их нам в поддержку.»

    https://habrahabr.ru/company/pvs-studio/blog/207148/


    1. afiskon
      26.08.2016 11:14
      +1

      Я как-то проверял, версией PVS-Studio для Windows еще. Послал пару патчей, один был про бинарный сдвиг на отрицательное число, второй не помню. Можете поискать патчи от меня по git log, их там не много.

      Сейчас жду бету для Linux. Если дадут, буду регулярно прогонять ею.


  1. Evengard
    26.08.2016 09:23
    +1

    Вот бы ещё подобную статью но про Qt…


    1. afiskon
      26.08.2016 11:15
      +3

      Согласен, я бы сам с радостью почитал такие статьи про другие проекты.

      Могу написать такую же про FreeBSD, если она будет кому-то интересна. У меня есть пара контрибьюшенов в дерево портов + я временами репорчу минорные баги в ядре.


      1. RAMAZAN
        26.08.2016 12:05
        +1

        Обязательно напишите, эта тема очень интересная.


      1. gold_user
        26.08.2016 16:38
        +1

        Можно пример вашей работы по репорту ошибок?


        1. afiskon
          26.08.2016 16:38
          +1

          Конечно. Вот из последнего https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=211895


          1. gold_user
            26.08.2016 17:20

            Понял. Пересекались в сети и общались. Моя работа на bugzilla тоже есть, но афишировать не желаю.


            1. afiskon
              26.08.2016 18:10

              Интернет — большая деревня :)


  1. afarber
    29.08.2016 09:47
    +1

    Не могли бы Вы написать подробнее, как делать code review?

    Где увидеть еще не принятые патчи и куда писать свой code review?


    1. afiskon
      29.08.2016 11:02

      На коммитфесте ищем патчи имеющие состояние Needs Review и с пустым полем reviewer. Можно при желании стать ревьювером к задачи у которой уже есть ревьювер, это не возброняется. Но становится ревьювером к задаче которая waiting for committer довольно бессмысленно.

      Ревьювим. Находим соответствующий тред. Пишем туда что-то в таком стиле. Только здесь конкретно я нафакапил, так как поломал тред (надеюсь что сегодня его починю). Просто написать письмо с правильным subject, чтобы оно попало в тред, недостаточно, нужно в письме проставить правильный заголовок In-Reply-To. Или просто следить за тредом с самого начала.

      В первом приближении как-то так.


  1. stalkerg
    30.08.2016 16:26
    +1

    Есть один пользователь Arch Linux.

    У нас 3 пользователя Arch Linux и 2 пользователя Gentoo Linux (включая меня). Ubuntu всё меньше и меньше.


    1. vadv
      30.08.2016 16:39
      +2

      у нас еще 3 пользователя fedora, в том числе был и майнтейнер fedora, а сейчас штатный сотрудник Red Hat.


      1. afiskon
        31.08.2016 12:54

        Я тут подсчитал — пользователей FreeBSD на самом деле тоже трое (один скрывается и держит фряху только дома). Не приврешь — красиво не расскажешь :)


  1. afiskon
    02.09.2016 14:09

    Совсем забыл, есть еще релевантная страничка на wiki: https://wiki.postgresql.org/wiki/Reviewing_a_Patch