{"id":488,"date":"2009-01-08T08:17:07","date_gmt":"2009-01-08T15:17:07","guid":{"rendered":"http:\/\/www.milfont.org\/tech\/?p=488"},"modified":"2021-12-15T17:32:06","modified_gmt":"2021-12-15T20:32:06","slug":"retrabalho-e-prejuizo","status":"publish","type":"post","link":"https:\/\/www.milfont.org\/tech\/2009\/01\/08\/retrabalho-e-prejuizo\/","title":{"rendered":"Retrabalho e preju\u00edzo"},"content":{"rendered":"<p>Em todos os projetos que trabalhei at\u00e9 hoje no mercado local [Cear\u00e1] existem profissionais mais ou menos qualificados a partir de uma base m\u00ednima 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>\n<p>Essa base m\u00ednima eu proponho que seja &#8211; dentro do modelo exposto &#8211;&nbsp; racioc\u00ednio l\u00f3gico. O resto ele pode aprender.<\/p>\n<p>Racioc\u00ednio l\u00f3gico est\u00e1 ligado diretamente a no\u00e7\u00e3o de avaliar a situa\u00e7\u00e3o, encontrar um padr\u00e3o, investigar solu\u00e7\u00f5es existentes e implementar a solu\u00e7\u00e3o, al\u00e9m claro de bom senso.<\/p>\n<p>N\u00e3o adianta pregarmos que os profissionais deveriam ser melhor escolhidos assim ou assado porque a realidade \u00e9 que as empresas n\u00e3o tem como medir satisfatoriamente quem \u00e9 ou n\u00e3o competente e mais cedo ou mais tarde voc\u00ea se deparar\u00e1 com indiv\u00edduos em sua equipe vindos por diversas nuances administrativas, seja aquele superqualificado cheio de t\u00edtulos ou o primo do diretor da empresa.<\/p>\n<p>Aonde quero chegar com essa hist\u00f3ria?<\/p>\n<p>Precisamos avaliar os riscos necess\u00e1rios com bastante anteced\u00eancia para que toda a equipe e consequentemente o projeto n\u00e3o sejam lesados e paguem o pre\u00e7o da incompet\u00eancia \u00e0s vezes de um \u00fanico elemento. Parece \u00f3bvio? Acredite, n\u00e3o \u00e9!<\/p>\n<p>Temos um projeto em um cliente &#8211; uma Alf\u00e2ndega &#8211; que precisamos refatorar todo o c\u00f3digo criado por um determinado profissional com apenas dois ou tr\u00eas meses pronto. O projeto ainda est\u00e1 no in\u00edcio e j\u00e1 temos que refazer c\u00f3digo.<\/p>\n<p>Convenhamos, tudo bem que o c\u00f3digo de meia hora atr\u00e1s j\u00e1 \u00e9 legado, mas c\u00f3digo t\u00e3o recente n\u00e3o deveria j\u00e1 ser refatorado sem mudan\u00e7a na l\u00f3gica de neg\u00f3cio ou arquitetural. Algo muito errado aconteceu.<\/p>\n<p>Mudan\u00e7as n\u00e3o funcionais acontecem, surge um novo paradigma ou framework que reduz o tempo de desenvolvimento e convenientemente \u00e9 adequado sua mudan\u00e7a, isso \u00e9 comum durante a manuten\u00e7\u00e3o de um software j\u00e1 em produ\u00e7\u00e3o com um meio s\u00e9culo de uso &#8211; que em inform\u00e1tica dura cerca de 4 ou 5 anos.<\/p>\n<p>O nosso em quest\u00e3o n\u00e3o h\u00e1 motivos. Projeto novo, sem restri\u00e7\u00e3o ou adequa\u00e7\u00e3o \u00e0 &#8220;Arquitetura de Refer\u00eancia&#8221;, Frameworks de \u00faltima milha na plataforma Java como JSF, Spring e Hibernate. Testes unit\u00e1rios &#8211; mas n\u00e3o TDD.<\/p>\n<p>Como dito, separei um exemplo em c\u00f3digo para demonstrar aonde quero chegar. Tem uma l\u00f3gica bastante simples, existe um processo de apreens\u00e3o de mercadorias na alf\u00e2ndega e libera\u00e7\u00e3o dessa mercadoria.<\/p>\n<p>H\u00e1 3 tabelas que representam isso no modelo E\/R: TB_DEVOLUCAO, TB_ITEM_APREENSAO, TB_ITEM_DEVOLUCAO. Segundo a l\u00f3gica relacional, a TB_ITEM_DEVOLUCAO \u00e9 uma tabela de jun\u00e7\u00e3o entre a devolu\u00e7\u00e3o e os itens apreendidos para indicar que item ser\u00e1 devolvido.<\/p>\n<p>Seguindo minha defini\u00e7\u00e3o, um profissional com racioc\u00ednio l\u00f3gico encontraria f\u00e1cil a solu\u00e7\u00e3o do mapeamento entre essas entidades apenas lendo a documenta\u00e7\u00e3o, 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>\n<p>Mas n\u00e3o, ele criou essa bizarrice:<\/p>\n<pre lang=\"java\">@Entity\n@Table(name=\"TB_DEVOLUCAO\")\npublic class Devolucao {\n\n\t@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)\n\t@JoinColumn(name=\"SEQ_ITEM_DEVOLUCAO\")\n\t@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)\n\tprivate List itensDevolucao = \n\t\tnew ArrayList();\n\t\n}\n\n@Entity\n@Table(name=\"TB_ITEM_DEVOLUCAO\")\npublic class ItemDevolucao { \/\/Para que essa entidade?\n\n\t@Id\n\t@GeneratedValue(strategy = GenerationType.IDENTITY)\n\t@Column(name=\"SEQ_ITEM_DEVOLUCAO\", columnDefinition=\"NUMERIC\")\n\tprivate Integer codigo;\n\n\t@OneToOne\n\t@JoinColumn(name=\"SEQ_ITEM_APREENSAO\")\n\tprivate ItemApreensao itemApreensao;\n\t\n}\n<\/pre>\n<p>Esse profissional em quest\u00e3o \u00e9 graduado em computa\u00e7\u00e3o, tem mestrado em uma federal, certifica\u00e7\u00e3o como arquiteto Java e diversas outras certifica\u00e7\u00f5es e pasme, anos de experi\u00eancia em projetos. Mas n\u00e3o tem o b\u00e1sico, racioc\u00ednio l\u00f3gico. N\u00e3o investiga e n\u00e3o sabe desenvolver software de qualidade.<\/p>\n<p>O c\u00f3digo em quest\u00e3o pode parecer bobagem at\u00e9 mas isso se repete em todo o c\u00f3digo criado por esse profissional.<\/p>\n<p>Um profissional respons\u00e1vel em refatorar o c\u00f3digo com apenas curso t\u00e9cnico e uma m\u00edsera certifica\u00e7\u00e3o de programador java refatorou assim [como deve ser]:<\/p>\n<pre lang=\"java\">@Entity\n@Table(name=\"TB_DEVOLUCAO\")\npublic class Devolucao {\n\t\n\t@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL)\n\t@JoinTable(name=\"TB_ITEM_DEVOLUCAO\",\n\t\tjoinColumns = @JoinColumn(name=\"SEQ_ITEM_DEVOLUCAO\"),\n\t\tinverseJoinColumns = \n\t\t\t\t@JoinColumn(name=\"SEQ_ITEM_APREENSAO\")\n\t)\n\t@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)\n\tprivate List itensDevolvidos = \n\t\t\t\tnew ArrayList();\n\t\n}\n<\/pre>\n<p>Ad Hominem da minha parte? Tomar uma exce\u00e7\u00e3o pela regra? nada disso, eles s\u00e3o legi\u00e3o! Isso \u00e9 meu cotidiano.<\/p>\n<p>O preju\u00edzo que esse profissional acarreta a todos os envolvidos \u00e9 enorme e at\u00e9 dif\u00edcil de ser mensurado porque envolve custos e humor da equipe que impacta em outros custos impercept\u00edveis na conta final que \u00e9 a &#8220;fodisse&#8221; dos caras que tiveram que refatorar, ou seja, fizeram o seu e o trabalho alheio.<\/p>\n<p>Ah, mas XP n\u00e3o prega o c\u00f3digo coletivo? ir l\u00e1 e consertar? Mas quebra o principal valor que \u00e9 &#8220;Respeito&#8221;. Al\u00e9m do mais o projeto em quest\u00e3o seque o velho Cascata &#8211; mas culpa do cliente que exigiu ser assim, exigiu n\u00e3o, obriga.<\/p>\n<p>Pela minha experi\u00eancia de nada adianta voc\u00ea jogar um <a href=\"http:\/\/www.amazon.com\/Clean-Code-Handbook-Software-Craftsmanship\/dp\/0132350882\">Clean Code<\/a> nas m\u00e3os 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\u00ednio l\u00f3gico no m\u00e1ximo que voce v\u00e3o conseguir \u00e9 retrein\u00e1-lo para conseguir comer a banana por outro t\u00fanel.<\/p>\n<p>Um projeto sem um l\u00edder t\u00e9cnico respons\u00e1vel com aptid\u00e3o e experi\u00eancia necess\u00e1ria aliado a m\u00e9todo baseado em BDUF sem um processo restritivo [como TDD] com modelagem ultrapassada com pap\u00e9is de analista de sistemas &#8220;UMLizados&#8221; deixa esse tipo de profissional cometer esses pecados e prejudicar a todos os envolvidos retrabalho desnecess\u00e1rio.<\/p>\n<p>\u00c9 f\u00e1cil resolver isso? \u00c9! O problema maior \u00e9 que n\u00e3o podemos simplesmente aceitar que &#8220;o cliente quer assim&#8221;, temos um dever \u00e9tico com nossa profiss\u00e3o de n\u00e3o permitir que o paciente escolha como ele quer ser operado e ceder m\u00e9dicos que n\u00e3o tenham capacidade de oper\u00e1-lo.<\/p>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em todos os projetos que trabalhei at\u00e9 hoje no mercado local [Cear\u00e1] existem profissionais mais ou menos qualificados a partir de uma base m\u00ednima 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\u00ednima eu proponho [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[186,15,11,3,27,12,17,14,18,13],"tags":[406,367,68,363,364,369],"_links":{"self":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/488"}],"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=488"}],"version-history":[{"count":17,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/488\/revisions"}],"predecessor-version":[{"id":1912,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/posts\/488\/revisions\/1912"}],"wp:attachment":[{"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/media?parent=488"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/categories?post=488"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.milfont.org\/tech\/wp-json\/wp\/v2\/tags?post=488"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}