Привет 👋🏻

Давайте знакомиться! Меня зовут Влад Лебедев и это мое портфолио.

Я обожаю программирование, это для меня больше, чем просто работа, это стиль жизни, источник вдохновения и любимое хобби.

Кроме программирования я увлекаюсь музыкой, пишу электронную музыку на контроллере Ableton Push 2. Вот мой SoundCloud, если интересно. Музыку пишу просто для себя, ради развлечения, строго не судите 🙂. Еще разрабатываю программу для улучшения навыков игры на MIDI контроллерах, см. кейс MIDIX

Ключевые технические навыки 🦾

Условные обозначения

- Имею опыт работы с технологией на продакшене, либо есть пет-проекты с использованием этой технологии.

- Могу делать проекты легкой и средней сложности с использованием этой технологии.

- Применял технологию длительное время (1-2 года и больше), есть экспертиза.

- Способен с нуля сделать проект любой сложности с использованием данной технологии.

JavaScript IconJavaScript

Мой опыт разработки на JavaScript начался еще в 2015 году с создания движка для анимаций, с помощью которого было возможно привязать анимацию какого-либо свойства объекта на странице к любому источнику, это мог быть как таймер, так и скролл или что либо еще, где можно посчитать прогресс. Это была первая библиотека, которую я написал в 19 лет. Подробнее можно ознакомиться по ссылке alinajs

На JS я разрабатывал первую версию системы монторинга InfiMonitor для сети устройств компании InfiNet, что было до распространения популярных на текущий момент библиотек типа React, Vue, Angular и т.д. Первая версия была реализован на JS с применением SmartClient.

TypeScript IconTypeScript

С TypeScript я познакомился еще с его первых версий. После разработки первой версии InfiMonitor было принято решение использовать React и TypeScript на этом проекте.

Вторая версия системы мниторинга InfiMonitor была написана на TS с использованием библиотеки React. На TS я пишу и сегодня, суммарный опыт около 8 лет. Так же я использовал TS в проектах IW Academy, Quanta 5, 3CX Web Client, 3CX RPS system, ngx-mf

Jest IconJest

Использую в основном Jest, но был опыт и с mocha и другими библиотеками для тестирования.

CSS3 IconCSS3

Без комментариев, grid, flexbox, css animations и тд знаем, умеем.

HTML5 IconHTML5

Без комментариев, знаем, умеем.

D3.js IconD3.js

В кейсах InfiMonitor и Quanta 5 писал много кастомных визуализаций.

Canvas IconCanvas

В кейсах InfiMonitor и Quanta 5 писал много кастомных визуализаций.

MobX IconMobX

В кейсе InfiMonitor использовался MobX.

React IconReact

С TypeScript я познакомился еще с его первых версий. После разработки превой версии InfiMonitor было принято решение использовать React и TypeScript на этом проекте.

Вторая версия системы манторинга InfiMonitor была написана на TS с использованием библиотеки React. React я использую и сегодня, суммарный опыт около 8 лет. Так же я использовал React при создании проектов InfiPlanner, IW Academy, Quanta 5

Protobuf/gRPC IconProtobuf/gRPC

Использовал эту технологию в кейсе InfiMonitor, я написал плагин для protoc для кодогенерации. Начал писать библиотеку для кодогенерации под разные фреймворки catfish. Так же gRPC используется в кейсеMIDIX.

Solidity IconSolidity

Написал смарт контракт на 1000 строчек кода для закрытого проекта time_to_pay (фриланс биржа на основе смарт контрактов), изучал на ходу. Вполне могу писать продакшн код.

REST IconREST

Использую по необходимости, больше сторонник gRPC или GraphQL или на крайний случай OpenApi.

OpenAPI IconOpenAPI

Использую по необходимости, больше сторонник gRPC или GraphQL.

Webpack IconWebpack

Был опыт написания сложных кастомных конфигов и тюнинга скорости сборки.

Linux IconLinux

Я использовал Linux в качестве рабочей и домашней OS около 7 лет, осмыслил многие концепции и умело использую bash скрипты и терминал для повседневных задач. Сейчас я разрабатываю в основном на macOS, опыт работы с Linux меня часто выручает. Обожаю VIM.

Dart/Flutter IconDart/Flutter

По вечерам я разрабатываю MIDIX, где используется Dart/Flutter в качестве фронтенда для клиентского desktop приложения, люблю этот язык и фреймворк, но работу на этом стеке найти сложновато 🙂

RXJS IconRXJS

Использовался в проектах 3CX RPS system, 3CX Web Client было довольно много RXJS, успел прокачаться.

Redux IconRedux

Использовал Redux на проде, как и RTK, на текущий момент больше сторонник RXJS + React

Angular IconAngular

На Angular я начал писать когда устроился работать в 3CX над проектом3CX Web Client. Так же я успел создать небольшой проект на Angular в кейсе 3CX RPS system

NodeJS IconNodeJS

Опыта на NodeJS у меня не очень много, но я могу создавать NodeJS приложения с нуля, я много экспериментировал с этой технологией и пришел к красивой, масштабируемой и простой на мой взгляд архитектуре. В ней используется NodeJS, gRPC (protocat) либо koajs для REST API c JSON валидацией на основе JSON schema, 3 слоя приложения (сервисы, контроллеры и репозитории) и разбиение проекта на доменные области. В кейсе 3CX RPS system я использовал такой подход.

PostgreSQL IconPostgreSQL

В кейсе MIDIX используется PostgreSQL в качестве базы данных. В кейсе 3CX RPS system мне удалось повысить производительность одного запроса, что позволило ускорить время выполнения в 100000 раз.

Docker IconDocker

Обожаю Docker, он открыл много возможностей для разработчиков, начиная с воспроизводимых билдов, заканчивая микросервисами. Я в основном использую Docker в качестве инструмента для разворачивания development окружения. В кейсе MIDIX используется docker-compose для деплоя на продакшн.

Python IconPython

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

UX/UI IconUX/UI

В кейсе MIDIX я использовал Figma для прототипирования и дизайна приложения, так же хорошо знаком с Photoshop, какое-то время назад пробовал себя в дизайне и делал небольшие проекты на фрилансе. В кейсе InfiMonitor принимал некоторые UX решения и делал UX исследование.

WebGL IconWebGL

В кейсе InfiMonitor я использовал технологию WebGL с применением библиотеки Pixi.js для отображения 10000 объектов на карте с анимациями.

GraphQL IconGraphQL

Не использовал на проде, не было случая, но документацию всю прочитал и немного экспериментировал.

Go IconGo

В кейсе MIDIX я использовал Golang в качестве бэкэнда. Go круче NodeJS! и на то есть объективные причины. Люблю Go за простоту, производительность и стандартную библиотеку. Очень хочу писать на Go больше, чем сейчас, ищу возможности.

Rust IconRust

В кейсе MIDIX я использовал Rust для доступа к системным вызовам, таким как воспроизведение звуков с низкой задержкой и подключение к MIDI контроллеру, а так же для эмуляции MIDI устройства. Считаю Rust хорошим выбором для низкоуровневых высокопроизводительных алгоритмов, а также wasm. В кейсе InfiMonitor мы использовали Rust для обсчета топологической карты, по сути это был алгоритм раскладки графа на плоскости, основанный на физической модели, алгоритм называется force atlas 2, работает очень шустро по сравнению с JS. Есть репозиторий ditonic_sort где я реализовал самописный алгоритм сортировки.

MongoDB IconMongoDB

В кейсе MIDIX в первой версии бэкэнда взял поиграться MongoDB, но в итоге перешел на PostgreSQL, с ним удобнее работать и PostgreSQL более производительный во многих сценариях. Но я достаточно узнал про MongoDB и могу использовать на продакшене.

C# IconC#

В кейсе 3CX Phone Systemиспользуется C# в качестве бэкэнда, в основном для фикса багов и написание контроллеров с покрытием тестами.

Low Level IconLow Level

Когда-то давно делал гидропонную установку (для выращивания салата) с автоматическоим включением помпы и управлением светом на ruspberryPI и ESP32, было интересно как устроен IoT. Можно было управлять с телефона по протоколу MQTT. Прошивка писалась на Arduino C++. В перспективе, когда будет свободное время, хочу сделать голосового помощника своими руками.

WASM IconWASM

В кейсе InfiMonitor мы использовали WASM модуль написанный на Rust для обсчета топологической карты, по сути это был алгоритм раскладки графа на плоскости, основанный на физической модели, алгоритм называется force atlas 2, работает очень шустро по сравнению с JS.

Ключевые софтскиллы

Участие в сообществе

Я пишу статьи по программированию, на платформе Medium, впереди много идей. Я не хочу писать просто для того чтобы что-то писать, я хочу приносить пользу сообществу и делиться только хорошо продуманными и выверенными решениями и мыслями. А так же у меня есть Open Source проекты см. кейс ngx-mf

Английский

Я знаю английский на уровне B1, я регулярно занимаюсь и совершенствую свои навыки. Я могу свободно общаться с заказчиком, например в кейсе 3cx RPS system мне необходимо было уточнять технические требования, используя разговорную речь, с чем я считаю я справился, проект был сделан с учетом всех требований.

Наставничeство

Я был ментором у 2 людей, когда работал в InfiNet, я люблю объяснять сложные вещи простым языком, потому что я считаю это хорошим индикатором того, насколько хорошо ты понимаешь предметную область.

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

Критическое мышление

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

Клиентоориентированность

Я стремлюсь к тому, чтобы все мои проекты и продукты были клиентоориентированными, и всегда при принятии решений думаю в том числе с точки зрения конечного потребителя.

Управление процессами разработки

Я умею управлять процессом разработки. Разбить крупные задачи на небольшие, определить и соблюсти сроки. У меня много опыта в самостоятельной работе над проектами, я не нуждаюсь в постоянной слежке и подпинывании. Как говорится “по одной невозможной задаче за раз!” Знаю про scrum/agile/waterfall CI/CD и так далее

Кейсы

MIDIX

Стек:

Dart/Flutter
Go
PostgreSQL
Rust
UX/UI
Docker

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.

Вот несколько изображений с макетами:

MIDIX Preplay PageMIDIX Preplay Page
MIDIX Play PageMIDIX Play Page
MIDIX Explore PageMIDIX Explore Page
MIDIX Signin PageMIDIX Signin Page

InfiMonitor

Стек:

React
MobX
Leaflet
WebGL
gRPC-web
Webpack
TypeScript

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

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

InfiMonotor v1 topology network mapInfiMonotor v1 Топологическая карта сети
InfiMonotor v1 geo network mapInfiMonotor v1 Географическая карта сети
InfiMonotor v1 Детали карты сетиInfiMonotor v1 Детали карты сети

В дальнейшем было принято решение переписывать бэкэнд на Golang с микросервисной архитектурой, и переписать фронтенд на более современную технологию, в том числе улучшить UX/UI и дополнить новым функционалом, а также повысить безопасность, производительность и стабильность системы.

Новая версия фронтенда разрабатывалась в основном моими силами. Было долго, трудно, но интересно и круто. Я определял стек технологий и все технические решения на стороне фронтенда. Разработка велась примерно 4 года, но периодами меня переключали на другие проекты. В дальнейшем стали подключаться и другие фронтенд разработчики.

InfiMonotorNext DevicesInfiMonotorNext Страница устройств
InfiMonotorNext Device CardInfiMonotorNext Карточка устройства

В основном приложение состояло из различных таблиц с множеством динамических фильтров. Фильтрация могла осуществляться как на стороне клиента, так и сервера. Для серверной фильтрации использовался Google Common Expression Language, для клиентской использовался набор предикатов. Т.к. таблиц у нас было много, я принял решение написать движок для фильтрации, он был основан на идее, что фильтр можно представить в виде дерева операндов и логических условий. В результате это дерево можно было преобразовать, как в CEL выражение для отправки его на сервер, так и для клиентской фильтрации в виде предиката. Мне настолько понравилось найденное мной решение, что я его повторил, убрав все лишнее, с основной концепцией можно ознакомиться по ссылкеFilter Builder А так же этот подход позволяет строить динамические фильтры прямо в интерфейсе, объединяя набор условий с помощью логических операторов и групп.

InfiMonotorNext UsersInfiMonotorNext Пользователи
InfiMonotorNext IncidentsInfiMonotorNext Инциденты

Еще технически сложная задача, которая мне понравилась - это карта сети. На ней было необходимо отображать 10000 устройств в режиме реального времени, в качестве картографического движка был выбран Leaflet.js (хотя смотря через призму опыта, в следующий раз я бы взял Deckgl). Самое интересное в этой задаче - это требуемое количество объектов и то, что устройства должны были разъединяться и объединяться в кластеры при изменении масштабирования карты. И самое классное, нужно все это анимировать для улучшения UX. Я справился с этой задачей за 2 месяца, это было во времена ковида, когда все сидели по домам. Я написал свой алгоритм кластеризации c нуля, где использовалась структура данных kdtree для быстрого поиска объектов в радиусе и разобрался с WebGL (использовался слой pixijs), для того чтобы это работало на 10000 устройств.

InfiMonotorNext Географическая карта сети
InfiMonotorNext Топологическая карта сети

Так же в этом кейсе был с нуля разработан UI Kit, порядка 40 компонентов. Был использован Storybook для каталогизации, разработки, документации и визуального тестирования.

Еще интересной задачей в этом кейсе было написание своего плагина для protoc, потому что на то время стандартный кодогенератор был неудобен в использовании и не подходил под наши задачи. Сейчас многое поменялось, и я бы предпочел скорее использовать что-то готовое (buf).

Quanta 5

Стек:

React
MobX
Canvas
D3.js
REST
Webpack
TypeScript

Quanta 5 - это устройства производимые компанией InfiNet, я разрабатывал Web интерфейс устройства.

Из интересного, там был REST API в виде дерева параметров, над которыми можно было выполнять различные стандартные операции, для этого был разработан API слой с различными типами параметров и набором операций над этими параметрами, API содержал все данные, необходимые для отображения, данные хранились в MobX сторе и периодически обновлялись с помощью поллинга. Для каждого типа параметра был реализован UI компонент для отображения этого типа параметра, весь интерфейс состоял из набора компонентов, куда передавалась модель данных из API слоя. Каждый компонент мог отобразить текущее состояние параметра.

Еще было разработано несколько визуализаций данных.

  • Dashboard - основная страница с графиками и метриками
  • Specrum Analizer - для отображения помех в диапазоне частот
  • Alignment Tool - интерфейс с помощью которого можно было откалибровать устройство для лучшей передачи данных
Quanta 5 DashboardQuanta 5 Dashboard
Quanta 5 GraphsQuanta 5 Graphs
Quanta 5 Spectrum AnalizerQuanta 5 Spectrum Analizer
Quanta 5 Alignment ToolQuanta 5 Alignment Tool

3cx RPS/RED system

Стек:

Angular
Node
PostgreSQL
REST
UX/UI
Docker

В этом кейсе я переписывал систему RED/RPS

RPS/RED является системой с высокой нагрузкой, порядка 1000 запросов в секунду, основные цели, которые я преследовал при переписывании - это увеличение производительности, улучшение UX/UI и новые фичи, такие как определение пересечения IP адресов.

Мне удалось оптимизировать запросы к базе данных, что позволило ускорить загрузку страницы до 5 секунд вместо 5 минут, были продуманы UX/UI механики, которые повысили удобство использования и сократили время на административные задачи

3CX Web Client

Стек:

Angular
RXJS
Webpack
OpenAPI
OData

В основном занимался переносом функционала из старого приложения в новое, была реализована подсистема отчетов, которая состояла из 25 таблиц с фильтрами, поиском, выгрузкой CSV и Print View для вывода отчета на печать.

3CX Phone System

Стек:

C#
OpenAPI
OData

Занимался переносом функционала из старого приложения в новое, создание контроллеров с использованием OData и OpenAPI, а также написанием тестов.

ngx-mf

Стек:

TypeScript
Jest

Я разработал Open Source библиотеку для типизации angular форм, подробнее можно ознакомиться по ссылке ngx-mf

Контакты 🤗

Telegram: @iamguid

GitHub: iamguid

StackOverflow: vladislav

Medium: @iam.guid

Reddit: iam_guid