<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Nelson Bassetto</title>
	<atom:link href="http://nelsonbassetto.com/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://nelsonbassetto.com/blog</link>
	<description>Arquitetura, Design e Desenvolvimento de Sistemas</description>
	<lastBuildDate>Fri, 16 Dec 2011 00:04:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>RDD &#8211; Responsibility Driven Design e GRASP &#8211; General Responsibility Assignment Software Principles (2 de 2)</title>
		<link>http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-2-de-2/</link>
		<comments>http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-2-de-2/#comments</comments>
		<pubDate>Fri, 16 Dec 2011 00:04:55 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Leitura Recomendada]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[GRASP]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[RDD]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-2-de-2/</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>Neste artigo veremos os demais padrões GRASP não abordados no anterior. São eles:</p>
<p>Controller &#8211; Determina que deve haver uma classe ou camada responsável por receber e tratar eventos da camada de interface com o usuário, delegando as ações para as camadas inferiores, de forma que ela funcione como intermediadora. O padrão também diz que pode [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>Neste artigo veremos os demais padrões GRASP não abordados no anterior. São eles:</p>
<p><b>Controller</b> &#8211; Determina que deve haver uma classe ou camada responsável por receber e tratar eventos da camada de interface com o usuário, delegando as ações para as camadas inferiores, de forma que ela funcione como intermediadora. O padrão também diz que pode ser criada uma controller para cada caso de uso. Ou seja, as funcionalidades providas pela interface, que dizem respeito a determinados casos de uso são delegadas para as controllers correspondentes. O objetivo com a controller é desacoplar (veja Low Coupling) a camada de interface com o usuário – que deve focar em apresentação, estilos, design, etc. &#8211; da implementação em si, desta forma aumentando a coesão (veja High Coesion), já que cada camada atenderá apenas a responsabilidades específicas e bem definidas.</p>
<p><img style="background-image: none; border-right-width: 0px; background-color: white; margin: 0px 22px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Diagrama de classes: Exemplo padrão GRASP Controller" border="0" alt="Diagrama de classes: Exemplo padrão GRASP Controller" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/12/image1.png" width="622" height="174" /></p>
<p>&#160;</p>
<p><b>Pure Fabrication</b> &#8211; Determina que assuntos não diretamente relacionados ao domínio da aplicação devem ser tratados por classes apartadas, denominadas &quot;invenção pura&quot;. Ou seja, aquilo que para o domínio da aplicação não faça sentido é considerado e apartado como uma &quot;invenção&quot;. Um exemplo desta situação é o encapsulamento de funcionalidades e particularidades para acesso a um banco de dados (componentes que encapsulam o driver de acesso a banco de dados, como por exemplo, o ADO .NET), em classes específicas que possam ser reutilizadas dentre as demais classes que precisam da mesma funcionalidade. Classes utilitárias e diversas funcionalidades providas por frameworks em geral são consideradas invenções puras. Este padrão ajuda no aumento da coesão (veja High Coesion), uma vez que define que as classes de domínio não contenham funcionalidades que vão além das suas reais responsabilidades. Desta forma, o reuso também é favorecido, já que as invenções puras são extraídas do domínio, de forma que possam ser reutilizadas.</p>
<p><b>Polymorphism</b> – O polimorfismo prega que operações polimórficas sejam utilizadas ao invés de decisões. Para ilustrar este conceito nada melhor que um exemplo. Considere uma classe Pessoa, com os atributos Nome, NumeroCpf, NumeroCnpj e Tipo (Fisica ou Juridica). Neste modelo, todas as classes que precisem obter o documento da pessoa muito provavelmente implementarão um IF com base no atributo Tipo e considerarão ou o NumeroCpf ou o NumeroCnpj como o documento. Segundo o padrão, criar uma operação polimórfica significa criar uma interface Pessoa com o atributo Nome e uma operação ObterDocumento e duas classes que implementam esta interface: PessoaFisica (NumeroCpf) e PessoaJuridica (NumeroCnpj). Cada classe fará sua própria implementação da operação ObterDocument<img style="background-image: none; border-right-width: 0px; background-color: white; margin: 9px 0px 5px 11px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Diagrama de classes: Exemplo padrão GRASP Polymorphism" border="0" alt="Diagrama de classes: Exemplo padrão GRASP Polymorphism" align="right" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/12/image2.png" width="506" height="265" />o, de forma que os demais utilizadores não tenham mais que se preocupar com a regra para obtenção do documento com base no tipo da pessoa. Um benefício desta abordagem é que caso seja necessário adicionar um terceiro tipo de pessoa (PessoaEstrangeira), o impacto seria menor para as classes dependentes, já que a operação polimórfica é a mesma (ObterDocumento).</p>
<p><b>Indirection</b> &#8211; Determina que o sistema não conheça e que não esteja acoplado (veja Low Coupling) às implementações reais e especificas de determinados assuntos. Projetar para indireção pode envolver a criação de camadas que encapsulam determinadas funcionalidades ou que desacoplem outras camadas. O padrão Controller é um exemplo de indireção, já que com ele a user interface não depende diretamente das camadas inferiores (model, por exemplo), e vice-versa. Existem diversas formas de se aplicar a indireção. Além do MVC, outro exemplo de aplicação deste conceito é a Injeção de Dependência, onde as implementações dependem de interfaces que são realizadas em objetos concretos apenas em tempo de execução. Diversos design-patterns também se beneficiam deste conceito, por exemplo: Abstract Factory, Facade, Adapter, Strategy, Proxy, etc. Um exemplo simples e recorrente de indireção é o que o Visual Studio faz quando adicionamos uma referência para um serviço em um projeto. Por traz dos panos são criadas classes Proxy que encapsulam toda a complexidade envolvida no processo de chamar um serviço através do protocolo utilizado (SOAP, p. ex.), serializar e deserializar objetos de transferência, tratar seu retorno, etc. Todo o restante do sistema que utiliza o objeto Proxy criado se quer sabe o que está por traz dele, de forma que se o protocolo de comunicação for alterado, por exemplo, nada será afetado além do Proxy.</p>
<p><b>Protected Variations</b> &#8211; A variação protegida é uma forma de indireção. A diferença é que neste caso o principal objetivo é proteger o sistema ou uma classe de variações previstas ou que tenham grandes possibilidades de ocorrer. Um exemplo deste tipo de situação é quando utilizamos componentes ou serviços de terceiros<sup>1</sup> ou mesmo quando precisamos integrar com APIs de pacotes de aplicações. Em todas estas situações a ideia é proteger seu sistema ou sua classe da possibilidade de alteração na interface do componente, do serviço ou da API. As mesmas abordagens e padrões utilizados para a indireção também se aplicam à variação protegida. Conceitos e padrões de EAI (Enterprise Application Integration) e SOA (Service Oriented Architecture) também apoiam a indireção e a variação protegida de uma forma mais ampla.</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-2-de-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RDD &#8211; Responsibility Driven Design e GRASP &#8211; General Responsibility Assignment Software Principles (1 de 2)</title>
		<link>http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-1-de-2/</link>
		<comments>http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-1-de-2/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 00:01:22 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Leitura Recomendada]]></category>
		<category><![CDATA[Orientação a Objetos]]></category>
		<category><![CDATA[GRASP]]></category>
		<category><![CDATA[OO]]></category>
		<category><![CDATA[POO]]></category>
		<category><![CDATA[RDD]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-1-de-2/</guid>
		<description><![CDATA[<p>Olá pessoal</p>
<p>Neste post vamos conhecer alguns conceitos de programação orientada a objetos (POO) que nos ajudam a pensar em como estruturar projetos orientados a objetos. Ambos os conceitos abordados neste post estão descritos no livro “Utilizando UML e Padrões – Uma introdução à Análise e ao Projeto Orientado a Objetos e ao Desenvolvimento Iterativo” de Craig [...]]]></description>
			<content:encoded><![CDATA[<p><img style="background-image: none; border-right-width: 0px; background-color: white; margin: 0px 22px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="158382_4" border="0" alt="158382_4" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/12/158382_4.jpg" width="150" height="228" />Olá pessoal</p>
<p>Neste post vamos conhecer alguns conceitos de programação orientada a objetos (POO) que nos ajudam a pensar em como estruturar projetos orientados a objetos. Ambos os conceitos abordados neste post estão descritos no livro “Utilizando UML e Padrões – Uma introdução à Análise e ao Projeto Orientado a Objetos e ao Desenvolvimento Iterativo” de Craig Larman – Livro muito bom que trata em detalhes de diversos assuntos bastante pertinentes no nosso dia-a-dia: processos de desenvolvimento iterativos, incrementais e ágeis, papéis e responsabilidades, artefatos, UML, conceitos de programação orientada a objetos, RDD, padrões GRASP, design-patterns (GOF) e outros.</p>
<p>Vamos começar então pelo RDD. Segundo o livro, RDD é uma metáfora geral que nos leva a raciocinar sobre projetos de software orientados a objetos, sob o ponto de vista de responsabilidades. Por responsabilidades, entende-se o que nossas classes de objetos ou mesmo componentes de software devem <b>fazer</b> e <b>saber</b>. Em um modelo de classes o fazer é realizado por métodos e o saber por atributos. Outro conceito envolvido no RDD é o de <b>colaboração</b>. Uma vez definidas as responsabilidades, há de se definir como seus objetos colaboração para que o objetivo seja atingido.</p>
<p>Já o <strong>GRASP</strong> define nove padrões ou princípios voltados à atribuição de responsabilidades, que apoiam o RDD. Analisando estes conceitos e os padrões GRASP, que veremos em detalhe mais a frente, podemos concluir que ambos apenas endereçam questões básicas de orientação a objetos. E o objetivo é justamente esse. Tanto RDD quanto GRASP servem como uma ferramenta para apoiar no domínio de conceitos básicos de programação orientada a objetos. E quando falamos de conceitos básicos, logo veremos que diversos tópicos abordados fundamentam outros padrões mais específicos, como por exemplo, MVC e os design-patterns do GOF. Isso é interessante, porque para entender estes padrões mais específicos temos que ter os conceitos básicos bem fundamentados. Outro ponto importante é que alguns padrões não se restringe apenas ao mundo de orientação a objetos. Alguns conceitos empregados nos padrões High Coesion, High Coupling, Indirection e Protected Variation são altamente pertinentes e recorrentes em arquiitetura de software. Vamos então aos padrões GRASP.</p>
<p><img style="background-image: none; border-right-width: 0px; background-color: white; margin: 0px 22px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Diagrama de classes - Composição NotaFiscal - Item" border="0" alt="Diagrama de classes - Composição NotaFiscal - Item" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/12/image.png" width="292" height="95" /></p>
<p><b>Creator</b> – Este padrão determina quem é responsável por criar quem. Uma das possibilidades a considerar, por exemplo, é que uma classe A deve ser responsável por criar uma classe B caso a classe A tenha uma relação de composição com a classe B. Outra possibilidade citada por este padrão é que a classe A pode ser responsável por criar a classe B caso ela tenha consigo informações suficientes para a inicialização da classe B ou caso use B de maneira muito próxima. Considere, por exemplo, uma relação entre uma classe NotaFiscal e Item, que usualmente denota uma relação de composição. Ou seja, uma nota fiscal é composta por itens de forma que não faça sentido sua existência sem eles. Neste exemplo, a responsabilidade por criar instâncias da classe Item seria da classe NotaFiscal, que poderia fazê-lo através de uma operação “IncluirItem”.</p>
<p><b>Information Expert</b> &#8211; Determina a qual classe deve ser atribuída a responsabilidade de prover uma nova funcionalidade. O padrão diz que a classe que possuir mais informações a respeito da funcionalidade em questão deve ser a responsável por provê-la. Considerando o exemplo anterior (NotaFiscal – Item), caso precisássemos saber a quantidade de itens de uma nota ou o valor total do itens quem deveria ser a classe responsável? A classe NotaFiscal é a classe que tem mais informações sobre seus Itens, já que ela é composta por Itens, logo, as operações ObterQuantidaDeItens e ObterValorTotal é uma responsabilidade da classe NotaFiscal. Note que tanto este quanto o padrão Creator são bem básicos e definem conceitos bastante triviais. O que é importante observar é que ambos definem regras gerais que estão por traz do que fazemos por “intuição” no dia-a-dia.</p>
<p><b>High Coesion</b> – A alta coesão diz respeito à criação de classes que tratem de assuntos focados e bem definidos. Uma classe não coesa é aquela que trata de diversos assuntos distintos, tornando-se difícil de entender, manter, testar, evoluir e reutilizar. A alta coesão também suporta o baixo acoplamento (veja Low Coupling). </p>
<p><b>Low Coupling</b> – O baixo acoplamento diz respeito à redução de dependência entre classes de forma que uma necessidade de mudança tenha menor impacto nos objetos dependentes. Projetar para baixo acoplamento envolve a utilização de conceitos de alta coesão (veja High Coesion), pois, classes mais coesas são menos dependentes entre si. Imagine, por exemplo, uma classe que contenha implementações de diversos assuntos diferentes – não coesa. Todos os demais módulos do sistema que dependam dos assuntos contidos nesta classe dependerão de uma mesma classe, de forma que alterações em qualquer um dos assuntos abordados proporcionem maior risco para todos os demais. Projetar para baixo acoplamento também envolve utilização de conceitos de encapsulamento. Encapsular significa esconder do mundo externo particularidades, implementações e informações que não digam respeito diretamente ao negócio / domínio, ou que sejam sujeitas a mudanças. Uma vez que tais informações sejam escondidas atrás de propriedades ou operações, por exemplo, as demais classes não serão afetadas quando houver alterações – ou seja, terão baixo acoplamento. O baixo acoplamento também pode ser atingido através de técnicas utilizadas para indireção (veja Indirection) e variação protegida (veja Protected Variation).</p>
<p>Por enquanto é só. No próximo artigo devo trazer os demais padrões GRASP: <strong>Controller, Pure Fabrication, Polymorphism, Indirection e Protected Variation. </strong>Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/12/rdd-responsibility-driven-design-e-grasp-general-responsibility-assignment-software-principles-1-de-2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Uma defini&#231;&#227;o de Arquitetura</title>
		<link>http://nelsonbassetto.com/blog/2011/10/uma-definio-de-arquitetura/</link>
		<comments>http://nelsonbassetto.com/blog/2011/10/uma-definio-de-arquitetura/#comments</comments>
		<pubDate>Mon, 17 Oct 2011 22:55:00 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Comportamento]]></category>
		<category><![CDATA[Quick Eng]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[RUP]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/2011/10/uma-definio-de-arquitetura/</guid>
		<description><![CDATA[<p>Olá Pessoal!</p>
<p>Neste post gostaria de compartilhar um trecho do livro “The Rational Unified Process: An Introduction (3rd Edition)” de Philippe Kruchten, disponível no capítulo 5 (An Architecture-Centric Process), página 84. O texto fala sobre uma definição de Arquitetura, que é um tema bastante pertinente, diante das várias abordagens e interpretações existentes no mercado para o escopo [...]]]></description>
			<content:encoded><![CDATA[<p><img style="background-image: none; border-right-width: 0px; background-color: white; margin: 0px 20px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="The Rational Unified Process An Introduction" border="0" alt="The Rational Unified Process An Introduction" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/10/The-Rational-Unified-Process-Introduction.jpg" width="175" height="237" />Olá Pessoal!</p>
<p>Neste post gostaria de compartilhar um trecho do livro “<a href="http://www.amazon.com/Rational-Unified-Process-Introduction-3rd/dp/B005CDUPUA/ref=sr_1_1?ie=UTF8&amp;qid=1318889500&amp;sr=8-1" target="_blank">The Rational Unified Process: An Introduction (3rd Edition)</a>” de Philippe Kruchten, disponível no capítulo 5 (An Architecture-Centric Process), página 84. O texto fala sobre uma definição de Arquitetura, que é um tema bastante pertinente, diante das várias abordagens e interpretações existentes no mercado para o escopo de atuação de uma área de arquitetura ou de um arquiteto.</p>
<p>Basicamente o texto fala que arquitetura presa pela estrutura de um sistema, sua decomposição em elementos, subsistemas e suas interfaces, juntamente com comportamento e colaboração entre elementos. Requisitos não funcionais (ou atributos de qualidade) também fazem parte da lista de itens que a arquitetura de um sistema deve contemplar, como por exemplo, performance, reuso, escalabilidade, resiliência, etc. Outro ponto importante mencionado é que arquitetura engloba não apenas aspectos técnicos, mas também econômicos e sociológicos. Podemos entender como aspectos econômicos os recursos e limite de orçamento disponível em um projeto. Por sociológicos, as pessoas envolvidas e como a arquitetura do sistema pode os afetar, sejam eles desenvolvedores, designers, gerentes de projetos, ou mesmo usuários.</p>
<p>Confira o trecho a seguir.</p>
<blockquote><p>Many definitions of architecture have been proposed. The Rational Unified Process defines architecture as follows.</p>
<p>Architecture encompasses significant decisions about the following:</p>
<ul>
<li>The organization of a software system </li>
<li>The selection of structural elements and their interfaces by which the system is composed, together with their behavior as specified in the collaboration among these elements </li>
<li>The composition of these elements into progressively larger subsystems </li>
<li>The architectural style that guides this organization, these elements and their interfaces, their collaborations, and their composition </li>
</ul>
<p>Software architecture is concerned with not only structure and behavior but also context: usage, functionality, performance, resilience, reuse, comprehensibility, economic and technological constraints and trade-offs, and aesthetics.</p>
<p>This definition is long, but it attempts to capture the richness, the complexity, and the multiple dimensions of the concept. We can elaborate on some of the points.</p>
<p>Architecture is part of design: it is about making decisions about how the system will be built. But it is not all of the design. It stops at the major elements—the elements that have a pervasive and long-lasting effect on the qualities of the system, namely, its evolvability and its performance.</p>
<p>Architecture is about structure and about organization, but it is not limited to structure. It also deals with behavior: what happens at the joints, at the seams, and across the interfaces.</p>
<p>Architecture not only looks inward but also looks at the “fit” of the system in two contexts: the operational context (its end users) and the development context (the organization that develops the system). And it encompasses not only a system’s technical aspects but also its economic and sociological aspects.</p>
<p>Architecture also addresses “soft” issues such as style and aesthetics. Can an architecture be pleasing? Yes, to the educated eye it can be. Issues of aesthetics have their place in making a design uniform, easy to understand, and easy to evolve, with minimal surprises for the designers.</p>
</blockquote>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/10/uma-definio-de-arquitetura/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>What Makes a &#8220;Good&#8221; Architecture?</title>
		<link>http://nelsonbassetto.com/blog/2011/07/what-makes-a-good-architecture/</link>
		<comments>http://nelsonbassetto.com/blog/2011/07/what-makes-a-good-architecture/#comments</comments>
		<pubDate>Mon, 18 Jul 2011 01:10:17 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Técnicas Arquiteturais]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Practices]]></category>
		<category><![CDATA[Todo arquiteto deve saber]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/2011/07/what-makes-a-good-architecture/</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>Neste post vou falar sobre mais um tópico bastante interessante do livro Software Architecture in Practice – Second Edition, já citado em um post anterior. Desta vez o tema é “o que faz uma boa arquitetura”. Segundo o livro, diferentes arquitetos em diferentes organizações projetam diferentes arquiteturas, de forma que seja complicado definir qual é [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>Neste post vou falar sobre mais um tópico bastante interessante do livro <a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1310430169&amp;sr=1-1" target="_blank">Software Architecture in Practice – Second Edition</a>, já citado em um post anterior. Desta vez o tema é “o que faz uma boa arquitetura”. Segundo o livro, diferentes arquitetos em diferentes organizações projetam diferentes arquiteturas, de forma que seja complicado definir qual é a mais correta. A ideia geral do tópico é que a arquitetura mais apropriada é aquela que melhor atende aos propósitos definidos para o sistema, sendo que não há uma fórmula única. Diferentes tipos de arquiteturas atendem a diferentes tipos de demandas. Uma arquitetura distribuída, baseada em estrutura client-server pode ser adequada para uma companhia de grande porte do setor financeiro, porém, a mesma solução pode ser completamente inapropriada para uma aplicação voltada à aviação, ou a um compilador, ou ainda a um jogo de vídeo game. E como não há uma fórmula, o tópico estabelece algumas “regras de ouro”, que podem ser usadas em todos os tipos de demandas. As recomendações são classificadas em relacionadas ao processo e ao produto (ou estrutural). Vejamos a seguir:</p>
<p><strong><a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1310430169&amp;sr=1-1" target="_blank"><img style="background-image: none; border-right-width: 0px; margin: 6px 35px 17px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Software Architecture in Practice - Second Edition" border="0" alt="Software Architecture in Practice - Second Edition" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/07/SftwArchiInPractice.png" width="188" height="279" /></a>Recomendações relacionadas ao processo</strong></p>
<ul>
<li>A arquitetura deve ser produto de apenas um arquiteto ou de um grupo pequeno, com um líder identificado. Acredito que esta dica esteja relacionada ao <a href="http://en.wikipedia.org/wiki/Anti-pattern" target="_blank">anti-pattern</a> <a href="http://en.wikipedia.org/wiki/Design_by_committee" target="_blank">Design by Committee</a>, em que a opinião de muitas pessoas é levada em consideração, atendendo seus egos ao invés das reais necessidades, resultando em uma arquitetura pouco eficiente. </li>
<li>O arquiteto ou time de arquitetos deve ter uma lista de requisitos funcionais, bem como uma lista priorizada do que é definido como atributos de qualidade (devo falar mais sobre este assunto em um próximo post), que são, por exemplo, escalabilidade, performance, segurança, facilidade de manutenção, etc. </li>
<li>Uma arquitetura deve ser bem documentada, de forma que ao menos uma visão estática e uma dinâmica sejam produzidas. Uma visão estática pode ser um diagrama de componentes ou de implantação da UML. Já a dinâmica pode ser obtida com os diagramas de sequência ou comunicação, por exemplo, também da UML. </li>
<li>Uma vez documentada, a arquitetura deve ser bem conhecida por todos os stakeholders (clientes / áreas de negócios solicitantes, analistas, desenvolvedores, líderes de projetos, gerentes de projetos, etc.), que por sua vez devem se envolver ativamente na sua revisão. </li>
<li>Uma arquitetura deve ser analisada através da medição de atributos quantitativos (por exemplo, throughput máximo) e avaliada formalmente quanto aos atributos de qualidade que deve atender, antes que seja tarde para que alterações sejam feitas. </li>
<li>Uma arquitetura deve ter como resultado um sistema “esqueleto” (estrutura inicial em camadas, serviços, projetos, soluções, etc.) em que caminhos de comunicação sejam testados com funcionalidades mínimas. Uma vez estabelecida, esta estrutura pode ser usada para o crescimento incremental do sistema. </li>
<li>Uma arquitetura também deve ter como resultado documentações de soluções para áreas de contenção específicas, como por exemplo, utilização de rede, processador, etc. </li>
</ul>
<p><strong>Recomendações relacionadas ao produto / estrutura</strong></p>
<ul>
<li>Uma arquitetura deve ter como característica a definição de módulos cujas responsabilidades funcionais devem ser alocadas de acordo com os conceitos <a href="http://en.wikipedia.org/wiki/Information_hiding" target="_blank">information hiding</a> e <a href="http://en.wikipedia.org/wiki/Separation_of_concerns" target="_blank">separation of concerns</a>. </li>
<li>Cada módulo deve ter interfaces bem definidas, que encapsulem ou escondam aspectos sujeitos a mudanças. Estas interfaces devem permitir que times de desenvolvimento trabalhem de forma independente entre si (achei este item redundante com relação ao anterior, mas deixei para ficar aderente ao livro). </li>
<li>Arquitetos devem se preocupar e devem buscar o atendimento de atributos de qualidade. É comum que arquitetos se preocupem apenas com os requisitos funcionais, deixando questões importantes aparecerem apenas quando o sistema entra em produção. Existem táticas específicas para atender requisitos de qualidade. Também falarei sobre este assunto em detalhes em próximos posts. </li>
<li>Uma arquitetura nunca deve depender de versões específicas de produtos comerciais. Se a integração com produtos comerciais for necessária, deve-se projetar a arquitetura para que mudanças futuras para um produto diferente ou para uma nova versão sejam feitas de forma trivial e pouco custosa (camadas de indireção podem ser usadas neste sentido). </li>
<li>Módulos que consomem dados devem ser separados de módulos que produzem dados, visando prover maior facilidade de manutenção, uma vez que as mudanças normalmente ocorrem ou no lado consumidor ou no lado fornecedor do dado. </li>
<li>Para sistemas com processamento paralelo, a arquitetura deve prover processos ou tarefas bem definidas que não necessariamente espelham a decomposição estrutural dos módulos. </li>
<li>Ainda com relação a processamento paralelo, cada processo ou tarefa deve ser escrito de forma que a atribuição para um processador específico seja facilmente alterada, preferencialmente em tempo de execução. </li>
<li>A arquitetura deve dispor de um número pequeno de padrões de interação. Ou seja, em geral, o sistema deve fazer as mesmas coisas da mesma forma, provendo maior facilidade de entendimento e leitura do código, melhorando e facilitando modificações futuras. </li>
</ul>
<p>A maioria destas recomendações são seguidas de forma intuitiva, ou mesmo são embasadas por diferentes estudos ou experiências que levam a estas conclusões. É interessante ter esta consolidação de boas práticas para utilizá-las como um guia a ser lembrado em cada novo projeto de arquitetura. Nos próximos posts devo falar mais sobre assuntos específicos tratados de forma incipiente neste. Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/07/what-makes-a-good-architecture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tradeoff Analysis</title>
		<link>http://nelsonbassetto.com/blog/2011/07/tradeoff-analysis/</link>
		<comments>http://nelsonbassetto.com/blog/2011/07/tradeoff-analysis/#comments</comments>
		<pubDate>Tue, 12 Jul 2011 01:03:19 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Técnicas Arquiteturais]]></category>
		<category><![CDATA[Todo arquiteto deve saber; Practices;]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/2011/07/tradeoff-analysis/</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>O tema deste post é bastante recorrente no nosso dia-a-dia. Prazos curtos, recursos e custos limitados, expectativa por qualidade do resultado final e requisitos bastante ousados. A regra para esta situação é simples: you can’t have it all (você não pode ter tudo). Isso é o que diz Mark Richards no livro 97 Things Every [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>O tema deste post é bastante recorrente no nosso dia-a-dia. Prazos curtos, recursos e custos limitados, expectativa por qualidade do resultado final e requisitos bastante ousados. A regra para esta situação é simples: you can’t have it all (você não pode ter tudo). Isso é o que diz Mark Richards no livro <a href="http://www.amazon.com/Things-Every-Software-Architect-Should/dp/059652269X/ref=sr_1_1?ie=UTF8&amp;qid=1310430117&amp;sr=8-1" target="_blank">97 Things Every Software Architect Should Know</a>, já citado em outros artigos deste blog anteriormente. E para ilustrar este cenário, Mark <img style="background-image: none; border-right-width: 0px; margin: 10px 23px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Ilustração naufrágio navio Vasa (meramente ilustrativo)" border="0" alt="Ilustração naufrágio navio Vasa (meramente ilustrativo)" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/07/barco-a-afundar-se_thumb.jpg" width="240" height="176" />conta a história do navio Vasa, que também pode ser encontrada no livro <a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1310430169&amp;sr=1-1" target="_blank">Software Architecture in Practice – Second Edition</a>, de Len Bass, Paul Clements e Rick Kazman, onde são mostradas opções que podem evitar o problema que veremos a seguir. </p>
<p>A história se passa em 1620, quando Suécia e Polônia estavam em guerra. Objetivando a vitória, o rei da Suécia encomendou um navio fora dos padrões da época, o Vasa. Capacidade para trezentos soldados e sessenta e quatro armas pesadas distribuídas em dois decks eram os requisitos do navio. Tal capacidade de transporte de pessoas e capacidade de fogo era algo completamente sem precedentes. Para atender tal demanda um projetista de navios renomado foi chamado: Henrik Hybertsson. Apesar da sua reputação impecável e vasta experiência no ramo, este era um projeto extremamente desafiador para Henrik, pois, ele nunca tinha projetado um navio deste porte antes. Sua especialidade era navios de guerra comuns, de apenas um deck de armamento. Para piorar o cenário, além dos requisitos de performance, segurança, confiabilidade e funcionalidade, Henrik tinha que lidar com restrições de custo e tempo. Oito anos após a encomenda o Vasa finalmente foi entregue de acordo com as especificações, estando pronto para sua primeira viagem. Após navegar por trinta metros o Vasa disparou seus canhões em saudação e afundou logo em seguida. Investigações concluíram que o navio havia sido bem construído, porém, não havia sido bem projetado.</p>
<p>A conclusão desta história no livro <a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1310430169&amp;sr=1-1" target="_blank">Software Architecture in Practice – Second Edition</a> é que apesar de passados quase quatrocentos anos do corrido, o que é denominado “Architecture Business Cycle” é bem ilustrado: os objetivos da organização (do Rei no contexto da guerra) delineiam os requisitos (poder de fogo e transporte de soldados), que delineiam a arquitetura (dois decks de armamento, setenta metros de comprimento) que por sua vez delineia um sistema (o navio que naufragou). No livro são então apresentadas três opções que devem ser consideradas quando falamos de projetos de arquitetura de sistemas reais:<img style="background-image: none; border-right-width: 0px; margin: 22px 0px 0px 19px; padding-left: 0px; padding-right: 0px; display: inline; float: right; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="Navio Vasa - The Vasa Museum - Stockholm, Suécia" border="0" alt="Navio Vasa - The Vasa Museum - Stockholm, Suécia" align="right" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/07/vasa-museum06_thumb.jpg" width="311" height="214" /></p>
<ul>
<li>A verificação de estudos de caso de arquiteturas bem sucedidas que atendam a requisitos semelhantes; </li>
<li>A utilização de métodos para avaliar uma arquitetura antes que qualquer sistema tenha sido construído a partir dela, de forma a mitigar os riscos associados aos requisitos sem precedentes (veremos mais detalhes a seguir); </li>
<li>A utilização de técnicas incrementais para o estabelecimento da arquitetura, de forma a descobrir problemas de design antes que seja muito tarde. </li>
</ul>
<p>Para Mark, no livro <a href="http://www.amazon.com/Things-Every-Software-Architect-Should/dp/059652269X/ref=sr_1_1?ie=UTF8&amp;qid=1310430117&amp;sr=8-1" target="_blank">97 Things Every Software Architect Should Know</a>, tentar cumprir todo e qualquer requisito pode levar a criação de uma arquitetura que essencialmente não faça nada de forma satisfatória. Foi o caso do Vasa, que acabou ficando desproporcional para atender as capacidades de armamento e transporte requeridas. Mark cita ainda exemplos de requisitos normalmente mutuamente exclusivos: performance versus alta interoperabilidade, reuso e diversas camadas de uma arquitetura SOA. Mark recomenda então a utilização de técnicas para o que é conhecido como&#160; “Tradeoff Analysis”. </p>
<p>Tradeoff é uma situação que envolve perda de qualidade ou aspecto em algo em prol do ganho de outra qualidade ou aspecto. Considere o seguinte exemplo, ao guardar dados em memória podemos ter ganhos de performance associados ao acesso rápido, porém, teremos maior consumo de memória pela aplicação e possibilidade de trabalhar com dados desatualizados, já que a fonte original não estaria sendo consultada diretamente. O objetivo de uma análise de tradeoffs é ajudar na escolha de uma arquitetura adequada para um sistema pela descoberta de tradeoffs e pontos sensíveis. Duas técnicas são citadas para este objetivo: ATAM (Architectural Tradeoff Analysis Method) e CBAM (Cost Benefit Analysis Method). Ambas estão descritas no livro <a href="http://www.amazon.com/Software-Architecture-Practice-2nd-Bass/dp/0321154959/ref=sr_1_1?s=books&amp;ie=UTF8&amp;qid=1310430169&amp;sr=1-1" target="_blank">Software Architecture in Practice – Second Edition</a> e também no site do <a href="http://www.sei.cmu.edu" target="_blank">SEI (Software Engineering Institute)</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/07/tradeoff-analysis/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick Eng: RUP x Scrum</title>
		<link>http://nelsonbassetto.com/blog/2011/05/quick-eng-rup-x-scrum/</link>
		<comments>http://nelsonbassetto.com/blog/2011/05/quick-eng-rup-x-scrum/#comments</comments>
		<pubDate>Tue, 10 May 2011 01:27:00 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Quick Eng]]></category>
		<category><![CDATA[Ágil]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[RUP]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/?p=196</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>Neste post finalizo uma pequena série de três posts sobre os processos de desenvolvimento de software mais populares da atualidade: o RUP e o Scrum. Caso você não tenha lido os dois posts anteriores, recomendo que o faça: RUP / Scrum. Neste post registro minha opinião / sentimento pessoal quanto a tais processos e como [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>Neste post finalizo uma pequena série de três posts sobre os processos de desenvolvimento de software mais populares da atualidade: o RUP e o Scrum. Caso você não tenha lido os dois posts anteriores, recomendo que o faça: <a href="http://nelsonbassetto.com/blog/2011/04/quick-eng-rational-unified-process-rup/" target="_blank">RUP</a> / <a href="http://nelsonbassetto.com/blog/2011/04/quick-eng-scrum/" target="_blank">Scrum</a>. Neste post registro minha opinião / sentimento pessoal quanto a tais processos e como enxergo as discussões que têm surgido atualmente no mercado e na comunidade de desenvolvimento de software. Ressalto então que o está descrito excepcionalmente neste post não foi embasado por nenhuma literatura ou trabalho científico, tratando-se, portanto, de uma análise empírica pessoal. Com este post gostaria de abrir uma discussão, convidando-o a opinar sobre o assunto, postando seu comentário.</p>
<p><img style="background-image: none; background-color: white; padding-left: 0px; padding-right: 20px; display: inline; padding-top: 0px; border-width: 0px;" title="RUP" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/05/rup_ps2_thumb.jpg" border="0" alt="RUP" width="226" height="89" align="left" />É fato que não é tarefa simples suportar um processo demorado por conta de levantamentos de negócios, seguido por um levantamento de requisitos e produção de documentações ostensivas. Com as cobranças constantes por entregas mais rápidas, os clientes vêm maior valor no produto entregue do que em um escopo bem fechado e documentado. Muitos profissionais de TI também não enxergam este valor ou deixam de enxergar com o passar do tempo, quando percebem que manter toda uma documentação produzida não é trivial ou mesmo quando são cobrados frequentemente por fins sem necessariamente justificar os meios. Além disso, existem também outros problemas que são enfrentados na maioria dos projetos, como por exemplo, a não aderência do produto entregue às reais necessidades do usuário, frequentes mudanças de escopo no decorrer do desenvolvimento, demora na entrega dos primeiros resultados e/ ou atraso na entrega do produto completo, o que taxa a área de TI como uma área muito demorada.</p>
<p>Eis que surge então a resposta para todos os problemas. Um processo que não define nenhuma documentação e/ou passo de modelagem e que vem a endossar esta prática que antes era apenas uma ideia ou fruto das pressões mencionadas. Um processo que privilegia os produtos entregues ante as documentações ostensivas, que proporciona entrega de resultados rápidos para o cliente, que não impõe a existência de muitos papéis específicos, sendo desta forma facilmente incorporado por qualquer time de desenvolvimento. Eis que surge o Scrum.</p>
<p><img style="background-image: none; background-color: white; padding-left: 20px; padding-right: 0px; display: inline; float: right; padding-top: 0px; border-width: 0px;" title="Scrum" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/05/Scrum_thumb.png" border="0" alt="Scrum" width="362" height="65" align="right" /></p>
<p>Diversas consultorias surgem então para explorar este que é vendido como a bala de prata, a bola da vez. Outras consultorias que vendiam outros tipos de treinamento passam a se adaptar à nova onda, para não perder <em>market share</em>. Completando o cenário, diversos Scrum Masters se formam e passam a influenciar comunidades, que passam a levar as ideias ágeis para suas empresas, como solução para seus problemas. Não que isso seja privilégio do Scrum. Acredito que o mesmo tenha acontecido com o RUP anteriormente e com diversas outras siglas e acrônimos que vão e vem no nosso mercado o tempo todo. Com toda essa catequização, o RUP passa a se consolidar então como um processo burocrático, antiquado, e que não atende às expectativas dos clientes.</p>
<p>O que não é lembrado por muitos, no entanto, é que o RUP também é um processo iterativo e incremental assim como o Scrum, de forma que com ele também é possível fazer entregas rápidas, coletando <em>feedbacks</em> logo no inicio do projeto, assim mitigando os riscos antecipadamente. Nada impede também que o RUP seja customizado para cada realidade. Existe, por exemplo, o RUP for small projects, que traz um apanhado mais enxuto com relação à sua versão original. Outra possibilidade ainda é criação do seu próprio processo, selecionando um conjunto de artefatos, papéis e conceitos do RUP que façam sentido para a sua organização.</p>
<p>Já outro ponto nas metodologias ágeis que muitas vezes é mal interpretado é quanto à ausência de especificações e/ou documentações. O manifesto ágil não diz que nenhuma documentação ou especificação deve ser feita. Ele diz apenas que o software funcionando é mais prioritário do que uma documentação abrangente. No livro “Utilizando UML e Padrões”, Craig Larman fala sobre uma abordagem de modelagem que ele chama de “modelagem ágil e desenho leve UML”. Nesta abordagem os diagramas UML são desenhados para proporcionar entendimento e comunicação ao invés de documentação. Além disso, os diagramas são feitos em quadros brancos ou folhas de aderência, de forma que eles sejam posteriormente digitalizados através de fotos e programas específicos.</p>
<p>Pessoalmente acredito que um levantamento inicial de requisitos e que diagramas de casos de uso ajudam bastante no entendimento e na concepção inicial de um projeto, bem como na visualização do seu tamanho e escopo. Além disso, diversos diagramas da UML também agregam com visões que são importantes para a maioria dos projetos, como por exemplo, as dependências entre componentes, a modularidade e separação de responsabilidades, demostradas pelo diagrama de componentes e a distribuição dos mesmos dentre os diversos nodes de uma arquitetura distribuída, demonstrada por um diagrama de implantação.</p>
<p>Qual é então o processo mais adequado para cada organização? Acredito que ambos os processos e suas variantes ou customizações podem atender às necessidades de diferentes tipos de organizações, dependendo da sua cultura, necessidade e porte. Empresas que optam pelo RUP, por sua customização ou por um processo baseado nele, normalmente possuem cultura séria / rígida, onde constantes auditorias exigem documentos e práticas registradas, possuindo também uma estrutura de profissionais robusta. Já as organizações que possuem cultura descontraída e que optam ou que só podem ter times pequenos que atendam responsabilidades específicas, normalmente melhor se adaptam ao Scrum e aos demais processos e conceitos ágeis.</p>
<p>E você, o que acha? A sua empresa adota um destes processos de forma satisfatória?</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/05/quick-eng-rup-x-scrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick Eng: Scrum</title>
		<link>http://nelsonbassetto.com/blog/2011/04/quick-eng-scrum/</link>
		<comments>http://nelsonbassetto.com/blog/2011/04/quick-eng-scrum/#comments</comments>
		<pubDate>Tue, 19 Apr 2011 01:08:17 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Quick Eng]]></category>
		<category><![CDATA[Ágil]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[RUP]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/?p=184</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>Continuando a série rápida sobre engenharia de software, neste post falo um pouco sobre o Scrum. O objetivo desta série, como mencionado no post anterior, é traçar um paralelo entre os processos de desenvolvimento de sistemas mais populares: RUP e o Scrum. Caso você não tenha lido o post anterior, onde falei sobre o RUP, [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>Continuando a série rápida sobre engenharia de software, neste post falo um pouco sobre o Scrum. O objetivo desta série, como mencionado no post anterior, é traçar um paralelo entre os processos de desenvolvimento de sistemas mais populares: RUP e o Scrum. Caso você não tenha lido o post anterior, onde falei sobre o RUP, <a title="RUP" href="http://nelsonbassetto.com/blog/2011/04/quick-eng-rational-unified-process-rup/" target="_blank">clique aqui</a>.</p>
<p>Assim como o RUP, o Scrum também é um processo de desenvolvimento de sistemas iterativo e incremental, porém, é voltado ao que se chama de desenvolvimento ágil de software, que por sua vez é fundamentado pelo manifesto ágil. O manifesto ágil foi concebido por dezessete pessoas de extrema influência na área de engenharia de software, sendo que dentre eles destacam-se: Martin Fowler, Alistair Cockburne Kent Beck. Quatro valores fundamentais formam a base do manifesto ágil:</p>
<ul>
<li>Os indivíduos e suas interações acima de procedimentos e ferramentas;</li>
<li>O funcionamento do software acima de documentação abrangente;</li>
<li>A colaboração dos clientes acima da negociação de contratos;</li>
<li>A capacidade de resposta à mudanças acima de um plano pré-estabelecido;</li>
</ul>
<p>Percebe-se então uma grande diferença entre os valores que formam a base do RUP e os do Scrum, sendo que uma das principais é o fato de que as documentações permeiam o RUP de ponta a ponta enquanto que no Scrum, em sua essência, pouca ou nenhuma documentação é produzida. Além disso, outra grande diferença, como bem lembrado pelo colega Alessandro Brito em uma discussão, é que o Scrum não define o que fazer em cada situação, o que o classifica como um processo não prescribente.</p>
<p>Vamos então a alguns detalhes. No Scrum, todo o conjunto de requisitos do usuário é conhecido como Product Backlog. Nele há a introdução do conceito de Sprint, que se refere a uma iteração de implementação completa de um ou mais itens do Product Backlog, que são entregues e validados pelo cliente ao seu término. O conjunto de itens selecionados para implementação em uma sprint é denominado Sprint Backlog. As sprints normalmente têm duração de duas a quatro semanas, de forma que o cliente tenha contato com as primeiras funcionalidades do sistema logo no inicio do seu desenvolvimento &#8211; o que é bem característico de processos iterativos e incrementais, assim como o RUP. Veja na figura a seguir a ilustração do processo descrito.</p>
<p style="text-align: center;"><img class="aligncenter" style="background-image: none; background-color: white; padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;" title="Scrum" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/04/Scrum1.png" alt="Scrum" width="549" height="236" /></p>
<p>No Scrum também é empregado o que se chama de Daily Mettings, onde todos os participantes do time de desenvolvimento do projeto participam de uma breve reunião, apontando os seus progressos e/ou seus impeditivos, de forma que os riscos possam ser mitigados logo no momento em que surgem. Além disso, são também realizadas reuniões de planejamento das próximas sprints e de retrospectivas das sprints finalizadas, onde são verificadas as lições aprendidas, de forma que eventuais problemas não se repitam ao longo do projeto.</p>
<p>Situados ambos os processos, surgem algumas questões, como por exemplo: qual processo é mais adequado para a minha empresa ou para o meu time de desenvolvimento e quais são as tendências atuais? Estas são questões que abordarei no próximo post, onde finalizarei esta pequena série. Até lá!</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/04/quick-eng-scrum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quick Eng: Rational Unified Process &#8211; RUP</title>
		<link>http://nelsonbassetto.com/blog/2011/04/quick-eng-rational-unified-process-rup/</link>
		<comments>http://nelsonbassetto.com/blog/2011/04/quick-eng-rational-unified-process-rup/#comments</comments>
		<pubDate>Fri, 15 Apr 2011 01:05:00 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Quick Eng]]></category>
		<category><![CDATA[Ágil]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[RUP]]></category>
		<category><![CDATA[Scrum]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/2011/04/quick-eng-rational-unified-process-rup/</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>Neste série rápida relacionada à engenharia de software vou descrever brevemente dois processos de desenvolvimento de software. Um é o RUP (que vem perdendo espaço para as novas tendências “ágeis”) e o outro é a bola da vez, o Scrum. Ao término, devo traçar uma conclusão com relação aos dois processos e às atuais tendências.</p>
<p>Neste [...]]]></description>
			<content:encoded><![CDATA[<p>Olá pessoal!</p>
<p>Neste série rápida relacionada à engenharia de software vou descrever brevemente dois processos de desenvolvimento de software. Um é o RUP (que vem perdendo espaço para as novas tendências “ágeis”) e o outro é a bola da vez, o Scrum. Ao término, devo traçar uma conclusão com relação aos dois processos e às atuais tendências.</p>
<p>Neste post em específico começarei pelo RUP. O RUP é um processo de desenvolvimento de software concebido inicialmente por uma organização denominada Rational (que utilizou como base um processo anterior denominado UP – Unified Process) e adquirido posteriormente pela IBM, tendo seu nome alterado para IRUP (IBM Rational Unified Process).</p>
<p>O processo consiste em uma abordagem iterativa e incremental, onde são definidas entregas sucessivas ao longo da execução do projeto. Tal modelo se opõe a abordagem tradicional cascata (waterfall),  onde a entrega ocorre apenas ao término do projeto. Seis melhores práticas formam a base deste processo:</p>
<ul>
<li>Desenvolvimento iterativo;</li>
<li>Gerenciamento de requisitos;</li>
<li>Uso de arquitetura baseada em componentes;</li>
<li>Modelagem visual;</li>
<li>Verificação da qualidade;</li>
<li>Controle de mudanças;</li>
</ul>
<p>Dentre diversas definições, o estabelecimento de papéis (funções) e artefatos (itens que são produzidos ao longo do projeto) fazem parte do RUP, definindo claramente, desta forma, as atribuições em um time e os itens que são entregues por ele. O RUP propõe uma abordagem com quatro fases e nove disciplinas, conforme pode ser observado na figura a seguir (conhecida popularmente como “Gráfico das Baleias”).</p>
<p><img style="background-image: none; background-color: white; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="Gráfico das Baleias - RUP" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/04/RUP.jpg" border="0" alt="Gráfico das Baleias - RUP" width="470" height="303" align="left" /><br />
Como benefícios de uma abordagem iterativa e incremental espera-se:</p>
<p>- <strong>Redução de custos com retrabalho e aumento da aderência do produto entregue às necessidades do usuário:</strong> À medida que pequenas partes do produto são entregues, o cliente tem a oportunidade de avaliar e fornecer um <em>feedback</em> à equipe de desenvolvimento, de forma que o produto final seja mais aderente aos seus requisitos.</p>
<p>- <strong>Aceleração do tempo de desenvolvimento do projeto como um todo:</strong> devido ao fato de que a equipe trabalha de forma mais eficiente quando se busca resultados de escopo pequeno e claro.</p>
<p>O RUP é comumente utilizado em grandes organizações, pois, em sua forma original (sem customizações), implica na produção de diversas documentações – o que o faz levar a fama de “burocrático” &#8211; e na existência de conhecimentos específicos (atribuições de alguns papeis) que nem sempre são viáveis em organizações menores. Para suprir estas deficiências, ou excessos, existe uma versão simplificada do RUP denominada “RUP for Small Projects”. Existem ainda organizações que criam seu próprio processo de desenvolvimento utilizando-se de práticas, conceitos e até mesmo artefatos definidos pelo RUP. Estes processos, no entanto, são mais aderentes às suas necessidades e as suas realidades.</p>
<p>Ultimamente pouco se tem ouvido falar a respeito do RUP, pois, como mencionado anteriormente, a moda agora é “ser ágil”. Até o próximo post, onde falarei sobre o Scrum!</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/04/quick-eng-rational-unified-process-rup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Asp .Net MVC 3.0</title>
		<link>http://nelsonbassetto.com/blog/2011/03/asp-net-mvc-3-0/</link>
		<comments>http://nelsonbassetto.com/blog/2011/03/asp-net-mvc-3-0/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 00:37:56 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[Quick Update]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Asp .Net]]></category>
		<category><![CDATA[MVC]]></category>
		<category><![CDATA[Patterns]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/?p=168</guid>
		<description><![CDATA[<p>Olá pessoal!</p>
<p>Neste post gostaria de deixar registrada uma recomendação para quem quer começar a estudar o ASP .NET MVC 3.0 e que de quebra também quer aprender algumas novidades do Visual Studio 2010. Trata-se de um tutorial criado por Scott Hanselman no site ASP .NET (www.asp.net): Getting Started with MVC3, que traz um passo-a-passo para a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.asp.net/mvc/mvc3" target="_blank"><img style="background-image: none; margin: 0px 38px 0px 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; padding-top: 0px; border: 0px;" title="ASP .NET MVC 3.0" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/03/ee663032_feature_mvc3pt-brMSDN_102.jpg" border="0" alt="ASP .NET MVC 3.0" width="240" height="150" align="left" /></a>Olá pessoal!</p>
<p>Neste post gostaria de deixar registrada uma recomendação para quem quer começar a estudar o <strong>ASP .NET MVC 3.0</strong> e que de quebra também quer aprender algumas novidades do Visual Studio 2010. Trata-se de um tutorial criado por <a href="http://hanselman.com" target="_blank">Scott Hanselman</a> no site ASP .NET (<a href="http://www.asp.net">www.asp.net</a>): <a href="http://www.asp.net/mvc/tutorials/getting-started-with-mvc3-part1-vb" target="_blank">Getting Started with MVC3</a>, que traz um passo-a-passo para a criação do seu primeiro site MVC. O tutorial é bastante detalhado e contém diversos screenshots, tornando-se fácil de ser seguido por estudantes e profissionais de qualquer nível. Vejam só quantos assuntos bacanas são abordados:</p>
<ul>
<li><strong>O próprio ASP .NET MVC 3.0: </strong>O tutorial traz uma aplicação de listagem de filmes, onde é possível verificar a lista de filmes disponíveis na base de dados, incluir um novo filme, alterar, excluir e visualizar detalhes de um filme existente. Durante a criação desta aplicação, diversos conceitos do ASP .NET MVC são explorados, como por exemplo, a criação de Views e Controllers. o funcionamento e a composição das URL’s em uma aplicação MVC, dentre outros. Após concluir o tutorial você terá uma aplicação ASP .NET MVC que realiza todas as operações básicas em um banco de dados, já servindo como um bom exemplo para as suas necessidades futuras.</li>
<li><strong>Razor: </strong>Veja na prática como funciona este novo view engine do ASP .NET MVC 3.0, onde é possível escrever os códigos das suas views na sua linguagem de preferência (C#/VB.NET), contando com o intellisense do Visual Studio 2010 e com a possibilidade de realizar testes unitários em views.</li>
<li><strong>NuGet: </strong>O NuGet é uma ferramenta de gerenciamento de pacotes que é adicionada ao Visual Studio 2010 com a instalação do ASP .NET MVC 3.0. Com ele é possível pesquisar e instalar bibliotecas de terceiros em suas aplicações .NET de forma bastante simplificada. Para mais informações sobre o Nuget, visite seu <a href="http://nuget.codeplex.com/" target="_blank">site no codeplex</a>.</li>
<li><strong>Entity Framework, Code-First e POCO</strong>: O tutorial mostra como baixar o pacote <strong>EFCodeFirst</strong> através do <strong>Nuget</strong>, porém, atualmente já é possível baixar a última versão do Entity Framework que já contém o Code-First embutido. A ideia com o Code-First é que ao invés de criarmos modelos de dados e tabelas baseados neles, nós devemos primeiro modelar e criar as classes do nosso sistema, ou seja, partindo para o código primeiro, de forma que as estruturas em banco de dados sejam criadas por ele em tempo de execução. As classes criadas são realmente simples (também conhecidas como POCO, de Plain Old CLR Objects), de forma que sejam necessárias apenas propriedades correspondentes aos seus atributos para que todo o trabalho seja feito.</li>
<li><strong>Validação de dados com DataAnnotations: </strong>Veja como é simples implementar validação em seu sistema, bastando para isso a decoração das suas classes de modelo de dados com atributos de validação. Ou seja, o framework se encarrega de gerar os códigos necessários para validação no client, de forma que sua aplicação não gere requisições desnecessárias ao servidor e ainda responda rapidamente. Tudo isso com pouquíssimas linhas de código!</li>
</ul>
<p>Não perca tempo para beneficiar-se destas tecnologias que tornam os nossos códigos mais bem escritos e que nos proporcionam cada vez mais produtividade! Até o próximo post.</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/03/asp-net-mvc-3-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AppFabric Caching Services</title>
		<link>http://nelsonbassetto.com/blog/2011/02/appfabric-caching-services/</link>
		<comments>http://nelsonbassetto.com/blog/2011/02/appfabric-caching-services/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 22:39:25 +0000</pubDate>
		<dc:creator>Nelson Bassetto</dc:creator>
				<category><![CDATA[AppFabric]]></category>
		<category><![CDATA[Aspect Oriented Programming]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[AOP]]></category>
		<category><![CDATA[Cache]]></category>
		<category><![CDATA[Performance]]></category>

		<guid isPermaLink="false">http://nelsonbassetto.com/blog/?p=160</guid>
		<description><![CDATA[<p>Olá pessoal,</p>
<p>Em fevereiro de 2011 foi publicado mais um artigo que escrevi para a revista .net Magazine, em sua edição de número oitenta e dois. Com o título “AppFabric Caching Services – Funcionalidades, instalação, configuração e utilização” o artigo complementa um outro artigo publicado anteriormente na edição sessenta e nove (veja o post aqui), onde falei [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devmedia.com.br/post-19319-AppFabric-Caching-Services.html" target="_blank"><img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: left; border-top: 0px; border-right: 0px; padding-top: 0px" title="Revista .net Magazine edição 82" border="0" alt="Revista .net Magazine edição 82" align="left" src="http://nelsonbassetto.com/blog/wp-content/uploads/2011/02/capa_net82_M1.jpg" width="140" height="186" /></a>Olá pessoal,</p>
<p>Em fevereiro de 2011 foi publicado mais um artigo que escrevi para a revista .net Magazine, em sua edição de número oitenta e dois. Com o título “<strong>AppFabric Caching Services – Funcionalidades, instalação, configuração e utilização</strong>” o artigo complementa um outro artigo publicado anteriormente na edição sessenta e nove (<a href="http://nelsonbassetto.com/blog/2010/07/aop-e-design-patterns-na-pratica/" target="_blank">veja o post aqui</a>), onde falei sobre Aspect Oriented Programming e Cache. Nesta edição o artigo estende o componente para cache abordado anteriormente, incluindo agora a utilização do AppFabric Caching Services, que é a tecnologia mais recente disponibilizada pela Microsoft para cache de dados.</p>
<p>Como o próprio título já anuncia, o artigo fala sobre as funcionalidades e características do AppFabric – incluindo também uma introdução sobre o Hosting Services – sua instalação e configuração em um ambiente local e a utilização do seu módulo de cache (Caching Services), através de um componente facilmente plugável, que utiliza as API’s providas junto com o pacote de instalação do AppFabric. </p>
<p>A sua versão digital pode ser vista através do link a seguir e a versão impressa encontra-se nas bancas de jornais no mês de fevereiro de 2011.</p>
<p align="left"><a title="http://www.devmedia.com.br/post-19319-AppFabric-Caching-Services.html" href="http://www.devmedia.com.br/post-19319-AppFabric-Caching-Services.html" target="_blank">http://www.devmedia.com.br/post-19319-AppFabric-Caching-Services.html</a></p>
<p>Obs: O artigo passou por um processo de edição feito pela revista, onde diversas alterações foram realizadas com relação a versão original enviada. Infelizmente, nesta edição alguns erros foram introduzidos e algumas passagens não ficaram de uma forma didática, em minha opinião.</p>
]]></content:encoded>
			<wfw:commentRss>http://nelsonbassetto.com/blog/2011/02/appfabric-caching-services/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

