php-brasil / software-legado

Série de hangouts sobre manutenção de software legado
18 stars 2 forks source link

Tópico(s)? do primeiro hangout #2

Closed netojoaobatista closed 9 years ago

netojoaobatista commented 9 years ago

Como iniciaremos a série? Uma introdução sobre o que é software legado, a importância estudá-lo e compreendê-lo antes de trabalhá-lo?

iannsp commented 9 years ago

Nesse primeiro hangout poderiamos abordar coisas/frases como:

alganet commented 9 years ago

É preciso coragem tanto pra manter um sistema legado quanto pra re escrevê-lo, e sabedoria para escolher a melhor abordagem para cada código.

Acho que a primeira coisa é identificá-lo, como o @iannsp propôs. Quando eu posso dizer que um software é legado? Isso é sempre ruim?

henriquemoody commented 9 years ago

Michael Feathers no livro Working Effectively with Legacy Code dá melhor definição que eu já conheci, seguindo ele código legado é simplesmente: código sem teste. Se você escreve um código sem teste, na realidade, você está escrevendo código legado.

netojoaobatista commented 9 years ago

Legado não necessariamente significa que o software é ruim.

Por exemplo, um desenvolvedor saiu da empresa e você assumiu o desenvolvimento. A partir desse momento, o software é legado do desenvolvedor que saiu. Compreender esse software é importante para assumirmos esse legado.

henriquemoody commented 9 years ago

Aí é que entra a importância dos testes, sem eles a compreensão do código fica muito mais difícil e sem essa compreensão qualquer alteração pode ter um impacto catastrófico.

netojoaobatista commented 9 years ago

E aí entra a coragem e sabedoria que o @alganet mencionou.

Temos um legado sem testes e um risco muito grande de qualquer mudança impactar catastroficamente aos usuários. É preciso ter coragem, mas também é preciso ser sábio. É preciso ter uma virtualização para poder trabalhar no software e tentar simular o impacto que as mudanças poderão trazer.

iannsp commented 9 years ago

De fato, eu não acredito que software legado é sinonimo de software ruim. Acredito que a muito da avaliação que é feita de um software lgado ( e que cria a ideia de que legado é ruim [com testes ou sem] ) é a falta da aplicação de certos preceitos na hora dessa avaliação, alguns deles são os que enumerei no outro comentário.

netojoaobatista commented 9 years ago

Acho que a crença popular de que software legado é ruim vem, em partes, dos seguintes pontos:

  1. Não compreendemos exatamente como o software funciona.
  2. Não compreendemos exatamente o negócio ou o problema que o software resolve.
  3. A equipe anterior utilizou standards diferentes do que usamos.
  4. A equipe utilizou padrões de design e arquitetura que desconhecemos.

Obviamente, a equipe anterior pode ter inserido diversos bad smells, mas isso não quer dizer, necessariamente, que código legado tem bad smells.

henriquemoody commented 9 years ago

Meu ponto de vista, é a definição do termo Código Legado, mesmo que eu esteja trabalhando no código de outra pessoa, mesmo que seja antigo e que eu não tenha macro-conhecimento dele, se ele tem teste não o considero como código legado. Código que precisa ser refatorado não é o mesmo que código legado.

netojoaobatista commented 9 years ago

Então já temos o primeiro tópico do primeiro hangout, @henriquemoody : O que é código legado?

Talvez a própria definição de código legado seja suficiente para muita discussão e, provavelmente, fechar o tempo de duração - #3 - do primeiro hangout

henriquemoody commented 9 years ago

Eu concordo plenamente com o Michael Feathers: código sem testes.

Code without tests is bad code. It doesn’t matter how well written it is; it doesn’t matter how pretty or object-oriented or well-encapsulated it is. With tests, we can change the behavior of our code quickly and verifiably. Without them, we really don’t know if our code is getting better or worse - Feathers, Michael (2004-09-22). Working Effectively with Legacy Code (Robert C. Martin Series)

iannsp commented 9 years ago

por favor @henriquemoody, me explique por que um software que tem testes deixa de ser legado. Eu vi que você se ateve a descriçnao que você leu, sobre a aplicação da palavra legada ao "software", bem, a palavra legado, segundo o dicionario michaelis em sua versão online disponivel pelo uol:

le.ga.do sm (lat legatu) 1 Disposição, a título gracioso, por via da qual uma pessoa confia a outra, em testamento, um determinado benefício, de natureza patrimonial; doação "causa-mortis". 2 Parte da herança deixada pelo testador a quem não seja herdeiro por disposição testamentária nem fideicomissário. 3 Na Roma antiga, comandante de uma legião. L. cultural: língua, costumes e tradições, que passam de uma a outra geração.

por isso minha confusão com sua definição. Codigo bom ou ruim, com testes ou sem testes. Se você entra em contato com ele sem ter participado de sua construção e precisa mante-lo, ele é legado a você. ou não.?

netojoaobatista commented 9 years ago

@henriquemoody, o que foi dito nesse quote é: Code without tests is bad code

De fato, um código sem testes é um código ruim. Ninguém está discutindo isso. Mas o fato desse fragmento estar num livro sobre código legado não significa que todo código legado é ruim e nem que necessariamente a presença ou ausência de testes definem código legado.

Legado é o que alguém deixa. Se a equipe que desenvolveu o software deixou o desenvolvimento e você o assumiu, então o código que você assumiu é o legado da equipe anterior. Seja um bom código, com testes, ou um código ruim, esse código é o legado da equipe anterior.

henriquemoody commented 9 years ago

Se for olhar pra sua definição todas as bibliotecas que usamos (Symfony, ZF, Respect, etc) são códigos legados então, afinal, fomos nós que escrevemos? Mesmo que tenhamos contribuído com uma parte, apenas nós alteramos?

Quando se desenvolve em um equipe, caso seu colega tenha feito um código sem testes que segurança você tem para alterá-lo? Mesmo que tenha sido você quem o escreveu, com o passar dos anos nós mesmo esquecemos, o legado não foi passado por outra pessoa ele é nosso mesmo.

iannsp commented 9 years ago

outra coisa, tudo muda se você partir do principio de que codigo legado é por si, algo pejorativo, ou ainda, a definição básica de software que não é mais evoluido, mas somente mantido, ou seja, código morto.

henriquemoody commented 9 years ago

Código morto é código não utilizado, de acordo com sua definição isso não é código legado a menos que tenha sido escrito por outra pessoa.

netojoaobatista commented 9 years ago

Por isso que, talvez, a própria definição de o quê é código legado seja um bom tema para o hangout.

O quê é um código legado?

henriquemoody commented 9 years ago

A respeito o quote do livro:

To me, legacy code is simply code without tests. Feathers, Michael (2004-09-22). Working Effectively with Legacy Code (Robert C. Martin Series)

Coloquei aquele quote pra complementar o que eu havia dito.

netojoaobatista commented 9 years ago

Pessoalmente, @henriquemoody, acho essa definição de código legado do Michael Feathers um tanto idiota.

Muitos desenvolvedores mais novos escrevem código sem testes. Muitas startups, pela necessidade de entrar rapidamente no mercado, forçam suas equipes a entregar código como pastel, abrindo mão dos testes.

Segundo essa definição, ou você trabalha com TDD - que envolve ter teste antes do código, ou sua primeira linha de código sem teste é uma linha de código legada.

henriquemoody commented 9 years ago

Código legado é simplesmente o código em que você não tem conhecimento e todos nós sabemos que documentação de código não é eficaz, por isso que eu concordo com ele quando ele fala sobre testes.

Código bem ou mal escrito, não faz diferença quando você não o conhece e não tem algo para assegurar que suas mudanças não vão causar problemas.

iannsp commented 9 years ago

acho que a confusão aqui esta em sobrecarregar a palavra legado com sentidos que não a pertencem. Me diga, é perfeitamente possivel dizer "software legado de qualidade"? Se sim, outra pergunta: É possivel dizer que um software sem testes é de qualidade? Vê ai a falha na dicotomia que dizer que software legado é software com testes pode criar?

iannsp commented 9 years ago

bem, essa discussão só prova que a ideia do @netojoaobatista de usar esse tema para o hangout é muito boa.

alganet commented 9 years ago

A palavra "legado", pura, é boa. Em software, é pejorativa. Talvez não devesse ser, mas eu não posso mudar a cultura da nossa área =P

O que fazemos pra contornar isso é fingir que código velho, quando é bom, não é legado. Não chamamos o Linux de legado, ou o x86 de legado, embora eles existam há muito tempo. Acho que isso explica o paradoxo do "o framework que acabei de escolher é legado", porque ele é, mas fingimos não ser porque pra nós isso não é ruim se ele é bom.

Em outras palavras, quando deixam algo ruim pra trás a gente chama de legado e quando deixam algo bom a gente chama de dependência. Tentando uma analogia fraquinha: "Dívida póstuma" e "testamento" são o mesmo processo, mas tem resultados diferentes.

Seguindo essa linha, software legado é uma dependência que está custando mais do que oferece e pode ou não ter conserto.

iannsp commented 9 years ago

@alganet não consigo usar a palavra legado e ver nela somente o sentido pejorativo. Quando eu digo, temos um software legado na empresa, não digo que temos um software ruim, mas que temos um software que não foi escrito pela equipe atual e que precisa ser mantido. quando quero dizer que um software legado é ruim, eu qualifico ele, normalmente educadamente com frases do tipo: Essa porr* de software ta me f*dendo!

henriquemoody commented 9 years ago

Existe sim código legado de qualidade, bem como código de qualidade sem testes, porém me sinto mais confortável alterando/refatorando um código ruim com testes do que um código bom sem testes.

Na realidade eu estou concordando com você @iannsp, não se trata de código bom ou ruim, código legado é simplesmente aquele que não te proporciona segurança ao fazer alterações, não importando quem o escreveu.

iannsp commented 9 years ago

bem, eu mesmo ainda não estou muito convencido de alguns detalhes. Fato é que estamos desconstruindo para depois (re)construir um conhecimento, mas de uma maneira que conheçamos as argumentações que o alicerçam. É um ótimo exercicio por que assim lidamos com o conhecimento que esta naquela definição falaciosa de "todos sabem que ....". Como a gente pode ver aqui, muitos dos nossos problemas de comunicação podem ter como fundo esse tipo de falácia. E vamos que vamos...

netojoaobatista commented 9 years ago

Vejo software legado, independentemente da qualidade do código, de duas formas distintas:

  1. A equipe que desenvolveu o software saiu e eu assumi o desenvolvimento. O software é um legado da equipe anterior.
  2. A empresa tinha um software e resolveu descontinuá-lo em benefício de um mais novo. Esse software foi descontinuado mas ainda tem uma carteira de clientes e precisamos mantê-lo enquanto houver clientes utilizando-no. O software é um legado da empresa.
henriquemoody commented 9 years ago

Outras observações interessantes:

alganet commented 9 years ago

@netojoaobatista eu não sou muito fã da relação entre software legado e empresas.

Empresas podem descontinuar software por diversos motivos não-técnicos. Elas podem manter ativo software tecnicamente ruim por motivos corporativos (o pior tipo de legado).

Em alguns casos (e não digo que são todos), não há margem pro programador ter coragem ou sabedoria para nada exceto damage control.

A maior reclamação que ouço é que o programador nem pode decidir onde quer refatorar primeiro porque a empresa tem sua própria agenda. É um cenário frequente, e eu adoraria ter o que falar pra um programador nessa situação além de "sinto muito".

Bolinha1 commented 9 years ago

Significado de Legado

s.m. Figurado.

Tudo aquilo que se pode transmitir às gerações que se seguem: isso faz parte do legado de meu avô. Fonte : http://www.dicio.com.br/legado/ De acordo com o significado da palavra e, voltado para nosso contexto. De forma minimalista eu posso afirmar que, Software Legado é todo aquele que existe e precisa ser mantido. O legado pode indeferir de equipe, nós muitas vezes quando passamos certo tempo em alguma empresa, construímos diversas aplicações que se tornam legados da empresa, mas não do time que desenvolve, pois o time pode ainda existir e, continuar a construir esse legado sem grandes problemas. Porém essa mesma equipe pode não cuidar mais desse projeto, e passa-lo a outra, se tornando legado de uma equipe para outra, mas em termos mais gerais esse ainda é um legado daquela empresa. Quando entramos em uma empresa, nos deparamos com uma serie de legados dela, que passam a ser considerados Legados somente pelo fato de terem de ser mantido por uma pessoa que estava fora dali e que acabas de chegar e, que pouco conhece sobre o mesmo. E é nesse ponto que recai grandes partes do problema. Não somente o que é um legado, mas como lidar de inicio com um legado.
alganet commented 9 years ago

Tem uma frase legal no link que o @henriquemoody passou:

Another type of decay can appear in LegacyCode that has been maintained but not refactored. This isn't usually rust, but an instance of the PlayDohPrinciple.

Código que foi mantido e não foi refatorado é uma definição legal do problema.

netojoaobatista commented 9 years ago

A discussão está fantástica, mas saímos do escopo da issue ao não focar na definição do tópico do primeiro hangout. Minha sugestão vai para levarmos essa discussão sobre a definição de código legado para o hangout.

Sugestão para tópico do primeiro hangout: O quê é software legado?

henriquemoody commented 9 years ago

:+1: para esse tópico

Bolinha1 commented 9 years ago

Vamos falar sobre o que é software legado no primeiro. E em um segundo momento abordamos as dificuldades que o mesmo pode trazer aos desenvolvedores.

Minha sugestão :)