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

Опыт друга, новичка в open source, говорит об обратном. Первый его pull request #11680 приняли в звездный spring-boot без обсуждения и без единого комментария от мейнтейнеров. Его исправления будут доступны уже в версии 2.0.0.RC1



Не боги горшки обжигают. Рассуждения о возможности стать контрибьютором крупного проекта на github…

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

А удерживает ли это интернет тролля от публикации? И что такое бокс по переписке? Все эти ютуб видеобатлы всерьез? Среда виртуальная, вряд ли мейнтейнер проекта — необузданный психопат и знает где ты живёшь… Все еще страшно?

У медиков есть шутка что нет здоровых людей, есть недообследованные. Так же и в мире open source — нет идеального кода, в каждом модуле есть душок — code smell. Как обнаружить его новичку, всегда ли субъективны критерии чистоты кода? Есть инструменты статического анализа кода sonarqube, pvs-studio, SpotBugs, code inspection в Idea. Попробуйте запустить их на знакомом проекте и вы и удивитесь! Вам это лень?

Наконец, вы придумали «инновационный JS фреймвор с виджетами». Думаете, выложив на github, его сразу украдут, обфусцируют и продадут в Сколково? Понимаю что вы тратили свое свободное время. Воображение рисует как будете привлекать инвестиции и покупать себе красную Ferrari. У вас есть модель монетизации и план развития вашего «секретного» проекта? Насколько востребована и уникальна эта идея. Как быстро устареет код и идея? Сможет ли проект развиваться без вас? Жалко отдавать его бесплатно?

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

Возвращаясь к истории Андрея и его вклад в open source.

Мы учились вместе в университете, он с нашей кафедры, на 3 курса младше меня. С интересом делал лабораторные задания по программированию и профильным дисциплинам, тратил свободное время за компилятором и книгами.

Но после университета и военной кафедры его призвали служить. Это время из его карьеры разработчика было потеряно. Вернувшись, ему было непросто найти работу по специальности без опыта работы после университета. Опыт не наберешь без работы, на работу не берут без опыта — замкнутый круг. Маленький городок, где живут они с женой не изобилует IT вакансиями. Поработал в банке сисадмином. Потом ради работы программистом, стал ездить на работу за 80км от дома. И до сих пор так ездит на работу… На работе совсем нет времени на open source — был проект в крупном интеграторе копать от забора до обеда. Развитие и обучение было, в основном, в его свободное время. Он очень умный и целеустремленный, но резюме и время службы оборачиваются против него, когда проходит через жернова формальностей у HR.

Недавно разговорился с Андреем и рассказал ему про результаты анализа кода spring boot в sonarcloud. У нас время от времени бывают дискуссии про технологии и процесс разработки.

Предложил помочь с улучшением кода boot. Он сомневался, что его pull request примут в такой крупный проект. Я порекомендовал ему сконцентрироваться на исправлении одного типа дефектов и взять в работу не очень сложный code smell. Он выбрал «String function use should be optimized for single characters».

Суть этого «запаха кода» в том что, в объекте java.lang.String есть методы indexOf и lastIndexOf, которые можно вызвать с параметром char вместро String из одного символа и для случая строки с одним символом они работают эффективнее.

Не эффективно:

String myStr = "Hello World";
// ...
int pos = myStr.indexOf("W");  // Noncompliant
// ...
int otherPos = myStr.lastIndexOf("r"); // Noncompliant
// ...

Лучше написать так:

String myStr = "Hello World";
// ...
int pos = myStr.indexOf('W');
// ...
int otherPos = myStr.lastIndexOf('r');
// ...

Как результат — он немного улучшил то, чем пользуются многие java разработчики в повседневной работе. Надеюсь, что у Андрея в будущем появится возможность улучшать на работе open source инструменты и фреймворки, которые он использует, вместе с коллегами!



На Хабре точно есть люди, которые смогут вам помочь советом. Так познакомился с raiym сначала на github, а потом и здесь. lany рассказывал о судьбе его проекта HuntBugs и как можно использовать статический анализ кода из Idea в командной строке.

Мой главный совет новичкам — не бояться open source и пробовать исправлять код «с душком». Следуйте примеру Андрея!

А что удерживает вас от вклада в open source?

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


  1. lany
    24.01.2018 09:12
    +1

    Я всё же стараюсь не лезть в новый проект с косметикой, а найти действительно баги. Статический анализ тут тоже помогает. Вот, например, мой pull-request в JIT-компилятор Graal. Признаюсь, я даже не собрал его, когда закидывал пулл-реквест. Там своя доморощенная система сборки, никакой maven/gradle/ant/etc., которая к тому же плохо работала под виндой, её тоже чинить пришлось.


    1. igor_suhorukov Автор
      24.01.2018 09:27

      Статья больше о пороге входа в open source для новичков. Понятно, что когда заглядываешь под капот jfluid в visualvm, там не до code smell — слеза на глазах наворачивается.


    1. Barafu
      24.01.2018 17:51

      Вот из-за этого подхода малкие баги висят годами, все заняты чем-то более возвышенным. И не только в народных разработках. Вот, в русской версии дров Nvidia опечатка на самом видном месте уже 8 лет висит.

      Пройтись по проекту, прилизать интерфейс, поправить опечатки и двусмысленные надписи — это сразу +100500 к UX.


      1. lany
        25.01.2018 06:19

        Вы меня неправильно поняли. Опечатка в интерфейсе — это «действительно баг». А использование в коде одной конструкции вместо другой, которая такой же длины, такой же понятности и, вероятно, даёт исчезающе малый прирост производительности, — это косметика. Я про косметику в коде, а не в том как приложение выглядит для пользователя.


  1. dididididi
    24.01.2018 09:23

    Не понял, чем первый код отличается от второго.


    1. igor_suhorukov Автор
      24.01.2018 09:24

      в первом случае строка " ", во втором char ' '


      1. Akuma
        24.01.2018 11:22

        А есть реальные тесты производительности?

        Что-то это попахивает «не используйте двойные кавычки в PHP», когда уже давно нет никакий разницы (если вы конечно не экономите сотые от наносекунд). А когда она была, то ее никто никогда не замечал.

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


        1. igor_suhorukov Автор
          24.01.2018 11:35

          Так компиляторы разные есть. Их исходники не проверял. Кто-то в eclipse, кто-то в openjdk собирает. Не все используют последние версии JDK и т.п. В реализации этих функций смотрел.

          А про реальные тесты производительности смог бы ответить Андрей. Но у него нет здесь аккаунта.


          1. lany
            24.01.2018 12:35

            В наши дни особо пачкаться не стоит. Оба вызова интринсифицируются, для обоих есть специальный узел в IR. Я бы не заморачивался возможными различиями в производительности.


            Надо помнить, что у такого pull-requesta есть и минусы. Например, засоряется история коммитов, усложняется git blame. Автоматизированные системы, которые назначают ответственного за исключение или предлагают ревьювера для кода, могут предложить человека, который внёс такую косметическую правку, а не реального автора кода.


          1. LionZXY
            25.01.2018 07:48

            А зачем Андрей? Сложно JMH запустить?


  1. eGGshke
    24.01.2018 09:54
    +1

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


    1. igor_suhorukov Автор
      24.01.2018 10:01

      Надеюсь вам повезет! По своему опыту могу сказать, что мне сложнее провести pull request в проект с 270 звездами чем исправить потенциальные утечки в spring-boot. Так что логики никакой нет, пробуйте!


    1. Oplkill
      24.01.2018 20:28

      Возьми этот: github.com/ip-gpu/UniversalPauseButton
      Программа которая ставит текущую открытую программу(та что в фокусе) на паузу через глобальный хук кнопки. Очень удобно в играх где нет реализации паузы во время роликов или диалогов, а надо отойти от компа…


      1. mib
        25.01.2018 00:09

        Любопытно. А есть возможность делать не паузу, а замедление? ну как-бы последовательное нажатие и отпускание паузы, чтобы игра не отваливалась от сокета, но не рендерила 60 фпс в бэкграунде?


  1. SirEdvin
    24.01.2018 10:44

    Реальные проблемы, это то, что не считая мелких исправлений косметических недочетов, которые ни что иное, как в основном вклад ради вклада, то подготовка какого-то вклада в open source занимает кучу времени, за которое платят довольно мало работодателей, а в свободное время есть куча других занятий.


    Про выложи свой проект вообще смешно. Я думаю, вы понимаете, чем отличается внутренний модуль в кампании и open source проект? Вот у меня есть модуль для работы с форматом todo.txt из python кода. Он лежит в открытом доступе и все-такое, но блин, я бы не назвал это open soruce проектом, например, потому что у него пока нет нормальной доки.


    Со своим вкладом в крупных продукт такая же фигня. Обычно, если это не косметические всем понятные изменения, надо грамотно их написать, создать правильно описанные pull request и issue, протестировать и написать там автотесты/доку, а потом ждать у моря погоды. Потому что иногда автор забрасывает проект и все довольно печально (например, pyshop). Ну или не считает ваш pr важным.


    1. igor_suhorukov Автор
      24.01.2018 10:57

      Даже «косметические» улучшения увеличивают производительность и улучшают читаемость.

      По поводу работы не поспотрю. В инвестбанках политика с open source преимущественно потребление. А бюрократии даже с легальным использованием библиотек хватает. В сравнении с этим пул реквест на github — приятная прогулка.

      свободное время есть куча других занятий.

      Тут каждый сам решает. Играть в игры, смотреть зомби ящик или opensource. Я в свободное время пару часов в неделю нахожу. Особенно, если это открытая часть моего личного проекта.

      Андрей тоже не на работе ошибки в spring-boot правил.

      Желаю, чтобы вашему проектов кто-нибудь из новичков помог с документацией.


      1. SirEdvin
        24.01.2018 10:59

        Тут каждый сам решает. Играть в игры, смотреть зомби ящик или opensource. Я в свободное время пару часов в неделю нахожу. Особенно, если это открытая часть моего личного проекта.

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


        1. igor_suhorukov Автор
          24.01.2018 11:08

          Вы правы, что написание поддерживаемого кода и прототипа различаются. В последнее время я разгребали Авгеевы конюшни на работе. При этом в opensource замечал за собой стремление поговнокодить. Борюсь с энтропией своего кода всеми силами. SonarQube/SonarLint бьет мне за код по рукам. Посмотрите, может и вам пригодится


          1. SirEdvin
            24.01.2018 11:14
            +1

            Ну, у меня на том проекте даже 100% покрытые тестами главного модуля есть :)
            Ну и + pylint с набором и CI.
            Но вот с документацией пока беда :(


            1. igor_suhorukov Автор
              24.01.2018 11:21

              Ух ты! Редкость для маленьких проектов.


            1. igor_suhorukov Автор
              24.01.2018 11:23

              Вдруг кто-то из тех кто хочет сделать вклад в open source и читает сейчас комментарии вам поможет с документированием.


            1. igor_suhorukov Автор
              24.01.2018 11:37

              eGGshke интересно будет?


              1. eGGshke
                25.01.2018 09:27

                Да, с радостью бы поучаствовал.


  1. kosmonaFFFt
    24.01.2018 12:09
    +1

    Я например правил небольшой баг в NetBeans, самое сложное было — подписание соглашения о контрибуции ораклу всех прав на код. Плюс мы с коллегой по прошлой работе фиксили баг в Hibernate, коллега потом отправлял его в апстрим — тоже особо никаких трудностей не было. Так что особо ничего сверхсложного в этом нет.


    1. igor_suhorukov Автор
      24.01.2018 12:13

      Это точно. Все зависит от мейнтейнеров проекта. В pivotal легко подписать лицензию


  1. dernasherbrezon
    24.01.2018 12:12
    +1

    Почему-то все новички думают, что open source проектам нужно коммитить только изменения в дизайне и архитектуре. Передавайте привет Андрею. Он молодец.


    Кстати, напомнило One Man’s Quest to Rid Wikipedia of Exactly One Grammatical Mistake


    1. igor_suhorukov Автор
      24.01.2018 12:16

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


  1. Dreyk
    24.01.2018 13:16
    +1

    а вот это точно правильный фикс?
    int end = value.indexOf("\""); превратилось в int end = value.indexOf('\"');


    1. lany
      24.01.2018 13:27

      Мелочи жизни, так тоже можно писать. Главное чтобы "'" не превратилось в ''' :D


    1. vlanko
      25.01.2018 13:37

      да, проверил, это тоже char


  1. Ranckont
    24.01.2018 13:40

    Искать по гитхабам достаточно долго. Может организовать какой-то сервис, где авторы сами напишут, что в их проекте надо сделать/доделать?
    Или может есть такой?


    1. dernasherbrezon
      24.01.2018 14:19

      Да, есть


    1. mokhin-denis
      24.01.2018 15:43

      Есть еще вот это


    1. lany
      25.01.2018 06:28

      В проектах где много открытых тикетов и авторы сами заинтересованы в новых контрибьюторах, обычно есть какой-нибудь специальный тэг на тикетах типа «good first issue» — несложная вещь, до которой просто руки не дошли, но новичок вполне может с ней справиться.

      Но помните, что не все проекты вообще заинтересованы в новых контрибьюторах.


  1. raiym
    24.01.2018 14:27

    Игорь, спасибо за статью =)
    За код и поддержку в проекте!


    1. igor_suhorukov Автор
      24.01.2018 16:23

      Райм, тебе спасибо за библиотеку и помощь!


  1. BullDER
    24.01.2018 16:42

    А можно и так и сразу себя в контрибьютеры занести


  1. lastrix
    25.01.2018 05:48

    В свое время так же занимался правкой багов во freecol. Одновременно писал к нему новый ИИ, который бы никогда не закончил.
    Пока писал ИИ, с его помощью нашел баг в сервере.
    В целом помощь в рефакторинге, исправил пару багов в клиенте и один в сервере.
    Вроде бы участвовал только пару месяцев, зато очень хорошо помогло войти в курс дела разработки на Java. По времени ушло где-то 80 часов рабочего времени летом, а опыт использую до сих пор.


    Если хотите чему-то научиться — ставьте себе невыполнимые задачи и шаг за шагом ее реализуйте. А опенсорс для этого самое лучшее начало. Гнаться за деньгами вот так вот сразу — бесперспективно. В любой области.


  1. wladyspb
    25.01.2018 19:32
    +2

    Мой первый опыт пулл реквеста на гитхабе — вообще не код) В одной из игр, в которые я довольно увлечённо играл, был неполный и изобилующий опечатками перевод, я тихо злился, а потом решил сделать хорошее дело — вылизал опечатки, постарался сделать адекватный перевод жаргонизмов, допилил те места, которые не были переведены(с каждым обновлением игры добавляется несколько строк в языковые файлы, так что это даже не косяк предыдущего переводчика — он просто не стал продолжать). Никаких проблем не возникло, и мой пулл реквест приняли после новогодних праздников, чему я очень рад, хоть это и не имеет отношения к программированию) И возможно, теперь мне будет легче начать участвовать в опенсорсе)


  1. Maccimo
    26.01.2018 01:43

    Как новичку сделать вклад в open source проект с 20К звездами?

    Да хоть 65536К, какая разница-то?


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


    Есть в проекте есть мешающий лично тебе баг или интересная лично тебе фича — берёшь, делаешь её и засылаешь PR. Количество стразиков в профиле проекта тут совершенно роли не играют.


    Но после университета и военной кафедры его призвали служить. Это время из его карьеры разработчика было потеряно. Вернувшись, ему было непросто найти работу по специальности без опыта работы после университета.

    Скупая айтишная слеза скатилась по щеке читателя.


    1. lany
      26.01.2018 08:00

      Количество стразиков в профиле проекта тут совершенно роли не играет.

      Думаю, количество звёзд коррелирует с забюрократизированностью проекта.


    1. igor_suhorukov Автор
      26.01.2018 09:42

      Скупая айтишная слеза скатилась по щеке читателя.

      В случае войны, правда, скупая слеза скатится по щеке офицера по рядовым…

      Да хоть 65536К, какая разница-то?

      Сложнее принимают pull request. Когда изменение одного символа проходит через:
      1) создать стори в JIRA
      2) создать бранч в git server project
      3) создать бранч в git front project
      4) исправить кавычку в server
      5) добавить тест в front
      6) прогнать все тесты
      7) pull request
      8) merge 1
      9) merge 2
      10) close story


      1. Maccimo
        26.01.2018 17:45

        Сложнее принимают pull request.

        Вы же понимаете, что это не от звёздочек зависит, а от владельца проекта.
        20К может быть и у какого-нибудь гипотетического leftpad-а, написанного одним человеком за вечер. А звёздочки набрались за те десять лет, что он лежит на гитхабе.


        1. igor_suhorukov Автор
          26.01.2018 18:16

          Тут зависит. Проект очень популярен в java community — spring-boot существует чуть больше чем три года.


          1. Maccimo
            26.01.2018 18:48

            Тогда стоило писать не про «20К звёзд», а про востребованность и популярность.
            Популярным может быть и проект с репозиторием на собственных серверах.
            Те же Apache Commons только недавно стали переходить на GitHub в качестве основного репозитория.


            1. igor_suhorukov Автор
              26.01.2018 20:47

              Вас огорчило содержание статьи?
              Apache Commons — это скорее наследие. DBCP уже не торт, logging — капролит, io разве что местами удобнее nio из новых релизов java.