Открыть список
Как стать автором
Обновить
  • по релевантности
  • по времени
  • по рейтингу

RealTimeBoard — новый способ совместной работы

Управление проектами
Совсем недавно открыл для себя новый интересный и крайне полезный сервис для совместной работы российский проект RealtimeBoard – бесконечные виртуальные доски, на которых можно работать с любым визуальным контентом (прикреплять картинки, рисовать схемы и графики, создавать коллажи и пр.) индивидуально или с командой.
На данном этапе сервис находится в открытом бета-тестировании, но это нисколько не мешает работать с ним уже сейчас и решать широкий круг задач.
image

Какие же задачи можно решать с помощью RealTimeBoard ?
Читать дальше →
Всего голосов 69: ↑56 и ↓13 +43
Просмотры49.9K
Комментарии 80

Какие инструменты мы используем для работы и общения с пользователями

Carrot questУправление проектамиУправление продуктомУправление персоналом
image

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

В Carrot quest мы нашли для себя оптимальный список таких сервисов-инструментов и хотим поделиться своим опытом. Мы долго искали удобную для нас форму работы. Система, которую мы выстроили, помогает нам делать свой продукт лучше и быстрее.
Читать дальше →
Всего голосов 11: ↑10 и ↓1 +9
Просмотры5.6K
Комментарии 5

Как построить команду и процессы, ориентированные на быстрый рост

MobioGrowth HackingКарьера в IT-индустрииКонференции
На конференции по продуктовому маркетингу Epic Growth Conference Андрей Хусид CEO RealtimeBoard поделился, как трансформировалась структура команды в соответствии с изменениями в продуктовой стратегии компании.


Смотрите видео и читайте заметки под катом.
Читать дальше →
Всего голосов 19: ↑19 и ↓0 +19
Просмотры4.2K
Комментарии 0

Невидимый деплой монолитного приложения в продакшн на AWS. Личный опыт

MiroAmazon Web ServicesDevOps
Из песочницы
Я – Lead DevOps Engineer в Miro (экс-RealtimeBoard). Поделюсь тем, как наша DevOps-команда решила проблему ежедневных серверных релизов монолитного stateful-приложения и сделала их автоматическими, невидимыми для пользователей и удобными для собственных разработчиков.

Наша инфраструктура


Наша команда разработки — это 60 человек, которые делятся на Scrum-команды, среди которых есть и команда DevOps. Большинство Scrum-команд поддерживают текущую функциональность продукта и придумывают новые фичи. Задача DevOps — создавать и поддерживать инфраструктуру, которая помогает приложению работать быстро и надёжно и позволяет командам быстро доставлять новый функционал до пользователей.

Читать дальше →
Всего голосов 16: ↑16 и ↓0 +16
Просмотры5.1K
Комментарии 4

О важных “невидимых" вещах — доверии, культуре и ценностях

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

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



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

На конференциях мне часто задают вопросы о том, как правильно делать OKRs, как это работает у нас в Miro и просят «покажи табличку» с OKRs. Как правило, табличкой это, конечно же, не решается.
Читать дальше →
Всего голосов 22: ↑20 и ↓2 +18
Просмотры4.7K
Комментарии 3

Как мы мигрировали базу данных из Redis и Riak KV в PostgreSQL. Часть 1: процесс

MiroPostgreSQLАдминистрирование баз данных
Это первая часть статьи, в которой я расскажу о том, как мы построили процесс работы над большим проектом по миграции БД: про безопасные эксперименты, командное планирование и кросс-командное взаимодействие. В следующих статьях подробней расскажу про технические проблемы, которые мы решали: про масштабирование и отказоустойчивость PostgreSQL и нагрузочное тестирование.



Долгое время основной базой данных в Miro (экс-RealtimeBoard) был Redis. Мы хранили в нём всю основную информацию: данные о пользователях, аккаунтах, досках и т.д. Всё работало быстро, но мы столкнулись с рядом проблем.

Проблемы с Redis

  1. Зависимость от сетевой задержки. Сейчас в нашем облаке она составляет порядка 20 мск, но при её увеличении приложение начнёт работать очень медленно.
  2. Отсутствие индексов, которые нужны нам на уровне бизнес-логики. Их самостоятельная реализация может усложнить бизнес-логику и привести к неконсистентности данных.
  3. Сложность кода также усложняет обеспечение консистентности данных.
  4. Ресурсоёмкость запросов с выборками.

Эти проблемы вместе с ростом количества данных на серверах послужили причиной для миграции БД.
Читать дальше →
Всего голосов 19: ↑19 и ↓0 +19
Просмотры6.9K
Комментарии 27

Наш подход к раскраске потоков

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

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


Читать дальше →
Всего голосов 13: ↑13 и ↓0 +13
Просмотры3.5K
Комментарии 2

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

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

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

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



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


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

Анна Бояркина, Miro (ранее RealtimeBoard): о продуктовом мышлении, культуре в командах, навыках будущего

Управление продуктомДизайнИнтервью


Я поговорил с Анной Бояркиной, главой продукта в Miro (ранее известном как RealtimeBoard) — платформе для визуальной коллаборации. Это восьмое в серии интервью с мастерами своего дела о продуктовом подходе, изменении поведения и предпринимательстве.

Читать дальше →
Всего голосов 28: ↑20 и ↓8 +12
Просмотры11K
Комментарии 3

Отказоустойчивый кластер PostgreSQL + Patroni. Опыт внедрения

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

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

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

Читать дальше →
Всего голосов 27: ↑27 и ↓0 +27
Просмотры22.3K
Комментарии 23

Как мы учились рисовать тексты на Canvas

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



Переезд с Flash


Мы создавали продукт в 2015 году на Flash. Внутри Flash есть текстовый редактор, умеющий хорошо работать с текстами, поэтому нам не нужно было делать ничего дополнительного для работы с текстами. Но в то время Flash уже умирал, поэтому мы переехали с него на HTML/Canvas. И перед нами встала задача — отображать текст на Canvas как в html-редакторе, при этом не сломать при переезде тексты, созданные во Flash-версии.
Читать дальше →
Всего голосов 45: ↑43 и ↓2 +41
Просмотры12.3K
Комментарии 19

Достоверный нагрузочный тест с учётом непредвиденных нюансов

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

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


Читать дальше →
Всего голосов 10: ↑10 и ↓0 +10
Просмотры6.3K
Комментарии 2

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

MiroТестирование IT-системТестирование веб-сервисов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 #запускаем тест

Читать дальше →
Всего голосов 4: ↑4 и ↓0 +4
Просмотры5.4K
Комментарии 0

Конференция для разработчиков платформ от Stripe, Intercom, JetBrains, Miro, ManyChat, Wrike, Targetprocess и др

MiroSaaS / S+SAPIКонференцииIT-компании
9 ноября мы проводим Platform Developers Conf — конференцию о создании платформ для разработчиков.

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

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

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

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


Читать дальше →
Всего голосов 13: ↑11 и ↓2 +9
Просмотры1.2K
Комментарии 5

How we learned to draw text on HTML5 Canvas

MiroJavaScriptHTMLCanvas
We are developing an online collaborative whiteboard, and we are using Canvas to display all graphics and text on boards. There is no out-of-the-box solution for displaying text on Canvas as you would in regular HTML. Hence, over the past several years, we’ve been iterating on this; and we finally think we’ve reached the best solution.

In this article, we will walk you through this transition from Flash to Canvas and why we gave up on using SVG foreignObject in the process.

image
Read more →
Всего голосов 7: ↑6 и ↓1 +5
Просмотры3.9K
Комментарии 0

Implementing Fault-Tolerance PostgreSQL Cluster with Patroni

MiroPostgreSQLDevOps
I'm a DevOps Teamlead at Miro. Our service is a high-load one: it is used by 4 million users worldwide, daily active users - 168,000. Our servers are hosted by Amazon and located in a single Ireland region. We have more than 200 active servers, with almost 70 of them being database servers.

The service's backend is a monolith stateful Java application that maintains a persistent WebSocket connection for each client. When several users collaborate using the same whiteboard, they see changes on the whiteboard in real-time. That's because we write every change to a database, resulting in ~20,000 requests per second to the databases. During peak hours, the data is written to Redis at ~80,000–100,000 RPS.

I am going to speak about why it is important to us to maintain PostgreSQL high availability, what methods we've applied to solve the problem, and what results we've achieved so far.

image
Read more →
Всего голосов 1: ↑1 и ↓0 +1
Просмотры3.4K
Комментарии 0

Культура как основа масштабирования команды х2 каждый год. Про ошибки в найме и culture fit

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

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

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

Эта статья — доработанная версия моего выступления на Saint TeamLead Conf. В конце статьи — список полезных источников по теме работы с корпоративной культурой в технологических компаниях.
Читать дальше →
Всего голосов 12: ↑11 и ↓1 +10
Просмотры6.7K
Комментарии 8

“Что делать, когда кардинальные изменения в процессах демотивируют команду”. Опыт бэкенд-инженера, ставшего тимлидом

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

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



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

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

Ниже расшифровка моего выступления на Saint TeamLead Conf 2019, где на примере своей команды я рассказываю про процессы и инструменты, которые сделали эти изменения возможными.
Читать дальше →
Всего голосов 11: ↑10 и ↓1 +9
Просмотры6.3K
Комментарии 16

Reliable load testing with regards to unexpected nuances

MiroТестирование IT-системАнализ и проектирование системТестирование веб-сервисовУправление продуктом
We thought about building the infrastructure for large load tests a year ago when we reached the mark of 12,000 simultaneously active online users. In three months, we made the first version of the test, which showed us the limits of the service.

The irony is that simultaneously with the launch of the test, we reached the limits on the production server, resulting in two-hour service downtime. This further encouraged us to move from making occasional tests to establishing an effective load testing infrastructure. By infrastructure, I mean all tools for working with load testing: tools for launching the test (manual and automatic), the cluster that creates the load, a production-like cluster, metrics and reporting services, scaling services, and the code to manage it all.

image

Simplified, this is what our structure looks like: a collection of different servers that somehow interact with each other, each server performing specific tasks. It seemed that to build the load testing infrastructure, it was enough for us to make this diagram, take account of all interactions, and start creating test cases for each block one by one.

This approach is right, but it would have taken many months, which was not suitable for us because of our rapid growth — over the past twelve months, we have grown from 12,000 to 100,000 simultaneously active online users. Also, we didn’t know how our service infrastructure would respond to the increased load: which blocks would become the bottleneck, and which would scale linearly?
Read more →
Всего голосов 4: ↑4 и ↓0 +4
Просмотры695
Комментарии 0

Managing hundreds of servers for load testing: autoscaling, custom monitoring, DevOps culture

MiroТестирование IT-системAmazon Web ServicesТестирование веб-сервисовDevOps
In the previous article, I talked about our load testing infrastructure. On average, we use about 100 servers to create a load, about 150 servers to run our service. All these servers need to be created, configured, started, deleted. To do this, we use the same tools as in the production environment to reduce the amount of manual work:

  • Terraform scripts for creating and deleting a test environment;
  • Ansible scripts for configuring, updating, starting servers;
  • In-house Python scripts for dynamic scaling, depending on the load.

Thanks to the Terraform and Ansible scripts, all operations ranging from creating instances to starting servers are performed with only six commands:

#launch the required instances in the AWS console
ansible-playbook deploy-config.yml #update servers versions
ansible-playbook start-application.yml #start our app on these servers
ansible-playbook update-test-scenario.yml --ask-vault-pass #update the JMeter test scenario if it was changed
infrastructure-aws-cluster/jmeter_clients:~# terraform apply #create JMeter servers for creating the load
playbook start-jmeter-server-cluster.yml #start the JMeter cluster
ansible-playbook start-stress-test.yml #start the test

Read more →
Всего голосов 1: ↑1 и ↓0 +1
Просмотры649
Комментарии 0
1