{"id":14284,"url":"\/distributions\/14284\/click?bit=1&hash=82a231c769d1e10ea56c30ae286f090fbb4a445600cfa9e05037db7a74b1dda9","title":"\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0444\u0438\u043d\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u0430\u043d\u0446\u044b \u0441 \u0441\u043e\u0431\u0430\u043a\u0430\u043c\u0438","buttonText":"","imageUuid":""}

Как запустить ИТ-продукт за две недели без головной боли

Опыт автора Telegram-канала «Золото Бородача» Никиты Колмогорова, который запустил семь продуктов за 2019 год и довёл два до самоокупаемости. Без прикрас, смузи и планшетиков — только суровая правда.

Привет всем! Меня зовут Никита, и я серийный запускатор этих ваших продуктов в этих ваших интернетах. Я точно так же, как и вы, сидел бессонными ночами над одним из своих продуктов более двух лет (2015–2017 годы) и запустил его лишь для того, чтобы обнаружить, что спроса на продукт нет и никогда не было.

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

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

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

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

У большинства стартаперов-запускаторов есть ряд простых проблем, которые можно решить и тем самым уменьшить процесс запуска MVP (минимального жизнеспособного решения) с двух лет до двух недель.

Я не опечатался: да, вы можете запускать продукты за две недели, так я сделал в августе 2019 года, и уже вывел свой продукт на самоокупаемость. Так сделал я со вторым продуктом, которым сейчас пользуется более 2 млн человек.

Мне важно описать этот процесс, потому что я заинтересован в развитии собственного окружения. Эта статья скорее для всех русскоязычных стартаперов, которые время от времени заходят ко мне в Telegram за советами.

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

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

Заранее оговорюсь: пункты из этой статьи очень субъективны и являются исключительно мнением автора, основанном на личном опыте.

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

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

Перейдём непосредственно к основным ошибкам стартаперов, которые пытаются запустить свой ИТ-продукт.

Отсутствие технического опыта у основателей

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

Каков ваш шанс быть среди этих единиц? Правильно, 0, 01%. Готовы сделать свою ставку или предпочтёте играть с шансом победы в 85%? Тогда слушайте и делайте заметки очень внимательно.

Вам необходим минимум один фаундер со «шкурой в игре», который сможет (и хочет) всё своё свободное время тратить на этот проект.

Другой вариант — наёмный программист; но если вы выберете этот вариант, вы должны буквально следовать каждому из советов ниже.

И я имею в виду, следовать каждому совету ниже, чтобы увеличить свои шансы на успех. Если у вас нет фаундера с достаточной экспертизой именно в технологическом стеке, который вы выбрали, можете писать пропало, за две недели вы не запуститесь, как и за 4, 10, 20 и 40 недель. Через пару лет запуститесь криво-косо, никому не будете нужны.

Отсутствие чётких требований к продукту

«Мне нужно вот это, это, это, это, это, а ещё вот это, как же я мог про это забыть?»

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

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

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

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

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

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

Все эти дополнительные функции нужно минимизировать. Поверьте, вам не нужен вход с паролем, логином и восстановлением пароля — вам нужны кнопки «Войти через Google» и «Войти через Facebook».

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

Отсутствие внятного и короткого технологического стека

Так, если вы хотите разрабатывать свой продукт годами и запуститься, когда никому ваш сервис уже не будет нужен, тогда я милости прошу вас в комментарии с фразами вроде «автор ничего не знает, я люблю PHP и всегда буду на нём писать, смотрите, Facebook на PHP (на самом деле нет) и "ВКонтакте" на PHP (на самом деле нет), и вообще это первый язык программирования, который я изучил, я не мог ошибаться тогда, когда у меня не было никакого опыта, я точно выбрал самый лучший язык программирования с первого раза, вперёд, PHP».

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

  • Вы всегда должны стремиться к минимизации количества написанного кода для достижения необходимой функциональности. Значит, вы выберите Koa вместо Express, Gin вместо Django, TypeScript вместо Go и так далее.
  • Вы не должны думать об оптимизации ресурсов до получения 100 тысяч пользователей. Значит, вам не нужны load balancers, Redis, а вместо AWS вы можете запустить простой и понятный дроплет на Digital Ocean.
  • Вам нужна типизация, чем строже, тем лучше. Если в языке программирования из вашего стека нет типов — о, бой! Вас будут ненавидеть все будущие программисты, которые будут тратить дополнительные часы на попытки расшифровать, что же там написали вы раньше. Типизация — дополнительная документация, необходимая любому продукту с более чем одним разработчиком. Стоит заметить, что вы сегодня и вы через полгода — это уже два разных разработчика.
  • Вам не нужна скорость и отзывчивость нативного пользовательского интерфейса. Возьмите кросс-платформенное решение, лучше React Native, для мобильных приложений. Вам нужно запуститься за две недели, а не разрабатывать продукт два года.
  • Господи-боже, не используйте PHP. Не слушайте людей, которые только PHP и знают, у них развито туннельное зрение. Я не буду доказывать этот пункт, просто поверьте. Либо посмотрите на этих бедняг, что запускают свои продукты на PHP уже несколько лет. Вам это не нужно, вам нужна скорость разработки.

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

На их основе я сделал стартер для бекенда, стартер для фронтенда и стартер для Telegram-ботов. Все сервисы я спокойно запускаю на Digital Ocean, деплой занимает от силы 15 минут. Статью о том, как я это делаю, я тоже написал. Итак, что же за волшебный стек?

  • Фронтенд: TypeScript + Vue + Vuex + Vuetify.
  • Бекенд: Node + TypeScript + Koa + koa-router-ts + MongoDB + Typegoose.
  • Мобайл: React Native + TypeScript + MobX.

Почему TypeScript? Потому что это JavaScript на стероидах. С более-менее строгими типами да с самыми новыми фичами ES (например, optional chaining).

Почему Vue? Потому что Angular и React заставляют вас писать больше кода как ни крути.

Почему MongoDB? Потому что до 1 млн пользователей вам неважно, есть ли join tables, а Mongo даёт незаметную автоматическую миграцию, простой синтаксис и строгие типы с Typegoose, простые решения индексации без необходимости что-либо конфигурировать вообще.

Почему Koa? Потому что Express, Gin, RoR либо заставляют писать больше кода, чем нужно, либо отстают в количестве крутых языковых фич вроде удобных декораторов.

Почему React Native? Потому что вам нужно запуститься за две недели, а не разрабатывать два нативных приложения (под iOS и под Android) в течение следующих двух лет.

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

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

Отсутствие понимания спроса

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

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

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

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

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

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

Делают так, как говорят победители, а не как делают победители

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

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

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

Заключение

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

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

Итак, что же нужно сделать, чтобы запустить MVP за две недели и проверить свою бизнес-гипотезу сравнительно дёшево?

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

Вот и всё, друзья! Надеюсь, хоть что-то полезное вы успели вынести из этой статьи. Запускайтесь за две недели, это весело, поверьте!

0
502 комментария
Написать комментарий...
Konstantin Safonov
  Потому что до 1 млн пользователей вам неважно, есть ли join tables

Щито?

Ответить
Развернуть ветку
borodutch
Автор

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

Ответить
Развернуть ветку
Konstantin Safonov

Я не совсем понимаю, что вы имеете ввиду под 'Нет заметной разницы'. Вещи, которые элементарно делаются на любой реляционной БД, превратятся в проблему в монге. Что-нибудь абсолютно банальное и повсеместное в e-commerce, вроде самых крупных покупателей / популярных товаров / похожих товаров будет долгой задачей как раз из-за отсутствия такой простой вещи, как join.

Ответить
Развернуть ветку
borodutch
Автор

Простите, я связи по ObjectID перестали поддерживать? И аггрегации тоже? Похоже, я проспал этот момент.

Ответить
Развернуть ветку
Konstantin Safonov
И аггрегации тоже? 

Аггрегации в mongodb абсолютно калечные с их ограничениями и тормозами.

Простите, я связи по ObjectID перестали поддерживать?

* ObjectId — так себе замена join. Простой пример — построить чарт зависимости, скажем, покупок от визитов по дням. Две независимые коллекции / таблицы — заказы и записи о просмотрах страниц. В SQL это джойн по дате, с ObjectId... а не на что сослаться в objectid.

Ответить
Развернуть ветку
borodutch
Автор

Мдемс, вы очень давно не трогали Монгу с ее самыми новыми инструментами в лице того же Mongoose и Typegoose.

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

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

Но вам же не пользователь важен, а написать побольше кода, понимаю.

Ответить
Развернуть ветку
Konstantin Safonov
Но да ладно, не верьте и не смотрите в сторону нереляционных бд

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

* Восхитительные истории о real-time search от евангелистов, а потом поиск отрабатывает 30 секунд на тестовой базе, потому что на практических задачах всё _немного_ хуже, чем на синтетике.

* Оттуда же потребление ресурсов. Как насчёт выжирания 10+ гигов памяти при попытке проиндексировать всего лишь пару сотен мегабайт документов?

* 'Automatic scaling' и создание пустого(!) индекса по 15 минут, потому что кривой lucene умирает на попытке загрузить жалкие полмиллиона синонимов для нормализации технического текста.

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

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

Это вот реальный проект, а не выдуманный мир.

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

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

Ответить
Развернуть ветку
Камаз Узбеков

Мог бы написать короче: "Я фанат сиквела, этот ваш ноусиквел не люблю и не понимаю"

Восхитительные истории о real-time search от евангелистов, а потом поиск отрабатывает 30 секунд на тестовой базе

Сложно сказать без деталей, но звучит как будто кто-то рукожопый настраивал поиск

Как насчёт выжирания 10+ гигов памяти при попытке проиндексировать всего лишь пару сотен мегабайт документов?

10 гигов в 2019, ну то есть совсем по-скромному :)

Ответить
Развернуть ветку
Konstantin Safonov
Сложно сказать без деталей, но звучит как будто кто-то рукожопый настраивал поиск 

Хайлайтинг матчей тормозит даже с fast vector highlighter, например, если документы относительно толстые(500К-2MB). 

10 гигов в 2019, ну то есть совсем по-скромному :) 

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

Мог бы написать короче: "Я фанат сиквела, этот ваш ноусиквел не люблю и не понимаю" 

Я не понимаю людей, которые предлагают класть реляционные и строго типизированные данные в документно-ориентированную s̶h̶e̶m̶a̶l̶e̶s̶  schemaless базу.

Ответить
Развернуть ветку
borodutch
Автор

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

Ответить
Развернуть ветку
Konstantin Safonov
с монгой не тормозит
вы криво ее настроили.
отвечаю на вопрос про elasticsearch
Ответить
Развернуть ветку
borodutch
Автор

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

Похоже, совпадение.

Ответить
Развернуть ветку
borodutch
Автор

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

Может, архитектура разная?

Ответить
Развернуть ветку
Yurii Bychkov

Никита, читаю ваше про сон, вы с 21 часа должны уже спать во всю. WTF? :)))

Ответить
Развернуть ветку
borodutch
Автор

Часовые зоны. А вы, похоже, стали фанатом.

Ответить
Развернуть ветку
Yurii Bychkov

Я же говорю, я много читаю.

Ответить
Развернуть ветку
borodutch
Автор

Тогда вам может понравиться мой книжный клуб: https://t.me/booka_club

Ответить
Развернуть ветку
499 комментариев
Раскрывать всегда