Vladimir Ivanov

Open to senior roles

VladimirIvanov

C++ · Backend · AI-assisted DevelopmentBatumi, Georgia

I solve complex problems and see projects through to completion.

10+years exp.
4years team lead
2years — my longest project
SCROLL

01 / What I do

What I do.

Tackle problems without ready-made solutions

I take work from the first unclear requirements to a working result. I dig into unfamiliar systems, investigate constraints and find a way forward.

Design system architecture

From data models and component boundaries to how the whole system works together. I account for product constraints and plan how to carry a solution through implementation and rollout.

Build with AI

I organize development with agents: defining tasks, preparing context and environments, working through solutions, reviewing changes and verifying results. I build feedback loops through tests and measurements.

See large projects through to release

I plan the stages, coordinate dependencies across teams, and help work through the difficult parts to get the release out.

Profile and optimize

I investigate latency, memory use and performance. I find causes, test hypotheses through experiments and make changes at the level that delivers the needed result.

Build CI and development infrastructure

I make builds, checks and deployments reproducible. I shorten feedback loops, automate repetitive work and create a smooth process for delivering changes.

Rework live products

I introduce changes to complex, long-lived codebases with care for stability and quality.

Find ways to simplify

I dig into the problem and the meaning of the data, revisit constraints and identify complexity that can be removed.

02 / Highlights

What I’m proud of.

Spectral::Technologies · Competition · August 2026PerformanceAI-assisted developmentInfrastructure

Low-Latency Data Transfer Challenge

The task was to distribute market data to multiple recipients with low latency. I split the work into several stages.

  • Designed orchestration for a repeatable AWS EC2 test environment using Terraform and SSM, with ENA PHC/chrony clock synchronization, to give the AI agent a reliable feedback loop for optimization iterations.
  • Configured the system to reduce jitter: CPU pinning and isolation, IRQ affinity, tickless cores, RCU callback offloading and hugepages.
  • Optimized a lock-free SPSC ring buffer in shared memory. Cache-line isolation and zero-copy handoff cut transfer latency by hundreds of nanoseconds.
  • Built the main transfer pipeline in C++23 with UDP unicast and DPDK kernel bypass. Designed a compact, self-contained, lossless wire format tailored to ENA LLQ/Wide LLQ. Added adaptive event batching within the MTU to balance latency and throughput, and applied further techniques to shave off fractions of a microsecond.
  • Ran controlled A/B comparisons of the final version and prepared a detailed report with latency distributions, saturation points and other performance graphs.

I am proud that in just a few days I built a solution in a completely new field for me that held its own against experienced competitors from the HFT industry.

  • C++
  • DPDK
  • UDP
  • Lock-free
  • Shared memory
  • Linux
  • perf
  • AWS
  • Terraform
  • 9th out of 100+ final submissions
  • Kernel bypass with DPDK
  • p50–p99.99 optimization across the latency distribution and its tail
2GISArchitectureDevelopmentMigrationTechnical leadership

A seamless world map

Separate city datasets were a limitation built into 2GIS from its beginnings. Users could only work within one city, even when two cities were close together, like Samara and Tolyatti. They could not plan a route from one to the other, search across the boundary or see the results on a shared map. Solving this required rethinking the architecture of the entire application and the data flows feeding it. Almost every core module needed changes, from the update system to the map, directory and beyond.

I was responsible for delivering this project across the whole department, not just my team. I broke down the work, identified cross-team dependencies, created and maintained the roadmap, ran regular coordination meetings with adjacent teams, designed the architecture and personally implemented several complex components.

The challenge was both to carry such a large transformation through more than two years of development to release and to do it inside a complex live product, with regular releases and a steady stream of other features often built without accounting for the new model.
It felt damn good to hear the head of mobile say that we pulled this off in large part thanks to me.

  • C++
  • Cross-team delivery
  • Data delivery
  • Refactoring
  • Planning
  • 2 years from the start of the transition to release
  • One world map in place of isolated regions
2GISArchitectureDevelopmentTechnical leadership

Hybrid: bringing 2GIS online

The second legacy of 2GIS’s origins as a PC product distributed on CDs was its offline-first model. In the 2020s, asking someone to download hundreds of megabytes after installation before they could start using the app was too high a barrier. Users left at the database-download screen, which also made a major advertising investment wasteful: much of the acquisition budget would be lost before people even tried the product.

Online mode had to be ready for an advertising campaign scheduled exactly a year ahead. This meant a major transformation of a live application: the map, directory, search and data-loading model had to support several modes at once, while regular releases and parallel feature development continued. I led the entire feature, working through difficult trade-offs between architectural constraints, product requirements, performance and deadlines.

Midway through development, I realized that the chosen approach to backend interaction was falling short of expectations. I designed a new one that combined fast responses with data consistency, which was critical to both the product and the core architecture.

A few months before the deadline, it became clear that we could not finish with the engineers we had. I escalated the need for additional engineers from adjacent teams and, once again, worked with the product manager to revise the scope of must-have features for the first release. Replanning, daily coordination, clear checkpoints and systematic stabilization helped us deliver the project.

We launched online mode on time, reducing the churn rate immediately after installation from 22.3% to 7.3%.

The main challenge was meeting a hard one-year deadline, with no room for a missed release. Many later acknowledged that a couple of years would have been a more realistic timeframe for changes of this scale.

  • C++
  • HTTP
  • Cross-team delivery
  • Refactoring
  • Planning
  • 22.3% → 7.3% churn rate after online mode launched
  • On deadline set a year in advance
2GISArchitectureDevelopmentMigration

Replacing the 3D engine

The new Zenith 3D engine had been in development for about seven years and was designed to bring fundamental changes to the product: a seamless map, online mode and flexible styling. It also introduced a completely new data storage format, incompatible with its predecessor, and a different API. These differences made integration exceptionally difficult, with no way to sidestep the underlying incompatibilities. I took on the task and worked through it step by step.

I started by building a prototype to explore the entire path: from calls to the engine API, through new core interfaces, to rendering frames in a Qt/QML application.

I then designed runtime and compile-time flags to isolate the new integration. This let us carry out a long development effort on the main branch without affecting production code before release.

Next, each component that used the engine needed either a parallel implementation against the new API, making full use of its capabilities, or a temporary adapter to speed up integration.

Migration was a separate challenge. We could not let users with old-format data suddenly lose the ability to use the app. I proposed selecting the engine at runtime based on the available data format and recreating the entire core session when switching between incompatible datasets. This let users move smoothly to the new version without disruption.

The hardest part was meeting the strict requirement for backward compatibility with existing data when the engine itself had not been designed to support it. I had to devise a mechanism outside the engine to detect the data format and switch engines, and teach all of the core code to work with both.

  • C++
  • Qt Quick
  • QML
  • OpenGL
  • Feature flags
  • Backward compatibility
  • Cross-team delivery
  • 2 engines with runtime switching
  • 7 years of development behind the new engine
2GISArchitecture

Ad storage and delivery system

The existing delivery mechanism had a long list of problems: memory spikes when loading and updating data, a large idle memory footprint, slow queries, and unreliable data storage. Fixing each problem separately would add up to a major effort, with no guarantee of success.

I proposed an alternative: redesign the entire system for a comparable amount of work. At its core, I put our compact proprietary read-only key-value database, which offered high compression and fast queries. To support an EAV data model with complex filtering, I added hash indexes — one for each distinct filter used in the product.

To support frequent updates without downloading the entire database, I designed a system of patch databases. The difference between two data snapshots becomes a small, separate database in the same format. For a given base database, only the patch needs to be downloaded again. The client merges query results on the fly to produce the target data view.

Before committing to a refactor of this scale, I used inexpensive prototypes to prove that the design met the performance and data-size targets. That resolved the core uncertainty before we invested in implementation.

The task was outside my area of responsibility, but I saw a way to make better use of the allocated resources. I proposed an alternative and proved its potential up front. The design combined a range of architectural techniques to deliver high performance and reliability while keeping the resulting system simple and straightforward.

  • C++
  • Databases
  • key-value
  • Data delivery
  • Data storage
  • Performance
  • Memory optimization
  • >2× faster data queries
  • No memory spikes during data updates
  • Low memory usage at idle
  • 3× smaller data footprint on the device
2GISInfrastructureDevelopmentTechnical leadership

Organizing CI at 2GIS

CI in the 2GIS core team started as a minimal set of Jenkins jobs configured by developers to check the master branch after merges. Under my leadership, it became a dedicated area of work with its own goals, priorities and roadmap, and the infrastructure developed into a mature solution.

  • Dramatically reduced build times by introducing compiler caches and optimizing Git operations.
  • Tracked down and fixed sporadic MSBuild failures that no one had managed to resolve.
  • Built the tooling and organized the move to mandatory PR checks with automated merging of coordinated changes across multiple repositories.
  • Set up test coverage reports.
  • Championed Infrastructure as Code within the team. Migrated Jenkins from a Hyper-V VM to OpenStack, defined its configuration in Heat Templates and Ansible, and set up daily backups with burp from LVM snapshots.
  • Hired an engineer to help and gradually handed over ownership of CI.

I am proud that the tools built by me and the engineer I managed enabled fast, reliable and convenient code delivery for developers every day.

  • Jenkins
  • Python
  • Ansible
  • OpenStack
  • Heat
  • ccache
  • clcache
  • Git
  • Code coverage
  • 1 h → 10–15 min the full build-and-check cycle
  • 35 → 7 min a Windows build with a warm compiler cache
  • One action — rebase, build and merge across all affected repositories
=nil; FoundationResearchDevelopment

Standalone CLI in TypeScript

Our TypeScript library was the main way users interacted with the cluster, so we decided to move the CLI from Go onto that library too. This would eliminate the need to maintain two implementations that occasionally behaved differently.

Go had set a high bar for the CLI executable’s portability, so we wanted the new version to ship as a single statically linked binary too.

That turned out to be difficult. Our build system used Nix, which could theoretically build packages from its catalog statically. In practice, it was far from straightforward. I worked through numerous build failures, adding patches and configuration flags along the way. Some problems were specific to macOS, including codesign inside Nix’s hermetic build environment.

The next hurdles appeared when packaging our oclif-based CLI as a SEA (Single Executable Application — Node.js’s experimental support for single-file distribution). I effectively had to implement a small virtual filesystem by patching require.

The statically built Node.js runtime could not load libraries dynamically, so I also had to replace some native dependencies with WASM implementations.

I also worked on startup performance to make the switch to the new version smooth for users.

This task meant getting to grips with an unfamiliar technology stack and building a solution on top of it, while overcoming a staggering number of obstacles along the way. That made it all the more rewarding to put my strengths to work and see it through to completion.

  • TypeScript
  • Node.js
  • Node SEA
  • esbuild
  • Nix
  • Static linking
  • codesign
  • 1 executable application, runtime and resources
  • 540 → 200 ms startup time of the new version

03 / Experience

Where I worked.

May 2024 — Jul 2025

=nil; Foundation

Backend Developer

Batumi, Georgia

Developed server components, developer tools and infrastructure for the nil blockchain.

Took tasks from architecture and prototypes through integration, deployment and verification on a real cluster.

Investigated critical failures and coordinated fixes, helping the team move from a monolithic prototype to a distributed deployment.

  • Go
  • Protobuf
  • libp2p
  • TypeScript
  • Node.js
  • Solidity
  • Nix
  • GitHub Actions
  • AWS
  • Terraform
  • Ansible

Oct 2022 — May 2024

2GIS

Senior C++ Developer

Batumi, Georgia

Worked on architecture, data, memory and performance in the 2GIS C++ core. Took on open-ended engineering problems. Built prototypes, tested architectural hypotheses using real data, coordinated with other teams and took integrations through release.

  • C++20
  • STL
  • Multithreading
  • Performance
  • Google Benchmark
  • gperftools
  • Tracy
  • heaptrack
  • Clang
  • GCC
  • MSVC

Aug 2018 — Sep 2022

2GIS

Mobile Application Core Team Lead

Novosibirsk, Russia

Led delivery of major features, owning architecture, planning and the team’s results. Combined implementation and technical guidance with cross-team coordination. Hired and developed engineers, including mentoring and helping them take ownership of individual areas.

  • C++17
  • Architecture
  • Technical Leadership
  • Team Management
  • Cross-team Collaboration
  • Planning
  • Hiring
  • Mentoring

Nov 2016 — Aug 2018

2GIS

C++ Developer

Novosibirsk, Russia

Owned development of major features spanning multiple teams. Designed architecture, established cross-team collaboration, broke down the work, built and maintained roadmaps, and implemented early prototypes to validate ideas.

  • C++14
  • Qt Quick
  • QML
  • OpenGL
  • Futures
  • SQLite
  • TDD
  • GCC
  • Clang
  • MSVC

Mar 2015 — Nov 2016

2GIS

CI Engineer

Novosibirsk, Russia

Built CI for a large cross-platform C++ project: made infrastructure reproducible, shortened the full build cycle and introduced required checks before merging. Set the direction, hired engineers and gradually handed over ownership of CI.

  • Jenkins
  • Python
  • Bash
  • Git
  • ccache
  • clcache
  • Ansible
  • OpenStack
  • Heat
  • Linux
  • Windows
  • macOS

Jul 2014 — Feb 2015

2GIS

C++ Developer

Novosibirsk, Russia

Established delivery of the new Qt/WebUI desktop application for Ubuntu and macOS.

Investigated a possible migration to QtWebEngine by studying the Qt and Chromium source code.

  • C++11
  • Qt
  • QtWebKit
  • QtWebEngine
  • Chromium
  • debuild
  • DMG
  • Jenkins

Sep 2013 — Jun 2014

2GIS

Junior C++ Developer

Novosibirsk, Russia

Maintained and extended the 2GIS desktop application, the company’s main revenue-generating product.

  • C++03
  • Desktop
  • Legacy Code
  • MSVC

Jan 2013 — Sep 2013

2GIS

Perl Developer

Novosibirsk, Russia

Automated internal processes in the Data Production Department and developed web crawlers to collect organization data from public sources.

  • Perl
  • Mojolicious
  • SQL

Mar 2011 — Dec 2012

WEB-Artel LLC

Frontend Developer

Novosibirsk, Russia

Developed web projects and led delivery of several new projects with fixed deadlines.

Improved the frontend development workflow by introducing BEM and SCSS.

  • XSLT
  • XHTML
  • CSS
  • SCSS
  • BEM
  • JavaScript
  • Perl
  • Oracle

More details in the PDF.

Roles, tasks and technologies.

Download CV as PDF

04 / Tasks

Engineering challenges.

Optimizing app startup

Investigated the map’s dependency graph and removed synchronous waits for several heavyweight services, while also warming up several others in advance. This made subsystem initialization up to twice as fast and allowed styles to be prepared 200–300 ms earlier.

Also found that the 3D engine repeatedly prepared the same data. Built a prototype that cached the results, making the map appear 20% faster on low-end devices. Handed the work over to the engine team, who took it through to release.

  • C++
  • Performance
  • Tracy
  • ×2 faster map subsystem initialization
  • 200–300 ms earlier style readiness
  • −2.5 s to first map display on slow devices

A C++ team in a few months

Helped build the mobile SDK team from scratch by organizing the hiring process. Reviewed CVs, sent outreach emails and conducted interviews. Wrote job postings and tailored messages to each candidate’s experience. Within a tight timeframe, we hired more than 10 strong C++ developers across several teams.

Wrote an automated crawler that expanded the candidate pool while reducing the workload for HR specialists.

Handed the hiring process over to colleagues: shared materials, worked through introductory meetings and technical interviews together, and gradually delegated the early stages.

  • Hiring
  • Technical interviews
  • Mentoring
  • Team development
  • 500+ CVs reviewed
  • Hundreds of emails sent
  • 100+ interviews conducted
  • 10+ engineers hired

Reducing virtual address space usage

The 2GIS mobile app mapped all data containers into memory at startup. This guaranteed high performance but consumed substantial virtual address space, which was often severely limited on mobile devices—iOS and 32-bit Android in particular. The requirement to update data on the fly threatened to make matters worse: at that point, we would face a peak twice as high.

Took a systematic approach, starting by making the problem measurable. Built a Google Benchmark harness and a gperftools-based memory manager that counted both ordinary allocations and file mappings. Once the baseline was explicit and reproducible, moved on to the optimization itself.

Reworked the VFS to map individual regions on demand instead of eagerly mapping an entire container. Data access almost always touched only a small subset of the files inside, so this radically reduced the footprint. The benchmark confirmed the improvement.

  • C++
  • mmap
  • Google Benchmark
  • gperftools
  • Memory optimization
  • <2 GiB virtual address space actually available on 32-bit Android
=nil; FoundationArchitectureBackend developmentInfrastructure

Distributed cluster and binary protocol

As we developed the nil blockchain, we gradually moved from a monolithic application to a distributed cluster. I was responsible for separating the RPC node from the validator.

To keep development and debugging simple, the application still needed to run in a single process. I abstracted the transport layer so the RPC component did not need to know whether it was calling the validator locally or over the network. We used libp2p for network transport; I built a Protobuf-based protocol on top. I made extensive use of Go generics and reflection to minimize boilerplate. The result was concise, expressive code.

Different node types and configurations needed to serve different sets of protocols: read-only, read-write and debugging calls. I refactored registration and split the interfaces into non-overlapping hierarchies, allowing them to be combined as needed without extra branching.

Alongside the code, I set up deployment of the new configuration in the test and production environments, learning how the infrastructure worked along the way.

  • Go
  • RPC
  • Protobuf
  • libp2p
  • Generics
  • Reflection
  • Ansible

Modern C++ and code quality

Initiated and drove the move to C++20 across all C++ development at the company. Made the necessary changes to accommodate limitations in Clang, GCC, MSVC and project dependencies. Coordinated changes between teams and promptly fixed issues as they emerged. Once the standard was enabled, actively promoted its features through my own code and reviews: concepts, the spaceship operator, consteval, template lambdas and more.

Introduced clang-format and initiated the formalization of unwritten code style conventions.

Investigated and fixed compilation-time problems. Used -ftime-trace and Templight++ to analyze heavy include dependencies and expensive template instantiations. Tuned the contents of the precompiled headers.

Promoted compile-time guarantees through the type system. In particular, implemented a library of non-null identifiers and zero-cost optional wrappers around them.

Introduced tools to make code more expressive and simpler, including a std::source_location polyfill and magic_enum.

  • C++20
  • Clang
  • GCC
  • MSVC
  • clang-format
  • Templight++
  • PCH
  • Type safety
  • C++20 across all C++ development at 2GIS

Reorganizing CI for macOS

Initially, nil’s macOS builds in GitHub CI followed a separate path that bypassed Nix, the project’s standard build system. This blocked the release of the new CLI, which had a nontrivial Nix build process. I set out to fix this and unify the Linux and macOS builds.

The Nix cache was a crucial part of the puzzle. Without it, every CLI build compiled Node.js from scratch, taking more than an hour and burning through runner limits. On the autoscaling Linux runners, the cache was configured when each node was provisioned. For the standard macOS runners, that setup had to become part of the build workflow.

Successful builds needed permission to write new artifacts to an AWS S3 bucket. Instead of putting a long-lived token in GitHub secrets, I followed the recommended approach: obtaining short-lived credentials through GitHub CI’s OIDC integration with AWS. I added an OIDC provider in Terraform and configured the build workflow to assume the corresponding role.

This resolved the inconsistency between platform builds and enabled the pipeline to produce the required artifacts.

  • Nix
  • GitHub Actions
  • AWS
  • OIDC
  • Amazon S3
  • Terraform
  • macOS
  • Linux

SDK integration and the navigator minimap

The mobile SDK project was developing new versions of components already used in the product: building floor plans, traffic, route visualization and more. Our team needed them for online mode, but I could also see a navigator redesign underway that would introduce a minimap. I knew the shared solution had to account for both projects. I brought the full picture together and designed changes that served both efforts without pulling them in conflicting directions.

The integration had to reconcile different object lifecycles in the core and SDK, avoid reference cycles and dangling references, and prevent initialization races. This called for carefully balanced transitional solutions that worked with the internals of both systems. The existing architecture also assumed that the main map was always present, and many components expected access to it during startup. Additional maps had to fit within those constraints. I designed a mechanism to manage them, agreed it with the platform teams, implemented the changes and built a minimap prototype in the C++ core and the Qt/QML-based Android app.

The minimap used SDK components to render the route line and progressively trim the travelled portion, display and track the location marker, and apply the new styles. It also had an important advantage for this kind of integration: it was a new component, so we could use SDK capabilities without replacing a complex existing implementation. SDK-based route rendering therefore reached the minimap long before the main navigator. We had found an isolated part of the product where the new code was already delivering value, and further development had to preserve that compatibility.

The transitional integration was fragile in places, but using it in the main branch changed who was responsible for compatibility: subsequent SDK changes now had to account for the working app. We no longer had to keep catching up on a separate branch.

  • C++
  • SDK
  • Qt Quick
  • QML
  • Android
  • Architecture

05 / Projects

Personal projects.

Own product · Oct 2025 — Feb 2026ProductArchitectureDevelopment

Wishmap

Built a vision-board service from an idea into a working product with real users and payments.

Owned the project end to end: made product decisions, designed the architecture, developed, tested and operated the service on Google Cloud.

  • Organized development with AI agents using SDD: task definition, thorough plan review, implementation, code review and refinement based on test results. Around 95% of the code was AI-generated. TDD and E2E tests with Playwright/pytest provided fast feedback.
  • Built a self-contained development and testing environment with local storage implementations and an emulator for successful and failed payments. The app and E2E tests work offline, including the complete purchase flow.
  • Python
  • JavaScript
  • Google Cloud
  • Docker
  • SDD
  • Cursor
  • Codex
  • Antigravity
  • Playwright
  • pytest
  • >95% of code AI-generated
  • #1 in Yandex search results for target queries

06 / Stack

The stack.

Languages

  • C++
  • Python
  • Bash
  • SQL
  • Go

Libraries & tools

  • STL
  • Qt
  • QML
  • Git
  • CMake
  • Protobuf
  • Google Benchmark
  • Tracy
  • perf
  • heaptrack
  • CLion
  • Codex

Skills

  • Debugging
  • Profiling
  • Optimization
  • Concurrency
  • Architecture
  • AI-assisted development
  • Code review
  • TDD

DevOps & CI/CD

  • GitHub CI
  • Jenkins
  • Ansible
  • Terraform
  • AWS
  • GCP
  • Yandex Cloud
  • OpenStack

Platforms

  • Linux
  • macOS
  • Windows
  • Android
  • iOS

Superpower

The stack doesn’t matter — getting the job done does.

I deliver

07 / Writing

Talks & writing.

Conference talks, an architecture interview and a technical deep dive. Talks are in Russian.

08 / Education

My education.

Novosibirsk State Technical University

Applied Mathematics and Computer Science

Novosibirsk, Russia

  • Master of Science· 2013
  • Bachelor of Science· 2011

09 / Contact

Let’s talk.

I’m looking for a team with a great product, ambitious goals and interesting engineering challenges.

Open to senior roles

Get in touch