Pull to refresh
19
0
Vladimir @mvs

Creator, founder, developer

Send message

Опыт создания онлайн-настолки: от идеи до реализации

Level of difficultyMedium
Reading time9 min
Views527

Пару лет назад единственной настольной игрой, в которую я играл онлайн с друзьями, была «Монополия». Со временем она начала надоедать, и мне захотелось чего‑то нового. Моим открытием стала Machi Koro — экономическая карточная игра, где победа зависит не столько от случайности, сколько от выбранной стратегии, что выгодно отличает её от «Монополии».

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

Читать далее

Развертывание микросервисов: проблемы, решения, стратегии, антипаттерны, практические рекомендации

Level of difficultyMedium
Reading time25 min
Views5.5K

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

Читать далее

Лексоранги — что это такое и как их использовать для эффективной сортировки списков

Reading time8 min
Views4.4K
В этой статье я расскажу, что такое Лексоранги, как ими пользуются в Jira, и как ими воспользовались мы для эффективной сортировки списков и перетаскивания элементов в нашем мобильном приложении.


Читать дальше →

strlen() vs mb_strlen(): Почему 71% PHP-разработчиков ошибаются

Level of difficultyMedium
Reading time7 min
Views3.8K

 В этой статье разберем, как PHP работает со строками и почему даже простой вызов strlen() может привести к неожиданным результатам. На примере крайне простой задачи "что выведет echo strlen('привет!');" посмотрим, что и как влияет на подсчет длины строки, заглянем внутрь реализации strlen() и развенчаем миф о строках как массивах.

Задача в телеге

В одной группе телеграмма с задачами по PHP недавно встретил простой вопрос: что выведет код «echo strlen(‘привет!’);»?
Был вопрос и 4 варианта ответа.

Вроде бы все просто. Но правильно ответили лишь 16%. Наиболее популярным ответом оказался «7», что неверно. Но именно его дали 71% ответивших.

Читать далее

Анемичные модели с логикой в сервисах: плюсы и минусы одного из самых популярных подходов к разработке на PHP

Level of difficultyEasy
Reading time7 min
Views2.5K

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

Читать далее

Одноклассовый энтерпрайз

Level of difficultyHard
Reading time30 min
Views10K

В пригороде далекого города Нью-Дели жил простой индийский паренек со сложным именем Чандракант. Любил он маму, Кришну и общаться с волшебными говорящими грибами.

Читать далее

Прогрессивный JSON

Level of difficultyEasy
Reading time10 min
Views18K

Вы знаете, что такое прогрессивный JPEG? Можете почитать хорошее объяснение. Идея заключается в том, что вместо загрузки изображения сверху вниз оно сначала грузится размытым, а потом постепенно становится чётче.

Что, если мы применим тот же принцип к передаче JSON?

Читать далее

Как работает безопасность, когда никто никому не доверяет — Zero Trust на пальцах

Reading time10 min
Views15K

Вы потратили кучу времени на защиту снаружи: двухфакторка, фаерволы, бюрократическая заморочка для каждого. Это всё правильно, но один фишинговый email, одна слабая учётка — и левый юзер уже внутри вашей сети. А дальше: данные HR-отдела, финансовая информация, API — доступ ко всему, потому что система считает его «своим».

Часто слышали от коллег про Zero Trust, но руки так и не доходили вникнуть? Zero Trust — это схема «меньше доверяй, больше проверяй», прямо как в отношениях. Сеть разбита как номера в отеле, и в каждый можно попасть только со своим пропуском. Система запоминает ваши привычки и, если вы вдруг решили «прогуляться» не в свой номер, то вас поймают.

Через 10 минут будете знать, как внедрить Zero Trust в продакшене: от базовых принципов до практических приёмов — Canary-токенов, UEBA-анализа и автоматизации реакции на инциденты. Детали под катом.
Читать дальше →

Как сделать Modulith в Symfony

Level of difficultyMedium
Reading time6 min
Views2.2K

Modulith — архитектурный стиль, при котором приложение остаётся монолитом, но код внутри разбит на модули (подпапки) по доменам.

Классическая структура проектов выглядит так:

├── src
├── Command
├── Controller
│ ├── Product
│ └── User
├── Doctrine
├── Entity
│ ├── Product.php
│ └── User.php
├── Message
├── MessageHandler
└── Kernel.php


Структура modulith в Symfony выглядела б так:
├── src
├── Product
│ ├── Command
│ ├── Controller
│ ├── Doctrine
│ ├── Entity
│ ├── Message
│ └── MessageHandler
├── User
│ ├── Controller
│ └── Entity
└── Kernel.php

Разница в том, что в modulith каждый модуль (например Product, User) содержит все компоненты в своей папке, а не по всему проекту.

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

Вдобавок исчезают портянки файлов, когда открываете Entity, а там 30 файлов в столбик

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

Поэтому конфигурацию модулей лучше выносить в сами модули

Читать далее

Подумайте перед тем, как внедрять CQRS

Level of difficultyEasy
Reading time4 min
Views4.8K

Привет, Хабр!

Если вы тимлид или архитектор, и в команде всё чаще звучит «давай сделаем CQRS» — стоит остановиться. Этот паттерн мощный, но далеко не беспроблемный.

Читать далее

Технический долг нельзя распланировать

Reading time4 min
Views4.2K
image


Будучи ведущим инженером, я неоднократно наблюдал следующую картину в разных компаниях.
  1. Руководители жалуются на недостаточно высокую скорость разработки. "Я просто хочу показывать день рождения пользователя на странице настроек. Почему на это уходит целый год?"
  2. Инженеры говорят, что техдолг мешает им двигаться вперед.
  3. Руководство поручает менеджерам «разобраться с техдолгом», чтобы повысить скорость разработки.
  4. Менеджеры начинают искать крупные проекты с технологическим долгом, чтобы добавить их в роадмап
Читать дальше →

Возвращаем Redis в Mercure и немного о static-php-cli

Level of difficultyEasy
Reading time5 min
Views785

Как преодолеть узкие места масштабируемости Mercure HUB, заменив BoltDB на Redis, а так же собрать свою статическую сборку php сервера вместе с Caddy, Mercure, FrankenPHP

Читать далее

Синхронизация кеша в распределенных Go (и не только) приложениях с помощью Kafka

Level of difficultyMedium
Reading time3 min
Views1.9K

Заранее оговорюсь, всё что будет описано в данной статье, будет касаться runtime (децентрализованного) кеша и применимо не только к Gо приложениям.
Зачем нам нужен такой кеш? По нескольким причинам.

Читать далее

ООП — это скам

Level of difficultyMedium
Reading time8 min
Views62K

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

После прочтения большинства этих статей и нескольких лет кодинга на C# я заявляю: «ООП - это один большой обман. Никто не понимает, что это такое. Люди просто говорят какие-то умные термины, их собеседники с умным видом кивают, хотя на деле трактуют эти же термины совершенно по-разному».

И вот почему.

Читать далее

Keycloak: как упростить аутентификацию и не сойти с ума?

Level of difficultyEasy
Reading time9 min
Views17K

Я Диана, системный аналитик в Clevertec и экс-преподаватель. В этой нескучной лекции расскажу:

- Что такое Keycloak и для чего он нужен?

- Как Keycloak помогает с межсистемной аутентификацией?

- Какие плюсы и минусы у Keycloak при использовании в продакшене?

- Какие альтернативы есть у Keycloak?


Начать лекцию

Распределённые транзакции в микросервисах: от SAGA до Two‑Phase Commit

Reading time29 min
Views14K

Переход от монолита к микросервисной архитектуре приносит гибкость и масштабируемость, но и создает новые сложности. Одна из ключевых проблем –согласованность данных и транзакции. В монолите обычно можно обернуть несколько операций одной ACID-транзакцией: либо все операции выполняются успешно, либо при ошибке происходит полный откат. В мире микросервисов такой прямолинейный подход не работает. Каждый сервис автономен, у каждого своя база данных, и общаются они через сеть. Как результат, гарантировать атомарность и целостность процессов, охватывающих несколько сервисов, непросто. Возникает риск частичных обновлений: одна часть системы изменилась, а другая – нет, что приводит к неконсистентным (несогласованным) состояниям данных.

Чтобы решить эту проблему, разработаны специальные паттерны и протоколы управления распределёнными транзакциями. В этой статье детально рассмотрим ограничения классических ACID-транзакций в распределённой архитектуре, а также два подхода к распределённым транзакциям – сага (SAGA) и двухфазный коммит (2PC). Разберём мотивацию, принципы работы, преимущества и недостатки каждого, сравним их по критериям. Кроме того, обсудим альтернативные подходы, такие как TCC (Try-Confirm-Cancel), паттерн Outbox, а также кратко упомянем eventual consistency, транзакционные сообщения, инструменты вроде Atomikos и др. В завершение – практические рекомендации, как выбрать подходящий способ обеспечения согласованности в ваших микросервисах.

Читать далее

Микросервисы и данные: Как Saga-паттерн спасает от хаоса транзакций

Level of difficultyMedium
Reading time7 min
Views10K

Переход на микросервисы – это часто как переезд из тесной, но понятной коммуналки (монолита) в огромный город с кучей отдельных квартир. Свободы больше, масштабироваться проще, команды независимы – красота! Но тут же вылезает проблема, о которую разбиваются многие корабли: как поддерживать порядок и целостность данных, когда они размазаны по десяткам этих "квартир"-сервисов со своими собственными базами данных?

Старый добрый ACID, который спасал нас в монолитах с одной большой базой, здесь уже не помощник. Пытаться натянуть на микросервисы классические распределенные транзакции с двухфазным коммитом (2PC) – это почти всегда путь к страданиям. Представьте: один сервис захватывает блокировку, ждет подтверждения от другого, тот ждет третьего... Чуть что не так – вся цепочка висит, пользователи ждут, система тормозит, доступность падает. Звучит знакомо? Именно поэтому умные люди придумали альтернативу – паттерн, известный как Saga.

Читать далее

Скользящие метрики без тормозов: SQL

Level of difficultyEasy
Reading time4 min
Views1.5K

Привет, Хабр!

Скользящие метрики — это must-have в аналитике, но даже простые на первый взгляд вычисления могут парализовать вашу СУБД. Сегодня рассмотрим, почему стандартные оконные функции зачастую тормозят, как их можно оптимизировать через явные фреймы, когда выгоднее писать агрегаты вручную, как использовать предагрегированные таблицы и как проверять корректность расчётов на границах окон.

Читать далее

CRUD на PHP с использованием файберов и пула соединений с PostgreSQL

Level of difficultyMedium
Reading time12 min
Views3.1K

В этой статье я подготовил для вас прототип CRUD-приложения, которое использует файберы и неблокирующие(асинхронные) возможности драйвера PostreSQL. Вместе они дают любопытные результаты по производительности и потреблению памяти.

Читать далее

Пиши простой код

Level of difficultyEasy
Reading time4 min
Views52K

И это решит 95% проблем типичного стартапа. Как-то так повелось, что по всему СНГ и его окрестностям на работу набирают зумеров с колоссальным опытом в три года, и они начинают создавать идеальные архитектуры. Да, каждый из вас, как только получает возможность взять на себя хоть малейшую ответственность, сразу вспоминает все прочитанные и не прочитанные книги и пилит свою уникальную архитектуру, непохожую ни на что.

Читать далее
1
23 ...

Information

Rating
Does not participate
Date of birth
Registered
Activity