SlideShare a Scribd company logo
1 of 51
Download to read offline
O impacto do design    Paulo Silveira
                       paulo.silveira@caelum.com.br
  na sua arquitetura        @paulo_caelum




                                       1
de programador a designer a arquiteto?

      Então você quer ser um arquiteto Java?
                   http://bit.ly/arquitetoJava
      Martin Fowler, Who needs an Architect?
                 http://bit.ly/fowlerArchitect
#1

Arquitetura
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
#2

Design
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
#3

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




Martin Fowler, Who needs an Architect?
Afinal, pra você, o que é
     arquitetura?
Arquitetura são os principais
          elementos
do sistema, as peças que são
     difíceis de mudar.
Arquitetura são os principais
                          elementos
                do sistema, as peças que são
                     difíceis de mudar.




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

   Ralph Johnson (do GoF) e Martin Fowler
                 Who needs an Architect?
meu artigo recebeu vários
comentários, inclusive essas críticas:



           “Martin Fowler não sabe nada”
meu artigo recebeu vários
comentários, inclusive essas críticas:



           “Martin Fowler não sabe nada”

          “Você é poético, não sabe nada”
meu artigo recebeu vários
comentários, inclusive essas críticas:



           “Martin Fowler não sabe nada”

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

          “Ralph Johnson não sabe nada”
meu artigo recebeu vários
comentários, inclusive essas críticas:



           “Martin Fowler não sabe nada”

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

          “Ralph Johnson não sabe nada”

“CMU-SEI são professores, não sabem nada”
Resolvi então também dar minha opinião pessoal
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
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 evolutiva
                            Last Responsible Moment




Resolvi então também dar minha opinião pessoal
E como tornar essas
decisões “mais” possíveis
       de mudar?
Arquitetura
       x
Arquitetura Java
Arquitetura
                            x
                     Arquitetura Java




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

                       Joel Spoelsky, Language Wars
PIRÂMIDE?

Implementação
    Design
  Arquitetura




       Neal Gafter, Evolutionary Architecture
PIRÂMIDE?

 Implementação
     Design
   Arquitetura




Não acredito que implementação e
design tenham “menos” importância
         Neal Gafter, Evolutionary Architecture
Implementação




   Design




 Arquitetura
Implementação




   Design




 Arquitetura
Implementação




   Design




 Arquitetura
Dois exemplos de
design facilitando a arquitetura
Site da Caelum
                          qual é a implementação?

      	   	   	   repository.adiciona(noticia);
1. Hibernate
public 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();
	   }
o que mudamos quando
2. JPA/BigTable   migramos para o cloud
o que mudamos quando
    2. JPA/BigTable                 migramos para o cloud
public 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();
	 }
3. Objectify
3. Objectify
public 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
      3. Objectify                   não muito disponível
public 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();
	 }
4. Objectify + Memcache
4. Objectify + Memcache
public 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;
	   }
Relembrando IoC e DI

	   NoticiaRepository repository = new NoticiaRepository(???);
	   repository.adiciona(noticia);
Relembrando IoC e DI

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




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

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



       Mudando de Comet com long polling
para Comet streaming com Servlets 3 AsyncContext
collections sem DI?
           long polling                            como fazer blocante?

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();
	   }
streaming segurando conexão
                               thread per request no comet = bad

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();
	    }
streaming não blocante
            para isso a fila de eventos precisaria ser única



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();
            	   }
	   	   	   }
queue tb por DI                                e dá para voltar
                                             pro long polling facilmente!
public class Agent {
	   // ...
	   private final Queue<Update> updates;
    Agent(RoomFactory roomFactory, ClientQueue queue, Tenant tenant
        Queue<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();
	   }
Exemplo bônus:

Nick Kallen, arquiteto
      do Twitter
no #qconsp com #Scala

      FIFO/LIFO
blocante/não blocante
    usando IoC+DI
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
para obter isso (em JAVA!):
para obter isso (em JAVA!):


Boas práticas de OO (construtores)
para obter isso (em JAVA!):


Boas práticas de OO (construtores)


IoC e DI (mesmo sem framework)
para obter isso (em JAVA!):


Boas práticas de OO (construtores)


IoC e DI (mesmo sem framework)


     Testes te “forçam” a DI
para obter isso (em JAVA!):


Boas práticas de OO (construtores)


IoC e DI (mesmo sem framework)


     Testes te “forçam” a DI


 Desacoplamento (generalização)
Visite:
      www.tectura.com.br
    www.agendatech.com.br
www.ProgramadorPoliglota.com.br




          Obrigado!

More Related Content

Similar to Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

TDC SP 2016 - Dos requisitos à implantação em uma palestra
TDC SP 2016 - Dos requisitos à implantação em uma palestraTDC SP 2016 - Dos requisitos à implantação em uma palestra
TDC SP 2016 - Dos requisitos à implantação em uma palestraRafael Chaves
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Migrations com Entity Framework Core
Migrations com Entity Framework CoreMigrations com Entity Framework Core
Migrations com Entity Framework CoreCaio Lorensetti
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Giovanni Bassi
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#Felipe Pimentel
 
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018Renato Groff
 
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...tdc-globalcode
 
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...Renato Groffe
 
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDextra Sistemas / Etec Itu
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014Giovanni Bassi
 
Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)
Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)
Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)Igor Abade
 
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018Renato Groff
 
Docker, jenkins e gradle para tomar o controle de sua entrega
Docker, jenkins e gradle para tomar o controle de sua entregaDocker, jenkins e gradle para tomar o controle de sua entrega
Docker, jenkins e gradle para tomar o controle de sua entregaHumberto Streb
 
Minicurso de Cakephp
Minicurso de CakephpMinicurso de Cakephp
Minicurso de CakephpCauan Cabral
 

Similar to Arquitetura e Design QCon2010 - Paulo Silveira - Caelum (20)

TDC SP 2016 - Dos requisitos à implantação em uma palestra
TDC SP 2016 - Dos requisitos à implantação em uma palestraTDC SP 2016 - Dos requisitos à implantação em uma palestra
TDC SP 2016 - Dos requisitos à implantação em uma palestra
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Migrations com Entity Framework Core
Migrations com Entity Framework CoreMigrations com Entity Framework Core
Migrations com Entity Framework Core
 
Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2Fazendo Injeção de dependência com Unity 1.2
Fazendo Injeção de dependência com Unity 1.2
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Usando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NETUsando Docker no desenvolvimento .NET
Usando Docker no desenvolvimento .NET
 
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
Docker: introdução e primeiros passos - Sorocódigos - Agosto-2018
 
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
TDC2016POA | Trilha DevOps - Gestão de ciclo de vida de banco de dados: Já pa...
 
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
ASP.NET Core + Docker Compose: deployment descomplicado com containers - .NET...
 
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu DevelopersDesenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
Desenvolvimento em .NET utilizando Docker - Meetup 8 Itu Developers
 
Java Seminar
Java SeminarJava Seminar
Java Seminar
 
SAFe - Como escalar algo artesanal?
SAFe - Como escalar algo artesanal?SAFe - Como escalar algo artesanal?
SAFe - Como escalar algo artesanal?
 
ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014ASP.NET vNext no .NET Architects Days 2014
ASP.NET vNext no .NET Architects Days 2014
 
Microserviços
MicroserviçosMicroserviços
Microserviços
 
Apres git geinfo2012
Apres git geinfo2012Apres git geinfo2012
Apres git geinfo2012
 
Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)
Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)
Gestão de ciclo de vida de Banco de Dados: Já passou da hora! (TDC POA 2016)
 
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
Docker: introdução e primeiros passos - Baixada NERD - Junho-2018
 
Docker, jenkins e gradle para tomar o controle de sua entrega
Docker, jenkins e gradle para tomar o controle de sua entregaDocker, jenkins e gradle para tomar o controle de sua entrega
Docker, jenkins e gradle para tomar o controle de sua entrega
 
Minicurso de Cakephp
Minicurso de CakephpMinicurso de Cakephp
Minicurso de Cakephp
 
Implementação, design ou arquitetura?
Implementação, design ou arquitetura?Implementação, design ou arquitetura?
Implementação, design ou arquitetura?
 

More from Caelum

Performance Web além do carregamento
Performance Web além do carregamentoPerformance Web além do carregamento
Performance Web além do carregamentoCaelum
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSCaelum
 
Performance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesPerformance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesCaelum
 
Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaCaelum
 
Tudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetTudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetCaelum
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaCaelum
 
Métricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeMétricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeCaelum
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesHTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesCaelum
 
Offline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesOffline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesCaelum
 
Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Caelum
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Caelum
 
Por trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionPor trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionCaelum
 
Otimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo MobileOtimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo MobileCaelum
 
Introducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoIntroducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoCaelum
 
Otimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesOtimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesCaelum
 
All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...Caelum
 
Wsrest 2013
Wsrest 2013Wsrest 2013
Wsrest 2013Caelum
 
Design Responsivo por uma Web única
Design Responsivo por uma Web únicaDesign Responsivo por uma Web única
Design Responsivo por uma Web únicaCaelum
 
Os Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileOs Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileCaelum
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Caelum
 

More from Caelum (20)

Performance Web além do carregamento
Performance Web além do carregamentoPerformance Web além do carregamento
Performance Web além do carregamento
 
Desafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJSDesafios de Performance Web - BrazilJS
Desafios de Performance Web - BrazilJS
 
Performance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidadesPerformance na web: o modelo RAIL e outras novidades
Performance na web: o modelo RAIL e outras novidades
 
Progressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficadaProgressive Web Apps: o melhor da Web appficada
Progressive Web Apps: o melhor da Web appficada
 
Tudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcsetTudo que você precisa saber sobre picture e srcset
Tudo que você precisa saber sobre picture e srcset
 
Como o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vidaComo o HTTP/2 vai mudar sua vida
Como o HTTP/2 vai mudar sua vida
 
Métricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidadeMétricas e a automatização do controle de qualidade
Métricas e a automatização do controle de qualidade
 
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio LopesHTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
HTTP/2, SPDY e Otimizações Web - Front In Maceió 2014 - Sérgio Lopes
 
Offline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio LopesOffline Web com Service Workers - Sérgio Lopes
Offline Web com Service Workers - Sérgio Lopes
 
Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014Design Responsivo - MobCamp 2014
Design Responsivo - MobCamp 2014
 
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...Além do responsive design: a mudança de paradigma do design adaptativo e os m...
Além do responsive design: a mudança de paradigma do design adaptativo e os m...
 
Por trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflectionPor trás dos frameworks e além do reflection
Por trás dos frameworks e além do reflection
 
Otimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo MobileOtimizações de Performance Web: Desafios do Mundo Mobile
Otimizações de Performance Web: Desafios do Mundo Mobile
 
Introducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacaoIntroducao a inteligencia artificial na educacao
Introducao a inteligencia artificial na educacao
 
Otimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iteraçõesOtimizando o time to market - do zero a produção em poucas iterações
Otimizando o time to market - do zero a produção em poucas iterações
 
All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...All you need to know about JavaScript loading and execution in the browser - ...
All you need to know about JavaScript loading and execution in the browser - ...
 
Wsrest 2013
Wsrest 2013Wsrest 2013
Wsrest 2013
 
Design Responsivo por uma Web única
Design Responsivo por uma Web únicaDesign Responsivo por uma Web única
Design Responsivo por uma Web única
 
Os Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia MobileOs Caminhos de uma Estratégia Mobile
Os Caminhos de uma Estratégia Mobile
 
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
Porque você deveria usar CDI nos seus projetos Java! - JavaOne LA 2012 - Sérg...
 

Arquitetura e Design QCon2010 - Paulo Silveira - Caelum

  • 1. O impacto do design Paulo Silveira paulo.silveira@caelum.com.br na sua arquitetura @paulo_caelum 1
  • 2. de programador a designer a arquiteto? Então você quer ser um arquiteto Java? http://bit.ly/arquitetoJava Martin Fowler, Who needs an Architect? http://bit.ly/fowlerArchitect
  • 4. 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
  • 6. 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
  • 8. ...de manhã, o arquiteto programa com os desenvolvedores... Martin Fowler, Who needs an Architect?
  • 9. Afinal, pra você, o que é arquitetura?
  • 10. Arquitetura são os principais elementos do sistema, as peças que são difíceis de mudar.
  • 11. Arquitetura são os principais elementos do sistema, as peças que são difíceis de mudar. Arquitetura são as decisões que gostaríamos de ter tomado no começo do projeto. Ralph Johnson (do GoF) e Martin Fowler Who needs an Architect?
  • 12. meu artigo recebeu vários comentários, inclusive essas críticas: “Martin Fowler não sabe nada”
  • 13. meu artigo recebeu vários comentários, inclusive essas críticas: “Martin Fowler não sabe nada” “Você é poético, não sabe nada”
  • 14. meu artigo recebeu vários comentários, inclusive essas críticas: “Martin Fowler não sabe nada” “Você é poético, não sabe nada” “Ralph Johnson não sabe nada”
  • 15. meu artigo recebeu vários comentários, inclusive essas críticas: “Martin Fowler não sabe nada” “Você é poético, não sabe nada” “Ralph Johnson não sabe nada” “CMU-SEI são professores, não sabem nada”
  • 16. Resolvi então também dar minha opinião pessoal
  • 17. 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
  • 18. 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 evolutiva Last Responsible Moment Resolvi então também dar minha opinião pessoal
  • 19. E como tornar essas decisões “mais” possíveis de mudar?
  • 20. Arquitetura x Arquitetura Java
  • 21. Arquitetura x Arquitetura Java ...você precisa de pelo menos um arquiteto com enorme experiência prática na plataforma escolhida. Joel Spoelsky, Language Wars
  • 22. PIRÂMIDE? Implementação Design Arquitetura Neal Gafter, Evolutionary Architecture
  • 23. PIRÂMIDE? Implementação Design Arquitetura Não acredito que implementação e design tenham “menos” importância Neal Gafter, Evolutionary Architecture
  • 24. Implementação Design Arquitetura
  • 25. Implementação Design Arquitetura
  • 26. Implementação Design Arquitetura
  • 27. Dois exemplos de design facilitando a arquitetura
  • 28. Site da Caelum qual é a implementação? repository.adiciona(noticia);
  • 29. 1. Hibernate public 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(); }
  • 30. o que mudamos quando 2. JPA/BigTable migramos para o cloud
  • 31. o que mudamos quando 2. JPA/BigTable migramos para o cloud public 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(); }
  • 33. 3. Objectify public 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(); }
  • 34. lento e 3. Objectify não muito disponível public 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(); }
  • 35. 4. Objectify + Memcache
  • 36. 4. Objectify + Memcache public 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; }
  • 37. Relembrando IoC e DI NoticiaRepository repository = new NoticiaRepository(???); repository.adiciona(noticia);
  • 38. Relembrando IoC e DI NoticiaRepository repository = new NoticiaRepository(???); repository.adiciona(noticia); Ter feito o design com IoC e DI facilitou mudanças arquiteturais: hibernate -> JPA no Cloud -> Objectify -> Memcached
  • 39. WebChat Ajax Mudando de Comet com long polling para Comet streaming com Servlets 3 AsyncContext
  • 40. collections sem DI? long polling como fazer blocante? 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(); }
  • 41. streaming segurando conexão thread per request no comet = bad 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(); }
  • 42. streaming não blocante para isso a fila de eventos precisaria ser única 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(); } }
  • 43. queue tb por DI e dá para voltar pro long polling facilmente! public class Agent { // ... private final Queue<Update> updates; Agent(RoomFactory roomFactory, ClientQueue queue, Tenant tenant Queue<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(); }
  • 44. Exemplo bônus: Nick Kallen, arquiteto do Twitter no #qconsp com #Scala FIFO/LIFO blocante/não blocante usando IoC+DI
  • 45. 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
  • 46. para obter isso (em JAVA!):
  • 47. para obter isso (em JAVA!): Boas práticas de OO (construtores)
  • 48. para obter isso (em JAVA!): Boas práticas de OO (construtores) IoC e DI (mesmo sem framework)
  • 49. para obter isso (em JAVA!): Boas práticas de OO (construtores) IoC e DI (mesmo sem framework) Testes te “forçam” a DI
  • 50. para obter isso (em JAVA!): Boas práticas de OO (construtores) IoC e DI (mesmo sem framework) Testes te “forçam” a DI Desacoplamento (generalização)
  • 51. Visite: www.tectura.com.br www.agendatech.com.br www.ProgramadorPoliglota.com.br Obrigado!