• Бесшовная миграция пользователей между доменами

      В начале 2019 года мы провели ребрендинг и поменяли название с RealtimeBoard на Miro. Следовательно, изменился домен сайта с realtimeboard.com на miro.com.

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

      Чтобы минимизировать потерю трафика после смены домена, нужно было провести миграцию авторизованных пользователей со старого домена на новый:

      • Поддержать пользователей, которые выполняли авторизацию с помощью SSO провайдеров через старый домен.
      • Передать токен авторизации пользователя со старого домена на новый.
      • Передать LocalStorage с пользовательскими настройками приложения.
      Читать дальше →
    • QA-процесс в Miro: отказ от водопада и ручного тестирования, передача ответственности за качество всей команде

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

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

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


        Читать дальше →
      • История первого HR’a в Miro: человек-оркестр, структура People Team, подход Excellence & Solutions

          В статье Влада Василец — первый HR в Miro — рассказывает, как и зачем наша HR-команда (мы называем её People Team) выросла с 1 до 37 человек за четыре года, в чём суть подхода Excellence & Solutions и каково это — видеть кратный рост команды и трансформироваться из человека-оркестра в профильного специалиста.

          Эта статья — конспект выступления Влады на конференции TechRec 2020.


          Читать дальше →
        • Postgres: bloat, pg_repack и deferred constraints



            Эффект раздувания таблиц и индексов (bloat) широко известен и присутствует не только в Postgres. Есть способы борьбы с ним “из коробки” вроде VACUUM FULL или CLUSTER, но они блокируют таблицы во время работы и поэтому не всегда могут быть использованы.

            В статье будет немного теории о том, как возникает bloat, как с ним можно бороться, о deferred constraints и о проблемах, которые они привносят в использование расширения pg_repack.
            Читать дальше →
            • +16
            • 2,9k
            • 4
          • “Что делать, когда кардинальные изменения в процессах демотивируют команду”. Опыт бэкенд-инженера, ставшего тимлидом

              Я 7 лет работал бэкенд-инженером в Miro, затем стал тимлидом. За последние годы наша инженерная команда выросла вдвое, стала распределённой и международной, что повлекло за собой множество изменений.

              Одним из них стало введение кросс-функциональных команд, которые бы могли решать задачу полностью, от проработки идеи до релиза фичи. Для этого бэкенд- и фронтенд-инженерам нужно было в короткие сроки освоить многое из того, чем раньше мы никогда не занимались: тестирование, работу с релизами, проведение скрам-ритуалов, — при этом не потерять в скорости и качестве.



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

              В итоге мы справились со штормом, вдвое уменьшили Lead Time и существенно продвинулись в эффективности кросс-функциональных команд. Этому во многом помогло изменение нашего отношения к происходящим переменам, переход от Fixed mindset к Growth mindset.

              Ниже — видео и расшифровка моего выступления на Saint TeamLead Conf 2019, где на примере своей команды я рассказываю про процессы и инструменты, которые сделали эти изменения возможными.
              Читать дальше →
            • Культура как основа масштабирования команды х2 каждый год. Про ошибки в найме и culture fit

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

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

              Расскажу, как исследование опыта успешных технологических компаний помогло нам сфокусироваться на управлении корпоративной культурой, справиться с ошибками в найме и выстроить процесс так, чтобы сегодня команда росла x2 ежегодно, а уровень текучки не поднимался выше 5%.

              Эта статья — доработанная версия моего выступления на Saint TeamLead Conf. В конце статьи — список полезных источников по теме работы с корпоративной культурой в технологических компаниях.
              Читать дальше →
              • +10
              • 4,5k
              • 8
            • Product Led Growth стратегия. Как Miro растут x3 ежегодно

                В статье Юля Малыш, Head of Growth в Miro, расскажет про основные составляющие нашей стратегии роста: ориентацию на пользователей, простоту и понятность продукта, виральность, стратегию вовлечения и метрики, ориентированные на продукт.

                За основу статьи взято выступление Юли на Epic Growth Summit.


                Читать дальше →
              • Победители Miro Platform Contest

                  В начале ноября мы объявили об открытой бете платформы Miro, провели конференцию о платформенной разработке с JetBrains, Stripe и другими компаниями (видео всех докладов), а также запустили онлайн-конкурс для разработчиков по созданию плагинов.

                  Конкурс завершился! В нём приняли участие инженеры из Польши, Швейцарии, Словакии, Белоруссии, Литвы, России и других стран.



                  Мы готовы объявить победителей!

                  Читать дальше →
                • Конкурс плагинов на платформе Miro с призовым фондом $21,000

                    Привет! Мы запустили онлайн-конкурс для разработчиков по созданию плагинов на нашей платформе. Он будет идти до 1 декабря. Приглашаем вас к участию!

                    Это возможность создать приложение для продукта с 3 млн пользователей во всём мире, среди которых команды из Netflix, Twitter, Skyscanner, Dell и других.



                    Правила и призы


                    Правила простые: создайте плагин на нашей платформе и пришлите его до 1 декабря.

                    6 декабря мы — команда платформы Miro — наградим авторов двадцати лучших плагинов:

                    • $10,000 за первое место,
                    • $5,000 за второе,
                    • $3,000 за третье,
                    • Подарочные сертификаты Amazon на $200 для авторов ещё 17 лучших приложений.
                    Читать дальше →
                  • Platform Developers Conf by Miro: онлайн-трансляция

                      Привет! Если вам не хватило мест на Platform Developers Conference, которая пройдёт в субботу, 9 ноября, не расстраивайтесь: мы организовали веб-трансляцию.

                      Конференция посвящена созданию платформ для разработчиков. В качестве спикеров — техлиды и ведущие инженеры из Stripe, Intercom, JetBrains, Miro и других компаний.



                      Трансляция начнётся в субботу в 9:00 по московскому времени. Чтобы подключиться, просто зайдите на страницу конференции.
                      Читать дальше →
                    • Конференция для разработчиков платформ от Stripe, Intercom, JetBrains, Miro, ManyChat, Wrike, Targetprocess и др

                        9 ноября мы проводим Platform Developers Conf — конференцию о создании платформ для разработчиков.

                        Огненные спикеры — техлиды и ведущие инженеры из Stripe, Intercom, JetBrains, Wrike, ManyChat, Targetprocess, Miro и других компаний. Будем говорить про API, вебхуки, архитектуру платформенных продуктов, экосистему и многое другое на стыке технологий и бизнеса.

                        Кроме того, на конференции представим бета-версию Miro Developers Platform, а разработчики из Targetprocess, Box UK и Postscriptum покажут демо готовых интеграций. В этот же день запустим онлайн-контест по созданию приложений на платформе с призовым фондом $20,000, который продлится до начала декабря.

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

                        Отправить заявку на участие


                        Читать дальше →
                      • Управление сотнями серверов для нагрузочного теста: автомасштабирование, кастомный мониторинг, DevOps культура

                          В прошлой статье я рассказал про нашу инфраструктуру большого нагрузочного теста. В среднем мы создаём порядка 100 серверов для подачи нагрузки и порядка 150 серверов для работы нашего сервиса. Все эти сервера нужно создавать, удалять, конфигурировать и запускать. Мы используем для этого те же инструменты, что и на проде, чтобы уменьшить количество ручной работы:

                          • Для создания и удаления тестового окружения — Terraform скрипты;
                          • Для конфигурирования, обновления и запуска — Ansible скрипты;
                          • Для динамического масштабирования в зависимости от нагрузки — самописные Python-скрипты.

                          Благодаря скриптам Terraform и Ansible, все операции от создания инстансов до запуска сервера выполняются всего шестью командами:

                          #запускаем нужные инстансы в консоли aws
                          ansible-playbook deploy-config.yml  #обновляем версии серверов
                          ansible-playbook start-application.yml  #запускаем наше приложение на этих серверах
                          ansible-playbook update-test-scenario.yml --ask-vault-pass #обновляем Jmeter сценарий, если в нём были изменения
                          infrastructure-aws-cluster/jmeter_clients:~# terraform apply #создаем jmeter сервера для подачи нагрузки
                          ansible-playbook start-jmeter-server-cluster.yml #запускаем jmeter кластер
                          ansible-playbook start-stress-test.yml #запускаем тест

                          Читать дальше →
                        • Достоверный нагрузочный тест с учётом непредвиденных нюансов

                            Мы задумались о построении инфраструктуры больших нагрузочных тестов год назад, когда достигли отметки в 12K онлайн-пользователей, работающих в нашем сервисе одновременно. За 3 месяца мы сделали первую версию теста, которая показала лимиты сервиса.

                            Ирония судьбы в том, что одновременно с запуском теста мы достигли лимитов на проде, в результате чего сервис упал на 2 часа. Это дополнительно стимулировало нас начать двигаться от проведения тестов от случая к случаю к созданию эффективной нагрузочной инфраструктуры. Под инфраструктурой я подразумеваю все инструменты для работы с нагрузкой: инструменты для запуска и автозапуска, кластер для подачи нагрузки, кластер, аналогичный проду, сервисы для сбора метрик и для подготовки отчётов, код для управления всем этим и сервисы для масштабирования.


                            Читать дальше →
                            • +10
                            • 5,2k
                            • 2
                          • Как мы учились рисовать тексты на Canvas

                              Мы разрабатываем платформу для визуальной коллаборации. Для отображения контента мы используем Canvas: на нём рисуется всё, в том числе тексты. Готового решения для отображения текстов на Canvas один в один как в html не существует. За несколько лет работы с отрисовкой текстов мы изучили разные варианты реализации, набили много шишек и, кажется, нашли хорошее решение. Расскажу в статье, как мы переезжали с Flash на Canvas и почему отказались от SVG foreignObject.



                              Переезд с Flash


                              Мы создавали продукт в 2015 году на Flash. Внутри Flash есть текстовый редактор, умеющий хорошо работать с текстами, поэтому нам не нужно было делать ничего дополнительного для работы с текстами. Но в то время Flash уже умирал, поэтому мы переехали с него на HTML/Canvas. И перед нами встала задача — отображать текст на Canvas как в html-редакторе, при этом не сломать при переезде тексты, созданные во Flash-версии.
                              Читать дальше →
                            • Отказоустойчивый кластер PostgreSQL + Patroni. Опыт внедрения

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

                                У нас высоконагруженный сервис: 2,5 млн пользователей по всему миру, 50К+ активных пользователей каждый день. Сервера находятся в Amazone в одном регионе Ирландии: в работе постоянно 100+ различных серверов, из них почти 50 — с базами данных.

                                Весь backend — большое монолитное stateful-приложение на Java, которое держит постоянное websocket соединение с клиентом. При одновременной работе нескольких пользователей на одной доске все они видят изменения в режиме реального времени, потому что каждое изменение мы записываем в базу. У нас примерно 10К запросов в секунду к нашим базам. В пиковой нагрузке в Redis мы пишем по 80-100К запросов в секунду.

                                Читать дальше →
                              • Качество — ответственность команды. Наш QA опыт

                                  Я работаю QA-инженером в Miro. Расскажу о нашем эксперименте по передаче разработчикам части задач по тестированию и трансформации роли тестера в роль QA (Quality assurance).

                                  Сначала коротко о нашем процессе разработки. У нас ежедневные клиентские релизы и от 3 до 5 серверных релизов в неделю. В команде разработки 60+ человек, которые поделены на 10 функциональных scrum-команд.

                                  Я работаю в команде Integration, задача которой — интеграция нашего сервиса во внешние продукты и интеграция внешних продуктов в наш сервис. Например, мы интегрировали таск-трекер Jira. Jira Cards — визуальное отображение задач, с которыми можно удобно работать на доске, не заходя в Jira.



                                  С чего начался эксперимент


                                  Началось всё с банальной проблемы. Когда кто-то из тестировщиков уходил на больничный — производительность команды сильно снижалась. Команда продолжала работать над задачами, но код доходил до этапа тестирования и задача вставала на паузу. В результате новый функционал не попадал на production вовремя.
                                  Читать дальше →
                                  • +11
                                  • 11,4k
                                  • 4
                                • Большая подборка полезных ресурсов для продакт-менеджеров

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

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



                                    Избранное


                                    Название Почему стоит читать
                                    Good product manager, Bad Product Manager, Ben Horowitz Классическое эссе о продуктовом образе мышления. Читать для вдохновения.
                                    Лидерство
                                    Be a great product leader Ещё одно классическое эссе о лидерстве и ответственности продуктовых менеджеров.
                                    Лидерство
                                    Intercom on Product Management Исчерпывающая книга о продуктовом подходе от Intercom.
                                    Стратегия, практика
                                    SaaS metrics 2.0 — A guide to measuring and improving what matters Обстоятельная статья о самых важных SaaS-метриках.
                                    SaaS, метрики, рост
                                    Дао продакт-менеджера в Profi.ru + Чек-лист образовательного контента для PM от IT-Agency Хорошая подборка ресурсов о знаниях и навыках продакт-менеджера.
                                    Список

                                    Читать дальше →
                                  • Наш подход к раскраске потоков

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

                                      Сейчас у нас 47 000 пользователей ежедневно, около 30 серверов в production, 2 000 API запросов в секунду и ежедневные релизы. Сервис Miro развивается с 2011 года, и в текущей реализации пользовательские запросы обрабатываются параллельно кластером разнородных серверов.


                                      Читать дальше →
                                      • +13
                                      • 3,3k
                                      • 2
                                    • Эволюция кластерного взаимодействия. Как мы внедряли ActiveMQ и Hazelcast

                                        В течение последних 7 лет я вместе с командой занимаюсь поддержкой и развитием ядра продукта Miro (экс-RealtimeBoard): клиент-серверным и кластерным взаимодействием, работой с базой данных.

                                        У нас Java с разными библиотеками на борту. Запускается всё вне контейнера, через Maven-плагин. В основе — платформа наших партнёров, которая позволяет работать с базой данных и потоками, управлять клиент-серверным взаимодействием и т.д. БД — Redis и PostgreSQL (мой коллега написал о том, как мы переезжаем с одной БД на другую).

                                        С точки зрения бизнес-логики приложение содержит:

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

                                        В 2011 году, когда мы только начинали, весь Miro находился на одном сервере. На нём было всё: Nginx, на котором крутился php для сайта, Java-приложение и базы данных.

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

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



                                        Дальше расскажу о сложностях, с которыми мы столкнулись при развитии кластеров и масштабировании Java-приложения и инфраструктуры.
                                        Читать дальше →
                                      • О важных “невидимых" вещах — доверии, культуре и ценностях

                                        Я — Head of Product в Miro (экс-RealtimeBoard). Я люблю дерзкие цели и постоянно думаю о том, где нас ждут новые горизонты, как улучшить результаты, как завтра стать лучше, чем мы были вчера. И ещё я много думаю о том, насколько важна в этом увлекательном путешествии команда. Мы много внимания уделяем тому, чтобы все в команде понимали цели компании, стратегию и наш прогресс в их достижении.

                                        “Если хочешь идти быстро — иди один, если хочешь дойти далеко — идите вместе”. Говорят, это африканская пословица.



                                        Сейчас популярно внедрять OKRs (Objectives and Key Results), KPI и прочие методы повышения эффективности. Иногда оказывается, что эти фреймворки не работают или требуют много микроменеджмента и становятся больше pain in the ass, чем реальным помощником в достижении результата.

                                        На конференциях мне часто задают вопросы о том, как правильно делать OKRs, как это работает у нас в Miro и просят «покажи табличку» с OKRs. Как правило, табличкой это, конечно же, не решается.
                                        Читать дальше →
                                        • +18
                                        • 4,2k
                                        • 3

                                      Самое читаемое