Event Storming: uma ferramenta para modelagem de domínio

O que é Event Storming?

Definição de Event Storming

O Event Storming é uma técnica de modelagem de domínio que envolve a exploração colaborativa e o entendimento de um domínio específico de negócio.

Importância do Event Storming

Sua importância se dá pelo fato de que ele permite que as equipes entendam o fluxo de negócios, identifiquem problemas e descubram oportunidades de inovação.

Como funciona o Event Storming?

Passos básicos do Event Storming

A técnica envolve uma sessão de brainstorming, na qual os participantes mapeiam eventos, comandos e agregados em um espaço físico ou virtual.

Ferramentas usadas no Event Storming

Os participantes utilizam post-its de cores diferentes para representar diferentes elementos do domínio.

Event Storming e Domain-Driven Design

Como eles se complementam

O Event Storming se alinha perfeitamente com o Domain-Driven Design (DDD), pois ambos buscam entender a lógica de negócios.

Benefícios da integração

A combinação dessas duas técnicas pode resultar em uma compreensão mais profunda do domínio e na identificação de possíveis melhorias.

Aplicando Event Storming em negócios

Casos de uso

O Event Storming pode ser aplicado em diversas situações, como o desenvolvimento de novos produtos, a melhoria de processos existentes e a resolução de problemas de negócios.

Exemplos práticos

Por exemplo, em uma empresa de logística, o Event Storming pode ser usado para mapear e otimizar o fluxo de entrega de mercadorias.

Exemplo de implementação em C#

C#
using System;

// Definindo eventos relacionados à entrega de mercadorias
public enum Event
{
    MERCADORIA_ENTREGUE,
    MERCADORIA_PERDIDA,
    MERCADORIA_ATRASADA
}

// Definindo comandos relacionados à entrega de mercadorias
public enum Command
{
    INICIAR_ENTREGA,
    REGISTRAR_PERDA,
    REGISTRAR_ATRASO
}

// Definindo o agregado relacionado à entrega de mercadorias
public class DeliveryAggregate
{
    public string Status { get; private set; }

    public DeliveryAggregate()
    {
        Status = "pendente";
    }

    public void ApplyEvent(Event @event)
    {
        if (@event == Event.MERCADORIA_ENTREGUE)
            Status = "entregue";
        else if (@event == Event.MERCADORIA_PERDIDA)
            Status = "perdida";
        else if (@event == Event.MERCADORIA_ATRASADA)
            Status = "atrasada";
    }

    public void ProcessCommand(Command command)
    {
        if (command == Command.INICIAR_ENTREGA)
            ApplyEvent(Event.MERCADORIA_ENTREGUE);
        else if (command == Command.REGISTRAR_PERDA)
            ApplyEvent(Event.MERCADORIA_PERDIDA);
        else if (command == Command.REGISTRAR_ATRASO)
            ApplyEvent(Event.MERCADORIA_ATRASADA);
    }
}

// Exemplo de utilização do Event Storming
class Program
{
    static void Main(string[] args)
    {
        // Criando uma instância do agregado de entrega de mercadorias
        DeliveryAggregate delivery = new DeliveryAggregate();

        // Simulando eventos ocorridos no processo de entrega
        Event[] events = {
            Event.MERCADORIA_ENTREGUE,
            Event.MERCADORIA_ATRASADA,
            Event.MERCADORIA_PERDIDA
        };

        // Aplicando os eventos no agregado
        foreach (Event @event in events)
        {
            delivery.ApplyEvent(@event);
        }

        // Verificando o status final da entrega
        Console.WriteLine($"Status da entrega: {delivery.Status}");
    }
}

// Fonte: ChatGPT

Neste exemplo em C#, as enumerações Event e Command são usadas para representar os eventos e comandos relacionados à entrega de mercadorias. A classe DeliveryAggregate representa o estado da entrega e possui métodos para aplicar eventos e processar comandos. No método Main, simulamos uma série de eventos ocorridos no processo de entrega e, em seguida, exibimos o status final da entrega.

Exemplo de implementação em Java

Java
// Definindo eventos relacionados à entrega de mercadorias
enum Event {
    MERCADORIA_ENTREGUE,
    MERCADORIA_PERDIDA,
    MERCADORIA_ATRASADA
}

// Definindo comandos relacionados à entrega de mercadorias
enum Command {
    INICIAR_ENTREGA,
    REGISTRAR_PERDA,
    REGISTRAR_ATRASO
}

// Definindo o agregado relacionado à entrega de mercadorias
class DeliveryAggregate {
    private String status;

    public DeliveryAggregate() {
        status = "pendente";
    }

    public void applyEvent(Event event) {
        if (event == Event.MERCADORIA_ENTREGUE)
            status = "entregue";
        else if (event == Event.MERCADORIA_PERDIDA)
            status = "perdida";
        else if (event == Event.MERCADORIA_ATRASADA)
            status = "atrasada";
    }

    public void processCommand(Command command) {
        if (command == Command.INICIAR_ENTREGA)
            applyEvent(Event.MERCADORIA_ENTREGUE);
        else if (command == Command.REGISTRAR_PERDA)
            applyEvent(Event.MERCADORIA_PERDIDA);
        else if (command == Command.REGISTRAR_ATRASO)
            applyEvent(Event.MERCADORIA_ATRASADA);
    }

    public String getStatus() {
        return status;
    }
}

// Exemplo de utilização do Event Storming
public class Main {
    public static void main(String[] args) {
        // Criando uma instância do agregado de entrega de mercadorias
        DeliveryAggregate delivery = new DeliveryAggregate();

        // Simulando eventos ocorridos no processo de entrega
        Event[] events = {
                Event.MERCADORIA_ENTREGUE,
                Event.MERCADORIA_ATRASADA,
                Event.MERCADORIA_PERDIDA
        };

        // Aplicando os eventos no agregado
        for (Event event : events) {
            delivery.applyEvent(event);
        }

        // Verificando o status final da entrega
        System.out.println("Status da entrega: " + delivery.getStatus());
    }
}

//Fonte: ChatGPT

Neste exemplo em Java, as enumerações Event e Command são utilizadas para representar os eventos e comandos relacionados à entrega de mercadorias. A classe DeliveryAggregate representa o estado da entrega e possui métodos para aplicar eventos e processar comandos. No método main, simulamos uma série de eventos ocorridos no processo de entrega e, em seguida, exibimos o status final da entrega.

Exemplo de implementação em Python

Python
# Importando a biblioteca para manipulação de eventos
from enum import Enum

# Definindo eventos relacionados à entrega de mercadorias
class Event(Enum):
    MERCADORIA_ENTREGUE = 'mercadoria_entregue'
    MERCADORIA_PERDIDA = 'mercadoria_perdida'
    MERCADORIA_ATRASADA = 'mercadoria_atrasada'

# Definindo comandos relacionados à entrega de mercadorias
class Command(Enum):
    INICIAR_ENTREGA = 'iniciar_entrega'
    REGISTRAR_PERDA = 'registrar_perda'
    REGISTRAR_ATRASO = 'registrar_atraso'

# Definindo o agregado relacionado à entrega de mercadorias
class DeliveryAggregate:
    def __init__(self):
        self.status = 'pendente'
    
    def apply_event(self, event):
        if event == Event.MERCADORIA_ENTREGUE:
            self.status = 'entregue'
        elif event == Event.MERCADORIA_PERDIDA:
            self.status = 'perdida'
        elif event == Event.MERCADORIA_ATRASADA:
            self.status = 'atrasada'
    
    def process_command(self, command):
        if command == Command.INICIAR_ENTREGA:
            self.apply_event(Event.MERCADORIA_ENTREGUE)
        elif command == Command.REGISTRAR_PERDA:
            self.apply_event(Event.MERCADORIA_PERDIDA)
        elif command == Command.REGISTRAR_ATRASO:
            self.apply_event(Event.MERCADORIA_ATRASADA)

# Exemplo de utilização do Event Storming
def main():
    # Criando uma instância do agregado de entrega de mercadorias
    delivery = DeliveryAggregate()

    # Simulando eventos ocorridos no processo de entrega
    events = [
        Event.MERCADORIA_ENTREGUE,
        Event.MERCADORIA_ATRASADA,
        Event.MERCADORIA_PERDIDA
    ]

    # Aplicando os eventos no agregado
    for event in events:
        delivery.apply_event(event)

    # Verificando o status final da entrega
    print(f'Status da entrega: {delivery.status}')

if __name__ == '__main__':
    main()

# Fonte: ChatGPT

Neste exemplo, utilizamos enums (Event e Command) para representar os eventos e comandos relacionados à entrega de mercadorias. O agregado DeliveryAggregate representa o estado da entrega e contém métodos para aplicar eventos e processar comandos. No exemplo main(), simulamos uma série de eventos ocorridos no processo de entrega e, em seguida, verificamos o status final da entrega.

Os desafios do Event Storming

Dificuldades comuns

Alguns desafios podem surgir ao implementar o Event Storming, como a resistência da equipe e a complexidade do domínio.

Como superar esses desafios

O sucesso do Event Storming depende do envolvimento de todos os stakeholders e de uma liderança eficaz.

Por que as empresas deveriam adotar o Event Storming?

Vantagens competitivas

O Event Storming proporciona vantagens competitivas ao permitir uma compreensão mais profunda do negócio e a identificação de oportunidades de inovação.

Benefícios a longo prazo

Os benefícios a longo prazo incluem uma melhor colaboração entre as equipes, processos de negócios mais eficientes e produtos de maior qualidade.

Conclusão

O Event Storming é uma técnica poderosa que, quando bem aplicada, pode trazer insights valiosos sobre o domínio de negócio. Ele é mais do que uma ferramenta técnica; é uma maneira de conectar pessoas, ideias e negócios.

Esse conteúdo é parte do material disponibilizado para os participantes do meu grupo de estudos de DDD do Jeito Certo. Você quer participar desse grupo? Clique aqui e veja como funciona.

Dúvidas Frequentes

O que é Event Storming?
O Event Storming é uma técnica de modelagem de domínio que permite a exploração colaborativa e o entendimento de um domínio específico de negócios. É um processo que envolve mapear eventos, comandos e agregados, a fim de compreender melhor o fluxo de negócios, identificar problemas e descobrir oportunidades de inovação.

Como funciona o Event Storming?
O Event Storming funciona através de sessões de brainstorming nas quais os participantes mapeiam os eventos de negócios usando post-its de cores diferentes para representar diferentes elementos do domínio. O objetivo é criar uma representação visual do fluxo de eventos de negócios, o que facilita a identificação de problemas e oportunidades.

Por que usar Event Storming e Domain-Driven Design juntos?
O Event Storming e o Domain-Driven Design se complementam porque ambos buscam entender a lógica de negócios de uma organização. O Event Storming ajuda a mapear e visualizar o fluxo de eventos de negócios, enquanto o Domain-Driven Design se concentra no desenvolvimento de software que reflete essa lógica de negócios. A combinação dessas duas técnicas pode resultar em uma compreensão mais profunda do domínio e na identificação de possíveis melhorias.

Quais são os desafios do Event Storming?
Alguns dos desafios do Event Storming incluem a resistência de membros da equipe, a dificuldade em mapear domínios complexos e a necessidade de envolvimento ativo de todos os stakeholders. Para superar esses desafios, é importante garantir que todos os participantes entendam o valor do Event Storming e estejam comprometidos com o processo.

Por que as empresas deveriam adotar o Event Storming?
As empresas podem se beneficiar do Event Storming de várias maneiras. Ele pode proporcionar uma compreensão mais profunda do negócio, identificar oportunidades de inovação e melhorar a colaboração entre equipes. Além disso, o Event Storming pode ajudar a identificar problemas e ineficiências nos fluxos de negócios, levando a processos mais eficientes e produtos de maior qualidade.

Quer se aprofundar neste tema?

Então participe do grupo de estudos de DDD do Jeito Certo.

Destaque-se desenvolvendo soluções boas de verdade atacando a complexidade no coração do software.

Participe do
grupo intensivo de

DDD do Jeito Certo

com

Destaque-se desenvolvendo soluções boas de verdade atacando a complexidade no coração do software.

Participe do
grupo intensivo de

DDD do Jeito Certo

com

Destaque-se desenvolvendo soluções boas de verdade atacando a complexidade no coração do software.

Veja outros artigos relacionados

Como o Domain-Driven Design Ajuda a Melhorar a Resiliência Organizacional

Mergulhar no universo do Domain-Driven Design (DDD) é abrir um leque de oportunidades para fortalecer a robustez e a capacidade...

Como o Domain-Driven Design Ajuda no Desenvolvimento de Sistemas Transacionais

A utilização do Domain-Driven Design (DDD) oferece uma abordagem estruturada e focada para o desenvolvimento de software, especialmente para sistemas...

Tornando Mais Fácil o que é Feito Todos os Dias

Quando ouvimos falar em Domain-Driven Design (DDD), frequentemente imaginamos um conjunto de práticas complexas aplicadas apenas em grandes sistemas. Entretanto,...

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Programa ElemarJR de Aceleração, Do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

Mentoria em Arquitetura de Software

Ênfase em Systems Design

Para se candidatar nesta turma aberta, preencha o formulário a seguir:

Reproduzir vídeo

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Event Storming: uma ferramenta para modelagem de domínio:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Event Storming: uma ferramenta para modelagem de domínio:

Event Storming: uma ferramenta para modelagem de domínio

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Reputação e Marketing Pessoal:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no curso de Event Storming: uma ferramenta para modelagem de domínio:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de DDD do Jeito Certo:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Padrões de Projeto:

Crie sua conta

Preencha os dados a seguir para iniciar o seu cadastro no Grupo Intensivo de Estudos de Algoritmos e Estruturas de Dados:

× Precisa de ajuda?