Pull to refresh
78
0
Аркадий @ArkadiyXIII

Backend developer

Send message

Mapper Contexts и Supercontexts: Разделение domain-specific и domain-generic ограниченных контекстов

Reading time7 min
Views2.9K

Эта статья является переводом материала «Mapper Contexts & Supercontexts: Decoupling Domain-Specific and Domain-Generic Bounded Contexts».

Вы создаете новую систему, и два члена вашей команды предлагают альтернативные архитектуры для отправки уведомлений. Какая из них правильная?

Первый разработчик предлагает модель push: ограниченный контекст должен дать указание Notifications отправить уведомление. Notifications должен просто подчиняться командам и отправлять указанные уведомления.

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

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

Читать далее
Total votes 3: ↑3 and ↓0+3
Comments1

Распутывание микросервисов или балансировка сложности в распределенных системах

Reading time13 min
Views13K

Эта статья является переводом материала «Untangling Microservices, or Balancing Complexity in Distributed Systems».

Расцвет микросервисов закончился. Uber преобразовывает тысячи микросервисов в более управляемое решение [1]; Келси Хайтауэр предсказывает, что будущее за монолитами [2]; и даже Сэм Ньюман заявляет, что микросервисы никогда не должны быть выбором по умолчанию, а скорее крайним средством [3].

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

В этом посте я хочу ответить на эти вопросы. Вы узнаете об общих проблемах проектирования, которые превращают микросервисы в распределенные большие комки грязи (distributed big balls of mud), и, конечно же, о том, как их избежать.

Читать далее
Total votes 18: ↑16 and ↓2+18
Comments8

Преодоление сложности в CQRS

Reading time6 min
Views9.1K

Эта статья является переводом материала «Tackling Complexity in CQRS».

Шаблон CQRS может творить чудеса: он может максимизировать масштабируемость, производительность, безопасность и даже «превзойти» теорему CAP. Тем не менее, например, в своей статье о CQRS Мартин Фаулер утверждает, что шаблон следует применять умеренно и даже осторожно:

«...для большинства систем CQRS добавляет риски»;

«...вы должны быть очень осторожны при использовании CQRS»;

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

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

Читать далее
Total votes 9: ↑9 and ↓0+9
Comments6

Преодоление сложности в самом сердце DDD

Reading time6 min
Views19K

Эта статья является переводом материала «Tackling Complexity in the Heart of DDD».

Давайте проведем небольшой эксперимент: попробуем объяснить суть предметно-ориентированного проектирования (DDD) тому, кто понятия об этом не имеет. Это, особенно если делать кратко, непросто. Ограниченные контексты, сущности, события домена, объекты значений, домены, агрегаты, репозитории… с чего начать?

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

Читать далее
Total votes 25: ↑25 and ↓0+25
Comments7

TDD: Что пошло не так?

Reading time5 min
Views16K

Эта статья является переводом материала «TDD: What went wrong or did it?».

В сфере разработки программного обеспечения уже давно хвалят Test Driven Development (TDD, разработка через тестирование). Однако в последнее время было сказано много резких слов в адрес TDD, поскольку его обвиняют в плохом проектировании программного обеспечения и невыполнении многих своих обещаний. Кульминацией этой тенденции стал пост Дэвида Хайнемайера Ханссона «TDD is dead. Long live testing.» (TDD мертв. Да здравствует тестирование).

Как это возможно, что одна и та же техника, которая так выгодна для стольких разработчиков, так губительна для других? В этой статье Владислав Кононов расскажет о трех заблуждениях, которые могли бы объяснить это явление.

Читать далее
Total votes 11: ↑9 and ↓2+9
Comments95

Когда использовать mocks в юнит-тестировании

Reading time13 min
Views78K

Эта статья является переводом материала «When to Mock».

Использование моков в модульном тестировании является спорной темой. Автор оригинала заметил, что на протяжении всей своей карьеры в программировании он сначала перешел от «моков почти для каждой зависимости» к политике «без моков», а затем к «только моки для внешних зависимостей».

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

Читать далее
Total votes 16: ↑16 and ↓0+16
Comments6

Физическая и математическая реальности

Reading time17 min
Views20K

Эта статья является второй частью конспекта книги «Наша математическая вселенная. В поисках фундаментальной природы реальности» (автор Макс Тегмарк).

Идея, что Вселенная в некотором смысле является математической, восходит по меньшей мере к пифагорейцам и породила многовековую дискуссию физиков и философов. Галилей утверждал, что Вселенная – это «величественная книга», написанная на языке математики. Лауреат Нобелевской премии по физике Юджин Вигнер в 60-х годах XX века настаивал, что «невероятная эффективность математики в естественных науках» нуждается в объяснении.

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

Читать далее
Total votes 12: ↑12 and ↓0+12
Comments122

Квантовая мультивселенная

Reading time23 min
Views31K

Эта статья является первой частью конспекта книги «Наша математическая вселенная. В поисках фундаментальной природы реальности» (автор Макс Тегмарк). Материал статьи посвящен многомировой интерпретации квантовой механики.

Является ли квантовая механика внутренне противоречивой? Действительно ли волновая функция коллапсирует? Если да, то когда? А если нет, то почему мы не видим вещи в двух местах сразу? Откуда появляются случайности и вероятности в квантовой механике?

В 1957 году принстонский аспирант Хью Эверетт предложил поистине радикальный ответ, подразумевающий существование параллельных вселенных. Однако эту идею в основном игнорировали. В чем же идея Эверетта? Это на удивление простое утверждение: Волновая функция не коллапсирует. Никогда. Иными словами, волновая функция, которая полностью описывает нашу Вселенную, всегда изменяется детерминистически, всегда подчиняется уравнению Шредингера, независимо от того, выполняются наблюдения или нет.

Читать далее
Total votes 38: ↑36 and ↓2+46
Comments125

Изоляция модели предметной области

Reading time7 min
Views6.6K

Эта статья является переводом материала «Domain model isolation».

Термин «изоляция модели предметной области» уже давно используется, но его значение может быть не таким очевидным, как многие думают. В этом посте автор оригинала попытается описать, что значит правильно изолировать модель предметной области и почему это важно.

Читать далее
Total votes 12: ↑12 and ↓0+12
Comments18

Иммутабельная архитектура

Reading time6 min
Views10K

Эта статья является переводом материала «Immutable architecture».

В этом посте автор оригинала хотел бы показать общий подход к внедрению иммутабельности в кодовую базу на архитектурном уровне.

Прежде всего, термин «Иммутабельность», применяемый к структуре данных, такой как класс, означает, что объекты этого класса не могут изменяться в течение их жизненного цикла. Существует несколько типов иммутабельности со своими нюансами, но это не являются для нас существенным. По большей части мы можем сказать, что класс является либо изменяемым, что означает, что его экземпляры могут изменяться тем или иным образом, либо иммутабельным (неизменяемым), что означает, что как только мы создадим экземпляр этого класса, мы не сможем изменить его позже.

Читать далее
Total votes 14: ↑11 and ↓3+10
Comments13

Что такое функциональное программирование?

Reading time7 min
Views80K

Эта статья является переводом материала «What is functional programming?».

В этой статье Владимир Хориков попытается ответить на вопрос: что такое функциональное программирование?

Итак, что такое функциональное программирование? Этот термин возникает довольно часто, и каждый автор, пишущий о нем, дает собственное объяснение. На взгляд автора оригинала, самым простым и в то же время точным определением является следующее: функциональное программирование - это программирование с математическими функциями.

Математические функции не являются методами в программном смысле. Хотя мы иногда используем слова «метод» и «функция» как синонимы, с точки зрения функционального программирования это разные понятия. Математическую функцию лучше всего рассматривать как канал (pipe), преобразующий любое значение, которое мы передаем, в другое значение

Читать далее
Total votes 24: ↑19 and ↓5+22
Comments108

Cohesion и Coupling: отличия

Reading time6 min
Views63K

Эта статья является переводом материала «Cohesion and Coupling: the difference». 

Возможно, вы слышали рекомендацию, в которой говорится, что мы должны стремиться к достижению low coupling (низкой связанности) и high cohesion (высокого сцепления) при работе над кодовой базой. В этой статье хотелось бы обсудить, что на самом деле означает эта рекомендация, и взглянуть на некоторые примеры кода, иллюстрирующие ее. И также хочется провести границу между этими двумя идеями и показать различия в них.

Читать далее
Total votes 19: ↑19 and ↓0+19
Comments3

OCP против YAGNI

Reading time9 min
Views8.6K

Эта статья является переводом материала OCP vs YAGNI.

В этом посте хочется осветить тему OCP и YAGNI – противоречия между принципом открытости/закрытости и принципом «вам это не понадобится».

Давайте начнем с того, что вспомним, что такое OCP. Принцип открытости/закрытости гласит, что: Объекты программного обеспечения (классы, модули, функции и т.д.) должны быть открыты для расширения, но закрыты для модификации.

Впервые он был представлен Бертраном Мейером в его канонической книге «Конструирование объектно-ориентированного программного обеспечения». С тех пор его популяризировал Боб Мартин, когда он представил принципы SOLID.

Официальное определение довольно расплывчато и на самом деле не помогает нам понять основной смысл. Итак, давайте углубимся в этот принцип.

Читать далее
Total votes 17: ↑17 and ↓0+17
Comments24

Транзакции. Часть 2. Конспект книги «Designing Data-Intensive Applications»

Reading time13 min
Views7.4K

Эта статья является конспектом книги «Designing Data-Intensive Applications».

В предыдущем конспекте мы рассмотрели «грязную» операцию чтения – это разновидность состояния гонки, возникающая при попытке конкурентной записи в одни объекты различными транзакциями. К этой категории проблем также относится ситуация потери обновления.

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

Читать далее
Total votes 4: ↑4 and ↓0+4
Comments1

Транзакции. Часть 1. Конспект книги «Designing Data-Intensive Applications»

Reading time12 min
Views12K

Эта статья является конспектом книги «Designing Data-Intensive Applications».

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

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

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

Читать далее
Total votes 1: ↑1 and ↓0+1
Comments1

Подсистемы хранения и извлечение данных. Конспект книги «Designing Data-Intensive Applications»

Reading time14 min
Views6.4K

Эта статья является конспектом книги «Designing Data-Intensive Applications».

В этом конспекте рассмотрим, как сохранить полученные от пользователя данные и как найти их снова в случае запроса с точки зрения БД.

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

Читать далее
Rating0
Comments0

Для чего нужно интеграционное тестирование?

Reading time9 min
Views61K

Эта статья является конспектом книги «Принципы юнит-тестирования». Материал статьи посвящен интеграционным тестам.

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

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

Читать далее
Total votes 4: ↑3 and ↓1+2
Comments3

Аспекты хороших юнит-тестов

Reading time11 min
Views9.1K

Эта статья является конспектом книги «Принципы юнит-тестирования».

Давайте для начала перечислим свойства хороших юнит-тестов.

Первое. Интегрированы в цикл разработки. Пользу приносят только те тесты, которые вы активно используете; иначе писать их нет смысла.

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

Третье. Дают максимальную защиту от багов с минимальными затратами на сопровождение. Для этого нужно уметь распознавать эффективные тесты и писать их.

Однако распознавание и написание эффективного теста – два разных навыка. И для приобретения второго навыка необходимо сначала освоить первый. Далее в этой статье будет показано, как распознать эффективный тест. Также будет рассмотрена пирамида тестирования и тестирование по принципу «черного ящика» / «белого ящика».

Читать далее
Total votes 5: ↑4 and ↓1+4
Comments0

Анатомия юнит-теста

Reading time11 min
Views22K

Эта статья является конспектом книги «Принципы юнит-тестирования». Материал статьи посвящен структуре юнит-теста.

В этой статье рассмотрим структуру типичного юнит-теста, которая обычно описывается паттерном AAA (arrange, act, assert — подготовка, действие и проверка). Затронем именование юнит-тестов. Автор книги описал распространенные советы по именованию и показал, почему он несогласен с ними и привел альтернативы.

Читать далее
Total votes 7: ↑7 and ↓0+7
Comments2

Разложение монолита: Декомпозиция БД (часть 2)

Reading time14 min
Views6.9K

Эта статья является заключительным конспектом книги «От монолита к микросервисам». Материал статьи посвящен декомпозиции БД во время процесса разложения монолита на микросервисы.

Извлечение микрослужбы не «делается» до тех пор, пока код приложения не будет работать в его собственной службе, а данные, которыми он управляет, не будут извлечены в его собственную логически изолиро­ванную БД. Однако в какой последовательности извлечения должны выполняться?

Читать далее
Total votes 8: ↑8 and ↓0+8
Comments5
1

Information

Rating
Does not participate
Registered
Activity