Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

51
1 O impacto do design na sua arquitetura Paulo Silveira [email protected] @paulo_caelum

description

Palestra realizada no www.qconsp.com em 2010, mostrando diversas definições para arquitetura e design e depois dando exemplos reais de como o Design também é de extrema importância para poder flexibilizar suas decisões arquiteturais e respectivos tradeoffs.

Transcript of Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Page 1: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

1

O impacto do designna sua arquitetura

Paulo [email protected] @paulo_caelum

Page 2: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

de programador a designer a arquiteto?

Martin Fowler, Who needs an Architect?http://bit.ly/fowlerArchitect

Então você quer ser um arquiteto Java?http://bit.ly/arquitetoJava

Page 3: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquitetura

#1

Page 4: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Alguns padrões são arquiteturais, outros são de design, ajudando a arquitetura... eu não separo os dois já que o que

é arquitetural ou não é subjetivo.

Martin Fowler, Patterns of Enterprise Application Architecture

Page 5: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Design

#2

Page 6: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Você deve enfrentar suas batalhas de design no nível macro-arquitetural e no campo das instâncias.

Craig Larman, The importance of being Closed

Page 7: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Implementação

#3

Page 8: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

...de manhã, o arquiteto programa com os desenvolvedores...

Martin Fowler, Who needs an Architect?

Page 9: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Afinal, pra você, o que é arquitetura?

Page 10: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquitetura são os principais elementos

do sistema, as peças que são difíceis de mudar.

Page 11: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Ralph Johnson (do GoF) e Martin FowlerWho needs an Architect?

Arquitetura são as decisões que gostaríamos de ter tomado no começo

do projeto.

Arquitetura são os principais elementos

do sistema, as peças que são difíceis de mudar.

Page 12: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

“Martin Fowler não sabe nada”

meu artigo recebeu vários comentários, inclusive essas críticas:

Page 13: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

“Você é poético, não sabe nada”

“Martin Fowler não sabe nada”

meu artigo recebeu vários comentários, inclusive essas críticas:

Page 14: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

“Você é poético, não sabe nada”

“Martin Fowler não sabe nada”

“Ralph Johnson não sabe nada”

meu artigo recebeu vários comentários, inclusive essas críticas:

Page 15: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

“Você é poético, não sabe nada”

“Martin Fowler não sabe nada”

“Ralph Johnson não sabe nada”

“CMU-SEI são professores, não sabem nada”

meu artigo recebeu vários comentários, inclusive essas críticas:

Page 16: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Resolvi então também dar minha opinião pessoal

Page 17: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquitetura é toda decisão que impactam em grandes trade-offs e que podem ou não

serem difíceis de mudar.

Resolvi então também dar minha opinião pessoal

Page 18: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquitetura é toda decisão que impactam em grandes trade-offs e que podem ou não

serem difíceis de mudar.

E ela pode ser evolutivaLast Responsible Moment

Resolvi então também dar minha opinião pessoal

Page 19: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

E como tornar essas decisões “mais” possíveis

de mudar?

Page 20: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquiteturax

Arquitetura Java

Page 21: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquiteturax

Arquitetura Java

...você precisa de pelo menos um arquiteto com enorme experiência prática na plataforma

escolhida.

Joel Spoelsky, Language Wars

Page 22: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

ImplementaçãoDesign

Arquitetura

Neal Gafter, Evolutionary Architecture

PIRÂMIDE?

Page 23: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

ImplementaçãoDesign

Arquitetura

Neal Gafter, Evolutionary Architecture

Não acredito que implementação e design tenham “menos” importância

PIRÂMIDE?

Page 24: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Arquitetura

Design

Implementação

Page 25: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Design

Arquitetura

Implementação

Page 26: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Design

Arquitetura

Implementação

Page 27: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Dois exemplos dedesign facilitando a arquitetura

Page 28: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Site da Caelum

repository.adiciona(noticia);

qual é a implementação?

Page 29: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

1. Hibernatepublic class NoticiaDao implements NoticiaRepository {

private final Session session;

public NoticiaDao(Session session) { this.session = session; } public void adiciona(Noticia noticia) { session.save(noticia); } @SuppressWarnings("unchecked") public List<Noticia> todasNoticias() { return session.createCriteria(Noticia.class) .addOrder(Order.desc("data")).list(); }

Page 30: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

2. JPA/BigTable o que mudamos quandomigramos para o cloud

Page 31: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

2. JPA/BigTablepublic class NoticiaDao implements NoticiaRepository {

private final EntityManager manager;

public NoticiaDao(EntityManager manager) { this.manager = manager; } public void adiciona(Noticia noticia) { manager.persist(noticia); } @SuppressWarnings("unchecked") public List<Noticia> todasNoticias() { return manager.createQuery("select n from Noticia n")).getResultList(); }

o que mudamos quandomigramos para o cloud

Page 32: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

3. Objectify

Page 33: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

3. Objectifypublic class NoticiaDao implements NoticiaRepository { private final Objectify objectify; public NoticiaDao(Objectify objectify) { this.objectify = objectify; } public void adiciona(Noticia noticia) { objectify.put(noticia); }

public List<Noticia> noticiasVisiveis() { return objectify.query(Noticia.class).filter("ordem >",0).order("ordem").list(); }

Page 34: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

3. Objectifypublic class NoticiaDao implements NoticiaRepository { private final Objectify objectify; public NoticiaDao(Objectify objectify) { this.objectify = objectify; } public void adiciona(Noticia noticia) { objectify.put(noticia); }

public List<Noticia> noticiasVisiveis() { return objectify.query(Noticia.class).filter("ordem >",0).order("ordem").list(); }

lento e não muito disponível

Page 35: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

4. Objectify + Memcache

Page 36: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

4. Objectify + Memcachepublic class NoticiaDao implements NoticiaRepository { private final Cache cache; private final Objectify objectify; public NoticiaDao(Objectify objectify, Cache cache) { this.objectify = objectify; this.cache = cache; } public void adiciona(Noticia noticia) { objectify.put(noticia); cache.remove(CACHE_ROOT, NOTICIAS_VISIVEIS); } public List<Noticia> noticiasVisiveis() { List<Noticia> noticias = cache.get(CACHE_ROOT, NOTICIAS_VISIVEIS); if (cached == null) { noticias = objectify.query(Noticia.class).filter("ordem >",0).order("ordem").list(); cache.put(CACHE_ROOT, NOTICIAS_VISIVEIS, noticias); } return noticias; }

Page 37: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Relembrando IoC e DI

NoticiaRepository repository = new NoticiaRepository(???); repository.adiciona(noticia);

Page 38: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Relembrando IoC e DI

NoticiaRepository repository = new NoticiaRepository(???); repository.adiciona(noticia);

Ter feito o design com IoC e DI facilitoumudanças arquiteturais:

hibernate -> JPA no Cloud -> Objectify -> Memcached

Page 39: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

WebChat Ajax

Mudando de Comet com long pollingpara Comet streaming com Servlets 3 AsyncContext

Page 40: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

long polling

public class Agent { // ... private final Queue<Update> updates =

new ConcurrentLinkedQueue<Update>(); public Agent(RoomFactory roomFactory, ClientQueue queue, Tenant tenant) { this.roomFactory = roomFactory; this.queue = queue; this.tenant = tenant; } public void addUpdate(Update update) { updates.add(update); }

public Update updates() { createAndRemoveRooms(); return updates.poll(); }

como fazer blocante?

collections sem DI?

Page 41: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

streaming segurando conexão

public class Agent { // ... private final BlockingQueue<Update> updates =

new LinkedBlockingQueue<Update>(); public Agent(RoomFactory roomFactory, ClientQueue queue, Tenant tenant) { this.roomFactory = roomFactory; this.queue = queue; this.tenant = tenant; } public void addUpdate(Update update) { updates.add(update); }

public Update updates() { createAndRemoveRooms(); return updates.take(); }

thread per request no comet = bad

Page 42: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

streaming não blocante

private BlockingQueue<Update> updates = new LinkedBlockingQueue<Update>();// ...

while (true) { final Update update = updates.take();

for (final AsyncContext ctx : clients.get(update.getRoom())) {

PrintWriter writer = ctx.getResponse() .getWriter(); writer.println(update.getMessage()); writer.flush();

} }

para isso a fila de eventos precisaria ser única

Page 43: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

public class Agent { // ... private final Queue<Update> updates;

Agent(RoomFactory roomFactory, ClientQueue queue, Tenant tenantQueue<Update> updates) {

this.roomFactory = roomFactory; this.queue = queue; this.tenant = tenant; this.updates = updates; }

public void addUpdate(Update update) { updates.add(update); }

public Update updates() { createAndRemoveRooms(); return updates.take(); }

queue tb por DI e dá para voltarpro long polling facilmente!

Page 44: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Exemplo bônus:

Nick Kallen, arquiteto do Twitter

no #qconsp com #Scala

FIFO/LIFOblocante/não blocante

usando IoC+DI

Page 45: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Nos 3 exemplos:

• IoC facilitou evolução arquitetural

• possibilita decisão no “last responsible moment”

• e com isso podemos trocar trade-offs

• código, design e arquitetura muito próximos

Page 46: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

para obter isso (em JAVA!):

Page 47: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Boas práticas de OO (construtores)

para obter isso (em JAVA!):

Page 48: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

IoC e DI (mesmo sem framework)

Boas práticas de OO (construtores)

para obter isso (em JAVA!):

Page 49: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Testes te “forçam” a DI

IoC e DI (mesmo sem framework)

Boas práticas de OO (construtores)

para obter isso (em JAVA!):

Page 50: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Testes te “forçam” a DI

IoC e DI (mesmo sem framework)

Boas práticas de OO (construtores)

Desacoplamento (generalização)

para obter isso (em JAVA!):

Page 51: Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

Obrigado!

Visite:www.tectura.com.br

www.agendatech.com.brwww.ProgramadorPoliglota.com.br