No final da minha corda [fechada]

17

Sou contratado de uma grande empresa. Atualmente, existem três desenvolvedores no projeto, inclusive eu.

O problema é que os outros 2 desenvolvedores realmente não entendem. Com "it" quero dizer o seguinte:

  • Eles não entendem as melhores práticas para a tecnologia que estamos usando. Após 6 meses de mim e de outros dando exemplos, há terríveis anti-padrões sendo usados.
  • Eles são programadores de "copiar e colar" que produzem principalmente código de espaguete.
  • Eles constantemente quebram as coisas, implementando mudanças, mas não realizando um teste básico de fumaça para ver se tudo está bem
  • Eles se recusam / raramente pedem revisões de código.
  • Eles recusam / raramente fazem coisas básicas como formatar código.
  • Nenhuma documentação em nenhuma classe (jsdocs)
  • Com medo de excluir código que não faz nada
  • Deixe os blocos de código comentados em todos os lugares, embora tenhamos controle de versão.

Sinto-me cada vez mais frustrado ao formatar o código de outros, corrigir bugs, descobrir funcionalidades que estão quebradas e criar abstrações para remover o espaguete.

Eu realmente não sei o que fazer. Eu tento não ficar frustrado, mas é apenas uma bagunça. Eu gosto dessas pessoas como pessoas, mas sinto que a situação da codificação é tão ruim que eu poderia me mover mais rápido se elas simplesmente navegassem na Web o dia todo.

Estaria fora de linha pedir ao nosso gerente para revisar os outros svn commit access; confirmações só podem ser feitas após uma revisão por alguém com conhecimento do que estamos fazendo? Como contratado, não tenho certeza se essa é a melhor jogada.

Existe uma maneira sutil / não tão sutil de deixar claro quantas coisas estou consertando?

hvgotcodes
fonte
1
Abri uma pergunta em resposta a esta, que acho que generaliza o problema real que sua equipe está enfrentando: programmers.stackexchange.com/questions/127117/… . Quanto à introdução de testes automatizados, concordo plenamente com o post de Martin Blore: martinblore.wordpress.com/2010/06/02/… - sem bons princípios e bases, o esforço do TDD será muito desperdiçado. Tentei me concentrar nessa base no meu post, pois também estou curioso.
DXM
o problema que tenho é que os testes apenas verificam se a funcionalidade está funcionando. Eles não abordam os outros 7 itens que listei.
hvgotcodes
1
você já tentou programar em pares com esses caras? eles veriam o seu ponto e você o deles se sentasse em uma única máquina e desenvolvesse uma única funcionalidade. Faça isso por um mês, 3 dias por semana, 3 horas por dia. Isso pode ajudar. Estabeleça também o IC e publique a cobertura do código e as métricas da taxa de aprovação de casos de teste. Deixe a construção falhar se algum deles for violado.

Respostas:

7

Estou tendo algo assim na minha equipe. Eu tentei fazer com que as pessoas fizessem a coisa certa e não funcionou como esperado, então mudei para uma solução diferente.

Primeiro, fui ao meu gerente e fizemos um acordo, nenhum código entra no controle de origem, a menos que seja coberto por testes de unidade. Se o código entrar sem testes de unidade, tenho poder de veto para desfazer o commit imediatamente e executar ping em quem foi responsável por ele, pode trabalhar nos testes e depois enviar o código por push.

Com essa regra, eu regularmente executo ferramentas de cobertura de código (nesse caso, jacoco em nossa compilação sbt ) para garantir que as peças sejam cobertas corretamente e também refatorando e revisando constantemente os códigos de qualquer código enviado por eles. Como este é um projeto Java e Scala , tenho muitas ferramentas para me ajudar a capturar coisas que não deveriam estar lá ou que não funcionam da maneira que pensamos, não sei como você pode fazer o mesmo com JavaScript, mas talvez exista uma solução.

A principal coisa que acredito estar me ajudando a acompanhar isso é que tenho uma visão clara do que espero do projeto e da arquitetura principal; portanto, sempre que vir algo que não reflete essa visão, posso ir lá e consertá-lo. Você deve fazer o mesmo, definir sua visão, os padrões que devem ser usados, a maneira como o código deve ser escrito e manter-se por dentro disso, sempre informando a eles (e a sua gerência) o que está acontecendo e o que impede o andamento do projeto. Mais rápido.

Certamente haverá um momento em que eles desistirão e farão a coisa certa ou a gerência receberá a mensagem e os removerá do projeto.

Maurício Linhares
fonte
5
o problema aqui (e não tenho certeza se essa pergunta é muito localizada porque a causa subjacente é muito comum) é como inspirar os desenvolvedores a aprender e crescer em vez de confiar nas práticas de cópia "verdadeiras e testadas" / colando e continuando fazendo coisas de espaguete. Se o OP passar para a função de supervisor / revisor / aprovador, isso reduzirá significativamente seu tempo. Ao mesmo tempo, as pessoas que escrevem códigos incorretos escrevem testes de unidade ainda piores. Eles vão ainda mais devagar, escrevem testes não mantidos e depois apontam que o teste de unidade não funciona e o culpam por sugeri-lo.
DXM
dxm, sim, isso é um problema. O ponto da minha pergunta é como levar esse problema à gerência, embora eu admita que provavelmente não tenha sido muito claro.
hvgotcodes
2
Penso que a melhor opção para levar isso à gerência é mostrar quanto retrabalho seu código requer e quanta quantidade está sendo desperdiçada nisso.
Maurício Linhares
7

Tenho certeza de que você já viu meus comentários e meu outro post, então não vou fingir que realmente sei a resposta. O melhor que posso oferecer é um resumo do que ouvi / li de outras pessoas e acrescente um pouco da minha própria experiência à mistura.

Primeiro, quero dizer que, há pouco tempo, deparei-me com um blog que pertence a um de nossos próprios membros do Programmers SE, Martin Blore e IMO. Este post específico sobre a auto-atualização do TDD é muito preciso. TDD é o último nível mais alto que une tudo, mas sem níveis anteriores, especialmente o maior, princípios e práticas de produção de código claro e legível, será muito difícil, se não impossível, fazer o TDD funcionar.

Na minha empresa, o Agile e o TDD nos foram impostos pela gerência e, a princípio, simplesmente os fizemos porque nos disseram (o que é o oposto do ágil). Tentamos o TDD duas vezes e, embora eu seja um grande defensor do uso de testes automatizados, pessoalmente joguei fora todos os que a equipe deu no último lançamento. Eles eram frágeis, gigantescos, copiavam / colavam o wazoo e crivavam de declarações de sono que os faziam correr muito lenta e imprevisivelmente. Meu conselho para sua equipe: NÃO FAÇA TDD ... ainda.

Não sei qual é a sua situação, porque você mencionou que está na empresa há apenas 6 meses e que é contratado. Seus objetivos de longo prazo para permanecer nesta empresa ou o contrato terminará? Estou perguntando, porque mesmo que você faça algo, pode levar algum tempo para realmente ver os resultados.

Além disso, quando você ingressa em uma equipe, geralmente leva tempo até você obter credibilidade e respeito suficientes da equipe, onde eles (desenvolvedores e gerenciamento) considerariam qualquer coisa que você propusesse. Na minha experiência, ajuda se você apagar alguns incêndios e demonstrar que possui habilidades e conhecimentos dos quais outros podem confiar. Não tenho certeza se 6 meses é suficiente. Com frequência, uma pessoa nova e ambiciosa se junta à equipe e depois faz um post aqui perguntando como eles podem mudar o mundo. A triste realidade é que eles simplesmente não podem.

Então, supondo que você tenha o respeito e a atenção de sua equipe. O que agora?

Primeiro, o gerenciamento e os desenvolvedores precisam estar cientes de que há um problema. A gerência mede os resultados em termos de trabalho entregue. Se eles estão satisfeitos com a quantidade e a qualidade atuais dos recursos, a triste realidade é que eles não vão ouvir. Como outros salientaram, sem o apoio da gerência, será extremamente difícil introduzir qualquer tipo de mudança.

Depois de obter suporte de gerenciamento, o próximo passo é aprofundar e identificar as causas do motivo pelo qual a equipe opera da maneira que funciona. Este próximo tópico é algo que tem sido uma busca pessoal minha há pouco tempo. Até agora, essa foi minha jornada:

  1. Depois de ter o apoio da gerência. Você pode começar a introduzir muitas práticas / processos ditados centralmente que a MainMa sugeriu em resposta à minha pergunta . Fizemos muitos deles (exceto programação emparelhada) e você definitivamente vê benefícios. As revisões de código ajudaram especialmente a padronizar o estilo, a documentação e também nos permitiram compartilhar conhecimentos / técnicas entre a equipe. Mesmo assim, as revisões de código foram ditadas, a equipe realmente gosta delas e analisamos todas as funcionalidades que foram registradas. No entanto ...
  2. Você percebe que o código geralmente escrito ainda é muito acoplado, o design é ruim ou completamente inexistente. As análises de código capturam parte disso, mas há muito que você pode reescrever. Por que o design é ruim em primeiro lugar? - Muitos desenvolvedores nunca foram apresentados a boas práticas e nunca foram formalmente ensinados OOD em primeiro lugar. Muitas pessoas "simplesmente codificaram" qualquer tarefa que recebessem.
  3. Com o suporte da gerência, você pode introduzir mais processos, como discutir o design antes de qualquer codificação. Mas você é apenas uma pessoa e parece que, assim que não presta atenção, a equipe volta ao que sempre fez. Por quê?
  4. Melhores práticas ou hábitos podem ser introduzidos e ensinados para que você não precise monitorar constantemente? - Acontece que esta parte não é tão fácil.
  5. Por que outros membros da equipe relutam em aprender e adotar novas práticas e por que eles são tão resistentes ao SOLID ou DRY quando se escreve sobre tanta coisa na literatura moderna de metodologia de software? Com todas as mudanças positivas que tivemos em minha equipe, há duas semanas, tive uma discussão: refatorei duas funções com 15 linhas de código idênticas e o revisor chamou de esforço heróico e desnecessário, porque não há nada errado em copiar / colar apenas 15 linhas. Discordo totalmente de tais opiniões, mas por enquanto decidimos concordar em discordar. - e agora? Agora chegamos ao tópico do meu outro post .
  6. Como maple_shaft e nikie apontaram em suas respostas (desculpe, MainMa , você obteve o maior número de votos, mas está a 5 passos :) :), você alcançou um estágio em que o "processo" não pode mais ajudar você e ninguém neste fórum pode lhe dizer qual é a "correção". O próximo passo é abordar indivíduos, talvez um a um, talvez em equipe, provavelmente ao mesmo tempo ou conversar com eles. Pergunte a eles, o que funciona e o que não funciona. A única maneira de identificar a causa raiz do que os motiva é agora conversar com eles individualmente e descobrir isso. Como parte dessa etapa, deparei-me recentemente com um problema de equipe completamente diferente, mas acho que a resposta de Joel aqui, que é muito detalhado e perspicaz, também se aplicaria a esse caso. Em resumo, embora usar o gerenciamento como "trela curta" seja uma abordagem possível para praticamente qualquer coisa, precisamos lembrar que estamos lidando com seres humanos, para entender verdadeiramente as motivações que temos que cruzar mais na psicanálise do que pura gerência ou liderança técnica.
  7. Então agora você está falando com seus colegas de equipe? O que você pergunta a eles? Não tenho certeza sobre esta próxima parte, porque nunca estive aqui. Aqui está um cenário possível: P: Como é que não há SOLID? A: Eu não preciso disso. P: Isso pode ajudar. A: Eu estou bem como está. - de alguma forma, você precisa gerar uma série de sons que deixariam sua boca e levariam o ouvinte a reconhecer que as coisas poderiam ser melhores se derem uma chance ao que você está vendendo. Se você falhar aqui, eles nunca ficarão convencidos de que qualquer que seja o "processo" que os faça fazer, realmente tem algum valor. Por outro lado, se você passar desse ponto, provavelmente descobrirá que não precisa mais do "processo".
  8. Na IMO, seus colegas de equipe não aprenderão se não virem nada de errado com seus hábitos / práticas atuais. Talvez o próximo passo seja encontrar uma maneira de ilustrar, destacar os problemas e torná-los óbvios. Afinal, não estamos escrevendo código legível, usando os princípios do SOLID / DRY ou mantendo a documentação apenas porque isso nos dá uma sensação calorosa e confusa. Fazemos isso porque produz código de melhor qualidade e, francamente, nos torna mais rápidos. Isso pode ser medido? Talvez seja aí que entram as métricas de software?
  9. Aqui está uma ideia maluca e eu não tenho idéia se ela realmente funcionaria (pode ser uma prática padrão da indústria ou talvez completamente inválida. Eu inventei isso nas últimas 24 horas), mas estou muito tentada a trazê-la para a mesa assim que o próximo ano começar:
    • Contra a opinião de muitos outros , apresente a idéia de Autor / Proprietário para todos os arquivos de origem. Como sugere o Programador Pragmático, isso dará um senso de propriedade e responsabilidade a uma única pessoa que será responsável por um código-fonte. Isso não significa que outras pessoas não podem modificar o código, estamos todos trabalhando em equipe, mas no final do dia, a pessoa que possui o código é responsável por revisar as alterações.
    • Crie um gatilho de repositório de origem que monitore todos os check-ins e procure especificamente aqueles que são correções de bugs. Faça um processo para que toda correção de bug tenha um identificador de referência logo na descrição do check-in. Agora escreva um script que analise uma lista de arquivos que foram alterados e retire o "Autor" do bloco de comentários do cabeçalho do arquivo. Crie um banco de dados SQL que rastreie o número de defeitos registrados por arquivo / por projeto / por autor.
    • Depois de ter estatísticas suficientes, esperamos que você observe que seu código tem menos defeitos / alterações que alguns dos outros códigos. Esses são dados concretos que você pode usar. Se um único projeto tiver uma taxa de defeitos significativamente acima da média, traga-o como candidato para o próximo esforço de limpeza / refatoração para pagar alguma dívida técnica.
    • Se um projeto ou arquivo tiver uma taxa de defeitos significativamente acima da média e tiver um proprietário, converse individualmente com essa pessoa. Pergunte a eles, muito educadamente e sem confronto, o que eles podem fazer para resolver isso. Como eles são os proprietários, eles devem conduzir a mudança, mas oferecer toda e qualquer ajuda do seu lado. Felizmente, o proprietário rastreará muitas das causas de seu próprio código de espaguete e, assim que pedir ajuda, é quando você entra em ação e estabelece algum SOLID.
DXM
fonte
1
isso é excelente, obrigado. Eu tentei antes de algumas dessas técnicas (Jen *, por que você não altera seu formatador de código para fazer x, y, z, leva 2 minutos) antes, e eu sempre recebo elogios e nada acontece. Além disso, um dos meus colegas é claramente mais forte que o outro; na linha em que ela poderia ser muito boa, mas falha em executar. Eu a ouço falar sobre qualidade de código o tempo todo, mas também meio que reverte para um shell quando é hora de agir: "só temos cinco semanas para lançar, não quero refatorar nada agora". E eu facepalm. * nome alterado
hvgotcodes 28/12
e se você não se concentrar no formatador de código (ou qualquer outra coisa específica). Em vez disso, basta conversar com Jen e apresentar alguns dos problemas como problemas de equipe (por exemplo, "notei que nosso código não é muito legível, acho que está nos fazendo cometer erros que podem ser evitados"). Não sugira nada, mas deixe Jen pensar em possíveis soluções. Também descobri que ajuda quando você faz backup de suas sugestões com fontes. Em vez de dizer, "Eu acho que nós precisamos trabalhar no melhor de nomes de variáveis", o que se disser, "I ler o código limpo e eu acho que o autor tinha um ponto muito bom, vamos tentar ..." Para discutir ...
DXM
... com isso, Jen teria que encontrar um livro que sugerisse que nomear não é importante. E eu sei o que você quer dizer com as pessoas revertendo, isso é natural e a razão é que, quando você está sob pressão, você volta à sua zona de conforto para liberar seu esforço para coisas "importantes". Mesmo se você juntar sua equipe para melhorar a qualidade e o aprendizado, serão necessários vários lançamentos antes que eles comecem a voltar aos bons hábitos. Só precisa ser paciente, escolher suas batalhas e deixar algumas coisas slide
DXM
2

Sugiro que você fale com seu gerente sobre o problema, mas ele certamente não vai querer revisar todos os check-in.

Em vez disso, sugiro que você sugira um conjunto de testes de unidade / regressão, para ser conectado ao SVN e executado para cada check-in. Isso pelo menos ajudará a evitar construções quebradas. Você pode gradualmente sugerir outras práticas recomendadas.

Se ele se mostrar totalmente receptivo, talvez você deva passar por cima dele. Se você decidir fazer isso, precisará trazer o seu melhor jogo. Basicamente, você estará propondo que a gerência seja contratada em um nível superior, se você fizer isso.

Marcin
fonte
1
Eu não mencionei que este é um trabalho do lado do cliente. testes funcionais automatizados são a base, mas eles não são testes de unidade; portanto, o feedback seria diário, não imediato.
hvgotcodes
2
@ hvgotcodes: não vejo por que isso impede você de criar testes de unidade para executar em cada check-in.
26611 Marcin