Alexander Stepanchenko

README.md

Alexander Stepanchenko / Product Engineer

ABOUT

How I work

If the task looks like a tangled knot of product requirements, design, integrations and legacy code, I can take it as a whole: figure it out, suggest the best path, get it to a working release and leave the product easier to evolve.

I am useful where the task is already expensive, but still poorly shaped. When you need to write code and also understand what should actually appear in the product, where the risks are and how not to set yourself up for a big rewrite in a few months.

Working chaos does not bother me. Good solutions are often born in that mess: strange inputs, conflicting wishes, ideas that are still half-formed. Too much process too early can kill the useful part before it becomes clear.

Still, someone has to pull a consistent structure out of that chaos and translate it into code. I see systems and repeating patterns where others may only see a mess. My role is not to make the whole company tidy. My role is to adapt engineering to reality.

Quick Start

When Everyone Can Move Fast

AI has sharply lowered the entry barrier. Now a similar service can be assembled in a couple of weeks by a competing company or by one person with a Claude Code subscription. Rougher, simpler, but close enough for users to start comparing.

My job here is to help your product win on quality. It should open faster, behave more clearly when something goes wrong and not fall apart on a phone. Stable work becomes a competitive advantage.

Why this matters more now

An average product used to survive on an almost empty market. There is less empty space now: there will be many similar services. Sometimes a lot of them.

Launching is no longer enough. Users quickly feel whether a product was assembled carefully or thrown together in a hurry. Especially in the first minutes, when they open it, wait for loading, make a mistake and try to go back.

AI Usage

Controlled Acceleration

AI accelerates a project when it is managed by someone who understands both the product and the code. I lead AI agents as an additional team and do not take their output on faith. Without that control, speed quickly turns into tech debt. Generated code still has to stay understandable for people.

When there is a lot of work and not enough hands, this changes the scale: with AI, one strong engineer can cover tasks that used to need a team. But the engineer is still responsible for the result, not the tool.

How I keep AI under control

AI without control quickly turns a project into code nobody understands. And code produced with an agent still becomes project code: people will have to read it, fix it and evolve it.

So I deeply inspect the generated result and bring it into a normal state. If it is shaky, the agent gets a follow-up task. If a particular AI tool disappears tomorrow or starts answering worse, the project still has to live.

Tradeoffs

Saving Without Sloppiness

I often find engineering shortcuts that save budget and time without losing quality. Slightly reshape the task, assemble the solution a little differently, use an existing part instead of building a new one.

Good engineering cheating, in a useful sense. The user gets the needed feature, and the team does not spend a month on it.

Where the savings usually hide

Cutting corners for a nice calendar date is easy. It is more useful to understand where the product can be simpler without losing the point.

Sometimes it is better to use an existing service. Sometimes a small utility is enough. And sometimes a feature should not be built at all if it drags a month of development behind it and gives almost nothing to the user.

The opposite also happens: a too-cheap solution should be stopped early, because in a couple of releases it will cost more than a normal implementation.

Architecture

Cost of Change

Product code sets the cost of future changes. I treat tech debt as borrowing from your future self: you take time now, then repay it with interest. If the architecture makes product changes painful, it is already costing you money.

I look at the cost of an error: what will break, who will fix it and how expensive the rewrite will be. Sometimes you need to ship quickly. Sometimes you first need to lower the risk.

Part of good engineering work looks boring: the bad thing simply did not happen. A random script did not take the service down, data was not lost, the user did not fall out of a flow after pressing Back. Everyone keeps working. That is a normal result.

How I choose a technical compromise

I am pragmatic about code. Good architecture matters when it helps the product live longer and more calmly. Sometimes the right abstraction saves months. Sometimes it ties together parts of the system that should stay separate.

Sometimes a small hack fixes a real bug faster than a big repair. Sometimes duplication is safer than a shared function that later drags half the project with it. That does not make chaos normal. The solution just has to answer for its price.

Overview

Blind Spots

A product has to be assembled as a whole. Separate "almost ready" pieces still meet in one user experience. The user does not care where backend ends and frontend begins. They just use the service.

Experience launching my own products helps a lot here. When you have gone from idea to launch and marketing yourself, you stop seeing only a separate task. You start seeing the whole cycle.

I notice blind spots between roles and bring them to a normal state before they turn into bugs, support tickets and lost trust.

Which blind spots I close

Products have a layer of things that often belong to no one. A frontend developer may wait for the designer, a designer may not think about favicon and metadata, a product manager may not check the Back button, a backend developer may consider it outside their area.

So I test normal flows by hand. I open the service on a phone, go back, refresh the page, look at errors and empty states. These things quickly show how finished the product really is.

Internal tools are the same. If developers, operators or company employees use a service, they are users too. A bad admin panel, slow CI or awkward release tool irritates people every day. This is also tech debt: external users do not see it directly, but it comes back as product speed.

Design

First Impressions Happen Once

When someone opens a product for the first time, the level is visible immediately. They either calmly understand what is happening, or start stumbling over small things in the first seconds.

I notice these rough edges during development and fix them before they become familiar bugs.

What kind of rough edges?

I started as a designer and then spent years turning other people's mockups into live products. That eye still helps me in engineering. A Figma mockup is a still frame. In the real product there are things the mockup often forgets: errors, loading, vibration, sound, animation, transitions, hints and so on.

There is not always time to design every state in detail. Then I finish it in place. I make a button state clear or add a small animation. I check with the designer. Together, this creates a feeling of quality and an almost emotional attachment to the product.

Whenever possible, I use what I build myself. When I worked on the flexbe website builder, I deliberately made landing pages for myself through the builder, even though writing them in code would have been much faster. That immediately shows where the product gets in the way, where it makes you think too much, where the flow exists but feels awkward.

Team

Helping People Level Up

If you already have a development team, I share experience through helping colleagues, working together and informal discussion. People start using my approaches, and the overall quality gradually rises.

What this gives you

The team makes decisions more confidently. Raw code reaches production less often. The result depends less on one person. That is more stable and calmer for everyone.