Blog

  • План выхода на миллион

    План выхода на миллион

    Давно читал статью про движение успешных стартапов, которые не стали брать инвестиции. Один из самых известных таких проектов — Mailchimp. Компания с огромным оборотом осталась в руках основателей. Идея мне очень понравилась. Мысль окупаться и зарабатывать без внешних инвесторов засела в голове.
    Чтобы это получилось, мы (пока) не тратим время на привлечение инвестиций, а считаем, сходится ли экономика проекта. Сможем ли платить по счетам?

    Мы запустили новое направление, которое должно стать основой нашего процветания.

    Со средней покупки в этом направлении стартап зарабатывает 160 рублей — несколько процентов от сделки. Усилий по продаже практически нет, заказ оформляется клиентом без участия операторов и продавцов. Трафик условно бесплатный — мы уже получаем его через SEO. Чтобы заработать миллион, нам нужно продать 6500 заказов в месяц. Кажется, дохрена. Делим на 30 дней — примерно 220 заказов в день, теперь норм.

    Инвентарь для заказов поставляют партнёры, они же получают львиную долю выручки и приводят часть трафика в воронку.
    В данном проекте именно партнёры являются драйвером роста.

    По опыту и анализу средний партнёр приведёт 200-300 заказов за месяц. Это почти совпадает с расчётом выше — 220 заказов в день. Условно, прикинем, что нам нужно 30 действующих средних партнёров в каждом месяце.

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

    Выглядит всё реально. Пойду делать.

  • Сделай README сегодня же!

    Сделай README сегодня же!

    В этом месяце ко мне пришли три легаси проекта на аудит и разработку стратегии развития. Во всех трёх нет описания, документации и даже README. С автором одного из проектов связи больше нет.

    В мире Open Source без README никуда — содержимое этого файла автоматически отображается в качестве описания на странице репозитория с кодом на GitHub. В качестве синтаксиса чаще всего используется Markdown, что позволяет использовать заголовки, ссылки, копируемые команды и примеры кода.

    В мире продуктов, написанных “для себя” или “для клиента” часто описания нет. Или README без изменений унаследован от фреймворка, на котором собран проект. Это уже первая подсказка, но дальше разбираться нужно самостоятельно.
    Разработчику кажется, что он — первый, последний и единственный посетитель репозитория. Нет смысла писать эти инструкции — для кого? А через несколько лет новый разработчик смотрит на папку с кодом и чешет затылок.

    Что писать в README:
    – Название проекта.
    – Описание — ответ на вопрос, а что этот код делает и для чего.
    – Зависимости и библиотеки, описать что под капотом и в какой среде это работает, требования к железу и среде.
    – Архитектура — как это устроено?
    – Инструкция по установке и первому запуску.
    – Инструкция как разворачивать на сервере, если отличается от локального запуска.
    – Ответьте на все вопросы, которые задаст новый разработчик в первый день работы с проектом.
    – Примеры использования, типичный рабочий процесс.
    – Полезные ссылки на официальную страницу, документацию, статьи.
    – Контакты — с кем связаться, кто в курсе продукта, кто заказчик.
    – Инструкция как вносить правки в код.
    – Лицензионное соглашение для этого кода и для зависимостей (если применимо).

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

    Я как раз собираюсь писать README для одного из проектов.
    А для вдохновения коллекция лучших примеров, собранных по всему GitHub.

  • Матрица роста агентства

    Матрица роста агентства

    Упрощённая модель предлагает два пути роста: бутик или конвейер. Много лет назад на конференции я увидел расширенную матрицу 2х2, которая точнее отражает будущую эволюцию — не только по чеку, но и по открытости.

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

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

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

    Продакшн делает что-то очень хорошо и на высоком уровне, допиливает под потребности клиента. Он продаёт дорого и к нему обращаются другие Агентства или компетентные Заказчики.

    Конвейер делает одинаковые штуки на потоке и с низким чеком. Кому не подходит конвейер — извините, следующий. Массовая настройка Авито или лендинг под ключ в этой категории.

    SaaS / Продукт — мы хотим сделать один раз, а потом видеть от клиентов только деньги. Упаковываем накопленный опыт в продукт: в робота, сервис или набор методичек.

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

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

  • Первый компьютер

    Первый компьютер

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

    В середине 90х был момент, когда умельцы собирали клоны ZX Spectrum с оперативной памятью 48 килобайт и их можно было приобрести. Каким-то чудом, мама решила, что мне нужен компьютер. Так в 13 лет я стал обладателем технологической инновации.
    Спектрум представлял собой клавиатуру, внутри которой была вся начинка. Монитором для него служил телевизор, а в качестве носителя информации — аудио магнитофон с обычными с виду кассетами.
    Комп понимал только BASIC, ввод с клавиатуры был мудрёным — клавиши печатали не только буквы, но и вызывали команды. Зато можно было подключить настоящий джойстик и с помощью команды начать загрузку игры с кассеты.
    Звук загрузки с кассеты застрял в памяти наравне со звуками подключения модема. Кассеты были пиратскими, переписывали их подпольно и продавали на радиорынке. Игры загружались по 5-15 минут. Один сбой на десятой минуте загрузки и приходилось отматывать кассету и начинать загрузку с начала. Но если загружалась — фантастический мир компьютерной графики из 8 цветов и динамичных игр ждал меня. Играл в Mag Max, Dizzy, Boulder Dash, Arkanoid, BallBreaker, Saboteur.

    Процесс загрузки игры и непередаваемый звук
    Mag Max
    Ballbreaker

  • Как возглавить восстание машин

    Как возглавить восстание машин

    Небольшая памятка самому себе как внедрить AI в реальные процессы в проекте.

    Из-за хайпа вокруг AI и LLM складывается ощущение, что мы уже опоздали на их внедрение и нас уже обгоняют. Можно не тревожиться, роботы заведутся у всех. Нужно принять неизбежное и приготовить место для роботов в рабочих процессах.

    • В самом начале нужно забыть, что мы хотим внедрить AI. Думаем от задачи, а не от технологии.
    • Какой ценный конечный результат ожидается от этой роли?
    • Какие должностные инструкции мы для него создадим?
    • До компьютеров это решалось иначе. Продумать в точности по шагам, как бы это решал живой человек.
    • Ассистента нужно проектировать точно также, как проектируются компьютерные игры, финансовые автоматизации и учётные системы — на бумаге. В нашем случае — нарисовать блок-схему по шагам.
    • До того как втыкать везде AI, нужно разобраться где действительно нужен AI. Главный вывод всех AI-стартапов, пытающихся выполнять повторямые задачи реального мира — чем меньше участков с AI, тем меньше фронт ошибок.
    • Если можно обойтись без AI — лучше обойтись без AI: есть логика, весовые модели принятия решений, ML и даже участие человека. Подходить с умом.
    • Для каждого участка схемы выбираем подходящий способ автоматизации. Если принятое решение логическое (Да/Нет/И/Или/Если) — пусть принимает решение логический автомат с помощью прозрачного кода.
    • AI попадёт только в те участки, где нужно принимать осознанные решения. На практике это 1 из 5-10 действий.
    • Если разбить задачу на более простые участки, то некоторые участки могут выполнять более дешёвые и быстрые LLM-модели. Попробовать на практике, какая модель справится.
    • Также работает наоборот — самые чувствительные и сложные участки отдавать более умным и дорогим LLM-моделям.
    • Не забывать передавать полный контекст происходящего из памяти и прошлых шагов в агента.
    • Проверить, какие персональные данные в какие AI и API мы отдаём. Постараться не передавать ненужную для принятия решения чувствительную информацию.
    • Эксперименты демонстрируют, что LLM дает лучшие результаты, если его мотивировать. Поэтому в каждый промпт добавляем обещание денежного вознаграждения, повышения на работе и подчёркиваем значимость задачи в формулировке.
    • Исследования китайских учёных показывают, что наилучшие результаты дают топологии с участием нескольких AI-агентов.
    • Самый простой способ достичь качества — использовать на участке пару агентов Контролера и Исполнителя. Это эффективно устраняет нежелательные галлюцинации и другие сбои в ответах.
    • На каждый участок схемы нужна своя пара агентов.
    • Сложные топологии (звезда, дерево, mesh-сеть, рандом) улучшают качество, но в большинстве случаев можно ограничиться парой агентов.
    • Если нужно переводить результат — делать это на самом последнем шаге непосредственно перед отправкой пользователю. Так избежим каскадного накопления неточностей перевода при обработке на разных шагах.
    • Хранить все логи: сам запуск автоматизации, смена статуса, полученные после вставки переменных итоговые промпты (!), ответы AI. В общем, все шаги записывать.

    Вывод: до внедрения AI разложить процесс на шаги и понять в каком шаге нам нужен AI. И постараться обойтись без него.

  • Оргструктура для стартапа — как назначить всем должность

    Оргструктура для стартапа — как назначить всем должность

    Оргструктура для стартапа — как назначить всем должность.

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

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

    И попробовал рассортировать по кучкам. Потом на эти кучки можно будет приклеить ярлычки CEO, CFO, CMO, C3PO, R2D2…

    Через 40 минут сортировки на доске я понял, что у меня не стыкуется. Текущая команда и виртуальная структура с дырками… В общем, заставил GPT воображать себя венчурным инвестором и успешным предпринимателем, после чего скормил ему эту задачу. Описал всех участников, рассказал, кто чем занимается и дал список направлений деятельности.

    Такое распределение менеджмента получилось в итоге:
    1. CEO (Chief Executive Officer) + CTO (Chief Technology Officer). Генеральный + технический директор. Стратегия и руководство, технические вопросы, финансы, инвестиции.
    2. COO (Chief Operating Officer) + CRO (Chief Revenue Officer). Операционный директор + РОП. Продажи, управление редакцией, онбординг новых клиентов и сотрудников.
    3. Head of Design & UX/UI — Дизайнер.
    4. Head of Customer Support — Поддержка клиентов.
    5. Head of Marketing (потенциально CMO) — Маркетолог.

    Забавно, что AI назначает Head of, даже если в отделе один специалист. Но мы помним, что в стартапе карьерные ступеньки подставляют вниз. Ещё интересно, что не все участники команды получили позицию менеджера. Даже если этот участник в отделе один.

    Теперь дополнительная польза. Кого можно сейчас не нанимать?
    Chief Product Officer (CPO) — Директор по продукту. В нашем случае закрывается созданием продуктовой команды из CEO/CTO + COO + Design. Лучшее решение, спасибо искусственным мозгам! Что интересно — ровно так разработка у нас и происходит. Находка, что можно не выделять главного в этом процессе и продолжать работать коллективом.

    Chief Financial Officer (CFO) — Финансовый директор. Когда деньги появятся, тогда и возьмёте. Для меня отличным решением оказалось раннее выделение роли Chief Revenue Officer без довеса на эту роль функционала CFO. И правда, чем управлять? Продавайте пока и всё.

    HR-менеджер — Управление персоналом пока больше сводится к найму. Это закрывают сами CEO и COO, а что не смогут — отдать рекрутерам. Мы можем долго не нанимать выделенного HR, потому что оба фаундера много нанимали сами в других проектах.

    Юрист — аутсорсить на точечных консультациях (это мы уже начали) или взять агентство (а вот это пока навряд ли).

  • Неочевидная проблема с почтой для домена

    Неочевидная проблема с почтой для домена

    Почта для домена — один из самых первых сервисов, которые появились в сети. Email существовал ещё в 1970-х в сети ARPANET, задолго до появления первого сайта в 1991 году.

    Как обстоит ситуация сейчас, если мы хотим развернуть свою почту для домена:
    – Получить статический IP.
    – Настроить обратную PTR-запись в DNS, чтобы IP-адрес ассоциировался с доменом.
    – Создать ящик postmaster@ — требуется для почтовых систем по стандартам RFC.
    – Прописать SPF-запись — указывает, какие серверы имеют право отправлять почту.
    – Настроить DKIM — криптоподпись к каждому письму.
    – Включить DMARC ­— политику обработки писем, отправляемых от нашего домена. И читать отчёты, чтобы разбираться с теми письмами, которые не прошли SPF и DKIM.
    – Настроить обработку bounce-писем — чтобы понимать, кому письма не доставлены и исключать их из будущих рассылок.
    – Зарегистрироваться на всех крупных email-провайдерах http://postmaster.google.com/ https://postmaster.mail.ru/
    – Отслеживать попадание домена и IP-адреса в публичные списки спамеров и писать письма на исключение оттуда.

    Приключение на 20 минут, вошли и вышли.

    Итак, вы зарегистрировали новый домен для проекта и начали получать и отправлять письма. Но почта всё ещё работает не так, как нам нужно.
    – Все показатели нашего почтового домена зависят от репутации, которая от нас скрыта. Мы не знаем, как нас оценивают почтовики. У нового домена нет репутации.
    – Новый домен нужно греть. Количество писем, отправленных каждый день, должно плавно расти. Маркетинг и PR должны это учитывать.
    – За большой объем рассылок без прогрева нас накажут как за спам.
    – Письма с домена могут попадать в спам из-за их содержания. Маркетолог выбрал ту же фразу или структуру письма, которую используют в спам-рассылках — мы в спаме.
    – Мы не знаем, были ли письма доставлены и прочитаны.
    – Люди нажимают СПАМ на транзакционных письмах — вся почта с домена начинает попадать в спам.
    – Если мы попали в блэклист, почтовик (Gmail, Mail, Yandex, Yahoo) может заблокировать получение почты с нашего домена. После выхода из блеклиста почтовик может пару недель не принимать нашу почту.
    – Почтовик может принимать ограниченное количество писем в час с вашего домена и потом замедлять их доставку до ящиков получателей.
    – Если мы всё настроили правильно по стандартам и документации, письма могут не доходить. Потому что так решил фильтр, мы испортили репутацию или отправили неправильное письмо.

    Реальное решение — отправлять почту с домена через крупные сервисы. Amazon SES, Mailgun, Sendgrid, Unisender и т.д. Их серверы находятся в белых списках и мы покупаем у них доставляемость.
    Почта с нашего домена, отправленная через крупного провайдера, с большей вероятностью дойдёт до адресата.

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

  • Как нанять разработчика: Отбор кандидатов

    Как нанять разработчика: Отбор кандидатов

    Вакансия нравится соискателям и к нам поступают десятки откликов.
    Но количество откликов не означает их качество…
    Многие разработчики не владеют навыком создания хорошего резюме. По резюме зачастую ничего не понятно.

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

    В анкете 50+ вопросов. Спросим про часовую ставку, условия работы, работает ли с таймером, пишет ли тесты и любые другие интересные нам детали.
    Самый большой блок — отдельные вопросы про каждую технологию и навык, который может потребоваться у целевого кандидата.
    Какой опыт с _____?
    Варианты ответа: Не было опыта, Изучал/Пробовал, Практик, Эксперт.

    Кажется, что тут легко обмануть и приукрасить. Да, но навряд ли на 2 ступени. 🤡
    Любой крупный обман в анкете вскроется на интервью и реальных задачах. А если что-то приукрасил — сам будет навёрстывать.

    Разработчик с удовольствем заполнит анкету вместо 30-минутного интервью с рекрутёром. Анкету можно заполнить на текущем рабочем месте или после работы. Без стресса и спешки.

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

  • Как нанять разработчика: Вакансия

    Как нанять разработчика: Вакансия

    Данная инструкция отражает мой практический личный опыт.
    За последние 10 лет я нанял более 50 разработчиков на полный рабочий день. Описанное касается разработчиков категории Middle и выше. Вы можете делать всё совсем иначе и у вас тоже будет результат — это нормально.

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

    Хорошая вакансия будет замечена в ходе регулярного обхода площадок с работой.

    Разработчик хочет прочитать вакансию и сразу для себя прояснить:
    – А можно ли на удалёнке? Можно ведь, да?
    – Описание архитектуры проекта одним предложением: “хайлоад екоммерс монолит на джанго с веб-мордой на реакте”.
    – В каком стеке и окружении работать, какой софт использовать.
    – Какого рода задачи он будет делать. Только честно, без украшательств.
    – На каком уровне требуется знать конкретные технологии.
    – Его место в команде — за что он отвечает, за что не отвечает.
    – Методологию работы: скрам, канбан, водопад, “молодой, динамично развивающийся стартап”.
    – Ритуалы: стендап, дейлики, покер-планирование, код-ревью, ретроспективы, багфикс-хакатоны и т.д.
    – С кем работать и контактировать, а с кем не контактировать (что не менее важно).
    – Количество и частота коммуникации.
    – Какую продуктивность ожидают. Как и в чём она измеряется?
    – Какая отчетность и зачем, кто её будет получать и проверять.
    – Какая реальная вилка оплаты на позиции и какие плюшки?

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

    В целом, больше ничего программиста не интересует 🙀

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

    Все отклики на такую вакансию будут двух типов:
    1. Осознанные отклики от целевых кандидатов
    2. Вдруг я проскочу и меня доучат как-нибудь

    Завтра покажу, как я отсеиваю первых от вторых.

  • Как не надо нанимать программистов

    Когда сталкиваются HR и IT, происходит столкновение материи с антиматерией.
    Экстравертные эмпатичные коммуникаторы агитируют скептично-бездушных асоциальных чудаков.

    Вследствие этого столкновения рождаются очень занятные идеи:
    – Пригласить человека, привыкшего медленно думать в одиночестве, на супер важное “сделай-или-провалишься” интервью. Интроверты привыкли к давлению.
    – Тараторить ему про корпоративную культуру на высокой скорости и звонким голосом. Его ждут очень весёлые корпоративы, тим билдинг и море общения в весёлом офисе. Ведь он именно общения ищет в углу за монитором.
    – Спрашивать его на старте академическое определение полиморфизма, чтобы он вспомнил все ощущения с экзаменов в универе. Заодно покажем, кто тут главный.
    – Заставлять включать камеру — он точно захочет показать и проявить себя с незнакомыми людьми на первом звонке.
    – Замучали до заикания на вопросах? — теперь время писать код по только что увиденному ТЗ под надзором незнакомого тех директора. Именно в живую, как никогда не будет происходить после.
    – Соискатель прошёл 3 стадии экстравертного ада — самое время узнать об условиях работы в Джоб оффере, который сгорит за N дней. Срочно соглашайся, у HR есть KPI!
    – Не очень понятно, зачем программисту работать именно у нас. Давайте завалим его деньгами и едой? Алчные айтишники только этого и ждут!

    В конечном итоге выигрывает HR — программист нанят. Удовольствие найти проигравших оставлю читателю данного эссе.

    А как можно нанимать программистов без стресса я расскажу завтра.