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

Software Engineer

Обо мне_

Делаю полезные вещи для docuwalk.com.
Последние несколько лет работаю над собственным проектом — teamcoding.ru.

Репозиторий github.com/mgerasimchuk/space-trouble демонстрирует некоторые из моих навыков.

Резюме .PDF

Навыки_

Основные

GoLang

golang-standards/project-layout, The Clean Architecture, goroutines, go app for k8s, channels, grpc, protobuf, amqp, 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

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

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

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

SQL, PL/SQL

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

HTML, CSS, jQuery, JavaScript

Twitter Bootstrap framework, bootstrap templates. HTML templates integration.
AJAX, jstree, FullCalendar, C3.JS charts, D3.JS charts, chart.js, jquery.rest, jquery.terminal e.t.c.

git

Pull request, merge, rebase, commit rollback. Forks, auto-deploy. Creation of the releases, extensions. Gitlab, Bitbucket, GitHub, code review, a lot of code review.

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

In the process of work I also use


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

Shelter Zoom (Remotely)

Tech Lead

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

Делаю полезные вещи для docuwalk.com.

Роли: 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
- Инициировал и курировал миграцию с GitHub на GitLab
- Описал GitLab пайплайны содержащие этапы тестирования, сборки и доставки(с аппрувами) приложений на несколько окружений
- Создал главный лэйаут/шаблон для приложений
- Привнес практики чистой архитектуры
- Реализовал и интегрировал во все сервисы, возможность remote debug-а для golang приложений запускаемых в k8s. За счет введения дополнительных этапов в CI/CD по сборки и деплою приложения в специальном debug режиме. В рамках этой активности так же реализовал и live sync + rebuild сервисов в кластере с помощью reflex, rsync завернутых в кастомный докер контейнер, что позволило выполнять запуск sync-а в 1 клик
- Реализовал сбор Prometheus метрик и AWS XRay трэйсов, в разрезе операции репозитория, с дампом всех входящих параметров, имени метода а также возвращаемого результата+наличия ошибки. С помощью написания шаблона репозитория-декоратора и автогенерации декораторов gowrap-ом с последующей инициализацией в entrypoint-е приложения

Pushwoosh (г. Новосибирск / Удаленно)

Golang Developer

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-ы в одном месте, с указанием того, что каждому осталось посмотреть.

НГС Технологии(N1.RU) (г. Новосибирск)

PHP Developer

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 continuous delivery system, 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);
- Для упрощения написания тестов, где требуется мокать внутренние апи клиенты, написал трэйт, после примеси которого, в унаследованном от реального апи клиента классе(моке), можно удобно и просто определять очередь ответов, так же можно добавлять в очередь и исключения, и ответы с ошибками.

VipParcel (г. Новосибирск)

PHP Developer

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.

YarCode (г. Красноярск)

PHP Developer

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)

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

Go to English version

mgerasimchuk.dev