Portfolio

Aleksey Zhidkov

Architect, Tech Lead
https://azhidkov.pro
https://github.com/d-r-q


I specialize in developing information systems ([1],[2],[3]) powered by the Java platform. However, I’m quite versatile thanks to having nineteen years of experience, loving what I do, and reading English fluently. That’s why my background also includes working on Python desktop apps, low-level video capture software with C, and Kotlin Multiplatform Mobile apps.

I’ve been working as a software engineer since 2005, and as an independent consultant since 2017.

Apart from creating software, I’ve been working as a lecturer and thesis advisor at Novosibirsk State University across two departments since 2007.

Since 2020, I’ve also been writing my own Telegram channel (rus), a blog (rus, en), and a book (rus) about my approach to software design and engineering.


Education

  • Ph.D. candidate at the Federal Research Center for Information and Computational Technologies, 2018-2019. My research was focused on conflict resolution for asynchronous data replication. It was based on a prototype of an embedded multi-version DBMS I devised myself. I had to take a temporary break from my studies in connection with my child’s birth.
  • Computer Science, Novosibirsk State University, 2009.
  • Higher College of Informatics, Novosibirsk State University, 2006.


Key skills and competencies

  • I take an ergonomic approach to developing fast, reliable, and easily maintainable software.
  • I know of and apply in my work more design principles other than SOLID.
  • I can design a better architecture than "A Layered Big Ball of Mud."
  • I’m familiar with OOP, FP, PP, OOD, and FD on a good enough level to know that:
    • The paradigm of the programming language powering the project is orthogonal to the project’s development paradigm.
    • Right now, procedural programming is the generally preferred development paradigm.
    • Both OOP and FP are syntactic sugar.
    • OOD and FD aren’t mutually exclusive—on the contrary, they can only produce a good design when used together.
  • Programming languages:
    • Kotlin, Java: I’ve been working with both on a professional level since 2012 and 2002, respectively.
    • JavaScript, Python, C: I have some successful commercial experience.
    • Rust, Clojure, Scala, OCaml, Groovy, Eiffel: I have studied these out of sheer curiosity but never got the chance to apply any in my work.
  • The relational model and SQL. With DBMSes, I prefer PostgreSQL.
  • Spring Boot + Web MVC/Flux, Ktor.
  • Spring Data (JDBC, R2DBC), jooq, Ebean.
  • Testing automation: xUnit, testcontainers, mutational testing, property testing.
  • Git, Gradle.


Portfolio

I&C Systems Company

I started out as an independent consultant back in summer 2017 with this project. It involved developing a server for data collection from electric meters.

Here are some interesting highlights:

  1. I had to deliver a flexible system for scheduling electric meters polling.
  2. The polling was to be conducted via binary closed protocols, which I had to implement myself.
  3. Some electric meter connection channels were quite unstable, so it was paramount to make both separate polling sessions and the system overall highly resilient.
Technologies:

Java 11

PostgreSQL

JDBC


Excelsior (Excelsior at Huawei now)

Excelsior became my last employer and one of my first private clients :)

Fixing sync issues in the SWING interface of a Teledyne Optech mobile lidar

Back in 2016 when I was still working at Excelsior, I found and fixed a memory leak in the SWING interface of mobile lidars produced by Teledyne Optech, one of Excelsior’s clients. So when in summer 2017 Teledyne Optech reached out to Excelsior again with some issues in that app, the job was handed over to me on a subcontract basis.

The app was initially developed by an intern who hasn’t been able to find a sound implementation of thread synchronization. This was causing the app to be extremely unstable.

Because of the large-sized code base, I decided it would be more efficient to develop a Kotlin-powered tool based on the Java Debug Interface. The tool would detect all the spots that need to be synchronized, as well as all GUI requests coming outside the Main flow.

Technologies

Java 8

Kotlin

Java Memory Model

Java Debug Interface

Tomcat 8.5 and 9 support in Excelsior JET

One of my last tasks before leaving Excelsior was to provide support for Tomcat 8 in Excelsior JET. So when in October 2017 they had to add support for Tomcat 8.5 and 9, Excelsior handed this job over to me on a contract basis. For this task, I had to reverse-engineer the web apps class loader in Tomcat and replicate its work the compiler and Excelsior JET’s runtime.

This project had me work with the code of Java Virtual Machine’s certified implementation. What’s more, I got the chance to dive deeply into all the minutiae of JVM’s and Tomcat’s class loaders.

Technologies

Java 8

Tomcat 8.5, 9

R&D of a video capture system for custom camera, The Siberian Center of Transport Technologies

The Siberian Center of Transport Technologies is the company developing high-tech tools for the Russian Railways. Their flagship products were based on Windows, but in spring 2018, they decided to also give Linux a try. That’s why they went to me. For the pilot project, they chose to make a prototype of a video capture system for a custom camera that would receive signals from one of their existing devices.

This project turned out to be one of the most fascinating and complex ones I’ve ever worked on. First, it was the first–and so far the last–commercial experience I’ve had with C. Second, I got the chance to do some work with hardware directly. That’s a whole different experience :) Finally, I tried my hand at multithreaded and network programming with a language that has no synchronized block or garbage collector.

The system’s workflow was supposed to look like this:

  1. The system would listen for requests from a custom device connected to it via USB (we switched to a simple GPIO switcher later on);
  2. Once it receives a command, the system beings to capture the video stream from a custom camera connected to it via CSI and save it to the drive.
  3. There also was a separate HTTP server that would, on request, collect frames within a specified time interval and pack them into a zip archive.

    The client asked for the server to be powered by C. This was the only HTTP server in my entire career that would start up in microseconds :)

Technologies

C

Raspberry PI

Linux USB API

pthreads

microhttpd

writingPi

CSI

Siberian.Pro

Dynamically configuring proxy server for Oboz

Back in winter 2019, Siberian.Pro was developing a mobile app for Oboz. In this project, the client wanted to have a small proxy powered by Spring Boot that would act as a liaison between the mobile app and the client’s system. The proxy’s main task was to dynamically receive the configuration from Consul.

Siberian.Pro’s Java engineers were all busy working on other tasks, which is why they handed this job over to me on a subcontract basis.

Siberian.Pro was satisfied with the quality and pace of my work. So once they needed a Java developer again, they reached out to me.

Technologies

Java 8

Spring Boot

Consul

Spring Cloud Consul

Docker/Docker compose

Company "X", project "L": a server for a business hypothesis validation app

In winter 2021, Siberian.Pro started working on a new project for Company "X", a gambling provider. The client wanted the back-end system to be powered by the Java platform. Siberian.Pro reached out to me again.

At the time of me writing this text, Project "L" is still in the development stage. The project is to validate a business hypothesis regarding the efficiency of a new game translation mechanic. For that reason, Project "L" delegates most of its functionality to the main system.

Here are some interesting spotlights:

  1. The project is quite demanding performance-wise, which is why I’ve picked the reactive stack.
  2. I’m using Kotlin Coroutines to make working with the reactive stack as simple and straightforward as with the synchronized one.
  3. Because of the app’s nature, I have to be constantly looking to balance between the system’s response time and data consistency.
  4. Automated testing is set up (rus) in such a way that the client has only seen 3 (three) bugs and 1 (one) regressions over four months, with 11K slocs and two major changes in requirements understanding.
Technologies

Kotlin

Spring Web Flux/R2DBC

Spring Rest Doc/Openapi

Ktor client

Testcontainers

Kotest

Wiremock

PostgreSQL

Docker/Docker compose

Github Actions;


Trading Club

A system to protect & license a cryptocurrency trading algorithm

Trading Club has developed a unique Python-powered algorithm for crypto exchange trading. In winter 2019, they reached out to me to have 3 things done. I was to:

  1. protect the algorithm itself from reverse-engineering;
  2. develop a licensing system for accessing the algorithm; and
  3. develop a GUI for controlling the algorithm.

To protect the algorithm from reverse-engineering, I decided to compile the script to native code via Cython. Native code per se is a tough nut to crack in terms of reverse-engineering. Things get much harder if we’re talking native code generated from a code snippet written in a high-level dynamic language.

For licensing, I developed a license server and added a license check into the algorithm.

Finally, I developed a GUI with QT. To keep the user from bothering with installing a Python interpreter, I packed the app with pyinstaller.

For now, this is my only commercial project written with Python.

Technologies

Python/Cython

QT/PySide2

pyinstaller

Flask

Docker/Docker compose

Data Transfer server

Once they were done with the app, Trading Club switched to developing a mobile app that could keep track of their bot’s work. In summer 2020, Trading Club decided they want to arrange all the disparate parts of the app into a solid whole. That’s why they reached out to me again.

The project consisted of developing a server that would provide three APIs:

  1. an API for the bot to share the data;
  2. an API for the mobile app to receive the data; and
  3. an API for the bot to sent push notifications in the mobile app.
Technologies

Kotlin

Spring Boot

Ebean

PostgreSQL

Testcontainers

Kotest

Docker/Docker compose

APNS


GameOn Production

Android and iOS app prototypes for validating a business hypothesis

In spring 2019, GameOn Production asked me to develop a prototype of an Android app that was to validate a business hypothesis.

The app’s idea was to store specific user data and use it to autofill similar web forms on various websites.

It was clear from the start that writing and maintaining form-filling scripts powered by WebView’s standard API would cost too much time and money. For that reason, I developed a DSL based on Kotlin Coroutines that allowed to describe the process of filling out a form in a declarative style.

While working on the scripts, I had to come up with a way to fill forms out automatically on websites powered by modern web frameworks. Naturally, I had to do extensive research into the frameworks' structure to do so.

Initially, the client wanted an Android app only. In a bunch of months of development, though, he decided he needs an iOS one as well. I knew that the scripts were the project’s most expensive part. For that reason, I decided that instead of porting these to iOS, I’d better take a risk and put both the DSL and the scripts into a multiplatform module.

I had encountered some issues while connecting the KMM module to the iOS app. Still, I’m quite sure this decision saved my client around 50% to 100% of the project’s final cost.

Technologies

Kotlin

Kotlin Multiplatform Mobile

Kotlin Coroutines

JavaScript

WebView

React

Angular

Vue.js

Android

iOS


Brooma Service

Reingeneering the reporting module

One of Brooma’s products is Threads, an end-to-end solution for handling customer communication via chats and messengers. In spring 2019, Brooma wanted Threads' report module reingeneered. They didn’t have enough hands in-house for that back then, which is why they reached out to me.

Originally, the module had about 20 caching-related issues that were hard to diagnose. It would consume too much memory when running, which was causing the main app to fail.

To solve the problem, I:

  • reverse-engineered the original module;
  • spawned it off into a separate process; and
  • set going a data streamline from the database server to the client browser via two apps powered by Spring Web MVC.

Setting up the data streamline and interacting with JDBC directly allowed to resolve the original module’s problems, significantly improve on its performance, and fix all the memory-related issues.

The project took much longer than expected. Nonetheless, we continued to work together on an outstaff basis and kept it going for one year and a half.

Reengineering the routing module

In summer 2020, I promptly reengineered the routing module for Brooma. The routing module is the system’s 'heart' acting as an intermediary between the clients and the operators. If it’s down, the entire system is as well.

Over the development years, the module had accumulated much technical debt, which eventually led to some serious performance issues. This has taken its toll on one of Brooma’s strategic clients who noticed a significant drop in their service quality.

In two weeks, I brought the first reengineered version of this module in full accordance with the ergonomic approach’s principles. This allowed for quite impressive 300x growth in the system’s throughput with no functional losses. Naturally, this in turn helped Brooma to retain their strategic client.

Technologies

Java 8

Spring Boot

PostgreSQL

Oracle

JDBC

SQL

Employment experience

Company and position: Siberian.Pro, Director of Java functional team
Time of employment: May 2021 – current position

I’m creating and organizing from scratch work of Java platform department. I perform the role of an techlead/architect on internal and external projects.


Company and position: Excelsior, Engineer and Project Manager
Time of employment: June 2013 - June 2017

  • Lidar Mapping Suite - a system for processing the data received by lidars.
  • SendItBetter (not available anymore) - a tool for sending large files via email.
  • Restler - a library for HTTP-API clients generation based on a Java class description.
  • ExcelsiorJet (not available anymore) - certified JVM implementation and AOT Java compiler.


Company and position: Playtox, Engineer
Time of employment: September 2012 – May 2013
I was developing a platform for mobile MMO games.


Company and position: Alexey Sukhorukov’s Hiring Agency, Java Expert
Time of employment: June 2010 – August 2013
I was evaluating job candidates' Java skill level.


Company and position: Alavar.ru/HD Soft (since November 2009), Engineer
Time of employment: October 2008 – September 2012
I was developing a Java platform and applications for US digital cable boxes.


Company and position: Innovative Technologies, Engineer
Time of employment: March 2008 – October 2008
I was developing a city guidance portal called Gorod-Gid ("City guide").


Company and position: Novosibirsk State University, Higher College of Informatics, Lecturer and Thesis Advisor
Time of employment: February 2007 – July 2016
I was a lecturer for 'Translators,' a base project.


Company and position: KB Inform, engineer
Time of employment: January 2006 – March 2008
I was working on an automated system for the commercial account of electric power.


Company and position: TrendSW, Junior Engineer
Time of employment: May 2005 – October 2005
I was working on a SaaS project for US estate agents.


Open Source projects

  1. qbit - embedded distributed DMBS powered by Kotlin Multiplatform.
  2. Q5 - Android app for personal finance management.
  3. Yandex Music • Nuvola Apps Runtime - a script for Yandex Music support in Nuvola Player;
  4. Jeb-k - command-line tool for incremental backups with a Tower of Hanoi-based rotation schema.
  5. Maroz - bare-metal Hello World program powered by Assembler and Rust.
  6. Kakos - an OS loader powered by Assembler and C.
  7. QuickDialer - Android Home screen speed dialing widget for favorite and recent phone numbers.
  8. DistributedRobocode - a system to run distributed Robocode for local Tomcat version evaluation.
  9. Tomcat - Robcode, a bot that won 1st place out of around a thousand back in 2011.