Como evitar a reescrita de partes de um aplicativo

13

Estou trabalhando em uma empresa em um projeto para o departamento de vendas. É o meu primeiro trabalho de programação profissional, mas eu tenho codificado sozinho e aprendido há anos. Parte do projeto envolve pegar alguns dados e combiná-los com dados para produzir e representar graficamente. Em seguida, salve os dados ... e assim por diante. Então, eu escrevi o código para isso em pouco menos de um dia. No dia seguinte, mostrei meu supervisor de projeto e ele gostou, mas "e se tivéssemos isso", e queria que eu acrescentasse algo ao gráfico. Não foi uma grande mudança na aparência ou na função do programa, mas mudou drasticamente a maneira como eu precisava armazenar dados, processá-los etc.

Novamente, demorei um dia para reestruturar a tabela do banco de dados e reescrever o código basicamente do zero para dar suporte a essa nova solicitação. Levei de volta para ele novamente, e exatamente a mesma coisa aconteceu. Ele solicitou outra coisa que mudou drasticamente a forma como eu precisava processar os dados. Então, eu tive que reescrevê-lo novamente. Finalmente, ele assinou o contrato e, esperançosamente, não precisarei reescrevê-lo novamente.

Apenas fique claro, não estou atacando meu gerente ou algo assim. Ele é um cara legal e as coisas que ele estava solicitando não estavam fora deste mundo, eram apenas incompatíveis com o que eu havia feito anteriormente.

Só estou me perguntando se há algo que eu possa fazer no futuro para evitar reescritas completas. Entendo criar código flexível e estava tentando fazer isso, mas gostaria de saber sobre práticas ou coisas que eu poderia ter feito de maneira diferente para tornar isso mais fácil, para que, no futuro, não passe três dias em algo que deveria ter tomado 1.

SH7890
fonte
2
Qual paradigma de programação você está usando? Processual, orientado a objeto, funcional, outro?
Tulains Córdova
2
Para evitar reescritas - desacople o banco de dados e a camada do aplicativo. Não é um conceito simples de aplicar à forma como você escreve código. É um conceito complexo que torna seu código simples e adaptável.
StackOverFowl
6
Parece que os requisitos não estavam claros ou você os entendeu mal. Nenhum princípio ou prática recomendada pode salvá-lo de refazer um aplicativo inteiro se a implementação foi feita com base em suposições falsas. Antes de digitação para baixo um único LOC É bom pedir para os requisitos " E se ... " ... Não espere para o gerente surpreendendo-o com um novo e se ... . Passar algum tempo procurando as lacunas funcionais também reduzirá o fator de surto .
LAIV
3
Injeção de Dependência é seu amigo. Pesquise no Google e veja como aplicá-lo ao seu idioma / estrutura. Isso permitirá que você escreva um código muito mais modular, o que deve diminuir a quantidade de código que precisa ser reescrita quando os requisitos forem alterados.
Eternal21
2
Embora possa parecer que muitas reescritas sejam ruins, o que realmente importa é a rapidez com que você pode responder às solicitações de seus usuários finais. Embora dependa da complexidade do projeto, eu diria que 1 dia é um bom lead time - você deve estar fazendo algo certo! De fato, o software que vê mudanças significativas é um bom sinal - significa que é útil e está melhorando. O software que não é significativamente alterado há anos é muito mais difícil de manter.
27717 Justin

Respostas:

22

Como eu comentei, tenho uma forte sensação de que os requisitos não foram claros na primeira vez ou provavelmente você perdeu alguns detalhes importantes.

Nem tudo pode ser tratado com melhores códigos, práticas recomendadas, padrões de design ou princípios de POO. Nenhum deles impedirá que você refaça o aplicativo inteiro se a implementação for baseada em suposições falsas ou premissas erradas.

Não se apresse em codificar a solução. Antes de digitar um único LOC, dedique algum tempo a esclarecer os requisitos. Quanto mais fundo você aprofundar os requisitos, mais o que se questões aparecem. Não espere o gerente surpreendê-lo com o próximo caso . Antecipe as coisas você mesmo. Este pequeno exercício pode reduzir significativamente o fator surpresa .

Não tenha medo de perguntar quantas vezes precisar. Às vezes, as árvores (detalhes) não nos deixam ver a floresta (a imagem geral). E é a floresta que precisamos ver primeiro.

Quando os requisitos são claros, é mais fácil tomar melhores decisões durante a fase de design.

Finalmente, lembre-se de que a imagem geral é uma meta. O caminho para esse objetivo não é claro nem direto. As mudanças continuarão a acontecer, portanto, seja ágil.

Laiv
fonte
3
Este. Essa resposta é a melhor maneira de colocá-la. Obtenha esses requisitos antes de fazer absolutamente qualquer coisa.
Rhys Johns
1
Essa é uma boa resposta, mas sinto que há uma maneira melhor de estruturar o aplicativo para facilitar a acomodação dessas solicitações. Não acredito que nenhum dos chamados "princípios" flutuantes ajudaria; a solução deve ser específica para o problema. Sem mais informações, sua resposta é a única que faz sentido.
31817 Frank Hileman
Bem, tive a forte sensação de que o problema foi o que comentei porque foi exatamente o que aconteceu comigo nos meus primeiros dias como desenvolvedor. Traduzi instantaneamente frases para LOC ou módulos e, quando tive que mudar, algo foi bastante dramático para mim. Refatorar sobre refatorar todos os dias ou semanas. Nem mesmo fazendo o meu melhor com SoC, SPR, polimorfismo, ... Muitos dos conflitos que tive com mudanças foram causados ​​pelo vazamento da visão geral.
LAIV
2
Para aproveitar essa resposta: É importante também ser ágil quanto à coleta de requisitos. Às vezes, as pessoas recebem novas idéias ou lembram-se de algo que esqueceram ao ver o produto. Eles podem dizer: "Eu sei que pedi para você construir isso, mas não foi o que eu quis dizer" ou "Eu sei que pedi isso, mas agora que o vejo, quero outra coisa". Você pode impedir que isso cause frustração e retrabalho, criando uma "Prova de conceito" rápida e suja. Isso pode até ser uma maquete como um gráfico falso. Ajuda seu cliente a pensar.
Akhil
1
Alguns podem argumentar que abstrair o banco de dados do código não é obrigatório porque "os fornecedores de banco de dados raramente mudam". Concordo com você, mas o ponto da minha resposta é: ao reunir requisitos, esqueça que você é um desenvolvedor, concentre-se na coleta de requisitos. Pense como um gerente, pergunte como um gerente. Não se apresse em pensar como um desenvolvedor.
Laiv 16/07/19
4

Não há como saber isso com base no que você deu. É mais rápido e sujo, e é disso que você precisa naquele momento. Mas então alguém gostou e está ficando complexo, então agora você está começando a ver que muitos problemas não aparecem até que a complexidade se manifeste. Há tantas coisas diferentes que podem ser feitas que é simplesmente avassaladora.

Existe o velho "No Silver Bullet", e é verdade. Novamente, não há como saber o que fazer com as especificações completas (ou melhores especificações contínuas do Agile) e a capacidade de usar bons princípios de programação e bons projetos. Os programadores adoram reescrever uma e outra vez . Não estou dizendo que você se enquadra nisso necessariamente por causa disso, neste momento, é pequeno.

Use esta oportunidade para aplicar alguns princípios básicos. Você descobrirá que eles funcionam, mas então alguém dirá: "Oh, não, isso é ruim" ou você terá outra coisa que quiser. Você não pode fazer tudo com o dinheiro da empresa, mas se eles lhe derem tempo para explorar, use-o como uma oportunidade. Há sempre alguém, algum fundamento, alguma pessoa, que tem o "melhor" maneira ou de alguma forma "nova" de fazer as coisas.

johnny
fonte
Bom artigo que você vinculou.
SH7890
1
Bom artigo, de fato! Eu acho que não é o caso do OP, mas não poderia concordar mais com o autor.
LAIV
1
Eu não pensei que fosse um por um, mas parecia que poderia ser um dia. Espero que isso ajude o OP.
johnny
2

Seu gerente provavelmente estava certo em cada uma das etapas que você realizou. Não é porque ele é o gerente, mas porque ele está considerando os resultados, a usabilidade e provavelmente o número de transações anteriores com clientes ou solicitações de clientes.

A interface do usuário é difícil, geralmente, 5 pessoas têm 15 visualizações diferentes. E a estruturação e análise de dados e dados tendem a mudar e se multiplicar pelo fator 10 :). A interface do usuário é como moda, algumas combinações são legais, algumas são terríveis ou faltam ao bom senso.

Sem mencionar que, por exemplo, durante o processo LEAN, nada é imutável. Você está experimentando algo como avaliação iterativa e, durante cada etapa, é pouco melhor ou o caminho errado é evitado.

A resposta é tão simples que não existe reescrita.

ipavlu
fonte
2

O desenvolvimento iterativo (que é o que você fez basicamente, embora as iterações de um dia) geralmente é assim. As primeiras tentativas de soluções costumam ser errôneas e, ao obter feedback, o sistema converge para uma solução. Emprestarei a Figura 2.2 do material do instrutor de Craig Larman para o seu livro Aplicando UML e Design Patterns .

insira a descrição da imagem aqui

No início de um projeto, você aprende a conviver com as aparentes versões instáveis. Discordo das respostas que dizem "você precisa obter mais requisitos desde o início", porque esse é o pensamento do Waterfall. É verdade que você deve se esforçar para obter o máximo possível em termos de requisitos, mas por muitas razões, não é possível ter requisitos completos e precisos.

Isso não quer dizer que você não pode reduzir o quanto precisa reescrever depois de receber feedback. Uma coisa que costuma ser verdadeira é que é muito provável que a interação humano-computador do software mude, porque essa é uma parte difícil de acertar na primeira vez.

Pense no Microsoft Word e como seu formato de dados (.doc) não evoluiu muito ao longo dos anos. Isso ocorre porque um documento de texto como domínio de problema realmente não evoluiu muito (uma página ainda é uma página, um parágrafo ainda é um parágrafo etc.). No entanto, a interface do usuário do Word evoluiu muito (e continua a). O código da apresentação ou entrada tende a ser instável entre as versões; portanto, é melhor não ter as outras partes do sistema acopladas diretamente a elas (para isolá-las da reescrita).

As arquiteturas de software que podem separar a apresentação da lógica subjacente e os dados sobre o problema permitem menos reescrições. Muitos padrões de software, como a separação do Model-View, surgiram por causa de pessoas como você, que sofreram muitas reescritas e procuraram uma maneira melhor.

Isso pode parecer muito budista, mas você tem sorte de ter sofrido essas reescritas! Muitas pessoas aprendem sobre padrões MVC ou outros padrões de design sem "sofrer" os pesadelos de reescrita que os padrões devem evitar.

Fuhrmanator
fonte
Eu preferiria que essa resposta fosse aceita. A iteração para uma solução é melhor do que tentar configurar todos os requisitos antecipadamente. Especialmente se todo o aplicativo puder ser reescrito dentro de um dia.
Eufórico
Tenho certeza de que o chefe não sabia o que queria na segunda iteração até que a primeira estivesse concluída. “Reunir mais requisitos antecipadamente seria impossível.
precisa saber é o seguinte
1

Não tenho uma resposta, mas um exercício - que você provavelmente terá que fazer no seu próprio tempo, embora, dependendo da sua organização, você possa obter permissão para fazê-lo durante o horário de trabalho.

Redesenhe sua primeira solução para fazer exatamente o que fez, mas facilite a adição das 2ª, 2ª e 3ª etapas. Não adicione essas etapas, não as remova. Basta criar uma solução que atenda a todos os requisitos originais, mas possa ser facilmente atualizada para incluir o novo recurso. Faça o mesmo para a sua segunda solução.

jmoreno
fonte
1

Os requisitos mudam, isso é um fato da vida. Em retrospecto: a primeira solução poderia ter sido diferente para que o tempo total de programação fosse menor? É isso que você aprende a fazer com a experiência.

Essa é a primeira curva de aprendizado acentuada. Quando você gerencia isso, haverá o segundo desafio: como você lida com os requisitos alterados quando os usuários armazenam um ano de dados que eles não desejam jogar fora?

gnasher729
fonte
-1

A partir da sua história, é óbvio que os requisitos e as decisões arquiteturais preferidas não foram comunicados suficientemente bem. Portanto, um de vocês, ou talvez ambos, são maus comunicadores.

Pode ser o arquiteto também, já que alguns arquitetos conquistam o status alto por boas realizações ao programar sozinhos, ou por uma excelente educação (que também costuma ser estudada sozinha) ou por ser o primeiro desenvolvedor da empresa (obviamente sozinho) e não é necessário bom em comunicação com a equipe. Não é incomum que eles continuem se concentrando muito na programação, em vez de documentar projetos e apoiar a equipe.

No entanto, também neste caso, você pode tentar compensar conversando mais, fazendo perguntas e fazendo anotações. Você pode até escrever uma especificação pequena e pedir ao arquiteto que a aprove.

h22
fonte