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

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

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

Узнавайте о новых задачах первыми

RSS

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

Фронт: Умная установка Lefthook в npm

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

Lefthook — менеджер git-хуков, написанный на Go. Для удобства фронтенд-разработчиков он распространяется и через npm. Сейчас в npm-пакете лежат 3 бинарника для популярных ОС и скрипт, который запускает нужный бинарник.

Нужно сделать умнее:

  1. Грузить бинарник только для нужной ОС в postinstall скрипте.
  2. Напрямую запускать этот бинарник без траты времени на запуск JS VM для скрипта.

Польза: получить глубокий опыт в работе npm.

  1. Форкнуть Lefthook.
  2. Добавить скрипт загрузки бинарника и добавить его в postinstall. Скачивать нужно не последнюю версию, а равную версии из package.json.
  3. Если стоит переменная среды LEFTHOOK=0, не скачивать бинарник.
  4. Разобраться, как напрямую запускать бинарник в npx lefthook и в node_modules/.bin/lefthook.

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

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

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

Бэк: Создание библиотеки Refinement Types на Node.js (для построения контрактов)

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

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Node.js.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

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

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

Что такое Refinement Type? Это контейнер c правилами валидации для произвольного значения.

Особенности:

  • валидация должна прогоняться отложенно (lazy);
  • только один раз на значение (мемоизация);
  • безопасный способ проверить является ли значение валидным — метод-предикат isValid;
  • при попытке извлечь значение (метод с названием unpack, например):

    1. если валидация еще не запускалась — запустить;
    2. если валидация запускалась и она прошла успешно, должно вернуться значение;
    3. если валидация запускалась и она прошла не успешно, должна произойти ошибка.

Простейшая композиция типов должна быть реализована по принципам Algebraic Data Types.

Если типы можно складывать и перемножать, появляется возможность создать систему типов произвольной сложности (например, для описания бизнес логики), что и нужно для контрактов.

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

Бэк: Создание библиотеки Refinement Types на Go (для построения контрактов)

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

Нужно создать новую библиотеку, которая состоит из:

  • абстракции — Refinement Type;
  • различных способов композиции типов, начиная с их сложения и умножения (см. Algebraic Data Types).

Внутри библиотека:

  1. должна работать по таким же принципам, как blood_contracts-core;
  2. являться органичной для экосистемы Go.

Приведенная на Ruby библиотека используется для создания контрактов в приложении.

Контракт — это набор валидаций (тестов), которые запускаются во время production сессии взаимодействия с внешней системой по API (например, CRM системой или социальными сетями).

Такие валидации решают проблему упрощения отладки и распознавания отклонений в поведении внешних зависимостей.

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

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

Что такое Refinement Type? Это контейнер c правилами валидации для произвольного значения.

Особенности:

  • валидация должна прогоняться отложенно (lazy);
  • только один раз на значение (мемоизация);
  • безопасный способ проверить является ли значение валидным - метод-предикат isValid;
  • при попытке извлечь значение (метод с названием unpack, например):

    1. если валидация еще не запускалась — запустить;
    2. если валидация запускалась и она прошла успешно, должно вернуться значение;
    3. если валидация запускалась и она прошла неуспешно, должна произойти ошибка.

Простейшая композиция типов должна быть реализована по принципам Algebraic Data Types.

Если типы можно складывать и перемножать, появляется возможность создать систему типов произвольной сложности (например, для описания бизнес логики), что и нужно для контрактов.

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

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