2.1Самопрезентация и рассказ о проекте
Соберёшь короткий рассказ, который показывает текущую роль, личный вклад и следующий шаг. Научишься подкреплять достижения измеримым результатом и оставлять интервьюеру точные темы для вопросов.
Что на самом деле спрашивают словами «расскажите о себе»
Вопрос не про биографию. Он проверяет, умеешь ли ты упаковывать информацию, и заодно даёт интервьюеру крючки для следующих вопросов. Формально ты отвечаешь на «кто ты», фактически на три вопроса сразу:
- Что ты умеешь прямо сейчас? Роль, стек, домен, масштаб.
- Как ты к этому пришёл? Короткая траектория, из которой виден рост, а не список работодателей.
- Зачем ты здесь? Чего не хватает на текущем месте и почему именно их вакансия это закрывает.
Отсюда формула: настоящее → путь → чего хочу дальше. Именно в этом порядке, а не хронологически с института. Хронология проигрывает всему: самое важное (что ты умеешь сейчас) оказывается в конце, когда внимание уже уплыло.
Записать текст, прочитать вслух с секундомером, урезать до 2:00–2:30 и проговорить три раза. Заучивать не дословно, а опорные точки: пять-шесть фраз, между которыми ты импровизируешь. Зазубренный текст слышно, и звучит он хуже живого рассказа по каркасу. Тайминг проверяй честно: то, что «на глаз минута», обычно четыре.
Рассказ о проекте: четыре слоя
Дальше почти всегда идёт «расскажите подробнее про ваш проект». Здесь чаще всего ошибаются одинаково: начинают со стека, «у нас Go, Postgres, Kafka, k8s». Интервьюер так и не понял, что делает система, и вынужден догадываться. Рассказывать надо сверху вниз: бизнес-смысл, потом архитектура, потом твоя граница ответственности, потом самое сложное.
| Слой | Что говоришь | Пример формулировки (CRM) |
|---|---|---|
| 1. Бизнес-смысл | Что система делает, для кого, чем зарабатывает или что экономит | «CRM для отделов продаж: ведёт лиды и сделки, подтягивает звонки из телефонии, считает воронку. Пользователи - менеджеры продаж и руководители» |
| 2. Архитектура | Крупными мазками: сколько сервисов, чем общаются, где состояние | «Go-бэкенд из нескольких сервисов, синхронно gRPC между собой и REST наружу, события в Kafka, состояние в Postgres, кэш и распределённые локи в Redis» |
| 3. Твоя зона | Что делал ты, а не команда: конкретные куски, конкретные задачи | «Я вёл домен сделок и интеграции с телефонией, плюс наблюдаемость: метрики, дашборды, алерты» |
| 4. Самое сложное | Одно решение с альтернативами и обоснованием - это глубина | «Самым сложным была идемпотентность обработки звонков: провайдер шлёт вебхуки с ретраями» |
Цифры: что готовить и что делать, если их нет
Цифра в рассказе работает как доказательство. «Ускорил ручку» не весит ничего. А вот «p99 списка сделок
был 1,8 с, стал 210 мс, смотрел в Grafana по гистограмме http_request_duration_seconds»
уже можно проверить, и по такой фразе сразу видно, что человек в метрики действительно смотрел.
Перцентиль спрашивают вместо среднего потому, что среднее прячет медленный хвост, а жалуются пользователи как раз на хвост.
| Что готовить | Зачем спрашивают | Где взять |
|---|---|---|
| RPS: средний и в пике | Понять реальный масштаб и калибровать твои слова про «высокие нагрузки» | sum(rate(http_requests_total[5m])) в Grafana даёт текущий RPS, для среднего за сутки окно [24h]; или посчитать от бизнес-объёма |
| Латентность: p50/p95/p99 ключевых ручек | Проверить, знаешь ли ты разницу между средним и хвостом | Гистограмма запросов, histogram_quantile(0.99, ...) |
| Объём данных: размер БД, число строк в топ-3 таблицах, суточный прирост | Оценить, сталкивался ли ты с реальными проблемами масштаба | pg_database_size, pg_total_relation_size, оценка по reltuples |
| Размер команды и своя роль в ней | Понять, сколько на тебе было автономии и коммуникации | Просто посчитать: разработчики, QA, аналитик, тимлид, продакт |
| Темп поставки: релизов в неделю, время от PR до прода | Оценить зрелость процессов, к которым ты привык | История прогонов CI и теги релизов |
| Надёжность: доступность, число инцидентов, есть ли SLO | Понять, был ли у тебя прод в настоящем смысле слова | Алерты, постмортемы, страница статуса |
- Порядок вместо точности: «сотни RPS», «десятки гигабайт», «единицы миллионов строк».
- Явная оговорка. Хватает одного слова, «по памяти», «оценочно», «на глаз из дашборда», и цифра из вранья превращается в честную оценку.
- Вывод из бизнес-объёма: «примерно 12 тысяч сделок в сутки, на каждую за её жизнь сотни запросов - отсюда и порядок».
- Никогда не округляй вверх «чтобы солиднее». Опытный интервьюер спросит «а как эта нагрузка распределена по суткам?» или «а какой инстанс это держал?», и всё станет видно.
Сложное не значит объёмное. «Мы переписали монолит на микросервисы» говорит о масштабе, а не о сложности, и спросить оттуда лично у тебя почти нечего. Сложное начинается там, где было несколько разумных вариантов и пришлось выбирать. Идемпотентность вебхуков, порядок обработки событий, миграция без даунтайма, консистентность между сервисами: из такого получается глубокий разговор. Заранее выбери одну тему и подготовь альтернативы, которые ты отверг, и почему. Именно это отличает мидла от джуна, который «сделал как получилось».
Вопросы
4Каркас ответа
- Кто я сейчас (~30 с): имя, роль, сколько лет пишу на Go, что за продукт и для кого. Стек в одну строку, без перечисления всего, что видел.
- Проект и достижения (~60 с): что за система, за что отвечал я, два-три результата с цифрами в формате «было X - стало Y».
- Чего хочу дальше (~30 с): чего не хватает сейчас и почему именно эта вакансия это закрывает. Заодно здесь же снимается будущий вопрос «почему уходишь».
- Передача хода: «с чего вам удобнее начать - с архитектуры или с конкретных задач?» Это выглядит уверенно и экономит время обоим.
Образец под профиль «Go + CRM»
«Меня зовут Герман, я backend-разработчик, три года пишу на Go. Последние два года - в команде CRM: это система для отделов продаж, там ведутся лиды и сделки, подтягиваются звонки из телефонии и считается воронка. Бэкенд на Go: несколько сервисов, внутри gRPC, наружу REST, события через Kafka, данные в Postgres, кэш и локи в Redis, всё в Kubernetes.
Моя зона - домен сделок и интеграции с внешними системами, плюс наблюдаемость. Из того, чем доволен: во-первых, разобрался с дублями по звонкам - провайдер шлёт вебхуки с ретраями, и у нас в базе плодились дубликаты; сделал идемпотентную обработку по ключу события, дубли ушли в ноль. Во-вторых, список сделок отдавал p99 около 1,8 секунды - после разбора планов, составного индекса и убирания N+1 стало примерно 210 миллисекунд. В-третьих, завёл нормальные метрики и дашборды в Prometheus с Grafana и перевёл раскатку на канареечную: до этого релиз был событием, сейчас катим несколько раз в неделю.
Дальше хочу больше отвечать за архитектурные решения, а не только за свои сервисы, и поработать с нагрузкой на порядок выше - у вас, судя по вакансии, как раз это есть. С чего удобнее начать: с архитектуры проекта или с конкретных задач?»
Чего говорить нельзя
- Хронологию с института. После «закончил вуз, потом полгода на PHP, потом...» самое ценное окажется в конце.
- Список технологий без контекста. За «знаю Kafka, gRPC, Redis, k8s, Postgres» сразу следует «а что вы с Kafka делали?», и если ответа нет, доверие падает ко всему списку.
- Личное. Семья, город, хобби, «люблю учиться новому». Либо спросят отдельно, либо это шум.
- Негатив про текущую работу. Даже одна фраза «там всё плохо с процессами» разворачивает разговор не туда.
- Восемь минут. Если тебя перебивают, рассказ был слишком длинным, и это уже минус.
Чем добить
Подстроить последний блок под конкретную вакансию: если в описании выделены высокие нагрузки, делай акцент на латентности и метриках; если интеграции, на идемпотентности и внешних API; если много легаси, на миграциях без даунтайма. Один и тот же рассказ с разными акцентами выглядит как «человек прочитал вакансию», а это редкость.
Каркас ответа
- Что делает система и для кого. Две фразы. Без этого всё дальнейшее висит в воздухе.
- Как устроена. Сколько сервисов, кто с кем как общается (синхронно / через события), где живёт состояние, как деплоится.
- Где здесь я. Прямым текстом: «я отвечал за такие-то сервисы и такие-то задачи». Если что-то делал не ты, так и скажи, это не минус.
- Как это работает в динамике. Проведи один запрос через всю систему: от кнопки в интерфейсе до записи в БД и события в Kafka. Так проще всего показать, что ты понимаешь систему целиком.
- Масштаб цифрами. RPS, объём данных, размер команды, темп релизов.
«CRM для отделов продаж: менеджеры ведут в ней лиды и сделки, руководители смотрят воронку и отчёты. Бэкенд разбит на несколько Go-сервисов: сервис сделок и лидов - это ядро, отдельно сервис интеграций с телефонией и почтой, отдельно сервис отчётов, который читает с реплики. Между собой синхронно ходим по gRPC, наружу отдаём REST через gateway, который закрывает аутентификацию и лимиты. Всё, что не должно блокировать пользователя, уезжает событием в Kafka: уведомления, пересчёт воронки, вебхуки во внешние системы. Состояние - Postgres, миграции через goose в отдельном шаге пайплайна; в Redis кэш справочников и распределённые локи. Крутится в Kubernetes, раскатка канареечная.
Моя зона - сервис сделок и сервис интеграций целиком: схема данных, API, воркеры, миграции. Плюс наблюдаемость на всей команде: метрики, дашборды и алерты в Prometheus с Grafana я поднимал сам. Отчётами занимался коллега, фронт - отдельная команда.
Если провести один запрос: менеджер меняет статус сделки → gateway проверяет токен → сервис сделок валидирует переход по машине состояний, пишет в Postgres в транзакции вместе с записью в служебную таблицу outbox → отдельный воркер вычитывает её и публикует событие в Kafka → подписчики шлют уведомление и пересчитывают воронку. Outbox взяли именно потому, что "записать в БД и отправить в Kafka" без него не атомарно.»
Чего говорить нельзя
- Начинать со стека. «У нас Go, Postgres, Kafka» перечисляет зависимости, а не рассказывает о проекте.
- Сплошное «мы». Если во всём ответе ни разу не прозвучало «я сделал», интервьюер не поймёт, что делал именно ты, и решит, что ничего.
- Присваивать чужое. Достаточно одного уточняющего вопроса вглубь, чтобы это вскрылось. Гораздо сильнее звучит «это делал коллега, я знаю верхнеуровнево».
- Раскрывать то, что нельзя. Внутренние формулы, персональные данные, коммерческие цифры компании. Говори про архитектуру и порядки величин, а не про конкретику под NDA, и скажи об этом прямо: это плюс, а не минус.
Нарисуй схему. Очно на доске, по видео попроси разрешения пошарить экран и набросать в любой рисовалке, или просто проговори «представьте три прямоугольника». Кандидат, который раскладывает рассказ по картинке, выглядит как человек, который так же будет объяснять и коллегам. Схему набросай заранее, один раз, и держи её в голове.
Каркас ответа
- Проблема в одной фразе, и почему она не решалась «просто».
- Варианты: два-три, каждый с плюсом и минусом. Это ядро ответа.
- Выбор и критерий: почему именно этот, по какому признаку сравнивал.
- Как проверил, что не ошибся: метрики, нагрузочный тест, канареечная раскатка.
- Что бы сделал иначе сейчас. Эта фраза почти всегда добавляет к оценке.
«Самым сложным была идемпотентность обработки звонков. Провайдер телефонии шлёт вебхук о завершённом звонке и ретраит его, если мы не ответили 200 за две секунды. А мы иногда отвечали медленно - и в CRM появлялись дубли звонков в карточке сделки, менеджеры на это жаловались.
Вариантов было три. Первый - дедупликация по содержимому: сравнивать номер, время
и длительность. Отмёл: провайдер округлял длительность по-разному в ретраях, и это дало бы
ложные срабатывания. Второй - очередь с exactly-once поверх Kafka. Отмёл как избыточное:
exactly-once там всё равно означает "at-least-once плюс дедупликация на приёмнике", то есть
ту же задачу, но с лишней инфраструктурой. Третий - то, на чём остановились: у провайдера
в вебхуке есть call_uuid, я сделал его натуральным ключом с уникальным индексом
и вставку через INSERT ... ON CONFLICT DO NOTHING в той же транзакции, что
и запись в outbox. Обработчик стал идемпотентным, повторный вебхук просто ничего не меняет
и возвращает 200.
Проверял так: сначала на стейдже прогнал повторную доставку руками, потом раскатил канареечно на 10% трафика и смотрел счётчик конфликтов вставки - он сразу стал ненулевым, то есть ретраи реально приходили и отсекались. Дубли в проде ушли в ноль.
Что бы сделал иначе: сразу завёл бы отдельную таблицу обработанных событий с TTL вместо уникального индекса прямо на бизнес-таблице. Сейчас этот индекс мешает, когда надо перезалить историю.»
Про «чем гордишься»
Это тот же вопрос, но с другого угла: тут ценится не героизм, а изменение, которое
пережило тебя. Хорошие варианты: «после инцидента завёл алерты, которыми команда
пользуется до сих пор», «перевёл раскатку на канареечную, и релиз перестал быть событием»,
«написал линтер-правило, которое ловит забытый context». Слабые варианты вроде
«сидел ночью и починил» или «сделал за выходные» говорят про выгорание, а не про инженерию.
Чего говорить нельзя
- «Самым сложным было переписать монолит на микросервисы». Если ты был одним из десяти, это про масштаб чужой работы.
- Решение без альтернатив. «Взял Kafka», а почему не RabbitMQ, не outbox с поллингом, не обычная транзакция? Если альтернатив нет, значит, выбора не было и решение принимал не ты.
- Гордиться количеством кода: «написал сервис на 20 тысяч строк». Никто не считает строки.
Обязательный минимум
- Нагрузка: RPS средний и в пике, во сколько раз пик выше среднего.
- Латентность: p50/p95/p99 двух-трёх главных ручек. Только не среднее, оно на собесе выдаёт человека, который метрики не читал.
- Данные: размер БД, число строк в самых крупных таблицах, суточный прирост, глубина хранения.
- Команда: сколько разработчиков, есть ли QA, аналитик, тимлид; сколько человек в твоей зоне.
- Темп: релизов в неделю, время от смерженного PR до прода, есть ли автотесты в пайплайне.
- Надёжность: целевая доступность, есть ли SLO, сколько инцидентов было за квартал, есть ли дежурства.
Где брать, если не помнишь
# Prometheus: RPS сейчас, окно пять минут, и пик за сутки
sum(rate(http_requests_total[5m]))
max_over_time(sum(rate(http_requests_total[5m]))[24h:5m])
# p99 по ручке
histogram_quantile(0.99, sum by (le) (rate(http_request_duration_seconds_bucket{route="/deals"}[5m])))
# доля успешных за месяц: фактический SLI доступности
sum(rate(http_requests_total{code!~"5.."}[30d])) / sum(rate(http_requests_total[30d]))
-- размер базы и топ таблиц по объёму
SELECT pg_size_pretty(pg_database_size(current_database()));
SELECT relname,
pg_size_pretty(pg_total_relation_size(c.oid)) AS total,
reltuples::bigint AS approx_rows
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE n.nspname = 'public' AND c.relkind = 'r'
ORDER BY pg_total_relation_size(c.oid) DESC
LIMIT 5;
Как называть цифру, если точной нет
«Точную цифру по памяти не назову, но порядок такой: в рабочие часы это сотни запросов в секунду на сервис сделок, ночью почти ноль - нагрузка сильно привязана к рабочему дню, пик раза в четыре выше суточного среднего. База была порядка двухсот гигабайт, самая крупная таблица - история изменений сделок, там единицы миллионов строк и рост порядка десятков тысяч записей в сутки. Если нужно точнее - могу посмотреть и написать после интервью.»
В этом ответе три приёма: назван порядок, объяснена форма нагрузки (привязка к рабочему дню показывает, что ты понимаешь систему, а не запомнил цифру) и предложено уточнить позже. Последним почти никогда не пользуются, но напряжение оно снимает.
Чего говорить нельзя
- «Высоконагруженный проект» без числа. Это слово ничего не значит: для кого-то это 500 RPS, для кого-то 500 000.
- Среднее время ответа вместо перцентилей. Сразу прилетит «а p99?», и если ответа нет, вопрос про метрики закрыт не в твою пользу.
- Округление вверх «для солидности». Один вопрос «а на скольких подах это крутилось?», и арифметика не сойдётся.
- Путать SLA, SLO и SLI. Это три ступени одной лестницы: измеряемая величина, внутренняя цель по ней и обещание клиенту в договоре, за нарушение которого платят. Мидл эту тройку различает.
Заведи одну заметку «цифры проекта» и держи её открытой на втором экране во время созвона. Это не читерство: интервьюер сам держит перед глазами свои заметки. Но выучи её настолько, чтобы не делать пауз: подглядывай, чтобы свериться, а не чтобы прочитать.
Что стоит запомнить
- Структура рассказа: настоящее, путь с результатами, куда хочешь двигаться.
- Проект описывается через продукт, архитектуру, свою зону ответственности и эффект.
- Цифра полезна, когда ясно, что именно измеряли и за какой период.
Частые ошибки
- Список технологий без примера своей работы не показывает уровень ответственности.
- Число без базы сравнения и способа измерения выглядит недоказанным.
Самопроверка
Сначала реши задачу самостоятельно, затем открой ответ и сравни ход рассуждений.
Применение
1. Собери вступление из фактов
Подготовь ответ на «расскажите о себе» длиной около 30-60 секунд. Факты: Go backend developer, 1.5 года; CRM для отдела продаж; отвечал за HTTP-интеграции с двумя внешними системами и метрики; сократил p95 одного отчёта с 1.8 с до 420 мс после разбора плана запроса; ищешь задачи с большей нагрузкой и ответственностью за сервис. Не добавляй неуказанные детали.
Ответ и разбор
«Я Go-разработчик, полтора года делаю backend CRM для отдела продаж. Отвечаю за HTTP-интеграции с двумя внешними системами и наблюдаемость. Недавно разобрал медленный отчёт: p95 снизился с 1.8 секунды до 420 миллисекунд. Сейчас ищу задачи с большей нагрузкой и ответственностью за production». Получится около 30 секунд вслух. Это завершённый короткий ответ; удлиняй его только деталями реального вклада, если интервьюер попросит.
Применение
2. Проверь доказательность метрики
Кандидат говорит: «ускорил сервис на 70%». Какие два уточнения нужны, чтобы фраза стала проверяемым результатом? Доступны данные: один отчёт, p95 до изменения 1.8 секунды, после - 420 миллисекунд.
Ответ и разбор
Сузь утверждение до конкретного сценария и метрики: «p95 отчёта снизился с 1.8 секунды до 420 миллисекунд». Уточни период и условия измерения, чтобы сравнение было сопоставимым. Это снижение примерно на 76.7% или ускорение примерно в 4.29 раза; «около 77%» передаёт результат точнее, чем округление до 70%.
Применение
3. Убери технологический список
Перепиши фразу для рассказа о проекте: «У нас Go, PostgreSQL, Redis, Kafka, Kubernetes, gRPC». Контекст: ты владелец обработки входящих заказов; при повторной доставке события нужно было не создать заказ дважды.
Ответ и разбор
Например: «Я отвечал за обработку входящих заказов. Для этого потока было важно, чтобы повторная доставка одного события не создавала заказ второй раз. В рассказе я сосредоточусь на этой задаче и на своём фактическом вкладе». В условии не указан способ решения, поэтому не приписывай себе конкретный механизм вроде idempotency key или хранения в PostgreSQL.
Применение
4. Выбери крючок для интервьюера
В описании опыта есть два пункта: «настраивал CI» и «разобрался, почему повторный deploy выпускал старый образ; после фикса pipeline проверял digest загруженного артефакта». Какой пункт оставить в двухминутном рассказе и какой следующий вопрос он подсказывает?
Ответ и разбор
Оставь второй: он называет проблему, личное расследование и конкретную проверку результата. Естественный следующий вопрос - как pipeline выбирал образ до фикса и где именно сравнивается digest. На него нужно отвечать только реальными деталями своего изменения; если их нет, безопаснее выбрать другой подтверждённый пример.