<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5722644123640725689</id><updated>2012-02-13T13:24:44.527-02:00</updated><category term='Arquitetura de Software'/><category term='Verificação Validação e Testes'/><category term='Programação Distribuída com JEE'/><category term='Programação Orientada a Objetos'/><category term='Gerência da Configuração e Mudança'/><category term='Fundamentos da Engenharia de Software'/><category term='Qualidade de Software'/><title type='text'>Engenharia de Software</title><subtitle type='html'>Espaço destinado à disseminação da Engenharia de Software.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>17</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-2588014230115723556</id><published>2010-08-19T01:54:00.012-03:00</published><updated>2010-08-19T02:18:56.124-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Qualidade de Software'/><title type='text'>CMMI® ou Agile?</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 12px; line-height: 16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_vX7bwTP1U5E/TGy8ofZ-1DI/AAAAAAAAAIE/z0EYgr757gA/s1600/1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="110" src="http://2.bp.blogspot.com/_vX7bwTP1U5E/TGy8ofZ-1DI/AAAAAAAAAIE/z0EYgr757gA/s400/1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Há tempos venho alimentando a minha curiosidade em buscas de materiais que esclarecessem a polêmica que existe por trás de dois grandes paradigmas da Engenharia de Software: CMMI e Metodologias Ágeis. Foi então que me deparei com um excelente artigo escrito por profissionais do SEI (Software Engineering Institute) da Carnegie Mellon University. O nome do artigo? "&lt;b&gt;CMMI® or Agile: Why Not Embrace Both!&lt;/b&gt;", numa tradução livre: "&lt;b&gt;CMMI ou Ágil: por que não adotar ambos!(?)&lt;/b&gt;". Este post então é resultado de um pequeno resumo do artigo que, na minha opinião, contribue em muito para uma visão mais madura, no sentido profisisonal, sobre o entendimento de ambos os paradigmas, livrando-nos muitas vezes, de certo "achismos" e preconceitos. O artigo original é referenciado em um link no final deste post.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O artigo propoe desmistificar a confusão em que se tem ao adotar, em um mesmo ambiente de desenvolvimento de software, as metodologias CMMI e métodos ágeis. O autor afirma que o correto é se aproveitar ao máximo as melhores vantagens de ambos, já que as duas abordagens aplicam as melhores práticas da Engenharia de Software. Não sendo, portanto, saudável à profissão, se adotar uma postura favorável ou contra a qualquer um dos paradigmas.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O autor ainda afirma que o mal uso de ambos os métodos por mais de 20 anos, causado pelo mal entendimento e o uso exacerbado de suas técnicas, é o que tem resultado o desentendimento e a conclusão errônea de que, as suas aplicabilidades atrapalham o sucesso de um projeto de desenvolvimento de software.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O desentendimento muitas vezes ocorre mesmo em ambos os lados. Na comunidade CMMI existe a escassez de conhecimento profundo em torno dos métodos ágeis. Por outro lado, existe um conhecimento também superficial da comunidade ágil em relação ao CMMI.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A falta de conhecimento muitas vezes se deve ao fato da definição de diversas terminologias específicas de seus contextos, como por exemplo, Garantia da Qualidade e Previsibilidade no CMMI e Integração Contínua e Código Coletivo em metodologias ágeis, conforme citado pelo autor.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Outro fator de insucesso na aplicação conjunta desses dois conceitos está na diferença das duas abordagens, sendo uma bottom-up contra a outra, top-down, o que negligencia a visão de negócios, que deveria ser o que mais importa ao sucesso de um projeto de software.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Algumas curiosidades foram encontradas no artigo. O autor reconhece que a maneira como o CMMI foi criado causou o desentendimento e a sua má aplicabilidade. Um outro ponto é que as pessoas na comunidade ágil reconhecem o fato de conhecerem muitos aspectos relacionados ao CMM mas desconhecem tudo o que envolve o CMMI. O CMM não é atualizado desde 1993, o que evidencia que encontra-se descontinuado devido à criação do CMMI.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Uma outra cultura problemática nos tempos de hoje é que usuários do CMMI que usavam o CMM se atualizaram mas ainda continuam usando conceitos do modelo antigo.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;A origem dos dois extremos:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O segundo capítulo se dedica a descrever as origens de cada abordagem. As metodologias ágeis foram inspiradas no IIDD (Desenvolvimento e Projeto Iterativo e Incremental), adotado há 75 anos na área de engenharia e posteriormente proposto ao desenvolvimento de software por Edward Deming. Na década de 90, após a adoção official de alguns métodos ágeis, como o XP, introduzido na Chrysler, o manifesto ágil foi escrito e, em poucos anos esta filosofica IIDD foi disseminada rapidamente pelo mundo devido à quantidade de adeptos de renome que obtiveram sucesso em seus projetos.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Já o CMMI teve sua origem em abordagens top-down em projetos de contratos fechados principalmente desenvolvidos na linguagem COBOL. Uma primeira solicitação de sua criação e formalização foi feita pelo DoD (Departamento de Defesa dos E.U.A) ao que hoje chamamos de SEI (Software Engineering Institute) para melhorar a qualidade de seus projetos de software, pois, chegaram à conclusão de que a maioria deles eram muito custosos e não eram entregues ou eram entregues com atraso com poucas funcionalidades como o esperado. Os sistemas desenvolvidos nesse contexto eram comumente considerados críticos, ou seja, vidas poderiam ser perdidas em decorrência das falhas de software.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Além desses fatores, os sistemas desenvolvidos para o DoD muitas vezes tinham um alto custo de deploy e testes, e não poderiam ser mais admitidas as entregas monolíticas e inconstantes. Um sistema embarcado em um avião caça em 1980, por exemplo, não poderia ser atualizado durante o voo ao se perceber uma falha. Logo, fazer o software corretamente da primeira vez era criticamente importante.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Fatores que afetam nossa percepção:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_vX7bwTP1U5E/TGy82b8FI4I/AAAAAAAAAIM/u5ra-IONlo4/s1600/3.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="123" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/TGy82b8FI4I/AAAAAAAAAIM/u5ra-IONlo4/s400/3.gif" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;De acordo com o relatado pelo autor sobre o uso do CMMI nas organizações, o mesmo constata uma questão um tanto quanto curiosa: a perseguição pelos níveis de maturidade, através do conjunto de processos adotados, a empresa perde um pouco o foco no valores do ponto de vista do cliente, do produto, em torno dos projetos, e objetivos de negócios dos profissionais.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os profissionais que implementam o CMMI nas organizações muitas vezes falham em garantir que os processos adotados são totalmente implantados com sucesso nos novos projetos. Muitas vezes também não revisam os processos de acordo com as lições aprendidas e, os mesmos acabam se tornando incompatíveis com as práticas individuais e do time de desenvolvimento, além de se tornarem inflexíveis à adaptação de acordo com a necessidade do projeto. Um último ponto de falha na implantação é que, muitas vezes, os processos são descritos com um nível de formalismo que se torna de difícil entendimento pelos profissioniais, fator este que causa a sua rejeição.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para a implantação do CMMI com sucesso, deve-se considerar o &lt;b&gt;equilíbrio exato &lt;/b&gt;adotado pela organização, avaliando prerrogativas do projeto e individuais, analisando as responsabilidades estabelecidas às pessoas, confiança, negócios e considerações também culturais. Se esse equilíbrio é afetado em favor da organização, os projetos e os profissionais podem perder a flexibilidade necessária que eles precisam para atingir o sucesso profissional e a motivação desejada. Por outro lado, muita flexibilidade pode expor a organização a um grande risco e podem perder a oportunidade do aprendizado organizacional, o que pode levar a uma maior qualidade dos projetos ao longo prazo. É difícil, portanto, se atingir o equilíbrio ideal.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um grande e comum engano que ocorre pelas pessoas que utilizam o CMMI é a de encará-lo como um padrão, quando na verdade ele é um modelo de processos. As suas práticas propostas não são um conjunto ordenado de atividades a se seguir dentro de um processo específico. Quando se usa o termo “modelo”, a intenção é dizer que o método pode ser customizado de acordo com a necessidade, ou seja, as práticas são utilizadas conforme a necessidade da organização em qualquer momento de sua realidade. O CMMI também encoraja o experimento de outros modelos, práticas, frameworks e abordagens para a melhoria dos processos conforme a necessidade.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Em suma, o CMMI formou ao longo de muitos anos de pesquisa, uma base sólida de conhecimentos necessários aos projetos de software e metodologias atuais. &lt;b&gt;CMMI não foi concebido para ser um substituto ou uma definição de qualquer coisa no mundo real, e isto é que é um modelo&lt;/b&gt;. Portanto, é apenas um ideal construído para se definir boas práticas de situações no mundo real.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O que acontece é que muitas vezes, justamente por encará-lo como um padrão, ao invés de um modelo, o CMMI acaba sendo aplicado, quando deveria, na verdade, ser implementado. Isto faz com que se perca o foco no produto e ganhe foco mais na avaliação da organização, algo puramente comercial em muitos casos.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A implementação então, no mais correto conceito, se dá em utilizar o modelo da mesma maneira em que arquitetos e engenheiros da construção civil usam seus modelos: como uma ferramenta de aprendizado, comunicação, e principalmente, como um meio de organizar seus pensamentos. Já a aplicação é a corrida desenfreada em tentar se tornar exequível todas as práticas por ele propostas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;A verdade por trás do CMMI:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um fato que muitas vezes é contrariado principalmente pela ocorrência da desinformação é que, analisando holísticamente os últimos objetivos do CMMI, os seus propósitos são os de tornar os &lt;b&gt;processos de desenvolvimento de software menos pesados&lt;/b&gt;, eliminando tudo o que causa a improdutividade, assim como é proposto nas metodologias ágeis. Além disso, diferentemente dos métodos ágeis, o CMMI oferece toda a infra-estrutura de aprendizado organizacional e benefícios de melhorias passadas para os projetos que ainda nem começaram.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para se reforçar a idéia de que o CMMI é um modelo, o autor exemplifica dentro de alguns objetivos e suas práticas-chave, o único ponto que deve ser obrigatório a se seguir são os objetivos, já as práticas são opcionais, ou seja, é possível se escolher apenas algumas, desde que se atenda ao objetivo do modelo para a melhoria de uma área de processo que traga mais valor ao negócio da empresa.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;De acordo com essa preocupação de se utilizar o CMMI corretamente, foram criadas as avaliação SCAMPI, a qual é utilizada para analisar se a empresa está utilizando o CMMI como um modelo mesmo e não um padrão. Esta análise é feita através de estórias, ou temas, que sugerem visões para dar base a um analisador ou uma equipe de análise de processos.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;A verdade por trás das metodologias ágeis:&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Na intenção de relatar as verdades que ocorrem também em torno dos manifestos ágeis o autor nos revela também pontos problemáticos na sua abordagem. &lt;b&gt;Existem muitos depreciadores&lt;/b&gt; da mesmas que fazem um mau uso, ganhando a fama de “lacaios indisciplinados”, pois, ao analisar o &lt;b&gt;Manifesto Ágil&lt;/b&gt;, os mesmos acabam julgando que as práticas por ele propostas são a verdade absoluta ao sucesso de um projeto, sendo que na verdade, o que o manifesto diz é que devemos buscar mais as suas práticas ao invés das sugeridas por métodos tradicionais, mas não que devemos evitá-las. Muitas vezes essas pessoas apenas usam desses argumentos para se ter a total liberdade em seus processos, o que na verdade, os torna caóticos e não caracterizam qualquer metodologia.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um ponto marcante das metodologias ágeis é que as mesmas privilegiam o conhecimento tácito das pessoas (como no manifesto ágil: iterações entre os indivíduos ao invés de processos e ferramentas). Este fator pode beneficiar diretamente a organização &lt;b&gt;baixando o custo de seus processos de Engenharia de Software&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os riscos de processos centrados no conhecimento tácito são mitigados pelos seguintes fatores:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;b&gt;A duração do projeto e do ciclo de vida esperado (feito em “Time-Boxes” previsíveis);&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;b&gt;A natureza moderna de auto-documentação dos códigos-fonte;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;b&gt;O uso de ferramentas de engenharia reversa para documentar o projeto e ferramentas que integram pequenos pedaços do código continuamente;&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;b&gt;Equipes pequenas (o que traz baixa rotatividade de pessoal).&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O grande risco é quando há ausência de processos, disciplina e regras para planos ou planejamento do projeto.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cada palavra utilizada no manifesto ágil foi escrita cuidadosamente para denotar que se deve, portanto, dar prioridade aos conceitos estabelecidos e, no entanto, não devem ser interpretados como sendo a verdade absoluta. Algo semelhante ao engano que se comete no CMMI ao se aplicar todas as práticas rigidamente ao invés de se propor um modelo que atenda aos objetivos gerais. Algo que a abordagem SCAMPI vem tentando mudar.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;Conclusão: Há valor em ambos os paradigmas!&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_vX7bwTP1U5E/TGy99SMnjLI/AAAAAAAAAIc/vCOLKxzfxXE/s1600/4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="214" src="http://3.bp.blogspot.com/_vX7bwTP1U5E/TGy99SMnjLI/AAAAAAAAAIc/vCOLKxzfxXE/s320/4.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O que se prentende demostrar através de todos esses conceitos e fatos é que, há valor em ambos os paradigmas. CMMI e práticas ágeis são compatíveis pois, diferentemente do que se pensa, elas tratam de níveis diferentes de abstração, pois o CMMI trata dos processos visando a maturidade da organização, enquanto que as metodologias ágeis focam nos artefatos a nível de projeto. No entanto, quando se traz o CMMI também ao nível de projetos, é comprovado que ambos são realmente compatíveis, já que o CMMI diz o que o projeto deve fazer, e não em qual metodologia deve-se aplicar, podendo então se utilizar qualquer uma que tenha um alto nível de maturidade, como é o caso dos métodos ágeis.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_vX7bwTP1U5E/TGy-FcbjjZI/AAAAAAAAAIk/ThSt_qRcWQc/s1600/2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_vX7bwTP1U5E/TGy-FcbjjZI/AAAAAAAAAIk/ThSt_qRcWQc/s320/2.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A sinergia proveniente do uso dos dois paradigmas podem trazer inúmeros benefícios. &lt;b&gt;Os métodos ágeis podem fornecer o “how-to” (como fazer)&lt;/b&gt; para as melhores práticas do CMMI que funcionam bem ao contexto do projeto. Por outro lado, o &lt;b&gt;CMMI fornece toda a engenharia para se sustentar as práticas ágeis em grandes corporações&lt;/b&gt;. Além disso, o CMMI pode fornecer todo o gerenciamento dos processos que ajudarão a &lt;b&gt;manter e melhorar continuamente a implantação de uma abordagem ágil&lt;/b&gt; em uma organização.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um dos maiores desafios dos projetos que utilizam as metodologias ágeis nos dias de hoje, é a obtenção de escala para grandes projetos e até mesmo de manter o alinhamento quando se tem diversos projetos em uma mesma empresa. Quando não há a preocupação neste patamar organizacional, os riscos não são devidamente controlados e os requisitos não-funcionais ou arquiteturais acabam sendo deixados de lado. Para tanto, o CMMI oferece uma abordagem eficiente para gerir em grande escala. Uma outra tendência neste tipo de gerenciamento está em um novo modelo organizacional, também ágil, baseado em &lt;b&gt;Scrum de Scrums&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Já no CMMI o grande desafio está no que já havia sido comentado: flexibilizar o projeto e assim aplicar o tailoring correto às necessidades da empresa, priorizar os objetivos de negócio ao invés de focar na corrida da obtenção de certificação. As práticas, ao se atingir um determinado nível de maturidade, pode trazer valores imediatos. No entanto, &lt;b&gt;a longo prazo, essa maturidade pode ser perdida devido à sobrecarga de processos rumo a um novo nível&lt;/b&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O autor julga que muitas literaturas recentes para o CMMI são meras anedotas ao criticar as metodologias ágeis. O mesmo acontece no lado oposto. Há também um j&lt;b&gt;ulgamento precoce em torno da adoção de um paradigma ou outro&lt;/b&gt; ao se tentar aplicá-los em um projeto piloto e o mesmo falhar. Logo, o paradigma é tachado de falho e em seguida abandonado.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Em suma não existe um paradigma melhor que o outro, o que há são melhores abordagens para cada situação ou necessidade, &lt;b&gt;variáveis instrínsecas ao perfil da organização&lt;/b&gt;. Em acréscimo a essa idéia, o autor afirma que, em grandes organizações, obtem-se uma melhor maturidade nos processos utilizando-se da &lt;b&gt;sinergia&lt;/b&gt; resultando da junção dessas duas abordagens. O benefício colhido a longo prazo, sengundo pesquisas, se torna extremamente satisfatório.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Quando o CMMI é implementado de forma adequada, pode fornecer a infra-estrutura necessária para dimensionar com êxito a gestão e as entregas de sistemas complexos, mantendo as vantagens do desenvolvimento iterativo e incremental que as metodologias ágeis oferecem.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Segundo citações do autor, é recorrente vermos em discussões sobre o assunto pela comunidade ágil que, &lt;b&gt;CMMI e metodologias mais tradicionais como o processo em cascata são colocados como sinônimos&lt;/b&gt;, o que é de fato errôneamente interpretado! O CMMI transcende tais definições, pois, este paradigma não se enquadra no conceito de métodos ágeis e muito menos à métodos tradicionalistas.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A tendência em se formar campos distintos, tais como os que separam CMMI e Agile, é inerente à característica humana, mesmo quando falamos em desenvolvimento de software. O autor então defende que devemos ter um único objetivo em mente: &lt;b&gt;unir as comunidades em uma só&lt;/b&gt;. Assim, ganhariamos em discussões com o intuito de se &lt;b&gt;comparar resultados&lt;/b&gt;, facilitando também a &lt;b&gt;experimentação e aprendizado&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;A referência:&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Link original do artigo: &lt;a href="http://www.sei.cmu.edu/library/abstracts/reports/08tn003.cfm"&gt;http://www.sei.cmu.edu/library/abstracts/reports/08tn003.cfm&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Finalizo por aqui pessoal deixando a seguinte pergunta:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Você concorda com as afirmações deste autor? O que você mudaria ou acrescentaria a essas idéias?&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um grande abraço e até o próximo post! &amp;nbsp;:-)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande'; font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: 11px;"&gt;   &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-2588014230115723556?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/2588014230115723556/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/08/cmmi-ou-agile.html#comment-form' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/2588014230115723556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/2588014230115723556'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/08/cmmi-ou-agile.html' title='CMMI® ou Agile?'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vX7bwTP1U5E/TGy8ofZ-1DI/AAAAAAAAAIE/z0EYgr757gA/s72-c/1.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-5308058339354835489</id><published>2010-07-27T07:00:00.002-03:00</published><updated>2010-07-27T07:00:10.889-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Gerência da Configuração e Mudança'/><title type='text'>CVS X Subversion</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_vX7bwTP1U5E/TEpx2hOxkZI/AAAAAAAAAH4/3c7d7nGVyBk/s1600/image778.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="257" src="http://4.bp.blogspot.com/_vX7bwTP1U5E/TEpx2hOxkZI/AAAAAAAAAH4/3c7d7nGVyBk/s320/image778.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="font: 12px Helvetica; margin: 0px; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Olá pessoal,&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;hoje gostaria de tratar sobre um assunto que, por mais que esteja bem conceituado e conhecido por todos, sempre gera uma certa polêmica ao se tomar uma decisão a respeito. Estou falando da definição de um sistema de controle de versões (Software Configuration Management - SCM) para controlar e gerenciar a evolução dos artefatos gerados por um projeto de software.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Embora existam dezenas de sistemas dessa linha, tratarei aqui apenas dos mais utilizados atualmente no mercado: o CVS e o Subversion (SVN) frutos de uma boa e produtiva discussão gerada na empresa onde trabalho. Fato que me motivou a escrever sobre este tema após coletar dados e pesquisas suficientes para argumentar a migração do nosso SCM atual, o CVS, para o Subversion. Para uma completude das argumentações, também era necessário se levantar uma forma de migrar todos os dados hisóricos do repositório do antigo para o novo sistema.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para resumir a comparação entre as duas tecnologias, criei uma tabela que cruza características dos dois sistemas em uma perspectiva de administração da ferramenta, que é o que no fundo mais importa, já que as ferramentas utilizadas como clientes para acessa-las são muito parecidas e de fácil assimilação, o que não influenciaria em nada como vantagem ou desvantagem entre um e outro sistema de versionamento.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;table border="0" cellspacing="0" cols="3" frame="void" rules="none"&gt;&lt;colgroup&gt;&lt;col width="213"&gt;&lt;/col&gt;&lt;col width="386"&gt;&lt;/col&gt;&lt;col width="403"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="left" height="20" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" width="213"&gt;&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;td align="center" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" width="386"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;CVS&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="center" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" width="403"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Subversion&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="87" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Armazenamento&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;É feito em arquivos RCS. Estes arquivos são criados em toda a árvore de diretórios do projeto para versionar arquivo por arquivo. Possibilita maior poder para recuperar possíveis falhas apenas editando esses arquivos.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;É feito em banco de dados Berkley DB. Existem aplicativos para a recuperação de falhas.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="36" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Concorrência&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Existem problemas de acesso concorrente por se tratarem de arquivos em disco.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Acesso concorrente transacionado pelo banco de dados.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="70" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Velocidade&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Mais lento pelo fato de usar file system.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Mais rápido. O único problema de velocidade está no momento de se conectar ao repositório e fazer o primeiro checkout, já que ele traz uma cópia local de todos os arquivos.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="137" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Versionamento&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Gerencia versões diferentes para cada arquivo do projeto. Permite a criação de branchs e tags por arquivo. Não permite restaurar a versão do projeto à partir de uma tag específica.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Para cada branch ou tag, cria-se uma cópia no repositório e todos os arquivos do projeto ganham um número identificador de 4 dígitos. Ao se configurar um branch, o SVN cria uma tag correspondente no início, mas depois que se dá o primeiro commit, ele se transforma no branch e o novo versionamento se inicia imediatamente. Permite restaurar a versão do projeto à partir de uma tag específica.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="53" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Metadados&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Não armazena metadados, somente arquivos.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Permite que se vincule e versione também atributos relacionados aos arquivos, esses atributos são configurados na forma de par “chave=valor”.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="53" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Tipo de arquivos comportados&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Bom para armazenamento de arquivos texto. Problema em armazenar binários. Também não é possível se fazer diff de binários.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Todos os tipos de arquivo.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="36" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Rollback&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Permite, no entanto tem que se faze de arquivo por arquivo.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Não permite, tem que ser fazer cópias de versões em bom estado.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="87" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Transações – Integridade&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Não possui a teoria do “ou tudo, ou nada” pois, quando há conflitos, os arquivos afetados deixam de serem “commitados”, sendo que os estão íntegros(sem conflito) vão para o repositório mesmo assim.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Possui o conceito do “ou tudo, ou nada”. Assim, os números das revisões são marcados apenas quando todos os conflitos foram resolvidos e finalmente se dá o commit. Permite também configurar grupos para commit.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="36" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Lock de arquivos&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Não possui.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Possui. Se um usuário bloqueia o arquivo, ele fica como “somente leitura” para os outros.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="20" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Interoperabilidade&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Não possui.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Pode se comunicar via Http e ssh.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="20" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Integração com o RedMine&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Possui.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Possui.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="20" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;b&gt;&lt;span style="font-size: small;"&gt;Integração com o Hudson&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#e6e6e6" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Possui.&lt;/span&gt;&lt;/td&gt;&lt;td align="justify" bgcolor="#c0c0c0" style="border: 1px solid rgb(0, 0, 0); font-family: arial,sans-serif; margin: 0px;" valign="middle"&gt;&lt;span style="font-size: small;"&gt;Possui.&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Reparem que ao final da tabela de avaliação eu cito duas integrações com outros sistemas: RedMine e Hudson. O &lt;a href="http://redmine.org/"&gt;RedMine&lt;/a&gt; é um sistema de gerência de projetos que utilizamos na empresa. Já o &lt;a href="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; é o sistema de integração contínua open-source mais utilizado do mercado. Estas duas ferramentas se tornam muito valiosas para se fechar o círculo formado pelos componentes necessários a uma Gestão de Configuração eficaz. Pretendo abordar algo sobre elas e sobre a teoria em torno da Gerência de Configuração e Mudança em breve!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Ok, podemos concluir pela tabela que, o SVN possui uma série de características mais arrojadas que o CVS, mas ainda fica uma pergunta no ar: se a necessidade era também a de migrar os dados, como faríamos isto sem que perdêssemos todos os dados históricos das tags e branchs criados?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Para a árdua tarefa de migração também já existe uma ferramenta muito difundida: o CV2SVN... Ufa!&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Esta ferramenta basicamente&amp;nbsp;percorre toda a estrutura de diretórios do projeto afim de mapear e migrar todos os dados históricos de branchs e tags criadas para o novo repositório. Ela permite também que se configure os dois SCM's para sincronizar as alterações de arquivos de um para o outro.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Os nossos próximos passos são instalar então o SVN e CVS2SVN e colocar a migração em prática. Prometo relatar os resultados e todo o caminho das pedras nos próximos posts!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Seguem algumas referências importantes sobre o assunto:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-family: arial,sans-serif; font-size: 13px; font-weight: bold;"&gt;Sites para documentação:&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;li&gt;CVS:&amp;nbsp;&amp;nbsp;&lt;a href="http://www.nongnu.org/cvs/#documentation" style="color: #2a5db0;" target="_blank"&gt;http://www.nongnu.org/cvs/#&lt;wbr&gt;&lt;/wbr&gt;documentation&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;Subersion:&amp;nbsp;&lt;a href="http://subversion.apache.org/docs/" style="color: #2a5db0;" target="_blank"&gt;http://subversion.apache.org/&lt;wbr&gt;&lt;/wbr&gt;docs/&lt;/a&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;b&gt;Estratégia de migração:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;li style="text-align: justify;"&gt;Aplicativo&amp;nbsp;&lt;b&gt;CVS2SVN&lt;/b&gt;&amp;nbsp;:&amp;nbsp;&lt;a href="http://svn2cvs.tigris.org/" style="color: #2a5db0;" target="_blank"&gt;http://cvs2svn.tigris.org&lt;/a&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;b&gt;Outras referências:&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://sam.zoy.org/writings/programming/svn2cvs.html" style="color: #2a5db0;" target="_blank"&gt;http://sam.zoy.org/writings/&lt;wbr&gt;&lt;/wbr&gt;programming/svn2cvs.html&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://onlamp.com/pub/a/onlamp/2005/10/03/cvs-to-subversion-with-cvs2svn.html" style="color: #2a5db0;" target="_blank"&gt;http://onlamp.com/pub/a/&lt;wbr&gt;&lt;/wbr&gt;onlamp/2005/10/03/cvs-to-&lt;wbr&gt;&lt;/wbr&gt;subversion-with-cvs2svn.html&lt;/a&gt;&lt;/li&gt;&lt;li style="text-align: justify;"&gt;&lt;a href="http://sial.org/howto/subversion/cvs-migrate/" style="color: #2a5db0;" target="_blank"&gt;http://sial.org/howto/&lt;wbr&gt;&lt;/wbr&gt;subversion/cvs-migrate/&lt;/a&gt;&lt;/li&gt;&lt;/span&gt;&lt;/ul&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Fiquem à vontade para deixar os seus comentários!&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;Um abraço a todos e até o próximo post! ;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: arial,sans-serif; font-size: small;"&gt;&lt;span class="Apple-style-span" style="border-collapse: collapse; font-size: 13px;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-5308058339354835489?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/5308058339354835489/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/07/cvs-x-subversion.html#comment-form' title='10 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/5308058339354835489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/5308058339354835489'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/07/cvs-x-subversion.html' title='CVS X Subversion'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_vX7bwTP1U5E/TEpx2hOxkZI/AAAAAAAAAH4/3c7d7nGVyBk/s72-c/image778.png' height='72' width='72'/><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-4380889763961699058</id><published>2010-05-19T07:00:00.002-03:00</published><updated>2010-05-19T20:52:59.677-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação Orientada a Objetos'/><title type='text'>Design Patterns na Prática - Parte II: Abstract Factory</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://3.bp.blogspot.com/_vX7bwTP1U5E/S_NecFFZ4NI/AAAAAAAAAGk/vVNNjyLDCyw/s1600/marxtoys.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="313" src="http://3.bp.blogspot.com/_vX7bwTP1U5E/S_NecFFZ4NI/AAAAAAAAAGk/vVNNjyLDCyw/s400/marxtoys.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Continuando a nossa série, apresento-lhes mais um padrão de projeto criacional: &lt;b&gt;Abstract Factory&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Temos a seguinte situação:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Um banco possui dois tipos de contas: &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Corrente &lt;/li&gt;&lt;li&gt;Poupança &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Cada uma delas pode ser categorizada como: &lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Simples &lt;/li&gt;&lt;li&gt;Normal &lt;/li&gt;&lt;li&gt;Plus &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Cada uma dessas características possuem as suas vantagens particulares.  Como aplicar um padrão de projeto criacional nesses objetos de maneira a ter-se &lt;b&gt;menos impacto ao inserir-se um tipo de conta nova ou mais características das contas&lt;/b&gt;?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Resposta:&lt;span style="font-family: Arial;"&gt;&lt;o:p&gt;&amp;nbsp; &lt;b&gt;Abstract Factory&lt;/b&gt;!&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://4.bp.blogspot.com/_vX7bwTP1U5E/S_NbrPpC7rI/AAAAAAAAAGc/KUwI5TIGH_c/s1600/Captura+de+tela+2010-05-19+%C3%A0s+00.28.31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="235" src="http://4.bp.blogspot.com/_vX7bwTP1U5E/S_NbrPpC7rI/AAAAAAAAAGc/KUwI5TIGH_c/s400/Captura+de+tela+2010-05-19+%C3%A0s+00.28.31.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;o:p&gt;&amp;nbsp;Temos então 3 tipos de fábrica de contas poupança ou corrente de acordo com o tipo necessário, são elas: &lt;i&gt;TipoSimples&lt;/i&gt;, &lt;i&gt;TipoNormal&lt;/i&gt; e &lt;i&gt;TipoPlus&lt;/i&gt;. Todas essas fábricas concretas são representadas pela Fábrica Abstrata &lt;i&gt;TipoConta&lt;/i&gt;, que é quem define os métodos de criação, ou seja, qualquer que seja a nova fábrica a ser criada para contas, ela deve ser capaz de criar os novos tipos de conta de acordo com o proposto por essa abstração&lt;i&gt;. &lt;/i&gt;Assim definimos o processo de criaçõ totalmente flexível: &lt;b&gt;não precisamos mudar nenhum código existente para criarmos mais um tipo de conta!&lt;/b&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;o:p&gt;Concluindo, apresento-lhes a ficha resumida deste padrão:&lt;i&gt; &amp;nbsp;&lt;/i&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Objetivo:&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Fornecer uma interface a ser utilizada para criar famílias de objetos relacionados ou dependentes sem realmente especificar suas classes concretas.&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Benefícios:&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Isola o cliente das classes concretas(da implementação). Facilita a troca de famílias de objetos;&lt;/li&gt;&lt;li&gt;Promove a consistência entre objetos. &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Aplicabilidade:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;O sistema precisa ser independente da maneira como seus objetos são criados, compostos e representados;&lt;/li&gt;&lt;li&gt;O sistema precisa ser configurado com um objeto de uma família de vários objetos;&lt;/li&gt;&lt;li&gt;A família de objetos relacionados é concebida para ser utilizada em conjunto e essa restrição precisa ser imposta;&lt;/li&gt;&lt;li&gt;Deseja-se fornecer uma biblioteca de objetos que não mostre as implementações e somente revele as interfaces.&amp;nbsp;&lt;/li&gt;&amp;nbsp;&lt;/ul&gt;&lt;ul style="text-align: justify;"&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;Então é isto galera! Qualquer dúvida, é só deixar o seu comentário que tentarei ajudar o mais rápido possível! ;)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um abraço a todos e até o próximo post!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-4380889763961699058?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/4380889763961699058/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/05/design-patterns-na-pratica-parte-ii.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/4380889763961699058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/4380889763961699058'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/05/design-patterns-na-pratica-parte-ii.html' title='Design Patterns na Prática - Parte II: Abstract Factory'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_vX7bwTP1U5E/S_NecFFZ4NI/AAAAAAAAAGk/vVNNjyLDCyw/s72-c/marxtoys.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-2709030142519447137</id><published>2010-05-12T07:00:00.060-03:00</published><updated>2010-05-12T22:27:49.032-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação Orientada a Objetos'/><title type='text'>Design Patterns na Prática - Parte I: Builder</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_vX7bwTP1U5E/S-omxHOnAxI/AAAAAAAAAGQ/vas5_8ROF8Y/s1600/Construtor-ISO.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/_vX7bwTP1U5E/S-omxHOnAxI/AAAAAAAAAGQ/vas5_8ROF8Y/s320/Construtor-ISO.gif" width="313" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Olá pessoal! Hoje darei início a uma série de "rapidinhas" sobre a aplicação de design patterns em exemplos práticos. Darei um problema e, em seguida, a modelagem de uma solução adequada. Espero que aproveitem!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O primeiro padrão a ser tratado trata-se de um comumente utilizado em projetos de software quando se tem a intenção de criar objetos complexos dinâmicamente e de maneira flexível sem precisarmos fazer isto de explícitamente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Basicamente, o objetivo deste padrão é &lt;b&gt;separar a construção de um objeto complexo da sua representação, de modo que o mesmo processo de construção possa criar diferentes objetos. &lt;/b&gt;Estou falando nada mais, nada menos, do incrível padrão &lt;b&gt;Builder&lt;/b&gt;!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;Vamos então ao que interessa:&lt;br /&gt;&lt;br /&gt;Uma aplicação envia um XML a outra contendo os seguintes campos abaixo: &lt;br /&gt;&lt;br /&gt;&lt;i style="color: blue;"&gt;&amp;lt;header&amp;gt;...&amp;lt;/header&amp;gt;&amp;nbsp;&lt;/i&gt;&lt;br /&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;lt;body&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;struct1&amp;gt;&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;campo1&amp;gt;...&amp;lt;/campo1&amp;gt;...&amp;lt;campo2&amp;gt;...&amp;lt;/campon&amp;gt;….&lt;/i&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/struct1&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;struct2&amp;gt;&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;campo1&amp;gt;...&amp;lt;/campo1&amp;gt;...&amp;lt;campo2&amp;gt;...&amp;lt;/campon&amp;gt;….&lt;/i&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/struct2&amp;gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ….&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;structn&amp;gt;&amp;nbsp;&lt;/i&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;campo1&amp;gt;...&amp;lt;/campo1&amp;gt;...&amp;lt;campo2&amp;gt;...&amp;lt;/campon&amp;gt;….&lt;/i&gt;&lt;/div&gt;&lt;div style="color: blue;"&gt;&lt;i&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/structn&amp;gt;&lt;/i&gt;&lt;/div&gt;&lt;i style="color: blue;"&gt;&amp;lt;/body&amp;gt; &lt;br /&gt;&amp;lt;trailer&amp;gt;...&amp;lt;/trailer&amp;gt; &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O problema é criar uma interface para enviar alguns parâmetros e buscá-los de um banco de dados (ex: um registro de uma pessoa como nome, endereço, etc...) e a mesma traga o XML apropriado montado. Utilizamos então para isto um design pattern do tipo criacional para se construir as classes necessárias para gerar esse XML: o &lt;b&gt;Builder&lt;/b&gt;!&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_vX7bwTP1U5E/S-oktc3RmgI/AAAAAAAAAGI/whXCGjkMmOg/s1600/Captura+de+tela+2010-05-12+%C3%A0s+00.49.04.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="185" src="http://3.bp.blogspot.com/_vX7bwTP1U5E/S-oktc3RmgI/AAAAAAAAAGI/whXCGjkMmOg/s400/Captura+de+tela+2010-05-12+%C3%A0s+00.49.04.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;br /&gt;Nossa classe com o papel de diretor (&lt;i&gt;ManageXMLConstruct&lt;/i&gt;) coordenará a delegação da construção às fábricas específicas de cada classe que representa uma tag do XML de acordo com a necessidade da construção. É o Builder entrando em ação!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É isso pessoal, fico por aqui.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Para qualquer dúvida, por favor, não deixe de postar o seu comentário.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um abraço e até o próximo post da série! ;)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-2709030142519447137?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/2709030142519447137/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/05/design-patterns-na-pratica-parte-i.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/2709030142519447137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/2709030142519447137'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/05/design-patterns-na-pratica-parte-i.html' title='Design Patterns na Prática - Parte I: Builder'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_vX7bwTP1U5E/S-omxHOnAxI/AAAAAAAAAGQ/vas5_8ROF8Y/s72-c/Construtor-ISO.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-7937792848692398255</id><published>2010-04-20T00:23:00.005-03:00</published><updated>2010-05-11T10:22:30.683-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação Orientada a Objetos'/><title type='text'>Padrões de Projeto ( Design Patterns ) - O que são?</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_vX7bwTP1U5E/S80Q15FV3CI/AAAAAAAAAF4/Ci5Fk2y1f58/s1600/solu%C3%A7%C3%A3o.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="400" src="http://4.bp.blogspot.com/_vX7bwTP1U5E/S80Q15FV3CI/AAAAAAAAAF4/Ci5Fk2y1f58/s400/solu%C3%A7%C3%A3o.jpg" width="388" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Padrões de Projeto (os Design Patterns), são combinações de classes e algoritmos associados que cumprem com propósitos comuns de projeto. São normalmente soluções consagradas que se baseiam nas estruturas da orientação a objetos em sua melhor forma.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Cada padrão descreve um problema no nosso ambiente e o cerne da sua solução, de tal forma que você possa usar essa solução mais de um milhão de vezes, sem nunca fazê-lo da mesma maneira.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Os padrões de projeto, basicamente, se dividem em grandes 3 categorias: &lt;b&gt;Criacional, Estrutural e Comportamental&lt;/b&gt;. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;São 4 os elementos importantes que definem um Padrão (Pattern), são eles:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;Nome&lt;/b&gt;: A identificação do Pattern é importante pois ele torna-se membro do vocabulário do projetista e de seus colegas;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Problema&lt;/b&gt;: descreve quando aplicar o Pattern. Apresenta a classe de problemas em questão e seu contexto;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Solução&lt;/b&gt;: descreve os elementos que fazem parte do design, seus relacionamentos, responsabilidades e colaborações;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Conseqüências&lt;/b&gt;: os resultados e efeitos causados pela aplicação do pattern. &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para se descrever e catalogar um Padrão de Projeto com total completude de informações, são necessários os seguintes dados:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;&lt;b&gt;Nome do Pattern e Classificação&lt;/b&gt;: Passa a fazer parte do vocabulário dos projetistas;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Propósito&lt;/b&gt;: Respostas para as perguntas - O quê o Pattern faz? Que tipo de problema ou característica particular de Design ele trata?&lt;/li&gt;&lt;li&gt;&lt;b&gt;Também Conhecido Como&lt;/b&gt;: Conjunto de outros nomes (apelidos) conhecidos para o Pattern, se existir algum;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Motivação&lt;/b&gt;: Um cenário que ilustra o problema de Design e como as estruturas de classes e objetos no Pattern o resolvem;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Aplicação&lt;/b&gt;: Respostas para as perguntas - Quais são as situações onde este Pattern pode ser aplicado? Quais são os exemplos de Designs que ele pode tratar? Como você pode reconhecer estas situações?&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Estrutura&lt;/b&gt;: Uma representação gráfica das classes no Pattern. Participantes: As classes e/ou objetos que participam no Design Pattern, e suas responsabilidades; &lt;/li&gt;&lt;li&gt;&lt;b&gt;Colaborações&lt;/b&gt;: Como os participantes interagem para cumprir suas responsabilidades;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Conseqüências&lt;/b&gt;: Respostas para as perguntas - Como o Pattern alcança seus objetivos? Quais são os resultados do uso do Pattern?&lt;br /&gt;&lt;b&gt;Implementação&lt;/b&gt;: Dicas e técnicas que Designer deve saber, e possíveis armadilhas para as quais ele deve estar preparado;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Código Exemplo&lt;/b&gt;: Fragmentos de código que ilustrem como o Pattern deve ser implementado;&lt;br /&gt;&lt;b&gt;Usos Conhecidos&lt;/b&gt;: Exemplos de utilização do Pattern em sistemas já implementados;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Patterns Relacionados&lt;/b&gt;: Lista de todos os Patterns fortemente relacionados ao Pattern em questão e as suas principais diferenças. &lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Atualmente existem diversos catálogos de padrões já criados,&amp;nbsp; dentre os grandes, posso citar alguns aqui:&lt;/div&gt;&lt;ul style="text-align: justify;"&gt;&lt;li&gt;Padrões Gof&amp;nbsp;&lt;/li&gt;&lt;li&gt;Padrões JEE&amp;nbsp;&lt;/li&gt;&lt;li&gt;Padrões Microsoft&lt;/li&gt;&lt;li&gt;Padrões Corporativos&amp;nbsp;&lt;/li&gt;&lt;li&gt;Padrões de Integração&amp;nbsp;&lt;/li&gt;&lt;li&gt;Padrões SOA&lt;/li&gt;&lt;/ul&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os Patterns são oriundos de alguns princípios de programação, como por exemplo, o Design de Objetos, o que se torna algo complexo em projetos de software, já que muitos parâmetros estão implícitos neste conceito, como &lt;b&gt;encapsulamento, granularidade, dependência, flexibilidade, desempenho, evolução e reutilização&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Muitos objetos oriundam da análise, e muitos destes não são abstrações do mundo real, como vetores por exemplo. Por outro lado, existem objetos que raramente aparecem durante a análise, e sim, aparecem para auxiliarem a fase de projeto. Logo, os padrões de projeto ajudam a identificar abstrações menos óbvias bem como os objetos que podem captura-las. Padrões como Composite (tratamento uniforme de objetos que não têm uma contrapartida física), Strategy (descreve como implementar famílias de algoritmos intercambiáveis) e State (representa cada estado de uma entidade como um objeto) são bastante úteis, como exemplo.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;A granulidade de objetos:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Objetos podem variar tremendamente em tamanho e número. Podem representar qualquer abstração. Os padrões de projeto auxiliam no tratamento da granularidade. Tem-se como exemplo:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Façade&lt;/b&gt;: Descreve como representar subsistemas completos como objetos;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Flyweight&lt;/b&gt;: Descreve como suportar enormes quantidades de objetos nos níveis de granularidade mais finos;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;b&gt;Abstract Factory&lt;/b&gt;: Fornecem objetos cujas únicas responsabilidades são criar outros objetos;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Command&lt;/b&gt;: Fornecem objetos cujas únicas responsabilidades são implementar uma solicitação em outro objeto ou grupo de objetos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Especificação de Interfaces:&amp;nbsp;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Um bom conceito O.O para se programar utilizando padrões de projeto é: "&lt;b&gt;Programa para interfaces, nunca para uma implementação&lt;/b&gt;".&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Uma interface é o conjunto de assinaturas declaradas por um objeto, sendo que cada operação declarada (Assinatura) especifica o nome da operação, os objetos que ela aceita como parâmetros e o valor retornado por ela.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Um tipo é um nome usado para denotar uma interface específica. Quando um objeto tem um tipo “Janela”, significa que ele aceita todas as solicitações para as operações definidas na interface chamada “Janela”.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As interfaces são fundamentais para a programação orientada à objetos. Objetos devem ser conhecidos somente por suas interfaces e, quando uma mensagem é enviada a um objeto, a operação específica que será executada depende da “mensagem” e do objeto “receptor”. Na prática, significa que diferentes objetos que suportam solicitações idênticas, podem possuir diferentes implementações para atender estas solicitações, é o chamado &lt;b&gt;Polimorfismo&lt;/b&gt; entrando em cena!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A associação em tempo de execução de uma solicitação a um objeto e a uma das suas operações é conhecida como ligação dinâmica (dynamic binding). Essa ligação auxilia o polimorfismo que por sua vez, simplifica as definições dos clientes, desacopla objetos entre si e permite a eles variarem seus inter-relacionamentos em tempo de execução. Os padrões de projeto auxiliam o uso do polimorfismo bem como o uso de interfaces, além de ajudarem a definir as interfaces pela identificação de seus elementos-chave e pelos tipos de dados que são enviados através das assinaturas das operaões contidas nas mesmas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Classe do objeto (implementação) x Tipo do objeto (interface)&lt;/b&gt;: um objeto pode ter muitos tipos, e objetos de diferentes classes podem ter o mesmo tipo;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Herança de classe x Herança de interface&lt;/b&gt;: a herança de classe define a implementação de um objeto em termos da implementação de outro objeto (é um mecanismo para compartilhamento de código e de representação), já a herança de interface descreve quando um objeto pode ser usado no lugar de outro.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Dado todo este contexto, uma outra dica O.O importante é: &lt;b&gt;não declarar variáveis como instâncias de classes concretas específicas&lt;/b&gt;. Isso dá maior flexibilidade ao código e ajudará no polimorfismo.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Herança e Composição:&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As vantagens de se utilizar herança nos seus projetos O.O. basicamente são: simplicidade e rapidez na execução (definida em tempo de compilação) e que a mesma permite alterar com facilidade a implementação herdada (reuso).&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Já entre as desvantagens, podemos citar: a herança não permite alterar a implementação herdada em tempo de execução e expõe para as classes descendentes, os detalhes da implementação, ferindo assim, o princípio do encapsulamento. A dependência da implementação herdada também prejudica no reuso das classes.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;As vantagens da Composição basicamente são: os objetos são acessados somente através de suas interfaces, sem violar o encapsulamento e proporcionando independência de implementação, além do fato de que, com classes em que um número pequeno de heranças é usado e temos papéis bem definidos e focados, aumenta-se então, a capacidade de reutilização.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;As desvantagens da Composição podem ser: como neste caso a herança diminuirá, e o número de objetos no sistema aumentará, e consequentemente, a performance do sistema que utiliza a composição dependerá de como será feito o inter-relacionamento entre esses&amp;nbsp; objetos.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Delegação:&lt;/b&gt; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É um princípio muito importante e que também é largamente utilizado nos Padrões de Projetos, se baseia no envolvimento de dois objetos ou mais objetos que visam atender a uma determinada solicitação (utiliza poderosamente a composição de objetos).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Exemplificando-se tem-se uma classe “Window” em “Rectangle”. Em vez de se fazer “Window” sub-classe de “Rectangle” (uma Janela é retangular!), ela reutilizaria o comportamento de “Rectangle”. Em vez de dizer que uma “Window” é um “Rectangle”, diremos então que uma “Window” possui um comportamento de um “Rectangle”.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;A principal vantagem disso é que se “Window” em tempo de execução, quiser ter um comportamento de um “Circle” (círculo), basta utilizar uma instância de “Circle” assumindo que ambas tenham o mesmo tipo (interface).&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Existem duas desvantagens: Um código dinâmico e altamente parametrizável é mais difícil de compreender e a performance é comprometida porque definir trocas em tempo de execução possuem um “overhead” da troca de contexto antes da execução propriamente dita.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Conclui-se que o uso da delegação é recomendável quando a mesma simplificar e não complicar o projeto. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Um exemplo de Padrão para ilustrar esses conceitos: Bridge.&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: justify;"&gt;&lt;a href="http://2.bp.blogspot.com/_vX7bwTP1U5E/S80InuucTBI/AAAAAAAAAFw/59pD4sC-g_Y/s1600/Captura+de+tela+2010-04-19+%C3%A0s+22.52.37.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="193" src="http://2.bp.blogspot.com/_vX7bwTP1U5E/S80InuucTBI/AAAAAAAAAFw/59pD4sC-g_Y/s400/Captura+de+tela+2010-04-19+%C3%A0s+22.52.37.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este padrão estrutural do GOF basicamente define um modelo no qual separa o conceito (definido pelas classes à esquerda) das suas implementações.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A &lt;b&gt;herança&lt;/b&gt; é utilizada nas relações entre as classes &lt;i&gt;Abstraction e RefinedAbstraction&lt;/i&gt;, na qual uma implementação do conceito é definida pelo seu tipo.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Temos &lt;b&gt;herança&lt;/b&gt; também na relação entre a interface &lt;i&gt;Implementor&lt;/i&gt; e suas implementações &lt;i&gt;ConcreteImplementorA e ConcreteImplementorB&lt;/i&gt;. O propósito disto é dar flexibilidade na relação entre o conceitos e suas duas formas de implementações, configurando assim a &lt;b&gt;relação de delegação polimórfica&lt;/b&gt; entre as duas estruturas definidas distintamente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A &lt;b&gt;composição&lt;/b&gt; se dá justamente nesta relação de delegação entre as duas interfaces &lt;i&gt;Abstraction &lt;/i&gt;e&lt;i&gt; Implementor&lt;/i&gt;, o que nos permite compor N combinações de novas abstrações (conceitos) com N tipos diferentes de comportamentos (implementações). Tal definição nos fornece então, a &lt;b&gt;granularidade de objetos&lt;/b&gt; almejada para este propósito.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Podemos concluir então que, &lt;i&gt;RefinedAbstraction&lt;/i&gt; pode invocar métodos, assumindo comportamentos, (representados por sua interface) tanto de &lt;i&gt;ConcreteImplementorA&lt;/i&gt; ou &lt;i&gt;ConcreteImplementorB&lt;/i&gt;.&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bom, neste ponto você já deve estar pensando que poderia muito bem fazer esta relação entre conceito &amp;lt;-&amp;gt; implementação simplesmente colocando as classes &lt;i&gt;ConcreteImplementorA&lt;/i&gt; e &lt;i&gt;ConcreteImplementorB &lt;/i&gt;como "herdeiras" &lt;i&gt;de RefinedAbstraction&lt;/i&gt;, mas esta falta de separação te dará algumas dores de cabeça quando você necessitar incluir mais uma forma de implementação (&lt;i&gt;ConcreteImplementorC&lt;/i&gt;, por exemplo)&lt;i&gt;, &lt;/i&gt;já que, para se adequar a isto, teria-se que modificar também a &lt;i&gt;RefinedAbstraction,&lt;/i&gt; ou seja, o custo de manutenção, em um projeto real, vai aumentando exponencialmente e, certamente você não vai querer isso! &lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É isso aí pessoal, concluo o meu post aqui e, espero ter esclarecido em poucas palavras, o que são os padrões de projeto e os conceitos e definições que o envolvem.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Fiquem à vontade para comentar, tirar dúvidas ou sugerir melhorias.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um grande abraço a todos e até o próximo post!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;. &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-7937792848692398255?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/7937792848692398255/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/04/padroes-de-projeto-design-patterns-o.html#comment-form' title='5 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7937792848692398255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7937792848692398255'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/04/padroes-de-projeto-design-patterns-o.html' title='Padrões de Projeto ( Design Patterns ) - O que são?'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_vX7bwTP1U5E/S80Q15FV3CI/AAAAAAAAAF4/Ci5Fk2y1f58/s72-c/solu%C3%A7%C3%A3o.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-7362242733942133479</id><published>2010-03-31T01:37:00.000-03:00</published><updated>2010-03-31T01:44:25.581-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Verificação Validação e Testes'/><title type='text'>15 Práticas Para Um Analista de Qualidade Altamente Eficaz</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_vX7bwTP1U5E/S7LRaPqUb2I/AAAAAAAAAFI/sZcY41Q0Oss/s1600/testes_de_software.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="145" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/S7LRaPqUb2I/AAAAAAAAAFI/sZcY41Q0Oss/s400/testes_de_software.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Os testes de software são processos integrantes de toda e qualquer metodologia de software, basicamente são responsáveis por executar e garantir o sucesso de dois princípios básicos:&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;VALIDAÇÃO&lt;/b&gt; = garante que se está construindo &lt;b&gt;CERTO O PRODUTO&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;VERIFICAÇÃO&lt;/b&gt; = garante que se está construindo &lt;b&gt;O PRODUTO CERTO&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Ou seja, a &lt;b&gt;Validação&lt;/b&gt; está intimamente ligada à conformidade com os &lt;b&gt;requisitos&lt;/b&gt; de negócio do sistema. Já a &lt;b&gt;Verificação&lt;/b&gt; está ligada ao processo de &lt;b&gt;codificação&lt;/b&gt; correta do sistema, prevenindo-o de erros e falhas.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Baseado nesses princípios e na busca de que o mesmos estejam nos projetos de maneira efetiva, eu gostaria de expor, de maneira bem genérica, as principais práticas de um profissional responsável por executar e gerenciar o processo de testes em projetos de software. Tais práticas são consenso de mercado e indicações de sucesso no processo de testes, o que indica que o profissional que as adota pode ser considerado um profissional altamente eficaz. Logo, se você, profissional da área de testes, almeja obter êxito em sua profissão, fique ligado às dicas! ;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Vamos então a elas:&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;1 - Prepare um &lt;b&gt;documento de abordagem de teste&lt;/b&gt; e plano de qualidade;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;2 -&lt;b&gt; Obtenha a aprovação&lt;/b&gt; durante o planejamento dos testes;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;3 - Defina os &lt;b&gt;ambientes de teste&lt;/b&gt; necessários e &lt;b&gt;garanta a clareza na execução&lt;/b&gt; dos testes;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;4 - Documente o &lt;b&gt;gerenciamento de configuração&lt;/b&gt; e garanta a &lt;b&gt;rastreabilidade&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;5 - Separe os &lt;b&gt;testes funcionais&lt;/b&gt; de &lt;b&gt;testes operacionais&lt;/b&gt; e de &lt;b&gt;performance&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;6 - Estabeleça &lt;b&gt;frameworks para a melhoria contínua&lt;/b&gt; para o processo de testes;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;7 - Tenha &lt;b&gt;usuários de negócio envolvidos&lt;/b&gt; para identificar as regras-chave para o processo de descoberta de condições;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;8 - Use desenvolvimento de &lt;b&gt;scripts de testes e revisã&lt;/b&gt;&lt;b&gt;o&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;9 - Faça &lt;b&gt;testes de regressão&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;10 - &lt;b&gt;Automatize o rastreamento de problemas&lt;/b&gt; e outros itens que requerem um vínculo;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;11 - Use &lt;b&gt;ferramentas de workflow&lt;/b&gt; para construção de rastreamento e atividades de teste;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;12 - Estabeleça uma &lt;b&gt;abordagem de reporte&lt;/b&gt; que permita exportar para &lt;b&gt;dashboards de métricas &lt;/b&gt;voltadas&amp;nbsp;para os gerentes, certamente eles vão te cobrar isso!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;13 - Faça a &lt;b&gt;arquitetura de processos de testes e ambientes&lt;/b&gt; para existir durante &lt;b&gt;toda a vida da aplicação&lt;/b&gt;;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;14 - Desenvolva um &lt;b&gt;f&lt;/b&gt;&lt;b&gt;ramework para testes de regressão&lt;/b&gt; e construa &lt;b&gt;softwares de testes automatizados&lt;/b&gt;&amp;nbsp;que deixem claro o &lt;b&gt;Retorno Sobre Investimento&lt;/b&gt; do projeto, conhecido também, do inglês, ROI (Return On Investment);&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;15 - E por último, mas não menos importante: Rigorosamente, &lt;b&gt;organize os dados de teste&lt;/b&gt; e aplique &lt;b&gt;controle de versão&lt;/b&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;E então, como é implementado o processo de testes em seus projetos? Há algo semelhante com o comentado aqui? Você, profissional de qualidade, se preocupa com tais práticas? Você teria mais alguma boa prática para complementar este post?&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;É isso pessoal, espero que aproveitem as dicas.&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Por favor, não deixem de opinar sobre o que foi escrito! ;)&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;Um grande abraço e até o próximo artigo!&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-7362242733942133479?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/7362242733942133479/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/03/as-15-praticas-do-tester-altamente.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7362242733942133479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7362242733942133479'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/03/as-15-praticas-do-tester-altamente.html' title='15 Práticas Para Um Analista de Qualidade Altamente Eficaz'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/S7LRaPqUb2I/AAAAAAAAAFI/sZcY41Q0Oss/s72-c/testes_de_software.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-380583506884360289</id><published>2010-03-08T22:40:00.000-03:00</published><updated>2010-03-08T22:40:25.959-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura de Software'/><title type='text'>Capacidades da Arquitetura Ideal</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_vX7bwTP1U5E/S5WmgxZnqDI/AAAAAAAAAFA/Fu5Ag6a3AhM/s1600-h/capacidades_arquitetura.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="392" src="http://2.bp.blogspot.com/_vX7bwTP1U5E/S5WmgxZnqDI/AAAAAAAAAFA/Fu5Ag6a3AhM/s400/capacidades_arquitetura.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Gostaria de abordar hoje sobre as capacidades que uma arquitetura bem planejada deve contemplar para proporcionar bons índices de qualidade. Este tema se torna extremamente importante se olharmos sob a ótica de que a qualidade afeta diretamente a satisfação do cliente e envolvidos com o  sistema, sendo um ponto fundamental para o sucesso de um projeto de software. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Foram eleitas basicamente as seguintes 11 capacidades:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Disponibilidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É a capacidade do sistema se manter no ar para uso devido. Diz-se que o sistema possui alta disponibilidade quando se mantém disponível a maior parte do tempo. Quando se contrata serviços de infra-estrutura, geralmente é acorda um percentual de disponibilidade que tal infra deve garantir, podendo pagar multas caso não cumpra o acordo, são as chamadas SLA's de disponibilidade.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&lt;b&gt;Robustez&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É a característica pela qual se mede o nível de tolerância a falhas do sistema. O software deve ser capaz de prever situações inusitadas vindas de seus usuários e reagir com medidas que o mantenha estável, ou seja, sem apresentar falhas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Gerenciabilidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É a capacidade que mede o quão um sofware é configurável. A configuração dos níveis de logs gerados por um determinado software é um bom exemplo disso. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&lt;b&gt;Flexibilidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Característica inerente à maneira em como um determinado software se comporta à mudanças, tanto arquiteturais quanto funcionais. Por exemplo, se um software hoje acessa uma base de dados Oracle, diz-se que ele é flexível caso seja possível mudá-lo para acessar uma base de dados SQL Server sem que para isso sejam necessárias grandes alterações em seu código-fonte. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&lt;b&gt;Desempenho&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Esta característica está relacionada à utilização de recursos, como por exemplo, o tempo de processamento de uma grande quantidade de mensagens em uma fila JMS ou o tempo de processamento de uma consulta no banco de dados.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp;&lt;b&gt;Capacidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Se refere às limitações impostas ao sistema, com o que o sistema deve suportar. Por exemplo: um sistema deve suportar 500 acessos simultâneos. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Resiliência&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Este nome um tanto quanto "exótico" se refere ao grau de estabilidade do sistema mediante a picos de processamentos. Exemplo: um determinado sistema tem que suportar uma carga durante 3 horas e depois voltar ao seu estado normal sem sofrer quedas ou gerar defeitos. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Escalabilidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É a capacidade de um determinado sistema ser flexível a ponto de prever o seu crescimento, ou seja, possbilita o seu incremento de funcionalidade e capacidades sem se tornar obsoleto, acompanhando sempre as necessidades do usuário. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Extensibilidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É a capacidade que o sistema tem de crescer pela adição de novos componentes e que, muitas vezes, permita ao sistema fazer algo que ele já faz, mas de forma diferente. O polimorfismo em classes é um bom exemplo de extensibilidade em sistemas orientados a objetos, sendo possível através do uso de programação para interfaces e&amp;nbsp; nunca para classes com implementação concreta.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;&amp;nbsp;Reusabilidade&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Permite que um determinado sistema seja usado em contextos diferentes, ou então, que seus componentes sejam usados também em outras aplicações. Este tipo de reusabilidade de componentes facilita muito o desenvolvimento de aplicações corporativas, pois, proporciona uma maior facilidade de manutenção e ganho na produtividade do software.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Segurança&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;É a característica que permite avaliar o quanto um sistema é protegido, dadas as suas condições de exposição, contra ataques ou falhas internas ou externas que gerem inconsistências em suas informações ou outros tipos de defeitos, compromentendo a todas as outras capacidades aqui citadas.&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um bom sistema deve prover condições de segurança nos quisitos autenticidade,&amp;nbsp; confidencialidade,&amp;nbsp; integridade e disponibilidade.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&amp;nbsp; &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Fico por aqui pessoal. Para qualquer dúvida ou complemento das informações aqui postadas, não deixem de postar os seus comentários.&amp;nbsp;&amp;nbsp; ;)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um grande abraço e até o próximo post!&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-380583506884360289?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/380583506884360289/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/03/capacidades-da-arquitetura-ideal.html#comment-form' title='3 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/380583506884360289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/380583506884360289'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/03/capacidades-da-arquitetura-ideal.html' title='Capacidades da Arquitetura Ideal'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vX7bwTP1U5E/S5WmgxZnqDI/AAAAAAAAAFA/Fu5Ag6a3AhM/s72-c/capacidades_arquitetura.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-1102819175023360086</id><published>2010-02-22T01:13:00.000-03:00</published><updated>2010-02-22T01:24:55.030-03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação Distribuída com JEE'/><title type='text'>JEE 6 está bombando de novidades!</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_vX7bwTP1U5E/S4IDo4NanCI/AAAAAAAAAEw/1btzKc09e-U/s1600-h/explosion.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/_vX7bwTP1U5E/S4IDo4NanCI/AAAAAAAAAEw/1btzKc09e-U/s400/explosion.jpg" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;h4 style="text-align: justify;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial, Helvetica, sans-serif;"&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;   &lt;br /&gt;&lt;div class="MsoNormal" style="margin-bottom: 21.0pt; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;A especificação JEE foi finalizada em Dezembro de 2009, trazendo algumas características novas e outras atualizadas para o mundo do desenvolvimento de aplicações corporativas. Temos por exemplo, a introdução de um novo conceito: a abordagem por perfis (profile approach), que foca nas divisões por áreas de interesse entre os desenvolvedores de aplicação, sendo o Web Profile o primeiro profile definido pelo expert group, o qual objetiva fornecer o mínimo de esforço de configuração aos desenvolvedores de aplicação web típicas. O objetivo deste post é dar uma breve descrição das novidades que pesquisei e achei mais interessantes. Espero que gostem.&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Um pouco das principais novidades do web profile:&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Servlet 3.0:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Em frameworks web, os servlets são comumente utilizados como um ponto de entrada da aplicação para processar as requisicões, poderiamos dizer então que eles são o núcleo de aplicações web. A nova versão 3.0 (JSR-315) oferece características inovadoras, tais como as anotações pertinentes a esses tipos de classes, tal como a @Servlet, @ServletFilter e @ServletContextListener, permitindo ao desenvolvedor, criar a classe como se fosse um POJO, uma classe simples, que não se prende à implementação das interfaces como era requerido nas versões anteriores. Com isso também são fornecidas uma maior flexibilidade e extensibilidade, já que ao integrar a sua aplicação a um framework MVC, você não precisaria de configurações extras.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Integração entre XML's de configuração:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Arquivos xml dos frameworks agora podem vir dentro de seus próprios arquivos JAR, já que temos uma interessantíssima novidade aqui: o contêiner JEE6 também agora tem a responsabilidade de "unir" todos os arquivos que se referem a fragmentos web.&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Java Server Pages (JSP) na versão 2.2;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Expression Language (EL) também em sua versão 2.2;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Bibliotecas padrão para o JSP (JSTL) na sua versão 1.2;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Java Server Faces (JSF) na versão 2.0:&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Desde que a release do JSF 1.x saiu, o JSF foi apontado como um dos frameworks mais promissores do mercado. A sua fama entusiasmou desenvolvedores ao redor do mundo todo, fazendo com que fosse crescendo em inúmeras características agregadas, tais como componentização, validação, navegação, suporte à internacionalização (também conhecido como i18n) entre outras. No entanto, com todas essas características benéficas, algumas falhas e desvantagens foram ficando mais evidentes com o passar do tempo, tal como o quão é considerado complicado criar tarefas simples através da criação de componentes customizados. &amp;nbsp;A versão 2.0 vêm com o objetivo de remediar tais falhas facilitando o desenvolvimento e introduzindo novas características, tais como suporte a ajax integrado, os quais eram realizados apenas por implementações específicas e não propostas pela especificação&amp;nbsp;JSF em si.&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Algumas das grandes novas características do JSF 2.0:&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Composição de componentes&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Para implementar componentes customizados utilizando JSF 1.x era realmente uma tarefa nada simples. Você teria que implementar um componente visual (UI componente) e a classe tag, com a opção também de um Renderer para a marcação e então configurar tudo isso dentro do arquivo faces-config.xml e arquivos tld (Ufssss pausa pra retomar o ar!!!). JSF 2.0 simplica isso tudo através da abordagem de componentes compostos introduzidas com o Facelets.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Suporte integrado a Ajax&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Agora você pode utilizar-se dos poderes do ajax com toda sua API e infra-estrutura através das tags f:ajax sem se importar com a tecnologia em particular que está realizando essa implementação.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Manutenção de estado de objetos&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;JSF 2.0 vem com uma solução para manipular requisições particulares com classes tais como PartialViewContext e PartialStateHolder, fazendo o uso de mecanismos responsáveis por guardar o estado dos objetos manipulados nessas requisições parciais. Isto já havia sido implementado antes pelo uso do &lt;a href="http://myfaces.apache.org/trinidad/index.html"&gt;&lt;span style="color: #382076; text-decoration: none;"&gt;Apache Trinidad&lt;/span&gt;&lt;/a&gt;, porém, estas novas classes provêm uma maneira mais elegante de realizar tal manipulação. O objetivo é ter uma versão "leve" do estado salvo para ir e voltar nas navegações de páginas web.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Novos escopos&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Em adição ao escopo de página (page), requisição (request), sessão (session) e aplicação (application), JSF 2.0 também introduz os chamados escopos View e Flash. Os beans cujo escopo é de View têm um ciclo de vida que é maior que uma requisição, mas é menor que beans no escopo de sessão. Já os escopos Flash são como os escopos View que irão viver dentro de uma determinada view, incluindo redirecionamentos, e que serão removidos se você os estiver movendo para uma outra view.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Navegação&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;No JSF 1.x toda regra de navegação deveria ser adicionada ao facez-config.xml. Com a versão 2.0, navegações implícitas também podem ser usadas, no caso de uma saída retornada por um método do bean corresponder a um view id de mesmo nome. Agora também é possível se fazer navegações condicionais dentros das tags navigation-case através de marcações de expressões regulares dentro do face-config. A versão 2.0 também provê facilidades para requisições via método GET para os componentes h:link and h:button, suportando a integração de parâmetros na requisição. O benefício de se usar tais componentes é o de tornar suas páginas passíveis de serem adicionadas aos favoritos (bookmark).&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt; &lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;  &lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; tab-stops: 47.0pt 72.0pt; text-autospace: none;"&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;Configuração com Annotations&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;Você pode agora anotar seus beans com as novas anotações @ManagedBean e pode também &amp;nbsp; &amp;nbsp; &amp;nbsp; especificar o escopo do bean através das anotações @RequestScoped, @SessionScoped, @ViewScoped, @NoneScoped entre outras.&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Outras novidades:&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;-&lt;/b&gt;&lt;b&gt; Enterprise JavaBeans (EJB) 3.1 Lite;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;-&amp;nbsp;Java Transaction API (JTA) 1.1;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Java Persistence API (JPA) 2.0;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Na minha opinião, as principais características desta release são a nova API para queries criteria e o suporte à validações.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Contexts and Dependency Injection (CDI)&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Em atendimento à Java Specification Request &lt;/span&gt;&lt;a href="http://jcp.org/en/jsr/summary?id=299"&gt;&lt;span style="color: #0329e5; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;JSR-299&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;, o propósito desta especificação é unir o modelo de componentes do JSF Managed-Beans com o modelo de componentes EJB, proporcionando um modelo de fácil implementação para aplicações web. CDI também torna possível para outros componentes JEE interagirem uns com os outros usando o design pattern Observer. Isto nos facilita, por exemplo, integrar enterprise beans com suporte transacional, através do lançamento de eventos de um para o outro.&amp;nbsp;&lt;/span&gt;&lt;a href="http://jcp.org/en/jsr/summary?id=330"&gt;&lt;span style="color: #0028e5; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;JSR 330&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&amp;nbsp;também se tornou parte do JEE 6, oferecendo um conjunto de anotações padrão que podem ser usadas para a injeção de dependência, como por exemplo, as @Named, @Inject, @Qualifier entre outras. A WELD é a implementação de referência para o CDI.&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;- Bean Validation and Hibernate Validator&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;A Bean Validation, &lt;/span&gt;&lt;a href="http://jcp.org/en/jsr/detail?id=303"&gt;&lt;span style="color: #0329e5; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;JSR 303&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;, define uma modelo de metadados e uma API para validação de beans. Sua implementação de referência é a Hibernate Validator que, em sua última versão, adiciona alguns recursos legais, tais como agrupamento de validações, integração nativa com JPA 2 e JSF 2, além de um conjunto de anotações novas.&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;É isso aí pessoal, isso aqui foi só uma palinha do que de mais novo está acontecendo dentro das implementações corporativas Java, e como vocês puderam notar, JEE 6 vem bombando de novidades que aparentemente demonstram o quanto esta arquitetura vêm evoluindo em uma tendência a padronizar o que já vem sendo escrito por diversos frameworks: abordagem que exigem menos configurações e alto nível de acoplamento automático de implementações independentes. Na &lt;/span&gt;&lt;a href="http://java.sun.com/javaee/technologies/"&gt;&lt;span style="color: #382076; text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;página da Sun&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt; vocês podem conferir a lista completa.&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Agora é só esperarmos a comunidade java agitar com seus primeiros projetos para que a quantidade de exemplos e tutoriais aumentem!&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;E vocês, podem citar outras importantes novidades do JEE 6?&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;Um grande abraço e até o próximo post! ;)&lt;/span&gt;&lt;/span&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm; mso-layout-grid-align: none; mso-pagination: none; text-align: justify; text-autospace: none;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="MsoNormal"&gt;&lt;span lang="EN-US" style="font-family: Arial; position: relative; top: -3pt;"&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 10pt; position: relative; top: -3pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-1102819175023360086?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/1102819175023360086/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/02/jee-6-esta-bombando-de-novidades.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/1102819175023360086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/1102819175023360086'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/02/jee-6-esta-bombando-de-novidades.html' title='JEE 6 está bombando de novidades!'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vX7bwTP1U5E/S4IDo4NanCI/AAAAAAAAAEw/1btzKc09e-U/s72-c/explosion.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-1991811893418458992</id><published>2010-01-29T00:09:00.000-02:00</published><updated>2010-01-29T09:12:30.052-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação Orientada a Objetos'/><title type='text'>Surgimento da Orientação a Objetos</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_vX7bwTP1U5E/S2JMzO3QhfI/AAAAAAAAAEM/OzR_lDBgw_o/s1600-h/origem_oo.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 197px;" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/S2JMzO3QhfI/AAAAAAAAAEM/OzR_lDBgw_o/s400/origem_oo.png" alt="" id="BLOGGER_PHOTO_ID_5431988543609144818" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238);"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Hoje tive uma aula sobre Análise e Projeto OO com UML, como sou um entusiasta do assunto, procurei exprimir as idéias abordadas complementando com algumas leituras adicionais e, navegando por alguns sites relacionados com o assunto, encontrei um post interessantíssimo no blog da &lt;/span&gt;&lt;a href="http://www.webgoal.com.br/desenvolvimento/origem-da-orientacao-a-objetos"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Webgoal&lt;/span&gt;&lt;/a&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;span style="text-decoration: underline;"&gt;.&lt;/span&gt; Darei então uma breve explanação da origem histórica do paradigma de orientação a objetos conforme explicado no blog citado e em sala de aula, seguido de algumas lições aprendidas e do meu ponto de vista. Vamos então ao que interessa!&lt;br /&gt;&lt;br /&gt;A orientação a objetos tem sua origem nos anos 60 na Noruega, com Kristen Nygaard e Ole-Johan Dahl, no Centro Norueguês de Computação. Através da linguagem Simula 67, foram introduzidos os conceitos de classe e herança.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;A orientação a objetos foi mais bem conceituada no laboratório da Xerox, em Palo Alto, sendo refinada numa seqüência de protótipos da linguagem Smalltalk. O líder desse projeto foi Alan Curtis Kay, considerado um dos criadores do termo “programação orientada a objetos”.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Alan Kay começou a programar em Simula depois de conhecer um inovador programa chamado Sketchpad. Sketchpad foi um editor gráfico desenvolvido por Ivan Sutherland, no MIT, em 1963. É considerado um marco na informática, sendo o primeiro editor gráfico orientado a objetos. Era possível colocar bits coloridos no canvas, mas também criar objetos que poderiam ser manipulados distintamente uns dos outros. O Sketchpad permitia que fosse definido um “master drawing“, a partir do qual seriam criadas “instance drawing” (herança).&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Este paradigma tão utilizado atualmente surgiu na tentativa de solucionar problemas existentes no desenvolvimento softwares complexos e confiáveis com baixo custo de desenvolvimento e manutenção. A necessidade da época demandava por uma solução de nível de abstração de programação que se aproximasse mais do mundo real, com modelos e conceitos representativos. Chegou-se então à conclusão (ou abstração) de que &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;o mundo real é formado por objetos que interagem entre si&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;.&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Outra conclusão importante que justifica o uso do paradigma da orientação a objetos é que &lt;/span&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;r&lt;/span&gt;&lt;/b&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;epresentar esses objetos em um software é mais natural e permanente do que representar a sua funcionalidade (decomposição funcional), pois esta é mutável.&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Logo, conclui-se que, se as abstrações não tiverem uma expressão direta (ou próxima) do mundo computacional, a complexidade da solução seria aumentada e não teriamos a nossa tão conhecida facilidade de desenvolvimento e manutenção em linguagens de alto nível (como Java ou .NET, por exemplo).&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;Ficamos por aqui pessoal. Um grande abraço e até o próximo post! ;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;b&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="font-family:Tahoma,serif;"&gt;&lt;span class="Apple-style-span"  style="font-size:small;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-1991811893418458992?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/1991811893418458992/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/surgimento-da-orientacao-objetos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/1991811893418458992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/1991811893418458992'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/surgimento-da-orientacao-objetos.html' title='Surgimento da Orientação a Objetos'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/S2JMzO3QhfI/AAAAAAAAAEM/OzR_lDBgw_o/s72-c/origem_oo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-5261597636278852335</id><published>2010-01-19T23:33:00.000-02:00</published><updated>2010-01-21T16:35:32.438-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Arquitetura de Software'/><title type='text'>Arquitetura de Software</title><content type='html'>&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_vX7bwTP1U5E/S1Zr7ZNnnAI/AAAAAAAAADs/xVKtkxShHJs/s1600-h/diagrama_deployment.jpg" style="text-decoration: none;"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 153px;" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/S1Zr7ZNnnAI/AAAAAAAAADs/xVKtkxShHJs/s400/diagrama_deployment.jpg" border="0" alt="" id="BLOGGER_PHOTO_ID_5428645068966173698" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;span class="Apple-style-span" style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A arquitetura de software é um assunto largamente discutido nos dias de hoje, principalmente pelo fato de o mesmo ser uma das principais causas de insucesso nos projetos de software (mais especificamente sendo considerada como a segunda maior causa de insucesso, logo depois da definição de requisitos). Logo, uma arquitetura consistente e bem definida se torna fundamental para que o projeto seja implementado eficientemente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Arquitetura de software nada mais é que a definição de uma representação abstrata de comportamentos e componentes do sistema. Se um programador disser, por exemplo, que para implementar uma determinada funcionalidade ele precisará criar uma interface gráfica com uma extensão X que envia requisições através de um protocolo Y para um determinado componente ou recurso W que acessa o componente de integração ao banco de dados Z, ele estará descrevendo a arquitetura utilizada por seu sistema. Repare que isto tem muito a ver com o &lt;b&gt;estilo&lt;/b&gt; de desenvolvimento utilizado.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Existem algumas classificações de arquitetura, como por exemplo as que irei detalhar aqui, a &lt;b&gt;arquitetura de referência&lt;/b&gt; e a &lt;b&gt;arquitetura de distribuição&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Arquitetura de Referência&lt;/b&gt;: é um tipo de arquitetura que possui uma terminologia unificada, com a definição consistente de padrões de componentes e seus respectivos papéis/responsabilidades. Possui como principais características o fornecimento de flexibilidade e contém um conjunto consistente das melhores práticas de mercado muitas vezes provenientes da consolidação de funcionalidades amplamente utilizadas para resolver um determinado problema em um contexto específico.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Exemplos desta arquitetura: &lt;b&gt;JEE, SOA e JME&lt;/b&gt;.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;Arquitetura de Distribuição&lt;/b&gt;: é mais relacionada com topologia de servidores e componentização, porém não significa necessariamente que a aplicação necessite estar separada fisicamente, mas ela deve permitir que isso aconteça caso essa separação seja necessária um dia. Por exemplo, se uma aplicação roda hoje em um único servidor no qual estão instalados o contâiner web e um servidor de e-mails ao qual esta aplicação web acessa, nada impedirá de um dia separarmos estes dois recursos em dois servidores físicos e um continue acessando o outro normalmente.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Uma arquitetura pode ser representada também por um mapa de camadas, como temos, por exemplo, representado pelo tão utilizado &lt;b&gt;&lt;a href="http://java.sun.com/blueprints/patterns/MVC.html"&gt;MVC&lt;/a&gt;&lt;/b&gt;. Uma outra boa representação, ainda mais detalhada, pode ser representado pelas seguintes 5 camadas:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;b&gt;CLIENTE | APRESENTAÇÃO | NEGÓCIOS | INTEGRAÇÃO | RECURSOS&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;O cliente pode ser representado por uma Applet ou uma página HTML, ou seja, é o que é gerado para a exibição ao usuário final. &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A apresentação seria o processo de geração da página do cliente e a nossa camada de controle (ou o &lt;b&gt;controller&lt;/b&gt; do MVC), o qual interage com a camada de visão.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A camada de negócios representa toda a implementação efetiva do negócio ao qual o sistema deve atender (as regras do sistema) e a estrutura de representação das entidades no qual o sistema manipula.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;A camada de integração é onde estão os componentes que acessam os recursos externos à aplicação, como por exemplo, uma API &lt;a href="http://java.sun.com/javase/technologies/database/"&gt;JDBC&lt;/a&gt; para acesso a banco de dados.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;E finalmente, a camada de recursos pode representar, por exemplo, arquivos XML, bases de dados, sistemas mainframe, servidores de e-mail, enfim, tudo o que representa interações externas ao qual o sistema depende para executar uma determinada funcionalidade.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bom, é isto pessoal, espero ter desmistificado alguns conceitos básicos sobre a Arquitetura de Software. O próximo tema abordado tratará a respeito das capacidades de uma arquitetura.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-5261597636278852335?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/5261597636278852335/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/arquitetura-de-software.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/5261597636278852335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/5261597636278852335'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/arquitetura-de-software.html' title='Arquitetura de Software'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/S1Zr7ZNnnAI/AAAAAAAAADs/xVKtkxShHJs/s72-c/diagrama_deployment.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-1986287616790307219</id><published>2010-01-02T18:02:00.000-02:00</published><updated>2010-01-31T12:28:07.494-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programação Distribuída com JEE'/><title type='text'>Implementando valueChangeListener com JSF</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Olá pessoal, hoje eu irei compartilhar com vocês uma experiência que tive trabalhando em um projeto, no qual tive que implementar um comportamento de “onchange” em um componente selectOneMenu do JSF 1.2. A princípio a implementação me parecia fácil e bem sugestiva, no entanto, após alguns testes pude perceber que uma “cilada” estaria me surpreendendo: o evento por trás do atributo “valueChangeListener” não executa como esperado! &lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tal problema me exigiu alguns esforços para se chegar a uma solução plausível. Creio que este tipo de implementação gere dúvidas também há muitos outros desenvolvedores e, portanto, seguem alguns esclarecimentos:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Tentarei ilustrar o problema com um exemplo de um selectOneMenu que realiza a listagem de carros de acordo com a marca selecionada:&lt;/div&gt;&lt;pre style="font-style: italic;"&gt;&lt;a href="http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-1bjstXKI/AAAAAAAAADc/f2GLq6OejJM/s1600-h/jsf_1.bmp" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5422251961421225122" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-1bjstXKI/AAAAAAAAADc/f2GLq6OejJM/s400/jsf_1.bmp" style="cursor: pointer; display: block; height: 53px; margin: 0px auto 10px; text-align: center; width: 400px;" /&gt;&lt;/a&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;Bom, o primeiro entrave encontrado foi em relação à submissão do formulário: ela não é realizada na alteração da selectOneMenu sem que coloquemos o “onchange=’submit()’” explicitamente! &lt;/div&gt;&lt;div style="text-align: justify;"&gt;À primeira vista o código acima parece então sugerir que, ao se alterar uma opção do selectOneMenu, o método declarado no atributo valueChangeListener será invocado. Ah, eis a cilada! &lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Neste momento, você pode estar me perguntando: mas por que não funcionaria? Eis o segredo: simplesmente porque o método declarado no valueChangeListener é chamado ANTES dos métodos setters do managed-bean serem chamados! Isso implica que, qualquer alteração que você realize nas variáveis no seu método em valueChangeListener seriam sobreescritas quando os setters fossem chamados. E se caso tentassemos pular essas chamadas aos métodos setters invocando “FacesContext.getCurrentInstace.renderResponse()” no método valueChangeListener, simplesmente estariamos pulando também as chamadas aos getters, o que impediria da mesma maneira de exibirmos os valores atualizados na nossa view. Então o que fazer?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Ok, para solucionar nós temos 3 soluções básicas:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;1 – Podemos forçar o JSF a recriar a view:&lt;/div&gt;&lt;pre class="java" style="font-family: monospace;"&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;FacesContext context = FacesContext.getCurrentInstance();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;// Redireciona para a pagina a mesma página.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;context.getApplication().getNavigationHandler().handleNavigation(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;    context, null, "listarCarros")&lt;/span&gt;&lt;span style="color: #339933;"&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;E no arquivo faces-config.xml:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://2.bp.blogspot.com/_vX7bwTP1U5E/Sz-0sISgUzI/AAAAAAAAADU/ZVd5i8jFNLo/s1600-h/jsf_2.bmp" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5422251146609709874" src="http://2.bp.blogspot.com/_vX7bwTP1U5E/Sz-0sISgUzI/AAAAAAAAADU/ZVd5i8jFNLo/s400/jsf_2.bmp" style="cursor: pointer; display: block; height: 88px; margin: 0px auto 10px; text-align: center; width: 455px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;2 – Podemos mover o ciclo de vida do JSF à fase de atualização do modelo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;public void listarCarrosMarcaSelecionada(ValueChangeEvent event)&lt;/span&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;  // busca dos carros aqui...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;  ...&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;  PhaseId phaseId = event.getPhaseId();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;  if (phaseId.equals(PhaseId.ANY_PHASE))&lt;/span&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;      event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;      event.queue();&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;  }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div style="text-align: justify;"&gt;3 – Podemos criar nosso próprio UIComponent no managed-bean usando “binding” e do método valueChangeListener poderiamos alterá-lo invocando o método “setMethod()”, pois, quando alteramos um UIComponent diretamente, o JSF automaticamente invoca os métodos getters para a atualização da view. Mas ainda sim teriamos que concluir o método invocando “&lt;span style="color: #006600; font-style: italic; font-weight: bold;"&gt;FacesContext.getCurrentInstance().renderResponse()&lt;/span&gt;” para forçar a nova renderização.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Para o projeto em que estou, a primeira alternativa foi a adotada pois me pareceu a mais simples e no momento atenderia ao meu propósito. Existem também algumas soluções utilizando ajax, como por exemplo com a implementação do &lt;a href="http://www.jboss.org/file-access/default/members/jbossajax4jsf/freezone/docs/tlddoc/index.html"&gt;Ajax4JSF&lt;/a&gt; que também se mostram interessantes, mas eu não poderia utilizar devido a alguns motivos particulares do projeto.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Bom, então é isso pessoal, ficam aqui as dicas. Espero ter ajudado. Até a próxima! &lt;/div&gt;&lt;pre class="java" face="monospace"&gt;.&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-1986287616790307219?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/1986287616790307219/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/implementando-valuechangelistener-com.html#comment-form' title='7 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/1986287616790307219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/1986287616790307219'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/implementando-valuechangelistener-com.html' title='Implementando valueChangeListener com JSF'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-1bjstXKI/AAAAAAAAADc/f2GLq6OejJM/s72-c/jsf_1.bmp' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-7358753570603733506</id><published>2010-01-02T17:24:00.000-02:00</published><updated>2010-01-21T16:57:37.113-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fundamentos da Engenharia de Software'/><title type='text'>Processo e Modelo de Processo</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-hJxokidI/AAAAAAAAAC8/7y6tektlJgk/s1600-h/processo.gif"&gt;&lt;img style="text-align: justify;margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; display: block; cursor: pointer; width: 320px; height: 178px; " src="http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-hJxokidI/AAAAAAAAAC8/7y6tektlJgk/s320/processo.gif" alt="" id="BLOGGER_PHOTO_ID_5422229665691765202" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Olá pessoal, hoje abordarei a diferença entre um modelo de processo de software e um processo de software. Exemplificarei também, dois modos pelos quais um modelo de processo de software pode ser útil para identificar possíveis aprimoramentos no processo.&lt;br /&gt;&lt;br /&gt;Um &lt;span style="font-weight: bold;"&gt;processo de software&lt;/span&gt; é o que define quais &lt;span style="font-weight: bold;"&gt;atividades &lt;/span&gt;devem ser realizadas dentro de uma produção de sistemas, define também &lt;span style="font-weight: bold;"&gt;as pessoas envolvidas&lt;/span&gt; e os a&lt;span style="font-weight: bold;"&gt;rtefatos a serem gerados&lt;/span&gt;. Já o &lt;span style="font-weight: bold;"&gt;modelo de processo de software&lt;/span&gt; define a &lt;span style="font-weight: bold;"&gt;sequência&lt;/span&gt; com que as atividades são executadas e quais as pessoas estão envolvidas e &lt;span style="font-weight: bold;"&gt;quais os artefatos&lt;/span&gt; são gerados por cada atividade.&lt;br /&gt;&lt;br /&gt;Um processo de software normalmente é dividido em vários processos menores para se melhor organizar a produção de software. Existem algumas abordagens ou ferramentas sugeridas pela engenharia de software que, à partir delas, é possível se identifcar a acurácia de um modelo de processo de software, e assim se sugerir as possíveis melhorias.&lt;br /&gt;&lt;br /&gt;Sugestões de aprimoramento à partir de um modelo podem ser encontradas quando o mesmo é expresso na forma de &lt;span style="font-weight: bold;"&gt;"papel/ação"&lt;/span&gt;, por exemplo, porque assim é viável &lt;span style="font-weight: bold;"&gt;identificar se os papéis estão bem distribuídos&lt;/span&gt; por recursos humanos do projeto. Podem ser identificados também no modelo de &lt;span style="font-weight: bold;"&gt;fluxo de dados&lt;/span&gt;, uma outra abordagem na qual observamos se as &lt;span style="font-weight: bold;"&gt;transformações nos artefatos&lt;/span&gt; estão gerando a &lt;span style="font-weight: bold;"&gt;evolução desejada&lt;/span&gt; ao produto final.&lt;br /&gt;&lt;br /&gt;Bom, é isso pessoal. Fiquem à vontade para comentar a respeito. Concluo este post com a seguinte frase aprendida: &lt;span style="font-style: italic; font-weight: bold;"&gt;é em tempos de  crise que encontramos as melhores oportunidades de rever nosso processo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um grande abraço e até o próximo post! ;)&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-7358753570603733506?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/7358753570603733506/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/processo-e-modelo-de-processo.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7358753570603733506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7358753570603733506'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/processo-e-modelo-de-processo.html' title='Processo e Modelo de Processo'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-hJxokidI/AAAAAAAAAC8/7y6tektlJgk/s72-c/processo.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-4696379751544234393</id><published>2010-01-02T16:44:00.000-02:00</published><updated>2010-01-21T16:57:47.640-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fundamentos da Engenharia de Software'/><title type='text'>Os 4 Grande Atributos dos Produtos de Software</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-cYs5V3vI/AAAAAAAAAC0/tFvEG3HWiWw/s1600-h/usabilidade.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 111px;" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-cYs5V3vI/AAAAAAAAAC0/tFvEG3HWiWw/s320/usabilidade.gif" alt="" id="BLOGGER_PHOTO_ID_5422224424559828722" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;O tópico de hoje aborda os quatro principais atributos que todos os produtos de software devem possuir. Sem tais atributos, não podemos afirmar que o software seja de qualidade.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Estamos falando de &lt;span style="font-weight: bold;"&gt;Facilidade de Manutenção (Manutenibilidade)&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Confiança&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Eficiência &lt;/span&gt;e &lt;span style="font-weight: bold;"&gt;Usabilidade&lt;/span&gt;. Segue abaixo o conceito de cada um dos atributos segundo o estudioso Ian Sommerville:&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;span style="font-weight: bold;"&gt;Manutenibilidade&lt;/span&gt;: O software deve ser escrito de modo que possa evoluir para atender às necessidades de mudança dos clientes. É um atributo fundamental, pois a mudança de software é uma consequência inevitável de um ambiente de negócios em constante mutação;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;span style="font-weight: bold;"&gt;Confiança&lt;/span&gt;: O nível de confiança de um software tem uma série de características, incluindo confiabilidade, proteção e segurança. Um software confiável não deve causar danos físicos ou econômicos no caso de falha no sistema.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;span style="font-weight: bold;"&gt;Eficiência&lt;/span&gt;: O software não deve disperdiçar os recursos do sistema, como memória e ciclos do processador. Portanto, a eficiência inclui tempo de resposta, tempo de processamento, utilização de memória e etc;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;- &lt;span style="font-weight: bold;"&gt;Usabilidade&lt;/span&gt;: O software deve ser usável, sem esforço excessivo, pelo tipo de usuário para o qual ele foi projetado. Isso significa que ele deve apresentar uma interface com o usuário e documentação adequadas.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Complementando com algumas outras características, sugiro também a &lt;span style="font-weight: bold;"&gt;Portabilidade&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Rastreabilidade&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;Facilidade de Integração a Outros Sistemas&lt;/span&gt; e &lt;span style="font-weight: bold;"&gt;Aderência às Necessidades de Negócio&lt;/span&gt; (muito importante!). E vocês, podem sugerir mais alguns?&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;Um grande abraço a todos e até o próximo post! ;)&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: justify;"&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-4696379751544234393?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/4696379751544234393/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/os-4-grande-atributos-dos-produtos-de.html#comment-form' title='2 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/4696379751544234393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/4696379751544234393'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/os-4-grande-atributos-dos-produtos-de.html' title='Os 4 Grande Atributos dos Produtos de Software'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/Sz-cYs5V3vI/AAAAAAAAAC0/tFvEG3HWiWw/s72-c/usabilidade.gif' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-7120107024904716518</id><published>2010-01-02T16:29:00.000-02:00</published><updated>2010-01-21T16:58:05.654-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fundamentos da Engenharia de Software'/><title type='text'>Software Genérico X Software Por Encomenda</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_vX7bwTP1U5E/Sz-TuywFI5I/AAAAAAAAACk/cNTntaKGW14/s1600-h/erp_modules.gif"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 182px;" src="http://2.bp.blogspot.com/_vX7bwTP1U5E/Sz-TuywFI5I/AAAAAAAAACk/cNTntaKGW14/s320/erp_modules.gif" alt="" id="BLOGGER_PHOTO_ID_5422214908484068242" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Hoje gostaria de comentar e esclarecer os principais conceitos do que diferenciam o desenvolvimento de produto genérico de software e o desenvolvimento de software sob encomenda e refletir um pouco sobre o rumo ao qual estes conceitos estão tomando, evidenciando a proximidade entre ambos.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Produtos genéricos&lt;/span&gt;, ou produtos de caixinha como muitas vezes são conhecidos,  são produzidos por uma organização de desenvolvimento e &lt;span style="font-weight: bold;"&gt;distribuídos&lt;/span&gt; no mercado &lt;span style="font-weight: bold;"&gt;a quem quiser comprá-los&lt;/span&gt;. Já os&lt;span style="font-weight: bold;"&gt; sistemas sob encomenda&lt;/span&gt; são vendidos a um &lt;span style="font-weight: bold;"&gt;cliente específico&lt;/span&gt; e é desenvolvido sob a ótica da &lt;span style="font-weight: bold;"&gt;necessidade de negócio&lt;/span&gt; desse cliente.&lt;br /&gt;&lt;br /&gt;A diferença entre os dois está, a cada dia que passa, se tornando mais tênue, já que os sistemas genéricos estão sendo frequentemente customizados por seus compradores. Um forte exemplo disso são os sistemas &lt;a href="http://pt.wikipedia.org/wiki/ERP"&gt;ERP (Enterprise Resource Planning) &lt;/a&gt;: que empresa hoje não o usa de maneira customizada?&lt;br /&gt;&lt;br /&gt;Um grande abraço a todos e até o próximo post! ;)&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-7120107024904716518?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/7120107024904716518/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/software-generico-x-software-por.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7120107024904716518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/7120107024904716518'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/software-generico-x-software-por.html' title='Software Genérico X Software Por Encomenda'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_vX7bwTP1U5E/Sz-TuywFI5I/AAAAAAAAACk/cNTntaKGW14/s72-c/erp_modules.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-3779287341148987492</id><published>2010-01-02T16:18:00.000-02:00</published><updated>2010-01-21T16:58:17.064-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fundamentos da Engenharia de Software'/><title type='text'>Por que o software é mais que um programa executável?</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_vX7bwTP1U5E/Sz-QUMzhATI/AAAAAAAAACE/AlrMeEgoESM/s1600-h/software.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 320px; height: 320px;" src="http://3.bp.blogspot.com/_vX7bwTP1U5E/Sz-QUMzhATI/AAAAAAAAACE/AlrMeEgoESM/s320/software.jpg" alt="" id="BLOGGER_PHOTO_ID_5422211153086447922" border="0" /&gt;&lt;/a&gt;&lt;div style="text-align: justify;"&gt;Os programas de software são mais do que os softwares executados pelos usuários porque para a sua produção são envolvidas diversas atrividades intrínsecas ao tipo de software desenvolvido.&lt;/div&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Nos sistemas em que é utilizada uma abordagem cascata, por exemplo, as atividades são distintas e bem definidas e os seus custos são medidos separadamente e as atividades de teste e integração são mais caras. Na abordagem iterativa as mesmas atividades são realizadas mas em paralelo com a atividade de desenvolvimento. Já na abordagem por componentes os maiores custos se baseiam na integração e testes.&lt;br /&gt;&lt;br /&gt;Portanto, o software é muito mais do que o produto executado pelo usuário final em termos de custo, já que muitas outras atividades e pessoas são necessárias para que se chegue ao produto.&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-3779287341148987492?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/3779287341148987492/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/por-que-o-software-e-mais-que-um.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/3779287341148987492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/3779287341148987492'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2010/01/por-que-o-software-e-mais-que-um.html' title='Por que o software é mais que um programa executável?'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_vX7bwTP1U5E/Sz-QUMzhATI/AAAAAAAAACE/AlrMeEgoESM/s72-c/software.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-41979251906877907</id><published>2009-12-29T14:12:00.000-02:00</published><updated>2010-01-29T13:40:27.547-02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fundamentos da Engenharia de Software'/><title type='text'>Afinal, o que é Engenharia de Software?</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/_vX7bwTP1U5E/Szo-iWCbHfI/AAAAAAAAABs/pww3ijZszMg/s1600-h/engenharia_sw.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5420713861246033394" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/Szo-iWCbHfI/AAAAAAAAABs/pww3ijZszMg/s320/engenharia_sw.jpg" style="cursor: pointer; display: block; height: 246px; margin: 0px auto 10px; text-align: center; width: 320px;" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Existem atualmente inúmeras definições para a Engenharia de Software, sendo que todas elas convergem para o mesmo ponto de vista, explicado algumas vezes, com maior ou menor riqueza de detalhes. Ao longo deste artigo objetivei detalhar as que julguei mais interessantes.&lt;br /&gt;&lt;br /&gt;Segundo a definição oficial do &lt;a class="mw-redirect" href="http://www.ieee.org/" title="IEEE"&gt;IEEE&lt;/a&gt;  (Instituto de Engenheiros Eletricistas e Eletrônicos), conforme a &lt;span style="font-style: italic;"&gt;Computer Society&lt;/span&gt;, seu subgrupo destinado a questões ligadas aos computadores, a Engenharia de Software baseia-se no &lt;span style="font-weight: bold;"&gt;estudo e aplicação&lt;/span&gt; de uma &lt;span style="font-weight: bold;"&gt;abordagem sistemática&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;disciplinada &lt;/span&gt;e &lt;span style="font-weight: bold;"&gt;quantificável &lt;/span&gt;para o desenvolvimento, operação e manutenção de software.&lt;br /&gt;&lt;br /&gt;Mas vamos voltar um pouco mais no tempo, mais específicamente na conferência que idealizou a criação da Engenharia de Software, patrocinada pelo comitê de ciências da NATO em 1968,  para buscarmos uma outra definição bastante interessante. Fritz Bauer propôs o seguinte enfoque para as atividades de desenvolvimento de software: &lt;span style="font-style: italic; font-weight: bold;"&gt;"A criação de sólidos princípios de engenharia afim de obter software de maneira econômica, que seja confiável e que trabalhe eficientemente em máquinas reais"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Segundo a definição também de um dos maiores estudiosos da Engenharia de Software, Ian Sommerville, a Engenharia de Software &lt;span style="font-weight: bold;"&gt;é uma disciplina de engenharia&lt;/span&gt; relacionada com &lt;span style="font-weight: bold;"&gt;todos os aspectos de produção de software&lt;/span&gt;, desde os estágios iniciais de especificação do sistema até a sua manutenção, ou seja, mesmo depois que este entrar em operação.&lt;br /&gt;&lt;br /&gt;Portanto, a Engenharia de Software atua em um papel primordial dentro dos ciclos de vida do projeto e do produto de software, que é o de dar uma maior qualidade e produtividade ao software, baseando-se nos estudos e padrões de engenharia mais recomendados pela área de desenvolvimento de software.&lt;br /&gt;&lt;br /&gt;Bom pessoal, é isso! Fiquem à vontade para postar novas definições que acharem interessantes. ;)&lt;br /&gt;&lt;br /&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-41979251906877907?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/41979251906877907/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2009/12/afinal-o-que-e-engenharia-de-software.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/41979251906877907'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/41979251906877907'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2009/12/afinal-o-que-e-engenharia-de-software.html' title='Afinal, o que é Engenharia de Software?'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/Szo-iWCbHfI/AAAAAAAAABs/pww3ijZszMg/s72-c/engenharia_sw.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5722644123640725689.post-4460115207041562608</id><published>2009-12-28T13:34:00.000-02:00</published><updated>2010-01-21T16:58:48.228-02:00</updated><title type='text'>Iniciando...</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_vX7bwTP1U5E/Szo9fsweW0I/AAAAAAAAABc/HHJCZ_yBvSo/s1600-h/iniciando.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 250px; height: 240px;" src="http://1.bp.blogspot.com/_vX7bwTP1U5E/Szo9fsweW0I/AAAAAAAAABc/HHJCZ_yBvSo/s320/iniciando.jpg" alt="" id="BLOGGER_PHOTO_ID_5420712716293528386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Olá! Sejam bem-vindos ao blog do portal de Engenharia de Software! Gostaria de exprimir em poucas palavras, a intenção e motivação da criação deste blog.&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;br /&gt;Estou cursando o curso de pós-graduação em Engenharia de Software no ITA (Instituto Tecnológico da Aeronáutica) e gostaria de compartilhar os valiosos e imensuráveis conhecimentos que estou adquirindo e outros que ainda irei adquirir ao longo do curso. Espero compartilhar com vocês, toda a minha jornada trilhada neste curso.&lt;br /&gt;&lt;br /&gt;Espero sinceramente também, que vocês apreciem este "pequeno portal" da disseminação do conhecimento em Engenharia de Software, utilizando-o como uma ferramenta em que todos nós, profissionais da área de desenvolvimento de software, possamos aprender uns com os outros.&lt;br /&gt;&lt;br /&gt;Postarei aqui, artigos de minha autoria, sem definições muito rebuscadas, mas ao mesmo tempo, sem deixar de apreciar o conhecimento dos maiores estudiosos da área.&lt;br /&gt;&lt;br /&gt;Desde já agradeço a todos os leitores pelas visitas e comentários deixados nos artigos. Vamos contribuir para a disseminação desta área de conhecimento tão importante para a produção de software!&lt;br /&gt;&lt;br /&gt;Um grande abraço e feliz 2010! Com muita Engenharia de Software!&lt;br /&gt;&lt;br /&gt;.&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;http://portalengenhariadesoftware.blogspot.com&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5722644123640725689-4460115207041562608?l=portalengenhariadesoftware.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://portalengenhariadesoftware.blogspot.com/feeds/4460115207041562608/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2009/12/iniciando.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/4460115207041562608'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5722644123640725689/posts/default/4460115207041562608'/><link rel='alternate' type='text/html' href='http://portalengenhariadesoftware.blogspot.com/2009/12/iniciando.html' title='Iniciando...'/><author><name>Eduardo</name><uri>http://www.blogger.com/profile/13950802314132727307</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://4.bp.blogspot.com/-b4NZ6GKEwpY/TX0OF9ydCkI/AAAAAAAAAKs/3DEFlO9FUMM/s220/eu.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_vX7bwTP1U5E/Szo9fsweW0I/AAAAAAAAABc/HHJCZ_yBvSo/s72-c/iniciando.jpg' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
