O ciclo que você descreve é normal. A maneira de melhorar as coisas não é evitar esse ciclo, mas simplificá-lo. O primeiro passo é aceitar que:
- É quase impossível saber tudo no primeiro dia de um projeto.
- Mesmo que você saiba tudo de alguma forma, quando terminar o projeto, algo (os requisitos do cliente, o mercado em que está, a tecnologia com a qual você está trabalhando, os desejos dos clientes) terá mudado e produzido menos parte do que você sabia inválido ou incorreto.
Portanto, é impossível planejar tudo com antecedência, e mesmo que você pudesse, seguir esse plano levaria a criar algo imperfeito ou obsoleto. Sabendo disso, integramos as mudanças em nosso planejamento. Vejamos seus passos:
- Comece com alguns casos de uso
- Comece a codificar
- Perceba algumas coisas que não lidei bem e que não se encaixam bem na base de código atual.
- Reescreva a maior parte do código
Esse é realmente um ótimo ponto de partida. Aqui está como eu abordaria isso:
1. Comece com alguns casos de uso
Boa. Ao dizer "casos de uso", você está se concentrando no que o software é para . Ao dizer "alguns", você não está tentando descobrir tudo; você está mantendo uma quantidade gerenciável de trabalho. Tudo o que eu adicionaria aqui é priorizá-los. Com seu cliente ou usuário final, elabore a resposta para esta pergunta:
Qual é o software menor e mais simples que eu poderia fornecer para melhorar sua situação?
Este é o seu produto mínimo viável - qualquer coisa menor que isso não ajuda o usuário, mas qualquer coisa maior corre o risco de planejar muito cedo. Obtenha informações suficientes para criar isso e siga em frente. Lembre-se de que você não saberá tudo neste momento.
2. Comece a codificar.
Ótimo. Você começa a trabalhar o mais rápido possível. Até você escrever o código, seus clientes receberão zero benefício. Quanto mais tempo você gasta planejando, mais o cliente fica esperando sem retorno.
Aqui, eu adicionaria um lembrete para escrever um bom código. Lembre-se e siga os Princípios do SOLID , escreva testes de unidade decentes em torno de qualquer coisa frágil ou complexa, faça anotações sobre qualquer coisa que você provavelmente esqueça ou que possa causar problemas mais tarde. Você deseja estruturar seu código para que as alterações não causem problemas. Para fazer isso, toda vez que você decide criar algo dessa maneira, e não dessa maneira, estrutura seu código para que o mínimo de código possível seja afetado por essa decisão. Em geral, uma boa maneira de fazer isso é separar seu código:
- use componentes simples e discretos (dependendo do idioma e da situação, esse componente pode ser uma função, uma classe, uma montagem, um módulo, um serviço etc. etc. Você também pode ter um componente grande construído com componentes menores, como uma classe com muitas funções ou uma montagem com muitas classes.)
- cada componente faz um trabalho ou trabalhos relacionados a uma coisa
- mudanças na maneira como um componente faz seu funcionamento interno não deve fazer com que outros componentes precisem mudar
- componentes devem receber itens de que usam ou dependem, em vez de buscá - los ou criá- los
- componentes devem fornecer informações a outros componentes e pedir que eles façam o trabalho, em vez de buscar informações e fazer o trabalho por si mesmos
- componentes não devem acessar, usar ou depender do funcionamento interno de outros componentes - use apenas suas funções acessíveis ao público
Ao fazer isso, você está isolando os efeitos de uma alteração para que, na maioria dos casos, possa corrigir um problema em um só lugar, e o restante do seu código não perceba.
3. Problemas ou deficiências no projeto.
Isso vai acontecer. É inevitável. Aceite isso. Quando você encontrar um desses problemas, decida que tipo de problema é esse.
Alguns problemas são problemas no seu código ou design que dificultam o que o software deve fazer. Para esses problemas, você precisa voltar e alterar seu design para corrigir o problema.
Alguns problemas são causados por não ter informações suficientes ou por algo que você não pensava antes. Para esses problemas, é necessário voltar ao usuário ou cliente e perguntar como eles gostariam de resolver o problema. Quando você tiver a resposta, atualize seu design para lidar com isso.
Nos dois casos, você deve prestar atenção em quais partes do seu código tiveram que ser alteradas e, à medida que escreve mais código, deve pensar em quais partes devem ser alteradas no futuro. Isso torna mais fácil descobrir quais partes podem estar muito interligadas e quais partes precisam ser mais isoladas.
4. Reescreva parte do código
Depois de identificar como você precisa alterar o código, você pode fazer a alteração. Se você estruturou bem o seu código, isso normalmente envolverá a alteração de apenas um componente, mas em alguns casos, poderá incluir a adição de alguns componentes. Se você achar que precisa mudar muitas coisas em muitos lugares, pense no motivo disso. Você poderia adicionar um componente que mantém todo esse código dentro de si e, em seguida, ter todos esses locais apenas usando esse componente? Se você puder, faça isso e, da próxima vez que precisar alterar esse recurso, poderá fazê-lo em um só lugar.
5. Teste
Uma causa comum de problemas no software é não conhecer os requisitos suficientemente bem. Isso geralmente não é culpa dos desenvolvedores - muitas vezes, o usuário também não tem certeza do que precisa. A maneira mais fácil de resolver isso é reverter a questão. Em vez de perguntar "o que você precisa que o software faça?", Cada vez que você seguir essas etapas, dê ao usuário o que você criou até agora e pergunte a ele "Eu criei isso - ele faz o que você precisa?". Se eles disserem que sim, então você criou algo que resolve o problema deles e pode parar de trabalhar! Se eles recusarem, poderão dizer em termos mais específicos o que há de errado com o seu software, e você poderá melhorar essa coisa específica e voltar para obter mais comentários.
6. Aprenda
À medida que você passa por esse ciclo, preste atenção nos problemas que está encontrando e nas mudanças que está fazendo. Existem padrões? Você pode melhorar?
Alguns exemplos:
- Se você continuar ignorando o ponto de vista de um determinado usuário, poderá fazer com que esse usuário se envolva mais na fase de design?
- Se você continuar tendo que mudar as coisas para ser compatível com uma tecnologia, poderá criar algo para fazer a interface entre seu código e essa tecnologia, para ter apenas que mudar a interface?
- Se o usuário continuar mudando de idéia sobre palavras, cores, imagens ou outras coisas na interface do usuário, você poderá criar um componente que forneça ao restante do aplicativo aqueles para que eles estejam todos no mesmo local?
- Se você achar que muitas das alterações estão no mesmo componente, tem certeza de que o componente está aderindo a apenas um trabalho? Você poderia dividi-lo em alguns pedaços menores? Você pode alterar esse componente sem precisar tocar em outros?
Seja ágil
O que você está seguindo aqui é um estilo de trabalho conhecido como Agile. Agile não é uma metodologia, é uma família de metodologias que incorpora um monte de coisas (Scrum, XP, Kanban, para citar algumas), mas o que todos eles têm em comum é a ideia de que as coisas mudam e, como desenvolvedores de software, deve planejar se adaptar às mudanças em vez de evitá-las ou ignorá-las. Alguns de seus princípios básicos - em particular os que são relevantes para sua situação - são os seguintes:
- Não planeje com mais antecedência do que você pode prever com confiança
- Faça concessões para que as coisas mudem à medida que avança
- Em vez de criar algo grande de uma só vez, crie algo pequeno e aprimore-o gradualmente
- Mantenha o usuário final envolvido no processo e obtenha feedback rápido e regular
- Examine seu próprio trabalho e progresso e aprenda com seus erros