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

Software Engineer

Обо мне_

Пишу микросервисы для pushwoosh.com на Go в соответствии с the clean architecture рекомендациями. Конфигурирую их Consul-ом, покрываю Prometheus метриками, заворачиваю в Docker и деплою/смотрю/скейлю в K8S. Веду и разрабатываю новые продукты в компании - принимал ключевые решения по интеграции технологии Facebook месседжинга для нового продукта Abandoned Cart Recovery. Занимаюсь разработкой платформенных сервисов с нагрузкой до ~15000 RPS, общий рейт запросов на весь кластер при этом, варьируется от ~40K RPS до 110K RPS.
Последние несколько лет работаю над собственным проектом — teamcoding.ru, и недавно сделал beta релиз.

Репозиторий 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, etc.

K8S

Kubectl, helm charts, autoscaling, ingress controllers (ingress-nginx, voyager, multiple ingress-nginx controllers in the cluster, troubleshooting), network policy (namespace isolation), SSL installation / cert-manager, Linkerd, k8s HTTP API, DigitalOcean k8s(+DO LoadBalancer and persistent volumes), GKE k8s, self-hosted k8s cloud

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, Functional, Acceptance, Stress)

TDD, BDD testing. Writing acceptance, integration, and unit tests with PHPUnit/Codeception frameworks. Using fixtures and Faker extensions to generate mock data. PHPUnit - MockBuilder, ReflectionClass, Coverage. Smoke Tests using Selenium, Selenoid(with session video recording). In Golang - unit tests + gomock and gounit packages.

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.

Server administration

Digital Ocean(Droplets, K8S, Private Networks, Volumes, DNS, Load Balancers, etc.), Google Cloud (GKE, K8S, Volumes, etc.), Configuring of LAMP/LEMP stack.

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.

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

В процессе работы также использую


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

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

Golang developer

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

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

Используемые языки и инструментарий: 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.

Используемые языки и инструментарий: 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 - 06.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)

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

Go to English version

mgerasimchuk.dev