

<?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>Rodrigo Kumpera Weblog &#187; Arquitetural Design</title>
	<atom:link href="http://www.kumpera.net/blog/index.php/category/scalability/arquitetural-design/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.kumpera.net/blog</link>
	<description>Meus achados sobre tecnologia</description>
	<lastBuildDate>Thu, 14 Jul 2011 15:45:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Lugar errado, problema errado</title>
		<link>http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/#comments</comments>
		<pubDate>Sat, 12 May 2007 02:19:05 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Arquitetural Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/</guid>
		<description><![CDATA[
Os comentários do Phillip no blog do Vitor só me fazem rir de alguém considerar o prevayler para nada que brinquedos. Digo isso por duas razões, pela experiência dos projetos que passei e pelo fato de Java ser uma das piores linguagens possíveis para se implementar prevalencia. Pelos projetos eu eu passei, sempre existiram requisitos [...]]]></description>
			<content:encoded><![CDATA[<p>
Os <a href="http://www.jroller.com/page/vfpamp?entry=schema_evolution_e_retrocompatibilidade_com">comentários do Phillip no blog do Vitor</a> só me fazem rir de alguém considerar o prevayler para nada que brinquedos. Digo isso por duas razões, pela experiência dos projetos que passei e pelo fato de Java ser uma das piores linguagens possíveis para se implementar prevalencia. Pelos projetos eu eu passei, sempre existiram requisitos que inviabilizam seu uso e quanto a Java, bom, basta olhar para o lado para entender.
</p>
<p>
Curiosamente volume de dados nunca foi a razão pelo qual o prevayler não tinha razão. Uma delas foi <strong>latência</strong> e tempo médio de resposta, mas como pode isso ocorrer se o prevayler é tão super mais rápido nas consultas? Simples, o enorme uso de heap tornava o tempo de garbage collection proibitivo, um SGBD usa memória de maneira muito mas eficiente sob o viés do tempo para dar manutenção nela, esse sistema terminou com uma JVM usando 64Mb e a base toda dentro do cache do banco de dados. Outro problema foi <strong>confiabilidade</strong>, o log do prevayler não é protegido de <em>partial writes</em> e usa <em>statement based logging</em>, que não permite recuperação parcial, então se tua controladora corromper o meio do teu log, você se lascou. Porém o maior problema do prevayler é o desenvolvimento com equipes distribuídas ou de médio porte em uma estrutura matricial de projetos, isto é, o esforço de coordenar schema evolution é massacrante, não existe como compartilhar facilmente uma base de dados e a integração entre projetos é infernal.
</p>
<p>
Quanto ao fato de Java ser uma péssima escolha, primeiro pelo fato de não ser uma linguagem baseada em imagem, como smalltalk ou factor, na qual salvar a imagem da heap toda é tão difícil quanto chamar um único método, você não tem que se preocupar com criar toneladas de Commands e transações com rollback são possíveis de ser criadas usando STM(<em>Software Transactional Memory</em>) ou simplesmente alguns <em>become()</em>. Outro problema é que criar buscas complexas com Java é um desastre, muito difícil de bater álgebra relacional ou simplesmente SQL nisso, nesse ponto linguagens funcionais dão um show no Java que beira a humilhação, aplicar predicados e transformações sobre coleções, criando e processando tuplas é super simples, é arroz-com-feijão.
</p>
<p>
No geral, eu vejo o prevayler com um brinquedo educacional para se aprender sobre serialização e só, usar profissionalmente não é interessante do aspecto que vai significar muito provavelmente trabalhar em projetos desintessantes ou mentalmente castrantes. Klaus e companhia que me desculpem, mas esse tipo de problema eu passo adiante, prefiro ficar com os mais divertidos e interessantes.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/05/11/lugar-errado-problema-errado/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Utilidade da configuração programática</title>
		<link>http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/#comments</comments>
		<pubDate>Mon, 16 Apr 2007 14:23:02 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Arquitetural Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/</guid>
		<description><![CDATA[
Parece que configuração programática ficou em voga esses tempos na comunidade Java. A razão não me é muito clara, afinal, todo bom framework deve permitir ser usado de tal forma, porém não de maneira restritiva. Posso ter a opinião viciada nesse caso, mas acredito que configuração deve possuir sua DSL própria e a parte programática [...]]]></description>
			<content:encoded><![CDATA[<p>
Parece que configuração programática ficou em voga esses tempos na comunidade Java. A razão não me é muito clara, afinal, todo bom framework deve permitir ser usado de tal forma, porém não de maneira restritiva. Posso ter a opinião viciada nesse caso, mas acredito que configuração deve possuir sua DSL própria e a parte programática tem sentido apenas quando seu uso automatiza novas tarefas ou, de alguma forma, melhora sua usabilidade pelos desenvolvedores.
</p>
<p>
O maior argumento contra utilizar arquivos de configuração nunca foi muito o formato, seja xml ou qualquer outro, mas sim a quantidade abusiva de informação necessária para satisfazer o framework. Convenhamos, boa parte do tempo vamos usar apenas um conjunto pequeno dos recursos oferecidos e de uma maneira comum. Essas funcionalidades e interações recorrentes, devem possuir uma notação mais sucinta &#8211; o configuração deve ser ser otimizada para o uso comum. Para esse comportamento temos por uso de valores padrão inteligentes.
</p>
<p>
Porem, pode ser feito ainda mais. Neste caso, o framework assume que uma série de interações e padrões de uso serão utilizados e o usuário apenas configura aquilo que for diferente. Por esta maneira de trabalho, temos aquilo que chamamos por configuração por convenção. Juntando com valores padrão inteligentes, configuração deixa de ser uma preocupação, um martírio, para ser apenas um detalhe do projeto &#8211; que é seu devido lugar.
</p>
<p>
Em um cenário como esse, existe valor em expor uma extensa camada programática de acesso à configuração? Pelo resultado encontrado em vários projetos, sim, definitivamente existe, mas longe de ser uma boa ferramenta para substituir os arquivos. Primeiro, acho importante definir quais tipos de configuração existe em um framework e como isso afeta o valor ao abrir as portas para demais programadores.
</p>
<p>
Temos a Configuração de Inicialização, que pode ser vista como uma receita de bolo, que depois de utilizada, é descartada. O Hibernate é um bom exemplo, a configuração informada é utilizada para construir a SessionFactory e depois jogada fora. Outra forma de configuração é o Repositório de Parâmetros, onde toda configuração é armazenada de maneira que possa ser consultada em tempo de execução, o exemplo aqui fica por conta do Struts2, que transforma toda sua configuração em um modelo de objetos que representam os elementos envolvidos no processamento de uma requisição.
</p>
<p>
Das utilidades para configuração programática, destaco transformação, pois é aplicável no caso de Configuração de Inicialização. Transformação, como o nome sugere, altera a configuração já existente em algo mais útil, como colocar todas collections com lazy-loading; ou a partir de dados externos cria novos elementos, por exemplo, mapeando automaticamente todo um pacote de classes.
</p>
<p>
Quando existe um repositório, as possibilidades são maiores, o mecanismo de transformação pode ser aplicado na inicialização ou durante a execução. Para estender o comportamento do repositório utilizasse normalmente o padrão de projeto Plugin, para a descoberta do interessado, caso sejam muito, utiliza-se Chain-of-Responsibility para coordenar as transformações. O Struts2 funciona desta forma, é possível contribuir plugins que são responsáveis por instanciar as actions ou recuperar o mapeamento de um path. É possivel, por exemplo, descobrir quais actions existem no sistema e criar o mapeamento automaticamente.
</p>
<p>
Configuração programática é muito útil, porém não deixa de ser apenas uma ferramenta e, como tal, não deve ser o principal valor que um framework tem a oferecer, pois, a rigor, não trata do problema proposto a ser resolvido. Um framework MVC, por exemplo, deve ter como valores auxiliar no desenvolvimento de sites, dos quais configuração não é uma benéfice, mas sim um ardor maior ou menor para seu usuário.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/04/16/utilidade-da-configuracao-programatica/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>DSLs vão ter o mesmo fim que AOP?</title>
		<link>http://www.kumpera.net/blog/index.php/2007/01/06/dsls-vao-ter-o-mesmo-fim-que-aop/</link>
		<comments>http://www.kumpera.net/blog/index.php/2007/01/06/dsls-vao-ter-o-mesmo-fim-que-aop/#comments</comments>
		<pubDate>Sat, 06 Jan 2007 04:02:38 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Arquitetural Design]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2007/01/06/dsls-vao-ter-o-mesmo-fim-que-aop/</guid>
		<description><![CDATA[
 Me dei conta hoje que DSLs sofrem do mesmo mal que AOP. Todas palestras e artigos cometem o pecado de sempre surrar um único exemplo. No caso de Aspect Oriented Programming, abusam dos exemplos envolvendo logging. Sem mencionar que de fato sempre estão a falar de tracing! Com DSLs vejo a mesma tendencia acontecer [...]]]></description>
			<content:encoded><![CDATA[<p>
 Me dei conta hoje que DSLs sofrem do mesmo mal que AOP. Todas palestras e artigos cometem o pecado de sempre surrar um único exemplo. No caso de Aspect Oriented Programming, abusam dos exemplos envolvendo logging. Sem mencionar que de fato sempre estão a falar de tracing! Com DSLs vejo a mesma tendencia acontecer em torno de configuração e fico preocupado. Diferente da outra tecnologia, acredito que Domain Specific Languages são uma ferramenta muito importante em um futuro não muito distante</p>
<p>
 Antes de tudo, tenho que concordar com <a href="http://fragmental.com.br/blog/?p=292">este post do Phillip </a> que DSLs são a bola da vez, e todos tem seus olhos virados para ver se rende alguma coisa. Mas o problema hoje não é a falta de ferramentas e sim a um bom playground para experimentarmos com o assunto. Construir, customizar e transformar linguagens não é nada facil e essa é a grande barreira para começarmos a ver avanços.
</p>
<p>
 Mas voltando ao embrólio de como se apresenta o assunto ao grande público. Todos estão falando  o tempo todo sobre como configuração é um problema a ser resolvido por linguagens de domínio. Até o Martin Fowler comete essa gafe em sua <a href="http://www.infoq.com/presentations/domain-specific-languages">palestra na JAOO 2006</a>! O problema é o mesmo que logging, eu diria, representa nenhum risco a complexidade de um projeto. Quantos realmente já tiveram problemas relacionados a dificuldade de colocar logging em uma aplicação? Configuração idem.
</p>
<p>
 Além disso, acho que corremos na mesma direção do fiasco que foram as linguagens de quarta geração, as malditas 4GLs que tanto odiamos. Não vamos criar mini linguagens para o cliente poder sair customizando seu sistema, principalmente porque ele não saberia fazer isso de qualquer maneira. Criaremos atalhos para os desenvolvedores na forma de linguagens simples, limitadas e focadas em tarefas muito específicas; ou via customização da linguagem carro chefe do projeto.
</p>
<p>
 DSLs como customizações é uma coisa que já vemos acontecer, via linguagens com suporte à macros (scheme, lisp, erlang*), ou com abuso do mecanismo de metaclasses &#8211; um exemplo, um pouco pobre, é RoR e ActiveRecord, que customiza Ruby para facilitar manipulação de banco, pobre pois poderia melhorar em muito a sintaxe em favor da manipulação de dados.
</p>
<p>
 Enfim, acredito que veremos muito ainda sobre esse assunto, principalmente confusão e palestras que falam de configuração. Logo deveremos ter acesso a linguagens faceis de serem customizadas e que permitam muita experimentação no assunto. Foi essa experimentação que permitiu AOP ganhar momento com Java e ser assunto de piada entre C++.
</p>
<p> *erlang não ter macros propriamente ditas, mas suporte parser transformers que são capazes de fazer o mesmo trabalho.</p></p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2007/01/06/dsls-vao-ter-o-mesmo-fim-que-aop/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Integração entre sistemas- Inferno com letra maiúscula.</title>
		<link>http://www.kumpera.net/blog/index.php/2006/07/11/integracao-entre-sistemas-inferno-com-letra-maiuscula/</link>
		<comments>http://www.kumpera.net/blog/index.php/2006/07/11/integracao-entre-sistemas-inferno-com-letra-maiuscula/#comments</comments>
		<pubDate>Tue, 11 Jul 2006 04:22:03 +0000</pubDate>
		<dc:creator>kumpera</dc:creator>
				<category><![CDATA[Arquitetural Design]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[project management]]></category>

		<guid isPermaLink="false">http://www.kumpera.net/blog/index.php/2006/07/11/integracao-entre-sistemas-inferno-com-letra-maiuscula/</guid>
		<description><![CDATA[Simples assim, integração entre sistemas é um Inferno, é uma fonte enorme e interminavel de dor de cabeça. Hoje existe tecnologia disponivel para facilitar isso, mas parecer que a maioria ainda pensa nissa da pior forma possivel. Vamos lá, vou ser um pouco assertivo para deixar uma coisa bem clara:
Compartilhar dados é estupido, exponha o [...]]]></description>
			<content:encoded><![CDATA[<p>Simples assim, integração entre sistemas é um <strong>Inferno</strong>, é uma fonte enorme e interminavel de dor de cabeça. Hoje existe tecnologia disponivel para facilitar isso, mas parecer que a maioria ainda pensa nissa da pior forma possivel. Vamos lá, vou ser um pouco assertivo para deixar uma coisa bem clara:</p>
<p align="center"><strong>Compartilhar dados é estupido, exponha o comportamento do seu sistema.</strong><br />
Isso mesmo, avisar os desenvolvedores da outra equipe para eles usarem alguns selects que sua equipe definiu para fazer a integração é uma idéia <strong>horrivel</strong>. Os dados são a parte menos expressiva e ao mesmo tempo a mais sensivel do sistema.</p>
<p>Todo sistema depois que cresce além do trivial embute muito valor semântico aos dados que existem no banco, se você integrar nesse nível todos vão precisar saber isso ao risco de fazer ou ver a coisa errada. Ainda para piorar, essa técnica vira uma barreira à evolução, você não pode alterar o schema e continuar com suas alterações até que todos sistemas relacionados sejam também atualizados. Moral da história, integração feita no banco de dados é como se em um casamento os noivos trocassem pedaços de víceras em vez de alianças.</p>
<p>Tudo bem, já disse que é ruim, mas como fazer isso então? Crie uma série de serviços que expoam a funcionalidade pública do seu sistema e deixe o resto por conta da criatividade das outras equipes, elas vão agradecer. Isso normalmente significa lançar mão de usar EJB, CORBA, RMI e, principalmente, Web Services. Esse uso de Web Services é o que eu classifico por SOA pragmático, aquele que existe por algum propósito justo, existe para avisar e mostrar ao mundo as coisas que seu sistema pode fazer, como ele se comporta.<br />
As vezes é meio chocante ver que com todo esse marketing feito por todos vendedores empurrando SOA não teve o menor impacto positivo. A parte que sofre mais parece ser a que menos adota esse tipo de tecnologia. Mas enfim, espero que esse post tenha servido pelo menos para avisar do desastre anunciado que é compartilhar as entranhas do seu sistema com os demais.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.kumpera.net/blog/index.php/2006/07/11/integracao-entre-sistemas-inferno-com-letra-maiuscula/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

