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

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

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

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

RSS

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

Фронт: Улучшить генерацию префиксов у Autoprefixer внутри @-moz-document

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

Надо сделать Autoprefixer умнее и генерировать только -moz- внутри выражения @-moz-document.

  body {
    -webkit-appearance: none;
       -moz-appearance: none;
            appearance: none;
  }

  @-moz-document domain('example.com') {
    body {
-    -webkit-appearance: none;
        -moz-appearance: none;
             appearance: none;
    }
  }

Польза: опыт работы с JavaScript в большом опенсорс-проекте, строка в резюме с PR в известный проект.

  1. Форкнуть autoprefixer.
  2. Добавить moz-document.css и moz-document.out.css в test/cases/.
  3. Использовать этот тест в test/cases/autoprefixer.test.js.
  4. Изучить Prefixer и добавить туда логику.

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

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

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

Фронт: Добавить скрипты в clean-publish

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

clean-publish — CLI-инструмент по очистке npm-пакета от лишних конфигов перед публикацией.

Он берет текущий проект, копирует во временную папку, чистит и вызывает npm publish на очищенную временную папку.

Нужно добавить опцию beforeScript, которая перед вызовом npm publish вызовет какой-то другой скрипт, передав туда путь ко временной папке как аргумент.

"clean-publish": {
  "beforeScript": "esm-compiler"
}

Польза: получить опыт разработки под Node.js.

  1. Форкнуть clean-publish.
  2. Добавить опцию в конфиг.
  3. При наличии такой опции запускать переданный скрипт перед npm publish.
  4. Если скрипт вернет ошибку, публикация не должна запускаться.
  5. Добавить поддежку как локальных скриптов (./scripts/compiler), так и глобальных (npx babel).
  6. Добавить тесты и документацию.

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

Фронт: Умная установка 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.

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

Бэк: Создание библиотеки 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.

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