Давайте знакомиться! Меня зовут Влад Лебедев и это мое портфолио.
Я обожаю программирование, это для меня больше, чем просто работа, это стиль жизни, источник вдохновения и любимое хобби.
Кроме программирования я увлекаюсь музыкой, пишу электронную музыку на контроллере Ableton Push 2. Вот мой SoundCloud, если интересно. Музыку пишу просто для себя, ради развлечения, строго не судите 🙂. Еще разрабатываю программу для улучшения навыков игры на MIDI контроллерах, см. кейс MIDIX
- Имею опыт работы с технологией на продакшене, либо есть пет-проекты с использованием этой технологии.
- Могу делать проекты легкой и средней сложности с использованием этой технологии.
- Применял технологию длительное время (1-2 года и больше), есть экспертиза.
- Способен с нуля сделать проект любой сложности с использованием данной технологии.
Мой опыт разработки на JavaScript начался еще в 2015 году с создания движка для анимаций, с помощью которого было возможно привязать анимацию какого-либо свойства объекта на странице к любому источнику, это мог быть как таймер, так и скролл или что либо еще, где можно посчитать прогресс. Это была первая библиотека, которую я написал в 19 лет. Подробнее можно ознакомиться по ссылке alinajs
На JS я разрабатывал первую версию системы монторинга InfiMonitor для сети устройств компании InfiNet, что было до распространения популярных на текущий момент библиотек типа React, Vue, Angular и т.д. Первая версия была реализован на JS с применением SmartClient.
С TypeScript я познакомился еще с его первых версий. После разработки первой версии InfiMonitor было принято решение использовать React и TypeScript на этом проекте.
Вторая версия системы мниторинга InfiMonitor была написана на TS с использованием библиотеки React. На TS я пишу и сегодня, суммарный опыт около 8 лет. Так же я использовал TS в проектах IW Academy, Quanta 5, 3CX Web Client, 3CX RPS system, ngx-mf
Использую в основном Jest, но был опыт и с mocha и другими библиотеками для тестирования.
Без комментариев, grid, flexbox, css animations и тд знаем, умеем.
Без комментариев, знаем, умеем.
В кейсах InfiMonitor и Quanta 5 писал много кастомных визуализаций.
В кейсах InfiMonitor и Quanta 5 писал много кастомных визуализаций.
В кейсе InfiMonitor использовался MobX.
С TypeScript я познакомился еще с его первых версий. После разработки превой версии InfiMonitor было принято решение использовать React и TypeScript на этом проекте.
Вторая версия системы манторинга InfiMonitor была написана на TS с использованием библиотеки React. React я использую и сегодня, суммарный опыт около 8 лет. Так же я использовал React при создании проектов InfiPlanner, IW Academy, Quanta 5
Использовал эту технологию в кейсе InfiMonitor, я написал плагин для protoc для кодогенерации. Начал писать библиотеку для кодогенерации под разные фреймворки catfish. Так же gRPC используется в кейсеMIDIX.
Написал смарт контракт на 1000 строчек кода для закрытого проекта time_to_pay (фриланс биржа на основе смарт контрактов), изучал на ходу. Вполне могу писать продакшн код.
Использую по необходимости, больше сторонник gRPC или GraphQL или на крайний случай OpenApi.
Использую по необходимости, больше сторонник gRPC или GraphQL.
Был опыт написания сложных кастомных конфигов и тюнинга скорости сборки.
Я использовал Linux в качестве рабочей и домашней OS около 7 лет, осмыслил многие концепции и умело использую bash скрипты и терминал для повседневных задач. Сейчас я разрабатываю в основном на macOS, опыт работы с Linux меня часто выручает. Обожаю VIM.
По вечерам я разрабатываю MIDIX, где используется Dart/Flutter в качестве фронтенда для клиентского desktop приложения, люблю этот язык и фреймворк, но работу на этом стеке найти сложновато 🙂
Использовался в проектах 3CX RPS system, 3CX Web Client было довольно много RXJS, успел прокачаться.
Использовал Redux на проде, как и RTK, на текущий момент больше сторонник RXJS + React
На Angular я начал писать когда устроился работать в 3CX над проектом3CX Web Client. Так же я успел создать небольшой проект на Angular в кейсе 3CX RPS system
Опыта на NodeJS у меня не очень много, но я могу создавать NodeJS приложения с нуля, я много экспериментировал с этой технологией и пришел к красивой, масштабируемой и простой на мой взгляд архитектуре. В ней используется NodeJS, gRPC (protocat) либо koajs для REST API c JSON валидацией на основе JSON schema, 3 слоя приложения (сервисы, контроллеры и репозитории) и разбиение проекта на доменные области. В кейсе 3CX RPS system я использовал такой подход.
В кейсе MIDIX используется PostgreSQL в качестве базы данных. В кейсе 3CX RPS system мне удалось повысить производительность одного запроса, что позволило ускорить время выполнения в 100000 раз.
Обожаю Docker, он открыл много возможностей для разработчиков, начиная с воспроизводимых билдов, заканчивая микросервисами. Я в основном использую Docker в качестве инструмента для разворачивания development окружения. В кейсе MIDIX используется docker-compose для деплоя на продакшн.
Я не много пишу на Python, но использовал его когда требовалось с помощью ML (а именно семантического анализа текста) решить задачу классификации социальный событий по заранее определенным категориям.
В кейсе MIDIX я использовал Figma для прототипирования и дизайна приложения, так же хорошо знаком с Photoshop, какое-то время назад пробовал себя в дизайне и делал небольшие проекты на фрилансе. В кейсе InfiMonitor принимал некоторые UX решения и делал UX исследование.
В кейсе InfiMonitor я использовал технологию WebGL с применением библиотеки Pixi.js для отображения 10000 объектов на карте с анимациями.
Не использовал на проде, не было случая, но документацию всю прочитал и немного экспериментировал.
В кейсе MIDIX я использовал Golang в качестве бэкэнда. Go круче NodeJS! и на то есть объективные причины. Люблю Go за простоту, производительность и стандартную библиотеку. Очень хочу писать на Go больше, чем сейчас, ищу возможности.
В кейсе MIDIX я использовал Rust для доступа к системным вызовам, таким как воспроизведение звуков с низкой задержкой и подключение к MIDI контроллеру, а так же для эмуляции MIDI устройства. Считаю Rust хорошим выбором для низкоуровневых высокопроизводительных алгоритмов, а также wasm. В кейсе InfiMonitor мы использовали Rust для обсчета топологической карты, по сути это был алгоритм раскладки графа на плоскости, основанный на физической модели, алгоритм называется force atlas 2, работает очень шустро по сравнению с JS. Есть репозиторий ditonic_sort где я реализовал самописный алгоритм сортировки.
В кейсе MIDIX в первой версии бэкэнда взял поиграться MongoDB, но в итоге перешел на PostgreSQL, с ним удобнее работать и PostgreSQL более производительный во многих сценариях. Но я достаточно узнал про MongoDB и могу использовать на продакшене.
В кейсе 3CX Phone Systemиспользуется C# в качестве бэкэнда, в основном для фикса багов и написание контроллеров с покрытием тестами.
Когда-то давно делал гидропонную установку (для выращивания салата) с автоматическоим включением помпы и управлением светом на ruspberryPI и ESP32, было интересно как устроен IoT. Можно было управлять с телефона по протоколу MQTT. Прошивка писалась на Arduino C++. В перспективе, когда будет свободное время, хочу сделать голосового помощника своими руками.
В кейсе InfiMonitor мы использовали WASM модуль написанный на Rust для обсчета топологической карты, по сути это был алгоритм раскладки графа на плоскости, основанный на физической модели, алгоритм называется force atlas 2, работает очень шустро по сравнению с JS.
Я пишу статьи по программированию, на платформе Medium, впереди много идей. Я не хочу писать просто для того чтобы что-то писать, я хочу приносить пользу сообществу и делиться только хорошо продуманными и выверенными решениями и мыслями. А так же у меня есть Open Source проекты см. кейс ngx-mf
Я знаю английский на уровне B1, я регулярно занимаюсь и совершенствую свои навыки. Я могу свободно общаться с заказчиком, например в кейсе 3cx RPS system мне необходимо было уточнять технические требования, используя разговорную речь, с чем я считаю я справился, проект был сделан с учетом всех требований.
Я был ментором у 2 людей, когда работал в InfiNet, я люблю объяснять сложные вещи простым языком, потому что я считаю это хорошим индикатором того, насколько хорошо ты понимаешь предметную область.
В InfiNet у нас была дружная команда и мы все отлично коммуницировали, я ищу в первую очередь сплоченную, дружную команду, где один за всех и все за одного.
У меня хорошо развито критическое мышление. Я использую логику, где это возможно при принятии решений и стараюсь учитывать когнитивные искажения, но не забываю и про доверие. Смотрю научпоп каналы, читаю научные статьи и доверяю только проверенной информации.
Я стремлюсь к тому, чтобы все мои проекты и продукты были клиентоориентированными, и всегда при принятии решений думаю в том числе с точки зрения конечного потребителя.
Я умею управлять процессом разработки. Разбить крупные задачи на небольшие, определить и соблюсти сроки. У меня много опыта в самостоятельной работе над проектами, я не нуждаюсь в постоянной слежке и подпинывании. Как говорится “по одной невозможной задаче за раз!” Знаю про scrum/agile/waterfall CI/CD и так далее
Стек:
MIDIX это программа для улучшения навыков игры на MIDI контроллере.
Этот проект делается полностью мной, начиная от дизайна, заканчивая деплоем.
Архитектура состоит из клиентской части в виде desktop приложения (Win, Mac, Linux) и серверной части для хранения проектов, загружаемых пользователем. Пользовательский проект представляет из себя tar архив с manifest.json файлом, MIDI файлом с набором событий и файлами звуков в wav формате. Файлы проектов хранятся на сервере в PostgreSQL в виде bytea типа, также в таблице проектов присутствует уникальный идентификатор проекта и sha256 хэш от файла. На стороне клиента реализован алгоритм синхронизации проектов с сервером. Проекты подгружаются асинхронно без блокировки пользовательского интерфейса, есть возможность отследить прогресс выполнения синхронизации. Синхронизация проектов построена на сравнении хэшэй файлов.
Самое интересное находится на стороне клиента, по сути программа парсит MIDI файл и отрисовывает события на шкале времени в пользовательском интерфейсе. Пришлось написать свой MIDI парсер и свой MIDI плеер на dart-е.
Для низкоуровнего взаимодействия с контроллером и проигрыванием звуковых файлов с низкой задержкой используется несколько кроссплатформенных библиотек, написанных на Rust и специальные bridgе-ы, с помощью которых Rust библиотека подключается к основному приложению на dart.
Интерфейс реализован с применением фреймворка Flutter.
Для идентификации пользователя используется Ory Kratos.
Вот несколько изображений с макетами:
Стек:
InfiMonitor это система мониторинга устройств компании InfiNet. InfiNet это международная компания, занимающаяся полным циклом производства оборудования для широкополосного доступа в интернет, устройствами InfiNet пользуются крупные и средние интернет провайдеры по всему миру. Они устанавливают устройства для передачи данных по радио каналу. В том числе заказчики пользуются системой мониторинга, которая предназначается для операторов сети и мониторинговых центров, чтобы оценивать качество сигнала и сбои в сети в режиме реального времени.
На разработку первой версии ушло около года, было реализовано большое количество функционала: отображение метрик устройств в режиме реального времени, страница добавления устройств в систему мониторинга, конструктор правил для нотификаций, карта сети для отображения устройств с учетом его географического положения и еще много всего.
В дальнейшем было принято решение переписывать бэкэнд на Golang с микросервисной архитектурой, и переписать фронтенд на более современную технологию, в том числе улучшить UX/UI и дополнить новым функционалом, а также повысить безопасность, производительность и стабильность системы.
Новая версия фронтенда разрабатывалась в основном моими силами. Было долго, трудно, но интересно и круто. Я определял стек технологий и все технические решения на стороне фронтенда. Разработка велась примерно 4 года, но периодами меня переключали на другие проекты. В дальнейшем стали подключаться и другие фронтенд разработчики.
В основном приложение состояло из различных таблиц с множеством динамических фильтров. Фильтрация могла осуществляться как на стороне клиента, так и сервера. Для серверной фильтрации использовался Google Common Expression Language, для клиентской использовался набор предикатов. Т.к. таблиц у нас было много, я принял решение написать движок для фильтрации, он был основан на идее, что фильтр можно представить в виде дерева операндов и логических условий. В результате это дерево можно было преобразовать, как в CEL выражение для отправки его на сервер, так и для клиентской фильтрации в виде предиката. Мне настолько понравилось найденное мной решение, что я его повторил, убрав все лишнее, с основной концепцией можно ознакомиться по ссылкеFilter Builder А так же этот подход позволяет строить динамические фильтры прямо в интерфейсе, объединяя набор условий с помощью логических операторов и групп.
Еще технически сложная задача, которая мне понравилась - это карта сети. На ней было необходимо отображать 10000 устройств в режиме реального времени, в качестве картографического движка был выбран Leaflet.js (хотя смотря через призму опыта, в следующий раз я бы взял Deckgl). Самое интересное в этой задаче - это требуемое количество объектов и то, что устройства должны были разъединяться и объединяться в кластеры при изменении масштабирования карты. И самое классное, нужно все это анимировать для улучшения UX. Я справился с этой задачей за 2 месяца, это было во времена ковида, когда все сидели по домам. Я написал свой алгоритм кластеризации c нуля, где использовалась структура данных kdtree для быстрого поиска объектов в радиусе и разобрался с WebGL (использовался слой pixijs), для того чтобы это работало на 10000 устройств.
Так же в этом кейсе был с нуля разработан UI Kit, порядка 40 компонентов. Был использован Storybook для каталогизации, разработки, документации и визуального тестирования.
Еще интересной задачей в этом кейсе было написание своего плагина для protoc, потому что на то время стандартный кодогенератор был неудобен в использовании и не подходил под наши задачи. Сейчас многое поменялось, и я бы предпочел скорее использовать что-то готовое (buf).
Стек:
Quanta 5 - это устройства производимые компанией InfiNet, я разрабатывал Web интерфейс устройства.
Из интересного, там был REST API в виде дерева параметров, над которыми можно было выполнять различные стандартные операции, для этого был разработан API слой с различными типами параметров и набором операций над этими параметрами, API содержал все данные, необходимые для отображения, данные хранились в MobX сторе и периодически обновлялись с помощью поллинга. Для каждого типа параметра был реализован UI компонент для отображения этого типа параметра, весь интерфейс состоял из набора компонентов, куда передавалась модель данных из API слоя. Каждый компонент мог отобразить текущее состояние параметра.
Еще было разработано несколько визуализаций данных.
Стек:
В этом кейсе я переписывал систему RED/RPS
RPS/RED является системой с высокой нагрузкой, порядка 1000 запросов в секунду, основные цели, которые я преследовал при переписывании - это увеличение производительности, улучшение UX/UI и новые фичи, такие как определение пересечения IP адресов.
Мне удалось оптимизировать запросы к базе данных, что позволило ускорить загрузку страницы до 5 секунд вместо 5 минут, были продуманы UX/UI механики, которые повысили удобство использования и сократили время на административные задачи
Стек:
В основном занимался переносом функционала из старого приложения в новое, была реализована подсистема отчетов, которая состояла из 25 таблиц с фильтрами, поиском, выгрузкой CSV и Print View для вывода отчета на печать.
Стек:
Занимался переносом функционала из старого приложения в новое, создание контроллеров с использованием OData и OpenAPI, а также написанием тестов.
Стек:
Я разработал Open Source библиотеку для типизации angular форм, подробнее можно ознакомиться по ссылке ngx-mf
Telegram: @iamguid
GitHub: iamguid
StackOverflow: vladislav
Medium: @iam.guid
Reddit: iam_guid