Use um sistema de controle de versão distribuído como o git e use sua máquina de pastas compartilhadas para armazenar o repositório de referência. Aqui está o porquê:
Cada clone é um backup
Se o disco rígido do servidor travar, todos terão uma cópia, pronta para ser implantada em uma nova unidade ou servidor. Como sua empresa não leva a sério o controle de versão, suponho que possa ser praticamente o mesmo com os backups.
Referência comum
Ter um repositório principal com uma ramificação principal permite conhecer a versão que tem a última palavra. Isso resolve o "Você testou suas alterações em relação à versão de Franck, mas você também tinha as de John? E como as fundiu?".
Entregue com mais conforto
O cliente quer uma versão alfa hoje? Bem, você pode testar se o mestre é estável o suficiente e enviá-lo. Se não estiver, e você não tiver tempo para corrigi-lo, volte no tempo e obtenha uma versão mais antiga, mas mais estável. Você não pode fazer isso se tiver apenas a versão mais recente.
Volte no tempo e corrija seus erros
Sua mesclagem manual teve problemas que você só viu depois de alguns dias, mas você já substituiu o conteúdo de suas pastas compartilhadas? Sem um CVR, você não tem histórico, portanto não pode voltar facilmente a um ponto em que pode verificar os erros que cometeu e corrigi-los. O código não é como uma imagem, é como um filme: evolui com o tempo. Você pode extrair uma imagem de um filme. Você não pode extrair um filme de uma imagem.
Localize erros mais facilmente
Um bug apareceu, mas você realmente não percebeu no momento em que foi apresentado, portanto não foi possível corrigi-lo enquanto o código estava "quente". Agora você realmente não sabe qual alteração a introduziu, portanto ela pode vir de vários locais diferentes no código. Levará horas apenas para descobrir onde procurar. Com o git, você poderia apenas desenvolver um teste para dizer se o bug ocorre em uma versão específica e usar git bissect
para encontrar o commit exato que introduziu o bug. Em vez de procurar milhares de linhas de código, agora você sabe que ele está localizado nessa alteração de 10 linhas e pode manter o teste em seu conjunto de testes para garantir que o bug não seja introduzido novamente.
Cada desenvolvedor é responsável por seu próprio trabalho
Se você é o líder da equipe e não possui VC, provavelmente terá que fazer o trabalho sujo, as fusões. Se você fizer isso sozinho, provavelmente não saberá tudo sobre todas as alterações e poderá introduzir erros. Pelo contrário, se você sempre pedir às pessoas que escreveram o código que se reúnam sempre que houver código a ser mesclado, é hora de elas não usarem para produzir um novo código.
Com um VCS, em um fluxo de trabalho simples, o desenvolvedor precisa apenas cuidar de seu trabalho e de uma fonte externa de mudanças: a ramificação principal. Pode haver 1 ou 100 pessoas se comprometendo no ramo mestre, é o mesmo. Para poder promover suas alterações, ele / ela precisará adaptá-las às últimas alterações feitas por outras pessoas. Pode parecer que leva mais tempo para enviar código, mas isso é porque você também está fazendo a mesclagem que levaria tempo de qualquer maneira.
A diferença é que a mesclagem é feita pela pessoa que fez as alterações, que conhece melhor o código porque ele o escreveu.
Quem escreveu esse código?
Há esse bug aqui, mas quem escreveu essa linha de código específica? É difícil lembrar, principalmente se o projeto durar vários meses. git blame
teria lhe dito quem e quando essa linha foi escrita, para que você possa perguntar à pessoa certa, e não há "não me lembro de escrever isso".
O projeto está ficando maior
O cliente deseja mais recursos e você é uma equipe pequena demais, precisará de outro desenvolvedor. Como você gerencia a maior complexidade de mesclagem sem um VSC?
Mudanças urgentes
O cliente ligou e solicitou uma correção crítica de bug para a produção, mas você estava trabalhando em um novo recurso. Apenas git stash
para deixar suas alterações de lado, ou enviá-las para uma nova ramificação e enviá-las, você estará pronto para começar a trabalhar com a correção urgente, sem medo de perder seu trabalho pendente.
Funcionou 10 minutos atrás
Você está fazendo algumas alterações localmente e algo que funcionou 10 minutos atrás parou de funcionar. Sem um VCS, você olha fixamente para o código ou, na melhor das hipóteses, faz uma cópia da versão de referência e difere para ver o que muda. Ah, espere, a referência mudou desde que comecei a trabalhar, então não posso mais diferenciar. E não pensei em manter uma cópia original do código em que baseei minhas alterações.
Com um VCS, você simplesmente faz algo como git diff
imediatamente e altera as alterações em comparação com a versão correta do código em que se baseia.
Eu tenho que manter meus logs de depuração
Então você é um cara mau e não usa log? Você teve que borrifar printf
s em toda a sua base de código até encontrar todas as partes daquele bug desagradável? Agora você encontrou um, corrigiu-o, mas deseja manter seu código de depuração cuidadosamente criado para corrigir os problemas restantes.
Sem um VCS, você precisa copiar os arquivos, expurgar o código de depuração (que pode adicionar alguns erros de edição), enviar por push e colocar de volta os arquivos de backup. Ah, mas parece que algum código de depuração chegou de qualquer maneira.
Com o git, você apenas git add --patch
seleciona as poucas linhas de código que deseja colocar no seu commit e pode confirmar apenas isso. Então você retoma seu trabalho e ainda possui seu código de depuração. Você não precisou tocar no código; portanto, não há erro de copiar / colar.
A grande bola de lama
Sem um VCS, as pessoas trabalham do lado deles e oferecem várias alterações, às vezes não relacionadas. Quando há muito código para verificar, é difícil encontrar um bug.
Um VCS permitirá que você faça pequenas alterações incrementais, além de fornecer um registro de alterações. O registro de alterações é essencial: as pessoas devem dizer por que estão fazendo a alteração, não o que é a alteração (a pergunta que já está respondida pela própria alteração de código). Isso significa que, ao inspecionar algum código de um novo recurso, por exemplo, você não precisará ler muitas alterações mistas não relacionadas, como correções de erros não relacionadas. Isso ajuda a focar no código de seu interesse.
Se eu der 100 batatas 1 por 1 e uma estiver podre, você a encontrará imediatamente. Agora, se eu jogar 100 batatas na sua frente e pedir que você encontre a podre, essa não é a mesma tarefa.
Indentação
Espero que você tenha uma boa política de estilo de codificação, caso contrário, as mudanças de recuo o deixarão louco se você mesclar manualmente. Claro, você pode ignorar o espaço em branco nas alterações (mas não nos idiomas quando a indentação conta, como Python). Mas você terá um código de aparência estranha difícil de ler.
Você é o líder do projeto
Se você é o líder, isso significa que você será culpado se as coisas não funcionarem. Se você não se sentir confortável com a situação porque seu chefe ainda não consegue entender que vale a pena usar a ferramenta certa para o trabalho certo, então, pelo menos, eu me recusaria a me tornar o líder de uma falha previsível.