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#
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
// 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
# 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.