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

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

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

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

Бэк: ActiveRecord: ленивая предзагрузка ассоциаций

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

В ActiveRecord предусмотрено несколько методов для предварительной загрузки ассоциированных записей (такие как includes, eager_load и другие). Это позволяет выгружать данные, избегая так называемой проблемы N+1 запросов.

В некоторых случаях мы не знаем заранее, какие ассоциации нам понадобятся при выполнении запроса (простой пример — работа с GraphQL).

Приходится либо предзагружать лишние данные (например, указывая все ассоциации в includes), либо использовать альтернативные подходы, такие как batch loading.

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

Польза: детально узнать, как работает Rails и ActiveRecord изнутри, принести пользу Rails-сообществу.

Пример работы

class User < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  has_many :comments
  belongs_to :user
end

class Comment < ApplicationRecord
  belongs_to :user
  belongs_to :post
end

# Инициируем выборку: выгружаем пользователей с публикациями,
# комментариями и авторами комментариев
users = User.lazy_preload(posts: { comments: :user } ).limit(10)

# Будет выполнен один запрос
#=> SELECT * FROM users LIMIT 10
users.each do |user|
  # Запрос на загрузку постов будет выполнен при первом
  # обращении к ассоциации на любом пользователе,
  # но записи будут загружены сразу для всех пользователей
  #
  # SELECT * FROM posts WHERE user_id in (...)
  user.posts.each do |post|
    p post.title
  end
end

# Комментарии не будет предзагружены, так как мы к ним не обращались.

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

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

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

Фронт: Сделать хороший дизайн главной страницы postcss-preset-env

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

Скоро postcss-preset-env заменит cssnext и станет одним из «главных» плагинов PostCSS.

У плагина есть сайт, но его главная страница совсем не информативная.

Задача подойдет, если вы больше фокусируетесь на дизайне и CSS.

Польза: указать в резюме коммит в известный проект.

  1. Форкнуть репозиторий сайта.
  2. Переключиться в ветку jonathantneal.
  3. Подумать, как кратко объяснить, о чем этот плагин, чем он лучше cssnext, чем он может быть полезен разработчикам. Отдельно можно сравнить его с некоторыми функциями Sass и провести ассоциацию с CoffeeScript и Babel.
  4. Если есть вопросы по тому, как лучше рассказать о плагине или чем он лучше — спросить в чате PostCSS или лично Ситника.
  5. Добавить больше примеров и текста на главную.

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

Бэк: Добавить поддержку 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.