Passei 3 dias depurando um bug muito obscuro em uma biblioteca criada por meu colega, esse bug ocorre com pouca frequência. Afinal, descobri que esse bug ocorre devido ao acesso entre threads a um objeto sem nenhum bloqueio. Na verdade, esse não é o primeiro bug desse tipo; havia erros semelhantes antes. Ele apenas executa seus testes de unidade e, se algo falhar, coloca um bloqueio em algum lugar. E se nada falhar, ughm, então o código dele é perfeito. Parece que ele não tem idéia sobre a segurança da linha. Tenho 100% de certeza de que existem muitos erros semelhantes que ainda não foram descobertos. Parece que o PM também não entende coisas de encadeamento.
O problema é que ele trabalha muito mais tempo na empresa do que eu. De qualquer forma, não posso simplesmente dizer "esse cara é incompetente nessa área", porque isso sempre mostra você como um "mau jogador de equipe" etc.
fonte
Respostas:
Convença a PM de que, para evitar esses erros, o conhecimento da equipe sobre o encadeamento de itens deve ser aprimorado e diga a eles que você está disposto a organizar algo como um workshop ou uma apresentação sobre o assunto. Não faça disso algo pessoal entre você e seu colega.
fonte
Escreva um teste de unidade que mostre o erro e peça a ele para corrigi-lo.
fonte
fonte
Acho que sua empresa não deve usar multithreading.
Depois de fazer um projeto massivamente multithread, achei duas técnicas essenciais para fazer as coisas funcionarem. Primeiro , o código teve que ser escrito corretamente. Todos os campos precisavam ser verificados manualmente para garantir que fossem declarados de maneira adequada e sincronizada onde quer que fosse. (Aviso: estou simplificando um pouco as coisas aqui para manter minha resposta curta - ou pelo menos menor). Segundo , o código teve que ser testado, executando-o em máquinas simples e com vários núcleos - muitos minutos usando 100% de cada núcleo. (E se ele usa apenas 2% de cada núcleo, como costumava fazer para mim, isso também é um bug).
Você pode gerenciar isso, mas sua organização não pode. Mesmo se eles entenderam o problema, o que eles não entendem, eles não têm o conhecimento.
A maioria dos idiomas fornece maneiras de evitar isso. Se você possui um leitor de soquete, que geralmente possui seu próprio encadeamento, solicite que ele encaminhe as informações para o encadeamento principal o mais rápido e simples possível. Melhor ainda, procure classes / funções do sistema que manipularão a parte da discussão da leitura para você. Use uma fila que execute "eventos" um após o outro, como a maioria das APIs da GUI. (Use a própria fila de eventos da API da GUI, se for necessário.) Se você precisar de processamento paralelo, provavelmente poderá encontrar algum tipo de "thread de trabalho" que permitirá manter os dados / campos em um único thread, manipulando todas as transferências para você.
Enfatize todos os perigos do multithreading. (Histórias assustadoras: meu bug favorito envolveu algumas linhas como
int i = 5; i = i * i;
:, que resultaram emi
um valor de 35. Um que eu vi muito foi:if (thing != null) thing.reset();
lançar uma exceção de ponteiro nulo.) Acho que sua única esperança é fazê-los entender que são entrando em um mundo novo e estranho e que talvez eles devessem dar um grande passo para trás.Não tenho muita certeza de como o multithreading deve ser tratado. Se o trabalho puder ser dado a uma pessoa e tudo o que eles fizerem fora, se falharem, tudo bem. Mas uma equipe só será tão forte quanto seu membro mais fraco e até um bom programador terá problemas com o multithreading completo. Espero que o pessoal do idioma encontre uma maneira de torná-lo seguro. Eu vi alguns softwares úteis por aí. Mas acho melhor evitar multithreading, a menos que o tempo de execução seja crítico e um bom programador ou uma equipe comprovada esteja disponível.
fonte