Посты / Начинали, как калькулятор, а закончили SaaS сервисом

01.02.2019 12:17
Привет друзья, хочу рассказать о том, как простая поделка на коленке превратилась в облачный сервис. Речь пойдет о проекте E-tamarin.com Это сервис, который помогает рассчитать строительные материалы при ремонте разных помещений.

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

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

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

И вот нюанс, на предыдущем объекте они работали с дешевой гипсовой штукатурной смесью, у которой был расход 1.3 кг на 1м2 при толщине слоя в 1мм. А на этом объекте, заказчик привез им дорогую штукатурку, у которой расход был 0.8 кг на м2. В результате у заказчика осталось около 50 лишних мешков штукатурки. Был огромный скандал и разборки по этому поводу. И так происходило постоянно. То плитку пол ночи по полу раскладывают, чтобы прикинуть, сколько ее нужно. То вечно грунтовки не хватает, то песка привезут в два раза больше чем нужно. И так по каждой номенклатуре.

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

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

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

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

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

И мы поняли, что нужно все же писать свой калькулятор, но простой. Выбрали мы для этого PHP, даже не фреймворк, а просто нативным кодом. Это ведь все для внутреннего употребления. Формулы у нас уже были готовы, поэтому сосредоточились на простом интерфейсе.

В итоге получилась страница с "миллионом" инпутов. Типа: введите длину стены, ширину, высоту и так по каждой стене. Но в чем прикол, в стенах еще бывают проемы (окна, двери и т.д.). А значит нужны поля для каждой поверхности, чтобы указать эти проемы. Выглядело это все, как огромная простыня с кучей полей. Типы работ выбирались из выпадающего списка. И опять таки, одну стену нужно только штукатурить, а другую только покрасить. Это все как-то нужно было указывать. Появились возле блоков с размерами поверхностей чекбоксы.

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

Недостатки такого калькулятора дали о себе знать сразу же. В процессе ремонта или даже планирования, очень часто нужно было что-то изменить. Например, обои на покраску, а штукатурку на гипсокартон. И все это нужно было заново ручками забивать в калькулятор. Следующий момент - это то, что если заказчику нужно сделать стяжку, то калькулятор посчитает количество готовой смеси для стяжки. А вот из чего должна состоять эта смесь, из каких ингредиентов, в какой пропорции, этого он не умел. И это уже все приходилось дополнительно рассчитывать руками, что отнимало массу времени. Следующий недостаток, который вытекает из предыдущего. Смета составлялась руками после вычислений на калькуляторе. Например, для штукатурки было написано, что для помещения нужно купить 300кг гипсовой штукатурки. Слой нанесения-то мы высчитали. Но вот проблема, о которой я уже писал в начале. У каждого производителя свой расход. И заказчик уточняет, так сколько мешков мне брать. А ясного ответа он получить не может. Ему строители говорят купить 100 мешков "Ротбанда", а он покупает 100 мешков "Мастера", и сообщает, что "Ротбанд" дорогой и он взял дешевую альтернативу. У "Мастера" расход почти в два раза выше, в итоге штукатурки не хватает, и заказчик опять начинает орать и ругаться.

По мимо этого, смета выглядела, как какой-то кусок г., который не внушал особого доверия. А именно, указан материал и его количество. Например, штукатурка - 400кг., цемент М500 - 300кг, песок - 1200кг и так далее. И когда заказчик задавал вопрос, а почему так много, что это вы мне тут понаписывали? То ответить на этот вопрос кроме как, ну это мы так себе насчитали, мы и не могли. И если возникал какой-то подобный спор, то мы садились все пересчитывать наново, тратя на это часы.

В итоге, поигравшись с таким строительным калькулятором мы поняли, что дела не будет. К основной работе по ремонту квартиры добавилось еще и куча всяких расчетов и писанины. Нужно было срочно что-то менять и мы стали создавать ТЗ (техническое задание):
  • Простой интерфейс с минимумом телодвижений
  • Расчеты должны происходить полностью в автоматическом режиме
  • Это не должен быть тупой калькулятор, который перемножает размер и расход, система должна учитывать полный технологический процесс с учетом всех необходимых для него материалов
  • Расчеты должны строиться для любой поверхности независимо друг от друга
  • В финальную смету нужно выводить отчет как по всему помещению, так и по каждой поверхности по отдельности
  • Каждый тип работы можно выполнять разными способами, например, стяжку (сухая, мокрая, наливные полы), а значит нужно предусмотреть в смете выбор разных вариантов исполнения работы
  • Нужно для заказчика строить наглядную схему планировки
  • Указание всех проемов должно быть простым и быстрым
  • Финальную смету стройматериалов можно легко сохранить, распечатать и покупать по ней стройматериалы
  • На любом этапе расчетов можно мгновенно все переиграть, изменить и пересчитать
  • Не должно быть никаких кнопок сохранения, все должно происходить быстро и незаметно для пользователя
  • Все расчеты должны сохраняться, как проект, с возможностью вернуться к ним в любой момент

Далее мы стали выбирать технологии на которых будем разрабатывать проект.

В принципе у нас был опыт в разработке для WEB на разных языках программирования (PHP, Python, Ruby), но очень сильно подумав, мы решили все таки выбрать Ruby. Во первых, он очень нам нравиться своей лаконичностью и гибкостью. Во вторых, на нем можно очень быстро создавать проекты, он отлично масштабируется и очень гибок в решении сложных задач. Пыху мы сразу задвинули куда подальше, по причине ее топорности, многословности, ужасного синтаксиса и невозможности работать в реальном времени. Питон тоже подходил, но Руби все же победил :)

Итак, бэкенд у нас будет на Ruby. В качестве фреймворка мы взяли Rails API. Фронт решили полностью писать отдельно на ReactJS. Так как это должно быть быстрое и удобное приложение, которое больше похоже на программу, то это однозначно должен быть одностраничник (SPA).

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

База данных - это PostgreSQL, тут вообще даже без вариантов. Огромные массивы графических данных у нас хранятся в Jsonb.

И вот, ТЗ есть, технологии выбраны, но как это все должно выглядеть? Это был реальный вызов для дизайнера. Мы собирались много раз и обсуждали это, переделывали все по сто раз. Но наконец родили идею. Мы подумали, а зачем мы сами себе связываем руки с дурацкими полями ввода? Как нам удобнее всего указывать проемы на стенах? Как нам вообще из доступных размеров построить планировку квартиры? И мы поняли, что нужно мыслить шире.

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

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

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

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

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

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

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

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

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

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

У них сейчас в работе было взято пару объектов. На одном штукатурка и покраска стен, на втором плитка на стены. Решили сразу же все проверить в бою. Естественно, что успех любых расчетов очень сильно зависит от предварительных замеров, особенно, что касается толщины штукатурки. Но первые же расчеты просто поразили их. По штукатурке высчитали с точностью до одного мешка. По плитке на стены - с точностью до 3 плиток (3 осталось). Шпаклевка и акриловая краска также были высчитаны очень приближено к реальным, а грунтовки осталось пару лишних литров, чем рассчитало. Но здесь уже все зависит от водопоглощения стен. Штукатурка на себя возьмет больше грунтовки, а бетонная стена меньше.

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

Честно говоря, лично я не знаю, будет ли востребован наш сервис или нет, но в любом случае, работу мы проделали колоссальную и за результат нам не стыдно. А если еще сервис и будет приносить людям пользу, а нам заработок, то тогда вообще шикарно :)

Сам сервис можно глянуть здесь https://e-tamarin.com Каждому новому пользователю будет бесплатно начислен один проект.
 
Вот такая у нас получилась история, начинали с экселя, а закончили аналитическим комплексом. Всем удачи, до новых встреч.
2