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

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

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

Бэк: Isolator: инструмент для отслеживания побочных эффектов внутри транзакций БД

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

Необходимо написать инструмент для Ruby-стека, который будет отслеживать выполнение потенциально опасных действий внутри транзакции БД (например, HTTP-запросов или отправки фоновых задач в очередь).

Польза: разобраться в том, как работают популярные ORM и другие библиотеки для работы с «внешним миром»; написать инструмент, которым будет активно пользоваться Ruby-сообщество.

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

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

Например:

# вызов HTTP
User.transaction do
  user = User.new(user_params)
  user.save!
  # происходит вызов внешнего API
  PaymentsService.charge!(user)
end

# создание фоновой задачи
User.transaction do
  user.update!(confirmed_at: Time.now)
  UserMailer.successful_confirmation(user).deliver_later
end

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

Что именно отслеживать?

  • HTTP вызовы (посмотрите на sniffer)
  • Отправка в очередь фоновых задач (но только в том случае, когда для хранения очереди используется не БД)
  • Что еще? Все перечислить невозможно, поэтому необходимо предусмотреть интерфейс/инструкцию для расширения (регистрации произвольных проверок)

Как уведомлять?

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

  • выбрасывать исключения (удобно при разработке и тестировании)
  • при использовании в стейджинг-окружении нужно иметь возможность посылать уведомления во внешний мир (например, через uniform_notifier)

Внимание: при использовании в тестовом окружении необходимо учесть, что тесты могут выполнятся внутри транзакции (use_transaction_tests в Rails). В этом случае мы должны игнорировать «внешнюю», тестовую транзакцию.

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

  • Необходимо предусмотреть работу с различными ORM адаптерами (начать можно с ActiveRecord).
  • Подключение должно быть максимально простым и не требовать явного указания, с каким ORM интегрироваться — то есть, достаточно просто сделать require "isolator" (или добавить в Gemfile).
  • Сообщение об ошибке должно указывать, где именно вызывается опасный метод в приложении; также было бы полезно показывать, где была инициирована транзакция.

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

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