Мне говорили, что с ИИ проект соберёт любой. Я два месяца проверял это на себе

В августе я начал делать сервис поиска работы. Не прототип и не демку для портфолио,а рабочий продукт с оплатой, живыми пользователями и поддержкой. Делаю я его один. Второй участник это Клод, с которым мы работаем два месяца.

Про вайб-кодинг обычно говорят одно и то же. Сейчас любой соберёт проект с ИИ, было бы желание. Показывают ролики, где за вечер пилится приложение. Говорят, что это развлечение и справится даже ребёнок.

Я решил проверить это на себе.

Что получилось

Сервис собирает вакансии из открытых источников, разбирает их на поля и убирает дубли. Считает, насколько человек подходит под вакансию, и объясняет оценку. Собирает досье на компанию и готовит вопросы к собеседованию. Ищет контакт того, кто ведёт найм, и если не нашёл, говорит об этом прямо, а не подставляет выдуманный адрес. Пишет письмо под конкретную вакансию и человека. Переписывает резюме под должность и проверяет, прочитает ли его программа отбора. Отправляет письма с почты человека и только после егоподтверждения. Дальше сам замечает ответ, а если ответа нет, то включается сериянапоминаний, которую к слову можно и отключить.

Плюс та сторона, которой обычно не хвастаются. Кабинет и админка. Оплата с балансоми возвратами за неудачные операции. Редактор, из которого правятся лендинги и письма,с историей и откатом. Резервные копии на отдельную машину, причём деньги копируются каждые пятнадцать минут, потому что баланс без списка владельцев восстановить нельзя.

Склад открытых вакансий весил на начало 2,57 гигабайта. Разбирался за 121 секунду и дал 480 тысяч вакансий, поиск по ним идёт 2,7 секунды. Первый вариант разбора грузил всё в память и был убит ядром при шести с половиной гигабайтах свободных. Переписал на поток, память упала до пятидесяти мегабайт. Тут важно упомянуть 1 важный факт, данные собираются только с источников, правила которых позволяют это делать..

Другая часть вакансий приходит из Telegram, и там всё иначе. Вакансию часто публикует сам нанимающий, свежесть не сравнить, но структуры нет вовсе, только текст. Заголовком норовила стать вывеска канала вместо должности, так было у 405 карточек из 2 973. Резюме соискателей приходили как вакансии, в одной проверке таких набралось 68 из 128. Признак «оклад» находился внутри слова «доклад», и анонсы конференций лезли в выдачу. Метка «удалённо» стояла там, где текст её опровергал, таких карточек нашлось 103. Каждое правило приходилось сужать, потому что первое же съедало настоящие названия.

За два месяца 278 изменений в хранилище и больше четырёхсот записей о том, что делалось и почему.

Что здесь делал Клод

Код набирает Клод. Без него два месяца превратились бы в два года. Всё остальное делаю я. Схему придумываю я. Что считать готовым, решаю я. Как проверить, что это правда работает, придумываю тоже я, и это оказалось самой трудной частью. Заставить модель написать функцию легко, это минуты. Труднее ответить на вопросы, которые она за тебя не задаст. Как узнать, что функция делает именно то, что я просил? Как поймать случай, когда она молча врёт?

Придирчивость

Правило, которое стоит мне дороже всего остального. Я годами отвечал за то, чтобы проекты доезжали до людей, и знаю, как выглядит работа, которую сдали ради галочки.

Под каждую правку пишется отдельная проверка, и она обязана краснеть с двух сторон. Верну старое поведение, падает. Уберу то, что она проверяет, тоже падает. Проверка, которая зеленеет всегда, не проверяет ничего.

Дальше важнее. Если проверка написана той же рукой, что и код, она подтверждает только то, что ошибся я дважды одинаково. Проверять надо на живом результате.

И третье, главное. Замер без второй проверки, где ответ известен заранее, не доказывает ничего. У меня было три случая, когда я собирался сделать вывод, а мерил неправильно, и все три выглядели убедительно.

Поломки на боевом сервере у меня были. Поиск однажды начал отдавать пустую выдачу по частому запросу, потому что моё правило отсева выбрасывало чужие названия заодно с нужными. Каждый раз это находилось, чинилось и уезжало в бой с проверкой на этот класс ошибок.

Про безопасность и данные

Отдельным заходом я взламывал свой же сервис. Одиннадцать проверок против живого сайта. Утечка настроек, подстановка кода в формы, чужой баланс без входа, куда сервис обращается сам. Что нашлось, то и починилось.

Пароли хранятся так, что украденный файл ничего не даёт. Ключи и пароли от почты зашифрованы, причём ключ привязан к машине, унесёшь файл на другой сервер и он не откроется.

Свою статистику я сделал без слежки. В файл уходит только цифра, сколько зашли, откуда, с телефона или с компьютера. Уникальных считаю отпечатком «адрес и браузер» со случайной добавкой, которая живёт только в памяти. Связать человека между днями нечем, cookie не ставлю, счётчик Метрики включается только у тех, кто нажал «Принять».

Это не подвиг. Это то, без чего нельзя выпускать продукт, в котором чужие деньги и чужие резюме.

Про площадки

Не любую площадку можно взять в работу. Не потому, что трудно, а потому что нельзя. У каждой площадки есть правила, и в них написано, можно ли забирать данные автоматически. Эту строку лучше прочитать до того, как начнёшь писать, а не после. Я работаю с тем, что открыто. Если нужна закрытая площадка, есть один путь. Договориться. Дольше, дороже и с перепиской, зато не заканчивается письмом от юриста и судебным разбирательством.

Генерацию и публикацию постов в профессиональные соц сети, я написал, но в интерфейс не вывел. Ждёт разрешения площадок. Совсем убирать не стал, работа сделана и ждёт акцепта. Написать оказалось быстрее, чем получить право этим пользоваться.

Так это собрал бы ребёнок

Собрать за вечер приложение, которое что-то делает на экране, ребёнок сможет. Между этим и продуктом лежит пропасть, и заполнена она не кодом.

Код сегодня почти ничего не стоит. Дорого другое, понять, что нужно людям. Придумать, как проверить, что сделанное правда работает. Снять то, что уже сделано, потому что оно врёт. Прочитать правила чужих площадок раньше, чем писать код. Ответить за результат, когда он окажется плохим.

Модель ничего из этого не делает. Она не отвечает за результат, а человек отвечает.

Что я вынес для себя

Идея стоит дешевле, чем кажется, а проверка идеи несравнимо дороже. Больше всего времени ушло не на то, чтобы сделать, а на то, чтобы убедиться, что сделанное делает задуманное.

Правило, которое я повторяю как заклинание. Замерил не значит посмотрел.

И самое неожиданное. С ИИ ты перестаёшь торговать кодом и начинаешь торговать качеством решения. Код теперь не конкурентное преимущество. Преимущество в том, что ты заметил, а другой нет.

Спасибо всем, кто дочитал до конца, сам проект здесь: https://lispost.ru

33