Практически каждый день я читаю и узнаю что-то новое про разработку. Формат "я узнал о... #" - это краткая выжимка идей, заметок и концепций, про которые я прочитал или узнал за неделю. За эту неделю я узнал про FinOps, Obsidian, DevOps фреймворк DORA и шрифт Google Sans. А ещё подумал о спорте и разнице между OLTP и OLAP нагрузкой.

Содержание

  • FinOps

  • Obsidian

  • DevOps фреймворк DORA

  • Шрифт Google Code Sans

  • OLAP и OLTP нагрузка

FinOps

Задумка FinOps заключается в том, что мы начинаем считать расходы на DevOps и инфраструктуру в компании. Чтобы потом всё это счастье оптимизировать и сэкономить (в идеале, спрогнозировать расходы и риски).

Само название меня немного насмешило, потому что взяли "Ops" и добавили к нему другой префикс, чтобы выглядело солиднее. Стартапы очень любят таким же образом добавлять слово "Tech" ко всему подряд. Началось с EdTech и понеслось... AgroTech, FoodTech, PetTech, SleepTech, SexTech, HrTech.

Возвращаясь к сути: FinOps - это когда на уровне компании мы перманентно мониторим инфраструктуру, её загрузку и расходы, а затем ищем способы оптимизации.

McKinsey говорит, что от ~20% расходов на инфраструктуру в бигтехах уходят впустую. Следовательно, раз это нижняя планка, в среднем можно брать ~30%.

Например:

  • сервера, которые взяли с запасом, и >50% ресурсов не используются (но оплачиваются);

  • сервера для тестировщиков и стейджинга, которые мы купили и забыли про них;

  • прожорливые сервера у проектов, которые не особо-то рентабельны (и стоит подумать уже об оптимизации кода).

Контроль делается за счёт того, что:

  1. Мы начинаем в целом считать инфраструктуру, чтобы понимать, что в компании есть;

  2. Затем мы начинаем мониторить утилизацию инфраструктуры, чтобы находить простаивающие ресурсы;

  3. Каждый инстанс закрепляем за конкретной командой или человеком, чтобы посчитать ROI этой команды в контексте инфры

Дополнительный бонус: CTO проще объяснить фин. директору, куда и зачем мы платим, и сколько примерно денег потребуется на следующий период.

Есть софт, чтобы считать инфраструктуру в гетерогенных облаках. Есть Kubecost, который умеет считать расходы в k8s. Есть разные опции в Terraform, чтобы считать стоимость инфраструктуры.

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

Когда это нужно?

Пока расходы меньше $30к/мес. - должно хватать гугл-таблицы и зоркого взгляда CTO/DevOps'а. И дружеского вопроса команде: - "А зачем нам это?".

Когда расходы >$30к/мес. и оперативной памяти ответственного лица не хватает - можно начинать думать об автоматизации сбора метрик. Иначе до этого момента автоматическое сведение метрик воедино рискует просто не окупиться.

Obsidian

Obsidian - это система для ведения заметок с построением графов связей и open source плагинами. Все заметки хранятся локально в .md файлах, но умеют синхронизироваться между устройствами всего за $5.

Много раз слышал о ней от разработчиков и GTD‑извращенцевфанатиков. Причём многие за счёт плагинов из программы для заметок делают звездолёт - с календарями, Kaban'ами, SQL запросами и всевозможными синхронизациями.

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

Вообще, у меня есть самописная CRM‑система для себя же самого. В ней есть Kanban‑доски по всем моим активностям, календарь с планированием в рамках дня и недели, система заметок, сделанная из WYSIWYG‑редактора и система трекинга привычек.

Всё это с синхронизацией между компьютером и телефоном.

В какой-то момент она даже бэкапила все мои проекты до появления Postgresus'a.

Но вот заметки - была большая боль. Эдакий Apple Notes на минималках. Нет вложенности, нет нормального форматирования, нет связей и немного притормаживает.

За неделю использования Obsidian вижу следующие плюсы:

  • всё работает жутко шустро за счёт локального хранения и .md формата;

  • добавляет спокойствие из-за хранения всего локально (даже если Obsidian умрёт — все файлы останутся);

  • удобное форматирование и связи;

  • удобно рисовать графики через Canvas и mermaid диаграммы (как PlantUML, но для .md);

  • я начал структурировать всё, что читаю или узнаю.

Пока не нравится:

  • не хватает AI с автокомплитом/автофиксом (как в Cursor'e);

  • хотелось бы в заметки вставлять Google таблицы.

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

DevOps фреймворк DORA

DORA - это DevOps фреймворк из 4-х метрик, которые помогают оценить эффективность и качество релизного процесса.

Фреймворк придумала компания с таким же названием (DevOps Research and Assessment). Скорее всего, чтобы проще продавать свой консалтинг. В 2018-м году эту компанию купил Google Cloud и сделал своей... командой.

Вообще, про эти метрики в том или ином виде я знал. Но не знал, как они систематизированы и по-умному называются.

Собственно, сами метрики:

1) Частота деплоя (deployment frequency)
Показывает, насколько адекватный уровень автоматизированного тестирования. И умеет ли команда релизить точечно, а не сразу всё.

Критерии:

  • отлично: несколько раз в день;

  • хорошо: раз в 1-7 дней;

  • средне: несколько раз в месяц;

  • плохо: реже, чем раз в месяц.

2) Время от коммита до деплоя (Lead Time)
Показывает, как долго мы тормозим с бюрократией после момента, когда код уже готов. Низкое значение - неэффективное тестирование, процессы ревью или разработки.

Критерии:

  • отлично: меньше дня;

  • хорошо: от 1-го до 7 дней;

  • средне: 7-30 дней (*по оценке компании DORA, я бы сказал, что это плохой результат);

  • плохо: дольше месяца.

3) % сбоев после релиза (Change Failure Rate)
Показывает, как часто мы ломаем прод релизами. Что говорит о том, насколько хорошо мы прорабатываем требования, умеем тестировать и в целом о предсказуемости того, что мы выкладываем.

Критерии (% релизов, которые привели к сбою):

  • отлично: <5%;

  • хорошо: <10%;

  • средне: <15%;

  • плохо: >15%.

4) Скорость восстановления (Mean Time To Recovery)
Показывает, как быстро мы поднимаем прод, если он сломался (упал, пришёл DDOS, выключились сервера). А ещё, умеем ли мы определять и измерять сбои. Упавшим продомом считается или факт того, что существенная часть системы недоступна, или коммит с hotfix'ом.

Критерии (как быстро поднимаем прод):

  • отлично: меньше часа;

  • хорошо: меньше дня;

  • средне: меньше дня;

  • плохо: больше дня.

Когда это нужно?

Для себя я выделил три критерия, когда эти метрики имеет смысл считать:

  1. Когда есть конкретный продукт в активной стадии развития с постоянной командой хотя бы из 3-5 разработчиков. Т.е. это не что-то, что получает несколько фич в месяц или находится в стадии активного саппорта.

  2. Когда компания большая, в которой появилось много команд с продуктами и нужно выстроить хоть какое-то понимание в среднем по компании. Вот тут, кстати, важно не начать погоню за метриками, т.к. все внутренние проекты живут в своём темпе. Нельзя выставить одинаковые метрики всем поголовно в качестве KPI.

  3. Когда СТО\CIO нужны хоть какие-то метрики для отчётности. Чтобы объяснить инвесторам или нетехнической части C level'a, что в компании или команде хороший DevOps процесс (или, наоборот, плохой).

DORA метрики измеряются через GitLab или почти любую другую систему CI \ CD. GitLab умеет считать всё это из коробки. За исключением, наверное, падения прода (что тоже можно добавить вручную или вебхуками \ alert manager'ами).

Шрифт Google Code Sans

Так получилось, что я никогда особенно не запаривался из-за настроек IDE и шрифтов. Главное, чтобы шрифт был моноширный, а остальное без разницы.

По началу это был Eclipse не помню с каким шрифтом. Потом много лет JetBrains Mono, который стоял по умолчанию в IDEA. В какой-то момент я начал активно использовать VS Code. В нем стоял стандартны шрифт Consolas. Я к нему настолько привык, что поставил во все IDE.

Но несколько недель назад увидел обсуждение шрифтов на Хабре.

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

Один из комментариев был про Google Code Sans. Его выложили в открытый доступ примерно год назад.

Я решил попробовать, установил везде и... оказалось очень удобно и визуальном приятно.

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

Рекомендую попробовать (разработчиской части тех, кто читает этот текст).

OLAP и OLTP нагрузка

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

При работе с базой данных нагрузку обычно делят на два типа: OLTP и OLAP.

OLTP нагрузка (On Line Transaction Processing) - это когда много мелких операций (транзакций) практически в режиме реального времени. Которым, как правило, требуется ACID.

Примеры операций (утрированно):

  • зарегистрировать пользователя;

  • запросить информацию об аккаунте;

  • сделать банковскую операцию;

  • увеличить игровой баланс;

  • обновить название товара;

  • получить список покупок за пользователя; и т.д.

Это тот режим, в котором работают из коробки PostgreSQL, MySQL, MongoDB и другие стандартные базы данных. Такой формат данных даёт максимальную скорость при высокой надёжности (и поддерживает ACID).

Данные при OLTP нагрузке хранятся в строках. Для ускорения поиска создаются индексы, которые ускоряют поиск нужных строк.

Пример записи данных:

user_id, order_id, status
 (101, 5001, paid)
 (102, 5002, pending)
 (101, 5003, shipped)
 ...
 (103, 5004, paid)
 (104, 5005, canceled)
 (101, 5006, paid)
 (105, 5007, refunded)
 ...

OLAP нагрузка (On Line Analytical Processing) - это когда мы пишем очень большой объём данных (терабайты сырых данных), при этом запрашиваем их относительно редко и с целью анализа на большом промежутке времени.

Например:

  • считаем показатели по продажам за прошлый год;

  • считаем LTV пользователей в разрезе по продуктам;

  • считаем корреляцию между временем суток и посещением страниц приложения пользователями во время акции;

  • записываем аналитику по кликам пользователей на нашем сайте;

  • записываем и анализируем телеметрию.

Такой формат хранения поддерживают колоночные (иногда их называют "аналитические") базы данных по типу ClickHouse, TimescaleDB и т.д.

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

Сами данные хранятся в колонках:

(101, 102, 101, ... 103, 104, 101, 105, ...)
(5001, 5002, 5003, ... 5004, 5005, 5006, 5007, ...)
(paid, pending, shipped, ... paid, canceled, paid, refunded, ...)

При этом данные оптимизируются за счёт сортировки. Иногда необходимое место для хранения можно ужимать в десятки и сотни раз за счёт оптимизации повторяющихся данных. Концептуально это выглядит так:

user_id = (101, {start: 0, count: 2}, 102, {start: 2, count: 1}, ...)
order_id = (5001, {start: 0, count: 1}, 5002, {start: 1, count: 1}, ...)
status = (paid, {start: 0, count: n}, pending, {start: k, count: m}, ...)

Ещё есть базы данных, которые поддерживают одновременно и OLAP, и OLTP виды нагрузки.

ROLAP (Relational Online Analytical Processing) - это когда одновременно пишем и в OLTP, и строим индексы поверх важных данных для OLAP запросов. Сразу всё и туда, и туда не пишем, потому что скушаем слишком много места.

Такой вид нагрузки поддерживают PostgreSQL, Oracle и MySQL, если к ним добавить плагины и надстройки.

HTAP (Hybrid Transactional / Analytical Processing) - это когда база из коробки (без надстроек) умеет одновременно и в OLTP, и OLAP. Достигается или за счёт одновременной записи в строки и колонки, или за счёт оптимизаций в RAM.

Из БД, которые так умеют, я слышал только про CockroachDB.

Лично я не знаю кейсы, когда нужно брать ROLAP или HTAP базы. Только слышал, что такое бывает полезно в SAP, 1C и ERP системах.

В остальном для всего, что не аналитика - я беру PostgreSQL. Всё, что аналитика - или пытаюсь засунуть в PostgreSQL, если маленький объём данных. Или ClickHouse, если данных действительно очень много, а запросы действительно аналитические.


Может быть интересно:

P.S. Ещё у меня есть: Telegram канал, если вдруг интересны мои заметки о разработке.

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