Código de verificação futura

33

Onde trabalho, os desenvolvedores sempre me dizem que "eu adicionei isso apenas para o futuro" ou "acho que é uma boa idéia fazer isso porque eles provavelmente o desejarão algum dia". Eu acho ótimo que eles sejam proativos na tentativa de antecipar mudanças futuras, mas não posso deixar de pensar que é desnecessário e corre o risco de escrever código que talvez nunca seja necessário e, portanto, improdutivo (também acho que alguns desenvolvedores só querem experimentar algo novo por causa disso). Os argumentos para provas futuras são inválidos se você acabou de escrever um código organizado e limpo?

John Shaft
fonte
5
Eu acho que o único código à prova de futuro é ... bem, espaço em branco. :)
Adam Arold 27/05
6
"Bem na hora, não apenas no caso".
Rein Henrichs
4
@edem eu discordo, que a linguagem não é diferente do que outros para o futuro à prova ... (^ _-) en.wikipedia.org/wiki/Whitespace_(programming_language)
Izkata

Respostas:

62

Bem, primeiro de tudo, há algumas coisas que precisam de esclarecimentos:

  • Prova futura não está adicionando coisas.
  • A prova futura é garantir que você possa adicionar facilmente código / recursos sem interromper a funcionalidade existente.

Isso significa que escrever um código "à prova de futuro" garante que o código seja escrito de maneira flexível, suficientemente abstrata, mas também um código que não oculte completamente os níveis de abstração; portanto, sempre há um caminho para os níveis mais baixos de abstração se necessário.

Escrever código à prova de futuro é uma arte por si só e está fortemente associado às práticas do SOLID para versões de componentes, separação de preocupações, camadas e abstração de funcionalidade. A verificação futura não tem nada a ver com adicionar recursos antecipadamente, mas garantir que você possa adicionar recursos no futuro de maneira ininterrupta , através do bom design dos códigos / bibliotecas existentes.

My 2c

Pop Catalin
fonte
Essa e a resposta de Thorbjørn Ravn Andersen sobre os testes combinados seriam a resposta perfeita.
Andy Lowry
2
Eu já vi isso muitas vezes, "como adicionaremos isso porque um dia precisaremos", ou o dia nunca chega ou quando tudo corre bem, você está preso a uma estrutura de dados ou estrutura de programa que realmente não se encaixa a necessidade real quando finalmente surge. O caminho certo seria retirar o material antigo e construir de novo, mas geralmente a tendência para a prova do futuro como essa geralmente está associada a um forte desdém em jogar fora o código que já foi feito, independentemente de ser bom ou não. Essas equipes geralmente tendem ao design da cebola, mascarando insetos de uma camada com outra camada.
Newtopian
A revisão futura pode não estar adicionando recursos, mas certamente você pode adicionar código. Uma técnica é adicionar verificações de segurança e proibir explicitamente qualquer comportamento indefinido.
EdA-qa mort-ora-
18

Não escreva código que não será usado por muito tempo. Será inútil, pois provavelmente não atenderá às necessidades naquele momento (que você por definição ainda não conhece).

Torne o código robusto contra situações inesperadas de problemas que permitam recuperação normal ou com rapidez de falha, mas não escreva código para possíveis usos futuros.

Uma boa maneira de garantir isso é usar o design e o desenvolvimento orientados a testes. Os casos de teste são derivados da especificação e dos casos de uso. Todo o código deve passar no teste. Código desnecessário não deve ser escrito. Fazendo dessa maneira, é simples determinar se é necessário ou não.


fonte
+1: é tão difícil prever o futuro. Simplesmente usar um bom design - e chamá-lo de "bom design" - é melhor do que fingir prever o futuro.
S.Lott 27/05
17

É importante perceber que tornar o código à prova do futuro e escrever o código , caso seja necessário no futuro, são duas coisas muito diferentes. O primeiro é crucial para uma boa aplicação, o menor geralmente não é uma boa prática de codificação.

  • Para mim, a prova futura do código, é escrevê-lo de uma maneira que ele possa interagir com as tecnologias em evolução. Isso envolve modularizar seu código, para que cada parte do seu aplicativo possa interagir independentemente do idioma e da tecnologia do aplicativo como um todo. Um bom exemplo disso seria usar XML ou JSON para transmitir dados entre diferentes partes do aplicativo. No entanto, a tecnologia evolui, é muito provável que ela sempre consiga ler XML e JSON.

  • Semelhante ao acima, expor uma parte do seu aplicativo por meio de uma API SOAP ou REST alcança algo semelhante. Qualquer que seja a evolução das tecnologias, você não precisará necessariamente reescrever todas as partes do aplicativo, porque as novas tecnologias ainda poderão se comunicar com as antigas.

  • No que diz respeito à escrita do código , caso seja necessário , acho que é muito perigoso, pois é provável que o código tenha pouco ou nenhum teste.

Portanto, faça o código à prova de futuro (a NASA ainda envia naves espaciais usando o Fortran), mas não escreva código 'apenas por precaução'.

mrwooster
fonte
1
+1 para a distinção entre 'prova futura' e 'caso seja necessário para o futuro'
John Shaft
2
Conselho de design de som. A única coisa que falta é uma afirmação clara de que "prova do futuro" é apenas uma frase sem sentido que significa "razoavelmente bem projetado".
S.Lott 27/05
11

Pense em quanto tempo você ativou um pedaço de código no ambiente de produção e pensou: "Graças a Deus eu escrevi isso há 2 anos!".

O código deve ser modificável / extensível facilmente. Não adicione código desnecessário, pois isso dá uma sensação muito falsa de segurança e desperdiça recursos de desenvolvimento / teste em um mundo de requisitos em constante mudança.

Subu Sankara Subramanian
fonte
3
Você está sugerindo "Graças a Deus eu escrevi isso há 2 anos!" é raro? Na minha experiência, isso nunca aconteceu, mas talvez seja apenas eu.
S.Lott 27/05
4
É uma ocorrência muito rara - porque as bases de código que permanecem sólidas sem 2 anos / prevendo mudanças a 2 anos são muito difíceis de encontrar.
Subu Sankara Subramanian
2
Bem, eu realmente tive alguns momentos "Graças a Deus que escrevi isso há um ano". Eu sou mais inteligente do que eu pensava.
Falcon
1
@ Falcon gostaria de elaborar sobre esses momentos? Seria bastante interessante saber quais você acertou.
7

Muitas das outras respostas abordam problemas maiores de design ou são bastante abstratas. Se você pensar em termos do que acontecerá no futuro, poderá definir algumas técnicas claras para ajudar a proteger o código no futuro .

Pense principalmente que no futuro alguém tentará adicionar um recurso ao código ou tentará reutilizá-lo em outro lugar. Eles também podem tentar corrigir um recurso no código. Obviamente, apenas ter um bom código limpo é um ponto de partida necessário, mas também existem algumas técnicas específicas que podem ser feitas.

Programação defensiva : faça a verificação de entrada além do que o aplicativo atual realmente precisa. Sempre que você chamar APIs, verifique se a entrada deles é algo que você esperaria. No futuro, as pessoas estarão misturando novas versões de código, para que o escopo de erros e retornos da API mude do que é agora.

Elimine o comportamento indefinido : Muitos códigos possuem comportamentos que meio que evoluem do nada. Certas combinações de entrada levam a uma saída que ninguém realmente pretendia, mas acontece. Agora, inevitavelmente, alguém confiará nesse comportamento, mas ninguém o saberá, pois não está definido. Qualquer pessoa que tente mudar o comportamento no futuro quebrará inadvertidamente as coisas. Use as verificações de segurança agora e tente remover / bloquear todos os usos indefinidos do código.

Conjunto de testes automatizados : Tenho certeza de que você pode encontrar volumes escritos sobre a necessidade de testes de unidade. Em referência a provas futuras, no entanto, este é um ponto crítico para permitir que alguém refatore o código. A refatoração é essencial para manter o código limpo, mas se não houver um bom conjunto de testes, você não poderá refatorar com segurança.

Isolamento e Segregação : Encapsulamento e modularização adequada são um bom princípio de design, mas você precisa ir além disso. Você encontrará muitas vezes que precisa usar uma biblioteca, API ou produto, que pode ter um futuro questionável. Talvez devido a preocupações com a qualidade, problemas de licenciamento ou desenvolvimento contínuo pelos autores. Nesses casos, tire um tempo extra para colocar uma camada entre você e esse código. Corte a API exatamente do que você precisa, para que o acoplamento seja muito baixo para permitir uma substituição mais fácil no futuro.

edA-qa mort-ora-y
fonte
6

Um código bom, limpo e bem organizado é à prova de futuro, no sentido de facilitar as implementações e alterações.

Larry Coleman
fonte
5

"Prova do futuro" significa, na melhor das hipóteses, "design fracamente acoplado". 80% das vezes as pessoas querem dizer "flexível" quando dizem "prova do futuro". Às vezes, eles dizem para tentar parecer legal. Mas pelo menos eles estão entregando algo dentro do prazo que funciona.

"Prova do futuro", na pior das hipóteses, não tem sentido. 20% do tempo, é uma desculpa para perder tempo pesquisando tecnologias alternativas em vez de simplesmente entregar algo. Eles não estão entregando nada (ou o que estão entregando é muito complexo para o problema em questão).

Existem dois casos extremos.

  1. Prontidão infalível. Na verdade, pode-se prever o futuro com precisão. Nesse caso, aplique esta poderosa previsão para prova futura do código. Melhor, aplique a previsão infalível para prever as tendências do mercado e se aposentar cedo e parar de codificar.

  2. Um está "dirigindo" o futuro. Ou seja, existe uma nova tecnologia pronta para implantar no futuro que exigirá uma reescrita da coisa que está sendo entregue no momento. É estranho que alguém não esteja implantando esse futuro legal primeiro.

    Devemos entregar o projeto "A", sabendo que o projeto "B" levará a uma reescrita imediata de "A". Somente neste caso, poderemos comprovar "A" no futuro.

S.Lott
fonte
5

YAGNI = Você não precisa disso .

Seus instintos estão corretos: o código deles é supérfluo, adiciona uma carga de manutenção e teste e desperdiça tempo com coisas que não têm um valor comercial concreto.

Veja também: Chapeamento de ouro .


fonte
4

Ignorando o título da pergunta e mantendo o ponto principal sobre "colocar coisas porque alguém pode querer isso algum dia" ...

A resposta é não. Nunca. Não escreva um ponto do código que você não precisa hoje. Aqui está o porquê:

  1. O programa agora é mais complicado do que precisa ser.
  2. Você pode nunca precisar do recurso, por isso perdeu seu tempo.
  3. Você não sabe quais serão os requisitos para o recurso se alguém o solicitar no futuro. Então você terá que descobrir e modificar de qualquer maneira.

Eu acho que o primeiro ponto é o mais importante. Se você já trabalhou com um sistema repleto de códigos genéricos para diferentes clientes ou repleto de recursos desnecessários, então sabe quanto tempo e esforço extra são necessários para manter ou estender a funcionalidade por causa de aquele. Portanto, evite a todo custo.

Dave
fonte