В свое время я выбрал не самую востребованную специальность.
И когда я слышал, что другим пишут надоедливые рекрутеры, я удивлялся и не верил.
Сейчас, спустя годы, и ко мне рекрутеры иногда сами выходят на связь (ничего себе). Но тогда, в начале, работу я не выбирал, а выцарапывал. В то время я довольно быстро закрыл глаза на качество откликов и включил количество.
Не знаю, повод ли это для гордости. Но опыт в узкой нише мне это точно дало и научило меня тому, о чем я хочу рассказать.
Давайте договоримся сразу — это ни в коем случае не реклама хедхантера. Монополисты не нуждаются в рекламе. Это простая история о человеке, который пришел неготовым на и без того больной и сломанный рынок труда. А поскольку хедхантер является неотъемлемой частью рынка труда в РФ — предельно несбалансированной и токсичной его частью, по которой ФАС и прокуратура плачет, но тем не менее, на данный момент, неотъемлемой — я не буду лживо делать вид, что «слона‑то я и не приметил», а просто расскажу, как я делал, что мог, с тем, что имел, там, где я был. Очень удивлюсь, если упоминание хедхантера ноунеймом как‑то повлияет на него — продвинет или наоборот приведет к потере рыночной позиции (но тихо надеюсь что повлияет и что альтернативные площадки, типа той же Хабр Карьеры, заберут рынок)
Плюс я не буду писать о работах, на которых работал. Вы и сами работали на работах, покруче и поэффективнее моего. Я буду писать о «межработах» — вот тут я спец.
Для начала вводные:
я деревенщина из малообеспеченной неполной семьи в умирающей провинции, не освоивший в юности ни социальных, ни практических навыков кроме физической работы в огороде
я сыночка‑корзиночка, воспитанный в атмосфере объектности («тебя должны взять, ты должен понравиться, начальники вот так любят, а вот так не любят»)
я отучился в провинциальном вузе на никому не нужную специальность переводчика, куда я пошел просто потому, что меня взяли на бюджетную форму обучения
ментально для меня закрыты типичные ветки развития персонажей из моей провинции (вахта, армия, ручной труд) — и они мне не милы, и я для них какой‑то странный (не наш человек)
я понятия не имел как жить эту жизнь, как работают социальные связи, как работает бизнес, что происходит в мире и как оседлать волну
я не разбирался в каких компаниях и с какими людьми я хочу работать и как это делать
В силу всего вышеперечисленного я стал человеком умственного труда (проще говоря, менеджеришкой) в провинции.
Примерным сыночкой‑корзиночкой я так и не стал, но и мужского воспитания не получил. И вот я, ни рыба, ни мясо — довольно рано взял на себя обязательства по содержанию своей семьи. При этом не зная как. По сути, я разогнавшись на полном ходу переделывал себя и ментально, и профессионально.
Поработав за 15–20к рублей в паре местных компаний (даже в местном отделении Роснефти — крупный корпорат, огого), я понял, что мне в провинции ловить нечего, а те, кого я обязался кормить — голодают, и я как мужчина не справляюсь со своими обязанностями.

Я поехал в ближайший большой город (Казань, в моем случае).
Я стал ходить ногами со стопкой распечатанных резюме по отделам кадров всего города — и быстро понял, что специальность переводчика моя была никому не нужна. Точнее, как посмотреть — она была нужна и местным крупным нефтяным компаниям, и в фарме, и в промышленности, и вообще кому угодно… за 20–25к рублей в месяц. Эдак любую специальность можно назвать востребованной — если приходить и говорить, что я готов работать почти бесплатно, возьмите меня. Но уже тогда я понимал, что кто по‑настоящему востребован — тому и платят соответствующе. Напомню: я снимаю жилье в городе‑миллионнике и содержу семью. Так что на работу по специальности за 25к я быстро перестал смотреть.
В общем, мы пришли к тому, что я хрен с горы, провинциал в большом городе, не имеющий ни имени, ни звания, с невнятным опытом работы, но голодный и энергичный. Я пошел добывать что могу.
Я очень рано открыл для себя такое понятие как оверэмлоймент (работа на нескольких работах сразу) — задолго до того, как это слово появилось… Хм, а я ведь оверэмплоил даже на оффлайн‑работах — как тебе такое, Илон Мсак? Представь, на одной работе у тебя дневная пятидневка, на второй ночные смены 2/2 — и вот ты уходишь в понедельник утром на работу № 1, вечером идешь на работу № 2, утром на № 1, вечером на № 2, утром на № 1, вечером домой. Что интересно, много я не зарабатывал — 40к с дневной работы, 30к с ночной. Смешно вспоминать. Я так жил около года — сейчас сам не понимаю как я на мог на такое согласиться и как выдерживал.
Таким образом исторически получилось, что рано стал часто менять работы — я и сам не был завидным кандидатом, и компании я выбирал не по любви.
Моя «любимая» платформа
И тут темп повествования у нас резко меняется, и мы переходим к техническим аспектам поиска работы.
Не знаю, были ли вы когда‑либо лишены свободы (я был — служил в армии год) — но если были, то поймете, что когда у тебя нет выбора, ты углубляешься в то, что есть. Так и тут — кому скажи, что вот мол, площадка хедхантер, давай изучать все её механики и углубляться, давай читать вакансии и изучать поведение работодателей, особенности рекрутерского процесса, редкие технические состояния площадки и прочее — никто не согласится. А я согласился, потому что другого выбора со своей специальностью не видел. Сейчас я понимаю, что он был — но тогда я не видел.
Для меня хедхантер — это пласт жизни, это все оттенки эмоций, это уже часть меня, а я часть его. Кто‑то изучает эту платформу со стороны, а я живу в ней много лет. Не по любви… Ну да ладно.

Эпоха первая: всё ручками
Начинал я с того, что откликался на вакансии руками. В первое время я открывал выдачу хедхантера и на всех вакансиях нажимал кнопку «Откликнуться». Это было годы назад и многих современных функций вроде тестов и опросников при отклике тогда не было. Не помню точные результаты из тех времен, помню только, что они были неудовлетворительными, поэтому я быстро понял, что важно не только количество, но и качество.
Я стал качать качество откликов. Я честно пытался писать каждое сопроводительное от души, сам, вычитывал вакансии, писал в стиле текста вакансии, подмечал те или иные моменты, даже иногда дополнительно гуглил что‑то о компании и подмечал на основе этого синергию того, что они делают и того, что я привнесу как новый сотрудник в тексте сопроводительного. Это изредка даже результаты какие‑то давало — но очень медленно. Когда ты, без преувеличения, на каждое сопроводительное тратишь час‑полтора — очень обескураживает видеть игноры и отказы в 95% случаев.
О, эти игноры. Самая большая проблема и самое мерзкое поведение со стороны рекрутеров. Ну да ладно, идем дальше.

Эпоха вторая: шаблоны
Со временем я пришел к идее шаблонов сопроводительных писем.
У меня был текстовый файлик с шаблоном письма, куда я ручками вставлял название должности и название компании. Типа такого:
«Я всю жизнь мечтал, с детства грезил что буду работать на должности X в команде Y. Мы вместе такие горы свернем, вы не представляете. Возьмите меня, ну пожалуйста»
Тексты можно написать любые в любом стиле и любого содержания, но технически идея проста — вставляешь нужные слова вместо X и Y — и готово.
Ну и процесс отклика выглядит так — открываешь каждую ссылку на вакансию, вставляешь в свой шаблон нужные слова, при необходимости поправляешь сопроводительное письмо если есть тесты на внимательность (если вы дочитали до этого места, то начните сопроводительное письмо с фразы «готов трудиться бесплатно»), далее отправляешь и переходишь к следующей вакансии. Эту работу можно выполнять несколько часов подряд, но уже через пару дней она начинает выжигать энтузиазм.
Каждый отклик сам по себе прост, проблема лишь в их количестве — волей‑неволей ищешь пути к дальнейшей оптимизации.
Эпоха третья: EXCEL И CONCATENATE
Первым серьезным улучшением стала таблица.
В ней лежали вакансии, названия компаний, должности и заготовки сопроводительных писем. Формулой CONCATENATE я склеивал постоянные части текста с переменными:
=CONCATENATE( "Здравствуйте! Меня заинтересовала позиция ", A2, " в компании ", B2, ". Мой опыт может быть полезен, потому что..." )
Это уже давало заметное ускорение. Не нужно было каждый раз искать, где заменить название компании и должности.
Однако Excel автоматизировал только подготовку текста. Вакансии все еще приходилось открывать, проверять и отправлять вручную.
Главным исполнительным механизмом все еще оставался я сам.
Эпоха четвёртая: LINK GRABBER И автокликер
Однажды, из чувства ностальгии листая старые цитаты на башорге, я наткнулся на цитату, где чувак хвастался тем, как при помощи автокликера автоматизировал какие‑то процессы в бухгалтерии и что бухгалтерши были рады и очень благодарны. Я не знал, что такое автокликер, но подсознательно почувствовал, что это то, что мне надо в моих повторяющихся операциях с вакансиями.
В то же время я открыл для себя расширение Link Grabber — уже не помню как, просто наткнулся где‑то.
И так родилось мое новое поколение автоматизации.

Процесс не сразу был выстроен идеально, сколько‑нибудь рабочим он стал в таком виде:
Link Grabber собирал все ссылки на вакансии из поисковой выдачи и клал все в табличку — эта часть делалась руками
Автокликер брал ссылку на вакансию, открывал эту ссылку в браузере, дожидался прогрузки, копировал весь текст вакансии, вставлял его в документ Microsoft Word
В документе был заготовлен макрос, который вычищал все кроме названия вакансии и названия компании — автокликер копировал их и относил в соответствующие колонки в Excel
В Excel из этих кусочков текста при помощи уже описанной ранее формулы CONCATENATE это склеивалось в готовое сопроводительное письмо
Автокликер копировал это письмо и шел на страницу вакансии нажимать кнопку отклика, вставлял сопроводительное — и был таков
Цикл повторяется
Это уже походило на автоматизированную линию. Но линия была очень тупой.
Автокликер не понимал страницу. Он знал, что через две секунды нужно нажать в определенную точку экрана. Если сайт загрузился медленнее, появился баннер, открылась другая форма или сдвинулся интерфейс, инструмент продолжал честно выполнять сценарий — только уже не тот.
Он не различал:
обычную вакансию;
уже отправленный отклик;
форму с дополнительными вопросами;
капчу;
ошибку авторизации;
недоступную вакансию;
успешную отправку;
случайно открытую страницу другого сайта или даже окно другой программы.
Это была механическая рука без глаз, памяти и тормозов.
Знали бы вы, скольких нервов мне всё это стоило, как я просыпался ночью от ежесекундных пиков Windows, когда он кликал не туда, какие неожиданные менюшки и функции он активировал, когда интерфейс сбивался — о многих я даже не догадывался.
Процесс шлифовался и становился все более и более стабильным, и надежным по мере того, как я учился нюансам поведения платформы.
Кому будет интересно знание, что список вакансий нельзя парсить с начала страницы, а нужно промотать ее до конца чтобы все прогрузилось — и только потом парсить? Кому будет интересно что для прогрузки title вакансии достаточно 3000 миллисекунд, а для прогрузки текста вакансии — не менее 5000 миллисекунд? Кому будет интересно что при помощи регулярных выражений и экзотических формул можно вычленять вакансии с тестами на внимание в отдельный список чтобы потом откликнуться на них вручную? Кому будет интересно что title вакансии удобнее копировать из Яндекс Браузера, а текст вакансии — из Firefox? Кому будет интересно что при малом таймауте между вакансиями капча появляется раз в 700 вакансий, а при достаточно большом — не появляется вообще и можно молотить 24/7? Конечно же это будет интересно мне — кому ж еще. Тьфу.
Эпоха пятая: LLM
Знаете почему в Германии в свое время появилась лучшая промышленность, а в России лучший финтех? Потому что не было старого наследия — не тащили груз прошлого, а строили с нуля.
Так и я — сколько лет прошло, а востребованным специалистом я не стал, моя зарплата в пару тысяч долларов казалась мне смешной на фоне коллег с их 5–10к долларов. При этом заменить меня было легко и дешево.
А поскольку у меня нет подтвержденного опыта успешного и востребованного специалиста — мне не за что цепляться, у меня не было груза прошлых побед и успехов, и я легко принимал новое.
Поэтому я стал одним из самых ранних и активных профессиональных пользователей ИИ, с 2022 года.
Я начал с GPT-3, потом ChatGPT, потом в моей жизни была большая эпоха Bard (он был бесплатным и безлимитным, самое то для моих целей). Потом Claude и всё, что мы знаем сегодня, MCP, агенты, agentic loops — я уже не мог остановиться, я пересел на новый кайф, я уже не хедхантер, я аишник, так‑то.

Я все это применял в основном на работе, но и на межработе нашлось шикарное применение — оценка вакансий и написание сопроводительных писем.
Старый воркфлоу, который я описывал ранее, имел фундаментальный минус — отклики шли на все подряд. Да, я старался максимально точно выставить фильтры, настроить boolean поиск, все способы сделать поисковую выдачу релевантной. И когда в списке приглашений ты видишь странные вакансии и компании, куда в здравом уме ты бы не откликнулся — появляется фрустрация, ты думал что вот круто, новое собеседование, а вынужден под нелепым предлогом отказывать, мол извините, я уже принял другой оффер.
Второй фундаментальный минус — шаблонные сопроводительные письма. Я старался писать лучшие шаблоны (уже просто из любви к искусству), но мне не нравилась сама идея шаблонности. Я хотел кастомизированный подход и как‑то его добивался при помощи условий и разных формул в Excel чтобы собирались разные варианты писем — но для меня это был костыль.
И вот когда появился ИИ — обе моих боли были решены.
Я не сразу смог прийти к хорошему качеству анализов вакансий и сопроводительных писем, но со временем у меня сформировался хороший стек промптов и процессов для этого.
И да, я исторически пользовался веб‑версиями LLM, не API.
Двигателем всего процесса все еще оставался автокликер, но теперь в процессе появился reasoning и качество фильтрации и откликов взлетело.
Эпоха шестая: RPA, агентная архитектура, Harness
Автокликер оставался моей проблемой. Да, он брал на себя однотипные циклы — но сбивался когда события шли не по сценарию, плюс требовал ручных действий, иногда немалых, между большими циклическими участками работы.
Я начал писать простые браузерные расширения.
Вместо координат они работали со структурой страницы: находили элементы, читали текст, определяли состояние интерфейса и только после этого выполняли действие.
Постепенно отдельные утилиты начали соединяться:
одна читала вакансии;
другая заполняла формы;
третья поднимала резюме;
четвертая взаимодействовала с веб‑версией ИИ;
пятая следила за состоянием сессии;
шестая сохраняла результаты.
Со временем этот ансамбль превратился в один комбайн со своими кастомным сценариями работы на каждый случай. Как человек, который не расставался с хедхантером много лет, я буквально знаю каждый случай. Я уже говорил как я «люблю» хедхантер? Абьюзивные отношения мечты.
Кстати, если отследить мою историю с самого начала, то видно, что формат браузерного расширения сложился исторически, ведь вся эволюция моих процессов происходила внутри браузера. Но позже выяснилось, что это не просто наследие прототипов, а вполне осмысленный и жизнеспособный выбор в текущих реалиях.
Расширение уже находится в пользовательском контексте:
человек авторизован на сайте;
открыты настоящие страницы;
доступны те же формы и состояния, которые видит пользователь;
данные не покидают компьютер пользователя;
нет зависимости от сторонних API, не нужны серверная ферма браузеров и централизованное хранение сессий.
Занятно, что пока я делал свои поделки, мне ни разу не пришло в голову изучить — а делают ли такое другие. Не знаю почему, но я был уверен, что я один такой.
Лишь недавно я начал интересоваться этим вопросом, обнаружил несколько достойных ребят (AFK Offer, Quick Offer, Aurora, Sofi Assistant и еще парочка других). И с удивлением узнал, что у хедхантера есть API и что все автооткликалки пользовались им, пока 15 декабря 2025 года hh не закрыл свой API. Для всего этого маленького рынка это стало черным днем — под удар попали все, и далеко не многие восстановились (я перечислил только тех, кто работает на текущий момент). Что интересно, автоматизацию забрали только у соискателей, но не у работодателей.
Для архитектуры автооткликов осталось два реалистичных направления:
эмуляция клиентского приложения
работа с пользовательским веб‑интерфейсом с виртуалки или в пользовательской машины
Сам того не зная, я несколько лет шел по второму пути, который в итоге оказался одним из работоспособных на сегодняшний день.
При этом я не называю такую автоматизацию невидимой. Работа в обычном браузере пользователя убирает часть признаков централизованной серверной фермы, но программные действия в принципе могут отличаться от пользовательских. Например, веб‑платформа позволяет различать некоторые синтетические события через свойство isTrusted. Но свое дело такой подход делает.
Эпоха седьмая: я поднял голову и огляделся вокруг
Долгое время я относился к поиску работы как к задаче оптимизации резюме и рассылке предельно возможного количества откликов.
Нужно сделать текст яснее. Добавить правильные формулировки. Убрать воду. Подобрать ключевые слова. Переписать опыт так, чтобы его было легко читать.
А потом в моем близком кругу общения появился человек, который был Senior Android‑разработчиком — и тот день, когда я разговаривал с ним на тему поиска работы, был для меня шокирующим.
У меня был тщательно вылизанный профиль: аккуратный текст, понятная структура, достижения, хорошее описание опыта.
У него был полупустой профиль с фото поездки на природу вместо нормального фото.
Но его инбокс разрывался от сообщений рекрутеров. Мой — нет.
Тогда я понял, что дело не в резюме, а в рынке.
Я слишком долго был ослеплен HR‑ритуалами и оптимизацией процесса под них — и не видел, что рынок труда — это прежде всего рынок, где есть спрос и предложение.
Я понял что резюме не имеет ценности само по себе, это лишь описание моего рыночного предложения.
Можно великолепно описать то, что рынку почти не нужно. Можно посредственно описать востребованную компетенцию и все равно получать входящие предложения.
Это изменило направление моей дальнейшей работы
Я, конечно, не забросил те наработки, которые были на тот момент, но к ним добавился большой пласт рыночной аналитики.
Мне хотелось понять правила игры:
что сейчас требуется рынку;
какие роли ближе всего к моему опыту;
какие требования повторяются;
где я систематически подхожу, а где нет;
какие сигналы у меня отсутствуют;
что работодатели готовы покупать;
что стоит изменить в самом предложении, а не только в формулировках резюме.
Я долго думал, как это реализовать. А потом понял — ведь каждая отдельная вакансия и так является микроскопическим сигналом рынка. Собери их вместе — получишь полную картину. Причем, в отличие от отраслевых обзоров, эта аналитика будет персонально заточена под тебя.
Я пришел к идее, которую назвал Fit Capsule.
Не помню, говорил или нет, но в ходе воркфлоу моя поделка обрабатывает каждую вакансию через ИИ в три прохода — сначала смотрит хороша ли вакансия, потом делает стратегию отклика, потом пишет непосредственно текст сопроводительного письма.
Решение было на удивление изящным — в первом проходе я заменил проверку, подходит ли вакансия мне, на проверку, подходит ли она мне + подхожу ли я ей. А в конце ИИ выдает fit capsule — крошечная аналитическая записка по вакансии, где у меня и вакансии синхрон, а где несовпадения. А в конце сессии эти накопившиеся по каждой вакансии fit capsules обрабатываются скопом через тот же ИИ и мы получаем полную аналитику столкновения нашего рыночного предложения с запросом рынка.
Например, система может обнаружить:
кандидат называет себя специалистом определенного профиля, но рынок называет то же самое другим термином;
вакансии определенного сегмента регулярно требуют один и тот же недостающий навык;
заявленный грейд не совпадает со сложностью задач, под которые человек реально проходит;
зарплатное ожидание соответствует другому набору требований;
одно из резюме лучше конвертируется в интерес работодателей;
смежная роль значительно востребованнее исходной.
Это картина спроса, построенная вокруг реального профиля кандидата.
Для меня сейчас это новая концепция и я ее еще обкатываю — но даже такая картина полезнее совета «добавьте еще несколько ключевых слов» из гайдов в интернете.
Моя старая мечта была простой: собрать все вакансии рынка и понять, что, блин, они там хотят. А эта функция стала способом приблизиться к ней.
Что удивительно — с введением этой функции отликов стало значительно меньше, но каждый бил точно в цель — когда я и вакансия будто всю жизнь искали друг друга.
В конце я собрал весь этот комбайн воедино и назвал его NN в честь любви и ненависти моей жизни и как зеркальное отражение букв ИИ — глубокий смысл, так‑то. Поэтому далее свою поделку буду именно так и называть.
Как NN видит страницу
NN воздействует на сайты через DOM‑сигнатуры.
Под сигнатурой я понимаю не один жестко прописанный CSS‑селектор, а набор признаков, по которым можно определить:
на какой странице мы находимся;
какое состояние сейчас отображается;
какие действия допустимы;
чем можно подтвердить результат действия;
присутствует ли блокер.
Условно наблюдение может выглядеть так:
page_type: vacancy vacancy_available: true already_applied: false cover_letter_field: present native_questions: present captcha: false auth_required: false submit_button: enabled
Сам DOM‑адаптер ничего не решает. Он переводит веб‑страницу в структурированное наблюдение.
Затем это наблюдение получает runtime.
Центральный принцип таков что ИИ судит, а код действует
Если слепо верить во всесильность ИИ, то легко попасть в ловушку — дать модели браузер и попросить ее самостоятельно нажимать кнопки, пока задача не будет выполнена.
Мне такой подход не подходит. Я много работаю с LLM с 2022 года и успел достаточно раз увидеть, насколько убедительно модель может объяснить действие, которое вообще не следует совершать.
Поэтому архитектура NN разделена на две части.
ИИ выполняет задачи суждения:
понять смысл вакансии;
сопоставить ее с опытом кандидата;
найти сильные совпадения и пробелы;
выбрать стратегию отклика;
подготовить сопроводительное письмо;
интерпретировать вопросы работодателя.
Детерминированная система выполняет действия:
управляет очередью вакансий;
хранит состояние workflow;
соблюдает политики;
заполняет поля;
решает, разрешена ли отправка;
отслеживает повторы;
обрабатывает ошибки;
ищет подтверждение результата;
ставит процесс на паузу при капче или потере авторизации, или иной нештатной ситуации.
Примерный путь одной вакансии выглядит так:
Страница вакансии → DOM сканирование → Нормализованные данные → ИИ: оценка соответствия и Fit Capsule → Runtime: выбор маршрута (вакансия в мусор или откликаемся) → ИИ: стратегия отклика → ИИ: финальное письмо → Детерминированная проверка → Заполнение формы → Отправка → Поиск подтверждения → Фиксация результата
Если ИИ вернул битую структуру, противоречивое решение или пустое письмо, runtime не должен «догадаться, что имелось в виду» и продолжить. Задача либо повторяется, либо уходит человеку.
Если после нажатия кнопки сайт не показал подтверждение, NN не объявляет отклик успешным.
Если система не понимает текущее состояние страницы, правильное действие — остановиться, а не нажать наиболее похожую кнопку.
Что интересно, я сам того не зная, пришел к архитектуре, к которой пришли ребята из BitGN Arena — просто у меня ниша узкая.
RUNTIME сложнее автокликера
Главная техническая проблема в этом процессе — не нажать кнопку, а сохранить правду о процессе.
Представим ситуацию:
NN нажал «Откликнуться».
Chrome завершил service worker (у нас же MV3).
Через несколько секунд расширение проснулось.
На странице уже отображается успешный отклик.
Если система хранит состояние только в памяти, она может решить, что действие не было выполнено, и попробовать отправить отклик повторно.
Ненавидимый всеми MV3 специально заставляет думать об этом заранее. Chrome обычно завершает extension service worker после 30 секунд бездействия, а глобальные переменные при остановке теряются. Документация рекомендует сохранять важное состояние во внешнем хранилище и проектировать worker устойчивым к неожиданному завершению.
Поэтому NN не может быть длинным JavaScript‑скриптом вида:
await collectVacancies(); await analyzeVacancies(); await applyToEverything();
Каждый значимый переход должен переживать остановку процесса:
OBSERVED → ANALYSIS_REQUESTED → ANALYSIS_RECEIVED → RESPONSE_PLANNED → FORM_READY → SUBMIT_ATTEMPTED → SUBMIT_CONFIRMED
До внешнего действия состояние сохраняется. После внешнего действия оно сохраняется снова вместе с наблюдаемым результатом.
Важные операции проектируются идемпотентными: повторный запуск должен либо безопасно продолжить процесс, либо увидеть, что действие уже выполнено.
Нештатные ситуации
На реальном сайте идеальный happy path — только один из вариантов.
NN должен различать как минимум:
вакансия закрыта;
отклик уже отправлен;
работодатель требует сопроводительное;
сопроводительное не требуется;
появились дополнительные вопросы;
нужен ручной ответ;
возникла капча;
пользователь разлогинен;
страница загрузилась частично;
сайт показал ошибку;
после отправки возникло неоднозначное состояние;
вкладка закрылась;
ИИ‑провайдер перестал отвечать.
Поэтому runtime работает не как линейный макрос, а как событийная машина.
Условно:
captcha_detected → park_workflow → notify_user → wait_for_manual_resolution → observe_page_again → resume_from_checkpoint
Или:
unknown_native_question → do_not_invent_answer → create_manual_task → continue_with_other_vacancies
Один странный отклик не должен валить всю сессию.
Почему веб‑версия LLM, а не API
Это самое контринтуитивное архитектурное решение.
Стандартный совет очевиден: если строишь продукт, используй API. У него есть формальный интерфейс, предсказуемые ответы и понятная интеграция.
Но у моего продукта другая экономика. По многолетнему опыту я пришел к выводу, что ИИ хорош только если использовать его щедро:
давать достаточно контекста;
использовать сильную модель;
не экономить на reasoning;
делать несколько отдельных проходов;
не пытаться одним дешевым запросом одновременно оценить вакансию, выбрать резюме, сформировать стратегию и написать письмо.
Экономное внедрение ИИ часто хуже обычной детерминированной эвристики. Оно добавляет задержки, непредсказуемость и красивые объяснения посредственных решений.
Поэтому одна вакансия в NN может проходить несколько стадий:
анализ соответствия;
построение Fit Capsule;
выбор стратегии подачи;
подготовка финального письма;
при необходимости — проверка результата.
И тут мы сталкиваемся с экономикой процесса.
Если платить за каждый токен централизованно, разработчик очень быстро начинает оптимизировать не качество решения, а собственную себестоимость.
Мне хотелось избежать ситуации, в которой лендинг обещает «глубокий AI‑анализ», а внутри все построено на одном коротком промпте дешевой модели.
Поэтому NN использует веб‑сессию ИИ, доступную самому пользователю. Сейчас в качестве основного провайдера я использую DeepSeek.
Это позволяет делать более щедрые проходы без собственной per‑token инфраструктуры. Но бесплатного обеда, конечно, нет. Я меняю стабильность API на другие риски:
интерфейс провайдера может измениться;
сессия может закончиться;
может появиться капча;
могут измениться лимиты;
страницу тоже приходится распознавать через DOM;
одновременно разумно выполнять только один ИИ‑проход.
Не автопилот, а экзоскелет
В автоматизации реального мира мне не очень нравится образ полного автопилота.
Автопилот предполагает, что человек указывает точку назначения, убирает руки и больше не вмешивается. Но поиск работы содержит слишком много неоднозначных, репутационных и личных решений.
А еще я люблю играть в Сталкера и мне нравится эстетика экзоскелетов оттуда. Поэтому моим авторитетным и неподкупным решением концептуальная модель NN объявляется экзоскелетом. Экзоскелет не берет управление на себя, а дает человеку рулить — но 10х эффективнее.
Пользователь остается у руля, но работает на другом уровне. Он задает:
направление поиска;
границы допустимого;
целевые роли;
стратегию;
резюме;
интенсивность;
степень автономности.
NN берет на себя механическую массу работы:
собирает вакансии;
читает страницы;
проводит ИИ‑анализ;
формирует письма;
заполняет формы;
отправляет безопасные отклики;
выносит спорные случаи отдельно;
поддерживает состояние сессии.
Человек не обязан утверждать каждый клик. Но он также не обязан доверять черному ящику, который молча делает что‑то от его имени.
Тестовые задания
Со временем работодатели начали все чаще добавлять к отклику нативные вопросы и короткие анкеты. По наблюдениям одного коллеги, сейчас таких вакансий около 7%.
Игнорировать их нельзя: иначе автоматизация останавливается ровно там, где начинается небольшое дополнительное усилие.
Но здесь проходит важная граница.
NN может автоматически ответить на вопрос, если ответ достоверно следует из профиля, заданных предпочтений и ранее подтвержденных данных пользователя если таковые введены и сохранены в ходе сессии.
А если вопрос требует неизвестного факта, нового обещания или содержательного тестового задания, NN не должен выдумывать ответ. Случай передается человеку на ручную обработку.
Что выяснилось на практике
Некоторые функции невозможно придумать на продуктовой сессии. Они обнаруживаются только при ежедневном использовании.
Например, темная тема — если оставить компьютер работать ночью, яркая белая страница мешает, даже если минимизировать яркость экрана.
Или звуковые сигналы — пользователь не должен постоянно смотреть на панель расширения. Звук нужен, чтобы привлечь внимание человека только когда сессия закончилась — успехом или нештатной ситуацией (капча, разлогин, что‑то еще).
Еще один пример — аналитика здоровья сессии.
Тишина хуже явной ошибки. Пользователь должен понимать:
NN работает или остановился;
что он сейчас делает;
сколько вакансий обработано;
ждет ли ИИ;
потеряна ли авторизация;
требуется ли вмешательство.
Поэтому интерфейс должен показывать не поток технических логов, а состояние миссии.
Автоподнятие резюме появилось по той же причине. Это небольшая повторяющаяся операция, которая естественно ложится в фоновое обслуживание профиля и не требует ИИ.
Таких мелочей накопилось много. По отдельности они не звучат революционно. Вместе они определяют, ощущается ли продукт живым инструментом или лабораторным прототипом.
Что плохо
Зависимость от DOM — сайты меняют интерфейс. Кнопки переезжают, атрибуты исчезают, модальные окна перестраиваются, тексты статусов меняются. Когда это происходит, адаптер нужно патчить. Чтобы такая поддержка не превращалась в переписывание системы, DOM‑сигнатуры изолированы от runtime и основной бизнес‑логики. Патчинг предельно упрощен — но не централизован и не автоматизирован, нужно делать руками. Уже есть несколько сценариев как это исправить, прорабатываю.
Необходимость держать компьютер включенным — NN выполняется локально. Значит, должны работать сам компьютер, интернет, браузер, пользовательские сессии на сайтах. Для человека, который хочет полностью облачный сервис, это минус. Для другого пользователя это может быть приемлемым обменом: данные, сессии и история поиска не должны уходить на мой сервер, потому что сервера исполнения вообще нет. Это архитектурная особенность, но, возможно, можно сделать подобное на VPS — тоже уже думаю над решениями.
Каждый второй говорит что навайбкодит такое за день — проблема принципиально нерешаемая, я уже смирился.
Дальнейшие планы
Сейчас NN в основном решает задачу «собрать вакансии, понять, куда стоит идти, и помочь красиво туда постучаться». Но чем дольше я этим занимаюсь, тем сильнее думаю, что следующий большой кусок продукта вообще не про кнопку отклика.
Мне кажется, кандидаты на рынке труда не обеспечены нормальными инструментами вообще.
Почти вся экономика агрегаторов вакансий построена вокруг работодателя. Работодатель платит за размещение вакансий, доступ к базе резюме, продвижение, рекрутерские кабинеты, аналитику, фильтры, статусы, команды, процессы. Кандидат в этой модели почти всегда не клиент, а сырьевая база. Ну ладно, не сырьевая, а пользовательская сторона маркетплейса. Но ощущается часто именно как сырьевая.
Да, иногда у кандидатов тоже есть платные услуги (типа поднять резюме., получить консультацию и все такое). Но это минорная статья доходов за минорные услуги. Системного инструмента, который помогал бы человеку вести поиск работы как полноценный процесс, почти нет. Порочный круг: нет нормального инструментария для пользователей — мало оплат; мало оплат — не видим смысла инвестировать в нормальный инструментарий.
И из‑за этого поиск работы для кандидата выглядит как еще одна неоплачиваемая работа.
У рекрутеров есть кабинеты, воронки, статусы, фильтры, теги, заметки, шаблоны, дашборды, командная работа, напоминания и прочие радости цивилизации. У кандидата обычно есть список вакансий, кнопка «откликнуться», форма сопроводительного и какой‑нибудь самый базовый список откликов. Все.
То есть одна сторона рынка вооружена как отдел продаж, а другая идет в бой с палкой и авоськой.
А я хорошо знаю, что тут можно построить. Я видел CRM, пайплайны, трекеры активностей, автоматизацию аутрича, сегментацию лидов, воронки, follow‑up’ы, шаблоны, аналитику конверсий и все эти штуки, от которых нормальный человек зевает, а продажник понимает, что без них он просто носится по рынку как курица с отрубленной головой.
Кандидат по сути тоже продавец. Только товар у него особенный — его собственный труд, опыт, время, внимание, лояльность, способность решать чужие проблемы и не сойти с ума в процессе. И продает он это часто вхолодную: людям, которые его не знают, не ждут и в половине случаев вообще не отвечают.
Если кандидат продавец, то ему нужны инструменты продавца.
Вот это я и хочу сделать следующим большим направлением: CRM для кандидата.
По идее, оно будет объединять существующий стратегический обзор (аналитику рынка — описывал выше) с тактическими действиями:
какие сегменты рынка мне реально подходят;
где у меня выше шанс ответа;
какие компании уже видели мое резюме;
кому стоит написать еще раз;
где нужно написать вдогонку;
какие гипотезы поиска работают;
какие резюме и стратегии дают лучший результат;
какие контакты, вакансии и компании уже были в работе;
что я вообще сейчас делаю: ищу работу или просто в панике жму кнопки.
Вот это я и хочу сделать — рабочее место человека, который продает свой труд на рынке. С воронкой, задачами, заметками, статусами, сегментами, историей коммуникаций, аналитикой, напоминаниями, гипотезами, связью с резюме, откликами, сопроводительными письмами и Fit Capsules.
Безработный и так не в ресурсе. У него мало денег, мало спокойствия, мало ощущения контроля и обычно никакого желания играть в бодрого героя из мотивационных корпоративных постов.
Хорошая новость: такая CRM у меня уже сделана и работает в тестовых сборках. Пока борюсь с воркерами MV3. Надеюсь, скоро она станет частью NN.
Еще одно направление — новые ИИ‑провайдеры.
Сейчас основной провайдер — DeepSeek, но я хочу добавить Qwen, GigaChat, YandexGPT и другие варианты, которые доступны пользователям из РФ без VPN и лишнего шаманства.
И не надо смеяться, что это не фронтир.
Во‑первых, это достаточно хорошие модели.
Во‑вторых, я выбираю не модель для бенчмарка, а рабочий инструмент для реальных людей в реальных условиях. Если пользователю в России неудобно пользоваться фронтирной моделью, то какой смысл ее внедрять?
Во‑третьих, с хорошим harness даже более слабая модель может давать очень сильный результат. А harness у меня хороший. Тут я скромничать не буду, я уже достаточно лет кормил эти штуки вакансиями, резюме и сопроводительными письмами, чтобы понимать и отшлифовать почти все в этой узкоспециализированной задаче.
А потом, возможно, добавлю в процесс еще и поделку моего брата — https://github.com/basaltcode/neurogate/, для совсем щедрой ИИ‑обработки, когда хочется не экономить, а прямо развернуться душой.
Еще в планах поддержка других площадок. Первый кандидат очевиден — LinkedIn. Да, это отдельный мир — но я оптимистичен.
Если смотреть совсем далеко вперед, то…
Ну да ладно. Сначала бы с текущими делами разобраться.
Что в итоге получилось
После нескольких лет эволюции от Excel, автокликера и отдельных расширений у меня получился локальный RPA‑ИИ‑агент для поиска работы.
Помните того парня из начала — деревенщину, который не умел ни знакомиться, ни продавать себя, ни понимать, чего вообще хочет рынок? Он никуда не делся. Просто теперь вместо того, чтобы тратить час на одно сопроводительное письмо и получать 95% игноров, он тратит время на то, что реально может помочь людям.
Я пока не стал востребованным специалистом с зарплатой в 10к долларов. Но я стал человеком, который умеет строить системы, решающие проблему таких же, как я. А проблема наша проста — нас не видят и с нами не говорят. Вот и крутимся как можем. Я ненавижу то что происходит и не хочу чтобы такие инструменты как NN существовали. Но сейчас без этого никак.
Мое отношение к хедхантеру за эти годы не поменялось — это все еще предельно абьюзивные отношения. Просто теперь я хожу туда в экзоскелете.
А своим опытом поиска и смены работ я, кажется, все‑таки горжусь. Не потому что это красиво выглядит в резюме — оно там выглядит ужасно. А потому что каждая из них была ступенькой к тому, чтобы в итоге перестать бегать за работой и начать строить то, что бегает за ней вместо меня.
Кстати, у меня есть канал, куда я планирую выкладывать апдейты — там сейчас 8 подписчиков, станьте девятым))
