<?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>Arkhi &#187; software</title>
	<atom:link href="http://blog.arkhi.com.br/tag/software/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.arkhi.com.br</link>
	<description>Arquitetura Corporativa</description>
	<lastBuildDate>Mon, 30 Nov 2009 01:21:51 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Existe Arquitetura de Software em Projetos XP?</title>
		<link>http://blog.arkhi.com.br/2008/12/12/existe-arquitetura-de-software-em-projetos-xp/</link>
		<comments>http://blog.arkhi.com.br/2008/12/12/existe-arquitetura-de-software-em-projetos-xp/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 16:22:49 +0000</pubDate>
		<dc:creator>Eros Viggiano</dc:creator>
				<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[extreme]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://dearchitectura.wordpress.com/?p=391</guid>
		<description><![CDATA[Extreme Programming é uma proeminente metodologia ágil de desenvolvimento de software, mas apresenta uma lacuna para a arquitetura de software. Apresentamos alguns pontos de vista que tentam resolver essa fragilidade.]]></description>
			<content:encoded><![CDATA[<p>Quando se trata de Extreme Programming, arquitetura de software é um assunto polêmico. Vários críticos da metodologia afirmam que não existem atividades para o estabelecimento da arquitetura de software &#8211; constituindo assim seu &#8220;calcanhar de Aquiles&#8221;. Por outro lado, seus praticantes respondem que a arquitetura é representada pela Metáfora Sistêmica (<a href="http://c2.com/xp/SystemMetaphor.html">System Metaphor</a>), criada durante o Jogo de Planejamento (Planning Game). Mas adeptos e críticos concordam em uma coisa: existe muito pouca informação sobre como obter uma boa Metáfora Sistêmica.</p>
<p>A prática da Metáfora Sistêmica é uma forma de explicar a arquitetura lógica através de uma analogia familiar tanto aos desenvolvedores quanto aos usuários. Até aí, ótimo! O maior problema é como conseguir uma boa metáfora. Das 190 páginas de <a href="http://www.pearsonhighered.com/educator/academic/product/0,3110,0321278658,00.html">&#8220;Extreme Programming Explained&#8221;</a>, <a href="http://en.wikipedia.org/wiki/Kent_Beck">Kent Beck</a> endereça somente duas delas para explicar o que é a Metáfora Sistêmica e deixa uma lacuna real em como atingí-la. <a href="http://martinfowler.com/">Martin Fowler</a>, um adepto não radical de XP, afirma em <a href="http://www.amazon.com/Extreme-Programming-Examined-Giancarlo-Succi/dp/product-description/0201710404">&#8220;Extreme Programming Examined&#8221;</a> que, apesar da Metáfora Sistêmica ter funcionado bem para o projeto C3 (descrito no mesmo livro), ele próprio não faz a mínima idéia em como explicar a forma de obtê-la. Ainda na série XP da Addison-Wesley, os autores de <a href="http://www.amazon.com/Extreme-Programming-Examined-Giancarlo-Succi/dp/0201710404">&#8220;Extreme Programming Examined&#8221;</a> declaram que a metáfora &#8220;é uma lacuna real no XP e que os XPmistas precisam resolvê-la&#8221; (desculpe, traduzimos &#8220;XPers&#8221; por &#8220;XPmistas&#8221;).</p>
<p>Com a polêmica carregada pela Metáfora Sistêmica e pelo fato de boa parte dos programadores praticantes de XP afirmarem que constroem software de sucesso mesmo sem tal metáfora, Kent Beck comentou publicamente que cogita a hipótese de remover esta prática da metodologia. No <a href="http://www.xprogramming.com/">site de Ron Jeffries</a> (outro guru radical do XP), arquitetura e desenho chegam a ser tratados com um certo <a href="/documents/dearch/xp2/Mysterious%20Stories.htm">tom de deboche</a>.</p>
<p>Por ser um dos mais proeminentes métodos de desenvolvimento da atualidade, existem muitas propostas para preencher a lacuna arquitetural do XP. A seguir, citaremos algumas.</p>
<ul>
<li>Estórias do Desenvolvedor (Developer stories) é um prática proposta no artigo &#8220;<a href="http://www.springerlink.com/index/xx7gn7588340831n.pdf">Architecture and Design in eXtreme Programming</a>&#8221; dos pesquisadores da <a href="http://www.aau.dk/">Aalborg Universitet</a>. O principal objetivo dessas estórias é introduzir um planejamento arquitetural ao XP. É uma abordagem é razoavelmente simples e, ao mesmo tempo, apresenta razoável eficiência no tratamento de requisitos de qualidade.</li>
<li>Pesquisadores da <a href="http://www.mcs.vuw.ac.nz/">Universidade de Wellington</a>, na Nova Zelândia e da <a href="http://www.carleton.ca/">Univerdade de Carleton</a>, no Canadá, propõem, através de uma <a href="http://homepages.mcs.vuw.ac.nz/~rkhaled/papers/xpm4remix.pdf">abordagem semiótica</a>, técnicas para desenvolver e avaliar a Metáfora Sistêmica. A <a href="http://pt.wikipedia.org/wiki/Semiótica">Semiótica</a>, mesmo parecendo um termo complicado para alguns, é o estudo formal dos sinais. Ao contrário do nome, a proposta desses pesquisadores é bem simples. Contudo não encontramos referências de sua aplicação na indústria.</li>
<li>O <a href="http://www.sei.cmu.edu/">SEI</a> publicou um <a href="http://www.sei.cmu.edu/publications/documents/04.reports/04tn036.html">artigo</a> descrevendo possíveis aplicações de seus métodos arquiteturais em projetos XP. Sem dúvida, o uso dos consagrados <a href="http://www.sei.cmu.edu/architecture">métodos</a> do SEI oferece uma forte e excelente abordagem para arquiteturas dos projetos XP. Entretanto o uso intensivo dos métodos conforme descrito no artigo pode desagradar a alguns agilistas. Mas possivelmente vale a adaptação. A tempo: postamos recentemente um pequeno <a href="http://dearchitectura.wordpress.com/2008/11/04/combinando-qaw-com-rup-e-xp/">texto comentando sobre a aplicação do QAW em projetos XP e RUP</a>.</li>
<li>Martin Fowler, apesar de não apresentar nenhuma teoria inédita, no artigo &#8220;<a href="http://martinfowler.com/articles/designDead.html">Is Design Dead?</a>&#8220;, aconselha a não ignorar aspectos arquiteturais já conhecidos e, já no início do projeto, começar com uma arquitetura que aparenta ser necessária. E, em seguida, mesmo que pareça uma contradição ao princípio <a href="http://en.wikipedia.org/wiki/You_Ain't_Gonna_Need_It">YAGNI</a>, evoluir a arquitetura simplificando-a ou adicionando complexidades na medida da necessidade.</li>
<li>A <a href="http://www.ambysoft.com/books/agileModeling.html">Modelagem Ágil</a>, apresentada no livro de Scott Ambler, pode ser utilizada em aderência ao processo do XP e traz alguns poucos (mas bons) conselhos em como desenvolver a metáfora sistêmica de forma a representar uma arquitetura inicial. Vale a pena também consultar a idéia de <a href="http://www.agilemodeling.com/essays/agileArchitecture.htm">Arquitetura Inicial Ágil</a> do Ambler.</li>
<li>David West propõe a <a href="http://www.agilealliance.org/system/article/file/968/file.pdf">Arquitetura Mandala</a>, um método exótico para tratar a questão arquitetural no XP. Programadores místicos devem simpatizar com o nome.</li>
</ul>
<p>Os valores e a filosofia de Extreme Programming visam de uma forma &#8220;extrema&#8221; a simplicidade e a acomodação das mudanças. Mudanças são de fato inevitáveis. Mas, mesmo acreditando nos princípios ágeis, devemos admitir que uma reestruturação arquitetural é uma atividade cara e de alto risco. Um esforço de investigação arquitetural um pouco maior que a indicada pelo XP &#8220;puro&#8221; pode minimizar boa parte dos riscos &#8211; não vale a pena ignorar aspectos estruturais já conhecidos no início do projeto. As abordagens indicadas podem ser um bom caminho para preencher a lacuna da arquitetura de software no XP. Resta ainda a questão: basta uma boa metáfora sistêmica para termos uma arquitetura completa?</p>
<p>Para obter mais visões críticas sobre como a arquitetura pode ser desenvolvida em projetos XP, sugerimos as seguintes referências:</p>
<ul>
<li>&#8220;<a href="http://www.agile-itea.org/public/deliverables/ITEA-AGILE-D2.14_v1.0.pdf">Software Architecture and eXtreme Programming</a>&#8221; de Andrew Wils e Stefan Van Baelen e</li>
<li>&#8220;<a href="http://reports-archive.adm.cs.cmu.edu/anon/isri/CMU-ISRI-03-103.pdf">The eXtreme Programming (XP) Metaphor and Software Architecture</a>&#8221; de James Herbsleb, David Root e James Tomayko da CMU.</li>
<li>&#8220;<a href="http://www.agilealliance.org/system/article/file/968/file.pdf">Metaphor, Architecture, and XP</a>&#8221; de David West (mesmo que você não seja assim tão místico).</li>
<li><a href="http://www.theregister.co.uk/2005/09/11/beck_on_xp_architecture/">Entrevista de Kent Beck publicada em 2005 no The Register</a> a respeito da segunda edição de &#8220;Extreme Programming Explained&#8221;.</li>
<li><a href="http://www.agilemodeling.com/essays/agileArchitecture.htm">&#8220;Agile Architecture: Strategies for Scaling Agile Development&#8221;</a> por Scott Ambler.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.arkhi.com.br/2008/12/12/existe-arquitetura-de-software-em-projetos-xp/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Desmistificando a Decomposição em Camadas</title>
		<link>http://blog.arkhi.com.br/2008/10/26/desmistificando-a-decomposicao-em-camadas/</link>
		<comments>http://blog.arkhi.com.br/2008/10/26/desmistificando-a-decomposicao-em-camadas/#comments</comments>
		<pubDate>Sun, 26 Oct 2008 00:31:12 +0000</pubDate>
		<dc:creator>Eros Viggiano</dc:creator>
				<category><![CDATA[arquitetura de software]]></category>
		<category><![CDATA[antipattern]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[camadas]]></category>
		<category><![CDATA[decomposição]]></category>
		<category><![CDATA[layers]]></category>
		<category><![CDATA[pattern]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://dearchitectura.wordpress.com/?p=161</guid>
		<description><![CDATA[O tema &#8220;camadas&#8221; é recorrente na arquitetura de software: muitas vezes apontado como a solução para todo tipo de software e recentemente criticado como anti-pattern. Para os iniciantes e leigos, a arquitetura de software se resume na divisão do software em camadas e sua associação a uma &#8220;pilha&#8221; de tecnologias.
O padrão &#8220;Layers&#8221;
O padrão (pattern) &#8220;Layers&#8221;, [...]]]></description>
			<content:encoded><![CDATA[<p>O tema &#8220;camadas&#8221; é recorrente na arquitetura de software: muitas vezes apontado como a solução para todo tipo de software e recentemente criticado como anti-pattern. Para os iniciantes e leigos, a arquitetura de software se resume na divisão do software em camadas e sua associação a uma &#8220;pilha&#8221; de tecnologias.</p>
<p><strong>O padrão &#8220;Layers&#8221;</strong></p>
<p>O padrão (pattern) &#8220;Layers&#8221;, reconhecido inicialmente em <a title="POSA 1" href="http://www.amazon.com/Pattern-Oriented-Software-Architecture-System-Patterns/dp/0471958697/ref=pd_sim_b_3">POSA 1</a>, identifica o contexto no qual um sistema requer decomposição e se endereça a um ou mais dos seguintes problemas, conforme sintetizado por <a href="http://www.ibm.com/developerworks/rational/library/4699.html">Eeles</a>:</p>
<ul>
<li>Complexidade do sistema dificulta sua inteira compreensão.</li>
<li>Baixa manutenibilidade &#8211; uma alteração gera uma série de impactos.</li>
<li>Elementos menos estáveis não estão isolados.</li>
<li>Dificuldade em identificar elementos mais reusáveis.</li>
<li>Construção de um sistema por diversos times com habilidades distintas.</li>
</ul>
<p>Tal como no conhecido <a href="http://pt.wikipedia.org/wiki/Modelo_OSI">Modelo OSI</a>, o padrão &#8220;Layers&#8221; sugere um particionamento com diferentes níveis de abstração. Camadas superiores são clientes das camadas inferiores e estas não tem dependências das primeiras.</p>
<p>As principais estratégias para a decomposição em camadas são baseadas em responsabilidadea e reuso. Também é possível a combinação dessas estratégias em outras, como a modelagem de camadas multidimensionais.</p>
<p><strong>Estratégia &#8220;Camadas com base em responsabilidades&#8221;</strong><br />
A estratégia com base em responsabilidades é possivelmente a mais popular, onde as responsabilidades de um sistema são isoladas umas das outras. Uma abordagem muito comum é a segmentação em camadas de apresentação, negócios e integração. A flexibilidade e manutenibilidade são os conceitos chave para esta estratégia.</p>
<p>Imagine que, para uma aplicação originalmente com interface web, tenha sido identificada a posterior necessidade de acesso por dispositivos móveis. Sem modificar as demais camadas, é possível oferecer uma camada de apresentação com suporte a tais dispositivos. Outra situação possível é a troca da implementação da camada de apresentação (ex: integração com mainframe para SGBD).</p>
<p>Esta estratégia também permite que indivíduos de habilidades distintas atuem em suas respectivas áreas de competência (ex: programadores web e integradores).</p>
<p><strong>Estratégia &#8220;Camadas com base no reuso&#8221;</strong><br />
Geralmente derivada de uma diretriz de arquitetura corporativa, a estratégia com base no reuso sugere o agrupamento de componentes em camadas conforme o seu grau de utilização.</p>
<p>Um exemplo típico de estratificação por reuso,  citado por <a title="Software Reuse" href="http://www.amazon.com/Software-Reuse-Architecture-Organization-Business/dp/0201924765/ref=pd_bbs_sr_1?ie=UTF8&amp;s=books&amp;qid=1224979983&amp;sr=8-1">Jacobson</a>, é o conjunto das camadas &#8220;Base&#8221;, &#8220;Específica para Negócios&#8221; e &#8220;Específica para Aplicativos&#8221;. No livro <a title="DDD" href="http://domaindrivendesign.org/books/index.html#DDD">Domain Driven Design</a>, Evan também comenta sobre a separação das camadas e usa os termos &#8220;User Interface Layer&#8221;, &#8220;Application Layer&#8221;, &#8220;Domain Layer&#8221; e &#8220;Infrastructure Layer&#8221;.</p>
<p>A óbvia vantagem nessa estratégia é o avançado grau de reuso de componentes. Permite também, com facilidade, o provimento e a catalogação de serviços especializados.</p>
<p>Estratégia Camadas multidimensionais<br />
Combina as estratégias baseadas em responsabilidade e reuso.</p>
<p><strong>Mitos &#8220;modernos&#8221; (e ingênuos) sobre camadas arquiteturais</strong><br />
Recentemente temos percebido um agradável movimento a favor da simplicidade das arquiteturas de software. O uso de múltiplas camadas como pouca distinção de utilidade entre elas tem gerado nomes como &#8220;arquitetura lasanha&#8221; (ressaltamos que arquiteturas são muito mais que estratificação em camadas, isto é um abuso). Simplicidade é ótimo! Mas, com devido respeito a quem cunhou o termo, o que se deve combater são as arquiteturas ritualísticas, obras criadas por indivíduos que, com pouco conhecimento em arquitetura, não exploram adequadamente o problema e que acreditam que arquiteturas de referência encontradas por aí a tudo se aplicam. O próprio contexto do pattern &#8220;Layers&#8221; define a natureza do problema no qual ele se aplica.</p>
<p>Muitas vezes, pouco se leva em conta as forças que regem a definição de um arquitetura. Por exemplo, suponhamos a necessidade de um software simples de cadastro sem um contexto de reuso e a ser desenvolvimento por apenas um programador. Possivelmente, o &#8220;Layers&#8221; nessa situação seria um exagero. Usar o padrão (não somente o &#8220;Layers&#8221;, qualquer um) para sem considerar todas as forças envolvidas e, principalmente, o problema que está sendo endereçado é inútil e prejudicial. Nesse caso, seria mais uma bela solução para um problema que não existe.</p>
<p>Boas referências sobre decomposição em camadas e assuntos correlatos podem ser encontradas em:</p>
<ol>
<li><a href="http://www.amazon.com/Pattern-Oriented-Software-Architecture-System-Patterns/dp/0471958697/ref=pd_sim_b_3">&#8220;Pattern-Oriented Software Architecture Volume 1: A System of Patterns&#8221;</a>, Frank Buschmann e outros.</li>
<li><a href="http://www.ibm.com/developerworks/rational/library/4699.html">&#8220;Layering Strategies&#8221;</a>, Peter Eeles</li>
<li><a href="http://martinfowler.com/eaaCatalog/serviceLayer.html">&#8220;Service Layer&#8221;,</a> <a href="http://martinfowler.com/eaaCatalog/domainModel.html">&#8220;Domain Model&#8221;</a> e <a href="http://www.martinfowler.com/bliki/AnemicDomainModel.html">&#8220;Anemic Domain Model&#8221;</a>, Martin Fower</li>
<li><a href="http://www.amazon.com/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201633612">&#8220;Design Patterns&#8221;</a>, GoF</li>
<li><a href="http://www.informit.com/store/product.aspx?isbn=0201325713">&#8220;Applied Software Architecture&#8221;</a>, Christine Hofmeister, Robert Nord e Dilip Soni</li>
<li><a href="http://msdn.microsoft.com/pt-br/library/aa905336.aspx">&#8220;Arquitetura pragmática: camadas&#8221;</a>, Ted Neward</li>
<li><a href="http://www.ambysoft.com/essays/classTypeArchitecture.html">&#8220;Class Type Architecture: A Strategy for Layering Software Applications&#8221;</a>, Scott Ambler</li>
<li><a href="http://www.javadude.com/articles/layering.html">&#8220;Layering Applications&#8221;</a>, Scott Stanchfield, JavaDude.com</li>
</ol>
<p>Para reflexão: &#8220;Ritual é o começo do caos&#8221;, Philippe Kruchten, em <a title="The Tao of the Software Architect" href="http://www.sei.cmu.edu/architecture/essays.html#tao">&#8220;The Tao of the Software Architect&#8221;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.arkhi.com.br/2008/10/26/desmistificando-a-decomposicao-em-camadas/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
