Портфолио
Жидков Алексей Павлович
Архитектор, техлид
https://azhidkov.pro
https://github.com/d-r-q
https://habr.com/ru/users/jdev/
Специализируюсь на разработке информационных систем ([1],[2],[3]) на платформе Java. Но девятнадцать лет опыта, любовь к профессии и свободное чтение на английском позволяют мне успешно делать и десктопные приложения на Python и низкоуровневые системы захвата видео на C и мобильные приложения на Kotlin Multiplatform Mobile.
Занимаюсь коммерческим программированием с 2005 года. С 2017 года работаю независимым консультантом.
Помимо разработки ПО, преподаю и веду дипломников в ВКИ НГУ и НГУ с 2007 года.
С 2020 года веду Телеграм-канал и пишу блог и книгу, о своём подходе к дизайну и разработке ПО.
Образование
- Аспирант ИВТ СО РАН, 2018-2019, занимался исследованиями в области разрешения конфликтов асинхронной репликации данных на основе прототипа встраиваемой многоверсионной СУБД собственной разработки;
- ФИТ НГУ, 2009г;
- ВКИ НГУ, 2006г.
Ключевые навыки и компетенции
- Эргономичный подход к разработке быстрого, надёжного и поддерживаемого ПО.
- Знаю и применяю в работе принципы проектирования помимо SOLID.
- Могу сделать архитектуру лучше, чем "Layered Big Ball of Mud".
- Знаю ООП, ФП, ПП, ООД и ФД достаточно, чтобы понимать что:
- парадигма языка программирования проекта ортогональна парадигме разработки проекта;
- сейчас самая распространённая парадигма разработки - процедурное программирование;
- ООП и ФП - синтаксический сахар;
- ООД и ФД - не взаимоисключают друг друга, а наоборот только вместе дают хороший дизайн.
- Языки программирования:
- Kotlin, Java - профессионально, с 2012 и 2002 года соотвественно;
- JavaScript, Python, C - есть успешный коммерческий опыт;
- Rust, Clojure, Scala, OCaml, Groovy, Eiffel - изучил из любопытства, но не применял.
- Реляционная модель и SQL. Из СУБД предпочитаю PostgreSQL.
- Spring Boot + Web MVC/Flux, Ktor.
- Spring Data (JDBC, R2DBC), jooq, Ebean.
- Автоматизация тестирования — xUnit, testcontainers, mutational testing, property testing.
- Git, Gradle.
Портфолио
ООО "Завод Программно-Технических Комплексов"
Свою работу в качестве независимого консультанта я начал с разработки сервер сбора данных со счётчиков электроэнергии для АИИС КУЭ летом 2017 года.
Проект был интересен тремя аспектами:
- Необходимо было обеспечить гибкую систему определения расписания опросов счётчиков;
- Опрос счётчиков выполнялся по бинарным закрытым протоколам, которые пришлось реализовать самостоятельно;
- Часть каналов связи со счётчиками была крайне нестабильной, поэтому требовалось высокая отказоустойчивость как отдельной сессии опроса счётчика, так и всей системы в целом.
Java 11 PostgreSQL JDBC |
ООО "Эксельсиор" (сейчас Excelsior at Huawei)
Эксельсиор стал моим последним работодателем и одним из двух первых клиентов:)
Исправление ошибок синхронизации в SWING-интерфейсе портативного лидара для Teledyne Optech
В 2016 году, когда я ещё работал в Эксельсиоре, я нашёл и устранил утечку памяти в SWING-интерфейсе портативного лидара Teledyne Optech, заказчика Эксельсиора. Поэтому когда летом 2017 года Teledyne Optech снова обратилась к Эксельсиору с проблемами в этом приложении, они отдали мне эту работу на субподряд.
Приложение было написано стажёром, которому не удалось обеспечить корректную синхронизацию потоков, из-за чего приложение работало крайне нестабильно. Ввиду большого объёма кодовой базы, я решил, что эффективнее будет разработать инструмент (на Kotlin) на базе Java Debug Interface, который выявил все места требующие синхронизации, а так же все обращения к GUI вне Main-потока.
Java 8 Kotlin | Java Memory Model Java Debug Interface |
Поддержка Тomcat 8.5 и 9 в Excelsior JET
Одной из моих последних задач перед увольнением из Эксельсиор была поддержка Tomcat 8 в Excelsior JET. Поэтому, когда осенью 2017 года пришло время поддержки Tomcat 8.5 и 9, Эксельсиор отдал эту работу мне на подряд. Поддержка новой версии Tomcat заключалась в реверс-инжиниринге работы загрузчика классов веб-приложений в Tomcat и его воспроизведение в компиляторе и рантайме Excelsior JET.
Проект был интересен работой с кодом сертифицированной реализации Java Virtual Machine, а так же глубоким погружением в механизм загрузки классов в JVM и загрузчик классов Tomcat.
Java 8 Tomcat 8.5, 9 |
НИОКР системы захвата видео с кастомной камеры для ООО "Сибирский центр транспортных технологий"
Сибирский центр транспортных технологий является разработчиком высокотехнологичных инструментов для РЖД. Их флагманские продукты базировались на платформе Windows, но весной 2018 года они решили так же освоить и Linux и обратились ко мне. В качестве пилотного проекта был выбран прототип системы захвата видео с кастмной камеры по сигналу одного из существующих инструментов.
Это был один из самых интересных и сложных проектов в моей жизни. В-первых, это был первый и пока что последний мой коммерческий опыт на С. Во-вторых, мне повезло напрямую поработать с девайсами, и это совсем другие ощущения:) В-третьих, я поработал с многопоточным и сетевым программированием на языке без synchronized-блока и сборщика мусора.
Стояла задача разработать систему, которая:
- Слушает команды кастомного устройства подключенного по USB (потом перешли на простой выключатель на GPIO);
- Получив команду, начинает захватывать видеопоток с кастомной камеры подключенной по CSI и сохранять его на диск;
Отдельно работает HTTP-сервер, который по запросу на лету собирал кадры за запрошенный интервал и выдавал их zip-архивом.
Заказчик попросил сделать сервер так же на С, и это единственный HTTP-сервер в моей карьере, который стартовал за микросекунды:)
C Raspberry PI Linux USB API | pthreads microhttpd writingPi | CSI |
ООО "Сибериан.Про"
Динамически настраиваемый прокси-сервер для ООО "Обоз"
Зимой 2019 года Сибериан.Про делали мобильное приложение для Обоза. В этом проекте по требованиям заказчика надо было реализовать на Spring Boot небольшую прокси между мобильным приложением и системой заказчика. Основной задачей прокси было динамическое получение конфигурации из Consul.
На тот момент у Сибериан.Про не было свободных Java-разработчиков, поэтому они отдали эту мне работу на субподряд.
Качество и скорость работы устроили Сибериан.Про, поэтому когда у них снова появилась потребность в Java-разработчике, они обратились ко мне.
Java 8 Spring Boot Consul | Spring Cloud Consul Docker/Docker compose |
Сервер приложения для проверки бизнес-гипотезы для "Компании Х" ("Проект Л")
Зимой 2021 года Сибериан.Про начали делать новый проект для "Компании Х" - организатора азартных игр (нет, не джойказино и им подобные:) ). По требованиям заказчика, требовался бекэнд на платформе Java, и Сибериан.Про они снова обратились ко мне.
На момент написания текста, "Проект Л" на этапе разработки. Целью проекта является проверка бизнес-гипотезы об эффективности новой механики трансляции игры, поэтому большую часть функций "Проект Л" делегирует основной системе.
Сейчас в проекте интересно следующее:
- Довольно высокие требования по по производительности, поэтому я выбрал реактивный стэк;
- Использование Kotlin Coroutines для того, чтобы сделать работу с реактивным стэком такой же простой и понятной, как и с синхронным;
- Ввиду специфики приложения, приходится искать баланс между временем отклика системы и согласованностью данных;
- Автоматическое тестирование организовано так, что до заказчика за два месяца дошли 1 (один) баг и 0 (ноль) регрессий.
Kotlin Spring Web Flux/R2DBC Spring Rest Doc/Openapi Ktor client | Testcontainers Kotest Wiremock | PostgreSQL Docker/Docker compose Github Actions; |
Трейдинг Клуб
Система защиты и лицензирования алгоритма торговли на бирже крипто-валют
Трейдинг Клуб разработали уникальный алгоритм торговли на бирже крипто-валют, который был запрограммирован на Python. Зимой 2019 года они обратились ко мне для решения трёх задач:
- защита самого алгоритма от реверс-инжиниринга;
- разработка системы лицензирования доступа к алгоритму;
- разработка GUI для управления алгоритмом.
Для защиты от реверс-инжиниринга, я принял решение скомпилировать скрипт в нативный код Cython-ом. Нативный код сам по себе сложен для реверс-инжениринга, не говоря уж о нативном коде полученном из кода на динамическом языке высокого уровня.
Чтобы обеспечить лицензирование, я реализовал сервер лицензий и добавил проверку лицензии в алгоритм.
Наконец, GUI я сделал на QT, а для того чтобы избавить конечного пользователя от сложностей установки интерпретатора Python, я упаковал приложение pyinstaller-ом.
На данный момент это мой единственный коммерческий проект на Python.
Python/Cython QT/PySide2 pyinstaller | Flask Docker/Docker compose |
Сервер Передачи данных
Разработав приложение, Трейдинг Клуб переключились на реализацию мобильного приложения для отслеживания работы бота. Летом 2020 года Трейдинг Клуб захотели связать эти разрозненные части в единую систему и они снова обратились ко мне.
Суть проекта заключалась в разработке сервера, предоставляющего три АПИ:
- сохранения данных ботом;
- получения данных мобильным приложением;
- отправки ботом пуш-нотификаций в мобильное приложение.
Kotlin Spring Boot Ebean | PostgreSQL Testcontainers Kotest | Docker/Docker compose APNS |
ООО "Геймон Продакшн"
Прототипы Android и iOS приложения для проверки бизнес-гипотезы
Весной 2019 года ООО "Геймон Продакшн" обратились ко мне за разработкой прототипа Андроид-приложения для проверки бизнес-гипотезы.
Суть приложения заключалась в том, чтобы хранить определённые пользовательские данные и использовать их для автоматизации заполнения схожих Веб-форм на различных сайтах.
Практически сразу стало понятно, что писать и поддерживать скрипты заполнения форм на стандартном АПИ WebView будет слишком долго и дорого. Поэтому я разработал DSL на базе Kotlin Coroutines, который позволял описывать шаги заполнения формы в декларативном стиле.
В процессе разработки скриптов, мне пришлось погрузиться в устройство современных веб-ферймворков, чтобы понять как автоматизировать заполнение форм, управляемых ими.
Изначально заказчик просил версию только под Андроид, но спустя несколько месяцев разработки, захотел так же и версию под iOS. Понимая, что самым дорогим в проекте были скрипты, я решил, вместо портирования их под iOS, рискнуть и выделить DSL и сами скрипты в мультиплатформенный модуль.
В процессе подключения KMM-модуля к iOS-приложению возник ряд трудностей. Тем не менее я уверен, что это решение сэкономило заказчику 50-100% итоговой стоимости проекта.
Kotlin Kotlin Multiplatform Mobile Kotlin Coroutines JavaScript | WebView React Angular Vue.js | Android iOS |
ООО "Брума Сервис"
Реинжениринг модуля отчётности
Одним из продуктов Брумы является Threads - комплексное решение для организации взаимодействия с клиентами в чатах и мессенджерах. Весной 2019 года Брума обратилась ко мне с просьбой провести реинжиниринг модуля отчётности Threads, на который им на тот момент не хватало собственных ресурсов.
В оригинальном модуле было порядка 20 сложно диагностируемых ошибок, вызванных кэшированием данных, и в процессе работы он потреблял чрезмерно много памяти. Это приводило к отказу основного приложения.
Для решения проблемы, я:
- провёл реверс-инжиниринг оригинального модуля;
- выделил его в отдельный процесс;
- реализовал потоковую передачу данных от сервера БД до браузера клиента через два приложения на Spring Web MVC.
Потоковый режим работы и работа с JDBC напрямую позволили исправить ошибки оригинального модуля, существенно повысить производительность нового модуля и решить проблемы с количеством потребляемой памяти.
Выполнение проекта заняло значительно больше времени, чем планировалось. Тем не менее, мы продолжили сотрудничество в формате аутстаффа и проработали в таком формате ещё полтора года.
Реинжениринг модуля маршрутизации
Летом 2020 года в кратчайшие сроки я выполнил реинжиниринг модуля маршрутизации. Модуль маршрутизации является сердцем системы, которое соединяет клиентов и операторов, и если он не работает, вся система перестаёт функционировать.
За годы разработки этот модуль накопил большое количество техдолга, который привел к серьёзным проблемам с производительностью. Что в свою очередь привело к критическому снижению качества обслуживания у одного из стратегических клиентов Брумы.
За две недели я провёл первую итерацию реинжиниринга этого модуля в соответствии с принципами Эргономичного подхода. Это дало поразительный 300-кратный рост пропускной способности системы без потери функциональности и в конечно итоге позволило сохранить стратегического клиента.
Java 8 Spring Boot | PostgreSQL Oracle JDBC | SQL |
Опыт работы в найме
Место работы: Сибериан.Про, Руководитель функциональной команды Java, техлид
Время работы: Май 2021 – текущий момент
Создал функциональную команду Java, доростил её до 7 человек, устал от чисто менеджерской работы, нашёл нового менеджера для команды и вернулся в производство.
Место работы: НГУ, Преподаватель, научный руководитель дипломных работ
Время работы: Сентябрь 2009 – текущий момент
- Семинарист курса "Базы Данных" (2018-настоящий момент);
- Лектор и семинарист курса "Объектно-Ориентированное программирование" (2009-2014).
Место работы: Excelsior, инженер, руководитель проектов
Время работы: Июнь 2013 - июнь 2017
- Lidar Mapping Suite - система для обработки данных полученных лидарами;
- SendItBetter (более не доступен) - сервис отправки больших файлов по e-mail;
- Restler - библиотека генерации клиентов HTTP-API по описанию Java-классом;
- ExcelsiorJet (более не доступен) - сертифицированная реализация JVM и AOT-компилятор Java.
Место работы: Playtox, инженер
Время работы: Сентябрь 2012 – май 2013
Разработка платформы для мобильных MMO игр.
Место работы: КА Алексея Сухорукова, эксперт по Java
Время работы: Июнь 2010 – август 2013
Оценка уровня владения Java соискателями.
Место работы: Алавар.ру, HD Soft (с ноября 2009), инженер
Время работы: Октябрь 2008 – сентябрь 2012
Разработка Java-платформы для приставок кабельных сетей цифрового телевидения США и прикладных приложений для них же.
Место работы: Инновационные технологии, инженер
Время работы: Март 2008 – октябрь 2008
Разработка городского информационного портала «Город-гид».
Место работы: ВКИ НГУ, Преподаватель, научный руководитель дипломных работ
Время работы: Февраль 2007 – июль 2016
Лектор и семинарист базового проекта "Трансляторы".
Место работы: КБ Информ, инженер
Время работы: Январь 2006 – март 2008
Разработка автоматизированной информационно-измерительной системы коммерческого учёта электроэнергии.
Место работы: ТрендСВ, младший инженер
Время работы: Май 2005 – октябрь 2005
SaaS для риелторов США.
Опенсорс проекты
- qbit - встраиваемая распределённая СУБД на Kotlin Multiplatform;
- Q5 - персональное Android-приложение для учёта расходов;
- Yandex Music • Nuvola Apps Runtime - скрипт поддержки Яндекс.Музыки в Nuvola Player;
- Jeb-k - комманд-лайн инструмент для инкрементальных бэкапов со схемой ротации на базе Ханойских башень;
- Maroz - Hello World на голом железе на ассемблере и Rust;
- Kakos - загрузчик ОС на ассемблере и С;
- QuickDialer - виджет рабочего стола Andoid, для быстрого набора "любимых" и недавних номеров;
- DistributedRobocode - система распределённого запуска Robocode для локальной оценки рейтинга "Томкэта";
- Tomcat - Robcode бот, в 2011 году занял первое место из примерно тысячи ботов на тот момент.