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

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

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

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

Бэк: GraphQL Ruby: поддержка «внешних» схем

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

Gem graphql-ruby предоставляет объектно-ориентированный интерфейс для построения GraphQL API на Ruby.

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

Отдельно рассматривают случай, когда один провайдер GraphQL API агрегирует данные из других GraphQL API. Этот сценарий носит название schema stitching.

К сожалению, на сегодняшний день поддержка объединения (или сшивания) схем отсутвует в реализации на Ruby.

Необходимо написать плагин (gem) для graphql-ruby, который позволит создавать «внешние» поля в локальную схему.

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

Пример работы и возможный API

На стороне Ruby мы опишем наш интерфейс следующим образом:

module GraphqlAPI
  module Types
    module Types
      class BaseType < GraphQL::Schema::Object
        # подключаем плагин
        include GraphQL::RemoteFields

        # resolver - это любой объект, который реализует метод #resolve_remote_field
        remote_resolver MyResolver.new(url: "http://remote/api/graphql")
      end

      class Query < BaseType
        field :posts,
              [Types::Post],
              null: false

        field :payments,
              [Types::Payment],
              null: false,
              # помечаем поле как `remote`
              # – значение будет получаться через
              # зарегистрированный resolver
              remote: true

        field :billing_info,
              Types::BillingInfo,
              null: true,
              remote: true,
              # можем явно указать другой resolver
              remote_resolver: another_resolver,
              # по умолчанию на "внешний" сервер отправляется неизмененный
              # запрос, но можно определить правило (блок), чтобы изменить запрос
              # (вместо "...fields" будут запрашиваемые поля
              remote_query: ->(obj, ctx) { "query { billing { ...fields } }" }
      end
    end
  end
end

class MyResolver
  # resolver получает на вход запрос и текущий контекст
  # (который будет использоваться, например, для аутентификации)
  def resolve_remote_field(query, context)
  end
end

Пример исходного запроса:

query {
  posts {
    id
    title
  }
  payments {
    id
  }
  billingInfo {
    cardType
    last4
  }
}

Часть запроса будет выполнена локально:

query {
  posts {
    id
    title
  }
}

Другая часть будет проксирована на resolver по умолчанию:

query {
  payments {
    id
  }
}

И, наконец, третья часть запроса будет выполнена с помощью another_resolver:

query {
  billing {
    cardType
    last4
  }
}

Примечание: пример расширения API для полей смотрите в этом gist.

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

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

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

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

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

Фронт: Убрать Cairo из postcss-conic-gradient

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

postcss-conic-gradient — полифил для конических градиентов в CSS.

Он генерирует SVG-картинку для градиента и вставляет эту каринку в CSS как data:uri. Для генерации изображения он сейчас использует Cairo — бинарную зависимость, которую надо отдельно ставить в систему.

Нужно заменить Cairo на какую-то другую библиотеку на чистом JavaScript или вручную генерировать SVG.

Польза: получить опыт работы с графикой в JavaScript, улучшить очень полезный полифил.

  1. Изучить текущий код.
  2. Найти способы сгенерировать SVG на чистом JS.
  3. Форкнуть postcss-conic-gradient и исправить его.

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

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

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

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

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

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

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

Бэк: Добавить поддержку Plezi/Iodine в LiteCable

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

LiteCable – это альтернативная реализация фреймворка ActionCable из Rails, совместимая с ActionCable-клиентами, но при этом имеющая минимум зависимостей.

Необходимо добавить в LiteCable интеграцию с Plezi (Iodine) “из коробки” (по аналогии с тем, как это сделано для AnyCable).

Польза: познакомиться и научиться работать с новым веб-сервером для Ruby приложений (Iodine); разобраться во внутреннем устройстве real-time фреймворков.

Постановка задачи

Iodine – это новый веб-сервер для Ruby приложений (альтернатива Unicorn/Puma/etc), спроектированный специально для работы с большим количеством одновременных подключений (например, веб-сокетов).

LiteCable реализует бизнес-логику работы с сокетами (“каналы”) и предоставляет API для интеграции с непосредственно сервером (на данный момент “из коробки” доступна интеграция с AnyCable.

Задача состоит в том, чтобы сделать использование Iodine в качестве сервера для LiteCable возможным и максимально простым.

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

Вместо “голого” Iodine можно сделать интеграцию с Plezi – микро-фреймворком для работы с веб-сокетами.

Информацию о внутреннем устройстве подписок можно посмотреть тут.

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

  1. Обсудить задачу, если есть вопросы.
  2. Форкнуть проект litecable на GitHub.
  3. Реализовать необходимый функционал.
  4. Сделать 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.