Русский
Русский
English
Статистика
Реклама

Customer development

Психбольница в руках пациентов, или Инфраструктура как продукт

08.04.2021 16:21:10 | Автор: admin

У бизнес-разработчиков за дедлайнами, сроками, клиентами и большими запусками может складываться впечатление, что инфраструктура выстраивает свой воздушный замок, который далек от того, что происходит в действительности. Захотев это изменить, Алексей Данилов из разработки перешел в команду инфраструктуры последние два года он развивает ее в Яндекс.Вертикали а это Яндекс.Работа, Яндекс.Недвижимость, auto.ru и Яндекс.Объявления.

Особенность Яндекс.Вертикалей ребята одновременно и бизнес-юнит Яндекса, и обычная IT-компания. Благодаря первому, у них есть возможность использовать яндексовую инфраструктуру, но, благодаря второму, разработчики смотрят на весь стек и используют то, что им удобно. Алексей сегодня поделится с нами, как это можно сделать более удобно и ближе к пользователям (в его случае к разработчикам). А также о том, почему на инфраструктуру сейчас надо смотреть как на продукт и какие вызовы это приносит команде, но что это дает в конечном итоге компании.

Infrastructure

Под инфраструктурой я подразумеваю всё, что окружает бизнесовый код и помогает ему от начала разработки фичи до момента ее доставки. Это и базы данных, и балансировка, и мониторинг, и CI с CD. Сюда же относятся особенности разработки/работы, библиотеки, тестирование, бизнес аналитика, бизнес-специфичные возможности и много чего еще. Это как завод, на котором вместо ручного труда автоматизированы все процессы, и результат мы получаем более быстрый и более качественный.:

При этом я рассматриваю инфраструктуру как единую платформу, а не набор разрозненных частей, которые я перечислил выше. И это уместно для компании любого размера. В облаках Amazon Web Services, Yandex Cloud автоматизация может строиться, например, на основе terraform. У вас может быть собственное железо или вы его где-то арендуете и на нем может быть развернут Kubernetes, Nomad, что-то еще. Команда тоже может быть любой от нескольких человек, которые в основном используют bash или terraform, и до сотен, со своими велосипедами.

И тогда возникает вопрос как добиться идеальной инфраструктуры Platform as a Service, который мы реализуем для наших пользователей, и вообще каковы критерии идеальности? Нам не нужно разрабатывать еще один Amazon или Kubernetes поэтому достаточно небольшой и простой системы, но у нас должна быть возможность ее расширения под наши use cases. Например, если у нас есть какие-то особенные АБ-тесты, особенные условия доставки (например, канареечный релиз ) и особенные правила безопасности это как раз то, что должна закрывать инфраструктура.

Ее основой, краеугольным камнем будут минимизация/ускорение разработки, упрощение поддержки и простота использования. Остальные требования понятность, доступность, стабильность и единообразность/распространение практик, а также скрытие низкоуровневых особенностей (чтобы никому не пришлось писать самому конфиг nginx или сложный Kubernetes манифест), техническая поддержка 24*7 и связанность компонентов конечно, тоже имеют место.

Если выполнить их все, ваша инфраструктура будет не только единой платформой или сервисом, но постепенно будет превращаться в продукт, как это случилось у нас.

Infrastructure/Platform as a product (PaaP)

Сначала мы, конечно, смотрели в сторону сторонних приложений. Например, мы серьезно рассматривали Spinnaker от Netflix. Но он написан на Java, а у нас все пишут на Go, и мы не хотели добавлять еще один язык. Во-вторых, он не поддерживает Nomad и Yandex.Cloud. Следовательно, нам пришлось бы его прилично дорабатывать и интегрировать с нашими внутренними особенностями, что практически равно форку. Поэтому мы стали писать свое.

Изначально мы задумывали Shiva как абстракцию над деплоем (в нашем случае над Nomad) и как multicloud. Но сейчас она уже приросла различными системами и интегрируется со всем, что у нас внутри есть:

Основная ее часть представлена в GitHub в виде карты сервисов. Она изменяется посредством пул-реквестов, конфигурирует балансировку, контролирует деплой и различные пайплайны доставки, SOX, PCI DSS и т.д. То есть это одно описание для полноценной работы:

Архитектура Shiva в упрощенном виде выглядит так:

Сервис постоянно развивается и сейчас он уже частично похож на продуктовый: есть БД, вокруг которой построены различные микро-сервисы, есть небольшие legacy-компоненты (компонент Updater и Shiva смотрят в одну базу) и т.д. То есть с технической точки зрения он развивается как обычный бизнесовый сервис.

UI мы реализовали в Telegram, а впоследствии написали WEBовский. Telegram-бот это CLI over Telegram все команды задаются в формате CLI, но дополнены различными контекстными действиями, кнопками и т.д. Нам нравится этот подход, потому что он кросс-платформенный, его легко обновлять и к нему всегда есть доступ. Можно спокойно обновить или откатить свой сервис в случае проблем. А также очень удобный механизм нотификации, когда вы получаете уведомление о начале процесса деплоя прямо в тележку.

И хоть WEB и получился удобным, все равно часть пользователей остается в Telegram. Потому что UX меняется в профессию приходит очень много молодых разработчиков. Мы привыкли к WEB, мы привыкли использовать Telegram-боты и вообще общаться в чате. С другой стороны, мы хоть и думаем сделать CLI с такой же функциональностью, но понимаем, что запросов на это не было.

Экономика

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

Но у инфраструктуры нет доходов, тогда как на этой схеме есть и доходы, и расходы. Доход от инфраструктуры равен 0 это расход компании, а ROI будет отрицательным: сколько инвестиций не вкладывай, они не отбиваются:

Profit = Revenue - Cost = 0 - X

Есть, конечно, плюшки в виде, например, бесконечного LTV (LifeTime Value) то есть наши клиенты от нас никогда не уйдут. Но в целом эта метрика нам не подходила, и мы стали думать в сторону velocity (скорость разработки), потому что ее довольно легко преобразовать в деньги. Например, если мы ускорили разработку на час в неделю, то это нетрудно соотнести со средней зарплатой у 500 разработчиков и получить какой-то видимый профит. Вообще инфраструктура это именно velocity, то есть скорость доставки ценности пользователю. Но у нас это не глобальная метрика, потому что velocity зависит от очень многих факторов. : Если смотреть сверху, то можно выделить:

  • code время написания самой логики ;

  • infrastructure code время написания инфраструктурного кода (код логов, метрик, алертов и т.д.)

  • environments время на настройку переменных окружения, секретов и т.д.;

  • delivery время, затраченное на доставку.

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

В нашем случае мы написали GitHub-бота, который с очень большим спектром валидации проверял эту карту и мгновенно отвечал: либо всё хорошо, либо есть какие-то конфликты с другими картами и сервисами:

Следующим нашим пунктом разработки инфраструктуры как продукта стало внедрение user story.

User story

User story это фундамент любой продуктовой разработки и используется он в любых гибких методологиях идущих от Agile. Это не детальное описание задач давайте прикрутим здесь кнопку, которая будет делать вот это. User story это намерение пользователя: какую проблему пользователь решал, как он пытался её решать, почему он её решал, почему она возникла, и, наконец, как мы можем её решить. Разумеется, из user story выводится очень много различных решений. Но сам User story не является им это основа для решения и инструмент для выявления исходной проблемы.

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

Приведу для примера две наши внутренние истории.

Пример 1. Залипает обработчик Кафки. Чинится только рестартом сервиса. Фикс в пути. Хочется иметь способ быстро перезапустить контейнеры.

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

Пример 2. При обновлении конфигурации хочется перезапустить сервис без указания версии.

Решением стало: /run -l prod -v 1.0.7 my_service -> /run -l prod my_service.

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

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

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

Customer development (сustdev)

Инструмент сложный в продуктовой разработке, но в случае инфраструктуры он очень прост потому что мы разрабатываем новый продукт (фичу, решение или какую-то часть нашей системы) не сразу через код, а через пользователя. Можно даже провести ниндзя-сustdev, находясь в переговорке в ожидании какой-нибудь встречи или попивая кофеечек на кофе-поинт. Да и сам процесс не очень сложный:

  1. Выявляем потенциальную проблему (строим гипотезу), формируем идею или решение, но не внедряем ее, а идем к пользователям, чтобы поговорить с ними об их потребностях/болях/проблемах.

  2. Встречаемся с ними, например, на кофе-поинте или на рабочем месте. Можно пообщаться и в Зуме. И в обсуждении можно обнаружить, что проблема пользователям не важна она не так много времени занимает и не так сильно его напрягает, но зато у него есть более важные проблемы.

  3. Прорабатывая решение вместе, мы получаем либо изначальное успешное решение (если определили проблему верно) или более успешное (поняв из общения, что волнует пользователей) то есть в выигрыше все.

Например, у нас не было истории деплоев, и мы понимали, что нам она нужна. Мы напридумывали очень много сложных вещей, вплоть до того, чтобы в Telegram с помощью пейджинга показывать список последних 10 сервисов и уже думали, как же их спейджить туда-обратно и т.д. Но пообщавшись с разработчиками, мы поняли, как история начинается у большинства из них: они видят на графиках аномалию и м нужно посмотреть, не было ли деплоя не новая ли версия принесла эту аномалию?

Эта история решилась довольно просто. Мы добавили время деплоя в аннотации на Grafana, и теперь видя какую-то аномалию, можно понять, не было ли деплоя, в том числе деплоя зависимых сервисов. Эта история, кстати, ускорила у нас создание WEB UI.

А потом мы пообщались с тимлидами и выяснили, что они это видят совсем по-другому:

Developer: Я вижу по графикам проблемы нужно проверить, не связано ли это с выкаткой новой версии (см. график выше).

Team leads: Нужна возможность посмотреть кто, что, когда и зачем катил в прод:

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

Портреты пользователей и сервисов

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

  • Разработчики: бэкенд, фронтенд и инфраструктура;

  • Team leads;

  • Тестировщики/Автотестировщики;

  • Аналитики;

  • Менеджеры, продукты, руководители.

По сути частичное отражение рабочих позиций :)

А портреты сервисов можно классифицировать по типу, языку или размеру. Первые бывают внутренними (realtime api, back api, async, cron, gateway, и т.д.), DB, внешними, saas и т.д. И они богатая точка роста, потому что это место отказа каких-то инфраструктурных частей. Это и наша точка роста, которую мы рассматриваем в будущем для себя.

Языки разработки мы рассматриваем нечасто, но иногда приходится смотреть: почему эта история возникает, у кого она возникает, потому что, например, у java и node.js бывают небольшие различия в работе, и это приходится учитывать.

По размеру портреты сервисов могут быть: function, microservice, service, monolith, distributed monolith и т.д. И если мы, например, понимаем, что проблематика идет из распределенного монолита, то отказываем в этой истории, потому что у нас хорошей практикой считаются мироксервисы и нашим PaaS мы популяризируем и упрощаем жизнь именно с ними..

Вот для примера портрет сервиса БД. С помощью этой карты ставятся бэкапы, происходит доступ к БД на чтение/запись и т.д. Плюс, сам сервис в свои зависимости прочерчивает эту карту, и мы знаем, что это за карта и от чего она зависит то есть, мы знаем, что сервис А зависит от базы данных В:

Feature request

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

Конечно, у нас есть проблемы:

  • Технически грамотный пользователь может принести уже готовое решение, например: Сделайте такой API, в БД все сохраните, и на этом хватит.

  • Личное знакомство потому что иногда мы отказываем в feature request или говорим, что будем делать по-другому, и возникает небольшой конфликт.

Но есть и решения:

  • Превращать в user story находить проблематику: узнавать, с какой проблемой столкнулся пользователь и как пытался решать;

  • Смотреть на доработку в контексте портретов кто к нам пришел, что за сервис, о чем идет речь;

  • Спорную доработку или ту, в которой мы не уверены, проверять через castdev, потому что все-таки feature request приносит один пользователь и непонятно, насколько это ценный функционал для всех;

  • Механизм голосований/рейтинга это самый мощный инструмент. Он не нов, используется во всех хороших продуктовых разработках, например, в терминале Тинькофф-Инвестиции. У них открытые feature request, где люди открыто голосуют и в итоге в работу идут те, что в топе:

Внутри это также можно легко реализовать, потому что мы работаем в рамках одного issue-трекера. Например, здесь фильтры по нашим feature request:

Из интересного: мы недавно этот вид сделали через наш WEB не таким формальным и увидели, что люди с большей охотой голосуют за идеи то есть это тоже важно:

Механизм feature request очень удобно использовать как часть синергии с пользователем и нам не нужно будет сильно прорабатывать такую историю ведь очень много пользователей проголосовали за нее. Мы можем видеть, кто голосует и это могут быть разные люди, которые поддерживают разные сервисы. Получается в итоге даже небольшой scoring функциональности мы точно понимаем и то, что она нужна, и зачем, и насколько это нужно пользователям. Голосование к тому же может заменить множество внутренних исследований таких, как сustdev.

Roadmap

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

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

Кстати, как получать обратную связь?

  • Тикеты и подписки на них. В нашем случае это самый рабочий инструмент, потому что мы работаем в одной компании, и в одном трекере.

  • Большие посты анонсы. Несколько раз в квартал мы делаем большие анонсы, где рассказываем про всю большую функциональность и опять же получаем фидбэк. Иногда мы получаем негативные отзывы, например: Зачем вы это делаете, если можно взять вот это и то. Тогда мы либо объясняем, либо понимаем, что, может и правда можно реализовать более просто.

  • У нас есть групповой чатик в Telegram/Slack/Microsoft Teams. В основном мы там собираем обратную связь, хотя он работает как инструмент технической поддержки, а также в нем выкатываем нововведения с небольшими инкрементальными релизами.

  • Открытые встречи для вопросов/ответов. Мы пока что провели её только один раз, но результат был неплохой.

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

  • Еще можно использовать индекс потребительской лояльности NPS (Net Promoter Score). Это простые анкеты: насколько вы удовлетворены нашим сервисом, насколько вам удобно базовые вопросы для того, чтобы собрать общую статистику лояльности пользователей. Мы не используем NPS, потому что из чата получаем и критику, и позитив, а остальных записываем как нейтральных пользователей.

MVP

После планирования хочу напомнить про инструмент MVP (Minimum Viable Product). Это известный подход, но в инфраструктуре есть нюансы. Мы, как любой бизнесовый продукт, выкатываем частично недоделанный продукт, где-то не самый удобный, но минимально рабочий. Потому что мы не можем делать 2-3 месяца какую-то историю, выкатить её, получить средний фидбэк и потом еще месяц переделывать:

Henrik KnibergHenrik Kniberg

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

Henrik KnibergHenrik Kniberg

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

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

Overkill

Важно понимать, когда продуктовый подход становится слишком сложным. Бизнесовые команды становятся настолько большими, что состоят из множества людей с разной направленностью и спецификой. Есть product owner, цель и задачи которого выстраивать roadmap и определять, какие из историй делаются. Есть product менеджер, UX-специалисты, разработчики, тестировщики и т.д. Когда большие истории разбиваются только по user story и пытаются делать с добавлением какой-то пользовательской ценности. Всё это очень круто, но сейчас для нашей команды это overkill. Как в принципе, и A/B-тестирование.

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

  • Стараться понять: Зачем? То есть не Разработчик хочет 500 Тб БД, а: Разработчику нужно сохранять информацию о машинках (которую мы никогда не сохраняли) тогда мы сможем работать вместе над одной проблемой пользователя

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

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

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

  • Собирать roadmap и сделать его открытым.

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

  • Нужно много автотестов , так как я все еще не представляю вакансии тестировщика в команде инфраструктуры, как и дизайнера по крайней мере в 2021 году.

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

Итог

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

Подытоживая:

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

  • Относитесь к внутренней инфраструктуре как к единой платформе, как к единому PaaS.

  • Разрабатывайте PaaS как полноценный внутренний продукт.

  • Используйте проверенные простые продуктовые подходы, но только те, которые окажутся простыми. Если тот или иной подход (тот же сustdev или портреты пользователей) кажется сложным, возможно, сейчас их не стоит использовать.

  • Повышайте ценность PaaS (скорость/расходы разработки/поддержки).

  • Создавайте современные интерфейсы.

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

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

Профессиональная конференция DevOpsConf 2021 пройдёт 31 мая и 1 июня этого года в Москве, в отеле Radisson Slavyanskaya. Расписание уже сформировано. На сайте вы можете познакомиться с программой и спикерами.

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

До встречи в оффлайне!

Подробнее..

Почему управлять государством должен продуктовый менеджер?

21.01.2021 22:16:06 | Автор: admin

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

Рыба с головы портится

Что, если проблема человечества не в перенаселении или глобальном потеплении? Не в бедности, неравенстве и даже не в культуре потребления? Вдруг это всё только следствия?

Думаю, единственная настоящая проблема человечества невероятно хреновый менеджмент.

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

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

Феномен стартапов

Интересно, что хреновость менеджмента распределена неравномерно.

Мы наблюдаем тотальную некомпетентность руководства многих государств, но потрясающий профессионализм в успешных IT-стартапах.

Вероятно, причина в том, что государства могут выживать, будучи неэффективными. При обилии природных ресурсов, например. Или если держать население в нищете. А лучше и то, и другое вместе.

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

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

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

Но и совсем без менеджеров не обойтись

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

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

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

  • Хотелки разных пользователей могут противоречить друг другу и даже быть взаимоисключающими.

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

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

  • Наконец, люди легко ведутся на популизм и подвержены стадному инстинкту. Достаточно представить, что им предложили проголосовать за 10-кратное снижение налогов или повышение зарплат. Конечно, большинство эти инициативы с радостью поддержало бы. А в скором времени экономика государства загнулась бы.

Как же заставить всю эту государственную махину работать? Возможно, тут-то и пригодится опыт стартапов. А именно методологии, которые позволяют взвешенно принимать решения и предельно точно оценивать их результаты.

Давайте порассуждаем, какие IT-методологии было бы классно внедрить в управление государством.

Приоритезированный бэклог

Я открываю новостной Telegram-канал и вижу новые законы, один интереснее другого:

  • Депутаты переименовали улицы

  • Депутаты запретили аниме

  • Депутаты запретили критиковать власть

  • Депутаты увеличили штрафы для водителей

  • Депутаты запретили Telegram

То есть вместо системной работы над ключевыми метриками они пытаются лечить отдельные симптомы костылями да заплатками. Цитируя классику: What is going on inside their head?.

Кто-то скажет: Ну, это отдельные скоморохи всякую ерунду предлагают.

Нет.

Во-первых, это не просто предложения, это принятые законы. А значит, за них проголосовало большинство депутатов.

А во-вторых, невозможно представить, чтобы в профессиональной среде кто-то всерьез такое предлагал. Его бы сразу поставили в тупик простейшими вопросами:

  • Что будет считаться успехом и как ты измеришь результат?

  • Как, по-твоему, это будет внедряться и контролироваться?

  • Как это поможет решить ключевые проблемы государства?

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

Но, постойте, почему это кажется таким знакомым?

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

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

Поиск точки роста

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

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

Культура гипотез

Откуда берутся гипотезы в здоровом стартапе?

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

Но чиновники выше этой суеты они просто полагаются на чуйку!

Интуиция не подведет!Интуиция не подведет!

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

Не нужны никакие догадки. Любой продакт вам скажет, как искать релевантные гипотезы. Хотите развивать малый бизнес? Идите к предпринимателям и проводите глубинные интервью. Хотите прокачать туризм? Анализируйте опыт стран, которые на этом собаку съели. Хотите понять, что не так с дорогами? Изучайте статистику ДТП на карте.

Риск-менеджмент

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

Конечно, это сложнее, чем раскатать сразу и на всех.

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

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

Конечно, так быть не должно.

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

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

MVP

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

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

Аналитика и дашборды

Как понять какая партия приносит пользу государству, а какая ему вредит?

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

Какие инструменты стартапов могли бы тут помочь?

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

Что-то в таком духеЧто-то в таком духе

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

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

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

Human-centered design

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

Кхм, извините, в последнем вопросе во мне тоже проснулся депутат.

Типичные постсоветские пейзажи. Автор фотографий: Илья ВарламовТипичные постсоветские пейзажи. Автор фотографий: Илья Варламов

Что было бы со стартапом, который использует неудобный, некрасивый, устаревший дизайн? Вероятно, он потерял бы пользователей, которые ушли бы к конкуренту.

То же самое происходит и в наших странах. Люди заводят трактор и уезжают куда-то, где можно гулять по городу не испытывая хтонического ужаса. Разница только в том, что сменить мессенджер можно за пять минут, а переехать в другую страну для многих непосильная задача.

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

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

Бонус: пьеса Стыдоба. Или как чиновник продуктом управлял

Трагикомедия в 4-х действиях.

Действующие лица: продакт, чиновник, сисадмин, офис-менеджер, народные массы.

Читать

Действие первое

День до голосования на пост Chief Product Officer в крупном стартапе. Пасмурный опен-спейс с запотевшими окнами. Народные массы мнутся в нетерпении. Входит продакт с микрофоном.

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

(Голос из толпы). Ску-у-учно!

Слышится неодобрительный гул толпы.

(Другой голос). Почему печенье заканчивается в четверг, что нам делать в пятницу?

П р о д а к т (сконфуженно). Но Позвольте Ведь вовсе не о том

Н а р о д (в едином порыве). Прочь! Позор! Прочь!

Продакт, понурившись, спешно покидает помещение.

Действие второе

Место действия то же. Входит чиновник в дорогом костюме.

Ч и н о в н и к. Привет, народ! Я вас люблю!

Толпа одобрительно аплодирует.

Ч и н о в н и к (грозя кулаком куда-то в сторону). А этим всем мы покажем! Нечего тут! Ишь!

Слышится радостное улюлюканье из зала.

Ч и н о в н и к. Я так скажу. К черту метрики! На хрен аналитику! Мы должны поднять всем зарплаты! Вдвое!

Толпа восторженно рукоплещет.

Ч и н о в н и к. Вместе мы сделаем наш продукт великим! Снова!

Народ ликует.

О ф и с - м е н е д ж е р (кричит из толпы). Я хочу от тебя детей! Мой голос за тебя!

Действие третье

Серверная. Темно, холодно. Сисадмин пьет чай. Входит чиновник.

Ч и н о в н и к. Хочу победить на выборах. Подшамань мне голоса. Вот бабла тебе принес.

С и с а д м и н. Ок.

Действие четвертое

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

Ч и н о в н и к. Поувольнять, значица, оунеров энтих. Сестру туда поставлю и Димку своего.

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

Ч и н о в н и к. А еще неприкосновенность для руководства. И никакого контроля чтоб за расходованием средств. И обеспечить мне личного водителя, а то несолидно как-то...

Чешет пузо и переворачивается на другой бок. Шезлонг жалобно скрипит.

Ч и н о в н и к. Да! Про бездельников этих не забыть же. Увеличить штрафы за опоздания. И зарплаты порезать! А то ишь повадились!

Занавес

Короче, Склифосовский!

Ключевая мысль, которую я хочу донести, управление государством в нынешнем виде устарело. Модель, где сотни популистов перекрикивают друг друга, а потом голосуют это пережиток прошлого. Сегодня можно принимать обоснованные и взвешенные решения на основе кастдева и аналитики. И это не должны быть решения-законы. Это должны быть решения-гипотезы.

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


P.S. Конечно, я прошелся по верхам просто чтобы проиллюстрировать идею. Но, может быть, у вас есть мысли какие методологии продуктового или проектного менеджмента хорошо зашли бы в госаппарат? Делитесь в комментариях, пожалуйста.

P.P.S. Должен признать: на самом деле весь этот эффективный менеджмент только полумеры. Потому что государством, очевидно, должна управлять нейросеть. Тогда любая система будет работать как следует хоть нейромонархия, хоть нейрокоммунизм.

Подробнее..

Заходят как-то в бар Мандалорец, Генлок и СКМ

24.11.2020 12:18:29 | Автор: admin
Это был обычный летний будний день между первой и второй волнами коронавируса, а это значит, что мы (СКМ Трекинг) могли позволить себе такую роскошь как работа в офисе с полигоном для тестирования нашей гибридной радио-инерциальной системы захвата движений под боком. Тут нам поступил звонок:
узнали про вашу систему трекинга и хотим посмотреть ее в действии, прямо сейчас, так как вечером мы возвращаемся в Питер!
Хоть мы и были в офисе, но профилактические меры не позволяли пропускать кого-либо в здание кроме сотрудников, поэтому мы продолжили телефонный разговор и выработали план действий с учетом карантинных мер.
Заказчиками на том конце провода оказались ребята из Black Anchor Productions Ltd. и Parallax Digital. Они еще раз описали задачу, которую предполагалось решить с помощью нашей системы трекинга (захвата движений), указали желаемые характеристики системы, и мы согласовали первую серию онлайн тестов.
Без онлайна в этом году никуда, и поэтому, прежде чем проводить тесты на их площадке в Питере, заказчику важно было понять способности системы в целом и определить возможность ее интеграции в свои процессы. Поэтому совместно мы определили условия, в которых необходимо протестировать систему и способы визуализации и представления результатов тестирования.

Домашние тесты


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

image

image

image

Направили все результаты теперь как говорится мячик на их стороне. Спустя несколько недель обратной связи и уточнения с нашей стороны требуемых характеристик и условий работы, а с их стороны текущих и потенциальных возможностей и режимов работы нашей системы (без уточняющих тестов с приходом новой информации не обошлось конечно), нам поступило приглашение приехать на офлайн тесты в культурную столицу нашей Родины Санкт-Петербург, он же Питер, он же СПБ, а олды скажут Ленинград. Нам тогда позвонил их генеральный директор Кирилл Андреевич и сказал:
приезжайте завтра в Питер к нам на площадку на неделю, с проживанием поможем
От такого хорошего предложения трудно отказаться, поэтому мы собрали систему, взяли билеты на ночной поезд и рванули в Питер! Я как любитель путешествий вдвойне была рада уехать куда-то дальше 100 км от Москвы после больше чем полугода карантина и изоляции, да еще и в такой красивый город!

Разведка боем


Прибыли на Московский вокзал, где нас встретила и заселила в апартаменты недалеко от площадки заказчика очаровательная Анна Карелкина операционный управляющий компании Black Anchor Productions & Parallax Digital.

image

Мы разместились в нашем новом доме, кто-то из членов нашей команды даже успел немного поспать и к назначенному времени прибыли на площадку. Дальше все как в тумане)
Площадка находится в историческом центре петроградского района, в телецентре АО Телерадиокомпания Петербург полноценный съемочный павильон, в котором проходили настоящие съемки передачи в тот момент как мы туда впервые зашли.

image

image

Огромный павильон 17 * 30 метров с высокими потолками 10 м, которых нам так не хватает на нашем полигоне. Я думаю многие задумывались при просмотре фильмов и телепередач А как же это все снимают? Как всё происходит?. И вот мы попали в теле закулисье и своими глазами увидели, как осуществляется теле- и кино-магия. Поэтому если вы меня спросите о каких-то деталях переговоров в тот первый день я навряд ли смогу что-либо вспомнить, так как с любопытством наблюдала за съемочным процессом.

image

image

Кстати о съемочном процессе. Он был не совсем обычный ведь мы были на площадке не просто у магов, а магов первого уровня! (ну или какая у них там градация). Это новая прорывная технология в области кинопроизводства которая позволяет сократить не только сроки производства, но и его бюджет.

image

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

image

Качественное преимущество новой на нашем рынке технологии, которую сейчас развивает команда Black Anchor Productions & Parallax Digital заключается в эффекте Parallaх изменении видимого положения объекта относительно удалённого фона в зависимости от положения наблюдателя. На применении физических и оптических свойств этого космического эффекта в прямом смысле ведь данный термин пришел к нам из астрономии, где он применяется для измерения расстояния до удалённых объектов (в частности в парсеках) сделали ставку Джон Фавро и компания Disney + и создали с ее помощью сериал Звёздные войны: Мандалорец, который стал настоящим прорывом в киноиндустрии. Как признались руководители это стало одной из вещей, которая вдохновила их начать работу в этом направлении. Именно тогда стало ясно применение прорывных и новейших технологий это настоящее кредо команды Black Anchor, да и как может быть иначе ведь для этого у них есть все необходимые специалисты, штат которых постоянно расширяется, и работает не только на съемочной площадке, но и в других городах России и за рубежом.

image

Для них исследование нового и поиск практического применения собственных программных и аппаратных разработок в видео, event и киноиндустрии одна из приоритетных задач, а дух первооткрывателей стиль жизни.
На данный момент компания Parallax Digital одно из очень немногих творческих и научных объединений, о которых я знаю, делающих столь серьезную ставку на создание собственного софта, думаю именно этот подход и сближает наши команды.

В процессе наблюдения за съемочным процессом сразу стали ясны преимущества такого вида производства контента:
  • Система трекинга камер позволяет отслеживать положение камеры в любой точке зоны покрытия, виртуальная сцена, разработанная на базе игрового движка компании Epic Games Unreal Engine, меняет ракурс, в зависимости от положения оператора, сохраняя естественную глубину и перспективу заднего фона. Вывод изображения с realtime рендерингом осуществляется на LED экраны высокого разрешения, с достаточной частотой светодиодов и интенсивностью свечения до 4000 lm, для того чтобы получать кинореалистичное изображение в качестве до 16K.

  • Весь набор предпродакшн инструментов находится в руках талантливых vfx художников, которые могут создать любую виртуальную сцену и на программном уровне интегрировать посредством osc и dmx протоколов различные AR и CGI объекты, в зависимости от сценария и задач.


image

image

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


image

image

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


image

image

Трекинг камеры


Для того чтобы виртуальная сцена на экране меняла ракурс, вслед за изменением положения объектива в зоне трекинга, необходим так называемый Genlock это метод, при котором видеовыход одного источника (или определенный сигнал) используется для синхронизации других источников изображения вместе. Это помогает обеспечить совпадение сигналов во времени в точке объединения или переключения. Для этого необходимо знать данные о перемещении камеры и направлять их в режиме реального времени на сервер для синхронизации с виртуальной сценой. Тут главными героями становятся системы трекинга. Про особенности условий работы оптических и инерциальных систем я упоминала в своей прошлой статье Замокапить в экстремальных условиях или как мы принимали участие в шоу ДОЗОР, однако здесь стоит немного другая задача нежели чем разовый мокап актеров система должна отслеживать перемещения камеры на всем съемочном процессе и практически при любых условиях съемки. Идеальная трекинговая система для такого случая универсальная, надежная, точная и пуленепробиваемая!
Специалисты из Black Anchor prod. протестировали все доступные на рынке решения по трекингу, однако универсальной и полностью подходящий под наибольшее число сценариев и условий не нашли, поэтому в данный момент используют разные системы, выбирая нужную исходя из условий, в которых она должна работать не только стабильно, но и с субмиллиметровой точностью. А это значит, что открывается большая возможность быть первыми кто сделает решение наиболее универсальное и подходящее для задач трекинга камеры в кинопроизводстве!
С большей долей вероятности такая задача посильна гибридной системе трекинга (объединяющей 2 или более систем), так как в таком случае можно подчеркнуть все достоинства и свести к минимуму все недостатки, которыми обладают системы в отдельности.
Именно такое гибридное решение и разрабатывает наша команда СКМ Трекинг! С помощью нашего софта мы улучшаем и объединяем данные, которые присылают радио-инерциальные модули. Таким образом наш софт борется с систематической ошибкой инерциальной системы и наличием шумовой составляющей сверхширокополосных радио модулей (СШП). Для этого в нашем арсенале имеются нелинейный алгоритмы комплексной фильтрации на базе собственных моделей движения. Радиосистема реализует алгоритм Time Difference of Arrival (TDoA). Его суть заключается в следующем. Часть модулей, называемые здесь якорями, располагается неподвижно по периметру зоны с известными координатами, синхронизируются между собой и излучают периодический сигнал. На людей, их части тела или другие предметы, положение и ориентацию которых необходимо отслеживать, крепятся модули, называемые маркерами, которые работают исключительно на прием данных сигналов. Т.к. моменты излучения сигналов тегу неизвестные, он измеряет разности моментов времени их приемов. Такой подход позволяет обеспечить неограниченное число тегов, а большая дальность их работы большую рабочую зону.

Теория, конечно, хорошо, но что же на практике?

Итак, вернемся на площадку!


Мы познакомились с основными членами команды Black Anchor prod. и определили план тестов на первый день с учетом съемочного процесса. Нам выделили место на площадке где мы можем расположить себя, наши ПК и систему полноценное рабочее место!

image

В первый день мы смогли продемонстрировать работу системы на небольшой площади с выводом результатов на экран нашего ноутбука, а также проверить нет ли взаимного влияния нашей системы с оборудованием на площадке на работу нашей системы оборудование не оказало существенного влияния, также как и наша система на оборудование. Весь секрет заключен в СШП радио модулях, которые работают на выделенной частоте в СВЧ диапазоне. Кстати, уже сейчас в мобильные устройства нового поколения включают СШП модуль, что открывает большие возможности по передачи данных и т.п., ну а мы уже знаем и умеем работать с СШП).

image

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

image

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

image

image

В процессе тестов мы своими глазами увидели весь рабочий процесс, обсудили и посмотрели текущие решения ребят самая что ни на есть разведка боем и каст дев в поле, чего же еще можно пожелать?
image

И это только начало! А дальше


Команда разработчиков посветила нас в свои дальнейшие планы: в дальнейшем приоритет будет смещаться в сторону создания собственного аппаратного и программного комплексов, который позволит произвести развертывание системы на любой площадке, и комплекс будет полностью мобилен, и позволит работать без потери качества и точности трекинговых систем. Анна, провожая нас, сказала, что в более широком смысле, дальнейший вектор развития компании будет определяться в зависимости от потребностей рынка и киноиндустрии в целом и намекнула, что свои продвижения в этом направлении они намеренны показать в том числе и на примере собственного короткометражного фильма работы над его производством уже закончены остался самый крайний этап постпродакш но как мы уже поняли это не займет много времени технология позволяет видеть почти финальную картинку уже в процессе ее съемки, что пожалуй еще одна важная приятная и крутая особенность.
Отдельное спасибо команде Black Anchor prod. за действительно теплый прием (в том числе и культурную программу), возможность увидеть боли клиента и понять какие параметры и характеристики системы необходимо доработать для кейса трекинга камеры для задач виртуального кинопроизводства.

image

В итоге мы определили наши следующие шаги: дорабатываем определенные параметры и возвращаемся на Питерскую площадку для ее покорения!

To be continued

P. S.

Случайности не случайны? Сейчас как раз дочитываю книгу Виктора Пелевина (кстати, тоже закончил НИУ МЭИ, как и наша команда) S.N.U.F.F., так вот там в пост апокалиптическом обществе описываются технологии, с помощью которых в небольшом помещении можно с помощью 3D экранов и других технологий воссоздать длинную аллею, с набережной и бризом, так что это сложно отличить от реальности. И вот перед нами технологии Black Anchor prod., которые демонстрируют нам что подобное будущее (его хорошие стороны) совсем близко!
Подробнее..

Как сделать интеллектуального чат-бота для проведения опросовинтервью

24.03.2021 10:15:26 | Автор: admin

В современном мире всё большую популярность приобретает методика под названием customer development для тестирования идей и гипотез о будущем продукте. Методику придумал "крёстный отец Кремниевой долины" Стив Бланк.
Одним из числа сильных инструментов в "разработке клиентов" является интервью, когда вы можете побеседовать с респондентом. Однако им не всегда можно воспользоваться ввиду разных причин, которые условно можно свести к объёму бюджета и имеющемуся времени. Но во многих ситуациях можно воспользоваться опросом. Причём опросом, который можно автоматизировать за счёт применения чат-бота и нейронной сети для определения смысла слов, которые написал респондент в ответ на заданный вопрос.

В этой статье сконцентрируюсь на алгоритме работы чат-бот для проведения опроса. Как сделать чат-бота для VK писал в отдельной статье на Хабре. Использовал: Python, MySQL, API VK и готовую нейросеть от RusVectores.

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

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

Нейросеть для понимания смысла текста, вводимого пользователем

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

В данном решении была использована готовая нейросеть от сервиса RusVectores, обученная на корпусе НКРЯ с использованием алгоритма word2vec CBOW с длиной вектора 300.

НКРЯ это совокупность русскоязычных текстов, Национальный Корпус Русского Языкав полном объёме. Содержит 270 миллионов слов, объём словаря 189 193 слова.

Word2vec CBOW алгоритм, благодаря которому слово на естественном языке представляется в виде числового вектора. Т.е. определяет координату слова в смысловом пространстве. CBOW это аббревиатура Continuous Bag of Words. Она обозначает алгоритм, который есть в word2vec. Данный алгоритм называют моделью мешка слов, он предсказывает слово по контексту. Ещё один алгоритм в word2vec - Skip-gram предсказывает контекст по слову.

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

Более подробно о word2vec можно почитать в статье "Немного про word2vec: полезная теория".

О векторном представлении слов (эмбеддинге) хорошо и с примерами описано в статье "Что такое эмбеддинги и как они помогают машинам понимать тексты".

Представление слова в виде вектора позволяет оценивать его смысловую близость с другими словами, так же представленными в виде вектора. Для оценки близости слов можно вычислить косинус угла между их векторами. Чем ближе к 1 будет косинус угла между векторами слов, тем они ближе по смыслу. Единице будет соответствовать косинус угла 0 градусов, т.е. когда векторы слов совпадают.

Чтобы создать такой набор векторов почти для 200 000 слов и постоянно иметь к ним доступ, нужно располагать вычислительными мощностями. Т.к. у меня таких мощностей нет, я воспользовался доступным онлайн сервисом RusVectores.

База данных для хранения вопросов

Для проведения опроса я подготовил табличку с вопросами и разместил её в базе данных MySQL. Как видно из рисунка ниже, вопросы имеют ответвления, похожие на древовидную структуру или структуру графа.

Структура вопросовСтруктура вопросов

В базе данных таблица с вопросами выглядит так (фрагмент):

Фрагмент таблицы в БД с вопросамиФрагмент таблицы в БД с вопросами

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

Описание алгоритма работы чат-бота

Начало опроса

По договорённости с пользователем он заходит на страницу сообщества в ВК и инициирует диалог, нажав кнопку Сообщение.

Бот здоровается и спрашивает разрешения начать опрос. Текст приветствия задавал в разделе "Управление" "Сообщения" на странице сообщества в ВК.

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

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

фрагменты кода из bot_methods.py
модуля, в котором реализованы все методы бота

def _identify_phrase(user_id, user_message):    """    identify start question or greeting    return number of phrase in database    """    # identification variable, on start set "I don't know"    identi = 'I dont know'    # find in database current position in conversation between user and chatbot    identi = get_current_position_in_conversation(user_id)    if identi != 'err':        # if the conversation has just begun        if identi == '0':            # define greetings            similarity = _get_similarity(user_message, u'привет здравствуйте добрый')            if similarity > 0.5:                identi = "greetings"            else:                # define start interview or not                identi = _start_or_not(user_message)        # if the conversation continues        elif identi == '1':            # define start interview or not            identi = _start_or_not(user_message)        else:            pass                return identi

Вначале определим возможность начать опрос исходя из ответа пользователя с помощью метода _start_or_not():

def _start_or_not(user_message):    """    define <identi>: start or don't start interview    """    if user_message != 'старт' or user_message != 'Старт':        _identi = 'I dont know'        # define if user agree to start interview        start = _get_similarity(user_message, u'да можем можно начинай ок')        # define if user don't agree to start interview        later = _get_similarity(user_message, u'нет позже потом завтра')        if start > later and start > 0.15:            _identi = 'start'        elif later > start and later > 0.15:            _identi = 'later'    else:        _identi = "start"    return _identi

Если пользователь решил сначала поприветствовать бота, то нужно понять это и поприветствовать в ответ. Для этого проверим на смысловую близость сообщения от пользователя со словами приветствия с помощью метода _get_similarity(). Данный метод будет использоваться и далее для определения смысловой близости сообщений пользователя.

def _get_similarity(text1, text2):    """    Function return similarity between text1 and text2    text1 - user message    text2 - key words    """    text1.strip()  # delete empty space on start and end of string    text2.strip()    text1_words = text1.split(' ')    text2_words = text2.split(' ')    similarity = 0.0 # init variable    try:        for word1 in text1_words:            if word1 != '':                for word2 in text2_words:                    if word2 != '':                        # prepare url for request to API rusvectores.org                        # url example https://rusvectores.org/ruscorpora_upos_cbow_300_20_2019/дело__папка/api/similarity/                        url = '/'.join(['https://rusvectores.org/ruscorpora_upos_cbow_300_20_2019',                                         word1 + '__' + word2, 'api', 'similarity/'])                        # GET request to API rusvectores.org                        r = requests.get(url, stream=True)                        # sum similarity of couple of words                        similarity = similarity + float(r.text.split('\t')[0])    except Exception as e:        log_exception = str(e)    # average similarity    similarity = similarity/len(text2_words)    # return similarity between text1 and text2    return similarity

Переменная similarity содержит числовое обозначение смысловой близость фраз text1 и text2. Чем ближе similarity к 1, тем ближе фразы по смыслу.

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

фрагмент кода из mysqldb_methods.py
модуля, в котором реализованы все методы для работы с MySQL базой данных

def get_current_position_in_conversation(user_id):    """    find in database current position in conversation between user and chatbot    using in bot_methods.py    """    try:        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD,                                db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')        cursor = conn.cursor()        query = "SELECT `question_num` FROM `conversations` WHERE `user_id`=%(user_id)s LIMIT 1"        cursor.execute(query, {'user_id': user_id})        result = cursor.fetchone()        if result is None:            identi = '0'        else:            identi = result[0]        conn.close()    except Exception as e:        identi = 'err'        return identi

Таким образом мы обрабатываем три сценария взаимодействия с чат-ботом:
- старт опроса (понимаем согласен пользователь начать опрос или нет с помощью функции _start_or_not()),
- обмен приветствиями, если пользователь поздоровался (понимаем по смысловой близости к словам приветствия с помощью функции _get_similarity());
- движение по структуре вопросов с помощью функции get_current_position_in_conversation() для определения текущего положения в структуре вопросов.

Давайте рассмотрим движение по структуре вопросов более подробно.

Стоп-слова

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

stop_words = [u'а',u'большой',u'бы',u'быть',u'в',u'весь',u'вот',u'всей',u'вы',u'говорить',u'год',u'для',u'до',u'еще',u'если',u'же',u'знать',u'и',u'из',u'или',u'к',u'как',u'который',u'мочь',u'мы',u'мне',u'на',u'наш',u'него',u'нее',u'них',u'но',u'о',u'один',u'она',u'они',u'оно',u'оный',u'от',u'ото',u'по',u'с',u'свой',u'себя',u'сказать',u'та',u'такой',u'такое',u'только',u'тот',u'ты',u'то',u'у',u'что',u'это',u'этот',u'я']stop_characters = [u'.',u',',u' - ',u'- ',u' -',u':',u';',u'?',u'',u'!',u'_',u'(',u')',u'=',u'+',u"#",u'$',u'@',u'%',u'*',u'   ',u'<',u'>','1','2','3','4','5','6','7','8','9','0']

С помощью метода _clear_text() очищаю предложение от стоп-слов:

Движение по структуре вопросов

Для определения в каком направлении опроса двигаться исходя из ответов респондента воспользуемся функцией _define_conversation_way():

def _define_conversation_way(user_message, identi):    """    define in which way we are goin to?    """    # all questions, unless  3 has two ways: 'yes' (positive) or 'no' (negative)    if identi != '3' and identi != '6':        yes = _get_similarity(user_message, u'да заказывал просить')        no = _get_similarity(user_message, u'нет никогда')    elif identi == '6':        # the question number 6 has different ways: 'delivery' or 'self-delivery'        yes = _get_similarity(user_message, u'заказываю доставку')        no = _get_similarity(user_message, u'еду сам ищу аналог')    elif identi == '3':        # the question number 3 has different ways: 'from store' or 'delivery'        yes = _get_similarity(user_message, u'магазин сам')        no = _get_similarity(user_message, u'доставка почта все перечисленное курьер дом')    if yes > no and yes > 0.15:        _way = 'yes'    elif no > yes and no > 0.15:        _way = 'no'    else:        _way = 'I dont know'    return _way

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

bot_methods.py
полный код модуля, в котором реализованы все методы бота

# -*- coding: utf-8 -*-"""Bot methods.Realizes all what bot can do."3. Использование API сервиса RusVectores"https://github.com/akutuzov/webvectors/blob/master/preprocessing/rusvectores_tutorial.ipynb"""import re  # for work with regular expressionsimport requests  # for using HTTP requestsfrom bot_config import stop_wordsfrom bot_config import stop_charactersfrom mysqldb_methods import get_current_position_in_conversationfrom mysqldb_methods import get_question_from_DBfrom mysqldb_methods import write_current_question_number_for_userdef get_bot_answer(user_id, user_message):    """    using in views.py    make answer to user    """    answer = ''    # delete stop-words and punctuation characters in sentence    user_message = _clear_text(user_message)    # identify what to do: start or continue conversation    identi = _identify_phrase(user_id, user_message)    if identi == 'greetings':        answer = get_question_from_DB('1')        write_current_question_number_for_user(user_id, '1')    elif identi == 'start':        answer = get_question_from_DB('2')        write_current_question_number_for_user(user_id, '2')    elif identi == 'later':        answer = "Когда у вас будет возможность пройти интервью напишите мне 'старт'."    elif identi == 'I dont know':        answer = "Я не совсем вас понимаю...\nУточните, пожалуйста."    elif identi == 'end':        answer = "Спасибо за ваше участие в интервью!"    else:        # if top-level question: 1, 2 or 3 etc.        if len(identi) == 1:            # define in which way we are goin to?            way = _define_conversation_way(user_message, identi)            if way == 'yes' or way == 'no':                if way == 'yes':                    # going to positive way                    question_num = '.'.join([identi,'1','1'])                if way == 'no':                    # going to negative way                    question_num = '.'.join([identi,'2','1'])                answer = get_question_from_DB(question_num)                if answer != 'None':                    write_current_question_number_for_user(user_id, question_num)                else:                    question_num = str(int(identi) + 1)                    answer = get_question_from_DB(question_num)                    write_current_question_number_for_user(user_id, question_num)            else:                # if way='I dont know'                answer = "Я не совсем вас понимаю...\nУточните, пожалуйста."        else:            # if subquestion: e.g. identi=2.1.1 or 3.2.2 etc.            identi_numbers = identi.split('.')            next_num = str(int(identi_numbers[2]) + 1)            question_num = '.'.join([identi_numbers[0],identi_numbers[1],next_num])            answer = get_question_from_DB(question_num)            # if we get end of subquestions in this top-level-question            if answer == 'None':                # going to the next top-level question                question_num = str(int(identi_numbers[0]) + 1)                # checking that the question is the last                if _is_the_last_question(question_num):                    answer = get_question_from_DB(question_num)                    question_num = 'end'                else:                    # is not the last question                    answer = get_question_from_DB(question_num)                        write_current_question_number_for_user(user_id, question_num)            return answerdef _is_the_last_question(question_num):    """    define is the last question?    by the condition (len(identi) == 1) of the function "get_bot_answer"    question_num has lenght 1    """    is_the_last = True    question_num = str(int(question_num) + 1)    question = get_question_from_DB(question_num)    if question != 'None':        is_the_last = False    return is_the_lastdef _define_conversation_way(user_message, identi):    """    define in which way we are goin to?    """    # all questions, unless  3 has two ways: 'yes' (positive) or 'no' (negative)    if identi != '3' and identi != '6':        yes = _get_similarity(user_message, u'да заказывал просить')        no = _get_similarity(user_message, u'нет никогда')    elif identi == '6':        # the question number 6 has different ways: 'delivery' or 'self-delivery'        yes = _get_similarity(user_message, u'заказываю доставку')        no = _get_similarity(user_message, u'еду сам ищу аналог')    elif identi == '3':        # the question number 3 has different ways: 'from store' or 'delivery'        yes = _get_similarity(user_message, u'магазин сам')        no = _get_similarity(user_message, u'доставка почта все перечисленное курьер дом')    if yes > no and yes > 0.15:        _way = 'yes'    elif no > yes and no > 0.15:        _way = 'no'    else:        _way = 'I dont know'    return _waydef _identify_phrase(user_id, user_message):    """    identify start question or greeting    return number of phrase in database    """    # identification variable, on start set "I don't know"    identi = 'I dont know'    # find in database current position in conversation between user and chatbot    identi = get_current_position_in_conversation(user_id)    if identi != 'err':        # if the conversation has just begun        if identi == '0':            # define greetings            similarity = _get_similarity(user_message, u'привет здравствуйте добрый')            if similarity > 0.5:                identi = "greetings"            else:                # define start interview or not                identi = _start_or_not(user_message)        # if the conversation continues        elif identi == '1':            # define start interview or not            identi = _start_or_not(user_message)        else:            pass                return identidef _start_or_not(user_message):    """    define <identi>: start or don't start interview    """    if user_message != 'старт' or user_message != 'Старт':        _identi = 'I dont know'        # define if user agree to start interview        start = _get_similarity(user_message, u'да можем можно начинай ок')        # define if user don't agree to start interview        later = _get_similarity(user_message, u'нет позже потом завтра')        if start > later and start > 0.15:            _identi = 'start'        elif later > start and later > 0.15:            _identi = 'later'    else:        _identi = "start"    return _identidef _clear_text(sentence):    """    delete stop-words and punctuation characters in sentence    """    try:        # sentence to low-case        sentence = sentence.lower()        # delete stop-characters        for char in stop_characters:            sentence = sentence.replace(char, '')        # delete stop-words        words_of_sentence = sentence.split(' ')        result = ''        for word in words_of_sentence:            if word not in stop_words:                result = result + ' ' + word    except Exception as e:        result = str(e)    return resultdef _get_similarity(text1, text2):    """    Function return similarity between text1 and text2    :param text1: user message    :param text2: key words    """    text1.strip()  # delete empty space on start and end of string    text2.strip()    text1_words = text1.split(' ')    text2_words = text2.split(' ')    similarity = 0.0 # init variable    try:        for word1 in text1_words:            if word1 != '':                for word2 in text2_words:                    if word2 != '':                        # prepare url for request to API rusvectores.org                        # url example http://rusvectores.org/araneum_none_fasttextcbow_300_5_2018/дело__папка/api/similarity/                        url = '/'.join(['http://rusvectores.org/araneum_none_fasttextcbow_300_5_2018',                                         word1 + '__' + word2, 'api', 'similarity/'])                        # GET request to API rusvectores.org                        r = requests.get(url, stream=True)                        # sum similarity of couple of words                        similarity = similarity + float(r.text.split('\t')[0])    except Exception as e:        log_exception = str(e)    # average similarity    similarity = similarity/len(text2_words)    # return similarity between text1 and text2    return similarity

Как видно из кода, с помощью метода write_current_question_number_for_user() бот сохраняет в базу данных текущую позицию в диалоге с пользователем. Это необходимо для того, чтобы бот понимал какой следующий вопрос нужно задать респонденту.
Функция get_question_from_DB() возвращает текст вопроса из базы данных для того, чтобы бот задал его в чате.

Для удобства приведу полный код модуля с методами для работы с базой данных:

mysqldb_methods.py
полный код модуля, в котором реализованы все методы для работы с MySQL базой данных

# -*- coding: utf-8 -*-"""Methods for work with MySQL database."""import MySQLdb  # before using it do in ssh: pip install mysqlclient""" import configuration variables for connect to MySQL database:"""from mysqldb_config import HOSTfrom mysqldb_config import USERfrom mysqldb_config import PASSWORDfrom mysqldb_config import DATABASEdef write_current_question_number_for_user(user_id, question_num):    """    write question number to database for this user    """    try:        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD,                                db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')        cursor = conn.cursor()        if question_num == '2':            query = (                "INSERT INTO `conversations`(`user_id`, `question_num`) "                "VALUES (%s, %s)"            )            data = (user_id, question_num)        else:            query = (                "UPDATE `conversations` "                "SET `question_num`=%s "                "WHERE `user_id`=%s "            )            data = (question_num, user_id)        cursor.execute(query,data)        conn.commit()  # commit transaction        conn.close()    except Exception as e:        exception = str(e)def get_current_position_in_conversation(user_id):    """    find in database current position in conversation between user and chatbot    using in bot_methods.py    """    try:        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD,                                db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')        cursor = conn.cursor()        query = "SELECT `question_num` FROM `conversations` WHERE `user_id`=%(user_id)s LIMIT 1"        cursor.execute(query, {'user_id': user_id})        result = cursor.fetchone()        if result is None:            identi = '0'        else:            identi = result[0]        conn.close()    except Exception as e:        identi = 'err'        return identidef get_question_from_DB(question_num):    """    return question text from database    """    try:        conn = MySQLdb.connect(host=HOST, user=USER, passwd=PASSWORD,                                db=DATABASE, charset='utf8', init_command='SET NAMES UTF8')        cursor = conn.cursor()        query = "SELECT `question_text` FROM `questions` WHERE `question_num`=%(num)s LIMIT 1"        cursor.execute(query, {'num': question_num})        result = cursor.fetchone()        if result is not None:            question_text = result[0]        else:            question_text = "None"        conn.close()    except Exception as e:        question_text = str(e)        return question_text

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

скрипт views.py
"точка входа" для приёма сообщений пользователя и отправки ответов бота в чат

# -*- coding: utf-8 -*-from __future__ import unicode_literalsimport jsonimport threading  # for async executing tasks with VK APIimport vk  # vk is library from VKfrom django.views.decorators.csrf import csrf_exemptfrom django.shortcuts import renderfrom django.http import HttpResponsefrom bot_config import *  # import token, confirmation_token and over constants from bot_config.pyfrom bot_methods import get_bot_answer@csrf_exempt  # exempt index() function from built-in Django protectiondef index(request):  # requested url    if (request.method == "POST"):        data = json.loads(request.body)  # take POST request from auto-generated variable <request.body> in json format        if (data['secret'] == secret_key):  # if json request contain secret key and it's equal my secret key            if (data['type'] == 'confirmation'):  # if VK server request confirmation                """                For confirmation my server (webhook) it must return                confirmation token, which issuing in administration web-panel                your public group in vk.com.                Using <content_type="text/plain"> in HttpResponse function allows you                response only plain text, without any format symbols.                Parameter <status=200> response to VK server as VK want.                """                # confirmation_token from bot_config.py                return HttpResponse(confirmation_token,                                     content_type="text/plain",                                     status=200)            if (data['type'] == 'message_new'):  # if VK server send a message                # t - is new thread to async execute answer_to_message()                t = threading.Thread(target=_answer_to_message, args=(data,))                t.start()                return HttpResponse('ok', content_type="text/plain", status=200)    else:        return HttpResponse('see you :)')# send anser to user messagedef _answer_to_message(data):    session = vk.Session()    api = vk.API(session, v=5.5)    user_id = data['object']['user_id']    user_message = data['object']['body']    # get bot answer    answer = get_bot_answer(user_id, user_message)    # token from bot_config.py    api.messages.send(access_token = token, user_id = str(user_id), message = answer)

О том как устроена структура файлов приложения, его настройка описывал в подробностях в отдельной статье на Хабре.

Успехов!

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

Подробнее..

Из песочницы Легенды и мифы о Customer Development

01.10.2020 14:20:35 | Автор: admin

Легенды и мифы о Customer Development


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



К написанию этой статьи меня подтолкнул мой хороший друг и продуктолог Алексей Моров, с которым мы обсуждали его недавнее интервью с венчурным капиталистом Игорем Шойфотом на тему бесплатного бизнес-образования для стартапов. Выяснилось, что большинство основателей стартапов ранних стадий интересуется методологией Customer Development, ну и я сначала начал гуглить, что там новенького в этой теме, потом пришел в ужас, а затем понял, что придется самому жечь глаголом всю эту ересь и сердца фаундеров. Не буду указывать источники этой чуши, все они в топ-10 поисковой выдачи Яндекса по запросу: custdev что такое. Сразу оговорюсь, есть и достойные материалы, но их меньшинство.

Об авторах этой статьи и мифов


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

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

Но, приступим. Вот мой топ-5 легенд и мифов о CustDev, которые я прочел в рунете. Мы с вами их развенчаем в лучших традициях Разрушителей легенд и, обещаю, извлечем практическую пользу.

Легенда 1. Чтобы проверить гипотезу, надо провести интервью


Говорят, что лучше всего, чтоб интервью было глубинное. Вам даже предложат скрипты интервью, которые кто-то придумал, прочитав полкниги Роберта Фицпатрика Спроси маму, которую украли на флибусте. Запомните, на интервью мы идём собирать данные, артефакты, конкретные сведения, которые касаются обстоятельств и опыта конкретного пользователя (включая эмоциональный опыт) в ситуации, где ваш продукт, по идее, мог бы оказаться полезен. Тут в меня должны лететь камни: а как же гипотезы? Отвечаю: именно в ходе интервью они и рождаются, но мы не говорим об этом, мы задаём вопросы и фиксируем услышанное и иногда побои, если не умеем задавать вопросы.

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

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

Мне казалось, что у смартфонов быстро сядут батарейки от использования моего приложения, а оказалось, что охотники отрубают мобильный интернет (все равно нет покрытия сети) и идут по gps, просто включив уведомления о пересечении границ угодий. Так мобильник работает дольше гарминов, конкуренции с которыми я боялся как огня. Вывод: гипотеза рождается в ходе ваших интервью и их анализа.

Легенда 2. Для подтверждения гипотезы надо провести серию из 8, 16, 30, 50 интервью


Вот а фак! А когда же тогда подтверждается гипотеза, если в интервью она только рождается?! Надеюсь, примерно так вы думаете сейчас, поняв, что те статьи, которые вы успели прочитать про каздев оказались шлаком. Спокойствие, я был на вашем месте, с этим можно жить, но только если вы не автор тех статей.

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

Справедливости ради, замечу, некоторые авторы все же пишут, что для подтверждения гипотезы надо провести несколько интервью, что вообще-то тоже является чушью. В тех самых статьях, а я, когда писал эту статью, прочел, все что смог найти, указываются цифры типа 8, встречаются 16, 30, 50 и ещё какие-то, которые сами по себе никакого значения не имеют, ведь ни в одной статье статье я не встретил описания аудитории, ее характеристик и размера, а также отношения всего этого к числу интервью, которые надо провести. Вот почему все эти цифры нельзя брать за ориентир: у вас своё решение, у которого есть свой рынок, который вы должны бы изучить и знать цифры. Это кем надо быть чтобы пойти интервьюировать 16 клиентов на рынке, где этих самых клиентов, например, всего 7. А в поисковой выдаче Яндекса, статья с такими рекомендациями мне выпала первой, браво маркетологи, поклон SEO! Если вам предлагают любое конкретное число интервью в статье, не задав вопроса о вашей аудитории (сколько у вас потенциальных клиентов, до скольких из них вы реально можете дотянуться и т.д.), а мне при прочтении всех тех статей, ни разу никто не позвонил с этими вопросами, то смело листайте ленту до котиков, они хотя б милые.
Пример. В моем российском сегменте охотничьего рынка, где охотников немного меньше 3 млн человек, со смартфонами из которых 70%, а умеющих ими пользоваться и того меньше, и так далее по воронке, целевой рынок 1 млн охотников. Поскольку, как видно, этот миллион человек хоть и весьма специфичен, но остаётся при этом миллионом, встаёт вопрос о размере и репрезентативности выборки. Мы сузили возрастной диапазон аудитории, получили совсем уж ядерную аудиторию 25-35 лет, которые со смартфонами на ты, в 600 тысяч человек. Так вот, рецепт в том, что для очень специфичной аудитории репрезентативной выборкой будет сравнительно небольшое число респондентов, в нашем случае, достаточно 1%, То есть 6 тысяч человек, которых мне надо бы проинтервьюировать, чтоб после анализа подтвердить или опровергнуть мою гипотезу!

Ни одно-единственное, пусть и глубинное, интервью, ни 5, или 10, или 30, или даже 50. А столько, сколько надо для вашего конкретного рынка. Вывод: для подтверждения гипотезы надо сделать выводы по результатам анализа серии интервью репрезентативной выборки.

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

Легенда 3. Все надо делать по правилам


Конечно, надо, только вот авторы этого постулата за деревьями леса не видят, так как изучали CustDev по статьям таких же копирайтеров, как они сами. Тут важно обратиться к сути самого подхода, которую описал Стив Бланк в своей книге Четыре шага к озарению: Стратегии создания успешных стартапов. Это, к слову, автор методики развития потребителя. Согласно его концепции, продукт обязательно должен решать проблему клиента. Сначала выявляется проблема, потом разрабатывается продукт, а не наоборот. Нужно это, чтоб не слить бюджет на пиление продукта, пока не убедишься, что он решает проблему. Это часть методологии Lean StartUp. Бережливость! Давайте сразу к примеру.

На моем примере про охотников, дело было так, где-то на 80-м интервью я убедился, что 70% моих респондентов говорит одно и тоже в отношении гипотезы, как про ненужность собственно карт и важность границ угодий, так и про батарейку с отсутствием сети и некоторые другие нюансы. Напомню, что дело было после 80-го интервью и мы потихоньку свернули этот этап, поскольку точности он не прибавлял, а ресурсы потреблять продолжал. На всякий случай отмечу, что для чистоты эксперимента я звонил в разные города и села разных регионов России, Беларуси и Казахстана.

Тут вы мне скажете, как же так, ты ведь сам только что сказал, что нужно столько, сколько нужно! Повторяю: бережливость. Мы не зря с вами строили качественную репрезентативную выборку. Именно качественная выборка позволяет сделать вот что:

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

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

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

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

В моем примере, я звонил в разные города и села разных регионов России, Беларуси и Казахстана, то есть на мое исследование не влияли факты проживания в указанных странах в городах/селах.

Легенда 4. CustDev это про создание продукта


Кастомер девелопмент (англ. Customer development) (сокращенно custdev) это тестирование идеи или прототипа будущего продукта на потенциальных потребителях. Примерно такое определение дают во всех статьях, просто копируя определение у авторов. Тут трудно поспорить и я не буду этого делать. Скажу больше, я с этим полностью согласен. Но, друзья мои, книжки надо читать дальше второй главы, если в их всего шесть, мы же строим бизнес, а не в 5-м классе забили на Каштанку!

Предлагаю следующее: дочитать до Стива нашего Бланка до конца и взглянуть несколько шире, прежде всего на свой продукт. Задача основателя вырастить компанию быстро и успешно в условиях, когда даже ресурсы не все решают. Важно даже не иметь лучший продукт, его не было, например, у Facebook. Не рассматривайте продукт в отрыве от рынка и конкурентов, особенно в плане позиционирования и дистрибьюции. Здесь можно и нужно, да простит меня Стив Бланк, каздевить. Мой пример с Картой охотника тут не особо нагляден, поскольку мы сразу обеспечивали пользователя лучшими картами и предлагали наибольший охват карт, хотя и отставали по некоторым фичам от конкурентов. Поэтому обратимся к столпам.

Facebook был не первой социальной сетью, уже существовал Friendster. Но компания Цукерберга первой поняла преимущества позиционирования, а может им просто повезло, я не знаю, но это стоило бы узнать с помощью CustDev уже тогда. Компания сфокусировалась на создании студенческого сообщества Гарварда, а затем и других ВУЗов сначала в Бостоне и далее по всей стране. Потом компания первой предоставила возможность бесплатно хранить фото на своей площадке и забрала аудиторию у сервисов, которые на этом специализировались, потом появился сервис приложений и так далее, и так далее. Интерфейс Facebook до сих пор заставляет пользователя блуждать по разделам, а конкуренты давно отстали, хоть и были лучше, первее и больше. Цукерберг осознал свое силу конкурентного преимущества и строил стратегию именно на этих преимуществах сначала четкое позиционирование для студентов, затем на бесплатное хранение фото и т.д.

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

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

И тут, оп-па, я же тоже это делаю, вот вам пример из жизни.

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

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

Каздевьте не только в направлении продукта, но и при поиске места на рынке.

Легенда 5. CustDev это про создание продукта (вид сбоку)


Привожу определение CustDev еще из одной статьи: Customer development это методология создания и развития продуктов через обратную связь от потребителя.

Тоже нельзя не согласиться. Казалось бы! Смотри п.4. Почему только создание и развитие продуктов? У нас есть отличный инструмент, почему бы им не пользоваться чаще. Я настаиваю, что методологию развития пользователей надо использовать постоянно.

Например, пользователи мобильного сервиса Карта охотника часто жалуются в отзывах и в ходе интервью. Скажем, на отсутствие в приложении карт угодий своего региона. Очевидно, что это запрос к характеристикам продукта и тут надо просто его удовлетворить, поскольку важность этой характеристики подтверждена. Но это не все. Регионов, где мы присутствуем со своими картами уже более 50, но это все еще не 100% покрытие. Для нас создать и выкатить карты угодий региона требует ресурсов, которых не хватит на все регионы сразу. Что мы делаем? Правильно, расставляем приоритеты исходя из количества охотников в регионе в порядке убывания, да простят меня охотники из небольших регионов России, но для выживания нам пришлось сначала отрисовать регионы с городами-миллионниками, где нам проще добраться до целевой аудитории.

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

Зачем все это?


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

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

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

Желаю успехов! Всем CustDev

Для удобства привожу ссылки на книги, которые считаю обязательными к прочтению по теме, я не топлю за конкретные магазины, найти их можно совершенно свободно и на русском (на Озоне, Литресе, Альпине и тд.), и на английском, например, на Амазоне:


Подробнее..

Как найти и описать платящий сегмент пользователей?

06.10.2020 16:11:14 | Автор: admin

Всем мы знаем, что пользователи делятся на группы в соответствии с пользовательскими метриками и долей рынка продукта (АВСDX-сегментация). И это деление говорит нам: делайте все в продукте для A, максимум, B-сегмента - для самых платящих и лояльных клиентов. И не обращайте особого внимание на не сводящих экономику продукта жалующихся и мало платящих сегментов С и D.

Сегодня, в преддверии старта курса "Product Manager IT-проектов" совместно с Сергеем Колосковым, преподавателем Otus и автором канала Fresh Product manager мы написали пост, как найти платящий сегмент для трех разных кейсов.

Если есть метрики / аналитика по продукту

1. Анализ Частотность - Деньги - Дата последнего действия (RFM - анализ по классике): таблица из баллов по показателям Recency давность (как давно ваши клиенты что-то у вас покупали), Frequency частота (как часто они у вас покупают), Monetary деньги (общая сумма покупок). Зная эти три метрики в общем виде, находятся лидеры по сумме, они и становятся для нас выявленным платящим сегментом. Например,

R - Recency:

1. 0-30 дней: 5,100 покупателей/подписчиков

2. 31-60 дней: 12,300

3. 61-90 дней: 32,800

4. 91-180 дней: 75,000

5. 181-365 дней: 123,400

Группа 1 здесь и далее будет включать самых выгодных клиентов. Лучший сегмент всегда будет иметь наименьшее число покупателей/подписчиков, в то время как худший будет самым крупным.

F - Frequency:

1. 16+ покупок/действий

2. 11-15

3. 5-11

4. 2-4

5. 0-1

M = Monetary

1. $1001+

2. $601-1000

3. $351-600

4. $201-350

5. $0-200

Таким образом, мы получим без малого 125 групп. Клиенты 5R-5F-1M могли обратиться к вашим услугам лишь разово, потратив немалую сумму, но не рассчитывая на долговременное сотрудничество. А вот 5R-3F-1M с большей вероятностью стали недовольны услугами компании или потеряли к ней интерес. 1R-1F-1M сливки вашего клиентского списка. Если вы верно избрали пределы групп R, F и M, то этот сегмент должен быть крайне мал не более 5% адресной базы. Что бы вы ни делали, вам уже вряд ли удастся испортить отношения с такими клиентами.

2. Проблемно-решенческие интервью (как часть CustDev) с целью выявления общих паттернов и характеристик среди платящих (от 8 проблемных интервью на предполагаемый сегмент с проверкой гипотез) - проводим проблемно-решенческое интервью с целью выявления связи между гипотезой и сегментом. Сегмент может оказаться не один, необработанные сегменты можно взять из полного или упрощенного (по нескольким показателям) RFM - анализа. Идеально, когда CustDev дополняет RFM - анализ и наоборот. О том, как правильно проводить кастдевы, какие вопросы и как задавать в обзоре от канала Fresh Product manager.

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

Если нет метрик и аналитики по продукту

1. Упрощенный RFM-анализ (по выручке, по среднему чеку) - собирается из того, что можно собрать из бек-энда продукта или опросов по возможным показателям. Иногда их достаточно для выявления сегментов. То есть, самая простая выгрузка из базы и логов.

2. Сегментированные опросы - сбор ответов на вопросы внутри продукта, которые выявляют паттерны поведения. Возможны настройки вопросов для пользователей с определенным поведением. Опросы лучше использовать именно с точки зрения проверки количества сценариев: вопрос - это формулировка проблемы, ответы - варианты решений. Эти цифры можно использовать для показателя Охват в фреймворке приоритизации гипотез (например, RICE). Те сценарии, что набрали мало ответов, с точки зрения продукта не нужны.

3. CustDev с целью выявления инсайтов для построения аналитики. И, конечно, проведение проблемно-решенческих интервью, в которых будут результаты упрощенного RFM - анализа или опросов. Цель все та же - нужно выявить посредством открытых вопросов схожие паттерны поведения и объединяющие факторы. В тему - отличный блог Синди Альварес, автора книги Продукт, который купят и канал с моими заметками про CustDev

Если нет продукта и аналитики

1. CustDev с целью формирования сегментов и проверки гипотез (От 40 проблемных интервью). Когда нет никаких зацепок и аналитики, собираются гипотезы как для продуктов, так и для сегментов - активных пользователей продуктов. Гипотезы самые смелые, проверка самая приключенческая.

2. Информационные способы привлечения клиентов (выставки, вебинары, статьи, рассылка). Здесь скорее про минимально необходимые рабочие продукты без привлечения кода (MVP), когда непонятно, для кого продукт. Разного рода инфоповоды могут стать привлечением самого полезного сегмента, важно, со всеми познакомиться и узнать, что между представителями общего.

3. Проверка поисковых запросов в Яндексе/Google (Wordstat и прочие) как мониторинг монетизации и необходимости продукта по семантике, проверка наличия целевой аудитории посредством проверки пула запросов в поисковиках. Важно копать именно узкие целевые запросы. Например репетиторы по математике покажет популярность для сегментов ОГЭ/9 класс, городов и пересечение с другими предметами.

На этом всё. Приглашаем вас посетить бесплатный демо-урок по теме: CJM (customer journey map): от гипотез до продуктового сценария

Читать ещё:

Подробнее..

Из песочницы Методы продаж, чтобы превратить ваших потенциальных клиентов в реальных покупателей

18.09.2020 16:04:09 | Автор: admin

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



К сожалению, все не так просто.


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


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


Поговорите с нужными людьми


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


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


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


Отправляйте потенциальным клиентам смс-сообщения и электронные письма.


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


Вот некоторые стандартные правила для эффективного обмена сообщениями


  • Подберите подходящий SMS сервис.Исходя из своего опыта, я могу предложить Dexatel, потому что у них есть 500 и более прямых соединений с операторами мобильной связи, и они имеют более выгодные цены.
  • Сегментируйте свой список для более целенаправленных SMS и электронные письма.
  • Персонализируйте ваши SMS и электронные письма в соответствии с их конкретными потребностями.
  • Самое главное, избегайте спаминга
    Вы не хотите, чтобы это звучало так, как будто вы продаете таймшер; вы хотите, чтобы вас воспринимали как человека, который искренне заинтересован в том, чтобы помочь вашим потенциальным клиентам решить их проблемы.

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


Дайте людям повод действовать сейчас


**В своей книге Влияние (чтение обязательно для всех, кто занимается продажами) Чалдини объяснил, что дефицит является одним из ключевых факторов, влияющих на поведение человека.


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


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


Ваше сообщение должно дать понять, что им нужно принять меры, и сделать это именно сейчас. Типичный пример использование ограниченного по времени предложения (например, сэкономьте 20%, если вы зарегистрируетесь в течение 24 часов).


Предупреждение: клиенты умны, и если вы используете фальшивый дефицит, вам удастся только раздражать (и потерять) ваших потенциальных клиентов.


Инвестируйте в программное обеспечение для автоматизации продаж


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


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


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


Ответьте на их вопросы


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


  • Не осведомленные: они могут знать, что что-то не совсем правильно, но не знают что.
  • Осведомленные о проблемах: они точно знают, что не так, но не знают, что с этим делать.
  • Осведомленные о Решениях: они знакомы с одним или несколькими способами решения своей проблемы.
  • Осведомленные о Компаниях: они знают о вас и о ваших конкретных решениях их проблем.
    Каждый уровень осведомленности требует ответов на разные вопросы. Ваша задача обучить их (будь то через ваш веб-сайт, по электронной почте или каким-либо другим способом), направляя их на каждом этапе, чтобы они знали, что вы предлагаете наилучшее возможное решение их потребностей.

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


Спросите о продаже (в нужное время)


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


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


Вам просто нужно спросить.


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

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru