README.md
Александр Степанченко / продуктовый инженер
README
Резюме нормально показывает, где я работал, какие технологии трогал и как назывались должности. Для этого оно и нужно.
Но как человек работает, по резюме почти не понять. Там нет места для таких вещей. Почему я могу прицепиться к кнопке назад в браузере. Почему медленный CI меня раздражает не меньше, чем баг в интерфейсе. Почему я считаю техдолг именно долгом, а не красивым словом из инженерных обсуждений.
Эта страница как раз про это.
Тут собраны вещи, которые обычно не помещаются ни в резюме, ни в профили соцсетей, ни в стандартные поля "о себе". По формату это ближе к README человека, с которым предстоит работать.
Я продуктовый инженер. Мне можно отдать сложную и пока мутную задачу, где смешались продукт, дизайн, backend, frontend, интеграции, старый код и организационный туман. Я разберусь, соберу рабочий план, доведу до релиза и постараюсь не оставить после себя минное поле.
Обо мне
Я полезен там, где задача уже дорогая, но ещё плохо сформулирована.
Так бывает часто, все вроде примерно понимают, что надо сделать, но стоит начать копать, и там сразу требования, дизайн, legacy, интеграции, странные ограничения, старые решения, которые никто не хочет трогать, и ещё что-нибудь из серии "а это мы потом объясним".
Мне с таким нормально, я не жду идеального ТЗ, просто вникаю, задаю вопросы, смотрю на продукт целиком и постепенно вытаскиваю из хаоса структуру, которую уже можно превратить в код.
Рабочий хаос меня не напрягает, часто именно в таком беспорядке рождаются по-настоящему хорошие решения, а бюрократия убивает творчество.
Тем не менее кто-то должен вытащить из этого хаоса непротиворечивую структуру и перевести её в код. Я хорошо вижу системы и повторяющиеся паттерны там, где другие видят просто "бардак", и моя роль здесь не наводить "порядок" во всей компании, но адаптировать разработку под реалии.
Быстрый старт
ИИ резко снизил порог входа, cейчас похожий сервис может за пару недель собрать компания конкурент или один человек с подпиской на Claude Code.
Просто "сделать" больше недостаточно, посредственно сделать теперь могут все.
Я делаю ставку на качество как конкурентное преимущество. Продукт должен быстрее открываться, понятнее вести себя при ошибках, нормально работать на телефоне, не ломать привычные сценарии и не раздражать в первые минуты.
Почему это стало заметнее
Раньше средний продукт мог выехать на почти пустом рынке. Сейчас мы завалены новыми сервисами и их будет только больше, иногда очень много, и если ваш продукт ощущается так же сыро, как очередная AI-сборка на коленке вряд ли у него получится получить долю рынка.
Использование ИИ
Я активно использую ИИ, просто не отношусь к нему как к магии.
ИИ хорошо ускоряет работу, когда им управляет человек, который понимает продукт и код. Я веду агентов как дополнительную команду, ставлю задачи, проверяю результат, заставляю переделывать слабые места и смотрю, чтобы код оставался человеческим.
Без такого контроля скорость быстро превращается в техдолг. Это довольно скучная мысль, но она постоянно подтверждается на практике.
Для меня ИИ скорее усилитель. До автопилота ему ещё далеко.
Как я держу это под контролем
Когда работы много, а рук не хватает, ИИ действительно меняет масштаб. Один сильный инженер может закрывать куски, для которых раньше понадобилась бы команда. Ответственность при этом никуда не исчезает, она всё равно остаётся на инженере.
Код после генерации становится кодом проекта. Его потом читать, чинить, развивать, объяснять новому человеку. Если завтра конкретный AI-инструмент подорожает, пропадёт или начнёт отвечать хуже, проект не должен развалиться от этого.
Компромиссы
Я часто нахожу инженерные приёмы/лайфхаки, которые экономят бюджет и сроки без потери функциональности.
Где-то задачу можно чуть иначе поставить. Где-то взять готовую часть вместо новой разработки. Где-то сделать маленькую утилиту вместо системы, которую потом ещё поддерживать. А бывает, что фичу лучше вообще не делать, потому что она тянет месяц работы и почти ничего не даёт пользователю.
Это такое инженерное читерство в хорошем смысле.
Писать код мало. Нужно понимать цену решения.
Где обычно прячется экономия
Красивую дату в календаре можно получить тупым срезанием углов. Толку от этого мало, если потом команда ещё полгода расплачивается за спешку. Гораздо полезнее понять, где продукт может быть проще без потери смысла.
Бывает и обратная история. Слишком дешёвое решение лучше остановить сразу, потому что через пару релизов оно станет дороже нормальной реализации.
Архитектура
Код продукта задаёт цену будущих изменений.
Я отношусь к техдолгу буквально как к долгу у себя в будущем. Сегодня взял время взаймы, потом вернёшь с процентами. Иногда так можно, иногда даже нужно, но хорошо бы понимать, сколько процентов набежит.
Я смотрю на цену ошибки. Что сломается. Кто будет чинить. Сколько будет стоить переделка. Насколько больно будет подключить нового человека.
Часть хорошей инженерной работы выглядит скучно, потому что плохого просто не случилось.
Это не выглядит как подвиг, ну и хорошо.
К коду у меня прагматичное отношение. Красивая архитектура нужна, если она помогает продукту жить дольше и спокойнее. Иногда правильная абстракция экономит месяцы, а иногда она связывает части системы, которым лучше оставаться отдельными.
Главное, чтобы решение отвечало за свою цену.
Что обычно видно заранее
Сервис не положили случайным скриптом, потому что у API есть лимиты. Данные не потерялись, потому что есть бэкапы. Пользователь не вылетел из сценария после кнопки назад. Новая уязвимость не превратилась в пожар. Все просто продолжают работать.
Маленький костыль иногда чинит реальный баг быстрее, чем большой ремонт. Дублирование иногда безопаснее общей функции, которая потом тащит за собой половину проекта.
Обзор
Продукт должен быть собран целиком.
Пользователь не разбирает, где закончился backend и начался frontend. Он не думает "ну, метаданные не настроили, зато бизнес-логика хорошая". Он просто открывает сервис и чувствует, нормальная это вещь или собрана кое-как.
Мне помогает опыт собственных проектов. Когда сам проходишь путь от идеи до запуска, поддержки и маркетинга, начинаешь смотреть не на отдельный тикет, а на весь цикл.
Я такие вещи замечаю.
Проверяю обычные сценарии руками. Открываю сервис с телефона, возвращаюсь назад, обновляю страницу, смотрю ошибки, пустые состояния, первую загрузку. Это быстро показывает, насколько продукт на самом деле доделан.
Что часто выпадает между ролями
В продукте есть слой вещей, которые часто оказываются ничьими. Фронтендер ждёт дизайнера, дизайнер не думает про favicon, продакт не проверил кнопку назад, backend-разработчик считает, что это вообще не его часть.
А потом в проде иконка фреймворка, странное поведение на телефоне, пустые состояния, сломанные deep links и релизный инструмент, которым все пользуются через раздражение.
Внутренние инструменты тоже продукт. Если разработчики, операторы или сотрудники компании каждый день пользуются плохой админкой, медленным CI или кривым релизным процессом, это тоже техдолг. Просто внешний пользователь видит его позже, через скорость и качество продукта.
Дизайн
Я начинал как дизайнер, а потом много лет превращал чужие макеты в живые продукты. Эта насмотренность до сих пор помогает.
Макет в Figma часто неподвижный, в приложении же есть загрузка, ошибка, пустое состояние, переход, микровзаимодействия, анимации, звуки, вибрации и т.д.
Не всегда есть ресурс нарисовать каждое состояние заранее. Тогда я доделываю по месту, это уже вошло в привычку. Сначала делаю понятное состояние кнопки, добавляю небольшую анимацию, проверяю, чтобы не лагало, спрашиваю дизайнера, если надо.
Мне близка идея MLP. Даже минимальная версия продукта должна быть такой, чтобы ей хотелось пользоваться, иначе это просто техническая проверка гипотезы, а не нормальный первый контакт с рынком.
Из этого часто и складывается ощущение качества.
Где это проявляется
Когда работал над конструктором сайтов flexbe, я специально делал себе страницы через наш же конструктор, хотя кодом было бы быстрее. Зато сразу видно, где продукт мешает, где заставляет думать лишнее, где сценарий вроде есть, но пользоваться им неприятно.
Мне нравится, когда интерфейс ощущается живым. Без цирка. Просто чтобы он отвечал на действия человека, не тупил и не выглядел как картинка, которую кое-как натянули на код.
Команда
Если у вас уже есть команда, я могу усиливать её через обычную работу.
Большой процесс вокруг этого не обязателен. Часто хватает ревью, совместной работы, нормального разбора решений, помощи с постановкой задач и неформального общения в перерывах.
Мои компетенции частично перенимаются и становятся общими.
Как это расходится по команде
С ИИ похожая история. Команду можно научить использовать агентов как управляемый инструмент разработки, чтобы они не превращались в генератор случайного кода.
В итоге качество меньше зависит от одного человека, команда увереннее принимает решения, сырой код реже доходит до продакшна, работать становится спокойнее.