Привет! Меня зовут Славик, я инженер, мне 26 лет. Сегодня я хочу рассказать о своем участии в конкурсе Telegram для разработчиков. Ранее конкурсы были для дизайнеров, но этой осенью мессенджер предложил задачи для C++ программистов, а призовой фонд составил более $1 000 000.

Обо мне

Сперва хотелось бы сказать, что я не программист в общепринятом понимании. Восемь лет я занимаюсь разработкой электроники, и программирование для меня — это сопутствующий навык. Я серьезно увлекся электроникой и программированием в университете (МФТИ): начинал с аналоговых схем — радиоприемники, примочки для гитары и так далее, а затем стал включать в схемы микросхемы цифровой логики и в итоге добрался до микроконтроллеров и FPGA.

Чаще всего для программирования микроконтроллеров используется язык C, поэтому это мой первый и основной высокоуровневый язык (после ассемблеров).

На C++ я разрабатывал различные ПК-приложения для инженерных и научных задач, например, анализатор видео с высокоскоростной (1600 к/с) камеры, системы компьютерного зрения для робототехники и так далее. В последние годы C++ стал активно проникать в embedded-разработку, например, в IoT (интернет вещей), которым я и занимаюсь.

По роду деятельности я часто сталкиваюсь с задачами обработки и анализа сигналов с разных датчиков, например, объединением нескольких микрофонов в один направленный (фазированная решетка) — этот подход используется, например, в современных смартфонах, голосовых помощниках вроде Яндекс.Станции и много где еще.

В общем, работать с данными приходится на низком уровне — ресурсы крайне ограничены, но устройства подключаются к интернету и взаимодействуют с серверами, приложениями на смартфонах и другими высокоуровневыми системами, поэтому необходимо разбираться и в них.

Что касается Telegram, то я начинал с разработки небольших ботов для автоматизации процессов в своей компании примерно 4 года назад, 2 года назад сделал ботов для загрузки аудио/видео с YouTube (@AudioTubeBot/@VideoTubeBot).

А еще я «научил» бота транслировать радио через звонки — позвонив юзерботу, несколько человек могут одновременно слушать через Telegram аудио в реальном времени.

Конкурс

Я раньше собирался самостоятельно реализовать групповые звонки в Telegram, но никак не доходили руки, а когда анонсировали конкурс по VoIP — меня это очень заинтересовало.

В качестве хобби я модифицирую клиент Telegram Desktop, например, я ускорил загрузку файлов и реализовал видео в отдельном окне. Так что с кодом немного знаком. Когда опубликовали задание, я почти сразу стал искать с кем скооперироваться, так как было очевидно, что для хорошего решения и отладки времени не хватит, но в итоге пришлось делать все одному. Порадовали другие участники — многие общались в чате, подсказывали друг другу, делились опытом и помогали разобраться с библиотекой звонков. Мне удалось познакомиться со многими хорошими разработчиками — хоть мы и соперники, но все оставались людьми, уважали друг друга и продуктивно общались.

Задание состояло из двух частей: приложение для тестирования звонков, использующее вместо микрофона и динамика аудиофайлы, и приложение для автоматической оценки качества связи.

На первую часть я планировал потратить не более 2-3 дней — дабы не вмешиваться в тестируемый код, я решил использовать контейнеры и виртуальные аудиоустройства, чтобы запускать на одном компьютере несколько звонков одновременно и независимо управлять каждым соединением. Далее, используя эмулятор плохой сети, сгенерировать из тестовых аудиофайлов большую выборку, попросить подписчиков моего канала @MediaTube_stream расставить оценки и обучить нейросеть оценивать качество звонка, как это делает человек.

План был отличный, но получилось как всегда: на первом этапе возникли сложности, где их никто не ждал, а когда я, наконец, закончил отладку, и звонки заработали, как должны — до конца конкурса оставалось 6 часов.

Разумеется, реализовывать изначальное решение за это время было безумием, даже планируемые 7 дней — это впритык, а о 6 часах и речи быть не могло. Но всегда нужно бороться до конца и лучше сделать что-то, чем ничего, поэтому я решил использовать алгоритм с открытым исходным кодом от британской телекоммуникационной компании. Используемые в нем подходы мне не очень нравились — уверен, что моя реализация дала бы лучший результат. Но, как говорится, «дареному коню...». Поэтому далее я использовал свой трехлетний опыт подгонки отчетов лабораторных работ по физике, чтобы адаптировать алгоритм к задаче, и отправил, что успел.

Что было дальше?

Оказалось, что программа для звонков не запустилась на сервере судей, и они даже написали комментарий на странице моей работы, но я, к сожалению, к тому времени уже забыл о конкурсе и не следил за комментариями, а программа для оценки показала третий результат в рейтинге. Кроме того, за первую часть я получил небольшой «штраф», но в итоге занял 2-е место.

Смешанные чувства: с одной стороны, результат считаю вполне справедливым, с другой — решающую роль сыграло совсем не то, на что было потрачено время. Если бы знал о приоритетах сразу, то перераспределил бы фокус внимания и сделал намного лучше. Но, как получилось — так получилось.

В любом случае, я благодарен организаторам за их работу и возможность пообщаться с крутыми специалистами в одном месте (и $5000 бонусом). Пока я ожидаю второго раунда конкурса звонков, поучаствую в конкурсе по кластеризации, для которого уже опубликован датасет из огромного количества html-страниц на разных языках — похоже, что нужно будет группировать их по языку/тематике. Но это уже совсем другая история...

Подписывайтесь на «Код Дурова» в Telegram и во «ВКонтакте», чтобы всегда быть в курсе интересных новостей!