Как быстро пролетели шесть месяцев! Продолжаю рассказывать о том, как решил сделать пет-проект: НормЦРМ. Сам я ремесленник-одиночка и пользовался ограниченным набором инструментов для ведения дел: Google Таблицы, да Windows-заметки. Решил все эти данные свести воедино в рамках собственной црмки.

Я не разработчик, а проектировщик интерфейсов (UX/UI-дизайнер). Опыта в программировании совсем немного. Поэтому пет-проект был мне особенно интересен. Я уже двадцать лет готовлю проектную документацию для других — а в этот раз для себя.

Сейчас расскажу, что сделал по проекту за последние полгода, как мне в этом помогли ChatGPT и Codex, как изменился процесс работы и почему это поначалу было скучно и грустно — а теперь с каждым днём жизни проекта всё интереснее и веселее.

Введение

В конце июля 2025 я рассказал Хабру о том, как спроектировал и завайбкодил первую версию проекта.

Сегодня «ЦРМ нормального фрилансера» называется «Норм ЦРМ», потому что у людей очень разное представление о том, кто такие фрилансеры, а проект подойдёт и самозанятым, и предпринимателям, и тем, кто хотел бы привести свои дела в порядок, работая на нескольких работах сразу.

Можно сказать, что сейчас это система управления клиентами, проектами и задачами. А до воронок и действительно црм-ной части я до сих пор не добрался.

Codex

Я попробовал Codex (Кодекс). Это нейронка от OpenAI. Она даётся впридачу к платной подписке ChatGPT Plus за 20 баксов в месяц (именно поэтому я и не пробовал других нейронок, а сразу остановился на этой). И она предназначена для программирования. Отличие Кодекса от ЧатаГПТ в том, что первый смотрит в репозиторий моего проекта.

О, как это меня ускорило! Если раньше я для разработки каждой небольшой функции скидывал ЧатуГПТ несколько страниц кода для контекста, то теперь я могу ставить задачи таким же языком, каким ставлю их живым разработчикам.

Мой обновлённый рабочий процесс

Сначала пара слов об общих моментах. У меня в работе постоянно находится два списка задач. Первый — это исправление ошибок и рефакторинг (когда я оптимизирую уже существующий код). Тут работа простая: попользовался проектом, увидел, что что-то не так (что-то неудобно или работает не так, как задумано) — сделал несколько мелких правок и двигаешься дальше.

Второй список задач — внедрение новых разделов и функций. Тут уже работа по полному циклу: проектирование, разработка, тестирование, доработки, перевод, релиз.

Расскажу о рабочем процессе в рамках именно второго списка задач.

Планирование и учёт времени. Ещё в начале рабочего дня я захожу в НормЦРМ, открываю раздел «Мой день» и добавляю туда задачи, на которых хотел бы сфокусироваться. Работа над пет-проектом у меня ведётся в свободное от основной работы время, поэтому список задач на день смешанный.

Возьму реальный пример. Одна из моих текущих задач — «Проектирование и разработка загрузки файлов в НормЦРМ». Я её добавляю в проект «НормЦРМ», указываю предполагаемое время на выполнение (допустим, 5 часов).

Когда приступаю к задаче — запускаю тайм-трекер в НормЦРМ — и начинаю работу. После того, как я завёл такую привычку — могу видеть, как часто ошибаюсь в прогнозах на выполнение задач (сверяя результат по тайм-трекеру с запланированным временем), а также сколько времени на работу уходит в среднем каждый день.

Сегодня без встреч. Да уж, статья на Хабр не пять минут пишется!
Сегодня без встреч. Да уж, статья на Хабр не пять минут пишется!

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

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

Честно признаюсь: в последние полгода подзабил на документ с функциональной спецификацией. Но понимаю, что в будущем мне это аукнется, поэтому держу в планах задачу по актуализации.

Все важные моменты, которые не отобразить в прототипе, я фиксирую там же в виде заметок на жёлтых «стикерах».

Напомню, что списковые разделы проектируем после того, как спроектировали карточки
Напомню, что списковые разделы проектируем после того, как спроектировали карточки

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

  • Введение в контекст на уровне смыслов. Например: «Среди моих клиентов много компаний с большим количеством сотрудников. В рамках наших совместных проектов эти сотрудники играют разные роли. Я хочу иметь возможность вести каталог контрагентов (юрлиц, ИП, самозанятых) и указывать их сотрудников в качестве участников проектов с той или другой стороны».

  • Описание функций и разделов к реализации. Эта часть мало чем отличается от содержания моих функциональных спецификаций. Я перечисляю разделы, их содержимое и все нюансы, связанные с ними.

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

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

  • Уточнения, связанные с генерацией результата. Я часто забываю это сделать — и потом получаю файлы миграций там, где они мне не нужны. Или файлы переводов. Или скрипты и модальные окна вне инклюдов. А можно добавить в конце: «Миграции я буду делать через терминал на деве, поэтому не нужно их готовить. Переводы тоже. Не забудь, что мы стараемся не хранить любые потенциально сквозные элементы внутри основных шаблонов, а создаём для них новые (иконки, модальные окна и т.п.)»

Промпты иногда получаются внушительных размеров. И тут мне ну очень помогает навык слепой печати. При скорости в 400—500 символов в минуту постановка задачи кажется не такой мучительной (впрочем равно как и написание подобных статей).

К сожалению, на скриншот влезла только половина промпта
К сожалению, на скриншот влезла только половина промпта

Ожидание, пока Codex выполнит работу. После того, как я сформулировал задачу и отправил её Кодексу — он начинает думать. Как я уже говорил, он смотрит в репозиторий проекта на Гитхабе, поэтому мне не нужно показывать ему никакого кода вручную. Сначала он выкачивает из репозитория код, затем разворачивает его где-то у себя, затем приступает к работе.

В зависимости от сложности задачи он может думать от пары минут до пары десятков минут. Пока что самое большое количество строк кода, которое я получал от него на выходе, не превышало 1600, а время на размышления — 22 минуты.

В 2026 году 20 минут — это очень долго. Поэтому у меня всегда есть пул задач, которыми я могу заниматься во время ожидания. В основном, вношу правки и доработки в интерактивный прототип в Axure. Теоретически я также мог бы работать над актуализацией функциональной спецификации, но вот пока всё никак.

Анализ результата работы Codex. В итоге получаю сообщение от Кодекса на русском или английском языке (никогда не предугадаешь), что именно было сделано по моей задаче, а также перечень файлов, в которые были внесены изменения.

Слева вижу диффы — изменения в код по сравнению со старыми версиями.

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

Сначала смотрю на модель, затем на вьюхи и в конце на код шаблонов и стилей.

Несмотря на то, что самому написать такой код было бы трудно и долго, его чтение мне даётся легко. Если это что-то на питоне — я считываю всё на 90%. Если html/css — на 100%. А вот с js уже сложнее. Некоторые скрипты занимают сотни строк, понимаю я их процентов на 60-70 и могу что-то пропустить, доверившись нейронке.

Корректировка результата работы Codex. Обычно я сразу вижу, если что-то сделано не так. Тут бывало всякое. Изредка вместо создания полностью рабочей функции, Кодекс выдаёт только фронтовую часть с шаблонами и стилями. Тогда отправляю ему вдогонку промпт: «Мне нужно сделать работающую функцию, а не только фронт». И после этого он доводит дело до конца.

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

А иногда, совсем редко, вижу, что Codex просто забил на какую-то мою просьбу и не выполнил тот или иной пункт из поставленной задачи. Ну совсем как реальный сотрудник!

Кстати, забавное. Я ведь вижу его рассуждения в процессе работы. И вот там мелькает текст наподобие: «Сказать пользователю, что ошибку, о которой он пишет, исправить невозможно и требуется дополнительное расследование». А потом, в итоговом сообщении он просто опускает эту часть и ничего мне не говорит.

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

А мог бы в изначальном промпте сказать, чтобы выносил всё, что возможно, из шаблонов в инклюды
А мог бы в изначальном промпте сказать, чтобы выносил всё, что возможно, из шаблонов в инклюды

Перенос результата в dev и локальное тестирование. И тут не надо надо мной смеяться. Мой dev (окружение, в которой я занимаюсь разработкой и тестированием проекта до его релиза на боевой сервер) — это мой компьютер. В репозитории есть только одна ветка — main. И я ни разу не пользовался функцией отправки диффов Кодексом сразу в гит.

Я открываю диффы в интерфейсе Кодекса и построчно, ручками, переношу их к себе в IDE. Это мне помогает досконально разбираться в получившемся коде и, если я чего-то не понимаю, задавать уточняющие вопросы ChatGPT. Сейчас мне это нужно всё меньше, но когда я переношу код к себе именно таким способом — у меня возникает ощущение контроля.

Посмотрим, что изменится через полгода, но пока так.

На деве я сначала обновляю файл модели (если в эту итерацию он обновляется), затем создаю и применяю миграции через терминал. После этого уже обновляю или добавляю вьюхи, шаблоны и стили.

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

И тут проявляется неудобство моего подхода, которое я не исправляю просто потому, что оно не достаточно большое. Если в процессе переноса вижу, что Кодекс где-то сильно накосячил, то мне нужно делать ещё один корректирующий промпт. И результате этого промпта я получу новую пачку диффов, которые сравниваются с репозиторием, а не девом.

Тут-то мне бы и придумать отдельную тестовую ветку для Кодекса, но я пока обхожусь без этого. Просто в конце корректирующего промпта прошу отдельно: «Перечисли, пожалуйста, файлы, в которые ты внесёшь изменения в результате этой правки».

Вот, молодец, перечислил же!
Вот, молодец, перечислил же!

Деплой. У меня всё тот же деплой, который я настроил более полугода назад. Отправил в гит — а оттуда всё автоматически разворачивается на сервере.

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

Обычно мои коммиты выглядят так: «Тайм-трекер, первая версия», «Тайм-трекер, вторая версия», «Тайм-трекер, релизная версия с переводом», «Тайм-трекер, теперь точно релизная версия». Разумеется, я вставляю гораздо больше деталей в коммиты, здесь для простоты просто передаю суть.

Бывает и такое…
Бывает и такое…

Что я успел сделать за полгода

Перечислю функции. Это не хотелки и не прототипы. Всё перечисленное я использую каждый день в реальной работе:

  • Управление шаблонами писем в админке. С использованием переменных (подгружаются в виде JSON) и мультиязычностью;

  • Управление контентом в админке. Статичные страницы (главная, дорожная карта), соглашения (пользовательское, политика конфиденциальности) с контролем версий, блог, редиректы. Всё это с поддержкой нескольких языков и с учётом SEO;

  • Приём платежей, управление тарифами (интеграция с Робокассой). Триалы, пожизненные доступы. Промо-коды (процентные и абсолютные) с ограничениями по активациям или периодам;

  • Календарь встреч. С переносами, отменами (и их инициаторами), связью с проектами и контактами. Наконец-то у меня есть статистика, сколько часов я потратил на переговоры по тому или иному клиенту или кто постоянно переносит встречи;

  • Система, которая следит за тем, помнит ли о нас тот или иной клиент;

  • Система, которая следит за тем, доволен ли тот или иной клиент уровнем сервиса;

  • Контрагенты, сотрудники, счета. Их связь с проектами и контактами;

  • Тайм-трекер (система учёта времени). Зная, как многие не любят даже мысли о тайм-трекинге, сделал его полностью отключаемым в админке;

  • «Мой день» — раздел, где можно запланировать сегодняшний день и видеть, что в целом происходит (какие встречи будут сегодня, какие клиенты о вас уже позабыли или недовольны уровнем сервиса).

Ну и ещё много всего по мелочам.

За полтора месяца работы с Кодексом я по объёму сделал столько же, сколько за предыдущие пять месяцев без него.

Ещё немного деталей

  • Кодекс я использую в браузере, хотя мог бы встроить в IDE. Я сам не тестировал, но друг рассказал, что в случае с IDE используется уже другой тариф и тарификация ведётся по количеству токенов. И там, где я использую Кодекс бесплатно в рамках платной подписки на ChatGPT, мне пришлось бы платить пару сотен долларов за то же самое;

  • К сегодняшнему дню в Github Actions у НормЦРМ уже 268 workflow runs. Если поначалу у меня то тут, то там возникали проблемы с деплоями, то сейчас ошибки появляются не чаще раза в пару недель;

  • Я работаю в одиночку, без команды — и это меня сильно ускоряет. Например, тайм-трекер я сделал за 7 часов (и за один подход). От проектирования до финального протестированного релиза. Моя старая команда выполняла бы такую задачу не меньше двух недель (из-за согласований и потерь в передаче информации);

  • Стараюсь работать маленькими итерациями. Раньше мне казалось странным делать деплой, в котором я правлю внешний вид какого-нибудь отдельностоящего элемента. А теперь, наоборот, дроблю работу везде, где это имеет смысл;

  • Вот как выглядит распределение времени в работе над проектом:

    • 40% — проектирование;

    • 30% — разработка и деплой;

    • 30% — тестирование и планирование.

      Скоро всем этим циферкам придётся немножко подвинуться, впустив в свои ряды такой пункт как «Продвижение»;

  • То, что я делаю — это чисто вайб-кодинг, сам я кода почти не касаюсь. Но есть два нюанса. Первый: архитектура проекта и его организация — это моё видение проектировщика информационных систем. Нейронки из коробки предлагали что-то менее системное (в основном потому, что не знали стратегических планов на проект). Второй: если меня лишить нейронок, то я смогу продолжить работу над кодом проекта. Раз в 10-20 медленнее, но смогу;

  • После каждого релиза новых функций я созваниваюсь с другом Антоном Григорьевым (UX/UI-дизайнером, автором UX Notes) и показываю их ему. Это помогает и в тестировании (когда я обо что-то спотыкаюсь во время демонстрации), и в сборе обратной связи (когда Антон чего-то не понимает из интерфейса и задаёт вопросы). Одна из лучших моих привычек по проекту;

  • Бывают ситуации, когда Codex не справляется с поставленной задачей. Чаще всего это выглядит так: какая-то функция в его коде не работает и после двух-трёх корректирующих промптов ничего не меняется. Тогда я иду в ChatGPT 5.2, даю ему полный контекст и прошу помочь. И ЧатГПТ всегда помогал. Не было ни одного раза, когда он не справился бы.

В ответ ЧатГПТ мне и ошибку подсветил, и фикс прислал. Красота!
В ответ ЧатГПТ мне и ошибку подсветил, и фикс прислал. Красота!

Выводы и ощущения

Перестало быть скучно. Сегодня, когда я уже не заливаю фундамент, а работаю над функциями, которые реально облегчают мою фрилансерскую жизнь, — каждый маленький результат приносит радость. За работу сажусь не за счёт дисциплины, а за счёт радостного предвкушения.

Кстати, задумываясь над созданием другого пет-проекта, прям руки опускаю, когда понимаю, что потребуется не меньше месяца работы просто на то, чтобы построить заново и запустить базовые вещи: регистрацию и вход, работу с контентом, написать соглашения, интегрировать оплату, настроить SEO и кучу подобных мелочей. Даже если я буду буквально копировать-вставлять уже готовые решения, это всё равно займёт время.

А ещё понимаю, что с двумя проектами, если я улучшу что-нибудь в базовом функционале в одном, то придётся дублировать это и во втором (если, конечно, не делать для них единую платформу с общей регистрацией и личными кабинетами).

Хочется вспомнить слова, которыми закончил предыдущую часть этой статьи:

Разработчиком я, разумеется, не стал. Но стал человеком, который может придумать, спроектировать, запрототипировать и собрать собственный инструмент. В одиночку. Те, кто такое уже проделывали — принимайте в свои ряды новичка! А те, кто ещё ждут своего часа — пробуйте. Сегодня это намного проще, чем несколько лет назад, несмотря на то, что технологии становятся всё сложнее.

Кое-что поменялось с тех пор. Хоть я и до сих пор не стал разработчиком, но уже не тот проектировщик интерфейсов, которым был полгода назад. Получилось что-то вроде проектировщика на максималках. Нынешним клиентам могу не только сделать прототип в Axure и описать его в функциональной спецификации, но и завайбкодить рабочий прототип MVP продукта (Python, Django, PostgreSQL + html/css + deploy) в сроки, доступные только тем, кто работает в одиночку. Я всё ещё не справлюсь без нейронок и мне не хватает опыта в боевых условиях, но давайте вернёмся к этому вопросу ещё через полгодика?

Иии… останавливаю тайм-трекер!

Полезные ссылки:

  • Получившийся проект (НормЦРМ): normcrm.ru

  • Книга нормального фрилансера. Она бесплатная. И это не какая-то брошюрка-лид-магнит. Я писал её два года. Уже больше десяти тысяч человек прочитали. Ни одного негативного или нейтрального отзыва — только позитив

  • Мой Телеграм-канал о работе на фрилансе и проектировании интерфейсов