Привет, Хабр. Я из тех людей, у кого аллергия на словосочетание "искусственный интеллект" в маркетинге. Обычно за этим скрывается пара if-else и API OpenAI, прикрученное синей изолентой.
Недавно наткнулся на пост ребят, которые пилят карьерного бота Аврора. Обещали, что он сам ищет вакансии, сам пишет письма и вообще молодец.
Я решил, что это отличный повод поразвлечься: зайти в бету, положить им базу нагрузкой и написать разгромный баг-репорт.
Спойлер: базу я им действительно чуть не положил (и помог починить), но в процессе тестирования бот унизил мое резюме, переписал его и устроил меня на собес туда, куда я сам боялся подаваться.
Ниже - история про технические костыли, asyncio и то, как бездушный скрипт продает инженера лучше, чем сам инженер.
Фаза 1. "У вас тут архитектура протекает"
Я постучался к фаундерам как волонтер-тестер. Доступ дали.
Первое, что я сделал - запустил скрипт, эмулирующий 50 одновременных нажати�� кнопки "Генерировать письмо".
Бот умер.
Точнее, он завис. Интерфейс перестал отвечать, потому что (сюрприз!) вызов LLM был в основном потоке.
Я не удержался и влез в код (благо, дали доступ к репо для дебага).
Там была классика:
Python
# Синхронный ад
response = requests.post(HH_API_URL, ...)
Пока один юзер ждал ответа от хедхантера, остальные ждали чуда.
Мы с ребятами потратили выходные, переписывая это на нормальную очередь.
Взяли PostgreSQL. Почему не Redis? Потому что не хотелось тащить лишнюю зависимость в прод.
Использовали SELECT ... FOR UPDATE SKIP LOCKED.
Это позволило запускать воркеры параллельно. Один генерит текст, другой пушит в API, третий анализирует резюме. Бот ожил.
Фаза 2. "Ты пишешь код, а не продаешь"
Когда техническая часть заработала, мне нужно было прогнать "боевой" тест.
Я загрузил свое реальное резюме. Я считал его идеальным. 6 лет опыта, Python, Go, куча проектов.
Бот (функция AI-анализа) выдал вердикт: 4 из 10.
Я оскорбился. В смысле 4? Я сеньор!
Чат-бот выдал фидбек (цитирую по памяти):
"У тебя все написано в процессе. 'Писал код', 'Поддерживал API'. Это уровень джуна. Бизнесу плевать, что ты делал. Им важно, что ты СДЕЛАЛ. Где цифры? Где метрики? Где деньги?"
И предложил свой вариант описания опыта.
Было (мое):
Оптимизация запросов к базе данных.
Разработка микросервисов на FastAPI.
Стало (от Авроры):
Ускорил выполнение агрегирующих запросов в 10 раз (с 5с до 500мс) за счет денормализации БД.
Спроектировал архитектуру микросервисов, выдерживающую 10k RPS.
Я скривился. Звучало как пафосный булшит из LinkedIn. Но ради чистоты эксперимента я нажал "Обновить резюме на hh.ru".
Фаза 3. "Я бы туда не кликнул"
Дальше я включил "Автопилот". Это режим, когда бот сам ищет вакансии по фильтрам и сам рассылает отклики.
Я выставил фильтр по зарплате (выше рынка) и забыл на сутки. Пусть воркеры трудятся, проверяют стабильность коннекта с базой.
Вечером смотрю логи.
Бот отправил 20 откликов.
Смотрю список компаний. И вижу ЕЁ.
Известный финтех (топ-3 в РФ). Красный логотип.
Я туда никогда не откликался. У меня был синдром самозванца: "Там алгоритмические секции, там лютый отбор, я не потяну". Я их тупо свайпал.
А боту плевать на мои комплексы. У него есть задача: if salary >= X and stack == 'python': apply().
Он отправил им то самое "пафосное" сопроводительное письмо, которое сгенерировал на основе переписанного резюме.
Итог: Цифры не врут
Через 2 дня мне пришел инвайт на техническое интервью в этот финтех.
HR написала: "Нас зацепило, как четко вы описали результаты оптимизации в прошлом проекте".
Я сидел и думал: это не я описал. Это скрипт на Python, который дергает API Gemini, который я вчера дебажил.
Мои выводы как инженера:
-
Технические:
Асинхронность в ботах - это не фича, это база. Если ваш бот делает HTTP-запросы синхронно - выкиньте его.
Postgres как очередь задач (
SKIP LOCKED) - это топ решение для проектов средней нагрузки. Просто, надежно, ACID.
-
Карьерные:
Мы, инженеры, не умеем себя продавать. Мы думаем, что код говорит сам за себя. Нет. HR-ы не читают код, они читают ключевые слова и цифры.
Автоматизация рулит. Пока я тратил часы на прокрастинацию и выбор "достойной" вакансии, скрипт просто долбил API и получил конверсию выше, чем я за месяц ручного поиска.
Короче, баги мы пофиксили. Проект работает стабильно.
А я теперь готовлюсь к алгоритмической секции.
Если хотите потестить бота (и посмотреть, как мы реализовали меню на колбэках, чтобы оно не моргало) - ссылка ниже. Но предупреждаю: он может отправить ваше резюме туда, куда вы сами стеснялись.
P.S. Если кто-то знает, как быстро подтянуть Dynamic Programming за 3 дня - напишите в комменты, очень надо.