Почти три года назад мы запустили сервис для управления проектами, но без ошибок не обошлось. Делюсь опытом, чтобы на наши грабли больше никто не наступил.
Ошибка №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)
vagon333
17.10.2022 19:50Ошибка №3. Не протестировали отчёты на большом объёме данных в PostgreSQL
Пара вопросов:
вы хранили данные в реляционной модели, как нормированные, с сылками и индексами, или в JSON?
для фильтрации использовали ORM или прямые SQL запросы?
Mstikh Автор
17.10.2022 21:16Хранили в реляционной нормированной модели, с ссылками, индексами, при обороте в несколько десятков миллионов БД на среднем сервере задыхалась. При этом запрос не то чтобы выходил сложный, один-два джойна по индексу. При этом кликхаус на кратно меньших ресурсах выполняет запросы с феноменальной скоростью, так будто постоянно попадает в кэш.
Естественно старались использовать ORM по максимуму где это возможно, продолжаем это делать даже с использованием кликхауса, благо есть хорошая ORM которая ещё и с Django дружит.
markelov69
17.10.2022 19:57+17нам нужно снимать экран, действия пользователя, сайты, на которых он сидит, и используемые приложения
Неужели до сих пор существуют люди которые себя вообще ни капли не уважают и ни во что не ставят, и соглашаются чтобы их экран и их действия снимала какая-то паршивая программка. Жесть, нет слов вообще.
MaryRabinovich
17.10.2022 20:01+1Учитывая, что у них всё десктопное, возможно, юзера и не предупреждали, ага. Работа в офисе, в офисе комп, а на компе заранее установлено вот это вот.
Mstikh Автор
17.10.2022 21:18В трекере отображается вся информация о том что снимают, когда и с какой периодичностью, если включены скриншоты то пользователю каждый раз приходит уведомление о том что был снят скриншот, также скриншот может быть отправлен в модерацию пользователем, такой скриншот менеджер не увидит, если пользователь не разрешит (а в 99% случаев туда даже никто не заходит из пользователей, значит менеджер в целом не увидит)
Mstikh Автор
17.10.2022 21:19-9Трекинг времени уже стандарт индустрии разработки и не только в большом количестве компаний.
markelov69
17.10.2022 23:22+9Трекинг времени уже стандарт индустрии разработки и не только в большом количестве компаний.
Что за бред??? Это вообще не стандарт! Даже не близко, это просто максимально зашкварное отношение к своим работникам и не уважение. Я даже не знаю кем нужно быть чтобы соглашаться на такие условия "труда".
funca
18.10.2022 03:00Это довольно скользкая тема. В цивилизованных культурах, откровенная слежка за сотрудниками не является социально одобряемой, и местами откровенно незаконной. Нет, вы можете им такое организовать, но с кучей разных оговорок. Например, если сотрудник сам соглашается на работу в подобном особом режиме, получая от этого какие-то дополнительные плюшки. Иначе можно легко ненароком вмешаться в чью-то частную жизнь и получить за это крупные иски и штрафы с разных сторон, сводящие на нет коммерческую выгоду от всей такой затеи.
С другой стороны, следуя требованиям различных стандартов безопасности, риск менеджмента и аудита, компания должна собирать кучу данных о том, что происходит в ее инфраструктуре и на устройствах сотрудников во время работы. Поэтому соответствующая функциональность предоставляется из коробки многими вендорами. В принципе, такие данные позволяют легко понять на что конкретный сотрудник тратит свое рабочее время, не особо это у себя афишируя.
Т.е. если вам не говорят, то это ещё не значит, что за вами не следят - технически задача решается соответствующей настройкой фильтров и алертов, в т.ч. с использованием ретроспективных данных, которые обязаны храниться годами. Проблема известна (например Microsoft Office 365 has ability to spy on workers) но менять что-либо всерьез, понятно, ни кто не торопится.
inemiten
20.10.2022 07:47Так и не понял, что именно вы разработали: "таск-трекер" (из названия статьи), трекер времени (из содержания статьи), или spyware (из сути написанного)?
M0rdecay
Это точно функционал, которому место в тайм-трекере? Во-первых, кажется, что без этого переход с электрона не нужОн, во-вторых, не вяжется с позиционированием продукта; цитата с сайта:
ovalsky
когда поторопился со статьёй )))
Mstikh Автор
У нас для скриншотов есть опция блюрить sensetive контент, поэтому личные границы они в целом и не нарушают, все опции настроек видны в трекере и понятно именно пользователю, снимают о нем эти данные или нет. К сожалению без этих функций никак, уже устоявшийся стандарт в мире трекинга.
tmplts
Прямо "стандарт"? Где можно почитать об этом?
pfffffffffffff
Где можно прочитать про трекинг?