Разработкой моего продукта управляет некомпетентный идиот

от автора

Он понятия не имеет что делает и принимает судьбоносные решения от балды – а потом придумывает как их убедительно оправдать задним числом.

Он зависает на том, что не важно, но постоянно откладывает то, что важно.

Пока конкуренты завоевывают рынок – он полирует статус-бар и выбирает между двумя типами инфографики для отображения одной метрики в интерфейсе.

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

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

Проблема была одна. Я создал её одним решением, которое даже решением-то не было — просто в тот момент это была единственная дорога, которая, казалось, вела хоть куда-нибудь.

Вот об этом и поговорим. Но сначала придётся объяснить, что я вообще делаю, иначе дальше будет непонятно.


Что я делаю

Я делаю браузер для поиска работы. Прямо браузер — ставится как Хром, запускается с отдельного ярлыка. Внутри автоотклики на вакансии, автоподнятие резюме, персональные исследования рынка (анализирует твоё резюме против запроса рынка и говорит, что поправить в резюме, а что в самом твоём рыночном предложении) и CRM для кандидата: воронка, статусы компаний, календарь интервью и дедлайнов по тестовым. Еще есть автопереписки с рекрутерами и автопрохождение тестов и анкет (на основе того, что ты написал в своем профиле). Еще есть компаньон для интервью, который в реальном времени транслирует на экран текстовые подсказки («веди разговор на эту тему», «ты с этим увлекся, тебя спрашивали о другом», «ты забыл упомянуть такой-то факт из своего опыта») чтобы ты не терялся и смог показать себя в лучшем свете.

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


Тот самый вечер

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

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

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

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

Все. Вот и весь эпизод. Двадцать минут, максимум полчаса погуглить — и решение принято.

К сожалению, не выскочило окошко:
Внимание, вы сейчас выбираете свою бизнес-модель на долгое время вперед, продолжить?
[Да] [Отмена]


Не утечка персональных данных, на внеплановый децентрализованный бэкап

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

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

Но раз уж так вышло, посмотрим, что из этого случайно получилось.

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

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

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

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

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

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

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

Итог первый: я не вижу своего пользователя.

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

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

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


Деньги  — брызги

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

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

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

И вот вопрос – как человеку в беде продать инструмент для облегчения его положения?

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

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

Разовый платеж? Звучит старомодно, так сейчас хоть кто-то делает? Я помню, диски с играми покупал в детстве – это последний раз, когда я такую модель видел. Разовый платеж = нет денег на развитие = продукт умирает = не помогает вообще никому. Но, с другой стороны, если продукт хорош – у нас и там де-факто разовый платеж, какая бы модель формально ни была.

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

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

Вот на этом месте, прямо когда писал абзац, я и споткнулся.

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

Итог второй: половина моделей монетизации мне недоступна.

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


Защищать нечего

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

Смирился, ага. Давайте разберёмся, с чем именно.

Все нормальные компании защищают исходники: приватные репозитории, доступы по ролям, NDA, юрист на зарплате. У меня из этого нет ничего, и дело не в принципиальности. Просто мой продукт — Electron-приложение, которое лежит на диске пользователя. Asar распаковывается одной командой, обфускация и байткод — вечер работы для мотивированного человека с ИИ.

Итог третий: я не могу защитить код.

Ну и вот. Три итога. Я долгое время считал их тремя разными проблемами. У меня по каждой был свой список «за» и «против», я думал о них в разное время и в разном настроении, и они даже болели по-разному.

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

Ладно, если код скопировать можно, что вообще является активом соло-разработчика?

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

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

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

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

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

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

«Делай революцию за революцией» → при наличии запаса денег для содержания семьи между революциями.

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


Послесловие

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

Остаюсь локальным, потому что месяц на смену архитектуры — это месяц, которого у меня нет, а 152-ФЗ в одно лицо я не потяну.

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

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

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

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

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

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

А если интересно следить за страданиями юного Вертера в прямом эфире — залетайте на канал t.me/nn_career, присоединяйтесь к миллионной армии поклонников моего творчества, жду ваши дизлайки и отписки. Я там в последние пару недель не постил, но отныне и впредь хочу вести в формате журнала: ежедневно (или почти) рассказывать, как я чиню старую проблему, добавляя две новых.

ссылка на оригинал статьи https://habr.com/ru/articles/1066238/