Como planejar o desenvolvimento de um software?

Se você é programador iniciante, ou um estudante procurando uma oportunidade, já deve ter pesquisado dicas de como melhorar suas habilidades com programação, o que deveria fazer, estudar, etc. Em cada um desses artigos ou vídeos, com certeza alguém disse "pratique", seja com exercícios propostos pelos cursos, caso tenha comprado ou iniciado algum, ou com projetos pessoais certo?

No caso de exercícios é mais simples encontrar, temos diversos sites com desafios envolvendo lógica de programação e você pode usar a linguagem que quiser, como o Letcode (é o que me lembro agora). Como dito, caso tenha comprado algum curso na Udemy ou Alura por exemplo, ou esteja acompanhando alguma série de vídeos no Youtube, tem os exercícios propostos.

Agora caso você pense em montar um projeto, seja para construir uma ideia inovadora e revolucionária que acabou de ter, ou qualquer outro projeto apenas para exercitar, como um ecommerce por exemplo, que não é uma ideia inovadora e já existem diversas plataformas que facilitariam o trabalho, mas é um excelente projeto para exercitar suas habilidades de programador, seja backend quanto frontend. Caso pense em seguir por esse caminho, já deve ter parado e se perguntado "tá, e por onde eu começo?".

Gostaria de escrever esse post oferecendo algumas dicas de como começar nesse processo, levantar as ideias, colocar no papel e mais importante, tirar do papel o projeto. Não sou nenhuma expert, mas recentemente me vi nesse "papel" de estruturar um projeto pessoal e tenho caminhado com ele. Levo como referência minha vivência como desenvolvedora de software, ainda que iniciante, mas que têm presenciado etapas parecidas dentro do trabalho. Normalmente numa empresa, sendo você dev backend ou front, você recebe tarefas para desenvolver, até participa da construção inicial da ideia (a passagem do upstream para o dowstream, quando a feature desejada é discutida em termos de negócio e depois desce para desenvolvimento, de fato), mas muitas vezes não estivemos no início quando a ideia do projeto saiu, e se estivemos ali, contamos com a ajuda de pessoas de diversas áreas, que foram responsáveis por levantar os requisitos e construir essa etapa que queremos realizar agora, para nós mesmos. 

Então vamos lá, irei listar as etapas que considero importante.

1. O que eu quero desenvolver?

É o mais básico de tudo, você precisa saber o que vai construir. Tem que ter uma ideia central, vai ser um ecommerce? Um site de aluguel de carro? Aluguel de locais para evento? Um sistema que ajuda administrar finanças pessoais? Defina o que quer fazer.

2. Objetivo e requisitos do projeto

Pronto, você já sabe o que deseja fazer, sabe o problema que o seu sistema vai resolver, qual a ideia central dele, agora é hora de refinar um pouco.

Existem algumas etapas básicas no desenvolvimento de software, como:

  • Levantamento de requisitos
  • Análise
  • Projeto (etapa onde a arquitetura é definida, desenhos são feitos, funcionalidades mapeadas)
  • Desenvolvimento
  • Teste
  • Implantação
  • Manutenção

Sabendo disso, vamos supor que você deseja fazer um ecommerce

Quais as funcionalidades de um ecommerce? Você quer permitir que o usuário entre na página inicial, visualize os produtos, clique em algum, visualize os detalhes desse produto, as cores disponíveis, tamanhos, leia a observação que diz qual tecido é aquela roupa, tabela de medidas, etc. Se a pessoa gostar de algo, ela pode colocar no carrinho e continuar olhando os demais produtos. Pode adicionar aos "favoritos" também, para não perder de vista. Quando terminou de olhar, ela pode ir até o carrinho, escolher o tipo de frete, escolher a forma de pagamento e comprar os produtos. Pode se cadastrar no site, fazer login, visualizar seus dados. Pode visualizar seus pedidos feitos.

Um usuário admin tem alguns privilégios, ele tem um botão que leva para um painel onde pode gerenciar os produtos que estão sendo exibidos, ou seja, cadastrar novos pedidos, atualizar a quantidade em estoque, excluir pedidos, cadastrar categorias e subcategorias novas, etc. Ele pode visualizar as compras realizadas, quem são os usuários cadastrados (apenas dados básicos do usuário), etc. 

Existem muitas outras funcionalidades, mas vamos parar nessas por enquanto. Nesse processo de mapear o que o usuário pode fazer ao entrar no site, levantamos algumas funcionalidades candidatas para o nosso ecommerce: 

Funcionalidades para o Cliente:

Navegação na Página Inicial:

  • Visualizar os produtos em destaque.
  • Navegar pelas categorias de produtos.
  • Pesquisar produtos por nome ou categoria.

Visualização de Produtos:

  • Ver detalhes do produto, como nome, preço e descrição.
  • Visualizar imagens do produto.
  • Verificar disponibilidade de cores, tamanhos e outras opções.
  • Ler informações adicionais, como composição do tecido e tabela de medidas.

Interatividade com Produtos:

  • Adicionar produtos ao carrinho de compras.
  • Adicionar produtos à lista de favoritos.
  • Visualizar o carrinho de compras e ajustar quantidades de produtos.

Finalização da Compra:

  • Escolher o tipo de frete e método de pagamento.
  • Preencher informações de entrega.
  • Revisar e confirmar o pedido.

Conta do Usuário:

  • Registrar uma nova conta.
  • Fazer login na conta existente.
  • Visualizar e editar informações do perfil.
  • Visualizar histórico de pedidos.

Funcionalidades para o Administrador:

Gerenciamento de Produtos:

  • Adicionar novos produtos ao catálogo.
  • Atualizar informações de produtos existentes.
  • Gerenciar estoque de produtos.
  • Criar e editar categorias e subcategorias de produtos.

Gerenciamento de Pedidos:

  • Visualizar e processar pedidos recebidos.
  • Gerar relatórios de vendas e análises de desempenho.

Gerenciamento de Usuários:

  • Visualizar informações básicas dos usuários cadastrados.
  • Ativar e desativar contas de usuário.
  • Monitorar atividades de usuários, como histórico de compras.

Configurações do Sistema:

  • Configurar opções de frete e pagamento.
  • Definir políticas de privacidade e termos de uso.
  • Personalizar a aparência e layout do site.

Bom, agora temos uma lista bem abrangente de funcionalidades dividida por "perfil" de usuário. Só com isso temos um pequeno veslumbre do que vamos desenvolver, por exemplo, controle de acesso, permissões para criar usuários comuns ou usuários administradores, etc. 

Essa é uma hora, no entanto, que bate um desespero com a quantidade de coisas que teremos para desenvolver. Para pouca mão de obra né? Normalmente é só a gente mesmo. Mas veja bem, agora entra o conceito de definição do MVP. 

MVP significa "mínimo produto viável", que é o mínimo que ele precisa para funcionar bem, atender ao proposito inicial, que no nosso caso é vender. Resumindo a história, no nosso exemplo de ecommerce, nós de cara poderiamos "eliminar" as funcionalidades de administrador. O nosso site sobreviveria se pudesse apenas exibir os produtos e possibilitar o cliente de fazer uma compra, com todo o processo incluso: visualizar os produtos, os detalhes dele, colocar no carrinho, escolher o frete, cadastrar os dados de entrega e pagamento, realizar a compra e posteriormente visualizar os pedidos realizados, para acompanhar os status. Esse é nosso MVP, as outras funcionalidades extras de administrador podem ficar para o momento posterior. Para cadastrar os produtos e categorias iniciais poderíamos salvar via banco ou disponibilizar endpoints para isso, sendo responsabilidade dos desenvolvedores no início fazer essa gestão. A ideia, é claro, é que o administrador (que depois poderia ser alguém que comprou o sistema ou o seu serviço) faça essa gestão com uma tela adequada, mas como dito, no momento essas funcionalidades não são essenciais. 

Nessa fase de levantamento de requisitos, é importante que você escreva todos esses passos em algum lugar, seja no papel ou utilizando algum software; eu utilizo e recomendo o Miro, que tem uma board onde você pode colocar imagens, post its, criar diagramas, fluxos e tudo mais. Então detalhe e escreva o máximo de informações possíveis, desenhe telas, mesmo que seja apenas um quadrado com alguns botões. É importante desenhar os fluxos, por exemplo, fluxo de visualização de pedidos, fluxo para incluir um item na lista de favoritos, para comprar um ou mais produtos, etc. Isso torna muito mais fácil a etapa onde você vai pegar essas funcionalidades e pensar nos componentes do seu sistema, os endpoints que vão ter e o que vai fazer cada um. 

3. Projeto

Com o MVP definido, é hora de olhar para a parte técnica. 

Aqui você fará a definição das tecnologias, qual a melhor linguagem, frameworks e bibliotecas que se adequam ao projeto, ou melhor, se adequam a quem vai desenvolver.

Além disso, é feito também a escolha da arquitetura do sistema. Isso varia desde um monolito, onde todas as funcionalidades do sistema são implementadas em uma mesma aplicação, até uma arquitetura de microsserviços, onde o sistema é divido em pequenos serviços independentes que se comunicam entre si por meio de APIs. Toda essa parte requer uma grande pesquisa, especialmente se você ainda não tem prática nesse tipo de assunto. É relevante pensar também na etapa de implantação, onde será realizado o deploy e todo custo envolvido. 

Outras considerações importantes incluem a escolha das ferramentas de desenvolvimento, controle de versão e integração contínua que serão utilizadas ao longo do processo de desenvolvimento. A definição de padrões de codificação, práticas de testes e diretrizes de documentação também são essenciais para garantir a consistência e a qualidade do código. 

Exemplo de desenho de arquitetura de software

Com os detalhes definidos, uma etapa que considero muito importante é a quebra das funcionalidades em "histórias". A prática de quebrar um projeto em histórias, conhecida como "storytelling" ou "story mapping", é comum em metodologias ágeis de desenvolvimento de software, como o Scrum e o Kanban. Nas empresas que adotam tais metodologias, nessa fase de planejamento inicial do projeto, a equipe de desenvolvimento trabalha em colaboração com os stakeholders para identificar e priorizar os requisitos do sistema. Esses requisitos são frequentemente expressos como "histórias de usuário" - breves descrições de uma funcionalidade desejada do ponto de vista do usuário final. 

Para um projeto pessoal, talvez não faça sentido seguir os rituais do scrum, mas talvez adotar a organização do Kanban, separando as tarefas em "To do" (fazer), "doind" (fazendo) e "done" (terminado). Para isso eu gosto de utilizar o Trello, embora existam diversas ferramentas de produtividade semelhante.

No Trello, você pode criar essas colunas básicas e até outras para organizar da forma que preferir, veja um exemplo:


Aqui eu tenho as colunas de backlog, refinamento de negócios, pronto para desenvolvimento, em andamento, fase de testes e concluído.

Agora vamos voltar um pouco e focar na criação dessas histórias, desses "cards". O que temos são tarefas a serem desenvolvidas, então, para o nosso exemplo do ecommerce, supomos que você definiu que embora monolito seja mais economico em um primeiro momento e até mais simples devido à quantidade de pessoas que vão desenvolver, você vai fazer um microsserviço, pensando que já possui um número considerável de clientes e precisa de um sistema mais robusto. Você desenhou o esquema de suas APIs, como vão se comunicar, sabe que vão utilizar o .NET 8, SQL Server e inclusive tem o desenho do banco de dados, contendo as tabelas e como elas vão se relacionar, embora optou pelo "Code first" onde vai gerar o banco através do código com as Migrations do Entity Framework. Você então criaria os seguintes cards:

Titulo: Criação da Api de usuários 

Descrição: Essa Api será responsável pela gestão de usuários

Tasks do card:

  1. Criar o projeto com .NET 8
  2. Criar a estrutura de pastas no padrão de Clean Architeture
  3. Criar repositório no Github
  4. Configurar o Docker
  5. Configurar a pipeline com Github Actions para criar/atualizar imagem no Dockerhub toda vez que fizer um pull para a main

E um outro exemplo de tarefa:

Titulo: Endpoint de busca de produtos [Api Ecommerce]

Descrição: Deve ser possível buscar todos os produtos cadastrados e suas respectivas categorias e subcategorias, com filtro de nome, cor, tamanho, categoria e subcategoria

Tasks do card:

  1. Criar endpoint
  2. Escrever testes unitários

E assim por diante. Quando estiver com todos os pontos do que você planejou cobertos, com cards criados compondo o seu backlog, você pode começar a puxar para desenvolver.

Reforço que é uma parte muito importante, e quanto mais detalhes você colocar, tanto nos cards quanto no Miro, ou qualquer outro local que organizou o projeto, será muito bem utilizado, pois principalmente se tratando de um projeto pessoal pode ser que você pare o desenvolvimento em alguns momentos, e quando voltar pode não se lembrar mais do que está fazendo, as decisões que tomou, em que pé está o projeto. 

4. Desenvolvimento

Essa é a melhor parte né? É só codar.

Claro que há algumas questões a se preocupar como as boas práticas no desenvolvimento, claro, padrões de codificação consistentes para garantir a legibilidade, manutenibilidade e qualidade do código. Também se preocupar com os testes unitários e de integração para validar o comportamento do código e garantir que faça o que tem que ser feito.

Uma coisa que pode acontecer é, no momento de desenvolver podem surgir muitos pontos que não foram levantados na etapa de planejamento, isso é normal. Uma dica que dou é atualizar os materiais detalhando novamente quais foram as mudanças ou inclusão de novas features, com o mesmo propósito de se lembrar posteriormente das decisões tomadas e facilitar também na elaboração da documentação do projeto. 

Após o desenvolvimento de cada feature deverá ser realizado testes, naturalmente. Assim como um teste geral quando tudo estiver "tomando forma", testando todos os fluxos antes e depois que o software for para produção.

5. Implantação

Essa é uma etapa importantíssima, pois agora com o projeto pronto (ou quase), você precisa disponibizá-lo para o cliente final, ou seja, colocá-lo em produção.

Nesse momento precisa preparar todo o ambiente para receber o software, incluindo configuração de servidores, banco de dados e outros recursos necessários. Pode-se buscar ferramentas de automação, como scripts de implantação ou pipelines de CI/CD (Integração Contínua / Entrega Contínua), para facilitar o processo de implantação e garantir consistência entre os ambientes.

É importante também a realização de testes de implantação para garantir que o software seja implantado corretamente e esteja funcionando conforme o esperado no ambiente de produção. Configuração de ferramentas de monitoramento para acompanhar o desempenho e a estabilidade do sistema após a implantação inicial.

Por fim, preparação de planos de contingência e procedimentos de rollback para lidar com possíveis problemas durante a implantação e minimizar o impacto nos usuários finais.

6. Manutenção

Com o projeto já em produção, não acaba por aí. Além de resolver qualquer problema que possa surgir nas etapas definitiva de testes, é preciso ter implementado um bom método de monitoramento, para identificar rapidamente qualquer problema que venha surgir, além de possibilitar que o usuário final reporte também qualquer dificuldade ou bug do sistema.

Pode levantar também agora as funcionalidades que ficaram de fora do MVP. Agora gradualmente podem ser desenvolvidas, já com a calma que merece.

Por fim, todo o trabalho realizado, desde o levantamento dos requisitos até o desenvolvimento e a manutenção do software, proporciona uma experiência extremamente valiosa na carreira, mesmo para aqueles que ingressam como desenvolvedores e podem não participar diretamente das etapas iniciais de definição do projeto, geralmente lideradas pelo time de produtos.

Essa jornada possibilita adquirir uma visão abrangente e crítica de todo o ciclo de vida de um software. Mesmo sem participar ativamente das fases iniciais, compreender como as decisões foram tomadas e como o projeto foi concebido oferece insights importantes para antecipar desafios e otimizar processos durante o desenvolvimento e a implantação.

Esse conhecimento é especialmente valorizado no mercado de trabalho, pois permite que os profissionais tenham uma compreensão mais profunda dos sistemas em que trabalham e sejam capazes de contribuir de maneira significativa para sua evolução e sucesso contínuo. Além disso, essa experiência enriquecedora possibilita desenvolver habilidades de resolução de problemas, pensamento crítico e colaboração eficaz em equipe, elementos essenciais para uma carreira sólida e bem-sucedida no campo da tecnologia.

Postar um comentário

0 Comentários