Prototipagem vs. Código Limpo nos estágios iniciais


43

Estou planejando trabalhar / iniciar alguns projetos pessoais que podem acabar como meu trabalho diário. Isso me fez pensar, por onde devo começar?

  • Apenas protótipo - escreva apenas um código básico funcional que poderia me custar muito tempo otimizando e refatorando para facilitar a expansão.

  • Escreva um código limpo, otimizado e documentado desde o início, tendo em mente que, se depois de algum tempo não for econômico, será descartado.

Atualização: A combinação do YAGNI com as respostas sunpech e M.Sameer faz todo o sentido para mim :) obrigado a todos pela ajuda.


1
Veja também: Quando refatorar
gnat

Respostas:


39

Existe uma terceira opção ... escrever código limpo via desenvolvimento orientado a testes para implementar os requisitos que são necessários hoje porque o YAGNI.

A tentação de escrever um código que não é necessário no momento, mas que pode estar no futuro, sofre de várias desvantagens ... Você não precisará disso :

  • O tempo gasto é gasto na adição, teste ou aprimoramento da funcionalidade necessária.
  • Os novos recursos devem ser depurados, documentados e suportados.
  • Qualquer novo recurso impõe restrições sobre o que pode ser feito no futuro; portanto, um recurso desnecessário agora pode impedir a implementação de um recurso necessário posteriormente.
  • Até que o recurso seja realmente necessário, é difícil definir completamente o que ele deve fazer e testá-lo. Se o novo recurso não for definido e testado corretamente, ele pode não funcionar corretamente, mesmo que eventualmente seja necessário.
  • Isso leva ao inchaço do código; o software se torna maior e mais complicado. A menos que haja especificações e algum tipo de controle de revisão, o recurso pode não ser conhecido pelos programadores que poderiam fazer uso dele.
  • Adicionar o novo recurso pode sugerir outros novos recursos. Se esses novos recursos também forem implementados, isso poderá resultar em um efeito de bola de neve no sentido de uma característica arrepiante.

Como resultado, você não deve apenas prototipar ... nem escrever código limpo, otimizado e documentado desde o início, tendo em mente que, se em algum tempo não for econômico, será descartado.

Escreva o código que você precisa agora, sabendo que poderá atender melhor às necessidades de hoje e de amanhã.


4
Embora eu não seja fã do TDD completo, esse é sempre um bom conselho, pois o acompanhamento do TDD forçará você a escrever um código limpo e bem documentado.
Wayne Molina

1
Acho que o que ele quis dizer foi que abandonaria o projeto inteiro se não der certo. Se isso for verdade, essa resposta não parece diferente de "escrever código limpo".
Jeremy

@ Jeremy, você está certo na minha resposta. Mas essa resposta não é a mesma. Baseia-se em estrita forma de programação, onde outro é baseado na experiência, com certeza eles olham em alguns casos semelhantes, mas não é o mesmo :) bem, pelo menos do ponto i vê-lo :)
JackLeo

1
@JackLeo Acho que o ponto é que, quando você alcança um certo nível de experiência, deixa de haver uma diferença entre "código no qual trabalhei duro" e "código que acabei de escrever".
Ant P

@AntP De fato. É interessante refletir sobre esta questão 6 anos mais tarde :)
JackLeo

16

como sempre...

Depende

Se você está fazendo um protótipo para mitigar um risco ou expor um desconhecido, basta codificá-lo e esperar jogá-lo fora quando terminar

Se você estiver fazendo prototipagem para refinamento iterativo, basta codificá-lo e esperar modificá-lo e refatorá-lo com frequência

Se você está começando a escrever o produto real, mas chamando-o de prototipagem, para ter preguiça , não seja preguiçoso e escreva-o bem da primeira vez


2
+1 Ótima postagem! Eu acrescentaria que, embora possa parecer inútil depois de você ter desenvolvido esse recurso, NUNCA jogue fora seus protótipos. Eu sempre controle de origem todos os protótipos em que trabalho, porque às vezes me refiro a eles para obter dicas e sugestões.
Maple_shaft

1
@maple_shaft: sim, "jogar fora" é metaforicamente, como em "não necessariamente tentar refatorar isso, o plano de reescrevê-lo"
Steven A. Lowe

2
Eu digo que seja preguiçoso e escrevo bem na primeira vez, para que você não precise voltar e revisitá-lo mais tarde.
Blrfl

3ª frase fez o meu dia.
Christopher Francisco

10

Se você está fazendo prototipagem, por que pensa em código limpo? A própria idéia da criação de protótipos é que ela serve para provar um conceito ou idéia e ser jogada fora depois.

Discordo da maioria das pessoas aqui dizendo que, se você já está pensando na escolha entre escrever código limpo ou fazer algo rapidamente para a criação de protótipos, escolha o último. Especialmente quando você está falando sobre o desenvolvimento do estágio inicial. Não estou dizendo que nunca escreva um código limpo, estou dizendo que tire a ideia, veja que é a direção a seguir e depois limpe-a - refatorar.

Como desenvolvedores de software, ficamos tão envolvidos em fazer as coisas certas e limpas na primeira vez, que não percebemos que não é um código que estamos entregando, é uma solução para um problema .

Penso em codificar como escreveria um artigo:

Ao escrever um artigo, começamos em algum lugar, esboçamos idéias, contornos etc. Ele não conterá todos os detalhes ou terá uma aparência finalizada - é essencialmente um primeiro rascunho, seguido por um segundo e assim por diante. Muito será reescrito, substituído e / ou até removido ao longo do caminho para um papel mais refinado e acabado. (Obviamente, essa analogia não chega ao ponto de dizer que o código está realmente realmente terminado ou final como um artigo.)


+1 Resposta muito boa :) aconteceu muito comigo nos primeiros dias, então pular em grandes projetos pode causar o mesmo ... é disso que tenho medo.
precisa saber é o seguinte

"Como desenvolvedores de software, ficamos tão empenhados em fazer as coisas certas e limpas na primeira vez, que não percebemos que não é o código que estamos entregando, é uma solução para um problema." Eu diria que é o contrário: "Nós nunca temos tempo para fazer o que é certo, mas sempre temos tempo para fazer o que fazemos".
Christopher Francisco

6

Existem dois tipos de prototipagem:

  • Protótipo evolutivo que continua evoluindo através de aprimoramentos e correções para se tornar o produto final.
  • Protótipo descartável que existe apenas para tornar a coleta de requisitos e o feedback do cliente mais eficazes nos estágios iniciais do projeto e, em seguida, ser totalmente descartada e o desenvolvimento do produto final começa do zero.

De acordo com Capers Jones, os protótipos evolutivos produzem produtos finais de baixa qualidade que exigirão muito mais esforço e mais tempo para alcançar a estabilidade.

Portanto, se você estiver pensando em prototipar para que o cliente possa ver algo o mais rápido possível para ajudá-lo a ter uma melhor idéia e mais detalhes sobre os requisitos, é melhor ser um protótipo descartável e ter o desenvolvimento feito em código limpo posteriormente. Se você não puder pagar por isso, escreva um código limpo desde o início e mantenha-o com cuidado, mas como outros sugeriram, não otimize demais e não adicione coisas até que você precise.


Muito bom ponto, isso é para mostrar diferentes tipos de prototipagem, eu não pensei sobre isso :) Food para um embora para mim aqui :)
JackLeo

Concordo com o ponto!
Richard Topchiy

O grande risco do protótipo descartável é que o gerenciamento terá problemas para entender por que a versão de produção deve demorar tanto em comparação com o protótipo e por que o trabalho no protótipo deve ser "desperdiçado". É claro que, se for sua própria startup, não existe esse gerenciamento, o que facilita muito.
Jan Hudec

5

Estou relutante em desculpar a codificação suja por qualquer motivo. Na minha experiência, as pessoas que alegam ser rápida e suja como desculpa para a criação de protótipos têm essa atitude em relação a qualquer código, incluindo a produção. Se alguém cria um protótipo confuso, ele cria confusão em qualquer código. Prototipagem não significa codificação suja, significa suposições simplificadas para testar os casos de uso mais importantes. O código pode não ser formalmente testado ou cuidar de todos os detalhes, mas ainda deve ser bem projetado e implementado. Limpeza é um sinal de competência, programadores competentes sentem repulsa natural por códigos confusos, não importa qual seja seu objetivo.


Apenas uma coisa que eu esqueci de mencionar. Eu já vi isso várias vezes, as pessoas estavam escrevendo rápido e sujo para fins de "prototipagem" e tornou-se doloroso e feio para fins de produção. Uma vez que está pronto e funcionando, as pessoas continuam adicionando bandagens, empilhando bagunça após bagunça.
Gene Bushuyev

Você entendeu bem - "por que reescrever se funciona?" é um problema para muitas empresas jovens, eu vejo isso mesmo no meu cargo atual, quando grandes empresas usam CMS de 10 anos que é doloroso para atualizar para os padrões atuais ... É por isso que estou fazendo essa pergunta, não sei ' não quero cometer um erro aqui. Embora a sua resposta esteja dizendo principalmente que estou procurando uma desculpa para escrever código desleixado. Não. Sunpech e M.Sameer entenderam meu ponto. Protótipo é fazer algo para ver como o mundo reagirá a ele. Se funcionar - faça bem.
precisa saber é o seguinte

1

Escreva código limpo, otimizado e documentado desde o início. Eu sou incapaz de fazer isso sozinho e é um problema real. Não sou codificador, mas já trabalhei para empresas de desenvolvimento de software em funções de gerenciamento voltadas para o cliente em quantidade razoável e, como elas me dão muitas boas idéias, ocasionalmente construo um protótipo para alguma coisa. Quase todas as vezes que o protótipo era entregue a um desenvolvedor que "limpava" e o transformava em um produto de remessa. Quando eu verifico a fonte, ainda será 80-90% o meu código de baixa qualidade.


0

Um colega meu apoia com entusiasmo a prototipagem repetida, com a ressalva de que é preciso ter disciplina suficiente para jogar cada protótipo fora e escrever novamente do zero - e não apenas isso, garantir que não seja influenciado pelos detalhes da implementação decididos na última vez , pois o que se acaba fazendo é escrever o mesmo protótipo em um estilo trivialmente diferente várias vezes. Ele sugeriu semi-seriamente que, se você realmente estivesse anexado a algum pedaço brilhante de código que não poderia descartar, imprima, exclua o repositório de controle de origem e publique a impressão para si mesmo - ela desaparecerá tempo suficiente para que não possa se infiltrar na próxima iteração.


é difícil ler este post (parede de texto). Você se importaria de editá -lo em uma forma melhor?
mosquito

Você pode sugerir qual é o problema? Talvez as frases sejam muito longas, como acabei de notar que existem apenas duas delas. Algo mais?
Tom W

-1

Você sempre pode começar fazendo o trabalho (de todo), revisá-lo para torná-lo limpo e depois torná-lo rápido / pequeno, se fizer sentido economicamente fazer isso. Eu começaria com alguns experimentos que você joga fora e depois o TDD volta a existir quando você tem uma idéia do que funciona.


-1

Ambos são bons. Ambos eu gosto. Eles não se contradizem.

Eu gosto de prototipar. Prototipagem está desenvolvendo minhas habilidades criativas. Estou testando muitas soluções possíveis. Fazer isso rápido me dá a possibilidade de testar várias maneiras possíveis de resolver problemas.

Eu gosto de escrever código limpo e bom testado. Desenvolve minhas habilidades principais. Normalmente escolho um dos protótipos e o aprimoro ou reescrito do zero.

Mas você nunca deve confundir o protótipo com o código de produção. O protótipo nunca deve entrar em produção. Deve ser sempre marcado como protótipo. Na melhor das hipóteses, faça toda a prototipagem em seu próprio ramo.


-2

Costumo dizer que extremos são quase sempre ruins.

Aconselho a manter o equilíbrio entre limpo, bem documentado e prototipado. Quando você desenvolve uma biblioteca ou plataforma, você não tem experiência, eu vou mais para a direção da criação de protótipos. Isso é especialmente verdade no começo e para plataformas, como Android ou contêineres, que colocam você no espartilho. Isso significa que você implementa as interfaces deles e eles chamam você.

Pela minha própria experiência, a maior parte do código não dura muito tempo. Dito isto, avance rapidamente implementando seu recurso. Quando, mais cedo ou mais tarde (na maioria das vezes, mais cedo), você precisa refazer / refatorar o código existente por causa do próximo recurso que você organiza, especialmente as peças com as quais é complicado trabalhar. Preste atenção para ter testes automatizados adequados para tornar possível a refatoração sem complicações. Pertencendo às plataformas mencionadas acima, como o Android: muitas vezes, eles tornam os testes automatizados não tão fáceis por causa do acoplamento estreito e do projeto de testabilidade. Em seguida, você pode elevar sua base de testes a um nível superior, por exemplo, testes de integração.

Eu escrevi um artigo que pode dar algumas dicas sobre como iniciar: https://medium.com/@ewaldbenes/start-lean-why-its-best-to-split-your-next-coding-project-by-feature-70019290036d

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.