<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Sergio Taborda</title>
	
	<link>http://sergiotaborda.javabuilding.com</link>
	<description>Construindo Aplicações com Java</description>
	<lastBuildDate>Fri, 30 Jul 2010 02:18:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.3</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/javabuilding/sergiotaborda" /><feedburner:info uri="javabuilding/sergiotaborda" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>A mitica coleção de práticas</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/6Xbb30vYzCk/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/07/a-mitica-colecao-de-praticas/#comments</comments>
		<pubDate>Fri, 30 Jul 2010 02:09:33 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Planejamento]]></category>
		<category><![CDATA[Quotidiano]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[metodologias]]></category>
		<category><![CDATA[mitos]]></category>
		<category><![CDATA[projeto]]></category>
		<category><![CDATA[scrum]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1083</guid>
		<description><![CDATA[É comum ouvir as pessoas defenderem que não é necessário seguir uma disciplina metodológica e que podemos, e devemos, apenas pegar as "boas práticas" das disciplinas que ha por ai e formar a nossa própria metodologia. Este dispare tem que acabar e tem que sair da cabeça das pessoas de uma vez por todas. ]]></description>
			<content:encoded><![CDATA[<p>Hoje em dia vivemos a tempestade das disciplinas metodológicas.  Chamo de disciplinas porque elas são baseada em conceitos morais antes de mais nada tal como uma arte marcial. Disciplina aqui significa o rigor da mente sobre a matéria, e moral , significa o controle do intelecto sobre o desejo. Não estamos falando de Bem e Mal, nem de teologia. O ponto é que se descobriu ha pouco tempo ( mais ou menos 20 anos) que os processos prescritivos e vazios de livros do tamanho da biblia ( ou maiores) não eram produtivos no mundo do software. E com produtivos quero dizer : que produziam software verdadeiro, em tempo habil, funcionando e que as pessoas realmente usam.</p>
<p>O fracasso dos processos stage-gate usados nas outras engenharias é hoje óbvio a qualquer um que tenha tido o mínimo de interesses para ler sobre o assunto ou a hombridade para olhar os resultados dos projetos em que participou nestas últimos décadas. O conceito de que projetos grandes e complexos de software podem ser tratados da mesma forma que projetos de engenharia civil ou aeronáutica ainda assombra muitos projetos hoje em dia, mas uma nova geração de desenvolvedores está entendendo que esse não é o caminho da força. O caminho da força é exatamente a disciplina e o rigor mental de um conjunto de pessoas trabalhando para e por um mesmo propósito. Os desenvolvedores finalmente entendem que sem conversar com o cliente nada acontece, ou pior, más coisas acontecem muito freqüentemente.  Conversar é a chave para um bom software.</p>
<p>Mas ainda existem alguns achando que tudo isto é magia e jogo de espelhos e fumaça&#8230; Entre estes existem os que enfim são incapazes de raciocinar fora da caixinha onde vivem, mas existem bastantes que ainda pensam assim por falta de lhes ser mostrado um melhor caminho, ou por descrédito de já terem ouvido esta historia antes ou terem experimentado e falhado. Esta atitude é a mesma da pessoa que pensa que se o homem da TV engole facas, ela também pode. E ao tentar, e se cortar toda, acha que o homem da TV é uma fraude, um engano e uma estupidez. O fato é que é a esta pessoa falta a destreza para entender que para chegar naquele nivel é preciso treino, esforço, compreensão dos perigos e sobre tudo : profissionalismo e dedicação.</p>
<p>Como saberão as disciplinas metodológicas com Lean, Kanban, Scrum, XP e outros da linha ágil, propõem o seguimento de um conjunto de práticas. Algumas ainda propoem conjuntos de regras, cerimónias, mecanismo de temporização e papeis que as pessoas devem desempenhar. Isto é o equivalente, nas artes marciais ao ensinamento dos golpes fisicos. Como, onde e quando colocar o braço, as pernas, a cabeça, etc&#8230;  como usar a espada, a vara, a faca, etc &#8230; Mas os golpes não são a razão da arte marcial, são apenas a parte observável. Aquilo que é a essência das artes marciais está no <em>porquê </em>daqueles movimentos.  Da mesma forma, a essência das disciplinas metodologias está no porquê das mecanicas, regras, papeis e cerimónias. Em ultima análise existe uma filosofia que guia o desenvolvimento e uso destas coisas observáveis.  Se você é um curioso destas coisas, provavelmente já notou que a maior parte das práticas já existia antes da era ágil. O murro também existia antes das artes marciais. Isso não as torna menores. A vantagem não está no murro, mas no como, quando, onde e por quê usá-lo. O mesmo para as práticas.</p>
<p>A existência de uma filosofia que premeira todas as práticas de um disciplina metodológica é a grande diferença para os processos clássicos (eu disse clássicos, não disse tradicionais) baseados no stage-gate como o Unified Process e seus derivados. Estes processos se baseiam em metáforas e analogias entre o mundo do software e outros mundos, especialmente os das engenharias civil e aeronáutica. Repare que não há uma filosofia ou disciplina inerente a estas engenharias. Basicamente existe uma matemática e uma ordem de dependência e precedência entras atividades. Nada mais. O fato de que a casa se constrói de baixo para cima,  é porque simplesmente as fundações são feitas no chão, não no ar. E todo o resto vai em cima disso. É simples. É sempre assim, e é simplesmente óbvio. Não há uma disciplina envolvida, porque simplesmente não ha escolhas a serem feitas.</p>
<p>As disciplinas metodológicas foram criadas a partir do conceito de que construir software  é uma atividade complexa. Mais complexa que engenharia civil e aeronautica e que por isso, é necessário que siga outro tipo de princípios e regras. Mas quais regras ? Ninguém sabe. Esta que é a mudança de paradigma que é dificil explicar e demonstrar para alguém que não entende que estamos falando de disciplinas e não de um bando de regras. Isto não é um jogo onde cada um aplica as regras que mais gosta. Tente fazer isso com uma arte marcial e sairá machucado.  Ninguém são, é louco, para fazer isso. Então, porque as pessoas insistem em pensar que podemos escolher um conjunto de mecanismos, ou regras, ou cerimônias das disciplinas ágeis e simplesmente criar nosso próprio processo.  Atente, com atenção, às palavras da ultima frase. As pessoas querem escolher <em>regras </em>para criar seu próprio <em>processo</em>. É só isso que um processo é: um conjunto de regras. E quem pensa assim ainda não entendeu que os processos não funcionam. Não no mundo da construção de software.  O Mundo está indo para as disciplinas metodologicas e deixando para trás o conceito de processo de produção, mas estas pessoas insistem em querer criar um processo usando as &#8220;melhores regras&#8221; que estas metodologias usam. É como querer criar uma arte marcial usando os melhores golpes das artes marciais. É possível ? É. Mas um conjunto de golpes é uma arte marcial ? Não. É apenas marcial, não uma arte. Falta personalidade, falta alma, moral, disciplina.  Falta o por quê, a razão. E principalmente falta o Objetivo.</p>
<p>Porque não podemos usar um quadro kanban junto com um daily meating e não usar Scrum  ? Porque não funciona. Não está a disciplina. O daily meating é vazio sem a responsabilidade partilhada que o Scrum procura. Não ha razão para conversar, em conjunto, sobre as atividades de todos, se não ha unidade.  Porque não podemos usar planning poker num projeto waterfall ? Porque o planning poker não é um jogo de numeros, é um processo de aprendizando, dialogo e acordo. Este processo visa criar a unidade em vez da impor. Visa procurar a visão do projeto como um todo e um acordo de como o executar. A disciplina está em chegar nessa unidade através da prática, da mesma forma que a arte marcial procura a clareza da mente através do movimento físico.  Para muitos um sprint é uma unidade de tempo. Ela é uma unidade de tempo, <em>também</em>, mas é principalmente uma unidade de foco. É um tempo onde o desenvolvedor pode desenvolver o que estava acordado, sem interrupções ou alterações do acordo. É um período importante para criar e fortalecer a responsabilidade do desenvolvedor e o respeito dos outros para com ele. Num processo tradicional pede-se que o desenvolvedor faça algo, mas nunca se respeita o pedido inicial ou o tempo que o desenvolvedor tem que ter de paz, para realmente desenvolver. Então do que serve ter um cronometro ? Só para apressar ? ( a tradução de sprint poderia ser &#8220;apressar até à meta&#8221;).  Não. &#8220;Estamos nos sprint&#8221; é a forma educada de dizer &#8220;Estamos trabalhando. Deixe-me em paz!&#8221; Mover papeizinhos num quadro branco não é kanban, nem scrum. É apenas um quadro branco com papeis em diferentes posições. Significam algo? Claro que sim. Significam o que você quiser. As cartas do tarot também significam algo quando estão em certas posições da mesa , mas e daí ? Isso basta ? Não.  O quadro branco com os papeis não é para dar visibilidade. É para dar visibilidade, <em>também</em>, mas principalmente é para encontrar problemas e com isso melhorar o processo. Ah! melhorar o processo.. então o processo não é fixo ? Não. O processo não é fixo. As práticas não são fixas, as regras não são fixas, a filosofia é que é. A disciplina, os objetivos. Não o caminho. O que as disciplinas metodológicas nos dão é uma filosofia e um conjunto de regras iniciais do processo, e um mecanismo para melhorar esse processo continuamente, dependendo dos intrevenientes! É um processo adaptativo por natureza.  As regras inicias são iguais para todos, mas onde cada um vai chegar é totalmente obra de melhoria continua. Exatamente como um praticante de uma arte marcial.</p>
<p>Então por quê não podemos simplesmente pegar uma coleção de práticas, colocá-las no mesmo saco, baralhar, e cria nosso próprio processo ? Porque estaremos <em>apenas</em> criando um processo, não uma filosofia. Não uma disciplina.  Uma disciplina implica que haja coerência entre as práticas, que elas se complementem e fortaleçam umas às outras e para isso é preciso um conjunto de principio maiores que as práticas em si mesmas, e isso só podemos alcançar através de uma disciplina completa.</p>
<p>Finalmente, queria deixar uma palavra para quem acha que pode começar a usar uma disciplina metodologia, como Scrum, ou XP, por exemplo, sem se comprometer com ela. Sem se empenhar, e sem a seguir completamente. Se você é um dos que pensa que pode começar a usar estas disciplinas &#8220;por partes&#8221;, pense no desastre que seria tentar partir um bloco de cimento com os dedos sem o devido preparo físico e mental da disciplina marcial completa. Muitos podem emitar os movimentos que veêm um mestre de artes marciais executar, mas imitar os movimentos não é praticar a arte. A arte está em entender os movimentos. Da mesma forma, a boa forma de base software está em entender os principios por detrás das disciplinas metodologia e não em imitar os movimentos das suas práticas. Ninguém aprende a partir uma pedra com as mãos por tentativa e erro. É feito com treino. E treino é algo diferente de tentativa e erro.</p>
<p>Para entender as disciplinas é requerido estudo. E sem estudo, tentar praticar é um insulto. É como um cara que aprendeu a imitar meia-dúzia de golpes dos filmes querer se denominar mestre de artes marciais. Não é apenas um insulto aos verdadeiros praticantes da arte, mas ao Mundo, por querer que acreditemos nesse embuste.</p>
<p>Se você gosta das disciplinas metodológias modernas, se realmente vê vantagens nelas, e sente que ha algum mérito nelas, antes de mais as estude. Tente entender a filosofia primeiro, para depois começar a exercitar as práticas.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/6Xbb30vYzCk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/07/a-mitica-colecao-de-praticas/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/07/a-mitica-colecao-de-praticas/</feedburner:origLink></item>
		<item>
		<title>O que faz o seu Tipo ?</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/L9ewKgDx218/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/07/o-que-faz-o-seu-tipo/#comments</comments>
		<pubDate>Fri, 16 Jul 2010 11:11:05 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[pilares]]></category>
		<category><![CDATA[qualidade]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1062</guid>
		<description><![CDATA[Quando uma pessoa aprende a programar em Java, especialmente se ela já programava em outra linguagem antes,  ela não olha a linguagem java como uma forma de escrever descrições de objetos mas apenas como um conjunto de &#8220;comandos&#8221; que estão sendo dados. Isto é uma pena. Não só é uma pena, mas a razão de [...]]]></description>
			<content:encoded><![CDATA[<p>Quando uma pessoa aprende a programar em Java, especialmente se ela já programava em outra linguagem antes,  ela não olha a linguagem java como uma forma de escrever descrições de objetos mas apenas como um conjunto de &#8220;comandos&#8221; que estão sendo dados. Isto é uma pena. Não só é uma pena, mas a razão de muitos erros de estruturação de codigo em java. A primeira coisa necessária para programar em Java é conhecer Programação Orientada a Objetos, pois apenas assim faz sentido aquilo que o java oferece.</p>
<p>O primeiro erro é confundir objeto com estrutura de dados. Em algumas linguagens não orientadas a objetos é possivel trabalhar com tipos que compoem diferentes variáveis numa variável só agrupando dados de forma mais concisa. Estas estuturas auxiliam na passagem de parametros, e até na tipagem do programa, mas  não são objetos.Contudo, é comum não conseguir diferenciá-los porque ambos têm atributos.</p>
<p>Objectos não são apenas formados por atributos, eles são também formados por comportamento. Este comportamento pode, ou não, depender do valor dos atributos ou operar sobre eles. Claro que é possivel também conceber objetos que apenas detêm comportamento sem nenhum atributo ou propriedade. Mas não é isto que diferencia uma estrutura de dados de um objeto.</p>
<p>Um objeto se diferencia de uma estrutura de dados porque têm uma responsabilidade. A responsabilidade advém do papel que o objeto representa no sistema, e esse papel advém do significado que o objeto têm no sistema. A responsabilidade do objeto leva a uma classificação do objeto por papeis no sistema e a existência de vários objetos que se auxiliam para formar o sistema induz a uma classificação hierarquizada. Portanto, uma outra forma de dizer que objetos têm responsabilidade é dizer que objetos pertencem a uma hierarquia de classificações.A existencia de hierarquia de classificação está intimiamente ligada à  operação de herança ( que seria impossivel existir sem dita hierarquia).  Estruturas de dados, não pertencem a uma hierarquia, e  portanto, embora fisicamente semelhantes, estruturas de dados não são objetos.</p>
<p>Mas podem objetos ser estruturas de dados ? A resposta rápida é : sim. A resposta longa é : podem, mas apenas se essa for a sua responsabilidade.</p>
<p>Objetos não se podem eximir de possuir responsabilidade e é um desafio manter apenas uma responsabilidade por objeto. Mesmo quando o desenvolvedor é inexperiente todo o objeto usado ganha uma responsabilidade no sistema mesmo quando o desenvolvedor não é consciente disso e atribuir a responsabilidade correta é que é o real desafio da programação orientada a objetos.</p>
<p>A programação orientada a objetos advém dos principios de modelagem orientada a objetos que é uma atividade abstrata em si mesmo e independente de qualquer tecnologia ou linguagem de programação.  Modelar o objeto corretamente passa por definir seus atributos e métodos, mas principalmente por definir sua responsabilidade.</p>
<p>Se um objeto pode ser uma estrutura de dados, isso significaria que a responsabilidade  do objeto é manter referencia a dados.  Isso nos leva a duas prespetivas. A primeira é a do objeto que é apenas um cabide de dados e permite transportar os dados de forma agrupada de um ponto do sistema para o outro, sendo o objeto totalmente neutro em relação à razão dos dados estarem agrupados daquela forma e terem aqueles valores. Esta seria a melhor aproximação a uma estrutura de dados convencional, não orientada a objetos. Por outro lado, podemos pensar no objeto que atua como protetor dos dados que guarda, mantendo coerencia nos valores e com pelo conhecimento de porquê aqueles dados estão agrupados.O primeiros são meros objetos de transporte (Transport Objects, TO) e os segundos são objetos de valor (Value Objects, VO). É clara a diferença entre estes dois tipos.  Poderiamos argumentar que o objeto de valor que agrupa os valores por uma razão e com conhecimento dessa razão, acaba servindo, também, para transportar esses dados de um ponto do sistema para outro. Aqui jaz a diferenciação:  os dados que o TO transporta podem ser utilizados em diferentes pontos do sistema, como o sistema bem entender. Todos os dados são publicos e a sua manipulação é livre. Os dados que o VO contém não podem ser utilizados desassociadamente ou condicionalmente conforme os interesses do sistema. O sistema está obrigado a seguir as regras que o próprio VO impõe.</p>
<p>Em modelagem orientada a objetos aprendemos que os conceitos do mundo real devem ser incorporados no sistema de uma forma que a cooperação lógica entre os objetos seja equivalente à cooperação dos conceitos ( ou dos objetos reais traduzidos por eles) no mundo real. É por isto que modelamos classes Cliente, Pedido e Produto e as identificamos com os conceitos de mesmo nome no mundo real  e ao dizermos que &#8220;O cliente faz um pedido composto de produtos&#8221; não existe diferença se essas palavras se referem a objetos no sistema ou às entidades no mundo real.  Para que este mecanismo funcione, é claro que precisamos conseguir converter os conceitos reais em objetos. A este processo que usamos para criar equivalencia entre objetos e conceitos reais dá-se o nome de: Abstração.</p>
<p>A abstração dos conceitos reais é a fonte da origem dos objetos. Abstração não significa neste contexto fazer as coisas mais dificeis, mais universais ou mais matemáticas, mas apenas e só significa mapear os conceitos reais com os objetos que temos no modelo/sistema. Na realidade não é correto dizer que o mapeamento é entre os objetos e os conceitos, e sim que é entre os conceitos e as classes de objetos do modelo/sistema. O nome &#8220;classe&#8221; não é aleatório. Nos remete ao conceito de que todos os objetos pertecem a uma hierarquia de classificação, e portanto pertencem a uma ou a mais categorias (classes).  Portanto, modelar de forma orientada a objetos é a realidade nada mais que criar uma (grande) arvore de categorias, ou melhor, de classes.</p>
<p>As classes de objetos que identificamos com conceitos do mundo real podem pertencer a 3 grandes classes de objetos : Entidades, Serviços e Valores. As classes de serviços são caracterizadas por não deter atributos ou propriedades. Todos os dados necessários à sua operação vêm do seu exterior. Entidades são caracterizadas como objetos de transporte(TO) de Valores para certas propriedades espeficicas que são,também,  mapeadas do mundo real. Por exemplo, o cliente terá uma propriedade nome cujo valor será um conjunto de caracteres que, numa certa lingua, compoem o nome do cliente. Entidades podem também ter métodos que trabalham sobre as suas propriedades e/ou cujo resultado é alterado pelos valores dessas propriedades.   Valores são objetos de valor (VO) que detém a informação sobre os valores , passo o plenoasmo, das caracteristicas das propriedades.</p>
<p>Existe atualmente uma confusão sobre o conceito de objeto como composição de dados e comportamento na forma de que certas pessoas confundem o fato dos objetos <em>poderem </em>ter dados e comportamento, com a obrigatoriedade de todos os objetos <em>deverem </em>ter dados e comportamento.  Isto é pura e simples sandice. O que o objeto tem que respeitar é a responsabilidade ( ou responsabilidades) inerentes à(s) classe(s) a que pertence. Por este motivo, objetos da classe de serviço não detém atributos e isso é perfeitamente normal.</p>
<p>No mundo real, os conceitos são muito mais maleáveis que no mundo do software. Nem sempre é trivial destinguir entre o que é um objeto da classe de entidade, e o que é um objeto da classe de valores. Os exemplos classicos são o número de telefone e o endereço. Para um sistema comercial de compras e vendas o numero de telefone ou o endereço não passa de um valor de uma propriedade de alguma entidade como casa, pessoa ou cliente. Mas para o sistema dos correios o endereço é uma entidade ela mesma com propriedades e relacionamentos com outras entidades num vasto sistema de classificação completamente diferente daquele do sistema comercial. O mesmo poderiamos dizer do numero de telefone e da companhia de telefones. Portanto, se o conceito é melhor modelado como um objeto da classe de entidades ou da classe de valores não é constante entre sistemas de tipos diferentes.</p>
<h2>Tipos Primários</h2>
<p>Todas as linguagens orientadas a objetos oferecem em maior ou menor numero um conjunto de objetos de valor pré-prontos que podem ser usados como objetos da classes de Valores facilmente em qualquer entidade ou sistema. Estes objetos nunca serão usados como sendo da classe de entidade ou serviço, e portanto é seguro para a linguagem/plataforma de programação assumir algumas caracteristicas para estes objetos e de certa forma prover otimizações para eles. Em java estes tipos primários (não confundir com os tipos primitivos do java) são representados, por exemplo, pelas classes: String, Date, Boolean, Integer, Double e BigDecimal.</p>
<p>Porque estes tipos  estão sempre disponiveis e são conhecidos de todos os desenvolvedores, é comum que eles sejam usados para os valores das propriedades de objetos de transporte e/ou de valor.  O problema aqui é que quando queremos modelar o numero de telefone, por exemplo, como sendo um objeto pertencente na classe de objetos de valor, decidimos escolher um dos tipos primários em vez de criar um novo tipo ( classe) para ele. Então em vez da propriedade &#8220;telefone&#8221; do cliente ser um objeto do tipo &#8220;NumeroTelefone&#8221; é apenas um objeto String ou  Integer.   O problema com esta abordagem é a falha do processo de abstração. O erro é tão grande e grosseiro como se a pessoa aceitasse modelar o numero de telefone usando um Double( afinal todos os Integer cabem num Double e o Double permite ter uma parte decimal que poderia ser usada para o ramal &#8230; não tente isto em casa).</p>
<p>Para a grande maioria dos desenvolvedores parece um preço muito elevado criar uma classe com uma duzia de linhas para representar um conceito de valor. O argumento é que isso aumentaria o numero de classes no projeto, como se existisse alguma regra dizendo que o numero de classes deve ser abaixo de algum numero mágico. Não entendo isto. Realmente não consigo entender como uma desculpa destas que advem de pura preguiça pode triunfar sobre um raciocinio lógico, cientifico, e comprovado da modelagem orientada a objetos. O que a modelagem orientada a objetos sugere é que o <em>numero de abstrações </em>seja o minimo possivel. Sendo que as palavras chave aqui são &#8220;possivel&#8221; e &#8220;abstração&#8221;.  É o numero de mapeamentos entre o mundo real e mundo dos objetos que tem que ser minimizado. Isto porque esses mapeamentos são complexos e frageis  ( como o exemplo do endereço e telefone demonstram)  e portanto, ter mapeamentos demais apenas aumenta a complexidade e risco do modelo estar furando em algum ponto.  Porque as pessoas pessoas entender &#8220;abstração==classe&#8221; então acham que minimizar o numero de classes estão respeitando este principio.  O problema é que o <em>principio </em>da separação de responsabilidade é mais importante do que a <em>sugestão </em>que comanda o numero de abstrações.  Ou seja, quando a pessoa mapeia o numero de telefone à classe NumeroTelefone está separando a responsabilidade de descrever um numero de telefone. Usar um objeto String, poupa uma classe, mas coloca sobre a classe String a responsabilidade de além de descrever texto, também descrever numeros de telefone. E convenhamos que isto é um pouco idiota, pois se eu quiser ter um método getRamal() no numero de telefone, isto seria trivial num objeto NumeroTelefone , mas impossivel num objeto String já que ele não é extensivel. Mas mesmo que String fosse extensivel, não o poderiamos extender e criar o nosso StringTelefone pois isso significaria aumentar uma classe no nosso projeto e seria vetado pelas mesma razão (idiota) que veta a criação de NumeroTelefone em primeiro lugar.</p>
<p>É importante seguir principios , sugestões e boas práticas.Eu acredito muito nisto. Mas veja, existe uma ordem em que estas coisas têm que ser seguidas e  existem prioridades. O principio de separação de responsabilidade tem prioridade sobre todos  as sugestões e boas práticas que alguem imaginar.</p>
<p>Isto nos leva ao conceito de que, embora aos olhos destreinados pareça pequeno o ganho de criar um novo tipo (classe)  fazer isso é a única saida lógica num caso assim. Estes &#8220;pequenos  tipos&#8221; ganharam um nome &#8211; Tiny Types &#8211; exactamente para deixar clara a sua importância.  Mas entenda que a necessidade de batizar estes tipos de objetos apenas advém do desconhecimento e incompetência tecnica da maioria dos desenvolvedores que não sabe seguir os principios mais básicos da orientação a objetos. Eles esquecem que <em>todos </em>os conceitos reais presentes no sistema precisam ser abstraidos e que violar isto é criar buracos no modelo e por consequencia no código e no sistema.</p>
<p>Existem outras formas de dizer a mesma coisa e revelar a mesma importância da operação de abstração para a correta modelagem orientada a objetos.   Uma que ganhou muita fama ultimamente é chamada de &#8220;Linguagem Ubiqua&#8221; (Ubiquos  Languagem) introduzida pelo pessoal adepto da filosfia Domain Driven Development (também chamada Domain Driven Design). O conceito aqui é que os mesmos termos (conceitos) que as pessoas usam no mundo real  para se referirem aos intrevenientes no processo do mundo real que o software irá mimetizar devem ser usados no codigo. Isto é exactamente o mesmo que dizer que os conceitos devem ser abstraidos.  A diferença é que dizer &#8220;os conceitos devem ser abstraidos&#8221; é uma expressão tecnica, enquanto &#8220;os mesmos termos que as pessoas usam no mundo real  para se  referirem aos intrevenientes no processo do mundo real que o software&#8221; é uma expressão usada por pessoas comuns  não-tecnicos. As pessoas que estudaram orientação a objetos e conhecem a operação de abstração e não a confundem com &#8220;tornar as coisas mais complexas&#8221; sempre souberam que é excelente ideia colocar os nomes/termos/conceitos reais no código &#8230; afinal foi por causa disso que se inventou o próprio conceito de Objeto e o paradigma de Orientação a Objetos : porque queriamos que os programas tivessesm a mesma expressividade que o mundo real. É simples desconhecimento achar que isto é algo novo, e é simples maldade se aproveitar do desconhecimento da maioria dos desenvolvedores &#8211; que teve uma fraca preparação académica &#8211; para passar a &#8220;linguagem ubiqua&#8221; como algo novo e inovador.  No fundo não passa de uma ferramenta de marketing igual ao dos Tiny  Types para fazer as pessoas aceitarem o que elas deveriam ter aprendido na escola desde o começo : abstração.</p>
<p>Toda e qualquer impedimento em orientação a objetos, seja modelagem, seja implementação, advém do conceito de objeto ( redundante, mas importante ter sempre isto presente). O conceito de objeto significa entender que existe uma separação de responsabilidade e que isso que define &#8220;objeto&#8221; e o destingue de &#8220;estrutura de dados&#8221;. Simultaneamente essa responsabilidade classifica o objeto em uma hierarquia e a hierarquia de responsabilidades implica em sermos capazes de classificar em qual lugar dessa hierarquia o objeto pertence. A  operação que usamos para fazer isto é a : Abstração.</p>
<p>A correta abstração do problema que o sistema deve resolver leva à correta hierarquia  de objetos para aquele sistema e nem sempre essa hierarquia é a mesma para sistemas diferentes. Nem sempre é claro se o conceito será mapeado como um objeto de entidade, serviço, ou um valor, um objeto de transporte ou um objeto de valor. Contudo, independentemente da classificação é mandatório que o conceito seja mapeado para um tipo, uma classe e esse é a razão por detrás dos conceitos de Tiny Type e da Linguagem Ubiqua.</p>
<p>O principio de separação de responsabilidade ( um dos 5 principios da orientação a objetos) tem prioridade sobre a sugestão de manter um conjunto minimo de abstrações, e por consequencia de classes e em nenhum caso o aumento do numero de classes pode ser usado como desculpa para não respeitar o principio de separação de responsabilidade.</p>
<p>Modele corretamente o seu sistema. Aprenda Orientação a Objetos e poderá fazer seus sistemas tranquilamente sem precisar de muletas. Não tenha medo de criar classes. Tenha apenas medo delas não representarem nada de util ou real no processo que o seu software está tentando desempenhar. Se todos seguirmos isto teremos menos <em>buzz words</em> para nos preocupar e poderemos tornar nossa atenção para o que realmente interessa.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/L9ewKgDx218" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/07/o-que-faz-o-seu-tipo/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/07/o-que-faz-o-seu-tipo/</feedburner:origLink></item>
		<item>
		<title>Crítica da Razão Ágil</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/gQ_mbp11-c0/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/07/critica-da-razao-agil/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 03:31:11 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[requisitos]]></category>
		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1037</guid>
		<description><![CDATA[O manifesto ágil é visto hoje em dia como o responsável por uma mudança de paradigma no mundo do desenvolvimento de software. A meu ver a mudança de paradigma é inevitável e não depende da existência de dito manifesto. Aliás, dito manifesto pode ser até um entrave à mudança de paradigma em curso. Na realidade [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://agilemanifesto.org/" target="_blank">manifesto ágil</a> é visto hoje em dia como o responsável por uma mudança de paradigma no mundo do desenvolvimento de software. A meu ver a mudança de paradigma é inevitável e não depende da existência de dito manifesto. Aliás, dito manifesto pode ser até um entrave à mudança de paradigma em curso. Na realidade não se trata bem de uma mudança de paradigma verdadeira, é mais uma volta às raizes.</p>
<p>O desenvolvimento de software teve a sua pré-historia quando software e harware era virtualmente indestinguiveis mas ao mesmo tempo que se criou um mercado de software distinto do de hardware, se criou a idade média do desenvolvimento.</p>
<p>O software clássico, ou seja, aquele que nasceu pela diferenciação entre hardware e software nasceu das mãos de engenheiros electro-electrônicos . O software contemporâneo não mais requer o mesmo leque de capacidades. Porque o software nasceu de dentro da engenharia eltro-eletrônica a forma de fazer software nasceu com a mesma metáfora da forma de fazer hardware. Um processo chamado stage-gate de que falei no post passado, mais conhecido como waterfall.  Isso faz sentido para obras de engenharia, mas o que demorámos 50 anos a perceber, é que não faz sentido para software.</p>
<h1>Tudo o que existe, muda</h1>
<p>O paradigma do desenvolvimento de software está, em si mesmo, evoluindo. É um alvo em movimento. Mas antevemos hoje algumas propriedades que o desenvolvimento de software tem, que mais nenhum ramo de atividade tem, e são esas propriedades que moldam um novo paradigma de desenvolvimento.  Uma destas propriedades é :</p>
<blockquote><p><strong>Todo o software é baseado em requisitos </strong><em><strong>não estáveis</strong>.</em></p></blockquote>
<p>Esta verdade universal é o grande diferencial de um artefacto de qualquer engenharia onde os requisitos são estáveis. Muitos autores já escreveram sobre este problema. Muitos já apontaram a instabilidade dos requisitos como o grande problema do desenvolvimento de software. Nada de novo ai. Qualquer um com mais de três projetos nas costas já sabe que isto é simplesmente verdade. Isto nos leva a duas escolas de pensamento:</p>
<h2>Escola Tradicional</h2>
<p>Para a escola tradicional, esta fato é um problema, e a forma de resolver este problema é com uma forte pressão para evitar a mudança. Esta escola de pensamento defende que a forma de lutar contra a constante mudança de requistos é proibi-la ou torná-la tão onorosa que ninguem quer realmente fazê-la. Esta escola parte do principio errado que a instabilidade acontece por responsabilidades de agentes externos  ao processo de desenvolvimento de software ( seja ele qual for) e que tal mudança não é inerente ao software em si.</p>
<p>Este pensamento é muito fundamentado no pensamento da engenharia de hardware e em logica determinista em que se julga ser possivel conhecer todas as variáveis e sua evolução.</p>
<p>A escola Tradicional faz uso de três ferramentas principais : o levantamento exaustivo de requisitos, o plano e o mecanismo de pedido de alteração (change request). Estes três mecanismos visam, no entender desta escola, esgotar as opções de possibilidade de mudança , primeiro : garantindo que todas as opções foram pensadas e analizadas com antecedencia e as melhores foram escolhidas;  segundo, documentando tudo isso, e qual o caminho a seguir : o plano;  e , terceiro : se por uma bizzarra eventualidade for possivel que algo tenha escapado e seja necessário alterar algum ponto do plano, isso tem que ser feito com todo o cuidado e controle possivel pois pode ter reprecursões e interações com os outros requisitos não previstas com antecedência.</p>
<h2>Escola Moderna</h2>
<p>Para a escola moderna o fato dos requitos serem instáveis é simplesmente uma caracteristica da natureza das coisas e em particular do software. Portanto ha que aceitar essa mudança com um fato e construir mecanismos, processos e ferramentas em torno dessa realidade. Porque este fato não é um problema criado por agentes externos não é concebivel criar mecanismos para o evitar, e sim, muito mais apropriado criar mecanismos para acompanhar essa mudança.</p>
<p>Este pensamento é baseado na filosofia clássica grega e oriental de que a única constante do universo é a mudança.</p>
<p>Porque esta forma de pensar implica em constantemente estarmos acompanhando a mudança, e portanto mudando a todo o momento, ela ganhou o nome de &#8220;Ágil&#8221;. Mas o nome &#8220;Ágil&#8221; não veio daqui, veio do manifesto ágil. Foi um &#8220;batismo por proximidade&#8221; , por assim dizer.</p>
<h1>Software é um produto da mente, não da mão</h1>
<p>Uma outra caracteristica que está sendo sendo cada dia mais visivel é que:</p>
<blockquote><p><strong>Software é um artefacto criado por <em>pessoas</em>. </strong></p></blockquote>
<h2>Escola Tradicional</h2>
<p>Para a escola tradicional isto significa apenas uma simples coisa : outros animais não podem fazer software, apenas o ser humano. Logo, para fazer software temos que ter o custo de contratar pessoas. Se quisermos que seja feito mais depressa, contratamos mais pessoas. Se queremos que seja feito melhor, contratamos melhores pessoas. Os tradicionalistas se referem a isto como &#8220;braço&#8221; , significando que &#8220;mais braços, mais mãos. Mais mãos, mas rápidamente se digitam coisas no teclado, logo mais depressa o codigo é escrito e portanto mais depressa o software é completado&#8221;. Simples.</p>
<p>Porque os requisitos não mudarão nunca ( salvo exceções devidamente contidas nos pedidos de alteração) e o plano traça o unico caminho possivel, então, seguir o caminho não é uma questão de escolha, de livre arbitrio, de experiencia, é apenas uma questão de correr mais depressa. Logo, o prazo para criar um software pode ser facilmente modificando alterando o numero de pessoas disponiveis para o <em>escrever</em>.</p>
<h2>Escola Moderna</h2>
<p>A escolha entende este fato como significando que software não poderia ser criado por acaso pela natureza, ou pelo simples esforço fisico,  mecânico , muscular ou repetitivo. Criar software é um trabalho intelectual e não muscular. Demanda criatividade, conhecimento, raciocinio e destreza mental. Portanto para fazer mais depressa precisamos de pessoas mais critivas, com mais conhecimento , com melhor raciociono ou mais destreza mental.</p>
<p>Porque os requisitos mudam, é necessário constantemente exercitar as celulas cinzentas para obter novas ideias que permitam alterar o software existente para cumprir as novas funcionalidades da forma mais vantajosa possivel ( leia-se &#8220;a que custa menos dinheiro&#8221;). Porque software é feito por pessoas e elas usam ideias para o criar, a comunicação dessas ideias é vital para o seu refinamento e evolução. Portanto a comunicação é vital.  É sabido que o numero de canais de comunicação aumenta na proporção do quadrado de pessoas habeis a comunica. Para ser mais exato o numero de canais é igual a p(p-1)/2 onde p é numero de pessoas. Portanto para 3 pessoas temos 3 canais para 4 temos 6 canais ( o dobro para o aumento de uma unica pessoa), para 6 pessoas temos 15 canais ( o quintopluo para o aumento de 3 pessoas). É facil de ver que quanto mais pessoas, mais dificil a comunicação e mais dificil a evolução das ideias. Portanto, o conceito da escola moderna é ter o menor numero possivel das pessoas mais capazes possivel &#8211; a equipa &#8211; e ter várias equipas. Esta simples fato é sabido desde dos anos 60 pelo lengendário livro &#8220;The mythical man month&#8221;, mas historicamente as pessoas se negam a enxergar isto, ou são oblivias a este conhecimento.</p>
<h1>Entra a escola Ágil</h1>
<p>Preciso esclarece que a escola ágil é apenas uma das linhas possiveis de uma escola moderna. Não é a única. Díficil de dizer que é a melhor.</p>
<p>A escola ágil parte dos principios do desenvolvimento de sofware visto atrás e estabelece um objetivo comercial. É importante sublinhar bem que se trata de um objetivo comercial e nada além disso. Não ha aqui nenhum tipo de valor moral maior ou grandiosidade Humana. É apenas uma questão de balanço comercial. O objetivo é simples:</p>
<blockquote><p>Prover valor ao cliente.</p></blockquote>
<p>O &#8220;Cliente&#8221; aqui é a pessoa que detém o poder de decidir pelo pagamento, ou não, do software. Não necessáriamente é a pessoa que o vai usar e não necessáriamente é a pessoa que realmente via pagar por ele. Por exemplo, o filho de um casal quer um novo jogo de computador ( que é um software), quem paga é o pai , mas quem permite ou não que a compra seja feita é a mãe. Neste caso, o &#8220;cliente&#8221; é a mãe. Portanto o software tem que ter caracteristicas que agradem ao filho (para que o queira usar), mas principalmente à mãe, porque será ela a realmente levar à compra. É por isto que os jogos tem um selo dizendo o nivel etário aconselhado e o tipo de contéudo presente. Esta classificação (rating) não é para o bem da humanidade ou para proteger valores da sociedade, é apenas e só, para que o produto &#8220;jogo&#8221; seja mais aceitável por quem o compra de verdade ( no caso, as mães). Não se entenda deste exemplo, se são sempre as mães. O que se precisa entender daqui é que existe papeis diferentes do ponto de vista do uso e da compra do software. O software tem que ser agradável a quem o usa (ou será rejeitado), a quem o paga ( o custo-beneficio tem que agradar ao &#8220;dono do dinheiro&#8221; também ) mas principalemente ele tem que agradar a quem tem a autoridade de negar a compra : o cliente.</p>
<p>O manifesto ágil nasce daqui. Da necessidade de prover valor ao cliente. &#8220;Valor&#8221; é : &#8220;o que quer que seja que o cliente usa para dedicir se compra ou se bloqueia a compra&#8221;.</p>
<p>Analizemos o manifesto à luz destas informações :</p>
<p>(1) <span style="text-decoration: underline;">Individuos e Interações</span> em vez de processos e ferramentas.</p>
<p>A ideia do manifesto é contrapor a escola tradicional exemplificada aqui por &#8220;processos e ferramentas&#8221; à escola moderna, da qual a escola ágil faz parte. Este item resalta a importancia das pessoas em detrimento das mecânicas. Contudo passa a ideia que não precisamos de processos ou de ferramentas, o que não é verdade ( Alguem não usa uma IDE ? Claro, mas ninguem acha esses caras normais, i.e. nos 90% da curva). O ponto aqui é realmente que software é feito por pessoas, não por mecanismos.</p>
<p>(2) <span style="text-decoration: underline;">Software funcionando </span>em vez de documentação extensiva.</p>
<p>Mais uma vez, a ideia da escola moderna que o objetivo é o software, não o plano. Claro que a expressão &#8220;software funcionando&#8221; é até tautologica (de que server um software não funcionando ? E um &#8220;não funcionando&#8221; pode ser considerado um software?) mas é apenas para reforçar que o objetivo de construir um software é ter um software.  Não um conjutno de documentos que não &#8220;funcionan&#8221;, ou seja, o plano não vai resolver o problema do cliente, apenas o software &#8211; funcionando &#8211; vai.</p>
<p>(3)<span style="text-decoration: underline;"> Responder à mudança</span> em vez de seguir um plano.</p>
<p>Aqui, de novo, a ideia de que a mudança é inivitável e que, portanto não ha valor em seguir um plano. Esta frase da a ideia de que não devemos fazer planos, o que é falso. A palavra &#8220;plano&#8221; está implicitamente atrelada ao contexto da escola tradicional em que apenas depois do plano pronto, poderiamos começar a criar o software. A ideia não é essa. A ideia é que o conjunto de requistos é um alvo, mas um alvo em movimento. Portanto a estratégia tem que estar em conformidade.  Tem que haver um plano no sentido de &#8220;tem que existir uma estratégia&#8221; &#8211; seria suicidio comercial não ter uma &#8211; mas não precisamos de um &#8220;plano&#8221; no sentido de &#8220;um mapa feito à priori que nos mostre por onde ir&#8221;</p>
<p>(4) <span style="text-decoration: underline;">Colaboração com o cliente</span> em vez de negociação contratual</p>
<p>Este ultimo item ( o terceiro na lista original) deixa bem claro ao que veio a escola ágil : agradar ao cliente. O objetivo sempre será agradar ao cliente. A contraposição aqui diz respeito a ter uma lista de requisitos fechada e pedidos de alteração versus ter uma lista alterável (dinâmica) que muda conforma o &#8220;querer&#8221; do cliente. &#8220;Negociação contratual&#8221; faz alusão Às clausulas restritivas que existem nos contratos tradicionais que proibem o cliente de fazer modificações ou o oneram por isso. É um sistema de castigo contrário ao conceito de que a mudança irá sempre acontecer, então ao colocar essas clusulas a empresa está automaticamente castigando o cliente. É apenas uma quetão de tempo para acontecer, e não uma questão de se vai acontecer ou não.</p>
<p>Ao ler o manifesto é preciso entender que a segunda parte da frase sempre se refere ao contexto da escola tradicional. Este ultimo item não significa que não devemos fazer contratos com o cliente &#8211; é obvio que devemos &#8211; o que está sendo dito é que esses contratos não têm que ser baseados em mecanismos de castigo e recompessa e sim em mecanismos de colaboração.</p>
<p>A escola ágil visa maximizar o negócio que o desenvolvimento de sfotware é ao mesmo tempo que se segue o pensamento da escola moderna. Mas a escola ágil não é a única vertente moderna. Do outro lado temos a escola artesã.</p>
<h2>Entra a Escola Artesã</h2>
<p>É realmente dificil arranjar um bom nome para esta vertente moderna. O conceito aqui é que, dado que os principios da escola moderna são verdadeiros, não ha que esquecer de lembrar que são pessoas que constroem o software, e num ambiente de negocios, essas pessoas têm que ser Profissionais ( com P maiusculo). Estes profissionais são chamados carinhosamente de artesãos. Isto não é para dizer que a criação de software é rude e crua, mas sim para lembrar que a criação de software é baseada nas capacidades critivas de pessoas ( como uma arte, e dai o artesão) e não na força bruta ou na repetitividade de uma máquina.</p>
<p>O manifesto do artesanato de software (<a href="http://manifesto.softwarecraftsmanship.org/"> software  craftsmanship</a>) é mais do que um compromisso com o cliente, é um  compromisso de cada um de nós com o profissional que ha em nós e ha em  todos os colegas de profissão. É um compromisso de qualidade, esmero,  requinte e escolha do que é certo do ponto de vista da profissão e não apenas do que é certo do ponto de vista do cliente.  Então, a escola artesão evolui o manifesto ágil para um manifesto onde a qualidade é tão importante quanto o resultado.</p>
<p>(1) Não apenas software funcionando, mas também <span style="text-decoration: underline;">software bem confecionado</span>.</p>
<p>A discussão é agora o que seria entendivel por &#8220;bem&#8221; e &#8220;mal&#8221; confecionado, mas em geral o que está sendo colocado aqui é : nada de gambiarra, seguir padrões ( não apenas design patterns, mas padrões de nomenclatura, de arranjo de codigo,  de trabalho, etc&#8230;) e acima de tudo respeito pelo profisional que irá dar manutenção no software depois de um tempo( que podemos ser nós mesmos, é bem comum este caso).</p>
<p>(2) Não apenas responder à mudança, mas também <span style="text-decoration: underline;">constantemente agregar valor</span>.</p>
<p>E não apenas o valor que o cliente espera, mas o valor que os outros profissionais esperam. Se um produto é louvado por todos os profissionais do ramo, é bem provável que o seja pelos clientes também.</p>
<p>(3) Não apenas colaboção com o cliente, <span style="text-decoration: underline;">mas também parceria</span>.</p>
<p>Parceria é diferente de colaboração. Parceria advém dos dois entenderem que estão no mesmo barco e não que um trabalha para o outro. Sim, no contrato está escrito que um é o &#8220;Contratado&#8221; e outro é o &#8220;Contratante&#8221;, mas isso são apenas termos legais. Na realidade são pessoas com um objetivo comun: criar um software.</p>
<p>(4) Não apenas individuos e interações, mas também <span style="text-decoration: underline;">uma comunidade de profissionais</span></p>
<p>Este é talvez o mais importante item que marca a diferença entre as escolas. A escola ágil aceita e entende que as pessoas são importantes e que elas devem comunicar pois isso é o motor da critiavidade necessária ao construir um software, mas é cega à qualidade inerente dessas pessoas. Em tese qualquer pessoa poderia pertencer a uma equipa da escola ágil, numa equipa artesã isso não é suficiente, é preciso que as pessoas sejam profissionais, ou pelo menos, que aspirem a o ser. Mas a &#8220;comunidade&#8221; não se esgota na equipe. Ela traspassa barreiras de equipe, empresa, e até de país e lingua. É a procupação dos desenvolvedores se ajudarem entre si, mesmo que competindo pelos mesmos clientes, ter o respeito e o fair-play necessários entre si, fora com constrangimento do mundo dos negocios.</p>
<p>Infelizmente, falar de profissionalismo na construção de software ainda parece uma aberração hoje em dia. Não será por muito mais tempo, porque a cada dia que passa ser rápido não é mais sufciente, tem que ser bom e rápido.  Quem aprender esta lição antes e a executar melhor, leva o cliente. Tão simples assim.</p>
<p>O manifesto ágil tem como pretensão escapar da máquina monstruosa e pesada com que o software era feito nos moldes tradicionais e o seu enfoque é priorizar o cliente tendo como base as propriedades canónicas do desenvolvimento de software. A preocupação era abandonar o modelo velho.</p>
<p>O manifesto do artesanato de software pretende chamar a atenção que quebrar o modelo tradicional não é suficiente, que seguir o modelo ágil de foco no cliente não é suficiente a longo prazo e que é necessário nos preocuparmos com a Qualidade e  a correta confeção dos software, não porque o cliente vai achar isso lindo, mas porque é uma questão de dignidade , honra e orgulho profissional. Você pode entregar o software mais util do mundo, mas se as entranhas dele forem reles, você assumiria a autoria ?</p>
<p>A escola ágil critica a escola tradicional porque não enxerga as propriedades do desenvolvimento do software , não enxerga os fatos e a história, mas é ingénua aos olhos da escola de artesã ou esquecer ao que viemos. Viemos para constuir software e não para chafurdar nos bits e bytes e concordar com todas a sandices que nos pedirem. Temos um dever para com o proprio software tanto quanto temos para com o cliente e abdicar disso, no entender da escola artesã é uma irresponsabilidade.</p>
<p>Eu me encontro no grupo de pessoas que defendem o manifesto de artesanato de software. Agil para mim não é suficiente. É necessário, mas não é suficiente. Existe esse passo a mais a se dar. Existe a necessidade de formar profissionais ( ou seja, pessoas com honra e principios de profissão) e não apenas pessoas que conhecem a parte tecnica. O que vivemos hoje é como termos uma praça de taxis onde todos os taxistas são falsos e apenas dois ou três têm a autorização de ser taxistas. Não precisamos de condutores de fim de semana que saber conduzir uma IDE ( mal, mas sem acidentes graves) , precisamos de pessoas que saibam entender software e preservar a sua consistencia ao mesmo tempo que preservam o valor para o cliente. Não é uma questão de um ou o outro, é uma questão de que um sem o outro não interessa. Pelo menos não interessa a um Profissional de verdade.</p>
<p>Eu sei que o manifesto ágil, e o conceito de agilidade ainda são novos para muitos. Também sei que nas escolas oficiais a imagem que se dá do software é o da escola tradicional. E também sei, que se as pessoas ainda não entenderam a diferença entre o paradigma tradicional e o moderno, então mais complexo ainda é ver a diferença entre agilidade e artesanato de software. Mais valia pregar aos peixes &#8230; mas acreditando, como acredito, nos principios por detrás do artesanato de software, não posso, em consciencia, me abster de divuldar a mensagem e esperar que mais um se junte à causa.  Para quem está saindo da faculdade ou ainda entrando nela, é importante que pense bem se quer realmente ser um profissional de software ou apenas um tecnico, ou apenas um que sabe pilotar uma IDE. Se não é para ser a sério, mais vale não ser.</p>
<p>Aos que já estão na profissão, perguntem-se a si mesmos se tem vergonha do código em que estão trabalhando agora. Se você não sente nada pelo seu código, pelo seu software, você não é feito para ser um desenvolvedor, e talvez seja hora de pensar em mudar de vida. Se você sente algo, então procure melhorar-se a si e aos seus colegas, para que todos juntos possar sentir menos vergonha.</p>
<p><em>Making software is not about the money, or the ride, is about the dignity of the journey. </em></p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/gQ_mbp11-c0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/07/critica-da-razao-agil/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/07/critica-da-razao-agil/</feedburner:origLink></item>
		<item>
		<title>Simplesmente complexo</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/CcPcT2NaSIo/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/06/simplesmente-complexo/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 01:42:54 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Planejamento]]></category>
		<category><![CDATA[Quotidiano]]></category>
		<category><![CDATA[engenharia de software]]></category>
		<category><![CDATA[pilares]]></category>
		<category><![CDATA[qualidade]]></category>
		<category><![CDATA[requisitos]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[valores]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1039</guid>
		<description><![CDATA[Como sabem eu venho de uma formação acadêmica em ciências naturais &#8211; em física &#8211; onde as coisas têm que fazer sentido real mesmo quando trabalhamos com coisas tão abstratas quanto uma função de onda da física quântica.  Pese embora a grande onda mitológica que rodeia a fisica quântica ela não é baseada em magia ou [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Como sabem eu venho de uma formação acadêmica em ciências naturais &#8211; em física &#8211; onde as coisas têm que fazer sentido real mesmo quando trabalhamos com coisas tão abstratas quanto uma função de onda da física quântica.  Pese embora a grande onda mitológica que rodeia a fisica quântica ela não é baseada em magia ou achismo, ela é baseada numa estrutura matemática. Quando descobri a minha vocação para a criação de software tive que rapidamente me por a par do que estava acontecendo neste mundo. E aqui, de um jeito prático e não acadêmico. Durante os meus primeiros trabalhos com software não existia exatamente um método a seguir, existia um fluxo de demanda. Mas esses primeiros exemplos me mostraram que não era possível fazer software assumindo que é algo mecânico e reativo.  Tendo formação acadêmica me voltei para os livros &#8211; o que é dizer muito, porque nunca antes lhes tinha dado muito valor, mas quando entramos num campo diferente daquele que fomos educados e no qual sabemos intuitivamente navegar, é bom ter referências. A razão para isso é que não poderia cair nos mesmos mitos que as pessoas já no ramo tinham caído, da mesma forma que o ingênuo &#8211; coloque aqui uma profissão &#8211; cai no mito da mecânica quântica &#8220;mágica&#8221;. Eu nunca fui de idolatrar autores, ou memorizar livros, ou saber (re)citar passagens. A experiência me mostrou que quem entende os conceitos não precisa dessas coisas, mas li bastante para me tornar um programador java, tirar minha certificação, mas o que mais me atrapalhava era não existir um método para criar software. Em java, temos os principios de OO para seguir como os principios <a href="http://en.wikipedia.org/wiki/Solid_(object-oriented_design)" target="_blank">SOLID</a>. Em física, temos o método científico como base e várias práticas de laboratório que nos guiam. Entretanto, em gerenciamento de projetos de software me impressionava que tal coisa não existisse.</p>
<p style="text-align: justify;">Fiz questão de fazer um curso não programático na finada Sun exatamente para descobrir esse outro lado. No curso que era guiado principalmente pelo Processo Unificado (Unified Process, UP) era levantada a lebre de um tal de XP. Eu tinha tido contato com o XP ainda quando fazia meu estágio em física. Afinal a física prática passa pelo processamento de sinal, e este passa por usar computadores.  Com o passar do tempo as práticas que observava na realidade não batiam com o que os livros diziam e o insucesso de vários projetos me fez entender que para entrar no mundo do software antes de saber programar é preciso saber escolher entre filosofias de desenvolvimento.  O Rational UP da  Rational Rose, depois IBM no tempo do CASE lançou o mote. A ideia era ter ferramentas onde especificar o software, apertar um botão e simplesmente teriamos um software funcionando. Não resulta. Ferramentas ainda são burras e precisam de alguém que as saiba usar.  Alguém muito esperto consegue vender esta ideia imbecil de que software pode gerar software automaticamente. Ainda hoje existem tentativas de enganar os pacóvios com esta artimanha. Repare que o engano advém de quem compra e não de quem vende. É quem compra que é muito desonesto, tapado, analfabeto ou burro para não entender a enganação.</p>
<p style="text-align: justify;">Apenas pessoas sabem fazer software e existe uma razão muito simples para isso: fazer software é um processo criativo. <em>Criativo </em>aqui significa tanto ser um processo onde se cria algo, como um processo em que se precisa ter imaginação. E as máquinas não têm isso ainda.</p>
<p style="text-align: justify;">Então por que é tão difícil fazer software? Fazer software não é dificil. O que é difícil é fazer software que alguém compre e atenda a uma demanda, a uma necessidade. Para qualquer produto comercial existem duas formas de demanda. Ou quem quer comprar, compra o produto já pronto que o produtor já criou antecipadamente (retail sell &#8211; venda a varejo) ou o interessado chega junto ao produtor e pede que seja feito um produto com certas características (tailored sell &#8211; venda sob medida). Na primeira categorias podemos encontrar muitos produtos como pão, fruta, vinho, carros, casas &#8211; e inclusive software &#8211; e no segundo podemos encontrar produtos como roupa (de alfaiataria), carros (Rolls Royce), aviões e também software. Qual é a diferença? Volume.  A primeira categoria ganha em vender barato e muito. A segunda em vender caro e pouco. Ambos têm o seu quinhão de mercado. Atenhamo-nos apenas ao software feito sob medida (sob demanda &#8211; on demand, como também é chamado) para o resto da conversa.</p>
<p style="text-align: justify;">Em tudo o que é feito sob medida, e também num software, precisamos saber como o cliente deseja que seja o resultado final. Afinal o resultado final servirá a ele e apenas a ele. Tal como um casaco ou um terno que serve apenas a uma pessoa. Pode até ser que sirva para outros, mas nunca sem ajustes. Precisamos então saber quais são os requisitos. Requisito é um conceito muito importante neste tipo de produto, porque é à medida dele que será feito o produto final.</p>
<p style="text-align: justify;">Um outro fator na equação é como será feito o produto. A tecnologia que será usada para realizar o produto afeta o preço, a qualidade, a durabilidade, e até o aspecto e usabilidade do produto.  Existem tecidos específicos para certos tipos de roupa e circunstâncias específicas. Existem razões técnicas de porque o mesmo casaco precisa ser de algodão em umas regiões e de lã em outras.  Se formos fazer um produto que nunca ninguém fez antes ou poucos tentaram e tenhamos que experimentar diferentes tecnologias será diferente daquele que utiliza uma tecnologia já muito entendida e aperfeiçoada.</p>
<p style="text-align: justify;">Pondo estas duas forças num gráfico obtemos um cenários mais ou menos como o mostrado na figura a seguir.</p>
<p><a href="http://sergiotaborda.javabuilding.com/wp-content/uploads/2010/06/complexidade2.png"><img class="aligncenter size-full wp-image-1040" title="Complexidade vs Tecnologia" src="http://sergiotaborda.javabuilding.com/wp-content/uploads/2010/06/complexidade2.png" alt="Complexidade vs Tecnologia" width="700" height="469" /></a></p>
<p style="text-align: justify;">Na zona verde estão os produtos menos complexos, os mais complexos na zona vermelha. Repare que o software é algo complexo.</p>
<p style="text-align: justify;">Muita gente &#8211; gente demais, na minha opinião &#8211; adora comparar &#8220;fazer software&#8221; com &#8220;fazer casas, carros e aviões&#8221;. Não, essas coisas não são nem de longe tão complexas. Por quê? Porque os requisitos são muito bem conhecidos e a tecnologia também. Não há surpresas &#8211; tijolo é tijolo e metal é metal. Não há mudança de ideia no último momento. Não há uma tecnologia que surgiu no último momento e tornou tudo obsoleto.  Um pouco mais semelhante seria um carro costumizado ou um avião costumizado como Air Force One. Mais próximo ainda seria um vestido de noiva. A tecnologia é muito simples e conhecida, mas os requisitos são muito voláteis. É por isso que existem costureiros de grife cobrando caro por essas coisas. Do outro lado, temos as vacinas, aqui os requisitos são simples &#8211; evitar a doença , mas a tecnologia tem que ser criada. E algumas , como a da AIDS não tiveram sucesso até hoje.  A vacina é um exemplo muito mais próximo da complexidade de fazer um software com tecnologias novas (muitos projetos de vacinas falham, como falham os projetos de software). E talvez por isso as equipes tendam a usar tecnologias velhas. Dá-lhes uma margem maior de segurança emocional (se bem que uma plataforma de aplicação velha é um empecilho em si mesmo).  Armas de energia com o phaser do Star Trek ainda são uma ilusão, mas as armas  taser estão bem perto, e cada vez mais perto de uma arma de energia. Aqui, o requisto continua simples &#8211; desabilitar o adversário, mas a tecnologia é simplesmente desconhecida. Um exemplo de algo bem complexo de criar seria uma verdadeira  <a href="http://en.wikipedia.org/wiki/TARDIS" target="_blank">TARDIS </a>, pois não apenas ela é um ser vivo que viaja no tempo e no espaço, como é maior por dentro do que por fora. Um desafio ao raciocínio humano mais fundamental, o que dizer ao raciocínio de engenharia.</p>
<p style="text-align: justify;">Ao fazer software é raro que tenhamos requisitos bem conhecidos, e normalmente as empresas se encarregam de estragar a outra variável não tendo uma tecnologia padrão para desenvolver o software, o que significa que a cada projeto temos que começar de novo aprendendo novas tecnologias e refazendo funcionalidades que já tinhamos antes. Isto torna a produção de software inerentemente complexa. Não somos nós que a fazemos complexa, ela é complexa por natureza. O que podemos fazer é torná-la mais ou menos complexa, mas nunca apenas complicada ou  simples. Normalmente a tornamos mais complexa do que natural.</p>
<p style="text-align: justify;">Aceitar este princípio básico &#8211; &#8220;princípio zero&#8221;, poderíamos chamá-lo &#8211; é fundamental para conseguir fazer software. Isto era verdade a 50 anos atrás, e com a velocidade com a tecnologia evolui,  é muito mais verdade hoje. Não é por acaso que nasceram coisas como o Java e o .NET para quebrar um pouco desse escalar de tecnologia que constantemente nos exigia mudar de ferramentas para fazer software. As plataformas virtuais nos trouxeram uma âncora que nos ajuda a diminuir a complexidade. Mas a âncora não durará por muito tempo e novas âncoras precisarão ser desenvolvidas.</p>
<p style="text-align: justify;">Entendendo que fazer software é algo complexo, as pessoas esperam que a forma de gerenciar a produção do software tenha que ser igualmente complexa. E este é outro paradigma difícil de quebrar:  o complexo pode ser gerenciado com o simples.  O truque é mantermos os olhos nos objetivos. E são estes que têm que estar claros desde o dia um, e refinados todos os dias. Como já disse Dwight D. Eisenhower &#8221;O plano não é nada, planejar é tudo&#8221;. Ou seja, a complexidade é tratada facilmente se o plano não for fixo e evoluir conforme as circunstâncias. Mas veja, o plano muda e é descartável, mas não os objetivos  (e se você tem algum sentido de ética, nem todos os caminhos são aceitáveis).  Algumas pessoas entendem esta frase assim: &#8220;não faça planos&#8221;. É errado. A mensagem é &#8220;Faça planos, e continue fazendo planos. Não pare de fazer  planos até chegar no objetivo&#8221;. A cada plano temos um mapa do caminho para os próximos tempos  ( horas, dias, semanas, meses, anos&#8230; não interessa), quando replanejarmos teremos um plano que vai um pouco mais à frente e assim continuamente. A mal intrepretação deste simples conceito leva a aberrações como a recusa de criar uma plataforma de aplicação coerente e coesa ou simplesmente achar que é possível levantar requisitos &#8220;on-the-fly&#8221; na medida que o projeto progride.</p>
<p style="text-align: justify;">A complexidade do software demanda o processo criativo contínuo, e isso exige a atuação de pessoas em todos os pontos desse processo. Todo o resto são ferramentas.<br />
Será que o processo unificado (UP) ou qualquer outro processo criado antes de 1990 se baseia nestes princípios? Quero crer que não. Todos os processos clássicos se baseiam num mecanismo <a href="http://en.wikipedia.org/wiki/Stage-Gate_model" target="_blank">Stage-Gate</a> como o usado para construir carros e aviões (!). Este tipo de processo simplesmente não funciona quando a principal energia é a criatividade,  e é por isso que <a href="http://www.it-cortex.com/Stat_Failure_Rate.htm" target="_blank">muitos de projetos de software falham</a>.  Em qualquer outro ramo de atividade, tantos projetos falharem é inadmissível. Em software, fazemos de conta que não é verdade.</p>
<p style="text-align: justify;">O que não é admissível é que seja possível viver construindo software sem ter um processo-base para tal.  Práticas de laboratório até temos algumas (vide práticas de XP ) e temos alguns candidatos a processos de gerenciamento <em>realista </em>de software como Scrum. Mas ainda aguardamos o santo graal do processo de software.  O Processo Unificado não é bom o suficiente porque ele é muito semelhante a um processo Stage-Gate  e é corrompido muito facilmente se transformado num processo que tradiconalmente é usado em empresas produtoras de software. Um processo criado &#8220;in-house&#8221;, híbrido e muito parecido com um Frankeistein , um monstro fabricado de partes de outrém.</p>
<p style="text-align: justify;">A promessa de um processo padrão moderno, confiável, honesto, que tome em consideração a complexidade, os requisitos, as tecnologias, e as pessoas ainda está por vir.  A minha aposta é que será algo muito semelhante a uma fusão de Scrum com XP e diretivas do <a href="http://manifesto.softwarecraftsmanship.org/" target="_blank">manifesto de software craftsmaship </a>que apela a um certo padrão de qualidade e orgulho no trabalho que fazemos &#8211; que por exemplos os alfaiates têm &#8211; que nós,  produtores de software, ainda não temos.</p>
<p style="text-align: justify;">Software é simplesmente complexo, e é por isso que gostamos de o fazer. Aceitemos de uma vez por todas a sua complexidade natural e façamos-o com o respeito que merece.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/CcPcT2NaSIo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/06/simplesmente-complexo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/06/simplesmente-complexo/</feedburner:origLink></item>
		<item>
		<title>Programadores Java ou Ratos ?</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/VHBD7w34c6Y/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/06/programadores-ou-ratos/#comments</comments>
		<pubDate>Sat, 19 Jun 2010 02:55:23 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Quotidiano]]></category>
		<category><![CDATA[boas práticas]]></category>
		<category><![CDATA[crédito técnico]]></category>
		<category><![CDATA[erros comuns]]></category>
		<category><![CDATA[qualidade]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1031</guid>
		<description><![CDATA[Não sei se felizmente ou infelizmente mas a API java não dá suporte a algunas coisas que são bem comuns no desenvolvimento de software. Algumas ele até suporta, mas as pessoas não usam direito. Quando se constroi um sistema do zero, algumas coisas precisam ser desenvolvidas simplesmente porque não ha nenhuma biblioteca que as tenha, [...]]]></description>
			<content:encoded><![CDATA[<p>Não sei se felizmente ou infelizmente mas a API java não dá suporte a algunas coisas que são bem comuns no desenvolvimento de software. Algumas ele até suporta, mas as pessoas não usam direito. Quando se constroi um sistema do zero, algumas coisas precisam ser desenvolvidas simplesmente porque não ha nenhuma biblioteca que as tenha, e mesmo se houvese, não as teria exactamente como precisamos. Então equipas afoitas que querem logo começar a debitar entreguas esquecem-se deste <em>pequeno </em>promenor e não dispendem o tempo e o estudo necessário relativamente a estes detalhes. Depois o que acontece ? Acontece que como o design não coopera com a realidade, as gambiarras começam a acontecer. E todos sabemos onde isso nos leva&#8230; Então ha que ter cuidado com estes impulsos&#8230;</p>
<h2>Tiny Types</h2>
<p>Não ha muita documentação sobre isto, porque é bastante trivial e se aprende nas primeiras páginas de qualquer livro sobre orientação a objetos : Classifique os conceitos. Ou seja, crie classes para os conceitos. Classes não são artefactos que permitem reaproveita código, elas são artefactos que nos permitem classificar o codigo, da mesma forma que os biologos classificam os seres vivos usando uma classificação em reinos, filos, etc, até as  espécies.</p>
<p>Apenas uma pessoa sem noção lhe dirá que exista tal coisa como &#8220;classes demais&#8221; .. acaso existem conceitos &#8220;demais&#8221; ? Podem existir conceitos que não cabem no contexto, mas não conceitos demais. Não se poupe de criar classes , por muito simples que pareça.</p>
<p>Java é fortemente tipado e existe uma muito boa razão porque as linguagens de propósito geral são fortementes tipadas : permitem melhor classificar conceitos e por consequência melhor polimorfismo. Use isso em sua vantagem.</p>
<p>Crie tipos especiais para todos os tipos de dado, objeto, conceito , etc&#8230; que não forem suportados pelos tipos básicos do Java. CPF não é um numero, não é um texto, é um código. Não existe uma classe Code no java. Crie um objeto CPF, Telefone, etc&#8230;e se quiser até um objeto Number e Text. Afinal o number do java não tem operações aritméticas básicas como somar e subtrair.</p>
<p>A aritmética computacional de ponto flutuante é mais complexa do que explicam na escola. Não confie nela. Use objetos especiais para frações, taxas e sobre tudo para dinheiro. Mesmos que seja apenas para uma moeda e apenas para encapsular um BigDecimal ( mas , na real, implemente o padrão Money sem BigDecimal), mas sempre crie um tipo especifico para representar dinheiro.</p>
<h2>Datas e Tempos</h2>
<p>Aprenda a usar Date e Calendar, mas não os use diretamente. Crie tipos especializados. Crie objetos de intervalo, muito uteis, mas inexistentes em java. Use uma API como o Joda-Time (no futuro use a API de Date &amp; Time do java) , ou crie a sua, mas criar uma API de tempos e datas não é trivial, você precisa ter muito conhecimento de como funcionam os mecanismo. Nunca , nunca, use Calendar como um atributo de uma entidade. Isso é o equivalente a vc usar um objeto Calculadora em vez de Integer.Use Date ou um objeto que faça o mesmo que Date, ou seja, nada. É um objeto que contém um long que é o numero de milesegundos desde 1 de janeiro de 1970. Apenas isso.</p>
<p>Não assuma que trabalhar com tempos de datas é facil. Não cometa o erro muito básico de fazer as contas você mesmo. Nunca faça isso. Delege  a Calendar ou a uma API especilizada como o Joda-Time. Nunca faça calculos do tipo o mês tem 30*24h ou assuma que uma hora sempre têm3600 segundos e um dia tem sempre 24 horas. Crie objetos para representar a duração e o periodo independentemente. Investigue até você saber a diferença entre estes dois.</p>
<p>Date e Calendar não dão suporte a dias uteis que é uma demanda comum em sistema, portanto você terá que implementar essas lógicas. Não é simples. A definição de dia util depende do negócio. Nem sempre o Domingo é uma folga. Feriados normalmente são lidos de um banco. Tenha isso em atenção.</p>
<p>Monte uma estrutura e reuse-a. Não se contente com o simples, faça-a robusta e reutilizável em mais do que um sistema. Use muitos cenários e mantenha muitos testes. Faça-a exacta, não um tapa-buraco.</p>
<h2>Tratamento de Exceções</h2>
<p>Tratamento correto de exceções tem regras. Force-as. Tome atenção à camada onde a exceção será lançada, e de onde, na camada, o será. Entenda o conceito de exceção, e sobretudo a diferença prática entre exceções verificadas e não verificadas. Siga boas práticas de tratamento de exceções como se a sua vida dependense disso. Ela realmente depende. Ok, talvez não a sua <em>vida</em>. Mas as a sua saúde mental com certeza.</p>
<p>Não tente criar uma hirarquia &#8220;auxiliar&#8221; de exceções. Não faça suas exceções muito espertas, mas faça-as informativas. Enriqueça-as com parametros. FileNotFound &#8211; qual file ? ClassCastException ? qual classe ? Não use mensagens hardcoded. Use chaves de mensagem e um sistema deresource bundle para a tradução (ver internacionalização).  E nunca, nunca, pelo que lhe for  mais sagrado,  mate um stacktrace. Se vc não sabe o que isto signfica, então vá estudar mais. Você não está preparado para trabalhar com java e muito menos para criar um sistema do zero.</p>
<h2>Internacionalização</h2>
<p>Não confunda Internacionalização (i8n) com Localização (L10n). Internacionalização significa : &#8220;Nenhuma informação que seja passivel de ser diferentes entre culturas é hardcoded&#8221;. Localização sgnifica : &#8220;Faça todas as informações passives de serem diferentes entre culturas sejam especificas e coerentes com a cultura X, por agora&#8221;.<br />
Não cometa a o erro de  achar que internacionalização é sobre traduzir textos. Nem pense que  não faz falta se o sistema apenas será usado em uma cultura.</p>
<p>Repare que eu disse cultura, e não Locale. Cultura não muda apenas entre paises e linguas. Pode mudar entre empresas e négocios e até mesmo entre departamentos da mesma empresa.</p>
<p>Aprenda a usar os recursos do pacote java.text como DateFormat, NumberFormat e MessageFormat. Aventure-se a criar a sua API de globalização (que soma as ferramentas para internacionalização com de localização). Crie uma convenção de nomenclatura para as chaves das mensagens. Faça-a hierarquica separando os niveis com ponto ,por exemplo: label.cliente.nome<br />
Nunca escreva codigo de conversão de String para data ou de String para numero, etc&#8230; use formatadores. Crie formatadores para os seus tiny types. Formatações são etérias, dados são eternos.</p>
<p>Mas internacionalização não é apenas uma questão de estilo. O seu sistema trabalha com endereços ? Ele aceita endereços no estrangeiro ? Imagine se Amazon não aceitasse endereços no estrangeiro&#8230;<br />
O seu sistema segue padrões internacionais ISO para pesos e medidas ? Ou é como a sonda NASA que faz metade no sistema métrico e metade no sistema de libras ? O seu sistema trabalha com dinheiro? várias moedas  ? como vc grava no banco ? com duas casas decimais ? E as moedas que não têm casas decimais ? E as que têm mais  de 2 casas ? Você grava datas no seu banco de dados ? Em qual fuso horário ? O seu banco suporta diferentes fusos horários ? Seu sistema é um site ? Ele atende vários paises ? qual é o encoding das suas páginas ? Não é UTF-8 ?</p>
<p>Sempre que vir o requisitos &#8220;Este sistema deve ser internacionalizado&#8221; trema de medo, porque vêm muita coisa ai. Não assuma que é simples, nem fácil, nem barato.</p>
<h2>Validação</h2>
<p>Validação não é o mesmo que consistência. Consistência  : garantir que o objeto não tem um estado impossivel.  Por exemplo, 30 de fevereiro é inconsistence. Validação é verificar que um objeto consistente, é usável pelas regras da aplicação/negócio.  Use uma API de validação. De preferencia faça a sua mesma. É um bom exercicio de OO. Inspire-se em bibliotecas que já existem como a Apache Validator ou a JGodies Validations. Tem a JSR de Beans Validation, dê uma olhada também&#8230; quiça faça parte do futuro do java.</p>
<p>Modificadores ( vulgo, setters) não fazem validação. Eles fazem consistência !</p>
<h2>Pesquisas</h2>
<p>Entenda que a parte que importa de um sistema de dados é pesquisa. Tenha uma API preparada para isso. Não foque apenas no CRUD, lembre-se que existem relatórios e existe importação/exportação de dados.  Faça um sistema orientado a dominio. É mais simples, mas tenha cuidado de não abusar ou confiar demais em ORM. JDBC funciona muito bem, obrigado.</p>
<p>Use um sistema de Critérios+Intrepretador. Mesmo se usar o Hibernate. Não crie critérios do Hibernate diretamente. Isso ajudará a manter uma API de critérios que faz oq ue você quer mesmo que o Hibernate ou o JPA não façam. Nesses casos você apela para estratégias alternativas.</p>
<p>Não assuma que suas tabelas têm poucos dados e nunca precisará paginá-los ou carregar mais de 10 mil registros de um só vez. Vcoê precisará. Os dados acumulam-se. Tenha isso em conta desde o inicio. Use padrões como Fastlane Reader para ler muitos dados .</p>
<p>Não menospreze o poder do banco de dados de fazer calculos agregados (somas, médias, etc&#8230;) aproveite-se disso para aumentar a performance, mas nunca à custa de violação de camadas.</p>
<p>Se está com pressa use o Hibernate como motor das pesquisas, mas faça uma casca em torno dele. Ele não é perefeito e você terá que limar algumas arestas. Aprenda a mexer com Hibernate. Não é simples. Ele é bastante complexo , mas o abandone à primeira.Se tem tempo, crie sua propria API. É ainda mais complexo do que fazer o hibernate e o risco é brutal, mas o aprendizado é grande &#8230; faça você olhar o hibernate com outros olhos .. mesmo com todas as suas falhas.</p>
<p>Desista de usar like para pesquisas textuais do tipo que vemos em sites de e-comerce. Aprenda a usar o Lucene.  Melhore a experiencia dos usuários.</p>
<h2>TagLibs e TagFiles</h2>
<p>Use-os. Não use tags de terceiros. É tentador, mas você cai no vendor lock-in que nem um patinho ( ou será como um &#8220;bobinho&#8221; ?).  Sobretudo tags relacionadas a internacionalização e acesso. Proiba todo e qualquer uso de scripts ( excepto, talvez, em tag files). Use tag files para coisas que dependem de css ou da estruura gráfica do sistema em si e taglibs ( o nome correto é tag handler, mas todo o mundo conhece como taglib) para coias mais gerais, até para coisas que mais do que um sistema poderia usar ( como o controle de acesso).</p>
<p>Não use includes ( se tiver que usar use a tag jsp:include e não a diretiva include). Use frameworks como o sitemesh ou o tiles  , ou desenvolva seu mecanismo. Mais uma vez, não é trivial, portanto se você não sabe, use uma API canónica. Não invente muito, use JSP e nada de velocity ou freemarker ou essas outras tecnologias de renderização. Nem sequer xml+xslt (jsp pode escrever xml também, sabia ?).</p>
<p>Se usa JS F ignore a parte de jsp e taglibs, mas não ignore o problema de usar componentes de terceiros.</p>
<h3>Epilogo</h3>
<p>Sim. É complexo. Muita coisa para começar uma aplicação decente, mas somos programadores java ou ratos ?</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/VHBD7w34c6Y" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/06/programadores-ou-ratos/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/06/programadores-ou-ratos/</feedburner:origLink></item>
		<item>
		<title>Contratos de Software</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/uLSnHKkmXHQ/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/06/contratos-de-software/#comments</comments>
		<pubDate>Fri, 04 Jun 2010 15:05:37 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Planejamento]]></category>
		<category><![CDATA[Quotidiano]]></category>
		<category><![CDATA[contrato]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[valor]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1025</guid>
		<description><![CDATA[Os contratos de software baseados em comparações simplistas de software com casas e aviões, são a casa da falência de muitas empresas e a falha de muitos projetos. Porque o mundo do software conta com uma característica unica de trabalhar com requisitos mutáveis, os contratos devem ser mais flexíveis e incentivar a comunicação e a colaboração.]]></description>
			<content:encoded><![CDATA[<p>Ha muito que eu queria escrever sobre este assunto. É um assunto rico, então, talvez escreva mais no futuro sobre isto.</p>
<p>Existem diferentes tipos de produtora de software. Temos a produtora interna. Aqui estamos falando de um departamento da empresa que produz software para a empresa. Normalmente produz alguma ferramenta (ERP) ou um meio de comunicação com os clientes (site e-commerce). O produto de software criado assim visa ajudar a empresa no seu fim, mas o produto não é comercializado.  Temos depois as produtoras on demand que fazem software sob medida (tailored) e finalmente as que fazem software como um produto. Aqui distinguimos entre  as que fazer produtos de prateleira (compre e costumize você mesmo ) e os implantáveis (compre, e costumizamos para você antes de começar a usar). A primeira linha é muito comum para produtos ao consumidor geral (empresas e individuos) como sejam o Office, os sistemas operacionais, os anti-virus, e os tocadores de musica. No segundo bloco temos os produtos de ERP e produtos mais especializados que precisam ser condicionados ao ambiente da empresa onde serão utilizados.</p>
<p>Vou me concentrar nos casos dos produtos de software feitos sob encomenda e/ou sob media. Aqui temos um cliente que deseja um software, e uma empresa que provê o serviço de produzir esse software. Entre eles deverá existir um contrato. Ora, o objetivo deste contrato é a realização do software e para isso temos que saber o que &#8220;é o software?&#8221;. O software será um conjunto de funcionalidades que permitirá ao cliente atingir certos objetivos. Estes objetivos devem ser claros para cliente e produtor, ou todos estarão em problemas. Nem todas as funcionalidades que o produtor incluir no software ajudarão o cliente a alcançar os objetivos. O conjunto de todas essas funcionalidades é chamado: Escopo. Algumas funcionalidades ajudarão mais, e outras menos, e a unica forma de saber qual é qual é deixar o cliente experimentar o software e decidir.  Então como criamos um contrato que permita alcançar isso ?</p>
<p>Existem vários tipos de contrato no mercado. Conforme o tipo de contrato que as partes escolherem isso formará um vinculo entre eles.  Nem sempre as partes são conscientes do vinculo que estão formando e nem sempre elas se apercebem dos riscos que estão enfrentando.</p>
<p>É interessante olha um contrato de software à luz do <a href="http://pt.wikipedia.org/wiki/Dilema_do_prisioneiro">Dilema do Prisioneiro</a> sendo o cliente um dos presos e a empresa que provê a construção o outro. A &#8220;policia&#8221; seria o mercado em si. Se ambas as partes não cooperarem, ambas  terão prejuízo. Qualquer contrato de software que leve a uma relação diferente da cooperação irá beneficiar apenas um dos lados , e no extremo, nenhum dos dois.</p>
<p>Falarei dos contratos de forma geral, já que se aplicam no mercado a diferentes ramos e conforme diferentes objetivos, em seguida especificarei o que acontece quando usamos esse contrato para contratos de software.</p>
<p>O contrato mais comum  é conhecido como Time and Materials. Neste tipo de contrato o provedor do serviço de construção cobra um valor fixo por unidade de trabalho. Normalmente a hora-homem. Este contrato não impõe limite ao prazo nem ao escopo do que será feito e portanto lança todo o risco no colo do cliente. A vantagem do cliente é poder terminar o contrato quando quiser, mas a desvantagem é que o trabalho pode se arrastar indefinidamente. Este contrato cria um vinculo de indiferença. O provedor não ganha nada terminando o trabalho antes e o cliente fica sempre aguardando que o trabalho termine sem poder fazer nada. O escopo aberto parece dar ao cliente a possibilidade de cortar quando quiser, mas na prática o cliente sim tem um escopo mínimo que ele quer ver completo. No mundo do software este é o famoso &#8220;cobrar por hora e vamos ver onde chagamos&#8230;&#8221;. O produtor cobra por hora pelo resto da vida e o cliente que saiba o que quer.Se o cliente se engana e ha retrabalho, tanto melhor : mais horas. Se o produtor se engana, tanto melhor : mais horas para resolver o problema.  Porque o cliente não quer pagar pelos erros do provedor, este contrato causa muitos problemas e não cria uma relação de colaboração entre as partes &#8211; bem pelo contrário o cliente está submetido à boa vontade do provedor, porque ele pode simplesmente preferir realizar o trabalho de outro cliente que lhe paga mais por hora. Claro que o cliente pode sempre mudar de provedor, mas a realidade é que só o fará quando for realmente insuportável continuar com o atual e normalmente o provedor tem lábia suficiente para ludibriar o cliente.</p>
<p>Uma variante é estabelecer um teto para o custo total e fixar um escopo. Isto, claro,  funciona quando o escopo é realmente fixo. Caso contrário , porque o custo é fixo, o provedor irá resistir a qualquer alteração do escopo. No caso extremo irá cobrar extra por novas coisas, caso em que ele estimula o cliente a definir o escopo errado para depois poder cobrar alterações.  No final este tipo de contrato é ainda pior para o cliente. Para software isto é um desastre. Não apenas o provedor não tem qualquer incentivo para definir bem o escopo, ele tem incentivo para o definir mal.  O fato do custo ser fixo, que deveria proteger o cliente, acaba fazendo lhe ainda mais mal.  O resultado é o mesmo em um contrato do tipo Fixed Price, Fixed Scope , onde o cliente paga um preço, fixa um escopo e o projeto anda até que tudo esteja completo sem prazo para terminar. Mais uma vez o provedor se faz valer de uma cláusula de alterações que oneram o cliente cada vez que forem feitas. Conclusão, se o cliente não tem o escopo bem definido, o provedor não irá se esforçar para o definir, pois toda a alteração será cobrada à parte.</p>
<p>Alguns acham que isso pode ser resolvido fixando também o prazo. Isto nos leva ao contrato do tipo Fixed Everything em que prazo, escopo e preço estão fixos. Aqui os papeis se invertem e é o provedor que fica na mão do cliente. O cliente incha o escopo com tudo que imaginar e estabelece um prazo e um preço para tudo isso. O provedor ou aceita, ou não aceita. Se aceitar, porque o cliente que estipula o escopo, o cliente pode sempre adicionar mais detalhes ao escopo, realmente tornando-o maior na prática, mas não no papel e portanto impedindo o provedor de cobrar por isso.  Este tipo de contrato é comum em licitações em que o cliente já fixa previamente tudo, mas deixa margem para inchar os detalhes ou espera fazer pressão econômica depois, ameaçando não pagar o provedor se ele não incluir mais aquela &#8220;pequena alteração&#8221;. Em software, porque os escopo é inerentemente  variável,  o provedor está automaticamente em desvantagem. Muitos provedores aceitam este tipo de contrato com medo que a sua concorrência os aceite primeiro. Este é o erro que alimenta a prática dos clientes estipularem este tipo de contrato.  Sendo que este tipo de contrato é altamente arriscado para o provedor, o fato do concorrente o tomar deveria ser entendido como bom, já que o risco está agora no concorrente e não com o provedor. O provedor pode então procurar outro tipo de contrato com outros clientes que sejam mais proveitosos e no longo prazo desfalcar o concorrente pois ele está metido até ao pescoço num contrato sanguessuga. Mas por alguma razão juvenil de &#8220;tentar ganhar do outro&#8221; os provedores de software acham que é melhor ser sugados por clientes com contratos fixed everything do que deixar os seus concorrentes serem sugados.  Sobretudo quando estamos perante uma licitação e o cliente é o governo. Aqui todo o senso empresarial vai para o espaço, porque o provedor acha que trabalhar para o governo é seguro ( não vai ficar sem trabalho), mesmo quando  isso significa que o governo o levará à falência. No mundo do software  não existe razão comercial que suporte aceitar este tipo de contrato, seja com quem for a menos que você tiver um às na manga (mais sobre isso em outra oportunidade ).</p>
<p>Se reparou bem, até agora, todos os tipos de contrato oneram uma das partes. Não ha nenhum que estabeleça metas comuns. O resultado é que &#8211; no mundo do software &#8211; estes contratos sempre falharão. Cada tipo de contrato é bom para determinadas circunstâncias de escopo. Quanto mais conhecido e fixo o escopo, mais simples o contrato porque menor o risco.   O problema é que, em software, o escopo é sempre mutável.</p>
<p>A moral desta recapitulação é que não podemos usar qualquer contrato para serviços de construção de software. Muito menos nos podemos guiar por modelos de contratos utilizado em outros ramos de atividade onde o conhecimento dos requisitos é estável. Nada de usar contratos como se o software fosse uma casa, uma ponte ou um avião. Isso são coisas com requisitos muito estáveis, logo, com contratos mais simples.</p>
<p>Bom, resta então, desenhar um contrato que seja vantajoso para ambas as partes e seja compatível com um escopo variável. Para isso temos que entender que o escopo tem duas propriedades : tamanho e característica. A característica do escopo é aquilo que a funcionalidade é. O tamanho se relaciona ao esforço para  construí-lo .</p>
<p>A primeira aproximação é o tipo de contrato baseado em Time and Materials mas com escopo variável e custo fixo. Nste tipo de contrato o tamanho do escopo é fixo &#8211; e portanto o custo é fixo, mas a característica é variável. Ou seja, o escopo definido no inicio é a base para uma estimativa de tamanho. Essa estimativa de tamanho é usada para estimar custo e prazo, mas o cliente pode mudar a característica do escopo, ou seja, pode mudar as funcionalidades ou o que as funcionalidades fazem. Isso deve ser feito de forma controlada de forma que nunca ha aumento de tamanho. Em software, este tipo de contrato é muito usado na cena ágil porque o cliente pode modificar o escopo conforme o valor das funcionalidades e conforme vai conhecendo, vendo, e experimentando o software. Uma variante consiste em deixar aberta a possibilidade  do cliente terminar o projeto antes de utilizar todo o custo/tamanho planejado. Esta variante de Valor Máximo, divide o custo não utilizado pelo cliente e o provedor, oferecendo aos dois vantagem se o projeto não chegar no custo, e portanto, incentivo para a colaboração e o alcance do valor máximo o quanto antes. Acontece que este tipo de contrato é fortemente baseado na estimativa inicial o que significa que se o provedor estimou mal ele estará se beneficiando em detrimento do cliente.  Isto nos leva ao ultimo tipo de contrato.</p>
<p>Este tipo de contrato é muito semelhante mas adiciona um limite máximo de expansão do custo. O provedor estima o tamanho e o custo da mesma forma que antes, mas em seguida adiciona uma margem. Se tudo correr bem e o cliente der o projeto como terminado antes de atingir o custo, os ganhos são repartidos como antes, metade-metade. Se o projeto passar do custo estimado, e até chegar no limite da margem, o prejuízo é partilhado metade-metade. Se o custo passar do limite da margem o prejuízo é totalmente por conta do provedor (já que isso significaria que o provedor estimou mal e conduziu mal a construção).</p>
<p>O mecanismo de estimativa de tamanho não é relevante, o que é relevante é que o provedor tenha um bom conhecimento entre a relação desse tamanho com o custo. Em horas-homem, meses-homem ou pontos de estoria, tanto faz.  O que interessa é que haja uma unidade e uma forma de a converter em custo. Vejamos um exemplo utilizando uma aproximação mais comum hoje em dia, o custo por hora-homem.  O provedor estima o projeto em 1000 horas-homem a um custo de 80 reais por hora-homem equivale a um projeto de 80 mil reais. Se tudo correr bem, esse é preço certo do projeto. Consideremos então uma margem de 20 mill reais (250 horas-homem) . O projeto custará no máximo 100 mil reais.</p>
<p>No espírito do contrato anterior, temos que repartir ganhos e prejuizo até chegar em 100 mil. O cliente paga 40 mil à cabeça e 40 reais por hora-homem até atingir o valor máximo do projeto de 100 mil reais.  Veja que isso significa que se o projeto terminar no tamanho estimado, o preço pago será o estimado (40  mill + 40* 1000 horas-homem) e o cliente terá pago exatamente 80 mill reais. Se o projeto terminar antes, gasntando apenas , digamos 600 horas, porque o cliente estava pagando metade do preço-hora o projeto termina com vantagem dos dois lados. Se o projeto vai além do tamanho estimado, digamos 200 horas ambos terão prejuízo de 40*200  = 8 mil reais.</p>
<p>Este tipo de contrato não coloca as partes em competição mas sim em colaboração com objetivos concretos e vantagens concretas.  Repare que o tamanho do escopo é fixo, o que significa que o custo só aumenta por atraso na execução e nunca por aumento de escopo como nos outros contratos. Porque o cliente não pode aumentar o custo, e também terá prejuízo se o projeto atrasar ele é incentivado  a escolher funcionalidades mais valiosas e mais &#8220;simples&#8221;.</p>
<p>Obviamente este tipo de contrato só funciona se as partes  tem capacidade de entender o seu funcionamento e o conceito de que nem todas as funcionalidades têm o mesmo valor e por conseqüência as mais valiosas e importantes devem ser feitas primeiro e algumas delas não serão feitas.  Este tipo de contrato estimula também o provedor a ter que trabalhar de uma forma que lhe permita terminar o quanto antes e responder rapidamente a alterações nas características do escopo. O que é muito simples se a empresa segue práticas ágeis de gerência e desenvolvimento.</p>
<p>Finalmente é importante notar que o fato das empresas colaborarem obriga à comunicação sincera e isso leva à criação de vínculos de confiança que permitem novos projetos no futuro. Além disso o impacto psicológico de terminar antes do custo faz o provedor se diferenciar no mercado face a outros concorrentes e deixa o cliente contente o suficiente para recomendar aquele provedor a outros parceiros.</p>
<p>Se você é responsável por contratos de software, pense bem nisto, e tente melhorar a sua forma de se relacionar com o seu cliente. Ele não é seu patrão e nem você é o cafetão dele. Vocês são colaboradores.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/uLSnHKkmXHQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/06/contratos-de-software/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/06/contratos-de-software/</feedburner:origLink></item>
		<item>
		<title>Scrummas</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/neKxoedILXo/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/04/scrummas/#comments</comments>
		<pubDate>Wed, 28 Apr 2010 03:26:57 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Quotidiano]]></category>
		<category><![CDATA[scrum]]></category>
		<category><![CDATA[valores]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1013</guid>
		<description><![CDATA[Um dos piores inimigos do Scrum é a sua simplicidade. Ele é tão simples que as pessoas olham preplexas e dizem "ah! é só isso ?!" Sim é só isso. 5 valores, uma mão cheia de backlogs e ciclos . Porque querem complicar o que é simples?
Scrummas é um cancer que nasce na própria mente humana. É inerente ao ser humano encontrar dualidade. Quando no caos ele procura a ordem, quando na ordem procura a revolução.]]></description>
			<content:encoded><![CDATA[<p>Um dos piores inimigos do Scrum é a sua simplicidade. Ele é tão simples que as pessoas olham preplexas e dizem &#8220;ah! é só isso ?!&#8221; Sim é só isso. 5 valores, uma mão cheia de backlogs e ciclos . Porque querem complicar o que é simples?</p>
<p>Mas o problema vem na prática.  Na prática não é nada simples ser fiel aos 5 valores ( Compromisso, Abertura, Respeito, Foco e Coragem),  afinal, estes valores parecem escassear nos dias de hoje. Afinal não é tão simples manter backlogs. Priorizar, comparar valor, estimar tamanho&#8230; não é tão simples na prática. Afinal não é tão simples, e  o fardo começa a ficar claro quanto mais a pessoa entende scrum. Não é por acaso que &#8220;Coragem&#8221; é necessária. Sem ela a pessoa desiste antes de ver os louros.</p>
<p>Todos aqueles que começam a usar scrum pela primeira vez passam por este processo de ir da glória da ignorância &#8211; achando que é simples de mais- ao inferno do pesado fardo da responsabilida e do compromisso &#8211; de volta à glória da sapiencia após entender que realmente funciona.Mas é trivialmente fácil a pessoa se enganar. É muito simples a pessoa faltar ao compromisso, à responsabilidade, perder o foco, perder coragem. Afinal , qual é o castigo ? Porque perder tempo com backlogs ? porque não simplesmente mandar os rapazes fazer o que queremos ? afinal quem vai nos exigir explicações ? ora&#8230;  Porque fazer reuniões todos os dias ? afinal as pessoas têm boca é para falar, porque precisamos de uma cerimónia, porque raios as pessoas não conversam quando elas querem ?</p>
<p>Perguntas imbecis como estas &#8211; embecis porque existem imensos estudos e autores explicando porque essas coisas são ruins &#8211; permeiam a cabeça de todos aqueles que foram educados e tem vivencia na forma tradicional de fazer software. Daqui nasce o Scrummas. É comum , hoje em dia, ouvir respostas como &#8220;Nós usamos scrum, mas&#8230;. &#8221; seguido de alguma desculpa esfarrapada de porque foi boa ideia eliminar algum dos principios , valorer , práticas ou cerimónias do scrum. O Scrummas  (em inglês scrum-but, que é um trocadilho com butt que significa bunda) , advém da explicita violação do primeiro valor :compromisso. Ou bem que vc se compromete a seguir o scrum, ou bem que não. E na hora que vc começa a driblar e a arrajar desculpas é uma falha no compromisso. É uma desonestidade para consigo mesmo. Se não implementamos scrum totalmente como esperamos que funcione ? Quando vc muda o pneu do seu carro vc não aperta os parafuros porque &#8220;está com pressa e tem um horário a cumprir&#8217; ? quando vc come, vc come com os dedos porque &#8220;afinal, acabou de lavar as mãos&#8221; ?  O que é você ? Uma criança com um monte de desculpas ? E para quem são essas desculpas ? o seu pai ? &#8230; não&#8230; são para si mesmo. Para esconder a sua falta de fidelidade com os valores.</p>
<p>Scrummas é um cancer moral que nasce na própria mente humana. É inerente ao ser humano encontrar dualidade. Quando no caos ele procura a ordem, quando na ordem procura a revolução.  É dificil sem dúvida seguir os valores. Afinal seguir quaiquer valores é complicado. Sempre dá vontade de desistir uma hora ou outra.</p>
<p>A extrema simplicidade das práticas do scrum, e do agil em geral,  leva a um excesso de confiança, a uma atitude de &#8220;eu posso fazer isto, é canja&#8221;. Mas a realidade é dura, e essas mesmas práticas lhe mostrarm tudo o que ha de errado em si e nos outros , no projeto, no cliente, na sua cidade e até na sua familia. Isso é demasiado peso para uma pessoa só e quando mais ela enxerga que esse é destino final, mais ela quer desistir. Ela quer minar o sucesso do scrum porque inconscientemente ela sabe que esse sucesso será o seu fim. Ela apenas esquece que, sentir isso, é a prova que entendeu o scrum, mais: é a prova que se comprometeu com o scrum. E só então , com esse conhecimento, o mundo parecerá melhor.</p>
<p>Talvez a extrema simplicidade leve as pessoas a complicar a coisa um pouco &#8220;só p&#8217;ra ter graça&#8221;, ou para poder encontrar defeitos, ou auto-minar o seu sucesso. A velha conversa de &#8220;Scrum não é bala de prata&#8221; &#8230; ora, realmente scrum não é uma arma contra coisas sobrenaturais , mas sim é a forma correta de trabalhar no desenvolvimento de software. Pelo menos até que alguem imagine uma melhor. Porque este desdem, essa &#8220;falsa modéstia&#8221; ? Se temos monstros que comem o nosso lucro, a nossa paciencia, e nosso tempo, não é de uma bala de prata que precisamos ? Bom&#8230; visto assim, realmente o scrum não é uma bala, ele não mata os monstros. Ele está mais para lente de aumento ou espelho, que mostrar onde e quais são os monstros.  Tanta metáfora &#8230; Falta de abertura. Falta de dizer a verdade pura e simples : Scrum dói. Scrum é dificil. Scrum vai mudar a sua vida. Scrum precisa que você tenha coragem, que os tenha no lugar, a todo o momento. Vc vai sofrer, mas depois vai ser recompensado&#8230; e não ha garantia que esse depois chegue, então vá se preparando para o pior. E o pior é : você voltar a fazer software como fazia antes do scrum!</p>
<p>Os valores do scrum, não são apenas palavras, são coisas que cada desenvolvedor deve sentir e seguir. Como profissional e como pessoa. Só assim poderemos acabar com o  Scrummas e a forma imbecil de fazer software que a esmagadora maioria das empreas utiliza.</p>
<p>Sempre que ouvir &#8220;Fazemos scrum , mas&#8230;&#8221; e tiver um arrepiu, isso é o sinal de que você é um desenvolvedor de software moderno. Não desista agora. Porque agora  vai  ficar ainda mais dificil mas também muito mais interessante &#8230;.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/neKxoedILXo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/04/scrummas/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/04/scrummas/</feedburner:origLink></item>
		<item>
		<title>Arquitetura 2010 – Parte II</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/8HgxUs0C9qI/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/04/arquitetura-2010-parte-ii/#comments</comments>
		<pubDate>Mon, 26 Apr 2010 01:08:50 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Quotidiano]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=1011</guid>
		<description><![CDATA[Algumas pessoas pediram um exemplo de como seria a arquitetura referida no post Arquitetura 2010. Eis como seria.]]></description>
			<content:encoded><![CDATA[<p>O primeiro post desta série levantou muito burburinho pelas razões erradas. A culpa foi minha porque ao tentar explicar que aplicações EE e sites são coisas diferentes e que para fazer sites não precisamos de EJB acabei citando coisas que não precisava&#8230;</p>
<p>Felizmente algumas pessoas entenderam o objetivo do texto: descrever uma arquitetura mais adquada para sites <em>sem usar EJB</em> e aumentando as capacidades de teste e <a href="http://www.makinggoodsoftware.com/2010/03/02/robustness-the-forgotten-code-quality/" target="_blank">robustez </a>das aplicações. Algumas pessoas pediram um exemplo mais concreto desta arquitura. Porque isto implicariam em escrever muito codigo e seria extenso demorei um pouco. Mas já que tinha que o fazer, resolvi colocar esta arquitetura na nova seção de configurações de arquitetura. Quem estiver interessado pode ler o <a href="http://www.javabuilding.com/architecture/configurations/arquitetura-com-domainstore-repositorio-e-query-object.html" target="_blank">artigo completo</a>. Quem ler tenha em mente que é um &#8220;work in progress&#8221; e sugestões são bem vindas. A parte com CriteriaBuilder tive que pular pois ia ocupar muito espaço e não é o foco do artigo. Cada um poderá implementar como quiser. Só uso esse objeto porque ele torna muito facil criar criterios de busca.</p>
<p>Espero que fique claro  desta vez porque esta arquitetura é vantajosa face às tradicionais arquiteturas acopladas ao hibernate e/ou entity manager.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/8HgxUs0C9qI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/04/arquitetura-2010-parte-ii/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/04/arquitetura-2010-parte-ii/</feedburner:origLink></item>
		<item>
		<title>Atratividade e Priorização</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/wSxiDChp5iI/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/04/atratividade-e-priorizacao/#comments</comments>
		<pubDate>Tue, 06 Apr 2010 16:45:30 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Carreira]]></category>
		<category><![CDATA[Planejamento]]></category>
		<category><![CDATA[agil]]></category>
		<category><![CDATA[backlog]]></category>
		<category><![CDATA[custo]]></category>
		<category><![CDATA[requisitos]]></category>
		<category><![CDATA[valor]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=996</guid>
		<description><![CDATA[Não é porque a teoria "maistream" das metodologias ágeis ignora os problemas do Product Owner e confia no seu senso de valor que não podemos encontrar uma forma um pouco mais "cientifica" de fazer as coisas. O fator de Atratividade pode ajudar o PO a priorizar melhor o product backlog e a depender menos de decisões subjetivas]]></description>
			<content:encoded><![CDATA[<p>Durante um processo ágil de gestão o Product Owner é encarregue de definir a prioridade das estórias. Na teoria ele deve fazer isso baseado pesando o valor e o tamanho da estoria.  A prioridade é um numero relativo que ordena as estorias no backlog e não ha espaço para empate; todas as estorias devem ter prioridades diferentes. Contudo as metodologias ágeis terminam na fronteira do Product Owner assumindo que ele vai se virar  sozinho para avaliar o valor da estoria e depois compará-lo com o tamanho e priorizar o backlog. O como ele vai fazer isso é uma variável mágica.</p>
<p>No mundo real, contudo, o Product Owner tem que responder a vários stakeholders e o valor advém principalmente da expectativa e demanda que esses stakeholders têm em relação às features desenhadas nas estórias. Isto deixa o Product Owner numa posição muito subjetiva de ter que adivinhar os desejos de prioridade de todas as partes interessadas e, pior que isso, conseguir ordená-las.</p>
<h2>O método</h2>
<p>No seu livro &#8220;<a href="http://www.javabuilding.com/library/books/software-requirements.html">Software Requirements</a>&#8220;, Karl Wiegers demonstra um método que poderia ajudar nesta situação. Embora o método não tenha sido desenhado para aplicar num ambiente agil,  o conceito é simples o suficiente para ser adaptado.A atratividade é uma relação entre o valor, o custo e o esforço.</p>
<h3>O Valor</h3>
<p>Para chegar no valor da  estoria pedimos a cada parte interessada que pontue de 1 a 9 o beneficio que aquela estoria traz, sendo 1 uma estoria com o menor beneficio e 9 com o maior beneficio. Depois pedimos que pontue de 1 a 9 a penalidade de abandonar aquela estoria, sendo 1 uma estoria que não traz penalidade abandonar ( ninguém iria sentir falta dela) e 9 uma estória que tem maior penalidade ao ser abandonada (muitas pessoas iriam reclamar).</p>
<p>O valor será então a soma do beneficio com a penalidade. Assim, uma estoria que tem beneficio 1 mas penalidade 9 é equivalente em valor a uma que tem beneficio 9 e penalidade 1.</p>
<p>Esta pontuação pode ser definida apenas pelo PO no caso em que as partes interessadas não são tão interessadas assim para as fazer responder um questionário. O PO continuará confiando no seu tato e feeling, mas pelo menos será obrigado a colocar isso numa escala. Um trabalho semelhante ao que a equipa faz para pontuar o tamanho das estorias.  No caso geral, contudo, ele elaboraria um questionário e pediria que fosse respondido pelos stakeholders. Esta é uma prática já comum na área de jogos, por exemplo, onde as features são avaliadas por questionário respondidos por potenciais jogadores antes de serem incluídas para desenvolvimento.</p>
<p>Este método permite ao PO atribuir ao parâmetro de valor um numero, em uma escala relativa, que está diretamente relacionada à demanda e expectativa dos stakeholders em relação à estoria.</p>
<p>Pode acontecer que existam poucos stakeholders com que o PO pode interagir, por limitações variadas. Neste caso o PO deve procurar por mais partes interessadas ainda que &#8220;remotamente interessadas&#8221; e atribuir pesos diferentes às opiniões dadas pelos stakeholders principais e pelos secundários.  A ideia é que o PO deve aumentar a abrangência do grupo de stakeholders de forma a ter uma melhor ideia das suas demandas e expectativas. O tamanho do grupo, os papeis que essas pessoas desempenham em relação ao produto e a forma como pesar as demandas de cada um varia conforme o produto e as próprias pessoas envolvidas. O PO deve equacionar isso quando estabelecer critérios de como será levantada a pontuação de beneficio e penalidade. No caso extremo o PO necessitará de uma equipa própria que o possa auxiliar nessas tarefas.</p>
<h3>O Custo e o Tamanho</h3>
<p>O custo no método descrito por Wiegers é equivalente ao conceito de Tamanho em ágil. Estamos interessados numa medida relativa do quão grande é cada estória. Então, no caso agil, o PO usará as estimativas de tamanho em pontos de estoria estimada pela equipa por métodos como o planning poker.</p>
<h3>O Risco</h3>
<p>O risco também é avaliado pela equipa junto com o tamanho. O risco é a probabilidade de 1 a 9 de que a estoria não vai atender à demanda dos stakholders à primeira.  O risco não está relacionado à probabilidade de completar a estoria no sprint, nem relacionado ao cone de incerteza. Este  risco do método descrito por Wiegers está relacionado  à probabilidade de, uma vez ponta, a funcionalidade incluída pela estoria não satisfaça os stakeholders interessados.</p>
<p>As razões para o risco são muitas. Desde de um fraco levantamento de requisitos a uma equipa inexperiente nas tecnologias necessárias passando por uma fraca usabilidade ou um aspecto gráfico &#8220;feio&#8221;.</p>
<p>No modelo explicado por Wiegers existe a opção deste fator ser ignorado num primeiro uso do método e integrado na medida em que descobrir que as estorias não satisfazem os stakeholders. Isso pode ser controlado pelo numero de vezes que uma mesma funcionalidade, cenário de uso, ou tecnologia usada na implementação são modificados <em>depois </em>de estarem pontos.</p>
<h3>A atratividade</h3>
<p>Baseado no valor  (calculado pela soma do beneficio com a penalidade) no tamanho e no risco , calculamos a Atractividade da estoria ( que Wiegers chama também de Prioridade,mas em agil esse nome tem outro significado). A atratividade (A)- o quanto a estória é atrativa &#8211; é calculada da seguinte forma:</p>
<p><a href="http://sergiotaborda.javabuilding.com/wp-content/uploads/2010/04/eq1.png"><img class="aligncenter size-full wp-image-1003" title="atractividade" src="http://sergiotaborda.javabuilding.com/wp-content/uploads/2010/04/eq1.png" alt="atractividade" width="116" height="86" /></a></p>
<p>Onde <strong>v</strong> é o valor da estoria, <strong>t</strong> é o tamanho da estoria e <strong>r</strong> é o risco da estoria. <strong>V</strong> é a soma de todos os valores de todas as estorias, <strong>T</strong> é a soma de todos os tamanhos e <strong>R</strong> de todos os riscos. Este conceito de &#8220;todos&#8221; pode ser aplicado ao product backlog ou ao release backlog. Estamos interessados em ter uma medida relativa. Porque as estorias no backlog mudam (entram e saiem) a atratividade irá mudar nesse momento, o que é exatamente o que seria esperado empiricamente.</p>
<p>Se desconsiderarmos o risco, numa primeira aproximação, a formula se transforma em :</p>
<p><a href="http://sergiotaborda.javabuilding.com/wp-content/uploads/2010/04/eq22.png"><img class="aligncenter size-full wp-image-1002" title="eq2" src="http://sergiotaborda.javabuilding.com/wp-content/uploads/2010/04/eq22.png" alt="eq2" width="153" height="64" /></a></p>
<p>O fator T/V será igual para todas as estorias e igual a uma constante que apenas afetará o valor numérico da Atratividade mas não o seu valor relativo. Neste caso, simples, em que removemos o fator de risco, a atratividade se resume ao quociente entre o valor e o tamanho.</p>
<h3>Atratividade e Prioridade</h3>
<p>A razão pela qual não podemos considerar diretamente que a atratividade é equivalente à prioridade é  que a prioridade implica num valor diferente para cada historia, coisa que a formula da atratividade não garante. Então, no fim, o PO ainda terá que desempatar algumas estorias com atratividade igual, mas pelo menos agora ele terá que fazer isso apenas em alguns casos e não em todos. A atratividade é um coeficiente que pode ajudar a guiar a decisão do PO, mas é apenas uma formula matemática que não está sujeita a pressões de stakeholders.</p>
<h3>Adaptação</h3>
<p>O método descrito por Wiegers usa escalas de 1 a 9 para pontuar o beneficio, a penalidade o risco. Escolher uma <a href="http://www.se-radio.net/podcast/2009-06/episode-139-fearless-change-linda-rising">escala decimal é natural ao ser humano</a>, portanto a escolha de numeros menores que 10 é muito feliz neste método. Contudo, das práticas de estatística, sabemos que escalas impares fazem com que respostas a questionários tendão para o valor central sendo sempre melhor oferecer um numero par de opções. Por estas razões poderiamos aumentar a escala até 10, diferenciando o 5 e o 6 como uma indecisão mas com peso para um dos lados.</p>
<p>Um outro detalhe é que o valor numérico da atractividade vai variar entre numeros menores que um ( 1/13) e maiores que 1 ( 10 /1). O que pode confundir o PO ao comparar o numero 0, 00769 com 10, por exemplo. Além de implicar em regras de arredondamento chatas. Por outro lado, como a Prioridade normalmente usa numeros bastante grandes poderiamos aplicar um fator numérico à atractividade descrita por Wiegers para ter uma escala mais &#8220;humana&#8221; apenas com números inteiros e mais próxima da escala de Prioridade. Multiplicando por 100 mil, teríamos valores mais compráveis, por exemplo 1.000.000 e 7.692 eliminando o problema do arredondamento.</p>
<h3>A ditadura dos números</h3>
<p>Com esta técnica não apenas ganhamos uma forma de atribuir um numero e uma escala relativa ao Valor, mas ganhamos uma forma de comparar o Valor com o Tamanho de uma forma simples, que pode atuar como uma forma rudimentar de priorização. Contudo não podemos encarar este método como uma forma à prova de falha ou que substitui o discernimento do PO. É apenas uma ferramenta auxiliar para ajudar o PO a decidir, mas de nenhuma forma pode ser considerada a resposta definitiva que dita a prioridade das estórias.</p>
<p>Não é porque a teoria &#8220;maistream&#8221; das metodologias ágeis ignora os problemas do dia-a-dia do Product Owner e confia no seu senso de valor que temos não podemos sugerir uma forma um pouco mais &#8220;cientifica&#8221; de fazer as coisas olhando as boas práticas das metodologias clássicas. Afinal queremos um Product Owner que tome decisões baseado em fatos, não em suposições. E definitivamente não queremos um Product God que toma controle de tudo baseado nos sues próprios interesses.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/wSxiDChp5iI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/04/atratividade-e-priorizacao/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/04/atratividade-e-priorizacao/</feedburner:origLink></item>
		<item>
		<title>Arquitetura 2010</title>
		<link>http://feedproxy.google.com/~r/javabuilding/sergiotaborda/~3/AodPjAulmLY/</link>
		<comments>http://sergiotaborda.javabuilding.com/2010/03/arquitetura-2010/#comments</comments>
		<pubDate>Tue, 16 Mar 2010 14:46:12 +0000</pubDate>
		<dc:creator>sergiotaborda</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[Quotidiano]]></category>
		<category><![CDATA[aplicação]]></category>
		<category><![CDATA[application server]]></category>
		<category><![CDATA[arquitetura]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[ejb]]></category>
		<category><![CDATA[jpa]]></category>

		<guid isPermaLink="false">http://sergiotaborda.javabuilding.com/?p=984</guid>
		<description><![CDATA[Muito do que você encontra na internet sobre design e arquitetura de aplicações em java o remete ao JEE e ao famigerado EJB. Já foi o tempo em que EJB era condição sin qua non para criarmos aplicações corporativas e especialmente sites.
Hoje com o advento do Seam parece que EJB vai ser novamente necessário para fazer [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Muito do que você encontra na internet sobre design e arquitetura de aplicações em java o remete ao JEE e ao famigerado EJB. Já foi o tempo em que EJB era condição<em> sin qua non</em> para criarmos aplicações corporativas e especialmente sites.</p>
<p style="text-align: justify;">Hoje com o advento do Seam parece que EJB vai ser novamente necessário para fazer sites. Veja que Seam utiliza os EJB como back-beans do JSF o que significa que não funcionará fora de um Application Server. A maioria dos sites não precisa das capacidades contidas em  um Application Server, bastando um Web Container. A própria especificação JEE 6 vai oficializar este divisão entre o que é web site e o que é realmente uma aplicação corporativa.</p>
<p style="text-align: justify;">Ao falar de aplicação corporativa todos imediatamente pensam em bancos de dados, ou melhor, em SGBD (Sistema Gerenciador de Banco de Dados) e imediatamente pensam em DAO e depois em Hibernate e JPA.  O problema aqui é que DAO é obsoleto, JPA é infantil e Hibernate não tem concorrência. Se você está pensando em criar um software e em usar DAO, esqueça. Isso é coisa do passado. Hibernate e JPA são encarnações no novo padrão que matou  o DAO, o DomainStore. Então é neste padrão que você deve se concentrar hoje, e não no DAO. Para web site, você precisa no máximo de um Hibernate.</p>
<p style="text-align: justify;">Por que não JPA? Porque o JPA tem o mesmo problema do EJB 2.x. A especificação é simplista e falha. Ela viola explicitamente o propósito de mapeamento agnóstico o que significa que usando JPA você não poderá usar qualquer banco de dados. Aliás, se você usa algum tipo de SELECT esqueça JPA.  Não que o hibernate o vai liberar de criar código especial para este ou aquele banco, mas vai minimizar muito essa necessidade e adiá-la o máximo possível.  Mas o grande problema com o JPA é a criação de pesquisas. As pesquisas do JPA não são OO e não são agnósticas. As do Hibernate são OO se usar Criteria e agnósticas, quer usando Criteria ou HQL.</p>
<p style="text-align: justify;">As pesquisas são o elemento esquecido do CRUD. O objetivo de ter um mecanismo de CRUD é poder pesquisar os dados depois. Poderíamos até argumentar que todo o objetivo de ter um banco de dados é permitir as pesquisas. E onde escrevemos estas pesquisas?</p>
<p style="text-align: justify;">Obviamente teremos que as escrever em algum objetos cuja responsabilidade principal seja montar critérios do Hibernate. Estes objetos são os repositórios. Os repositórios concentram todas as responsabilidades CRUDL (CRUD + Listagem) e normalmente precisamos de vários deles.</p>
<p style="text-align: justify;">É muito comum a ideia de que ao termos um mecanismo com o  Hibernate poderíamos criar um DAO para encapsular as chamadas a ele, mas isso é um erro tático e técnico muito importante. Primeiro que apenas queremos na realidade facilitar o uso de classes como a Session e talvez adicionar um pouco mais de tipagem forte. Isso não é um DAO, é no máximo um Adapter. Nada contra construir um Adapter deste tipo, mas existe um ponto mais importante aqui. Se o repositório é responsável por montar objetos de Criteria, ele já está acoplado ao Hibernate; logo criar mais um objeto no meio é fútil. Por outro lado, se quisermos desacoplar  o Hibernate dos repositórios (veja, o Hibernate é apenas um, os repositórios são vários) precisamos, na realidade, de uma estratégia para criar os Criteria sem usar as classes do hibernate e depois delegar a algum outro objeto que as traduza para essa tecnologia. A forma mais realista de fazer isto é criar um mecanismo agnóstico de Query Object e Interpreter.  Funciona assim: o repositório é agnóstico (ou seja, não depende da tecnologia de persistência) e depende de um objeto PersistanceStrategy (o nome pode variar). Este objeto é, na verdade, uma interface, um serviço, cujo contrato também é agnóstico.  PersistanceStrategy aceita entidades para operações como save e delete, e aceita objetos Query Object para pesquisas. Objetos Query Object são como os Criteria do hibernate mas sem a dependência com o Hibernate.</p>
<p style="text-align: justify;">Depois criamos uma implementação HibernatePersistanceStrategy. Este objeto delega as operações ao Hibernate e sabe como traduzir Query Object agnóstico para Criteria do Hibernate.</p>
<p style="text-align: justify;">Dessa forma, se um dia você quiser remover o Hibernate,  você pode. E esse dia não é lá no futuro não. É amanhã, quando você começar a escrever os seus testes unitários e de integração.</p>
<p style="text-align: justify;">Recapitulando: Repositório conversa com PersistanceStrategy através de Query Object. Repositório é responsável pelo CRUDL da Entidade.</p>
<p style="text-align: justify;">Do outro lado, queremos manipular as entidades para conseguir criar valor. Controlar uma venda, uma compra,  uma transação de qualquer tipo. Para isso precisamos encapsular as regras para essa transação. Precisamos, principalmente, de objetos capazes de validar os dados de entrada e de objetos capazes de realizar o processo. Os primeiros são validadores e os segundos,  serviços.</p>
<p style="text-align: justify;">Serviços seguem  o padrão interface + várias implementações e temos dois grandes grupos. Serviços de aplicação (como enviador de email) e serviços de domínio (como o que realiza a transação de compra). O próprio PersistanceStrategy de antes é um serviço de aplicação.</p>
<p style="text-align: justify;">Validadores são usados dentro dos serviços para validar os dados de entrada. Neles mantemos todas as regras que permitem realizar a operação. Validadores podem ser usado fora dos serviços para acelerar as coisas e nem sequer chamar os serviços caso haja problema, mas devem sempre ser chamados dentro dos serviços independentemente de serem chamados antes. É como a validação javascript que não substitui a validação no servidor. Entenda-se: estes validadores não apenas validam os dados de input do usuário, mas aplicam regras de negócio a esses dados.</p>
<p style="text-align: justify;">Recapitulando:  Serviços de Aplicação e Serviços de Domínio.  Serviços utilizam Validadores para evitar corrupção.</p>
<p style="text-align: justify;">Finalmente, um pouco sobre actions. &#8220;Action&#8221; é qualquer classe onde você controla o fluxo de uma aplicação web. O nome ficou famoso devido ao Struts e muita gente ainda chama estas classes de controladores (quando na realidade são apenas Strategy) erradamente. Todos os frameworks web, de uma forma, ou de outra, acabam delegando a uma classe ou conjunto de classes a decisão de processamento de um certo request. Essa classe é a action.</p>
<p style="text-align: justify;">A action só pode conversar com Serviços de Domínio e executar pesquisas em Repositórios. Não podem invocar mecanismos save/delete nos repositórios. Para não cair nesta tentação é mais seguro você criar um serviço de dominio  que medie a comunicação action-repositorio, garantindo que apenas métodos de pesquisa são invocados. A responsabilidade das actions é converter os dados da UI em dados que os serviços entendem. Isso normalmente significa Entidades, mas não apenas. Vários Value Objects como BigDecimal e Date pode necessitar de conversão também. Eventualmente a Action pode invocar validadores antes de invocar os Serviços. Isto especialmente para ser capaz de informar o usuário e proteger o sistema de dados corrompidos ou que não satisfazem as regras de negócio.</p>
<p style="text-align: justify;">Enfim, as requisições do usuário são mastigadas nas actions onde se transformam em objetos do que os serviços aceitam. Os serviços são invocados. Os serviços chamam outros serviços e/ou têm lógicas internas que produzem alterações em objetos existentes ou criam novos objetos. Os serviços utilizam os repositórios para realizarem pesquisas e persistir as alterações.  Os repositórios delegam ações de persistência e pesquisa a implementações de PersistanceStrategy que as traduzem para ações reais sobre o banco de dados ou sobre um DomainStore como o Hibernate.</p>
<p style="text-align: justify;">Não há por que complicar a arquitetura e design das sua aplicações web. Estes poucos elementos são normalmente  suficientes para realizar sistemas em que há muito mais leitura do  que escrita.  Mas, mesmo que você esteja desenvolvendo aplicações web-RIA (ou seja, simulando aplicações desktop de cadastro em web) esta arquitetura ainda é suficiente.</p>
<p style="text-align: justify;">Não continue se iludindo com o uso de EJB ou desenhando aplicações como se fazia nos anos 90. Já se passaram 20 anos. Estamos em 2010.</p>
<img src="http://feeds.feedburner.com/~r/javabuilding/sergiotaborda/~4/AodPjAulmLY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://sergiotaborda.javabuilding.com/2010/03/arquitetura-2010/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://sergiotaborda.javabuilding.com/2010/03/arquitetura-2010/</feedburner:origLink></item>
	</channel>
</rss>
