инженер Барселона с 2023

Собираю системы и сайты, которые дальше работают без меня

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

Отвечаю в течение пары часов. Разбор задачи бесплатно.
20+проектов
сдано с 2023
5,0рейтинг
на биржах
MScмагистр Big Data и ИИ,
Universitat de Barcelona
принцип

Хорошая система
не требует меня.
Плохая требует вечно.

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

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

01

Критичное решает код, не модель

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

02

Правила живут у заказчика

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

03

Каждый живой сбой становится тестом

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

04

Отказ честнее тихой ошибки

Если данные неполные, система останавливается с внятным объяснением, а не гадает. Неверная цена у клиента дороже неудобной паузы.

два направления

Автоматизирую процессы
и собираю сайты

Разные задачи, один подход: фиксированная смета до старта, работа этапами и передача с доступами и инструкцией.

01 / ОСНОВНОЕ

Системы
и автоматизация

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

  • Боты и агенты в переписке: продажи, поддержка, кураторство
  • Интеграции с CRM, таблицами и внутренними сервисами
  • Парсинг и сбор данных, разовый или как постоянный поток
  • Автоматизация рутины: отчёты, сводки, уведомления, документы
смета и сроки в переписке
02 / ТОЖЕ МНОГО

Сайты
и интерфейсы

От лендинга до многостраничника с юридическим пакетом. Собираю так, чтобы дальше вы правили контент сами, без разработчика.

  • Лендинги и многостраничные сайты, дизайн и вёрстка
  • Кастомная вёрстка внутри конструкторов, без потолка шаблонов
  • Инфраструктура: домен, HTTPS, редиректы, формы в CRM
  • Аналитика с целями, открытый граф, юридический пакет
смета и сроки в переписке
кейсы

Что уже стоит
и работает

Разверните любой кейс, чтобы посмотреть, как он устроен внутри. Цифры настоящие, имена клиентов называю только там, где на это есть согласие.

Подбор строго по базе

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

Считает код, а не текст

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

Двадцать сторожей на выходе

Главное архитектурное решение проекта. Перед отправкой ответ проходит два десятка детерминированных проверок: вывод о деньгах без расчёта, цена без «от», два вопроса в одном сообщении, подаренный платный блок, услуга не по возрасту, перевранное название карточки, выбор, сделанный за клиента, путаница в роде ребёнка. Замечание возвращается, ответ переписывается и проверяется заново, до трёх кругов. Если замечание про деньги осталось, ответ не уходит вовсе, вместо него передача менеджеру.

Правила живут в таблице заказчика

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

Три уровня «кто сейчас говорит»

Общий выключатель смены и персональный у каждого менеджера, потому что сотрудники заканчивают в разное время. Менеджер ответил клиенту сам, система в этом чате замолкает до новой смены: слово менеджера всегда приоритет. Галочка в сделке amoCRM сильнее любых настроек телеграма. Плюс человеческий интерфейс прямо в телеграме: список клиентов с кнопками, где включено, а где нет.

Мирное сосуществование с Wazzup

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

Дисциплина тестирования

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

Эксплуатация

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

Первые экраны написаны кодом

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

152-ФЗ, а не галочка

Конструкторы по умолчанию тянут шрифты с серверов Google, и IP-адреса российских посетителей уходят за границу. Это нарушение закона о персональных данных, о котором обычно никто не думает. Шрифты загружены напрямую под собственными именами, обращений к googleapis на сайте нет, проверено. По той же причине карта взята Яндекса. Плюс три юридических документа с реквизитами, cookie-баннер с фиксацией согласия действием, а не крестиком.

Формы и интеграция с CRM

Четыре формы уходят в АльфаCRM через вебхук. Выяснилось опытным путём: метод принимает только фиксированный набор ключей, а поле источника в CRM оказалось справочником, а не произвольным текстом. Схема форм была переработана, направление курса ушло в комментарий с подсказкой, источник определяется по идентификатору формы. Все формы протестированы отправкой реальных заявок с проверкой карточки лида.

Домен, DNS и незаметная ловушка

Кириллический домен переведён на новый хостинг: две A-записи, SSL, редиректы с www и с http. Отдельно удалены две AAAA-записи. Конструктор не поддерживает IPv6, и при их наличии часть посетителей продолжала бы попадать на старый сервер, причём совершенно незаметно для владельца. Почтовые записи не тронуты, почта клиента продолжила работать без перерыва.

Что нашлось в материалах клиента

Опечатка в прайсе: подписаны длительности 60/90/120 минут, а цены соответствуют 60/70/90, проверяется арифметикой и подтверждается второй страницей прайса. Скрытый обязательный годовой взнос, без упоминания которого рядом с ценой за занятие родитель посчитал бы месяц вдвое дешевле реального. Расхождение адреса между договором, сайтом и справочниками. Противоречие в акциях. И отдельно: договор семь раз ссылается на Правила внутреннего распорядка как на неотъемлемую часть, а самих Правил на сайте не было, при споре о возврате это создало бы проблему.

Как сайт выглядит в мессенджере

Для каждой продающей страницы сделан свой баннер открытого графа 1200×630 в фирменных цветах, сгенерированы программно на Python с PIL тем же шрифтом, которым набран логотип. До этого при отправке ссылки подтягивался служебный заголовок и логотип, ужатый до нечитаемого размера. Иконка сайта вырезана из вектора, а не трассирована с растра: в 16 пикселях слово нечитаемо, знак узнаётся.

Что клиент меняет сам

Принцип, заложенный с самого начала: кодом собрано только то, что меняется раз в год. Цены, описания курсов, тексты, новости, контакты и режим работы в подвале, фотографии, всё это правится мышкой в обычных блоках. Блок цен собран стандартным блоком именно для этого.

Гибридная сборка вместо выбора «или-или»

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

Первый экран через пять концепций

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

Свет, который ходит по буквам

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

Контроль качества автоматическим рендером

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

Мелочи, которые видно только в деле

Первый экран гарантированно вписывается в окно: высота шапки, нижний отступ и строка логотипа вычитаются явно, плюс жёсткое ограничение переполнения. Карта работает без платного API-ключа и без водяного знака for development purposes. Кадрирование подобрано так, что лицо остаётся в кадре на любой высоте окна. Акцентный цвет вынесен в переменную в первой строке каждого блока: смена фирменного цвета это правка одной строки, а не поиск по всему коду.

Формат и статус

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

Почему выборочная прослушка не работает

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

Разделение оценки на независимые модули

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

Обучение на своих же разговорах

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

Имя клиента не называю

По договорённости заказчик не называется. Цифры и устройство системы согласованы к публикации, название компании нет.

Задача была не «написать текст»

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

Проверка вместо переписывания

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

Дайджест-бот тому же клиенту

Отдельной задачей собран бот сводок по чатам клуба, чтобы команда не читала всё подряд. Разобран публично в лонгриде на vc.ru.

Память сообщества как актив

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

Наблюдение за форумом в реальном времени

Четырнадцать тем в двух чатах отслеживаются одновременно. Это не рассылка по расписанию, а постоянное присутствие: вопрос появился, ответ пришёл.

Дубли это главная боль такого потока

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

Фильтр, которому не нужно учить синтаксис

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

Живёт как сервис

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

Разные источники, разные механики

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

Верификация это половина работы

Сырой сбор даёт мусор: битые адреса, ловушки, дубли, мёртвые домены. Цифра в сто тысяч это то, что осталось после очистки и проверки, а не то, что упало в базу на входе.

Свой почтовый сервер

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

«Ниже рынка» это гео-задача, а не сравнение цен

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

Скорость важнее полноты

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

Статус

Проект заморожен до декабря, инфраструктура продолжает работать.

Полный цикл в одних руках

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

3D-виджет против политик безопасности

Сторонний виджет отказывался встраиваться из-за браузерных ограничений на кросс-доменное содержимое. Задача решена без просьб к поставщику что-то менять на своей стороне.

Отношения

Проект закрыт, отношения тёплые, клиент кандидат на постоянное сопровождение.

Мелкая автоматизация окупается быстрее крупной

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

Сервис, а не скрипт

Разница принципиальная. Скрипт нужно помнить и запускать, сервис работает сам и жалуется, когда сломался.

изнутри

Цифры не про обещания,
а про то, как это сделано

Обещать выручку я не берусь, это зависит не только от меня. А вот за то, как собрана работа, отвечаю целиком.

810
автоматических проверок в одном проекте, идут за секунды без сети и без ключей от внешних сервисов
20+
сторожей на выходе: ответ переписывается, пока не пройдёт проверку, либо не уходит вовсе
5
концепций первого экрана собрано вживую, прежде чем клиент выбрал направление
0
битых ссылок на сдаче девятистраничного сайта, проверено инструментом, а не на глаз
10×
во столько раз ужат ключевой кадр первого экрана без видимой разницы в качестве
100К+
контактов прошло через очистку и верификацию, а не просто упало в базу
как проходит работа

От задачи
до передачи

01

Пишете задачу

Описываете в Telegram, что нужно и где сейчас теряется время. Разбираю и задаю уточняющие вопросы. Бесплатно, и если задача не решается, скажу прямо.

02

Смета и план

Фиксированная цена и сроки до старта. Никаких «по часам, посмотрим сколько выйдет». Большие проекты бью на этапы.

03

Запуск

Начинаем с компактного MVP, чтобы вы увидели результат рано. Сдаю работающим в продакшене: доступы, инструкция, передача.

04

Дальше без меня

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

вопросы

Отвечаю до того,
как вы спросите

Сколько это стоит?
Зависит от объёма. Цену вслепую не называю: сначала пара уточняющих вопросов, потом фиксированная смета в переписке, до старта и без «по часам, посмотрим сколько выйдет». Большие проекты бью на этапы, сначала компактный MVP.
Как происходит оплата?
С новыми клиентами 50% предоплата, остальное по факту сдачи. На больших проектах платите за этап, а не за месяцы разработки вперёд.
А если не сработает или не подойдёт?
Поэтому и начинаем с MVP. Если на реальных данных что-то не сходится, это видно рано и дёшево, а не на проекте за полмиллиона. На старте честно говорю, что решается, а что нет.
Чей код и доступы после сдачи?
Ваши. Отдаю с доступами, инструкцией и передачей. Никакой привязки ко мне: при желании систему подхватит другой разработчик, а контент и правила вы правите сами.
Я потом смогу что-то менять сам?
Это закладывается в архитектуру с самого начала. Цены, тексты, правила поведения, расписание, всё, что меняется регулярно, выносится туда, где вы правите это мышкой или строкой в таблице. Кодом собирается только то, что меняется раз в год.
Что с конфиденциальностью данных?
Данные и доступы остаются у вас. По запросу работаю под NDA. В кейсы и отчёты ничего не уходит без вашего согласия: в портфолио выше есть проект, где по договорённости не называется даже имя клиента.

Есть задача? Опишите её в двух предложениях

Отвечаю в течение пары часов. В переписке честно скажу: что можно автоматизировать, сколько это стоит и есть ли в этом смысл именно для вас.

Написать в Telegram
или на почту, artemiy.i.klimkin@gmail.com