Devemos persistir com um funcionário ainda escrevendo código incorreto após muitos anos? [fechadas]

13

Estou fazendo esta pergunta aos programadores de C ++ porque: a) Somente um programador de C ++ pode julgar os méritos técnicos dos exemplos; b) Somente um programador sentirá o temperamento de outro programador que escreve código como este.

O RH e os diretores estão cientes de que há um problema simplesmente porque veem evidências em campo. É minha decisão se damos mais tempo ao programador em questão. Muitos dos erros estão em um nível muito básico - minha pergunta (para programadores) é se alguém que professa ser um desenvolvedor sênior de C ++ deve receber o benefício de uma dúvida com base em exemplos de seu código atual. Não programadores - mesmo pessoas fora da programação C ++ - não podem julgar isso.

Como pano de fundo, me foi atribuída a tarefa de gerenciar desenvolvedores de uma empresa bem estabelecida. Eles têm um único desenvolvedor especializado em toda a sua codificação C ++ (desde sempre), mas a qualidade do trabalho é péssima. Revisões e testes de código revelaram muitos problemas, sendo um dos piores vazamentos de memória. O desenvolvedor nunca testou seu código quanto a vazamentos, e eu descobri que os aplicativos poderiam vazar muitos MBs com apenas um minuto de uso. Os usuários estavam relatando grandes lentidões, e sua opinião foi: "não tem nada a ver comigo - se eles pararem e reiniciarem, tudo ficará bem novamente".

Dei a ele ferramentas para detectar e rastrear os vazamentos e sentei-me com ele por muitas horas para demonstrar como as ferramentas são usadas, onde os problemas ocorrem e o que fazer para corrigi-los. Estamos 6 meses no caminho, e eu o designei para escrever um novo módulo. Eu a revisei antes de ser integrada à nossa base de código maior e fiquei consternada ao descobrir a mesma codificação incorreta de antes. A parte que considero incompreensível é que parte da codificação é pior que amador. Por exemplo, ele queria uma classe (Foo) que pudesse preencher um objeto de outra classe (Bar). Ele decidiu que Foo manteria uma referência a Bar, por exemplo:

class Foo {
public:
    Foo(Bar& bar) : m_bar(bar) {}
private:
    Bar& m_bar;
};

Mas (por outras razões) ele também precisava de um construtor padrão para Foo e, em vez de questionar seu design inicial, ele escreveu esta jóia:

Foo::Foo() : m_bar(*(new Bar)) {}

Portanto, toda vez que o construtor padrão é chamado, uma barra vaza. Para piorar a situação, Foo aloca memória do heap para outros 2 objetos, mas ele não escreveu um destruidor ou construtor de cópias. Portanto, toda alocação de Foo realmente vaza 3 objetos diferentes, e você pode imaginar o que aconteceu quando um Foo foi copiado. E - só melhora - ele repetiu o mesmo padrão em três outras aulas, portanto não é um deslize único. Todo o conceito está errado em muitos níveis.

Eu sentiria mais compreensão se isso viesse de um novato total. Mas esse cara faz isso há muitos anos e tem recebido treinamento e conselhos muito focados nos últimos meses. Sei que ele trabalhou sem orientação ou avaliação por pares a maior parte do tempo, mas estou começando a achar que ele não pode mudar. Então, minha pergunta é: você persistiria com alguém que está escrevendo um código tão obviamente ruim?

user94986
fonte
15
Se você já viu que ele estava escrevendo um código incorreto, por que você deixou ele escrever sua merda durante 6 meses sem supervisioná-lo?
Billy McNuggets
4
Na IMO, quando você vê alguém fazendo um mau trabalho por um tempo, você não pode deixá-lo trabalhar sozinho, mesmo que seja apenas depuração / reparo. Se for sua vontade mantê-lo em sua empresa, você precisa supervisioná-lo e DEPOIS ver se ainda obtém maus resultados dele. Deixá-lo trabalhar sozinho durante 6 meses sem olhar para ele é uma má gestão da OMI.
Billy McNuggets
3
@ user94986 Então, se você passar um tempo com ele, explicando que seus hábitos são ruins, fique de olho nele e, se nada mudar, não espere 6 meses para falar com ele.
Billy McNuggets
4
Se ele não acha que vazamentos de memória são um problema, não faz sentido ensiná-lo a evitá-los e fornecer ferramentas para ajudá-lo. O principal problema pode ser que ele entenda incorretamente metas e requisitos para o produto.
maxim1000
2
Esta questão parece estar fora de tópico, porque é sobre o que é efetivamente aconselhamento jurídico de RH que é problemático para nós oferecermos, na melhor das hipóteses.
World Engineer

Respostas:

22

Meu conselho seria confrontá-lo com esse exemplo em particular e ver o que ele diz. Se ele negar que haja algo ruim com o código, receio que haja pouco que você possa fazer. Se ele aceita que cometeu um erro (mesmo que seja defensivo), pelo menos há espaço para melhorias. Se você aceitar o tempo e o esforço para melhorá-lo, você ou um programador sênior precisará sentá-lo e codificar juntos até que todas essas tendências sejam achatadas (esteja preparado para dedicar essa pessoa por pelo menos 1 mês).

Um programador ruim, com quem normalmente posso trabalhar, mas um programador que não pode melhorar, eu não posso.

Neil
fonte
12
+1 para "Um programador ruim com quem eu posso trabalhar, mas um programador que não pode melhorar, eu não posso".
Sim, também, eu deixaria o cara saber que é muito sério. Parece que ele não foi informado ou não reconheceu que há um problema há anos. Venha para a conversa pronto para apontar exemplos de coisas que ele não deveria ter feito e como isso afetou a qualidade do aplicativo. Se ele ainda não estiver disposto a confessar um problema com seu código, eu provavelmente o deixaria ir. E eu provavelmente não daria muito tempo para ele agir se ele o fizesse. Você definitivamente precisa enfatizar que o futuro dele na empresa está em risco e que ele não possui uma habilidade crítica para um desenvolvedor de C ++.
precisa
@ErikReppen Eu concordo, mas também acho que os programadores podem ser o tipo de pessoa mais teimoso do mundo. Se você pressionar demais, ele pode negar qualquer problema com seu código simplesmente por estar na defensiva. Eu acho que é importante enfatizar a gravidade da situação, mas eu ainda tentaria simpatizar com ele. "Eu notei esse pequeno erro. Você percebeu isso também? Você acha que cometeu o mesmo erro em outras áreas da seu programa? "
26513 Neil
@ Neil A única maneira de atravessar uma parede de teimosia é um chute na bunda. E falo por experiência própria como o lado mais obstinado dessa equação. Dito isto, se é a primeira que ouviu de haver um problema com seu código, sim, eu iria um pouco mais suave, mas parece que eles tentaram se comunicar um problema pelo menos uma vez antes
Erik Reppen
@ErikReppen Talvez, mas você corre o risco de ele se moldar apenas para tirá-lo do rabo. Nesse ritmo, você também pode dizer "Forma-se ou está demitido". Pelo menos essa abordagem descobre se ele tem consciência de seus erros.
26513 Neil
18

Então, minha pergunta é: você persistiria com alguém que está escrevendo um código tão obviamente ruim?

Não. Eu acionaria qualquer desenvolvedor profissional de C ++ que não tivesse o entendimento básico do gerenciamento de memória.

Se é alguém vindo de Java ou C # ou algo assim, eu daria a eles alguma latitude, mas isso é pura incompetência.

Telastyn
fonte
9
Não consigo entender como essa resposta pode ser votada. Demitir alguém não é uma questão que deve ser tomada de ânimo leve.
Florian Margaine
3
@FlorianMargaine - Claro, mas isso parece ser um caso claro. Quanto esse funcionário está custando à empresa em vendas perdidas devido a vazamentos de memória ou vulnerabilidades de segurança? Quanto tempo perdeu para testar / consertar essa porcaria? Quanto é que o OP toma conta deles? Quanto os outros programadores sofrem com sua mera presença ? A menos que o funcionário tenha uma quantidade absurda de conhecimento de domínio (ou chantagem), não há como substituí-lo com um custo mais alto.
Telastyn
1
@FlorianMargaine, esse tipo de funcionário é quem não é demitido o suficiente, isso prejudica a empresa em dificuldade de consertar dívidas técnicas. Diz em grandes luzes vermelhas: "Eles não se importam, então por que deveríamos?". Sabe o que o funcionário que você realmente deseja diria? "... mas eu me importo, então eu preciso ir para um lugar que faça". Os maus já não se importaram, então permanecem no seu escritório. Você DEVE remover pessoas que prejudicam a produtividade, mais do que elas contribuem. Esta não é uma escolha tomada de ânimo leve, no entanto, é realmente uma linha clara, deixar de agir é uma ação clara.
JM Becker
13

Não podemos responder à parte mais ampla da sua pergunta. Ou seja, você deve reter ou demitir esse funcionário. Demitir um funcionário é difícil, mas essa é uma decisão fora do alcance de uma comunidade como essa.

Você atualizou sua pergunta para restringir as respostas aos programadores de C ++. Para meus conhecimentos / qualificações: cortei os dentes em C e posso codificar em C ++, C # e Java. E eu gosto de perseguir as condições de corrida entre os tópicos porque acho divertido. Sim, eu "fico" mexendo um pouco.

Sua resposta e decisão envolvem isso: se alguém pode ou não mudar depende do indivíduo e se ele quer mudar.

Mas vamos começar com algumas perguntas suas:

  1. Você já perguntou a ele sobre o código e o exemplo que você mencionou? Qual foi a impressão dele sobre a crítica?
  2. Você deu detalhes específicos a ele durante esses seis meses sobre como entender a manipulação de memória e garantir que o código dele não tenha vazamentos de memória?
  3. Você forneceu feedback razoavelmente frequente durante esses 6 meses para indicar se ele estava progredindo ou não.
  4. Você disse explicitamente que sua maneira antiga de codificação não era mais aceitável no novo código?

Você precisa ter certeza de que pode dizer sim a todas essas perguntas. Caso contrário, ainda há um ônus da prova de sua parte por se comunicar com ele.

A resposta dele à sua revisão recente será a parte mais reveladora.

Se ele está tentando e mostra alguns sinais de progresso, talvez seja necessário revisar seu processo de orientação. Se for o caso, talvez você deva considerar emparelhá-lo com um programador mais experiente, para que ele possa obter um feedback imediato enquanto toma decisões de design. Não sou fã de programação em pares, mas pode ser muito útil em um caso como este. Enviá-lo continuamente para fazer mais e mais revisões no código antigo nem sempre é um caminho prático para o aprendizado.

Se ele não estava tentando, então você precisa entender melhor a motivação dele. Ele não entendeu que precisava se esforçar mais? Ele simplesmente não se importa? Existem outras áreas da equipe em que suas habilidades seriam mais adequadas e ele está mais interessado nisso? Se ele não quis tentar, então você precisa entender o porquê.

A partir daí, você saberá se ele quer mudar e se pode mudar. Nenhum desejo de mudar é equivalente a não ser capaz de mudar. Se houver desejo e um certo grau de progresso, considere fortemente mudar como você está tentando reabilitá-lo.


fonte
1
+1 para "Enviá-lo continuamente para fazer mais e mais revisões no código antigo nem sempre é um caminho prático para aprender"
Bill
+1 nos últimos parágrafos. O progresso alcançado por alguém versus esforço investido na orientação de que alguém precisa levar em consideração qualquer julgamento de desempenho.
Marjan Venema
10

Receio que seu código incorreto não seja o único problema em sua equipe.

  1. Quem analisa seu código? Por que ele escapou sem aviso para aceitar código com vulnerabilidade de vazamento de memória?
  2. Por que os testes de estresse não encontraram esse problema? Você os usa? Se sim, então por que eles não estão trabalhando?
  3. Ele foi deixado sem vigilância por um longo período de tempo. Por quê?
  4. Ele não está usando as ferramentas que você deu a ele. Como você o motivou a começar a usar as ferramentas adequadas?

Você diz que ele está na empresa há um longo período de tempo. Demitir essa pessoa raramente é uma boa ideia (a menos que ele seja um funcionário do tipo Wally). O conhecimento deles sobre as necessidades dos clientes, produtos que você possui etc. geralmente é muito mais valioso do que o código que eles escrevem.

Soluções:

  • mova-o para o controle de qualidade para aprender o que evitar
  • parear programação com alguém que possa apontar seus erros
  • esforço estendido de controle de qualidade em seu código
  • fazê-lo escrever testes de estresse, se ele vir sua máquina de desenvolvimento travar após criar e destruir 10k de objetos, talvez ele aprenda
  • alguns / todos eles acima :)
Andrzej Bobak
fonte
3

Tomar uma decisão de demitir alguém é uma decisão difícil para alguém. Sua situação é composta por vários fatores:

  1. Parece que esse desenvolvedor está na empresa há vários anos
  2. O desenvolvedor grava todas as empresas do código C ++
  3. Parece que antes de você ninguém discutia o nível de código ruim com o desenvolvedor
  4. Como novo gerente, você não tem idéia de quem / o que o desenvolvedor sabe na / sobre a empresa e quais são as implicações políticas de demitir o desenvolvedor.

Dito isto, você passou os últimos 6 meses mostrando ao desenvolvedor o erro de suas maneiras e seu novo código ainda não melhorou.

Nesta fase, você realmente precisa iniciar um gerenciamento proativo para que, dentro de três meses, tenha

  • Um programador decente de C ++ que sabe o que está fazendo

ou

  • Encerrou o desenvolvedor.

Para fazer isso, embora você precise se sentar com o desenvolvedor, explique o que há de errado por escrito / e-mail, explique como o desenvolvedor pode melhorar e muito claramente afirme que, se a melhoria esperada não se concretizar, ele será encerrado em 3 meses.

Você também precisa deixar bem claro que a melhoria é esperada a partir deste momento para o resto de seu emprego na empresa e não apenas para o período de 3 meses!

Você também deve informar seu próprio gerente e o Departamento de RH (se houver).

Durante esse processo, você terá que gerenciar ativamente o desenvolvedor e revisar as tarefas / códigos a cada 1-2 dias e garantir que estejam atualizados, detalhando aqueles que não o são e explicando o que pode ser feito para melhorá-los.

armitage
fonte
1

Ou você não tem sido claro sobre a seriedade com a mão de obra dele (ou seja, é possível que ele veja quanto tempo você passou com ele como uma opção, se ele quer melhorar, em vez de uma necessidade absoluta), ou ele tem uma experiência incrivelmente ruim. atitude insustentável. Se ainda não está claro para esse desenvolvedor que você está considerando a posição dele sobre esse problema, ele precisa ser explicitado (supondo que sua liderança esteja de acordo com sua autoridade para terminar). Esperamos que o choque traga mudanças.

A decisão de emprego tem implicações muito mais amplas do que apenas esse cara; você precisa considerar o impacto sobre a equipe. Se for permitido que sua atitude prospere, ela pode ressentir-se dos outros ou fazer com que outros sintam que esse tipo de coisa também está bem. Do ponto de vista da equipe, é preciso que fique absolutamente claro que, se ele foi, foi pelas razões certas e teve ampla oportunidade de melhorar.

Uma jóia que eu peguei em um curso anos atrás é o fato de que pessoas com conhecimento técnico que outras pessoas não têm podem liderar o gerenciamento para dar folga. É ruim para o time. Você pode ter medo de perder o único desenvolvedor de c ++, mas eles podem ser substituídos. Obviamente, existem riscos inerentes se ele conhece bem os produtos lançados, mas muitas vezes vi pessoas com conhecimento técnico / produto aparentemente insubstituível serem substituídas com mais facilidade do que o previsto. Equipes e organizações geralmente podem preencher lacunas que inicialmente parecem difíceis de preencher. É claro que se ele não possui habilidades em c ++ ou conhecimento específico da organização que você acha que será difícil de substituir, há muito menos problema!

Wayne M
fonte
1
Suspeito que esse cara fique absolutamente espantado ao descobrir que seu gerente está pensando em demiti-lo. Algumas pessoas que você só precisa bater na cabeça com uma tábua e dizer que precisam melhorar ou serão demitidas.
HLGEM
0

Claro que não deveria. Lembre-se, isso não é uma instituição de caridade, você está trocando dinheiro por trabalho. Se ele não está sustentando seu lado do acordo, como qualquer transação, eu pararia de pagar.

MetaGuru
fonte
-1

Se você quiser dar uma chance a ele, desenvolva um teste padronizado que reúna métricas sobre vazamento de memória. Monitore seu progresso semanalmente, insistindo em ver o código que ele mudou e procure melhorias. Se ele não conseguir, naquele momento, demitir o invectivo inútil.

Jack Aidley
fonte