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

<channel>
	<title>Blog de desenvolvimento da Milfont Consulting, Client e Server-side &#187; Engenharia de Software</title>
	<atom:link href="http://www.milfont.org/tech/tag/engenharia-de-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.milfont.org/tech</link>
	<description>Blog da Comunidade Milfont Consulting, uma empresa especializada em desenvolvimento Web, principalmente Javascript, node.js e muito Javascript.</description>
	<lastBuildDate>Thu, 26 Jan 2012 11:30:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<item>
		<title>Na teoria, é você quem não conhece a prática</title>
		<link>http://www.milfont.org/tech/2009/09/18/na-teoria-e-voce-quem-nao-conhece-a-pratica/</link>
		<comments>http://www.milfont.org/tech/2009/09/18/na-teoria-e-voce-quem-nao-conhece-a-pratica/#comments</comments>
		<pubDate>Fri, 18 Sep 2009 12:43:40 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[mercado]]></category>
		<category><![CDATA[CMMi]]></category>
		<category><![CDATA[Mps.Br]]></category>
		<category><![CDATA[TDD]]></category>
		<category><![CDATA[Test]]></category>
		<category><![CDATA[Test Driven Development]]></category>
		<category><![CDATA[teste]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=776</guid>
		<description><![CDATA[O Dr Alan Kelon [ou quase dr., não sei se já terminou] com a arrogância clássica da academia deu uma aula de engenharia de software a esse pobre AMADOR SEM EDUCAÇÃO que vos escreve. Se eu fosse um novato, recém integrado na faculdade, sem base acadêmica para duvidar de um Dr. [ou quase] eu estaria [...]]]></description>
			<content:encoded><![CDATA[<p>O <a href="http://buscatextual.cnpq.br/buscatextual/visualizacv.jsp?id=K4737108H3">Dr Alan Kelon</a> [ou quase dr., não sei se já terminou] com a arrogância clássica da academia <a href="http://alankelon.posterous.com/cmmi-testes-automaticos-pessoas-processo-e-qu">deu uma aula de engenharia de software</a> a esse pobre AMADOR SEM EDUCAÇÃO que vos escreve.</p>
<p>Se eu fosse um novato, recém integrado na faculdade, sem base acadêmica para duvidar de um Dr. [ou quase] eu estaria destruído com minha ignorância.</p>
<p>Esse é o temor que tenho da academia, a sua falta total de pé-no-chão ou conhecimento real daquilo que ensina, é o que me fez abandoná-la e nunca mais pisar por lá.</p>
<p>Tantas citações a obras importantes é típico da academia, mas o discurso que eu gostaria de ouvir não existe:</p>
<p>&#8220;Quando eu implantei CMMi na XPTO&#8230;&#8221;</p>
<p>&#8220;Quando eu trabalhava com RUP, nós&#8230;&#8221;</p>
<div id="_mcePaste" style="overflow: hidden; position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px;"><span class="profile_header_username">Alan Kelon</span></div>
<h2>Na prática a teoria é outra</h2>
<p>Caro Dr., eu estudei muito sobre isso, li todos esses documentos e até cheguei já a acreditar que eram válidos para garantir a qualidade de um produto. Claro, isso no início desse século quando eu era estagiário e sem conhecimento real.</p>
<p>Depois de passar por implantação de CMMi mais de uma vez, ISO e Mps.Br, foi que aprendi o valor da teoria e como aquilo que está escrito não reflete a realidade na &#8220;engenharia de software&#8221;.</p>
<p>Talvez o que mais me marcou em verificar que não existe engenharia de software [ou ela é ainda muito incipiente] foi ter participado de avaliações ISO em outros setores como indústria, imobiliária e serviços. Fica evidente para todo mundo que a avaliação nesses setores é de processo e não de produto e serviço porque eles tem métricas reais e aplicáveis em suas industrias.</p>
<p>Quando CMMi ou ISO falam em qualidade de produto eles não dizem como fazer e sim o que fazer, essa é a diferença básica entre processo e produto, caro Dr.</p>
<p>Essa bobagem semântica  faz toda a diferença, quando eu avalio a qualidade de um produto como uma garrafa PET, existem métricas reais para testar a qualidade [como por exemplo durabilidade], existe um processo normatizado por órgãos [como ANATEL, ANVISA, e tantos outros] que garantem a qualidade mínima do produto ou serviço.</p>
<p>Esse foi o seu primeiro erro conceitual, dizer que tem que fazer é diferente de dizer &#8220;como&#8221; tem que fazer. &#8220;O que&#8221; é processo, DR. &#8220;Como&#8221; é produto, Dr.</p>
<h2>Testes de Software</h2>
<p>Vou fazer um mea-culpa porque quando escrevo eu sempre esqueço que meus leitores não me conhecem e não podem advinhar o que fica nas entrelinhas, eu não gosto de citar referências por preguiça de sair catalogando nomes de livros e autores [só quando lembro na integra de cabeça e acho importantissimo] e espero que as pessoas não acreditem em uma só linha sem verificar. Como vão verificar, eles acham a referência por si só, não preciso colocar bibliografia nos meus textos.</p>
<p>Esse trecho fica evidente que falho por omissão:</p>
<blockquote><p><span>Há controvérsias sobre testes automáticos garantirem qualidade interna, na verdade, não vejo onde há relação direta. Testes são sim de suma importância, independentemente de serem automatizados ou não, que fique claro, mas não garantem totalmente a qualidade, nem externa e muito menos interna (em breve explicarei o porquê), muito menos é o único método para se conseguir qualidade. Inspeções e revisão de software (e especificações associadas), juntamente com analisadores estáticos, são tão efetivos quanto testes na detecção de defeitos e tem possibilidade maior de melhorar a qualidade interna de produtos de software.</span></p></blockquote>
<p>Quando falo em testes, é óbvio para quem me conhece que estou me referindo sobretudo a TDD e também BDD. Testes por si só não garantem nada, nem sequer que as falhas estão cobertas.</p>
<p>O processo de TDD é que fortalece a qualidade interna do software porque ao você aplicar as práticas desse processo, você se torna minucioso na verificação de coesão, complexidade, acoplamento sem precisar de ferramentas de análise de código.</p>
<p>Eu não estou afirmando que não use ferramentas de análise de código, longe disso, só que essas ferramentas não verificam qualidade real no código, no máximo elas avaliam erros clássicos e mau cheiro no código. É perfeitamente possível escrever um código horroroso e ilegível e passar por todas as ferramentas de análise de código facilmente, isso acontece na prática no cotidiano.</p>
<h2>Como testar?</h2>
<blockquote><p><span>Antes de me dizer, responda-me: Você faz que tipo de teste? Unitário, integração, sistema, aceitação? Testes funcionais, estruturais ou baseados em defeitos? Para testes funcionais, você utiliza classes de equivalência, análise de valor limite, grafo causa-efeito e ainda tenta error-guessing? Para testes estruturais, você aplica grafos de fluxo de controle? Como define seu critério de cobertura de instruções, decisões, condições e caminhos? E quais das métricas já citadas ou quaisquer outras tem adotado? (Zhu, Hall and May, 1997) Se você não tiver uma boa estratégia para cada uma destas táticas, sinto muito informar-lhe, mas VOCÊ NÃO SABE TESTAR SOFTWARE.</span></p></blockquote>
<p><span>Eu não sigo as estratégias do Zhu &#8220;Who?&#8221;, eu sigo um AMADOR SEM EDUCAÇÃO chamado Kent Beck que não é nada científico mas funciona. Sim, eu faço testes unitários, integração, aceitação, stress, carga e o que der mais para fazer com o tempo disponível para entregar o software o mais saudável possível. As ferramentas de análise de cobertura são frágeis e deixam escapar a real cobertura, da qual temos que aplicar triangulação e outras práticas não-acadêmicas criadas por AMADORES SEM EDUCAÇÃO.</span></p>
<p><span>O bacana de tudo são esses números:</span></p>
<blockquote><p><span>Ou seja, mesmo que você tenha 100% de cobertura, você terá apenas garantia de detecção de defeitos em 25% dos casos (Glass, 2002).</span></p></blockquote>
<p><span>Minha vó dizia que os números quebrados tem mais credibilidade, se fosse pelo menos um 25, 37%&#8230; vá lá.</span></p>
<blockquote><p><span>Não estou a par de nenhum estudo rigoroso que mostre relação positiva entre presença de testes automáticos e código mais coeso, desacoplado, limpo, claro e legível também. </span></p></blockquote>
<p>Dr. o mundo não vive de Papers apenas, saia da academia e visite uma empresa que faça TDD e outra que não, o senhor avaliará por si só. Alias, quem deveria fazer esses estudos era a academia, não? Como farão se não saem às ruas?</p>
<blockquote><p><span>Caso alguém tenha, por favor, entre em contato.<span> </span>Gostaria de saber também, se possível, quais processos preocupam-se com qualidade externa em detrimento de qualidade interna. Seriam os processos ágeis?</span></p></blockquote>
<p><span>Todos os processos avaliam qualidade externa pelo que escrevi acima.</span></p>
<p><span>O seguinte trecho quase me faz não responder esse artigo:</span></p>
<blockquote><p><span>Por fim, o PROJETO é a quarto e última variável necessária para construir software, porque planejamento e gerenciamento são nossas únicas armas para controlar a complexidade</span></p></blockquote>
<p><span>O que diabos complexidade tem a ver com planejamento e gerenciamento? </span></p>
<p><span>Desde quando voce planeja a complexidade de um software?</span></p>
<p><span>Fazendo notação matemática do algoritmo?</span></p>
<p><span>Desculpe, mas nem todo mundo tem o tempo do Dr. Knuth para entregar software, precisamos de verificação rápida e não notação matemática e não existe um mecanismo que faça isso antes de ter um software escrito.</span></p>
<blockquote><p><span>Novamente, o projeto pode ser tão detalhado e formal quanto se queira.</span></p></blockquote>
<p><span>Não, DR. O projeto não pode ser tão detalhado e formal quanto o queira, isso eu acreditava antes de fazer coisas reais e ficava apenas em cima de livros, se a engenharia de software realmente existisse, eu tinha mecanismos reais para fazer esse detalhamento, mas hoje esses mecanismos reais não existem.</span></p>
<p><span>Cada vez mais me convenço de que a academia está morta e não produz nada de real, apenas papers repetitivos de bobagens que ninguem lê. </span></p>
<p><span>Deveriam ter terminado a notação formal da orientação a objetos mas estão preocupados demais com &#8220;modelos de qualidade&#8221; [sic] que nunca avaliaram na prática e não fazem idéia de como mensurar.</span></p>
<p><span>Isso não é científico, Dr.<br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/09/18/na-teoria-e-voce-quem-nao-conhece-a-pratica/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>PMBOK de Jeans</title>
		<link>http://www.milfont.org/tech/2009/03/14/pmbok-de-jeans/</link>
		<comments>http://www.milfont.org/tech/2009/03/14/pmbok-de-jeans/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 11:09:26 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Agil]]></category>
		<category><![CDATA[Agilismo]]></category>
		<category><![CDATA[Extreme Programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=551</guid>
		<description><![CDATA[Quando cunhei esse termo por volta de 2 anos atrás, o fiz pelo fato de ter observado a migração serelepe dos defensores do modelo &#8220;PMBOK de ser&#8221; para Scrum. Um grande problema na compreensão sobre Scrum é justamente achar que ele serve para gerenciar projetos, dessa forma para ser confundido com um PMBOK ágil é [...]]]></description>
			<content:encoded><![CDATA[<p>Quando cunhei esse termo por volta de 2 anos atrás, o fiz pelo fato de ter observado a migração serelepe dos defensores do modelo &#8220;PMBOK de ser&#8221; para Scrum.</p>
<p>Um grande problema na compreensão sobre Scrum é justamente achar que ele serve para gerenciar projetos, dessa forma para ser confundido com um PMBOK ágil é um passo. Gerência de projetos é um campo distinto da direção do desenvolvimento de software e não vou tratar ou especificar nesse artigo porque <a href="http://www.milfont.org/tech/2008/09/25/gerentes-de-projetos-nao-sao-tecnicos/">já rascunhei em artigo passado</a>.</p>
<p>Scrum é um modelo de desenvolvimento de software. A <a href="http://www.scrumalliance.org">Scrum Alliance</a> que é uma espécie de &#8220;organismo&#8221; que rege a maturação do Scrum, não o definiu como Project Management, mas como:</p>
<blockquote><p>&#8220;<a href="http://www.scrumalliance.org/pages/what_is_scrum">Scrum is an agile software development framework.</a>&#8220;</p></blockquote>
<p>Scrum é similar ao XP ou FDD, guia a equipe com um modelo baseado em práticas para um melhor desenvolvimento de software. Como esse pessoal &#8211; que muitas vezes nunca foram técnicos &#8211; encontra em Scrum práticas fortemente ligadas ao controle das iterações, transmuta toda a cultura burocrática adquirida em metodologias de gerência de projetos e confunde atividades &#8211; como avaliação de riscos e aquisição e controle de recursos &#8211; com as necessidades do time jogando fora o que os incomoda &#8211; como práticas necessárias ao desenvolvimento &#8211; e ficando apenas com o que sentem confortáveis.</p>
<p>Quando James Shore escreveu seu famoso artigo &#8220;<a href="http://jamesshore.com/Blog/The-Decline-and-Fall-of-Agile.html">The Decline and Fall of Agile</a>&#8221; ele definiu isso muito bem fazendo analogia que estavam correndo para a sobremesa mas jogando fora os vegetais. Martin Fowler em seu artigo <a href="http://martinfowler.com/bliki/FlaccidScrum.html">Flaccid Scrum</a> [<a href="http://www.akitaonrails.com/2009/02/03/tradu-o-scrum-fl-cido">Akita traduziu</a> e comentou], escreveu ter notado que o problema técnico acontece mais com Scrum devido a não prescrição [omite] de práticas técnicas e ser centrado em técnicas de &#8220;gerenciamento de projetos&#8221;, ou seja, o problema é de qualidade técnica interna.</p>
<p>Hoje todo mundo se diz Scrum Master, todos entendem e usam Scrum e mesmo assim já estamos vendo projetos com Scrum caírem no mesmo erro e problema de modelos anteriores. Como disse o Martin Fowler em seu artigo: &#8220;Esses projetos de Scrum flácido em andamento prejudicarão a reputação não somente do Scrum mas de todo Agile&#8221;.</p>
<p>Scrum é uma metodologia maravilhosa que tem muito a engrandecer o XP e as outras metodologias, mas usando um Scrum transviado de PMBOK é um caminho natural ao fracasso retumbante.</p>
<h2>Solução?</h2>
<p>Eu poderia escrever dezenas de linhas aqui com conselhos e bla-bla-blas mas vou ser direto e lacônico: <a href="http://groups.google.com.br/group/xpce">XP</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/03/14/pmbok-de-jeans/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Retrabalho e prejuízo</title>
		<link>http://www.milfont.org/tech/2009/01/08/retrabalho-e-prejuizo/</link>
		<comments>http://www.milfont.org/tech/2009/01/08/retrabalho-e-prejuizo/#comments</comments>
		<pubDate>Thu, 08 Jan 2009 15:17:07 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Certificações]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Test Driven]]></category>
		<category><![CDATA[XP]]></category>
		<category><![CDATA[domain driven design]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=488</guid>
		<description><![CDATA[Em todos os projetos que trabalhei até hoje no mercado local [Ceará] existem profissionais mais ou menos qualificados a partir de uma base mínima de qualidade que um profissional tem que possuir dentro do modelo &#8220;Enterprisey&#8221; &#8211; que estamos acostumados e que responde pela quase totalidade dos projetos de software. Essa base mínima eu proponho [...]]]></description>
			<content:encoded><![CDATA[<p>Em todos os projetos que trabalhei até hoje no mercado local [Ceará] existem profissionais mais ou menos qualificados a partir de uma base mínima de qualidade que um profissional tem que possuir dentro do modelo &#8220;Enterprisey&#8221; &#8211; que estamos acostumados e que responde pela quase totalidade dos projetos de software.</p>
<p>Essa base mínima eu proponho que seja &#8211; dentro do modelo exposto -  raciocínio lógico. O resto ele pode aprender.</p>
<p>Raciocínio lógico está ligado diretamente a noção de avaliar a situação, encontrar um padrão, investigar soluções existentes e implementar a solução, além claro de bom senso.</p>
<p>Não adianta pregarmos que os profissionais deveriam ser melhor escolhidos assim ou assado porque a realidade é que as empresas não tem como medir satisfatoriamente quem é ou não competente e mais cedo ou mais tarde você se deparará com indivíduos em sua equipe vindos por diversas nuances administrativas, seja aquele superqualificado cheio de títulos ou o primo do diretor da empresa.</p>
<p>Aonde quero chegar com essa história?</p>
<p>Precisamos avaliar os riscos necessários com bastante antecedência para que toda a equipe e consequentemente o projeto não sejam lesados e paguem o preço da incompetência às vezes de um único elemento. Parece óbvio? Acredite, não é!</p>
<p>Temos um projeto em um cliente &#8211; uma Alfândega &#8211; que precisamos refatorar todo o código criado por um determinado profissional com apenas dois ou três meses pronto. O projeto ainda está no início e já temos que refazer código.</p>
<p>Convenhamos, tudo bem que o código de meia hora atrás já é legado, mas código tão recente não deveria já ser refatorado sem mudança na lógica de negócio ou arquitetural. Algo muito errado aconteceu.</p>
<p>Mudanças não funcionais acontecem, surge um novo paradigma ou framework que reduz o tempo de desenvolvimento e convenientemente é adequado sua mudança, isso é comum durante a manutenção de um software já em produção com um meio século de uso &#8211; que em informática dura cerca de 4 ou 5 anos.</p>
<p>O nosso em questão não há motivos. Projeto novo, sem restrição ou adequação à &#8220;Arquitetura de Referência&#8221;, Frameworks de última milha na plataforma Java como JSF, Spring e Hibernate. Testes unitários &#8211; mas não TDD.</p>
<p>Como dito, separei um exemplo em código para demonstrar aonde quero chegar. Tem uma lógica bastante simples, existe um processo de apreensão de mercadorias na alfândega e liberação dessa mercadoria.</p>
<p>Há 3 tabelas que representam isso no modelo E/R: TB_DEVOLUCAO, TB_ITEM_APREENSAO, TB_ITEM_DEVOLUCAO. Segundo a lógica relacional, a TB_ITEM_DEVOLUCAO é uma tabela de junção entre a devolução e os itens apreendidos para indicar que item será devolvido.</p>
<p>Seguindo minha definição, um profissional com raciocínio lógico encontraria fácil a solução do mapeamento entre essas entidades apenas lendo a documentação, ele saberia que o <a href="http://www.hibernate.org">Hibernate</a> tem um mapeamento de <a href="http://www.hibernate.org/hib_docs/annotations/reference/en/html_single/#entity-mapping-association-collections">OneToMany com Join Table Uni ou Bidirecional</a>.</p>
<p>Mas não, ele criou essa bizarrice:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Devolucao <span style="color: #009900;">&#123;</span>
&nbsp;
	@OneToMany<span style="color: #009900;">&#40;</span>fetch<span style="color: #339933;">=</span>FetchType.<span style="color: #006633;">LAZY</span>, cascade<span style="color: #339933;">=</span>CascadeType.<span style="color: #006633;">ALL</span><span style="color: #009900;">&#41;</span>
	@JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
	@Cascade<span style="color: #009900;">&#40;</span>org.<span style="color: #006633;">hibernate</span>.<span style="color: #006633;">annotations</span>.<span style="color: #006633;">CascadeType</span>.<span style="color: #006633;">DELETE_ORPHAN</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>ItemDevolucao<span style="color: #339933;">&gt;</span> itensDevolucao <span style="color: #339933;">=</span> 
		<span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>ItemDevolucao<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span>
&nbsp;
@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_ITEM_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> ItemDevolucao <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//Para que essa entidade?</span>
&nbsp;
	@Id
	@GeneratedValue<span style="color: #009900;">&#40;</span>strategy <span style="color: #339933;">=</span> GenerationType.<span style="color: #006633;">IDENTITY</span><span style="color: #009900;">&#41;</span>
	@Column<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_DEVOLUCAO&quot;</span>, columnDefinition<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;NUMERIC&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Integer</span> codigo<span style="color: #339933;">;</span>
&nbsp;
	@OneToOne
	@JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_APREENSAO&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> ItemApreensao itemApreensao<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Esse profissional em questão é graduado em computação, tem mestrado em uma federal, certificação como arquiteto Java e diversas outras certificações e pasme, anos de experiência em projetos. Mas não tem o básico, raciocínio lógico. Não investiga e não sabe desenvolver software de qualidade.</p>
<p>O código em questão pode parecer bobagem até mas isso se repete em todo o código criado por esse profissional.</p>
<p>Um profissional responsável em refatorar o código com apenas curso técnico e uma mísera certificação de programador java refatorou assim [como deve ser]:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">@<span style="color: #003399;">Entity</span>
@Table<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Devolucao <span style="color: #009900;">&#123;</span>
&nbsp;
	@OneToMany<span style="color: #009900;">&#40;</span>fetch<span style="color: #339933;">=</span>FetchType.<span style="color: #006633;">LAZY</span>, cascade<span style="color: #339933;">=</span>CascadeType.<span style="color: #006633;">ALL</span><span style="color: #009900;">&#41;</span>
	@JoinTable<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;TB_ITEM_DEVOLUCAO&quot;</span>,
		joinColumns <span style="color: #339933;">=</span> @JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_DEVOLUCAO&quot;</span><span style="color: #009900;">&#41;</span>,
		inverseJoinColumns <span style="color: #339933;">=</span> 
				@JoinColumn<span style="color: #009900;">&#40;</span>name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;SEQ_ITEM_APREENSAO&quot;</span><span style="color: #009900;">&#41;</span>
	<span style="color: #009900;">&#41;</span>
	@Cascade<span style="color: #009900;">&#40;</span>org.<span style="color: #006633;">hibernate</span>.<span style="color: #006633;">annotations</span>.<span style="color: #006633;">CascadeType</span>.<span style="color: #006633;">DELETE_ORPHAN</span><span style="color: #009900;">&#41;</span>
	<span style="color: #000000; font-weight: bold;">private</span> List<span style="color: #339933;">&lt;</span>ItemApreensao<span style="color: #339933;">&gt;</span> itensDevolvidos <span style="color: #339933;">=</span> 
				<span style="color: #000000; font-weight: bold;">new</span> ArrayList<span style="color: #339933;">&lt;</span>ItemApreensao<span style="color: #339933;">&gt;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ad Hominem da minha parte? Tomar uma exceção pela regra? nada disso, eles são legião! Isso é meu cotidiano.</p>
<p>O prejuízo que esse profissional acarreta a todos os envolvidos é enorme e até difícil de ser mensurado porque envolve custos e humor da equipe que impacta em outros custos imperceptíveis na conta final que é a &#8220;fodisse&#8221; dos caras que tiveram que refatorar, ou seja, fizeram o seu e o trabalho alheio.</p>
<p>Ah, mas XP não prega o código coletivo? ir lá e consertar? Mas quebra o principal valor que é &#8220;Respeito&#8221;. Além do mais o projeto em questão seque o velho Cascata &#8211; mas culpa do cliente que exigiu ser assim, exigiu não, obriga.</p>
<p>Pela minha experiência de nada adianta você jogar um <a href="http://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882">Clean Code</a> nas mãos dele e pedir para estudar, ele vai continuar escrevendo nmDesc em uma propriedade ou IRepository em uma Interface. Ele foi treinado assim e sem raciocínio lógico no máximo que voce vão conseguir é retreiná-lo para conseguir comer a banana por outro túnel.</p>
<p>Um projeto sem um líder técnico responsável com aptidão e experiência necessária aliado a método baseado em BDUF sem um processo restritivo [como TDD] com modelagem ultrapassada com papéis de analista de sistemas &#8220;UMLizados&#8221; deixa esse tipo de profissional cometer esses pecados e prejudicar a todos os envolvidos retrabalho desnecessário.</p>
<p>É fácil resolver isso? É! O problema maior é que não podemos simplesmente aceitar que &#8220;o cliente quer assim&#8221;, temos um dever ético com nossa profissão de não permitir que o paciente escolha como ele quer ser operado e ceder médicos que não tenham capacidade de operá-lo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2009/01/08/retrabalho-e-prejuizo/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Existem balas de prata!</title>
		<link>http://www.milfont.org/tech/2008/12/10/existem-balas-de-prata/</link>
		<comments>http://www.milfont.org/tech/2008/12/10/existem-balas-de-prata/#comments</comments>
		<pubDate>Wed, 10 Dec 2008 09:12:18 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Bala de prata]]></category>
		<category><![CDATA[Silver Bullet]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=434</guid>
		<description><![CDATA[Existe um tipo de falácia bem comum que está crescendo ultimamente se aproveitando da célebre frase: Não existe bala de prata! Quando invocamos a necessidade de não considerar todos os problemas como um prego e a única arma um martelo, não estamos fornecendo a chave da irrestrita flexibilidade irresponsável. Quando assumimos que em tudo depende, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet1.jpg"><img class="alignleft size-medium wp-image-435" title="silverbullet1" src="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet1.jpg" alt="" width="133" height="138" /></a></p>
<p>Existe um tipo de falácia bem comum que está crescendo ultimamente se aproveitando da célebre frase: <a href="http://en.wikipedia.org/wiki/No_Silver_Bullet">Não existe bala de prata</a>!</p>
<p>Quando invocamos a necessidade de não considerar todos os problemas como um prego e a única arma um martelo, não estamos fornecendo a chave da irrestrita flexibilidade irresponsável.</p>
<p>Quando assumimos que em tudo depende, não estamos dizendo que não há uma fronteira. O avanço significativo do cálculo só foi possível com o advento do limite matemático.</p>
<p>Fazer ciência é investigar e fazer a pergunta certa ao contrário da resposta certa. Para isso identificamos padrões e formulamos teorias.</p>
<p>Antes de abandonar uma teoria devemos substituí-la por outra mais apropriada. Isso soa conservador mas é preciso para se fazer ciência, propor o abandono de uma determinada teoria sem a substituição por outra mais adequada é leviano.</p>
<p>Para entender como algo funciona não podemos simplesmente achar que qualquer solução é válida e sim descobrir qual a solução adequada.</p>
<p>Entender que existem soluções mais apropriadas &#8211; e que sim, existe um jeito certo ou um modo melhor de se fazer algo &#8211; não quer dizer que outras abordagens simplesmente estão erradas,  podem ser apenas incompletas e/ou inviáveis.</p>
<p>Em muitas discussões que tenho travado ultimamente sempre quando tento argumentar que uma solução específica é melhor do que determinada outra, ouço:</p>
<p>&#8220;Não existem balas de prata&#8221;. Bingo!</p>
<p>Essa pessoa não entende ou não quer aceitar por motivo qualquer que a solução dela está errada ou não satisfaz.</p>
<p>Aqui a proposta é pontual, para determinado conjunto de fatores existe uma solução mais adequada, isso é fato.</p>
<h2>Existem Balas de prata!</h2>
<p>Mas como somos fans de <a href="http://en.wikipedia.org/wiki/Supernatural_(TV_series)">Supernatural</a>, sabemos que o que mata é acertar no coração. O trabalho deve ser direcionado a combater a complexidade no coração do problema e não simplesmente num jogo de escolher a ferramenta certa.</p>
<p>Na área de desenvolvimento de software a maioria dos desenvolvedores se apegam a uma metodologia/ferramenta/arquitetura e tentam encaixá-la para a construção de qualquer sistema. Não entendem que aquela solução não vai resolver todos os problemas.</p>
<p>Até aqui tudo bem, o problema é aproveitar a defesa de que não existe uma ferramenta para todos os propósitos e considerar que &#8220;não existe o melhor&#8221; ou a &#8220;forma apropriada&#8221;, quando justamente por não existir ferramenta universal é que devemos usar algo por sua especialidade.</p>
<p><a href="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet2.jpg"><img class="alignright size-medium wp-image-441" title="silverbullet2" src="http://www.milfont.org/tech/wp-content/uploads/2008/12/silverbullet2.jpg" alt="" width="139" height="139" /></a></p>
<p>O <a href="http://www.manifestoagil.com.br/">manifesto ágil</a> tem um trecho que diz:</p>
<blockquote><p>&#8220;Estamos descobrindo maneiras <strong>melhores de desenvolver software</strong> fazendo-o nós mesmos e ajudando outros a fazê-lo.&#8221;</p></blockquote>
<p>Observe que ele diz &#8220;<strong>melhores</strong>&#8221; e não &#8220;<strong>diferente</strong>&#8221; ou &#8220;<strong>de outra forma</strong>&#8220;.</p>
<p>No final diz:</p>
<blockquote><p>&#8220;Ou seja, mesmo havendo valor nos itens à direita, valorizamos mais os itens à esquerda.&#8221;</p></blockquote>
<p>Aqui reconhece que os itens à direita não estão errados, apenas que os da esquerda levam a uma melhor forma de tratar o campo específico que é desenvolver software.</p>
<p>Tentar levar o manifesto ágil para gestão de projetos, construção civil ou limpeza da sua casa o faz ser uma bala de prata e que não vai matar nada porque você não está atigindo o coração, apenas tentando criar um martelo genérico para um uso universal.</p>
<p>Todo o &#8220;KnowHow&#8221; associado ao manifesto ágil se refere única e exclusivamente ao processo de desenvolver software da melhor forma, atinge o pontual.</p>
<p><em>Agiletards </em>sabem ser chatos também quando seguem metodologias de caixinhas e querem criar um novo dogma de desenvolvimento de software.</p>
<p>Existe o melhor e a forma mais adequada, procurar é nosso dever!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/12/10/existem-balas-de-prata/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Practical Artificial Intelligence Programming in Java agora Free</title>
		<link>http://www.milfont.org/tech/2008/11/11/practical-artificial-intelligence-programming-in-java-agora-free/</link>
		<comments>http://www.milfont.org/tech/2008/11/11/practical-artificial-intelligence-programming-in-java-agora-free/#comments</comments>
		<pubDate>Tue, 11 Nov 2008 17:38:14 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linguagens]]></category>
		<category><![CDATA[Artificial Intelligence]]></category>
		<category><![CDATA[Book]]></category>
		<category><![CDATA[IA]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=380</guid>
		<description><![CDATA[Mark Watson disponibilizou hoje [11/11/2008] seu livro Practical Artificial Intelligence Programming in Java em PDF como free download. via Twitter @dalmaer]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.markwatson.com/">Mark Watson</a> disponibilizou hoje [11/11/2008] seu livro <a href="http://www.lulu.com/content/4502573">Practical Artificial Intelligence Programming in Java</a> em PDF como <a href="http://www.markwatson.com/opencontent/JavaAI3rd.pdf">free download.</a></p>
<p>via Twitter <a href="http://twitter.com/dalmaer/status/1000676139">@dalmaer</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/11/11/practical-artificial-intelligence-programming-in-java-agora-free/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Para encerrar a discussão</title>
		<link>http://www.milfont.org/tech/2008/08/12/para-encerrar-a-discussao/</link>
		<comments>http://www.milfont.org/tech/2008/08/12/para-encerrar-a-discussao/#comments</comments>
		<pubDate>Tue, 12 Aug 2008 21:28:41 +0000</pubDate>
		<dc:creator>cmilfont</dc:creator>
				<category><![CDATA[Engenharia de Software]]></category>
		<category><![CDATA[Melhores práticas]]></category>
		<category><![CDATA[mercado]]></category>
		<category><![CDATA[Metodologia]]></category>
		<category><![CDATA[Métodos Ágeis]]></category>
		<category><![CDATA[Modelagem]]></category>
		<category><![CDATA[UML]]></category>

		<guid isPermaLink="false">http://www.milfont.org/tech/?p=170</guid>
		<description><![CDATA[Meus 5 leitores devem ler o blog do Shoes, mas se alguém não o acompanha, vá nesse link e veja os argumentos definitivos nessa história toda sobre código e modelagem em esqueletinhos. Ressalto a seguinte observação: &#8220;A conclusão que nós chegamos é que engenheiros de software possuem o poder que falta para engenheiros civis/arquitetos e [...]]]></description>
			<content:encoded><![CDATA[<p>Meus 5 leitores devem ler o blog do Shoes, mas se alguém não o acompanha, <a href="http://blog.fragmental.com.br/2008/08/09/analista-pedreiro/">vá nesse link</a> e veja os argumentos definitivos nessa história toda sobre código e modelagem em esqueletinhos.</p>
<p>Ressalto a seguinte observação:</p>
<p>&#8220;A conclusão que nós chegamos é que engenheiros de software possuem o poder que falta para engenheiros civis/arquitetos e ainda assim usam as ferramentas de quem não tem este poder.&#8221;</p>
<p>Se alguém não entender essa frase eu posso desenhar, mas está claro e perfeito. Discussão encerrada.</p>
<p>Mas como sou um pessimista, sei que muitos [os de sempre] vão contestar com as mesmas falácias e sofismos.</p>
<p>Mas <a href="http://blog.fragmental.com.br/2008/08/09/analista-pedreiro/">vá lá</a>, leia o post inteiro e tire suas próprias discussões.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.milfont.org/tech/2008/08/12/para-encerrar-a-discussao/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

