{"id":2916,"date":"2021-12-08T10:00:00","date_gmt":"2021-12-08T13:00:00","guid":{"rendered":"https:\/\/uds.com.br\/blog\/?p=2916"},"modified":"2024-08-07T11:47:31","modified_gmt":"2024-08-07T14:47:31","slug":"refatorar-refazer-reescrever-codigo","status":"publish","type":"post","link":"https:\/\/uds.com.br\/blog\/refatorar-refazer-reescrever-codigo\/","title":{"rendered":"Refatorar, reescrever o c\u00f3digo ou refazer o software do zero?"},"content":{"rendered":"\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0);color:#464646\" class=\"has-inline-color\">Refatorar, reescrever ou refazer o c\u00f3digo do zero?<\/mark><\/strong> Depende, pois qualquer uma das op\u00e7\u00f5es \u00e9 uma decis\u00e3o que deve ser muito bem avaliada: o valor do que j\u00e1 foi criado, do que j\u00e1 est\u00e1 codificado, precisa ser levado em considera\u00e7\u00e3o quando <strong><a rel=\"noreferrer noopener\" href=\"https:\/\/uds.com.br\/blog\/fabrica-de-software-como-funciona\/\" data-type=\"URL\" data-id=\"https:\/\/uds.com.br\/blog\/fabrica-de-software-como-funciona\/\" target=\"_blank\">mudan\u00e7as s\u00e3o necess\u00e1rias<\/a><\/strong>. Afinal, nenhum c\u00f3digo \u00e9 perfeito, nem saiu do nada.<\/p>\n\n\n\n<p>Este dilema gera debates intensos entre desenvolvedores de software sempre que se fala sobre melhorar um \u201cc\u00f3digo legado\u201d, pois envolve min\u00facias e metodologias.<\/p>\n\n\n\n<p><strong>O paradoxo do c\u00f3digo legado:<br><\/strong>Antes de alterar o c\u00f3digo, voc\u00ea deve realizar os testes. Mas, para colocar os testes em pr\u00e1tica, voc\u00ea precisa alterar o c\u00f3digo.<\/p>\n\n\n\n<p>Por exemplo, se o c\u00f3digo alterar apenas algumas funcionalidades, \u00e9 refatora\u00e7\u00e3o. Sen\u00e3o, \u00e9 reescrita com jeito de refatora\u00e7\u00e3o. Parece simples, mas n\u00e3o \u00e9. Avaliar qual decis\u00e3o \u00e9 a mais adequada julgando apenas a complexidade pode levar a erros monumentais.<\/p>\n\n\n\n<p>Em muitos casos, quanto menos experiente o desenvolvedor, maior a probabilidade de ele for\u00e7ar a op\u00e7\u00e3o por reescrever totalmente o c\u00f3digo. Desenvolvedores mais experientes e especialistas, por sua vez, costumam defender a refatora\u00e7\u00e3o \u00e9 s\u00f3 optar por reescrever o c\u00f3digo em \u00faltimo caso. Por que?<\/p>\n\n\n\n<p>Para responder a tantas quest\u00f5es, \u00e9 preciso invocar Michael Feathers, especialista em revitaliza\u00e7\u00e3o de c\u00f3digos e design de software, que resume:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote\"><p>C\u00f3digo legado \u00e9 c\u00f3digo sem testes<\/p><cite>Working Effectively with Legacy Code, 2004<\/cite><\/blockquote>\n\n\n\n<h4 class=\"wp-block-heading\">O que isso quer dizer?<\/h4>\n\n\n\n<p>Segundo essa obra de refer\u00eancia, \u201cuma boa quantidade de c\u00f3digo legado chega a propor\u00e7\u00f5es que variam de 100 para 1 at\u00e9 1000 para 1 de c\u00f3digo legado em rela\u00e7\u00e3o a c\u00f3digo novo.<\/p>\n\n\n\n<p>J\u00e1 \u00e9 alguma coisa para definir a estrat\u00e9gia para lidar com o c\u00f3digo legado.<\/p>\n\n\n\n<p>At\u00e9 aqui, j\u00e1 se pode dizer que refatorar e reescrever s\u00e3o dois processos que servem para melhorar c\u00f3digos de baixa qualidade, limp\u00e1-los, torn\u00e1-los mais f\u00e1ceis de ler e adicionar novas funcionalidades. Partindo dessa defini\u00e7\u00e3o, \u00e9 poss\u00edvel resumir as diferen\u00e7as entre refatora\u00e7\u00e3o e reescritura do c\u00f3digo.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"Divisor cinza que separa o primeiro do segundo t\u00f3pico do texto sobre Refatorar, reescrever\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>O que \u00e9 refatorar o c\u00f3digo de software?<\/strong><\/h2>\n\n\n\n<p>\u00c9 o processo de alterar o c\u00f3digo do software de forma que n\u00e3o mude seu comportamento externo. Esse processo normalmente significa fazer pequenas altera\u00e7\u00f5es de c\u00f3digo, embora com ajustes estruturais potencialmente significativos. A refatora\u00e7\u00e3o serve para reduzir a complexidade e melhorar a qualidade do c\u00f3digo, al\u00e9m de diminuir defeitos.<\/p>\n\n\n\n<p>Por\u00e9m, na refatora\u00e7\u00e3o cada segmento de c\u00f3digo \u00e9 <em>testado<\/em> antes de passar para o pr\u00f3ximo. Agora imagine lidar com testes de centenas de milhares de linhas de c\u00f3digo: \u00e0s vezes, esta op\u00e7\u00e3o \u00e9 impratic\u00e1vel por conta de tempo e custos.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"Divisor cinza que separa o segundo do terceiro t\u00f3pico do texto sobre Refatorar, reescrever\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>O que \u00e9 reescrever o c\u00f3digo de software?<\/strong><\/h2>\n\n\n\n<p>Reescrever envolve descartar totalmente o c\u00f3digo antigo e programar de novo. Em geral, isso d\u00e1 calafrios na espinha da maioria dos desenvolvedores, pois \u00e9 ainda mais complexo.<\/p>\n\n\n\n<p>\u00c9 claro que a l\u00f3gica e os requisitos subjacentes j\u00e1 est\u00e3o estabelecidos; portanto, reescrever o c\u00f3digo \u00e9 indiscutivelmente mais r\u00e1pido do que escrev\u00ea-lo do zero \u2013 e \u00e0s vezes \u00e9 mais r\u00e1pido do que refatorar. No entanto, reescrever o c\u00f3digo pode apresentar novos bugs e vulnerabilidades. Mas talvez o fator mais dolorido seja que a reescrita consome muitos recursos, j\u00e1 que, enquanto o c\u00f3digo \u00e9 atualizado, \u00e9 preciso manter o c\u00f3digo antigo rodando.<\/p>\n\n\n\n<p>Isso quer dizer que o desenvolvedor trabalha simultaneamente com o c\u00f3digo antigo e o novo, trazendo mais fragilidades, erros e bugs \u2013 o oposto do que a refatora\u00e7\u00e3o deve alcan\u00e7ar. N\u00e3o \u00e9 para ningu\u00e9m cair aos prantos, mas \u00e0s vezes isso pode continuar para sempre \u2013 o trabalho de transi\u00e7\u00e3o nunca \u00e9 conclu\u00eddo.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Exemplo<\/h4>\n\n\n\n<p>Digamos que sua empresa tem um aplicativo web com mais de 10 anos e que ainda funciona muito bem. Provavelmente, n\u00e3o \u00e9 necess\u00e1rio reescrever tudo apenas para otimizar ou atualizar alguma funcionalidade.<\/p>\n\n\n\n<p>Nesse caso, \u00e9 recomend\u00e1vel fazer uma abordagem h\u00edbrida. N\u00e3o \u00e9 jogar tudo fora e reescrever, nem escrever do zero: o c\u00f3digo \u00e9 incrementado com novas fun\u00e7\u00f5es aos poucos (testes, testes, testes) e melhorado ao longo do tempo. Nesse caso, enquanto a TI trabalha nas funcionalidades, tamb\u00e9m consegue manter o produto existente vivo.<\/p>\n\n\n\n<p>Ou seja, a refatora\u00e7\u00e3o e a reescrita <em>n\u00e3o s\u00e3o<\/em> mutuamente exclusivas. Pode ser poss\u00edvel refatorar um componente, enquanto outro componente pode exigir uma reescrita. Portanto, vale a pena avaliar o software com sua equipe (complexidade de c\u00f3digo, cobertura de testes e taxas de defeito) para formar um plano.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>H\u00e1 alguns fatores que dificultam a reescrita ou a refatora\u00e7\u00e3o:<\/strong><\/h3>\n\n\n\n<ul><li>Mais e mais funcionalidades. Isso leva ao aumento da complexidade e da sujeira no c\u00f3digo.<\/li><li>Atalhos, \u201cgambiarras\u201d e improvisa\u00e7\u00f5es para suportar coisas do tipo \u201cPrecisamos dessa nova tela de pesquisa at\u00e9 o m\u00eas que vem, e ponto final\u201d.<\/li><li>Rotatividade de profissionais. Os novos desenvolvedores n\u00e3o conhecem todas as decis\u00f5es e ideias fundamentais que est\u00e3o por tr\u00e1s da arquitetura. \u00c9 inevit\u00e1vel que o conhecimento se perca nas transi\u00e7\u00f5es.<\/li><li>Crescimento da equipe de TI: mais pessoas, menos comunica\u00e7\u00e3o. Menos comunica\u00e7\u00e3o, m\u00e1s decis\u00f5es.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"O atributo alt desta imagem est\u00e1 vazio. O nome do arquivo \u00e9 traco-ok.png\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Raz\u00f5es para refatorar ou reescrever o c\u00f3digo<\/strong><\/h2>\n\n\n\n<p>O c\u00f3digo tem s\u00e9rios problemas: \u00e9 um pesadelo para entender e <a href=\"https:\/\/www.editpad.org\/tool\/br\/article-rewriter\" target=\"_blank\" rel=\"noreferrer noopener\">modificar<\/a> com alguma seguran\u00e7a. Pode estar repleto de defeitos e bugs, ter vulnerabilidades de seguran\u00e7a e problemas de desempenho.<\/p>\n\n\n\n<p>Pior ainda, a forma como o c\u00f3digo foi escrito torna dif\u00edcil adicionar novas funcionalidades. Em \u00faltima an\u00e1lise, o c\u00f3digo est\u00e1 impactando negativamente o valor (existente e futuro) do produto, ao mesmo tempo que representa um risco para a empresa e custos adicionais pela inefici\u00eancia.<\/p>\n\n\n\n<p>Muitas coisas tamb\u00e9m podem mudar com o tempo \u2013 novos sistemas operacionais, dispositivos, APIs, linguagens de programa\u00e7\u00e3o, surgimento de novas tecnologias, regulamentos de software (como a LGPD) e, \u00e9 claro, a concorr\u00eancia. Esses s\u00e3o exemplos de d\u00edvidas t\u00e9cnicas inevit\u00e1veis que devem fazer parte do escopo do planejamento e do or\u00e7amento da empresa.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"O atributo alt desta imagem est\u00e1 vazio. O nome do arquivo \u00e9 traco-ok.png\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Raz\u00f5es para N\u00c3O refatorar\/reescrever o c\u00f3digo<\/strong><\/h2>\n\n\n\n<p>Deixando para tr\u00e1s a discuss\u00e3o t\u00e9cnica, refatorar\/reescrever n\u00e3o \u00e9 adequado quando:<\/p>\n\n\n\n<ul><li>O c\u00f3digo legado, no entanto, \u00e9 t\u00e3o confuso que levar\u00e1 mais tempo para refatorar o suficiente e poder fazer qualquer coisa de forma significativa com ele. Os codificadores originais j\u00e1 se foram, a documenta\u00e7\u00e3o e os coment\u00e1rios podem n\u00e3o existir.<\/li><li>A reescrita s\u00f3 \u00e9 vi\u00e1vel se houver recursos suficientes para dividir os esfor\u00e7os entre manter o c\u00f3digo existente <em>e <\/em>escrever o novo c\u00f3digo.<\/li><li>A reescrita pode dar terrivelmente errado se o esfor\u00e7o n\u00e3o for avaliado. Sempre que poss\u00edvel, \u00e9 melhor limitar o escopo da reescrita, caso contr\u00e1rio, isso pode levar anos.<\/li><li>A linguagem de programa\u00e7\u00e3o utilizada no c\u00f3digo est\u00e1 em decl\u00ednio ou ultrapassada. Isso pode dificultar a localiza\u00e7\u00e3o de desenvolvedores que saibam lidar com a codifica\u00e7\u00e3o.<\/li><li>Quando os componentes estiverem t\u00e3o intimamente ligados que uma mudan\u00e7a em um sistema exige mudan\u00e7as em muitos\/todos os sistemas, portanto, refatorar n\u00e3o \u00e9 uma op\u00e7\u00e3o vi\u00e1vel.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"O atributo alt desta imagem est\u00e1 vazio. O nome do arquivo \u00e9 traco-ok.png\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Raz\u00f5es para (SIM) refatorar\/reescrever<\/strong><\/h2>\n\n\n\n<ul><li>A maioria dos softwares \u00e9 produzida para ganhar dinheiro; assim, todos os fatores envolvidos no custo de desenvolvimento de software devem ser pesados, como o or\u00e7amento e o ROI da empresa.<\/li><li>Refatorar\/reescrever normalmente significa criar valor ao seu produto, adicionando novos recursos ou melhorando a interface do usu\u00e1rio\/UX para aumentar o envolvimento de seus clientes.<\/li><li>C\u00f3digo sujo e complicado diminui a efici\u00eancia e a produtividade, desacelerando a cria\u00e7\u00e3o de valor em toda a vida \u00fatil do software.<\/li><li>A m\u00e1 qualidade do c\u00f3digo pode fazer com que os desenvolvedores encontrem outro emprego, pois n\u00e3o s\u00e3o capazes de consert\u00e1-lo. A rotatividade incorre em custos ou adicionar cerca de tr\u00eas meses de inefici\u00eancia at\u00e9 a nova contrata\u00e7\u00e3o. Vale lembrar que h\u00e1 uma escassez global de desenvolvedores de software.<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"O atributo alt desta imagem est\u00e1 vazio. O nome do arquivo \u00e9 traco-ok.png\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Mas afinal, como saber quando reescrever ou refatorar um aplicativo?<\/strong><\/h2>\n\n\n\n<p>Ambas as op\u00e7\u00f5es, no entanto, t\u00eam vantagens e desvantagens.<\/p>\n\n\n\n<p>Refatorar o c\u00f3digo ajuda a mant\u00ea-lo gerenci\u00e1vel sem grandes revis\u00f5es, mas pode n\u00e3o configurar o aplicativo para novas tecnologias de desenvolvimento ou linguagens de programa\u00e7\u00e3o.<\/p>\n\n\n\n<p>Reescrever o c\u00f3digo permite mudan\u00e7as fundamentais, mas corre o risco de confundir os desenvolvedores ou at\u00e9 mesmo quebrar o produto.<\/p>\n\n\n\n<p>N\u00e3o pense em absolutos sobre refatorar ou reescrever c\u00f3digo. Em vez disso, <strong><a href=\"https:\/\/uds.com.br\/blog\/consultoria-de-desenvolvimento-de-software\/\" data-type=\"URL\" data-id=\"https:\/\/uds.com.br\/blog\/consultoria-de-desenvolvimento-de-software\/\" target=\"_blank\" rel=\"noreferrer noopener\">determine qual \u00e9 a melhor escolha<\/a><\/strong> para um projeto espec\u00edfico. Essa decis\u00e3o depende do tipo de produto, das capacidades da equipe, de seus objetivos de longo e curto prazo e sua disposi\u00e7\u00e3o para riscos.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">E o modelo h\u00edbrido?<\/h3>\n\n\n\n<p>Por exemplo, digamos que sua empresa tem um aplicativo web com mais de 10 anos e que ainda funciona muito bem. Provavelmente, n\u00e3o \u00e9 necess\u00e1rio reescrever tudo apenas para otimizar ou adicionar alguma funcionalidade.<\/p>\n\n\n\n<p>Nesse caso, a abordagem h\u00edbrida n\u00e3o joga tudo o que foi feito fora, nem reescreve o c\u00f3digo inteiro: o produto \u00e9 refatorado e melhorado ao longo do tempo, conforme os recursos dispon\u00edveis.<\/p>\n\n\n\n<p>A refatora\u00e7\u00e3o e a reescrita n\u00e3o s\u00e3o mutuamente exclusivas. \u00c9 poss\u00edvel refatorar um componente, enquanto outro componente pode exigir uma reescrita. Portanto, vale a pena avaliar o software com a equipe (complexidade de c\u00f3digo, cobertura de testes e taxas de defeito) para formar um plano.<\/p>\n\n\n\n<p>Como acontece com muitos debates fervorosos na \u00e1rea de desenvolvimento de software, tudo depende de v\u00e1rios fatores que s\u00e3o espec\u00edficos para cada situa\u00e7\u00e3o. Em outras palavras, n\u00e3o h\u00e1 regras gerais sobre se o melhor \u00e9 refatorar ou reescrever.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/uds.com.br\/blog\/wp-content\/uploads\/2022\/07\/traco-ok.png\" alt=\"O atributo alt desta imagem est\u00e1 vazio. O nome do arquivo \u00e9 traco-ok.png\"\/><\/figure>\n\n\n\n<p>A melhor op\u00e7\u00e3o \u00e9 desenvolver uma mentalidade cr\u00edtica para abordar qualquer projeto, avaliar os riscos e definir o melhor caminho a seguir. E,\u00e9 claro, se nenhuma op\u00e7\u00e3o for vi\u00e1vel, \u00e9 melhor reescrever o c\u00f3digo do zero.<\/p>\n\n\n\n<p><em>Sua empresa quer mais do que qualidade de c\u00f3digo? A UDS tem excel\u00eancia em entregas de<\/em><a href=\"https:\/\/uds.com.br\/desenvolvimento-de-software\/\"><em> <\/em><\/a><em><strong><a href=\"https:\/\/uds.com.br\/desenvolvimento-de-software\/\" target=\"_blank\" rel=\"noreferrer noopener\">desenvolvimento de software<\/a><\/strong>, com confiabilidade, agilidade, escalabilidade e seguran\u00e7a em cada etapa do projeto. Conhe\u00e7a nossos<\/em><a href=\"https:\/\/uds.com.br\/cases\/\"><em> <\/em><\/a><em><strong><a href=\"https:\/\/uds.com.br\/cases\/\" target=\"_blank\" rel=\"noreferrer noopener\">cases de sucesso<\/a><\/strong>.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Refatorar ou reescrever c\u00f3digo depende de uma avalia\u00e7\u00e3o cuidadosa das necessidades e condi\u00e7\u00f5es do projeto. Refatorar melhora a qualidade do c\u00f3digo sem mudar seu comportamento externo, enquanto reescrever envolve recriar o c\u00f3digo do zero. Decis\u00f5es devem considerar fatores como complexidade, tempo, custos e riscos. Saiba mais nesse artigo.<\/p>\n","protected":false},"author":8,"featured_media":2917,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[868,864],"tags":[],"yst_prominent_words":[],"_links":{"self":[{"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/posts\/2916"}],"collection":[{"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/comments?post=2916"}],"version-history":[{"count":0,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/posts\/2916\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/media\/2917"}],"wp:attachment":[{"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/media?parent=2916"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/categories?post=2916"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/tags?post=2916"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/uds.com.br\/blog\/wp-json\/wp\/v2\/yst_prominent_words?post=2916"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}