Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решен ие.
Для продвинутых, задача на неделю
Необходимо написать инструмент для 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
В случае, если в итоге наша транзакция не будет зафиксирована («закоммичена»), может нарушится согласованность данных в нашей бизнес-логике — и другие ошибки (так как эти операции не откатятся).
Isolator должен уметь уведомлять об ошибках разными способами:
Внимание: при использовании в тестовом окружении необходимо учесть, что тесты могут выполнятся внутри транзакции (use_transaction_tests
в Rails). В этом случае мы должны игнорировать «внешнюю», тестовую транзакцию.
require "isolator"
(или добавить в Gemfile
).Инструкции по выполнению