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

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

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

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

Бэк: AnyCable: Rack-совместимый сервер

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

AnyCable позволяет использовать сторонние WebSocket-сервера, более производительные и конкурентно-способные, вместе с Action Cable.

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

И хотя AnyCable предполагает использование стандартного Action Cable сервера при разработке и тестировании, многие разработчики (см. например, статью From Action to Any) предпочитают запускать полноценную конфигурацию локально.

Чтобы упростить локальную разработку, мы предлагаем написать AnyCable-совместимый вебсокет-сервер на Ruby с Rack интерфейсом.

Польза: познакомиться с AnyCable, получить опыт написания конкуретных приложений на Ruby.

Советы по реализации и предполагаемый API

Предполагается, что сервер будет монтироваться в приложение как Rack приложение. Например:

# config/routes.rb
Rails.application.routes.draw do
  mount AnyCable::Rack => "/cable"
end

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

Важно: сервер должен полностью реализовывать gRPC коммуникацию, без моков и т.п.; для этого потребуется запускать AnyCable gRPC сервер в фоне при монтировании сервера.

Подробную информацию о том, как работает AnyCable, смотрите в документации.

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

  1. Сделать новый проект на GitHub.
  2. Реализовать необходимый функционал, предусмотреть нужные тесты.
  3. Прислать письмо или написать комментарий о выполненном задании.

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

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

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

Бэк: Yabeda: адаптер для DataDog

Для новичков, задача на два-три дня

Фреймворк yabeda позволяет легко объявлять и собирать метрики о работе Ruby-приложения — и с помощью адаптеров экспортировать их в системы мониторинга. Сейчас есть адаптеры для Prometheus (yabeda-prometheus) и NewRelic (yabeda-newrelic), но это далеко не полный список систем, которых мы хотели бы поддерживать.

Необходимо написать адаптер (Ruby gem) для yabeda, который позволит отправлять кастомные метрики в DataDog.

Польза: познакомиться с работой систем мониторинга изнутри, получить опыт в Ruby open source, принести пользу сообществу.

Это простое задание в плане кодирования — необходимо унаследоваться от базового адаптера и «всего лишь» реализовать шесть хуков: три на регистрацию разных типов метрик и три на непосредственное измерение их значений.

Трудность состоит в том, чтобы понять, как именно их реализовать: придется изучить, как работают Ruby-клиенты к DataDog, выбрать, какой использовать, разобраться, как устроена yabeda.

Если вы никогда не работали с системами мониторинга, то вам поможет немного освоиться наша статья о Yabeda, слайды и видео с выступления автора на Ruby Russia 2018.

Вопросы, на которые нужно будет найти ответы:

  • как (и нужно ли) регистрировать метрики;
  • как записывать значения метрик;
  • как отправлять собранные значения в DataDog;
  • как и когда собирать метрики из collect-блоков, которые не привязаны к каким-либо событиям.

Релевантные материалы:

Для справки можно использовать два уже написанных адаптера — yabeda-prometheus и yabeda-newrelic. Они разные, так как Prometheus работает по pull-модели, а NewRelic — по push-модели (а по какой работает DataDog?).

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

  1. Сделать новый проект yabeda-datadog на GitHub — gem, который будет адаптером для yabeda.
  2. Реализовать необходимый функционал, предусмотреть нужные тесты.
  3. Кратко описать в README, как настроить yabeda-datadog и DataDog-клиента в своем приложении или сослаться на релевантную документацию.
  4. Прислать письмо или написать комментарий о выполненном задании.

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

Фронт: Перезапустить easings.net

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

Easings.net — каталог easing-функций. Easing-функции — очень важный элемент анимаций, поэтому многие разработчики посещают этот сайт, чтобы правильно подобрать анимацию на веб-странице.

Польза: получить опыт JavaScript-разработки; модернизировать популярную шпаргалку для разработчиков.

  1. Изучить текущий сайт.
  2. Изучить, что надо переделать, а что оставить.
  3. Придумать дизайн и нарисовать его набросок.
  4. Опубликовать набросок вашего дизайна в комментариях к issue.
  5. После одобрения дизайна, форкнуть репозиторий и написать новый код.
  6. Отправить новый код в pull request.

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

Фронт: Событийная архитектура PostCSS

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

Нужно придумать новый API для плагинов PostCSS — чтобы они все работали вместе, в одном цикле прохода по AST-дереву.

Задание сложное. Оно меньше про код и больше про переговоры, анализ и архитектуру. Но зато дает максимальное количество опыта.

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

Сейчас каждый плагин PostCSS проходит по AST-дереву CSS каждый раз заново. В итоге нельзя делать вложенные функции, и при большом количестве плагинов сильно проседает производительность.

У Babel есть более правильный visitor API: когда плагины подписываются на какие-то типы узлов. А внутри PostCSS запускается один проход по дереву, который в нужных местах дергает подписанные плагины.

Первый этап:

  1. Придумать такой API.
  2. Сделать пару примеров псево-кода: как API будет использоваться в простейших плагинах?
  3. Отправить эти примеры Андрею (Gist или проект на GitHub).

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

Бэк: Добавить новые источники данных в 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.