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

Ошибка №1. Начали разрабатывать десктопное приложение на Electron

Electron – фреймворк с открытым исходным кодом для создания десктопных мультиплатформенных приложений с использованием языков JavaScript/HTML/CSS.

В 2018-2019 годах, когда мы начали разработку, экосистема Electron была достаточно маленькой, проект только начал обрастать комьюнити, библиотеками и Best Practice.

Столкнувшись с первыми трудностями сборки проекта в стеке Electron + Vue и победив их, мы думали, что сложнее проблем уже не будет. Но они начались при использовании нативных возможностей ОС.

Так как у нас трекер времени, нам нужно снимать экран, действия пользователя, сайты, на которых он сидит, и используемые приложения. Необходимо было дописывать модуль для трекинга самостоятельно на C++ и прибиндить его к Node.JS модулю.

Гайдов и мануалов по этому ещё не было, мы решили что не будем отказываться от этой функции, так как она была нашим конкурентным преимуществом на рынке и решили переписать все на C++ в связке с Qt. К счастью, удалось найти друга, который взялся за проект и реализовал его за пару месяцев.

Ошибка №2. Выбрали старые технологии

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

В прототипе мы использовали jQuery в связке с UI фреймворком Bootstrap 4. Как прототип сервис работал отлично, только показывать это миру было нельзя. Также такая тесная связка фронтенда с бэкендом сильно замедляла разработку продукта – мы тонули в багах и не успевали делать фичи.

Решили, что будем делать полноценный дизайн и искать в команду фронтендера. Жаль, конечно, эти 3 месяца работы над интерфейсом, но решение было принято ????

После jQuery и Bootstrap перешли на Vue.js – он нам показался удобным, текущая команда бэкендеров знала Vue, а мы могли спокойно провести собеседование на позицию фронтендера.

Ошибка №3. Не протестировали отчёты на большом объёме данных в PostgreSQL

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

На большом объёме данных агрегационные функции PostgreSQL показали себя достаточно плохо. Мы решили обработать их в Python, но это тоже не дало результата – запросы по-прежнему обрабатывались от 1-30 секунд в зависимости от объёма данных.

Проблему решили переходом на Clickhouse от Яндекса. Принципы построения таблиц отвечали нашему формату – удалось сократить время ответа с 30 секунд до 50 миллисекунд (если честно, я не знаю, как там это работает под капотом, сколько с командой не смотрели конференции и выступления по ClickHouse, ответ так и не получили, но результатом довольны). Визуально отчёт выглядит так:

А это код запроса после перехода (оказался кратно проще, если исчислять в количестве строчек кода):

Ошибка №4. Подходили к дизайну несистемно

Мы прошли 4 итерации дизайна, чтобы прийти к нынешнему внешнему виду сервиса. Сразу желаемого не добились, потому что мы не использовали системный подход. К работе мы привлекали веб-дизайнеров, которые до этого работали только с лендингами, маленькими сайтами и интернет-магазинами: им просто не хватало релевантного опыта.

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

По-прежнему не обходимся без ошибок при разработке новых интерфейсов — часто меняем и переделываем их на этапе проектирования, а при запуске отслеживаем фидбэк и оперативно исправляем недочёты. К фокус-группам и дополнительным исследованиям не обращаемся, A/B тесты не проводим.

Ошибка №5. Плохо настраивали мониторинг и слабо развивали инфраструктуру

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

Раньше мы использовали только одну метрику — доступность сервера. Не проверяли нагрузку на него и оперативную память, поэтому время ответа доходило до 30 секунд (у нас так настроен таймаут). К тому же, 16 Гб оперативной памяти с задачей не справлялись.

Наша инфраструктура стоила приблизительно 500$ на Digital Ocean до февраля этого года, но в ближе к весне мы вынужденно переехали к другому хостеру. Долго присматривались к Selectel, который располагал SaaS-решениями для баз данных и удобного управления серверами, но дорого стоил.

Даже сделали сравнительную таблицу с ценами инфраструктуры Digital Ocean и Selectel при курсе доллара 90 на момент переезда.

Предложений лучше не нашли, решили, что нужно переезжать. Но сделать это качественно за две ночи нам одним было сложно: привлекли part-time dev-ops команду наших друзей. Благодаря им получилось перевезти инфраструктуру в Россию без затруднений.

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

Мораль

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

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

Максим Стихарев

Технический директор Shtab

Комментарии (18)


  1. M0rdecay
    17.10.2022 18:55
    +14

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

    Это точно функционал, которому место в тайм-трекере? Во-первых, кажется, что без этого переход с электрона не нужОн, во-вторых, не вяжется с позиционированием продукта; цитата с сайта:

    ведите учёт рабочего времени без нарушения личных границ


    1. ovalsky
      17.10.2022 21:11
      +2

      когда поторопился со статьёй )))


    1. Mstikh Автор
      17.10.2022 21:15
      -6

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


      1. tmplts
        18.10.2022 08:03
        +1

        Прямо "стандарт"? Где можно почитать об этом?


      1. pfffffffffffff
        18.10.2022 23:33

        Где можно прочитать про трекинг?


  1. vagon333
    17.10.2022 19:50

    Ошибка №3. Не протестировали отчёты на большом объёме данных в PostgreSQL

    Пара вопросов:

    1. вы хранили данные в реляционной модели, как нормированные, с сылками и индексами, или в JSON?

    2. для фильтрации использовали ORM или прямые SQL запросы?


    1. Mstikh Автор
      17.10.2022 21:16

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


  1. markelov69
    17.10.2022 19:57
    +17

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

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


    1. MaryRabinovich
      17.10.2022 20:01
      +1

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


      1. Mstikh Автор
        17.10.2022 21:18

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


    1. Mstikh Автор
      17.10.2022 21:19
      -9

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


      1. markelov69
        17.10.2022 23:22
        +9

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

        Что за бред??? Это вообще не стандарт! Даже не близко, это просто максимально зашкварное отношение к своим работникам и не уважение. Я даже не знаю кем нужно быть чтобы соглашаться на такие условия "труда".


        1. funca
          18.10.2022 03:00

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

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

          Т.е. если вам не говорят, то это ещё не значит, что за вами не следят - технически задача решается соответствующей настройкой фильтров и алертов, в т.ч. с использованием ретроспективных данных, которые обязаны храниться годами. Проблема известна (например Microsoft Office 365 has ability to spy on workers) но менять что-либо всерьез, понятно, ни кто не торопится.


  1. itmbin
    18.10.2022 08:05

    А как решали вопрос с транзакциями в Clickhouse? Насколько помню, их там пока нет


    1. Mstikh Автор
      18.10.2022 08:09

      А они в целом и не нужны, кликхаус у нас выступает как бд для аналитики, основной набор данных у нас лежит в postgres.


      1. Ivan22
        18.10.2022 11:24

        и как часто вы перекачиваете данные из Pg в Сlik?


        1. Mstikh Автор
          18.10.2022 14:15

          Раз в минуту стоит селери-таска, ранее было раз в 15 минут из за проблем с ORM и скоростью запроса, с чистым SQLом сократили на пару секунд, теперь упираемся только в Python


  1. inemiten
    20.10.2022 07:47

    Так и не понял, что именно вы разработали: "таск-трекер" (из названия статьи), трекер времени (из содержания статьи), или spyware (из сути написанного)?