{"id":507,"date":"2009-06-06T12:09:26","date_gmt":"2009-06-06T19:09:26","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/?p=507"},"modified":"2009-06-06T12:09:26","modified_gmt":"2009-06-06T19:09:26","slug":"frameworks-caseiros-2-a-missao","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2009\/06\/06\/frameworks-caseiros-2-a-missao\/","title":{"rendered":"Frameworks Caseiros 2: A miss\u00e3o"},"content":{"rendered":"<p><script type=\"text\/javascript\"> function get_style507 () { return \"none\"; } function end507_ () { document.getElementById('wqd507').style.display = get_style507(); } <\/script>Eu participei como desenvolvedor de 4 projetos em Java nos \u00faltimos 12 meses, 3 deles tinham algo em comum: tinham uma arquitetura de refer\u00eancia, mais de 4 anos, baseados no struts 1.x, <a href=\"http:\/\/www.milfont.org\/tech\/2008\/01\/20\/frameworkstools-caseiros-ou-fechados\/\">framework caseiro<\/a> desenvolvido em cima do struts, modica\u00e7\u00f5es caseiras em APIs conhecidas sem contribui\u00e7\u00e3o com o projeto original [fork antigo ainda por cima], c\u00f3digo altamente <a href=\"http:\/\/c2.com\/cgi\/wiki?CouplingAndCohesion\">acoplado e sem coes\u00e3o<\/a>, arquitetura baseada em <a href=\"http:\/\/www.slideshare.net\/peas\/justjava-2007-arquitetura-java-ee-paulo-silveira-phillip-calado\">BOLOVO<\/a> e <a href=\"http:\/\/blog.fragmental.com.br\/2007\/10\/31\/programadores-profissionais-escrevem-testes-ponto-final\/\">principalmente sem testes<\/a> [o \u00faltimo at\u00e9 que estava com uma tentativa de testes de aceita\u00e7\u00e3o com o <a href=\"http:\/\/seleniumhq.org\/\">Selenium<\/a> mas com grandes dificuldades por conta de todos os problemas].<\/p>\n<p>Em projetos antigos \u00e9 comum encontrarmos esse tipo de situa\u00e7\u00e3o, eu mesmo j\u00e1 criei meu framework caseiro em coisa por volta de 6 anos atr\u00e1s, mas hoje em dia isso n\u00e3o s\u00f3 \u00e9 algo abomin\u00e1vel como um desrespeito pelos profissionais, ainda mais ap\u00f3s tanta evolu\u00e7\u00e3o nos \u00faltimos 10 anos.<\/p>\n<p>Conversando com um amigo que trabalha em uma grande empresa de planos de sa\u00fade, ele me falou que o &#8220;arquiteto java&#8221; dessa empresa [conhecido por sua fama de criador de &#8220;Framearras&#8221;] convenceu a diretoria sobre um projeto recente que se baseia no desenvolvimento de um framework espec\u00edfico para a empresa [eles j\u00e1 possuem um framework caseiro que \u00e9 um terror e bem conhecido por grande parte dos desenvolvedores locais].<\/p>\n<p>\u00c9 impressionante como n\u00e3o acaba essa tara de desenvolvimento de frameworks caseiros, qual a necessidade de uma empresa que tem TI como meio [e n\u00e3o como fim] de desenvolver um framework para desenvolvimento de software?<\/p>\n<p>Olha que n\u00e3o \u00e9 de <a href=\"http:\/\/www.milfont.org\/blog\/archives\/137\">hoje que eu falo<\/a> sobre os perigos de frameworks caseiros, mas parece que os defensores desse tipo de abomina\u00e7\u00e3o se reproduzem como coelhos.<\/p>\n<p>Engra\u00e7ado que no \u00faltimo projeto que participei eu recebi um treinamento de um dos criadores do framework caseiro que dever\u00edamos usar na constru\u00e7\u00e3o, alias na continua\u00e7\u00e3o de um sistema que est\u00e1 h\u00e1 5 anos em desenvolvimento sem sinal de algo ir para a produ\u00e7\u00e3o.<\/p>\n<p>Os argumentos que ele usou foram os seguintes [anotei a frase para n\u00e3o esquecer]:<\/p>\n<blockquote><p>&#8220;Amigos, \u00e9 importante um framework criado pela propria empresa para padronizarmos o desenvolvimento, diminuindo a curva de aprendizado e ganharmos na produtividade, utilizando padr\u00f5es consagrados, obtendo reuso nos componentes de neg\u00f3cio e garantindo a manutenibilidade pela f\u00e1cil cria\u00e7\u00e3o de c\u00f3digo, principalmente CRUD.&#8221;<\/p><\/blockquote>\n<h2>Segredo do fracasso<\/h2>\n<p>Vou expor algumas considera\u00e7\u00f5es sobre essa frase dele:<\/p>\n<h3>Curva de aprendizado<\/h3>\n<p>Se algo \u00e9 complexo de entender por quem conhece os padr\u00f5es daquilo que se deseja desenvolver, \u00e9 porque n\u00e3o serve mesmo. N\u00e3o h\u00e1 como comparar um software opensource consagrado no mercado onde centenas de milhares de desenvolvedores j\u00e1 aperfei\u00e7oaram com algo feito em casa.<\/p>\n<h3>Ganho na produtividade<\/h3>\n<p>A desculpa n\u00famero um de todo framework caseiro \u00e9 a famosa produtividade, sendo que voce sempre perde produtividade porque insere algo fora da normalidade no cotidiano do desenvolvedor. Al\u00e9m do que \u00e9 insano voce ter uma produtividade no inicio &#8211; se fosse o caso, j\u00e1 que n\u00e3o \u00e9 &#8211; comprometendo todo o ciclo de vida restante da aplica\u00e7\u00e3o por conta disso.<\/p>\n<p>Porque \u00e9 isso que acontece, todos esses frameworks caseiros s\u00e3o pensados e desenvolvidos para facilitarem a constru\u00e7\u00e3o de CRUDs no inicio da aplica\u00e7\u00e3o e voc\u00ea tem que sacrificar todo o resto para satisfazer esse capricho que pode ser automatizado facilmente com tecnologias atuais.<\/p>\n<h3>Utiliza\u00e7\u00e3o de padr\u00f5es<\/h3>\n<p>Ninguem pode saber que padr\u00e3o utilizar antes de saber qual o problema, isso \u00e9 imposs\u00edvel. Ou vai usar um martelo para furar uma parede ou uma furadeira para pregar um prego.<\/p>\n<h3>Reuso de componentes<\/h3>\n<p>N\u00e3o existe reuso de objetos de neg\u00f3cios, nenhum processo \u00e9 semelhante nem que seja na mesma organiza\u00e7\u00e3o ainda mais tentando reusar c\u00f3digo por meio ide interface gr\u00e1fica comum em projetos com dificuldade incial at\u00e9 de separa\u00e7\u00e3o de pacotes.<\/p>\n<p>Uma alternativa geralmente usada \u00e9 se comunicar via API ou uma estrutura de servi\u00e7o como WS, JMS, whatever e n\u00e3o aproveitando uma tela em um sistema distinto.<\/p>\n<h3>Aumento da manutenibilidade<\/h3>\n<p>Sistema como Frameworks caseiros sempre s\u00e3o dificeis de manuten\u00e7\u00e3o por que falta documenta\u00e7\u00e3o, gente que conhe\u00e7a realmente [al\u00e9m dos pr\u00f3prios criadores], c\u00f3digo sempre acoplado, falta de testes, maturidade, e principalmente prop\u00f3sito real [como n\u00e3o haver um existente no mesmo segmento].<\/p>\n<p>Em todos os frameworks caseiros que trabalhei e n\u00e3o foram poucos, a manuten\u00e7\u00e3o \u00e9 algo punitivo porque temos que satisfazer o framework e n\u00e3o o neg\u00f3cio.<\/p>\n<h3>Garantia da qualidade<\/h3>\n<p>N\u00e3o h\u00e1 qualidade alguma em frameworks caseiros, pelo contr\u00e1rio, pelo conjunto de m\u00e1s pr\u00e1ticas j\u00e1 expostas, o que acontece na realidade \u00e9 que os sitemas desenvolvidos com esse tipo de ferramenta apresentam uma qualidade baix\u00edssima.<\/p>\n<h3>Fork em frameworks do mercado<\/h3>\n<p>Problema em fazer um merge no futuro, voce n\u00e3o ter\u00e1 tempo e recurso suficiente para isso. Melhor solu\u00e7\u00e3o seria submeter patch e codigo para o framework original e acompanhar o desenvolvimento deste. Deixa o desenvolvimento preso a vers\u00f5es antigas.<\/p>\n<h3>Associado a cascata.<\/h3>\n<p>Quase imposs\u00edvel voc\u00ea encontrar um framework caseiro em uma equipe \u00e1geil, at\u00e9 porque isso fere v\u00e1rios dos valores e princ\u00edpios.<\/p>\n<h3>Menos codifica\u00e7\u00e3o<\/h3>\n<p>Na verdade duplica a codifica\u00e7\u00e3o para satisfazer o framework.<\/p>\n<h3>Extens\u00e3o de classes genericas<\/h3>\n<p>Acoplamento, referencia c\u00edclica, etc&#8230; d\u00e1 at\u00e9 pregui\u00e7a de escrever.<\/p>\n<h3>CRUD Driven Design<\/h3>\n<p>Quebra o principio do XP que \u00e9 fazer o mais importante e crucial primeiro, CRUD nunca \u00e9 o mais importante. Se voce faz o CRUD primeiro, cria a regra de neg\u00f3cio e refaz todo o CRUD depois.<\/p>\n<p>Gera\u00e7\u00e3o de codigo sempre reescreve as informa\u00e7\u00f5es, merge manual.<\/p>\n<p>Frameworks caseiros s\u00e3o #ESFM. V\u00e3o complementando com as m\u00e1s pr\u00e1ticas&#8230;<\/p>\n<p id=\"wqd507\">Typically chemist&#8217;s shop can sale to you with discreet treatments for various health problems. There are numerous of safe online pharmacies that will deliver medications to your address. There are divers medicines for each afflictions. Learn more about &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra manufacturer coupon<\/a>&#8220;. Maybe &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">viagra discount coupons<\/a>&#8221; is a very much complicated matter. Matters, like &#8220;<a href=\"http:\/\/free-viagrasamples.com\/viagra_coupons.html\">coupons for viagra<\/a>&#8220;, are coupled numerous types of heartiness problems. If you need to take prescription medications, ask your pharmacist to check your testosterone levels before. Sometimes the treatment options may switch on erectile dysfunction remedies or a suction device that helps get an erection. Keep in mind web-site which is ready to sell erectile dysfunction drugs like Viagra without a prescription is fraudulent. When you purchase from an unknown web-site, you run the risk of getting counterfeit remedies. <\/p>\n<p><script type=\"text\/javascript\"> end507_(); <\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eu participei como desenvolvedor de 4 projetos em Java nos \u00faltimos 12 meses, 3 deles tinham algo em comum: tinham uma arquitetura de refer\u00eancia, mais de 4 anos, baseados no struts 1.x, framework caseiro desenvolvido em cima do struts, modica\u00e7\u00f5es caseiras em APIs conhecidas sem contribui\u00e7\u00e3o com o projeto original [fork antigo ainda por cima], [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[15,11,28,3,27,19],"tags":[249,367,89,90,375,374,378],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/507"}],"collection":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/comments?post=507"}],"version-history":[{"count":18,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/507\/revisions"}],"predecessor-version":[{"id":669,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/507\/revisions\/669"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=507"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=507"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=507"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}