![](https://habrastorage.org/webt/sm/jc/98/smjc98w9hwckwhxayt2ulqyfwas.jpeg)
Если выразить идею статьи в двух словах: иногда бывает сложно понять, то ли ты проявляешь настойчивость, то ли попался в ловушку невозвратных затрат. Своему текущему проекту я отдал двадцать месяцев, проработал над ним в общей сложности две тысячи часов и «потерял» двести тысяч евро на своём решении заниматься этим, а не чем-то другим. Проект до сих пор не завершён. Под катом – история о том, как это было.
Подводка
В начале 2018 года, после десяти с лишним лет работы штатным разработчиком мне до смерти надоели офисные интриги и пустая трата времени на собраниях. Очень хотелось всё бросить, стать самому себе начальником и оставить свой след в окружающей действительности.
Я был чем-то средним между техлидом, руководителем отдела и менеджером проектов, получал хорошие деньги, имел много свободы в организации работы, управлял отличной командой, в общем, жаловаться мне было особо не на что. Я сам решал, как выстроить свой рабочий день или рабочую неделю, участвовал в интересных и сложных проектах, и команда была замечательная… хотя об этом я уже говорил.
И всё же я был готов всем этим пожертвовать, только чтобы попробовать что-то новое на своих собственных условиях.
Первые попытки
У меня был коллега и друг, которому тоже хотелось создавать свои продукты, так что мы стали проводить мозговые штурмы совместными силами. Какое-то время ушло у нас просто на поиски Той Самой Идеи (об этом антипаттерне, наверное, все знают). В конце концов нам удалось придумать две идеи, которые выглядели многообещающими.
Одна из них заключалась в разработке цифровых продуктов для школ, чтобы помочь им отслеживать систему питания, платежи, посещаемость и так далее. Из того, что мы наблюдали на опыте собственных детей, было ясно, что с этим имеются реальные проблемы, которые нужно решать. На бельгийском рынке было представлено несколько конкурентов, но не очень много, а для нашей части страны – вообще никого. К тому же мы планировали совсем другой подход.
Вторая идея состояла в том, чтобы создать цифровую платформу для ресторанов, где они могли бы размещать кастомизированные меню, устанавливать связь со своими клиентами (например, рассылать специальные предложения), нарабатывать репутацию и так далее.
Мы начали работу над продуктом, рассчитанным на школы. Так как мы оба fullstack-разработчики, больших сложностей с технической стороной не возникло. Мы обсудили свою идею с несколькими школами. Люди, с которыми мы общались, были преисполнены энтузиазма, но не уверены, что им удастся выбить деньги из бюджета. Кроме того, школы относятся к госсектору, а значит, нам ещё предстояло пройти через тендерные заявки. Меня это не слишком пугало, я достаточно времени провёл по другую сторону баррикад, участвуя в публичном отборе заявок. Мы твёрдо решили, что попытаться стоит. Но спустя какое-то время моего друга охватили сомнения, и он вышел из предприятия, даже не предупредив меня. Я продолжал работу, но остро ощущал, что остался один на корабле. Паршивое чувство, я был разочарован.
После этого у нас состоялся разговор с другим коллегой, который тоже был заинтересован в том, чтобы к нам присоединиться. Это дало новый импульс, я полагал, что втроём мы добьёмся успеха с большей вероятностью. Мы решили бросить первую идею и взяться за вторую.
На этот раз дело продвинулось дальше: нам удалось попасть в инкубатор для стартапов. Это дало нам возможность двигаться вперёд, составить бизнес-план и так далее. В процессе идея несколько раз меняла свой облик, но к разработке мы всё-таки приступили. Но затем, к сожалению, всё пошло по тем же рельсам: разработка потребовала больше времени, чем думали партнёры, потенциальные клиенты не загорелись идеей сразу. Партнёры быстро усомнились в том, удастся ли нам вообще продать продукт. Не уверен, сознавали они это или нет, но их мотивация и интерес к проекту упали почти до нуля; я же пытался продолжать работу. Наконец я понял, что они больше не в деле, и сам забросил обе идеи. У меня тоже пропала мотивация – трудно было смириться с неудачей, и я опять впал в уныние.
Полагаю, что с появлением COVID второй продукт мог бы стать звёздным. Но на тот момент люди, с которыми мы вели переговоры, не проявили интереса. Отслеживаемость вызывала у них опасения, и они хотели сохранить возможность уклоняться от налогов (я серьёзно). Так что теперь мы никогда не узнаем, чем бы это обернулось.
Крюк через фриланс
Так или иначе, я решил реализовать другую мысль, которая у меня возникала – податься во фриланс. Моей целью было сохранить доход на том же уровне и при этом выгадать сколько-то свободного времени. Сначала я подумал, что смогу расширить горизонты посредством консалтинга. Поэтому в январе 2019 года я на год прервал свою десятилетнюю карьеру штатного разработчика и открыл собственный фриланс-бизнес. Особого риска в этом не было: в самом худшем случае мой план бы с треском провалился и я бы вернулся к прежнему работодателю. У меня уже был подписан контракт с первым клиентом (небольшой бельгийский стартап из FoodTech), и я рвался в бой.
Однако через несколько недель мои мечты обернулись чем-то вроде ночных кошмаров. Я старался, как мог, но всё как-то не складывалось. Мне не нравилась атмосфера, а клиент был не слишком доволен моей работой. Ситуация становилась напряженной. Через три месяца они отказались от моих услуг. Было досадно и немного страшно, потому что никакого запасного плана я не заготовил. По последнему счету они, кстати, так мне и не заплатили. Видимо, этих денег я уже не увижу.
Вышло так, что компании нужен был некий лидер, который умел бы громко заявить о себе и всё в таком духе. А я всегда был человеком молчаливым, мне важнее командная работа и общее для всех представление о проекте, перекрикивать других я не стремлюсь. В общем, мой стиль работы, видимо, не вписался в корпоративную культуру.
Следующего клиента я нашёл без особого труда. К концу апреля я начал работу над другим проектом и задержался там на несколько месяцев. Если вкратце, с ним всё прошло куда лучше.
Меня по-прежнему преследовала мысль о создании собственных продуктов. Казалось, что эти единственный путь, который мне подходит. Я и сейчас так считаю. Когда работаешь в компании или на фрилансе, воплощаешь в жизнь только чужие мечты. Деньги – это, конечно, хорошо, но их никак не масштабируешь, к тому же всё равно остаёшься «во власти» других людей. Мне больше так не хотелось.
В течение 2019 года я также вёл работу над своей книгой, и это тоже отняло много сил и времени – почти целый год.
Зарождение проекта SaaS
В мае 2019 года бывшая коллега познакомила меня с одним человеком – её муж был бизнесменом в поисках партнёра для своего нового предприятия. Разумеется, я был заинтересован в такой возможности. Он рассказал мне о проекте и представил третьему будущему основателю. Они вели работу уже около года и нуждались в техническом директоре. Третий партнёр вышел из дела.
Цель состояла в создании продукта SaaS (B2B), который бы помогал компаниям рациональнее проводить собрания. Звучало не очень-то завлекательно, но я по собственному опыту знал, сколько времени собрания могут съедать впустую у всех присутствующих, если не организовывать их с толком. Поэтому мысль о том, чтобы изменить статус кво, выглядела вполне дельной.
Кроме того, третий партнёр была lean-консультантом с большим списком потенциальных клиентов, и это делало проект ещё привлекательнее. Она не работала в сфере IT и, тем не менее, сумела создать собственный инструмент и методологию, которые с большим успехом применяла в работе с клиентами. Так что речь не шла не об абстрактной идее – существовала конкретная проблема и люди, готовые платить за решение. Как можно догадаться, я не замедлил к ним присоединиться.
Первые месяцы
Со своим вторым клиентом по фрилансу я договорился на неполную рабочую неделю, поэтому мне удалось освободить примерно два дня для проекта SaaS. Не так много, но для начала пойдёт. Я нервничал, но при этом был на седьмом небе. Так продолжалось до конца августа.
За эти первые несколько месяцев я с головой погрузился в существующую кодовую базу, без особых проблем разобрался со стеком, провёл GAP-анализ и помог составить ясную, рабочую дорожную карту проекта по разработке и обеспечению безопасности.
В проекте использовалась CouchDB, потому что идея была в том, чтобы ярко выделиться на фоне конкурентов за счёт ранней реализации офлайн-поддержки. Я принял это как данность и приступил к работе. Очень скоро стало ясно, что проект нужно переписывать практически с нуля. В имеющейся кодовой базе обнаружилось слишком много проблем, она вообще больше напоминала проверку концепции. Мы решили, что будем выполнять эту работу постепенно, чтобы не пришлось сносить всё сразу. Впоследствии оказалось, что решение было неверным.
Итак, в период с мая по июль мы разобрались с пользовательскими историями, сделали карту истории, составили дорожную карту и уточнили объёмы минимально жизнеспособного продукта. Я создал википедию, перенёс код в монорепозиторий, создал и очистил бэклог и так далее. В период с июля по сентябрь я занимался тем и сем: системой сборки, Docker/docker-compose, непрерывной интеграцией, авторизацией, локализацией ПО и тому подобным. Также в сентябре мы проехались в трейлере по Франции – последнее масштабное приключение перед COVID. Но это уже другая история.
Период усиленной работы
В сентябре я стал работать над проектом полную неделю. Это было рискованным шагом и для меня, и для бизнеса – я на несколько месяцев лишался дохода, а расходы оставались прежними. Но мне хотелось ускорить работу над стартапом SaaS. Меня раздражало, что мы так медленно продвигаемся.
Мы надеялись, что к концу 2019 года уже выпустим продукт на рынок. К сожалению, получилось, мягко говоря, иначе.
Однако с сентября по декабрь я получал удовольствие, отдавая всё время проекту. Я сумел по-настоящему на нём сосредоточиться, работал так, как мне нравилось (наконец-то!) и ощущал, что процесс идёт хорошими темпами. Я наладил автоматизацию выпуска, сделал инфраструктуру для прода (переключился на Kubernetes, попробовал AWS и в конечном итоге остановился на DigitalOcean), внедрил поддержку HTTPS, реализовал базовую функцию поиска, навигационную цепочку, выход из аккаунта, создал тестовый набор данных, интерфейс командной сроки и так далее.
В декабре наконец вышла моя книга про TypeScript объёмом в восемьсот страниц (это уже скорее кирпич, а не книга), так что я сбросил хоть что-то одно с плеч и мог больше времени уделять семье… и проекту SaaS.
Конец первого года (семь месяцев работы)
К сожалению, за экран с собраниями – самый главный и самый сложный – мы взялись только в декабре. С большим опозданием, но раньше у нас никак не получилось.
К тому времени меня стали мучить сомнения в том, верный ли мы избрали подход и насколько он эффективен. Я выбивался из сил, но дело шло очень медленно. А почитаешь людей на Twitter – они уже через месяц-три выпускают готовый продукт. И я спрашивал себя: «Что мы делаем не так?», но не мог найти ответа.
На конец 2019 года я уже потратил на проект около тысячи часов, то есть упущенная выгода для меня составляла сто тысяч евро (столько бы я заработал за этот срок консалтингом). И всё-таки я решил не слушать этот внутренний голос и сосредоточиться на развитии проекта. Мне казалось, что всё окупится.
2020 год: три работы, двое детей и слишком мало времени
В январе 2020 года стало ясно, что нам предстоит проделать долгий путь. В бэклоге оставалось ещё много всего (важная функциональность, исправление ошибок, серьёзные бреши в защите), так что мы подвинули срок выпуска на июнь 2020 года. Мои партнёры были настроены более оптимистично, но я уже хорошо был знаком с реальным темпом работы и понимал, что этого времени ещё и не хватит. Однако мы решили напрячься и постараться.
Параллельно я пытался найти клиента для консалтинга на 1-3 дня в неделю, но не мог подыскать никого, кто согласился бы на такие условия. Поэтому пришлось снова выйти на работу в компанию на полставки – это можно было устроить, так как я уходил в отпуск по уходу за ребёнком.
Я не ожидал, что мне придётся вернуться к своему прежнему работодателю, и это нанесло сильный удар по мотивации. После возвращения я потерял должность, статус, команду и всё прочее. Ощущение было такое, будто я приполз просить о помощи.
На старом месте работы я превратился в некое подобие пожарного, который устраняет сложные технические проблемы. Это было интересно, но и тягостно тоже: мне нравилось работать в команде, а теперь большую часть года приходилось действовать в одиночку. А когда на нас обрушилась пандемия, стало ещё хуже… Впрочем, жаловаться мне не следует: зарплаты на жизнь хватало, что очень одобряла семья, и многим пришлось гораздо тяжелее.
Вместе с тем, я пытался так и эдак удержать на плаву своё предприятие. Толку от этих попыток было мало. Я пускал в ход всю энергию, которую мог собрать, отказывался от свободного времени, игр, чего угодно. Я превратился в автомат. Хоть и пытался выдерживать здоровый баланс, но COVID смешивал все карты. И всё-таки мне удавалось в перерывах между миллиардами рабочих часов в неделю урывать время на настольные игры.
В период с января по июль мы не много сделали для проекта SaaS в плане функциональности. Дело шло медленно и туго. Я начал ставить под вопрос свои способности и принцип работы. Я всё более и более решительно высказывался в пользу того, чтобы сократить масштабы и сосредоточиться на главном, но жертвовать качеством кода мне всё-таки не хотелось. Не то чтобы я требовал слишком многого в этом плане, но и совсем не уделять ему внимания было для меня неприемлемо. Вместо этого я убеждал партнёров отказаться хотя бы на время от второстепенных вещей – например, офлайн-режима (на который мы уже убили целый месяц) или поддержки мобильных устройств, без которой на первых порах точно можно было бы обойтись.
Мы пришли к выводу, что UI/UX у продукта совсем плох и не произведёт впечатления на пользователей. В первую очередь это касалось экрана с собраниями, который был самым сложным. Мы решили нанять UI/UX-дизайнера. Это обошлось нам в три тысячи евро за пять человеко-дней. Цена была разумной, но интеграция нового дизайна потребовала изменений сразу в нескольких частях системы (мы заменили Angular Material на Tailwind, создали свою собственную тему, провели рефакторинг модели данных и ещё кое-что), а это, в свою очередь, ещё сильнее сдвинуло сроки… По суммарному затраченному времени мы пустили на всё два с лишним месяца, но эффект получился превосходный (пусть мы и поздновато спохватились). Это явно был верный ход.
О том, что убивает продуктивность
К июню 2020 года работа над минимально жизнеспособным продуктом была ещё далека от завершения. Мы так и не закончили экран с собраниями, и других недоделок была целая куча. Мы снова перенесли релиз, на этот раз на сентябрь.
В течение всего года условия работы у нас постоянно менялись, и, как мне кажется, именно это мешало нам больше всего. Если говорить обо мне, то я работал над проектом SaaS по понедельникам и пятницам плюс ещё две среды в месяц. Мне приходилось переключаться между кардинально отличающимися задачами в пределах одной недели, и это было очень непросто, в первую очередь психологически.
При этом один из партнёров (тот, который занимается разработкой вместе со мной), часто обращался ко мне за помощью в произвольные дни. Прежде чем взяться за этот проект, он на много лет оставлял программирование, поэтому ему приходилось сложнее. Это ещё сильнее обостряло проблему с переключением между контекстами. По несколько раз в день мне приходилось оставлять то, чем я был занят, чтобы помочь ему сдвинуться с мёртвой точки, что дополнительно усложняло жизнь.
Конечно, здесь нельзя судить однобоко: у моего партнёра больше всего опыта в ведении бизнеса, маркетинге и продажах и впечатляющий круг знакомств, так что он тоже не обделён сильными сторонами.
Тем не менее, на меня ложились все проблемы с технической стороной, управление обновлениями, устранение багов, безопасность, документация, работа с бэклогом, проекции и так далее. Получалось много всего, и это однозначно влияло на сроки выпуска продукта.
Очень много времени отнимала у нас база данных NoSQL, и сейчас мне кристально ясно, что не стоило с ней связываться ради затеи с офлайн-режимом. В конце концов, этого можно было добиться и при помощи других решений. К тому времени мы уже отложили офлайн до будущих релизов, а модель данных у нас была в высшей степени реляционной. Больше не оставалось никаких оснований цепляться за неё и дальше. Она нас только затормаживала, усложняя все операции.
И всё-таки мы решили её оставить, полагая, что затраты ресурса на переход на классическую RDBMS окажутся критическими и отбросят нас слишком далеко назад. Не могу с уверенностью сказать, что в этой ситуации разумнее: потратить больше времени на изменения к лучшему с надеждой, что в будущем они сберегут нам время, или же продолжать внедрять функциональность с боем, рискуя низкими темпами работы… Мы пошли по второму пути – не знаю, к лучшему ли было это решение.
После первой волны
Далее мы выкладывались изо всех сил, внедряя авторизацию, задавая стейт-машины для разных концептов (так как у собраний есть определённый жизненный цикл, и нам это кажется очень важным с точки зрения организации), реализуя валидацию и разнообразные возможности внутри приложения – форматирование текста, экспорт в pdf и так далее. Но минимально жизнеспособный продукт так и не удавалось довести до ума! А ведь мы и так уже урезали его по максимуму.
В то же время, средства на счету компании таяли, как Олаф на солнце. Проходил месяц за месяцем, и сомнения понемногу возвращались. Пусть мы и многого добились в некоторых аспектах, казалось, что работа движется невыносимо медленно.
А что сейчас?
Где-то в октябре 2020 года мы стали смотреть, где можно раздобыть финансирование. Мы задумались о том, не взять ли кредит с 50% страховкой от Европейского инвестиционного фонда или, может быть, попытаться получить деньги из регионального или национального бюджета. Мы обратились в банк, составили заявку на финансирование из регионального бюджета и так далее, но пока ещё ничего не прошло.
К несчастью для нас, из-за COVID те клиенты, на которых мы больше всего рассчитывали (больницы), сейчас однозначно не в состоянии выделить время на интеграцию нашего решения. То есть даже если мы всё для них подготовим, сами они будут не готовы. Поэтому пришлось обратить взгляд на другие сегменты аудитории и пересмотреть масштабы. Это подтолкнуло нас к тому, чтобы обрисовать для себя «следующий» релиз, где будет достаточно функциональности, чтобы склонить других клиентов к покупке продукта. Но с нашей текущей скоростью такая версия будет готова к концу 2021 года, при условии, что мы будем продолжать работать половину рабочей недели.
В свете своих сомнений насчёт темпов разработки и состояния рынка мы стали рассматривать другие методы бутстрэппинга. Сейчас мы подумываем, не начать ли с сервисной модели, чтобы выиграть время и разогреться, а потом уже перейти на SaaS. Но пока это только на уровне идеи. Всё довольно туманно.
И вот, начало 2021 года, ещё тысяча потраченных часов, а значит, двести тысяч евро упущенной выгоды, а я по-прежнему работаю над этим проектом, вместо того чтобы заняться чем-то ещё… Причём проекту даже не светит выход на рынок в обозримом будущем.
Стресс и сомнения
На сегодняшний день я вложил в проект две тысячи часов, и эта цифра представляется огромной. Мне почти стыдно подумать, как мало мы можем предъявить за такие затраты. Может, это нормально, а может, и нет. Я честно старался изо всех сил, но иногда появляется чувство, что я ничего не знаю и ни на что не способен в своей профессии (привет, синдром самозванца, как я по тебе скучал). Я работал на износ, сидел над проектом ночами и по выходным, стараясь ускорить процесс, но получается всё равно медленно.
К текущему моменту банковский счёт моей компании уже явно ушёл в минус. Она и полгода не протянет. Я весь извёлся от стресса (хотя ещё в состоянии делать спокойное лицо и улыбаться). Я продолжаю работать на полставки и, наверное, так и будет продолжаться большую часть года. Было бы здорово сбросить в себя все эти обязательства и отдавать всё время и силы проекту, но пока что не выйдет. Впереди долгий невесёлый путь, и я до сих пор ни в чём не уверен.
Возможно, мы зря решили оставить базу данных NoSQL. Возможно, всё дело подрывает необходимость разрываться между контекстами. Возможно, я плохой разработчик. Возможно, мы не тому уделяем внимание. Возможно, я чересчур ношусь с качеством кода. Возможно, стоило ещё год назад всё бросить. Возможно, нам нужен ещё один программист. Возможно, возможно, возможно.
Какая-то часть меня настроена продолжать. Во-первых, потому что я по-прежнему верю в команду и в то, что продукт действительно нужен и способен помочь командам и организациям наладить работу эффективнее. Во-вторых, потому что энергии у меня всё ещё полно, да и упорства не занимать. Терпеть не могу бросать на полдороге. И наконец, я уже столько времени и сил вложил в проект; если теперь бросить, получится, что всё было напрасно.
И вот, сижу тут со своими сомнениями, массой потерянных денег, кучей работы впереди и полным отсутствием уверенности в чём-либо. Ощущение, что я попал в заколдованный круг. Бросить – значит проиграть и, может быть, упустить нечто важное. С другой стороны, продолжать – значит потенциально угодить в ловушку невозвратных затрат с риском потерять ещё больше. Я не знаю правильного ответа, да и никто не знает. Оба сценария вполне реальны.
Заключение
Простите, я вас обманул: никакого заключения у этой статьи нет. Нет даже каких-то определённых вопросов (не считая тех, которые крутятся у меня в голове как заевшая пластинка). Это просто моя история, не полная, а в сокращённой редакции.
Вот что странно: в 2020 году я много времени уделял и ведению блога – пользовался возможностью рассказать о том, чему научился в процессе работы над проектом SaaS, и даже заработал на этом около ста долларов. Хвалиться особо нечем, но это скрасило мне год. Может, именно этот опыт и подтолкнул меня к тому, чтобы взяться за новую книгу. Может, это внутренний голос мне говорит: «Хватит! Давай попробуем что-нибудь другое!». А может, мне просто нравится делиться знаниями и помогать людям. Это бы объяснило и мою склонность к консультированию. Хотя не знаю. Ничего не знаю.
Сейчас два часа ночи, уже наступил понедельник. А по понедельникам… я работаю над проектом SaaS. Этим и займусь, потому что пока я ещё не решился, хотя давление и мощное. Возможно, в конце 2021 году я обновлю эту статью рассказом о том, как мы покорили рынок. А на сегодня всё!