Agile
Eu sugeriria o seguinte:
Editando os mesmos arquivos
Primeiro, use o Git (ou um sistema de versão simultâneo semelhante). Enquanto estiver editando partes diferentes dos mesmos arquivos, você não terá conflitos. Se você tiver conflitos, eles serão claramente marcados como tal.
Tentar gerenciar um projeto multi-desenvolvedor sem o Git é como tentar fazer um pudim sem uma tigela de pudim. É possível, mas vai ficar bem bagunçado e rápido.
Como foi apontado nos comentários, o Git não é uma panacéia, mas combinado com testes automatizados certamente ajuda bastante.
Listar todos os recursos
Segundo, divida o projeto em recursos visíveis para o usuário. Por exemplo "quando o usuário se inscrever, ele receberá um email" ou "O usuário pode adicionar um item". Envolva todas as partes interessadas aqui. Coloque todos em uma sala e peça que todos gritem seus recursos.
Esses devem ser recursos visíveis ao usuário. Você pode falar sobre a estratégia de implementação posteriormente.
Escreva todas as sugestões em fichas, mesmo as idiotas. Racionalize rapidamente a lista para remover duplicatas e coloque todas as cartas em uma mesa grande ou até no chão.
Adicione quaisquer cartões adicionais necessários. Digamos que seu aplicativo envie alertas de texto por SMS. Você pode não saber como fazer isso, então você tem uma pergunta. Escreva "Investigar portais de SMS" em um cartão. Da mesma forma para outras grandes incógnitas. Você precisará desempacotá-los mais tarde. Esses recursos provavelmente não entrarão no seu primeiro sprint.
Agora, organize suas cartas em grupos, embaralhe-as, sinta-as para eles. Esse é o escopo do seu projeto.
Planejando poker
Tente planejar o poker. Ainda com todos juntos, dê a todos os cartões de desenvolvedores que digam "1 ponto", "2 pontos", etc., até "4 pontos". Também um cartão "mais". Um ponto é aproximadamente equivalente a uma hora.
Percorra a lista de recursos, um por um. Enquanto você lê um recurso, todos precisam jogar um cartão. Se uma pessoa joga 1, e outra pessoa joga 4, há um problema de comunicação lá. Uma pessoa entende que o recurso significa algo diferente da outra pessoa. Converse e descubra o que realmente significava e anote-o no cartão.
Se você concorda que um recurso é "mais", esse recurso é muito grande. Você precisa quebrar esse recurso. Faça isso da mesma maneira que antes.
Conforme você concorda, escreva os números nos cartões em uma caneta de cor diferente.
Pontos são melhores que horas
O uso de pontos em vez de horas tira a coisa de "olha o quão rápido eu posso codificar" que os desenvolvedores costumam fazer. É uma diferença sutil, mas achei que funciona muito bem.
Agora componha um sprint
Um sprint é uma rápida explosão em direção a uma meta. Decida a duração do sprint, talvez 5 ou 10 dias. Multiplique o número de dias pelo número de desenvolvedores pelo número de pontos por dia.
Suponha 6 pontos por dia por desenvolvedor inicialmente. Este é um número alcançável. Se você tem 5 pessoas, são 5 * 5 * 6 = 150 pontos. Em conjunto com todos os desenvolvedores e o gerenciamento, escolha os recursos da lista, até 150 pontos. Esse é o seu sprint.
Nunca fique tentado a espremer mais do que o necessário. Prometer demais magoa todo mundo a longo prazo, inclusive você.
Você precisará levar em conta as dependências aqui. Por exemplo, a configuração do ambiente obviamente precisa ser incluída no primeiro sprint. Isso é relativamente fácil de fazer quando todos estão presentes. Você tem 6 cérebros na sala, todos dizendo "isso depende disso", etc. Você pode então embaralhar as cartas para demonstrar dependências.
Depois de ter seu sprint, nada pode ser adicionado a ele, ele fica bloqueado pelos 5 dias. A fluência dos recursos estressará a equipe, prejudicará o moral e diminuirá a velocidade de todos. Eventualmente, a fluência interromperá um projeto. Como líder de equipe, você deve proteger sua equipe contra a falta de recursos. Se uma nova solicitação de recurso chegar, ela deverá ser adicionada ao próximo sprint. Se o próximo sprint já estiver cheio, outra coisa deve ser retirada.
Nunca fique tentado a espremer extras. Prometer demais oferece a você cerca de 1 dia de cliente feliz, seguido por 4 dias de estresse da equipe e, eventualmente, provavelmente, vários clientes insatisfeitos quando a equipe não pode entregar a tempo.
Agora vá para ele.
Distribua cartões, pergunte quem quer fazer o que. Você tem total visibilidade do que está sendo feito e pode contar os pontos marcando até zero. Tenha um stand-up no início de cada dia para que todos saibam quem está trabalhando no quê e no que foi feito.
5 ou 6 desenvolvedores motivados decentes, trabalhando juntos como uma unidade em objetivos gerenciáveis claramente definidos, podem obter uma quantidade bastante grande de coisas em um sprint de 5 dias.
Manter a visibilidade
Certifique-se de que todos possam ver qual é o status do projeto. Pegue o Bluetack em todos os cartões na parede. À esquerda, existem cartões que ainda não foram trabalhados. À direita são feitos cartões.
Quando um desenvolvedor está trabalhando em um cartão, ele o retira da parede e o coloca em sua mesa. Isso mantém a visibilidade e evita que as pessoas pisem demais.
Existem alternativas tecnológicas para cartões de índice, mas nada supera ter uma enorme exibição em papel do status do projeto na parede.
Se possível, tenha todos na mesma sala durante o projeto. Tenha as partes interessadas o máximo possível, idealmente todos os dias.
Queimar
Você pode representar graficamente seus pontos progredindo para zero em um gráfico de burndown. Se sua linha de melhor ajuste ultrapassar zero antes de você atingir seu limite de tempo, você provavelmente estará no caminho certo. Caso contrário, talvez você precise informar seu cliente agora, antes de chegar muito perto do prazo.
Se você falhar, falhe cedo.
Você pode fazer um burndown usando software, mas eu prefiro apenas um grande pedaço de papel na parede. Desenhe e escreva por todo o lado.
Teste automatizado
Quando você tem vários desenvolvedores trabalhando nas mesmas coisas ao mesmo tempo, eles provavelmente quebram o código um do outro de tempos em tempos. A comunicação e a visibilidade ajudam nisso, mas é provável que você queira introduzir alguma tecnologia para ajudar a encontrar problemas.
Teste de unidade é o processo de escrever testes para cada parte individual da sua base de código (idealmente cada método). Seus testes de unidade devem ser executados frequentemente, com todas as salvagens, se possível. Existem muitas ferramentas que podem ajudar nisso, por exemplo, Karma ou Rspec.
O teste de ponta a ponta envolve testar seu projeto como um todo, tratando os internos como uma caixa preta. Baseie esses testes em seus requisitos comerciais de alto nível, por exemplo: "O usuário pode se inscrever" ou "O usuário pode ver uma lista de itens". O transferidor é um bom exemplo de uma estrutura de testes de ponta a ponta baseada na Web.
Existem livros inteiros escritos sobre testes, mas ter pelo menos alguns testes de aceitação pode ajudar a garantir que nada seja quebrado à medida que você trabalha no seu projeto.
Evitar dívidas técnicas e concluir o trabalho
Dívida técnica é um conceito que descreve coisas que terão que ser limpas posteriormente. Uma fonte comum de dívida são os recursos que foram marcados como concluídos, mas que nunca foram "concluídos". Um recurso concluído está registrado no Git, foi aprovado pela parte interessada e tem um teste.
Não marque seus recursos até que estejam prontos. Nunca massageie o gráfico. Novamente, isso machuca a todos no longo prazo, inclusive você.
Essa é uma das razões pelas quais inicialmente citamos apenas 6 pontos por desenvolvedor, por dia. Feito, é preciso um trabalho extra, mas é ótimo e dá um impulso à equipe.