Хотите расти как разработчик и найти крутую работу? Не протирайте штаны — займитесь Open Source проектами. Так легче всего попасть в лучшие команды разработчиков и положить себе в резюме настоящий проект, вместо нелепых «примеров кода». Но найти подходящий проект для участия сложно. Начинаются лень и отговорки, а за ними — отсутствие профессионального роста, критики по-настоящему крутых программистов, уныние и застой.
На Cult of Martians мы собираем интересные задачи для современных веб-программистов. Можно выбрать подходящую по сложности, продолжительности и специализации. Задачи не выдуманы «из воздуха» — каждая решает насущную проблему, и решить ее можно через создание нового Open Source проекта или улучшение существующего. Решайте задачи, прокачивайтесь, присылайте решение на оценку. Лучших могут пригласить к себе на работу компании, программистам которых понравится ваше решен ие.
Для новичков, задача на пару дней
k6 – это современный инструмент для нагрузочного тестирования, написанный на Go и использующий JavaScript для описания тестовых сценариев. Из коробки k6 позволяет работать с WebSocket’ами, однако, тестирование Action Cable и AnyCable сценариев получается очень многословным. Для решения этой проблемы было написано расширение xk6-cable.
Сейчас xk6-cable поддерживает только синхронное тестирование, но иногда асинхронность все же может понадобиться (например для дополнительной проверки сообщений из соседних каналов). Мы предлагаем добавить метод channel.on_message(callback)
, который добавит callback для асинхронной проверки всех приходящих в канал сообщений.
Польза: получить опыт работы с Go, разобраться в том, как устроен k6 и его экосистема расширений, принести пользу Rails сообществу.
Инструкции по выполнению
Пример нового интерфейса:
import { check } from "k6";
import cable from "k6/x/cable";
export default function () {
const client = cable.connect("ws://localhost:8080/cable");
const mainChannel = client.subscribe("MainChannel");
const kgbChannel = client.subscribe("KgbChannel");
kgbChannel.onMessage((msg) => {
check(msg, {
"received msg": (obj) => obj.message === "hello",
});
});
mainChannel.perform("speak", { message: "hello" });
let message = mainChannel.receive({ author_id: userId });
check(message, {
"received its own message": (obj) => obj,
});
sleep(1);
// Terminate the WS connection
client.disconnect();
}
Полезные ссылки: