Герасимчук Михаил

Tech Lead | Backend | Cloud Solutions

Обо мне_

Улучшаю кодовую базу Golang в ShelterZoom, в рамках работы над продуктом DocuWalk с помощью создания скелетон приложений и адаптации практик чистой архитектуры.
Улучшаю CI/CD процессы в GitLab, развиваю monitoring на основе Prometheus, Grafana и Alertmanager, осуществляю оптимизации производительности системы в рамках работы с БД, и стараюсь улучшить экосистему разработки на базе AWS и Kubernetes.
Последние несколько лет работаю над собственным проектом — teamcoding.ru.

Проекты ниже, демонстрируют некоторые из моих навыков:
- github.com/mgerasimchuk/space-trouble (business app)
- github.com/mgerasimchuk/protty (cloud native app)

Резюме .PDF

Навыки_

Основные

GoLang

golang-standards/project-layout, The Clean Architecture, go app for k8s, goroutines, channels, generics, grpc, protobuf, amqp, kafka, graceful shutdown, gowrap(custom templates), etc.

K8S

DigitalOcean k8s(+DO LoadBalancer and persistent volumes), GKE k8s, AWS k8s, self-hosted k8s cloud, Rancher k8s, kubectl, helm charts, autoscaling, ingress controllers (traefik, ingress-nginx, voyager, multiple ingress-nginx controllers in the cluster), network policy (namespace isolation), NodePorts, SSL installation / cert-manager, Linkerd, istio, k8s HTTP API, troubleshooting, traffic sniffing by ksniff, tcp-dump and wireshark

DevOps, Tooling, SRE

Cloud platforms (AWS, GCP, Digital Ocean, Hetzner): Configuring Kubernetes(self-hosted and as a service), Load balancing, virtual network, S3, CDN, configuring LAMP/LEMP stack on VPS. Configuring and interacting with AWS services - EKS/ECR/XRay/SNS/MSK
Kube Prometheus stack: PromQL, SLI/SLO metrics/budgets/alerts, Alertmanager API, Grafana dashboards creating and delivering through the CI/CD with Grafana API / helm charts, Prometheus push-gateway configuration, Prometheus record rules, product and infrastructure alerts, Alertmanager receivers customization
Helm: Creating templates for business apps, Grafana dashboards, Prometheus rules/alerts, infrastructure apps
Terraform: Using 3rd party providers for describing infrastructure as a code
GitLab, GitHub: Creating pipelines and workflows from scratch for testing(unit+integration), linting, building business applications and delivering to the production through the dev and stage environments. Creating and configuring self-hosted gitlab shell runners. Creating custom integrations(review reminder bots, developers mention mechanisms, metric exporters to the ES and Grafana) with the GitLab API

Testing (Unit, Integration, Stress, Acceptance)

Unit: TDD, BDD testing, PHPUnit(MockBuilder, ReflectionClass, Coverage), Codeception frameworks. Fixtures and Faker extensions to generate mock data, Golang test(gomock, gounit, faker, HTTP recorders)
Integration: docker-compose based with infrastructure/svc mocks by Wiremock(for HTTP APIs), Gripmock(for gRPC API), Localstack(for AWS)
Stress: Tsung, Yandex tank, JMeter, BlazeMeter, recording and reproduced users' sessions with Nginx access logs and Tsung sessions.
Acceptance and Smoke: Codeception, Selenium, Selenoid for UI testing(with session video recording)

OpenAPI/Swagger Specification

With the "API Design First" approach, using OpenAPI/Swagger Specification and Swagger-UI. Writing specification for GET, POST, PUT, PATCH, DELETE requests with definitions. Using specification to runtime requests validation. Using swagger interceptor to generate documentation based on existing API

PHP8, PHP7, PHP5.6, Yii 2, Kohana 3, Slim, Silex, Cilex

JRPC/REST API, PHPUnit, Threads, pcntl, XDebug, XDebug profiling.
Yii2: Advanced template, Миграции, Active Record, table input, widgets, routing, RBAC.
Kohana3: ORM, mmp migrations, Smarty, Minions Task.

Mongo DB

SQL, PL/SQL

Index usage, сomplex queries, virtual tables, views, stored procedure, triggers. MySQL, PostgreSQL.

Также использую

In the process of work I also use


Опыт работы (10 лет, 5 месяцев)_

Tech Lead

ShelterZoom · Нью-Йорк, Соединенные Штаты · Удаленно

11.2021 - наст. время (2 года, 6 месяцев)

Улучшаю кодовую базу Golang в ShelterZoom, в рамках работы над продуктом DocuWalk с помощью создания скелетон приложений и адаптации практик чистой архитектуры. Улучшаю CI/CD процессы в GitLab, развиваю monitoring на основе Prometheus и Grafana, осуществляю оптимизации производительности системы в рамках работы с БД, и стараюсь улучшить экосистему разработки на базе AWS и Kubernetes.

Роли: Lead Golang developer, Tech Lead

Используемые языки и инструментарий: GoLang, gRPC, protobuf, WebSockets, REST, Prometheus, Prometheus Alertmanager, Docker, K8S, MongoDB, Elasticsearch(AWS OpenSearch), Kafka, BlazeMeter, JMeter, Grafana, Kibana, GitLab, Microservices, AWS(X-Ray, CloudWatch, VPC, MSK, EKS), Hyperledger.

*Было интересно на момент работы с проблемой (т.е. сейчас, некоторые решения, я бы возможно вычеркнул из этого списка)
- Привнес CI/CD практики, интегрировав запуски тестов/линтеров на уровне GitHub CI/CD
- Привнес и интегрировал на уровне CI/CD практики написания acceptance тестов на базе docker-compose и инфраструктурных моков с использованием gripmock(для gRPC API), wiremock(для HTTP API), LocalStack(для AWS инфраструктуры)
- Инициировал и провел миграцию с GitHub на GitLab
- Описал GitLab пайплайны содержащие этапы тестирования, сборки и доставки(с аппрувами) приложений на несколько окружений
- Создал главный лэйаут/шаблон для приложений
- Привнес практики чистой архитектуры
- Реализовал и интегрировал во все сервисы, возможность remote debug-а для golang приложений запускаемых в k8s. За счет введения дополнительных этапов в CI/CD по сборки и деплою приложения в специальном debug режиме. В рамках этой активности так же реализовал и live sync + rebuild сервисов в кластере с помощью reflex, rsync завернутых в кастомный докер контейнер, что позволило выполнять запуск sync-а в 1 клик
- Реализовал сбор Prometheus метрик и AWS XRay трэйсов, в разрезе операции репозитория, с дампом всех входящих параметров, имени метода а также возвращаемого результата+наличия ошибки. С помощью написания шаблона репозитория-декоратора и автогенерации декораторов gowrap-ом с последующей инициализацией в entrypoint-е приложения
- Реализовал silences feature на базе Alertmanager API для автотестов QA team

Software Development Engineer

Amazon Web Services (AWS Shield) · Ванкувер, Канада · В офисе

08.2022 - 08.2022

Я написал 0 строчек кода для AWS, но мой почтовый ящик содержит более 300 писем-переписок с моим менеджером команды разработки AWS Shield и сотрудниками сервиса иммиграции.

К сожалению, по не зависящим от меня и Amazon обстоятельствам, я не смог приступить к работе над проектом AWS Shield из-за того, что агенство иммиграции Канады не осуществило одобрение моей рабочей визы в установленные сроки.

Не смотря на это, я все равно решил отразить этот опыт в моем карьерном пути, так как нахожу его авторитетным подтверждением некоторых моих навыков.

  • Я прошел все три раунда интервью включая loop, и получил финальный job offer 16 августа 2022 года в команду AWS Shield и принял его.
  • Улетал в Казахстан, чтобы сдать языковой экзамен IELTS и готовить большое кол-во других документов для иммиграции в Канаду
  • Отправил весь пакет документов на иммиграцию.
  • Подписал много бумаг и контрактов от AWS и даже зарезервировал внутреннюю почту и бейдж
  • Но спустя пол года активной работы с агенством иммиграции Канады, и аутсорс агенством помощи с иммиграцией Vialto, мои документы остановились на самом последнем этапе проверки
  • Amazon несколько раз продлевал мне оффер, а вопрос с иммиграционной заявкой эскалировался в Canada IRCC как стороной Amazon, так и парламентариями работающими с Vialto
  • Спустя одного с половиной года с момента получения оффера, счастливого конца к сожалению так и не случилось, и в качестве опыта у меня остался только этот долгий путь, который ни закончился тем чем я хотел
  • 4 января 2023 года, мои документы все еще были на финальном этапе review в Canada IRCC, и Amazon не согласовал дальнейшие продления оффера

  • На этом моя история с FAANG и иммиграцией в Канаду завершилась, но к сожалению не в мою пользу

    Golang Developer

    Pushwoosh · г. Новосибирск, Россия · Гибридный формат

    11.2018 - 11.2021 (3 года)

    Пишу сервисы в основном на GoLang и иногда на PHP для pushwoosh.com, работа связана как с высоконагруженными сервисами ~15K RPS, так и с менее нагруженными, которые пишутся с нуля, и только, только выводятся на бой. Общий рейт запросов в сумме варьируется от ~40K RPS до ~110K RPS.

    Роли: Middle Backend Engineer L1, Middle Backend Engineer L2, Middle Backend Engineer L3, Senior Backend Engineer L1
    Команды: Strategy, Abandoned cart sub-product, Customer Data Platform sub-product, Core, Production, SRE

    Используемые языки и инструментарий: GoLang, gRPC, protobuf, Prometheus, Consul, Docker, K8S, PHP7(+демоны на php), PostgreSQL, MongoDB, ClickHouse, Cassandra, Kafka, RabbitMQ, Redis, Tsung, Yandex tank, Grafana, Redash, Gitlab(сборка и тесты - все там, деплой с кнопки), Microservices, REST API.

    *Было интересно на момент работы с проблемой (т.е. сейчас, некоторые решения, я бы возможно вычеркнул из этого списка)
    - Работа над отдельным продуктом - Abandoned Cart. Это b2b продукт, для которого я сделал MVP на Yii2. MVP позволял настроить брошенную корзину с отложенными сообщениями в facebook messenger, а так же позволял осуществлять сбор данных о пользователях facebook. Во время реализации MVP была интегрирована авторизация через FB и создано единое Facebook приложение. Когда кастомер создавал брошенную корзину, MVP автоматически вызывало FB API методы генерации маркеров доступа, которые требуются для уведомления пользователей о брошенной корзине в FB messenger-е. Так же в момент создания кастомером брошенной корзины, MVP проставлял webhook-и на Facebook страницу кастомера, для того чтобы принимать сообщения от его клиентов. А чтобы Facebook Checkbox plugin отображался на сайте кастомера, в MVP было интегрировано Facebook Page Settings API для установки whitelisted_domains поля страницы. MVP продукта я развернул в своем облаке, что позволило продемонстрировать бизнесу продукт, в том числе и дать им самим его использовать. В дальнейшем я запросил добавить поддомен для MVP на нашем основном домене, это позволило использовать его во время предпродажных демонстраций для потенциальных кастомеров. Так же сделал доступ к ресурсу по секретной куке, которую проверял на уровне nginx, что позволило скрыть MVP от посторонних глаз, не тратя при этом время на авторизацию. После создания и презентации MVP, мы разнесли все на Go сервисы, в которых уже использовали все взаимодействия с Facebook API, которые были налажены в MVP.
    - Приемочные тесты на codeception с поднятием selenoid фермы в k8s - покрыл приемочными тестами позитивный главный кейс для нового продукта "Abandoned Cart", на selenoid ферме была сконфигурирована видео трансляция тестового сценария
    - Помощь кастомерам с интеграцией продукта - писал кастомные JS решения по интеграции, для клиентов, у которых были проблемы с интеграцией продукта брошенной корзины
    - Тестирование ClickHouse как потенциального хранилища для будущего хранения пользовательских событий кол-вом порядка 15-20млрд. Была выполнена миграция части текуших данных из mongoDB strorage-а в ClickHouse storage, и был реализован скрипт который выполняет ряд различных реальных запросов на разном кол-ве данных / разном временном диапазоне, и на основе скорости выполнения был сделан вывод, что данное хранилище удовлетворят потребностям.
    - Написание js скрипта нормализации ~1.9млрд документов, размещенных в ~1.6K базах данных(~1.8Tb) одного mongoDB кластера. Требовалось нормализовать значения одного поля, содержащего массив объектов. Для этого был написан скрипт который проходится по всем базам данных кластера и в каждой БД делал полный проход по всем документам требуемой коллекции. Сразу же в скрипте были написаны тесты по нормализации документа, которые обязательно запускались перед стартом нормализации и должны были завершится с успехом + был организован live вывод статистики по кол-вам обработанных/заэфекченных документов как на уровне текущей БД так и общие числа по кластеру, так же был выполнен вывод потраченного и прогнозируемого времени работы. Был реализован dryRun режим в скрипте, и работа в режиме dryRun занимала ~30 чассов
    - Реализация шаблона сервиса consumer-а для закрытия проблемы с boilerplate. В шаблон была сразу же заложена логика на основе управления простенькой сущностью пользователя для демонстрации того, как стоит комфортно организовывать роутинг ивентов из EventBus, а работа всех компонентов приложения в то числе и с демо сущностями пользователя была построена с использованием архитектурного подхода The Clean Architecture. В результате написания такого шаблона, разработчику, после генерации нового сервиса, очень просто видеть на примере, что и куда складывать, и на это уходит минимальное время.
    - Настройка автоскейлинга для сервиса работающего в k8s, включая подбор оптимального кол-ва воркеров одного из компонентов сервиса + нагрузочное тестирования для проверки того, что поды множатся
    - Реализация микросервиса с "горячей" реконфигурацией компонентов по хукам изменений конфигов из консула (изменяешь конфиг в consul-ui, микросервису приходит хук с новыми значениями, если ключ конфига поддерживает горячую реконфигурацию компонента, то stateful компонент останавливается, и запускается заново с новым конфигом, если же ключ не поддерживает горячую конфигурацию, сервис сам себя "убивает" и k8s под убивается, ну и потом новый поднимается)
    - Обозначил и решил проблему с долгими ревью в команде с помощью реализации slack бота. Данный бот конфигурируется для конкретной команды и соответствующего канала команды в slack. Отправляет сообщение в канал команды, каждый день в 9 часов с напоминаниями о ревью - отмечая в каждом отдельном MR тех, кто не посмотрел его или упоминает, автора о том что пора мержить MR; демонстрирует статус последнего пайплайна для MR; указывает кол-во аппрувов и открытых дискуссий; указывает ссылки на задачу в JIRA, на сам MR, на репозиторий в который делается MR; сортирует MRы в особом порядке, с учетом успешности пайплайнов, кол-ва дискуссий/аппрувов, времени прибывания на ревью. А также обновляет всю вышеуказанную информацию в своем сообщений, на протяжении всего оставшегося дня. Что позволяет членам команды постоянно видеть актуальные MR-ы в одном месте, с указанием того, что каждому осталось посмотреть.

    PHP Developer

    НГС Технологии (N1.RU) · г. Новосибирск, Россия · В офисе

    06.2017 - 11.2018 (1 год, 5 месяцев)

    Группа разработки проекта "Недвижимость" N1.RU, цифрового направления медиакомпании Hearst Shkulev Digital Regional Network.

    Разработка единого API, с нагрузкой ~500 RPS, для webapp на vue.js и мобильных приложений на Android, iOS.

    Роли: Middle PHP developer
    Команды: Desktop Web App API, Mobile Apps API

    Используемые языки и инструментарий: PHP5.6, PHPUnit, MongoDB, Elastic Search, Redis, Swagger/OpenAPI, XDebug, Xhprof, RabbitMQ, Docker, Drone CI/CD, Foreman, Silex Framework, Cilex CLI Framework, Sentry, Grafana, Jira, Tsung.

    *Было интересно на момент работы с проблемой (т.е. сейчас, некоторые решения, я бы возможно вычеркнул из этого списка)
    - Для валидации @throws phpDoc завернул PHPStorm в docker контейнер на alpine, и внедрил в drone CI;
    - Для тестирования нового функционала, который был рискован, проводил нагрузочные тесты на боевое апи с помощью tsung и реальных пользовательских сценариев, которые были записаны;
    - Сделал внутренний инструмент для авто тестов того, что правки в api не ломают старого функционала - например для задач по рефакторингу, или подобных, требуется получить выборку из access логов, закинуть ее в инструмент, указать виртуальные среды с production кодом, и с версией кода, в которую внесены правки, и система проверит, совпадения ответов. Инструмент позволяет изменять запросы/урлы/тела ответа с помощью php middleware-ов, которые находятся в веб интерфейсе;
    - Для сокращения времени настройки remote debug-а в phpStorm, сделал расширение для данной IDE, которое, позволяет выполнять настройку xdebug в один клик (https://plugins.jetbrains.com);
    - Для упрощения написания тестов, где требуется мокать внутренние апи клиенты, написал трэйт, после примеси которого, в унаследованном от реального апи клиента классе(моке), можно удобно и просто определять очередь ответов, так же можно добавлять в очередь и исключения, и ответы с ошибками.

    PHP Developer

    VipParcel · г. Новосибирск, Россия · В офисе

    09.2016 - 05.2017 (8 месяцев)

    Реализация новой функциональности для проектов VipParcel и ExpressFromUS и осуществление их поддержки.

    Используемые языки и инструментарий: PHP5.6, Kohana 3 framework, Smarty, jQuery, JS, HTML, CSS, twitter bootstrap framework, RabbitMQ, Mercurial (Bitbucket), composer, MySQL, phpStorm, Ubuntu, Docker.

    PHP Developer

    YarCode · г. Красноярск, Россия · В офисе

    09.2015 - 09.2016 (1 год)

    Под руководством YarCode agency реализовал ряд проектов представленных в портфолио (за исключением разработки верстки, так же некоторые проекты разрабатывались в команде).

    Используемые языки и инструментарий: PHP5.4, jQuery, JS, HTML, CSS, twitter bootstrap framework, swagger framework, codeception framework, git (Bitbucket, GitHub), composer, MySQL, dbForge, phpStorm, LEMP stack.

    Java desktop application developer

    Коммунальные информационные системы · г. Красноярск, Россия · В офисе

    01.2015 - 06.2015 (5 месяцев)

    Поддержка системы автоматизации бизнес процессов, компаний предоставляющих энергоресурсы.
    • Адаптация iReport отчетов;
    • Разработка классов сбора/импорта данных и др.

    Используемые языки и инструментарий: Java, SQL, Eclipse, Aqua data studio, iReport, SVN, CVS, Lotus, СУБД MS SQL Server.

    C# desktop application developer

    Ситалл-софт · г. Красноярск, Россия · В офисе

    10.2012 - 01.2014 (1 год, 3 месяца)

    Поддержка системы автоматизации бизнес процессов полиграфической компании ЗАО "Ситалл" .
    • Изменение UI по требованиям пользователей;
    • Оптимизация View, хранимых процедур, SQL запросов для СУБД Oracle и др.

    Используемые языки и инструментарий: C#, Delphi, XML, SQL / MS Visual Studio, Delphi 7, SVN, SQL Navigator, Crystal Report / СУБД Oracle.

    Образование_

    Информатика и вычислительная техника. Высокопроизводительные вычислительные системы (магистратура)

    СФУ Институт космических и информационных технологий · Красноярск, Россия

    09.2015 - 06.2017

    После защиты дипломного проекта на тему “Лабораторный комплекс, для развития и контроля практических навыков работы с командным интерфейсом операционных систем” была присвоена квалификация магистр и выдан диплом с отличием.

    Вычислительные машины, комплексы, системы и сети (специалитет)

    СФУ Институт космических и информационных технологий · Красноярск, Россия

    09.2010 - 06.2015

    После защиты дипломного проекта на тему "Разработка симулятора командного интерфейса для обучения и контроля знаний студентов по предмету Операционные системы. Логика сервера приложения" была присвоена квалификация инженер и выдан диплом с отличием.

    Деятельность и сообщества:
    Член команды по программированию от ИКИТ СФУ, участник 1/4 финала международной олимпиады по программированию АСМ ICPC, участвовал в олимпиадных сборах по подготовке к полуфиналу АСМ ICPC в г. Барнауле. Являлся лауреатом и победителем научно-технических конференций. Участник форумов и инновационных проектов.

    Работы на тему (статьи):
    Логика сервера симулятора для обучения и контроля знаний студентов (июнь 2015)
    Описание требований и структуры симулятора для проверки и контроля знаний студентов (январь 2015)
    Реализация веб-ориентированного приложения, тренажера-эмулятора, для обучения и контроля знаний обучающихся (июнь 2014)
    Реализация сервера блокировок для совместного использования объектов информационной системы (июль 2013)


    Свидетельства о государственной регистрации программ для ЭВМ:
    Модуль управления симулятора командного интерфейса для обучения и контроля знаний студента (июнь 2015)
    Программный комплекс CryptoT. Обучающий модуль для изучения методов криптоанализа моноалфавитных и полиалфавитных шифров (апрель 2015)

    Последние изменения: 23.05.2024г.

    Go to English version

    mgerasimchuk.dev