Meu colega de trabalho confirma e empurra sem testar


113

Quando meu colega de trabalho acha que não há necessidade de fazer um teste em seu PC, ele faz alterações, confirma e empurra. Em seguida, ele testa no servidor de produção e percebe que cometeu um erro. Isso acontece uma vez por semana. Agora vejo que ele fez 3 confirmações e empurra a implantação para o servidor de produção em 5 minutos.

Eu disse a ele algumas vezes que não é assim que o bom trabalho é feito. Eu não quero ser rude com ele novamente e ele está no mesmo status que eu na empresa e ele trabalhou mais do que eu aqui.

Quero que esse comportamento seja punido de alguma forma ou o torne desagradável, tanto quanto possível.

Antes de começar, a empresa estava implantando usando métodos antigos, como FTP, e não havia controle de versão.

Eu os forcei a usar Git, Bitbucket, Dploy.io e HipChat. A implantação não é automática, alguém precisa fazer login no dply.io e pressionar o botão de implantação.

Agora, como forçá-los a não testar no servidor de produção? Algo como o HipChat bot pode perceber que há edições repetidas na mesma linha e enviar um aviso ao programador.


1
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
World Engineer

5
Como você está no Git, use solicitações pull para impor revisões de código antes de mesclar no mestre e implantar na produção. Além disso, remova suas credenciais para efetuar login no servidor de implantação. Centralize essa autoridade em um não desenvolvedor. (Conformidade com o PCI aplicadas pela indústria de cartão de crédito exige isso, pela maneira.)
Barett

3
Do ponto de vista do local de trabalho, se você é um colega de trabalho com essa pessoa e não é, de alguma forma, seu supervisor, não é provável que ganhe força ao 'puni-la'. Concentre-se em manter a qualidade do código garantida, e não em retribuição pelos padrões negligentes de seu colega de trabalho.
Zibbobz

2
Um envio para o repositório "central" sempre aciona uma implantação de produção? Definitivamente não deveria.
jpmc26

3
Eu li a pergunta e disse a mim mesma que o cara devia ser turco e pronto : veja isso mano: nvie.com/posts/a-successful-git-branching-model . Você precisa ter pelo menos duas ramificações: master e dev, onde os desenvolvedores enviam apenas para dev e, após o teste, você mescla para dominar e implantar.
Cemre

Respostas:


92

Você precisa de um processo de garantia de qualidade (QA) adequado.

Em uma equipe profissional de desenvolvimento de software, você não passa do desenvolvimento para a produção. Você tem pelo menos três ambientes separados: desenvolvimento, preparo e produção.

Quando você acha que tem algo trabalhando em seu ambiente de desenvolvimento, você passa para a preparação primeiro, onde cada confirmação é testada pela equipe de controle de qualidade e, somente se esse teste for bem-sucedido, ele será enviado para produção. Idealmente, o desenvolvimento, teste e envio à produção são realizados por pessoas separadas. Isso pode ser garantido configurando o sistema de automação de construção de uma maneira que os desenvolvedores possam implantar apenas do desenvolvimento à preparação e que a equipe de controle de qualidade possa implantar apenas da preparação para a produção.

Quando você não consegue convencer a gerência a contratar alguém para fazer seu controle de qualidade, talvez um de vocês possa desempenhar esse papel pelo outro. Nunca trabalhei com o diploy.io, mas alguns sistemas de automação de construção podem ser configurados de maneira que um usuário possa implantar do desenvolvimento ao teste e do teste à produção, mas não faça os dois para a mesma construção, portanto, uma segunda pessoa está sempre necessário (mas verifique se você tem algumas pessoas de backup nos momentos em que um de vocês está ausente).

Outra opção é fazer com que sua equipe de suporte faça o controle de qualidade. Isso pode parecer um trabalho adicional para eles, mas também garante que eles estejam cientes de quaisquer alterações no aplicativo que possam garantir algum trabalho a longo prazo.


A idéia de Suporte na execução do controle de qualidade, onde envolve liberação para produção, parece conveniente, mas não ocorre por motivo de separação de função. O suporte a ser responsável pelo suporte além do final dos "testes dos programadores" deve torná-los cientes das mudanças. É realmente difícil para quatro desenvolvedores e mais ninguém :-) Se você alterar, você responderá para se aplicar diretamente à configuração do OP, será não vai ser muito útil para qualquer outra pessoa ...
Bill Woodger

1
@BillWoodger por que? Para eles, é um sistema de 'próximas mudanças e reversão'. Eles não apenas obtêm o benefício de ver o que está por vir antes que "se torne real", mas também uma maneira de reverter para a última versão facilmente se tudo der errado. Não esqueça que o ambiente de teste é o teste de final de programador.
Gbjbaanb

1
@gbjbaanb porque coloca o Suporte na mesma posição e reafirma o problema original. O suporte geralmente teria acesso de emergência à produção. Se eles também tiverem outro acesso, você terá problemas de auditoria (se isso for importante). Se alguém pode mudar alguma coisa, então há um problema. É claro que o suporte deve saber tudo, não deve ser capaz de fazer tudo. É o que todo auditor com quem já estive envolvido diz, e eles me convenceram disso há muito tempo.
Bill Woodger

@ BillWoodger Não sei ao certo o que você está dizendo. As equipes de produção que eu conheço geralmente têm seus próprios processos de implementação que incluem um ambiente de teste (apenas para verificar erros tolos primeiro). Em uma equipe pequena, não há razão para que esse sistema de teste não possa ser compartilhado pelo desenvolvedor e pelo suporte. De qualquer maneira, nenhuma alteração é permitida - é preenchida pelo dev via automação e consumida pelo suporte. Não é diferente dar a eles um zip do mesmo código. Auditores estão preocupados com os processos, não a implementação desses processos (exceto que eles são seguidos, é claro)
gbjbaanb

1
Os auditores da @gbjbaanb estão preocupados com as pessoas que têm acesso a tudo. Se um técnico de suporte puder alterar um programa em Desenvolvimento e colocá-lo em produção sem intervenção de mais ninguém, o sistema será exposto. Certamente, com as quatro pessoas do OP, não existe um "Suporte" separado, e uma divisão satisfatória de funções será complicada.
Bill Woodger

54

Você provavelmente desejará obter um servidor de desenvolvimento e, de preferência, um ambiente de teste também. Ninguém deve passar do local para a produção, exceto pelo site pessoal. Seu processo de implantação deve suportar apenas dev-> staging-> prod. Você provavelmente quer alguém responsável por assinar novos lançamentos - dependendo da organização, isso pode ser um líder de projeto, um controle de qualidade dedicado ou um dever que gira a cada semana (com um lembrete tangível, por exemplo, apenas a pessoa com o brinquedo macio da semana chega a empurrar). No entanto, converse com sua equipe primeiro para obter o buy-in (veja abaixo).

Quero que esse comportamento seja punido de alguma forma ou o torne desagradável, tanto quanto possível.

Você pode ter seu conjunto de testes (você tem um desses, certo?) Inclui uma verificação que determina se você está em um servidor de produção e, se houver, envia a todos no escritório um e-mail dizendo Looks like $username is testing on prod, watch out. Talvez envergonhar publicamente seu colega seria desagradável. Ou você pode criar restrições técnicas, como proibir IP sua equipe de ver prod (que você pode levantar, mas precisa justificar).

Eu não recomendo, porém, você pareceria o problema, não a pessoa que está testando o produto e você pode se tornar muito impopular com as pessoas da equipe que não se importam.

Certamente o que você realmente deseja não é que esse comportamento seja punido, mas que ele pare ?

Eu os forcei a usar [...]

É ótimo que você esteja advogando melhorias no fluxo de trabalho, mas parece que você não pensa muito em seus colegas e / ou não tem o apoio total deles. Isso provavelmente resultará em colegas interagindo de maneira meio aquecida com o fluxo de trabalho, fazendo o mínimo necessário para inserir código na produção e não seguindo realmente o espírito do fluxo de trabalho, o que significará mais tempo gasto na limpeza. E quando você gasta cada vez mais tempo limpando os resultados de uma interação inadequada com o fluxo de trabalho (porque ninguém mais se importa, certo?), Todos os outros questionam o próprio fluxo de trabalho.

Então comece com uma conversa.

Descubra por que isso está acontecendo (a máquina do seu colega não é tão boa para testes? O seu colega está incerto com ramificações de recursos ou preso em uma mentalidade svn em que commit e push são iguais?), Explique por que é um problema para você o código não testado em dev / staging / prod e veja se você pode fazer algo para mudar o porquê disso acontecer (é mais provável que seu colega faça o que você deseja se você acabou de tornar mais agradável testar localmente do que se você apenas os repreendeu).

Se você não conseguir resolvê-lo e isso realmente resultar em uma diferença de opinião, agende uma discussão em toda a equipe em sua próxima reunião retrospectiva, veja o que seus colegas fazem e pensam. Faça o seu caso, mas ouça o consenso. Talvez sua equipe afirme que não há problema em testar correções de texto localmente, e você só tem uma regra de que nenhum recurso importante é testado no desenvolvedor. Anote na reunião e leia o que você decide coletivamente sobre o que é permitido em cada um dos ambientes. Defina uma data em alguns meses para revisá-la, talvez em retrospectiva.


10
+1 para a conversa. É preciso haver um entendimento compartilhado de que isso é um problema e por que é um problema. Só então pode haver sucesso com uma solução técnica.
229 Patrick Patrick

9
+1 para obter ambientes de servidor / armazenamento temporário dev. Até que exista um lugar real fora da própria máquina para empurrar coisas, esse comportamento não é inteiramente culpa do colega de trabalho. Há muita coisa que uma pessoa pode fazer em sua própria máquina e, se nada mais, o ambiente extra geralmente ajuda com uma mudança no processo / atitude de pensamento nos testes.
Joel Coehoorn

20

No trabalho, evitamos isso usando o Gerrit . O Gerrit é um sistema de revisão de código que atua como uma porta para o seu ramo principal / de produção do Git, que é convencionalmente chamado de "mestre". Você tem análises de código, certo? Parece que você pessoalmente os faz excepcionalmente. Com o Gerrit, você avança para uma espécie de ramificação temporária que, após você e seu colega de trabalho executarem o processo de revisão de código de forma satisfatória, a Gerrit se funde com a ramificação principal. Você pode até conectar o Gerrit a um servidor de IC para executar testes de unidade antes que alguém receba um email para revisar uma alteração. Se você não possui um servidor, pode configurar uma ferramenta de IC, a Codeship possui um bom plano gratuito para usar como prova de conceito.

Por último, é claro, é automatizar as implantações de produção apenas a partir de produtos de construção sancionados que sobreviveram à revisão de código e ao teste de unidade. Existem algumas tecnologias interessantes surgindo para isso, as quais não mencionarei por medo de serem iscas de chama.

Vá ao seu chefe com uma solução. Este se aplica até a você e é uma maneira de melhorar a qualidade do código de todos, e não apenas punir seu colega de trabalho.


17

Eu vejo isso como um problema amplamente humano - o processo está lá e as ferramentas estão lá, mas o processo simplesmente não está sendo seguido.

Eu concordo com o que os outros disseram aqui, sobre a possibilidade de que o desenvolvedor em questão esteja apenas preso à mentalidade do SVN e possa pensar que ele está seguindo o processo.

Acho que a melhor maneira de lidar com esse tipo de problema, especialmente quando pode não haver um superior claro, não gira em torno da punição ou da remoção do acesso - isso apenas leva ao ressentimento e parece que você é o grande defensor de seguir o processo (sempre existe um, e eu já estive 'esse cara' antes), é você quem provavelmente aguenta mais calor. Ele gira em torno de levar as pessoas a concordar com o processo primeiro.

É aqui que reuniões estruturadas, como reuniões do tipo "lições aprendidas" após um grande incidente na produção, podem ser muito úteis. Tente fazer com que todos concordem, incluindo o desenvolvedor em questão, que a revisão do código, o teste de unidade, o teste abrangente etc. tudo precisa acontecer sempre (e você pode começar a apresentar aqui também a ideia de um ambiente de teste). Não deve ser difícil e é muito sensato. Depois, peça à equipe que elabore algumas regras sólidas, sobre como isso deve ser feito. Quanto mais o desenvolvedor que está causando o problema contribuir, mais eles sentirão vontade de seguir as regras e começarão a ver por que seu comportamento foi um problema.

O ponto final é nunca cair no "bem, é melhor do que costumava ser!" armadilha. Há sempre espaço para melhorias. É comum que, na minha experiência, as pessoas do setor de TI comecem a se contentar com o que têm, depois de algumas melhorias. O estabelecimento então continua, até que você de repente está em um ponto de crise novamente.


1
Realmente não estou claro como "confirmar / enviar, implantar na produção imediatamente e testar suas alterações lá e em nenhum outro lugar" é uma mentalidade de SVN ... A única parte desse processo que envolveria o SVN é a confirmação. Mesmo com um único modelo de filial ou controle de origem, uma confirmação não implica necessariamente uma implantação de produção. Ou pelo menos não deveria.
jpmc26

@ jpmc26: Correndo o risco de uma guerra de chamas no Git / SVN: herdamos um sistema SVN para grande parte do nosso código "legado", mas usamos o Git para nosso trabalho mais recente. Eu quase posso garantir que não tínhamos a configuração do SVN correta e / ou não a estávamos usando corretamente, mas o manuseio de ramificações do Git parece muito mais fácil de se trabalhar. Tenho 100% de certeza de que o SVN é mais do que capaz de lidar com a implantação adequada, mas também posso ver (pela minha experiência imperfeita) como o SVN pode "dissuadi-lo menos" de fazer a coisa certa. De qualquer forma, isso seria apenas um fator contributivo e a educação do usuário é mais importante.
TripeHound 14/07/2015

1
@TripeHound Nenhum argumento sobre o sistema git ser o melhor em geral para gerenciar as alterações de código. (Minhas objeções ao git geralmente têm a ver com a alta curva de aprendizado.) Meu argumento é mais que, embora o git possa ter mais recursos para ajudar no gerenciamento do seu processo de lançamento, a maneira como você configura sua infraestrutura de construção ainda é o principal fator para o seu escolha do controle de origem. Eu tive uma automação de compilação e lançamento bastante bem-sucedida entrando no SVN por algum tempo, por isso não estou muito claro sobre o que é uma "mentalidade SVN" ou como isso afeta negativamente o seu lançamento.
perfil completo de jpmc26

2
Só porque você está se comprometendo a dominar não significa que você deve implantar na produção. Mesmo que seu repo / svn repo de origem esteja hospedado no servidor prod, isso não implica isso.
vonPetrushev 15/07/2015

12

Isso não é incomum , principalmente em equipes pequenas. Não faça muita coisa a respeito, mas faça uma regra informal:

Quebrar a construção, trazer donuts.

1) Você receberá rosquinhas duas vezes por semana ou 2) elas seguirão o padrão.

Traga isso para uma reunião. Não é acusador, não mencione ninguém pelo nome, mas algo parecido com "Desde que introduzimos os padrões de controle de versão e implantação, as coisas se tornaram muito mais fáceis e o servidor ficou mais tempo do que costumava ser. Isso é ótimo! No entanto, ainda é tentador usar um atalho e enviá-lo sem testes adequados.É uma aposta e nosso servidor está em jogo.Eu sugiro que, a partir de agora, se algum de nós enviar código que quebre o servidor, a pessoa responsável entrará rosquinhas para a equipe no dia seguinte. "

Substitua outra coisa por rosquinhas, se desejado, e não a torne cara - o almoço para toda a equipe seria demais, mas uma caixa de US $ 5 de rosquinhas ou bandeja de frutas / legumes ou batatas fritas e salgadinhos, etc, etc. provavelmente seria irritante o suficiente para fazê-los realmente pesar o risco com a conveniência de pular os testes sem torná-lo um fardo que os afastaria da equipe ou empresa.


2
Isso funciona apenas com um escritório. Qual é o conceito equivalente para quando você tem uma equipe distribuída de desenvolvedores remotos que trabalham em casa?
Aroth

2
@aroth Para algumas equipes, basta um e-mail simples para toda a equipe da pessoa que interrompeu a compilação. Planeje-o como um "objetivo de melhoria contínua do processo" e peça que o e-mail contenha informações suficientes para que outras pessoas possam ver o que deu errado, por que deu errado e o que essa pessoa mudará em relação ao processo ou sobre o que estão sugerindo que a equipe mude. o processo, para impedir que isso aconteça novamente. A maioria das pessoas odeia relatórios e relatórios, e é novamente um aborrecimento suficiente que eles possam ter mais cuidado para não interromper a construção no futuro.
Adam Davis

8

Agora, como posso forçá-los ...

Em vez de forçar seus colegas, tente fazê-los ver as coisas da sua perspectiva. Isso tornará as coisas muito mais fáceis para todos. O que me leva a ...

Quero que esse comportamento seja punido de alguma forma ou o torne desagradável, tanto quanto possível.

Por que é uma dor para você com problemas no servidor ativo, mas não para esse cara? Você sabe algo que ele não sabe? O que você pode fazer para fazê-lo ver as coisas do jeito que você vê?

Se você conseguir isso, você trará o melhor dele e ele encontrará soluções para o problema que você nunca imaginou.

Em geral, tente trabalhar em conjunto com as pessoas para resolver problemas, em vez de forçá-las a processos que não compreendem.


6

Qual é o pior que poderia acontecer? Você tem backups suficientemente bons para que um bug que modifique registros aleatórios no seu banco de dados possa ser corrigido restaurando uma versão antiga?

Digamos que você tenha um bug no qual usa um ID de registro e, por engano, o valor de uma conta em centavos é armazenado em uma variável usada para o ID de registro. Portanto, se eu pagar $ 12,34, o registro com o ID 1234 será modificado. Você pode se recuperar disso, se o software for executado por algumas horas até que o bug seja detectado? (Se o registro correto e o registro 1234 forem atualizados, você o detectará apenas quando o registro 1234 for usado, para que isso possa não ser detectado por um bom tempo).

Agora pergunte ao seu desenvolvedor altamente motivado o que ele pensa sobre isso. Obviamente, ele não pode afirmar que nunca comete erros, porque o fez no passado.


"Você tem backups suficientemente bons" - e, mesmo assim, seu colega quer ser o muggins que precisa restaurar o backup porque ele quebrou o servidor? Talvez ele gosta , em princípio, para testar antes de implantar, mas já que não há ambiente de teste ele está tomando o mais fácil opção atualmente disponível. Em seguida, defender o servidor de teste deve ser fácil. Aliás, os bugs que não forem detectados "por um bom tempo" passarão pelo teste de implantação, pois o problema desses bugs é a qualidade dos testes, e não onde os testes são realizados.
18710 Steve

Você não apenas possui os backups, mas também sua empresa pode pagar o tempo de inatividade enquanto uma restauração é feita? E pode se dar ao luxo de perder minutos, horas ou mesmo dias de informações porque uma reversão do banco de dados teve que ser realizada? Eu diria que em quase todos os casos não triviais, a resposta é um retumbante "não". E mesmo em casos triviais, você não deseja que 'restaurar um backup' seja como lida com o código não testado sendo verificado. Deve haver algo que garanta que os testes ocorram entre quando o código é registrado e quando chega à produção.
Aroth

Totalmente de acordo, foi por isso que eu disse "pergunte ao seu desenvolvedor o que ele pensa sobre isso". Ele é totalmente iludido e acredita que seu código está livre de bugs, ou ele não percebe o dano que pode causar. Ou terceira possibilidade, ele sabe e não se importa.
gnasher729

3

Você entende claramente várias soluções técnicas e processos possíveis. A questão é como gerenciar o colega de trabalho.

Este é essencialmente um exercício de gerenciamento de mudanças.

Em primeiro lugar, gostaria de conversar com o fundador para ter certeza de que ele / ela está de acordo com o seu ponto de vista. Se houver uma queda de produção, eu esperaria que o fundador se preocupasse muito com isso e desejasse mudanças.

Em segundo lugar, você trabalha em uma equipe pequena e provavelmente vale a pena tentar envolver toda a equipe na melhoria do processo.

Configure retrospectivas de processo regulares (por exemplo, semanalmente). Tenha toda a equipe:

  • Identifique problemas
  • Ideias voluntárias para melhorar as práticas de trabalho
  • Envolver-se na implementação dessas práticas

Deve seguir naturalmente que toda a equipe também ajuda a garantir a conformidade com as práticas aprimoradas.


Uma retrospectiva é uma ótima maneira de abordar e, com sorte, mudar esse comportamento de maneira construtiva!
greenSocksRock

1

Acho que você identificou alguns problemas:

  1. Parece que qualquer código verificado pode ser enviado trivialmente à produção por qualquer pessoa que tenha o direito de fazer o check-in.

Francamente, acho que essa configuração é simplesmente insana. No mínimo as pessoas que podem desencadear manualmente um impulso à produção deve ser restrito ao conjunto de pessoas que pode confiar completamente para rever cuidadosamente e testar todas as alterações de saída (independentemente de quem foi o autor das mudanças) antes de acionar o impulso. Conceder a alguém com permissão para verificar o código o poder de também arbitrariamente acionar um empurrão para a produção é apenas pedir problemas. Não apenas de desenvolvedores descuidados e / ou incompetentes, mas também de insatisfeitos ou de terceiros maliciosos que comprometem uma de suas contas.

E se você usar um processo de botão de pressão para implantar todas as alterações que receberem check-in, precisará de um conjunto abrangente de testes automatizados e pressionar o botão precisará executá-los (e abortar a implantação se qualquer teste falha!). Seu processo não deve permitir que o código que ainda não tenha sido testado superficialmente chegue ao ponto em que está sendo implantado no sistema de produção.

Seu colega de trabalho cometeu um grande erro em termos de verificação de código sem testá-lo primeiro. Sua organização cometeu um erro muito maior ao adotar um processo de implantação que permite que o código não testado alcance a produção em qualquer circunstância.

Portanto, a primeira ordem dos negócios é corrigir o processo de implantação. Limite quem pode acionar um empurrão para a produção ou incorpore uma quantidade razoável de testes ao processo de implantação automatizada, ou ambos.

  1. Parece que você pode não ter definido padrões / princípios de desenvolvimento claramente definidos.

Em particular, parece que você está perdendo uma " definição de feito " clara e / ou usando uma que não inclua "o código foi testado" como um fator determinante na verificação do código / implantação do código na produção. Se você tivesse isso, em vez de apenas indicar que "um bom código não é produzido dessa maneira", você poderia dizer "esse código não está cumprindo os padrões mínimos com os quais todos concordamos e precisa ser melhor no futuro".

Você deve tentar estabelecer uma cultura que comunique claramente o que é esperado dos desenvolvedores e os padrões e o nível de qualidade que eles devem manter. A definição de uma definição de feito que inclua pelo menos testes manuais (ou preferencialmente, casos de teste automatizados que podem ser executados como parte do processo de compilação / implantação) ajudará nisso. Como pode ter consequências para quebrar a compilação. Ou consequências mais graves para a quebra do sistema de produção. Observe que essas duas coisas devem ser realmente independentes e deve ser completamente impossível interromper a compilação e o sistema de produção simultaneamente (porque as compilações quebradas nunca devem ser implementáveis).


0

Você deve integrar um processo de Integração Contínua + Revisão por Pares na empresa. Bitbucket torna mais fácil.

E +1 no servidor de desenvolvimento sugerido por outros usuários.

Não seja rude com ele, isso só vai prejudicar sua relação de trabalho.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.