Нам нужны твои мозги

Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.

На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решение.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Фронт: Исправить поиск Chrome в estimo

Для новичков, задача на неделю

Estimo запускает JS-файл в Puppeteer (Chrome без UI) и сообщает, сколько потребовалось времени на компиляцию и запуск файла. Size Limit использует его для оценки времени выполнения JS-бандла.

Puppeteer очень долго скачивает сборку Chrome. В 1.0 Estimo перешел на Puppeteer Core и самм начал искать и скачивать Chrome. В итоге, если у пользователя уже установлен браузер Chrome, Estimo может использовать его.

Однако, код поиска и скачивания Chrome работает плохо, особенно на Travis CI. Нужно переписать код и исправить ошибки.

Польза: получить глубокий опыт в работе Puppeteer.

  1. Форкнуть estimo.
  2. Изучить, как Puppeter скачивает Chrome.
  3. Изучить findChrome.js.
  4. Добавить в findChrome.js поддержку переменных окружения PUPPETEER_.
  5. При поиск Chrome надо проверить его версию Chrome, запустив его с --version. Она должна быть больше 75. Если меньше, мы не используем встроенный Chrome.
  6. Проверить findChrome.js в Travis CI при addons: chrome в .travis.yml и без.

— Можно мне взять эту задачу?

Все задачи на этой странице еще не решены. Если задача вам интересна — берите и смело делайте. Спрашивать разрешения и становиться в очередь не нужно. Даже если кто-то сделает задачу быстрее вас, не останавливайтесь — ваше решение может быть лучше. Это Open Source!

Помощь запрашивает Вова Дем Вова ДемВова Дем

Бэк: Store Attribute: поддержка значений по умолчанию

Для уверенных в себе, задача на выходные

Gem store_attribute добавляет возможность приведения типов для атрибутов Active Record моделей, созданных с помощью store_accessor.

Данный gem предоставляет интерфейс (и использует «под капотом») Attributes API, за исключением возможности указания значений по умолчанию.

Необходимо добавить данный функционал в gem.

Польза: узнать, как устроен Attributes API в Active Record, принести пользу Rails сообществу.

Инструкции по выполнению

  1. Ознакомиться с более подробным описанием задачи.
  2. Форкнуть проект store_attribute на GitHub.
  3. Реализовать необходимый функционал.
  4. Сделать Pull Request.

Помощь запрашивает Андрей Ситник Андрей СитникАндрей Ситник

Фронт: Умная установка Lefthook в npm

Для новичков, задача на неделю

Lefthook — менеджер git-хуков, написанный на Go. Для удобства фронтенд-разработчиков он распространяется и через npm. Сейчас в npm-пакете лежат 3 бинарника для популярных ОС и скрипт, который запускает нужный бинарник.

Нужно сделать умнее:

  1. Грузить бинарник только для нужной ОС в postinstall скрипте.
  2. Напрямую запускать этот бинарник без траты времени на запуск JS VM для скрипта.

Польза: получить глубокий опыт в работе npm.

  1. Форкнуть Lefthook.
  2. Изучить, как Puppeteer скачивает бинарники в postinstall.
  3. Добавить скрипт загрузки бинарника и добавить его в postinstall. Скачивать нужно не последнюю версию, а равную версии из package.json.
  4. Если стоит переменная среды LEFTHOOK=0, не скачивать бинарник.
  5. Разобраться, как напрямую запускать бинарник в npx lefthook и в node_modules/.bin/lefthook.

Помощь запрашивает Долганов Сергей Долганов СергейДолганов Сергей

Бэк: Создание библиотеки Refinement Types на Node.js (для построения контрактов)

Для продвинутых, задача на неделю

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Node.js.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

Польза: создать гибкую и универсальную Node библиотеку, вдохновленную функциональным программированием.

Советы по реализации

Что такое Refinement Type? Это контейнер c правилами валидации для произвольного значения.

Особенности:

  • валидация должна прогоняться отложенно (lazy);
  • только один раз на значение (мемоизация);
  • безопасный способ проверить является ли значение валидным — метод-предикат isValid;
  • при попытке извлечь значение (метод с названием unpack, например):

    1. если валидация еще не запускалась — запустить;
    2. если валидация запускалась и она прошла успешно, должно вернуться значение;
    3. если валидация запускалась и она прошла не успешно, должна произойти ошибка.

Простейшая композиция типов должна быть реализована по принципам Algebraic Data Types.

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

Помощь запрашивает Долганов Сергей Долганов СергейДолганов Сергей

Бэк: Создание библиотеки Refinement Types на Go (для построения контрактов)

Для продвинутых, задача на неделю

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Go.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

Польза: создать гибкую и универсальную Go библиотеку, вдохновленную функциональным программированием.

Советы по реализации

Что такое Refinement Type? Это контейнер c правилами валидации для произвольного значения.

Особенности:

  • валидация должна прогоняться отложенно (lazy);
  • только один раз на значение (мемоизация);
  • безопасный способ проверить является ли значение валидным - метод-предикат isValid;
  • при попытке извлечь значение (метод с названием unpack, например):

    1. если валидация еще не запускалась — запустить;
    2. если валидация запускалась и она прошла успешно, должно вернуться значение;
    3. если валидация запускалась и она прошла неуспешно, должна произойти ошибка.

Простейшая композиция типов должна быть реализована по принципам Algebraic Data Types.

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

Помощь запрашивает Сергей Долганов Сергей ДолгановСергей Долганов

Бэк: Добавить новые источники данных в Ossert: Reddit

Для уверенных в себе, задача на несколько дней

Нужно добавить в Ossert новые источники данных. Отличным кандидадатом с достаточно богатым API является Reddit.

Это позволит охватить еще один важный аспект развития Open-Source библиотек — доступность и объем поддержки, а также заинтересованность в них.

Польза: возможность научиться работать с API Reddit и узнать больше о метриках и поведении разработчиков свободного ПО.

Как это должно работать?

На данный момент сбор информации уже работает для Rubygems, Github, Bestgems и StackOverflow. Необходимо совместимым образом организовать сбор с новых источников.

Советы по реализации

За основу предлагается взять любой из существующих классов для сбора в Ossert. Например, Ossert::Fetch::Rubygems, и реализовать класс, осуществляющий сбор интересной информации:

module Ossert
  module Fetch
    class Reddit
      def initialize(project)
        ...
      end

      def process
        # Метод сбора основных метрик по проекту
      end
    end
  end
end

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

Для этого нужно проанализировать возможность API вашего источника данных и выбрать:

  1. параметры для сбора;
  2. полезные метрики, которые можно измерить на их основании.

Например:

  • «сколько было комментариев к постам о проекте с момента последнего релиза»;
  • «сколько уникальных пользователей комментировали посты о проекте».

А затем, конечно, организовать сбор этих метрик и параметров.

Инструкции по выполнению

  1. Форкнуть проект Ossert на Github.
  2. Реализовать необходимый функционал.
  3. Сделать Pull Request.