melhor maneira de "apresentar" OOP / OOD à equipe de engenheiros experientes em C ++


17

Estou procurando uma maneira eficiente, que também não seja um insulto, de introduzir conceitos de POO aos membros da equipe existentes? Meus colegas de equipe não são novos nos idiomas OO. Fazemos C ++ / C # há muito tempo, de modo que a própria tecnologia é familiar.

No entanto, olho em volta e sem grande infusão de esforço (principalmente na forma de revisões de código), parece que estamos produzindo um código C que, por acaso, está dentro de classes. Quase não há uso de princípio de responsabilidade única, abstrações ou tentativas de minimizar o acoplamento, apenas para citar alguns. Eu já vi classes que não têm um construtor, mas obtêm o memset como 0 toda vez que são instanciadas.

Mas toda vez que eu mostro OOP, todos sempre concordam e fazem parecer que sabem exatamente do que estou falando. Conhecer os conceitos é bom, mas nós (alguns mais que outros) parecemos ter muita dificuldade em aplicá-los quando se trata de entregar um trabalho real.

As revisões de código têm sido muito úteis, mas o problema com as revisões de código é que elas ocorrem apenas após o fato; portanto, para alguns, parece que acabamos reescrevendo (é principalmente refatoração, mas ainda leva muito tempo) o código que acabou de ser escrito. As revisões de código também fornecem feedback para um engenheiro individual, não para toda a equipe.

Estou brincando com a idéia de fazer uma apresentação (ou uma série) e tentar abrir o OOP novamente, juntamente com alguns exemplos de código existente que poderiam ter sido escritos melhor e que poderiam ser refatorados. Eu poderia usar alguns projetos realmente antigos que ninguém possui mais, pelo menos essa parte não deve ser uma questão delicada. No entanto, isso vai funcionar? Como eu disse, a maioria das pessoas faz C ++ há muito tempo, então meu palpite é que: a) elas ficam lá pensando por que estou dizendo coisas que já sabem ou b) elas podem realmente encarar isso como um insulto, porque dizendo que eles não sabem como fazer o trabalho que vêm realizando há anos, senão décadas.

Existe outra abordagem que atingiria um público mais amplo do que uma revisão de código, mas ao mesmo tempo não pareceria uma palestra de punição?

Eu não sou um garoto recém-formado que tem ideais utópicos de código perfeitamente projetado e não espero isso de ninguém. A razão pela qual estou escrevendo isso é porque fiz uma revisão de uma pessoa que realmente tinha um design decente de alto nível no papel. No entanto, se você imaginar as classes: A -> B -> C -> D, no código B, C e D implementam quase a mesma interface pública e o B / C tem funções de um liner, de modo que a classe A superior está fazendo absolutamente todo o trabalho (até gerenciamento de memória, análise de strings, negociações de configuração ...) principalmente nos métodos 4 mongo e, para todos os efeitos, chama quase diretamente para o D.

Atualização: Sou líder técnico (6 meses nessa função) e tenho total suporte do gerente do grupo. Estamos trabalhando em um produto muito maduro e os custos de manutenção estão definitivamente se tornando conhecidos.



3
Você é o supervisor ou chefe deles? Caso contrário, você tem o apoio do diretor técnico que é o chefe de todos vocês? Se você é apenas uma das pessoas e o desenvolvimento tem sido estável e produtivo há anos sem usar projetos profundos de POO, você está em uma batalha difícil para convencer os programadores de que o código de trabalho não funciona e o gerenciamento que você não está desperdiçando dinheiro melhor gasto na geração de código.
Patrick Hughes

Depois que eu fiz este post, apareceu um link relacionado que se parece muito com a minha situação: programmers.stackexchange.com/questions/43214/… . Estou preocupado com exatamente a mesma coisa. O problema é que a equipe deles tinha 2 desenvolvedores e eu definitivamente poderia gerenciar isso com revisões de código. Estou procurando uma abordagem que funcione com o tamanho da nossa equipe (10+). Simplesmente não consigo me comunicar com todos os desenvolvedores individualmente, tanto quanto eu gostaria.
DXM

Respostas:


5

Por que você não desenvolve um treinamento curto nos princípios do SOLID e oferece a eles esse treinamento? Parece ter funcionado muito bem para mim na minha organização atual e acho que dar treinamentos curtos é realmente divertido (para todos os envolvidos).

Quando dei meu treinamento, levei algum tempo para procurar exemplos "ruins" patológicos no código existente (de vários projetos) e os refatorei na apresentação, passo a passo, usando os princípios. Isso demonstrou que

  1. Não é tão difícil fazer essas refatorações
  2. Não demora muito
  3. O resultado final (cuidadosamente escolhido ;-)) é claramente melhor que o código original.

5

As revisões de código foram muito úteis, mas o problema com as revisões de código é que elas ocorrem somente após o fato.

Em um projeto, fizemos revisões de design.

15 minutos. No quadro branco. Fale sobre o design antes da codificação.

A parte mais importante é agendar a revisão do design antes de qualquer trabalho de implementação.

Também tivemos "Critical Design Reviews", que foram um grande negócio. Eles envolveram muitos documentos e uma longa apresentação. Eles eram difíceis de programar e quase sempre eram adiados até o início da codificação, reduzindo seu valor a zero.

As revisões informais do projeto - antes da codificação - sem pressão - sem documentação - permitem uma melhor discussão sobre como as responsabilidades são atribuídas e como os objetos colaborarão.


Sim, já fazemos revisões de design exatamente como você as descreveu. O problema são tarefas de tamanho médio. Se a tarefa for grande o suficiente, geralmente dedico um tempo para elaborar o diagrama de classe inicial, que depois é refinado pela equipe. Se a tarefa for pequena, o design de alto nível existente já é bom o suficiente. No entanto, para tarefas de tamanho médio, não tenho capacidade de pensar bastante no design, de modo que a regra básica é "use o melhor julgamento e siga o POO". Se eu fosse fazer essas tarefas a mim mesmo, eu começaria com a codificação e misturam isso com refactoring contínua e ...
DXM

... deixe o código decidir como seria o design final. No entanto, quando deixo essas tarefas para alguns membros da equipe, o que às vezes encontro na revisão de código é algo como o que descrevi na minha postagem inicial.
DXM 29/07

1
@DXM: O que? Você está fazendo eles? Ou não fazê-los? Se for grande, você não está fazendo análises de design - está fazendo design para outra pessoa - que aprende quando você faz design? Se pequeno, você não está fazendo análises de design - o "design existente é bom o suficiente" - quem se inclina quando você ignora o design? Se médio, você não faz design e também não revisa os designs deles? Não parece que você está realmente fazendo análises de design reais. Por que você diz que é e depois dá três exemplos onde não está?
31511 S.Lott

@Lott: após refletir sobre sua resposta, minha única conclusão é que você está absolutamente certo. Eu acho que o que eu deveria ter dito é que eu trouxe essa idéia exata pelo menos 8 vezes e todos sempre concordaram, mas sim, se eu olhar para o ritmo em que estabelecemos, não estamos realmente fazendo nada disso. Eu gostaria de discutir isso ainda mais, mas já fui disciplinado por mods por ter uma discussão em um site estritamente de perguntas e respostas. Poderíamos entrar no chat? Eu gostaria de explicar mais a situação e talvez escolher seu cérebro (ou qualquer outra pessoa que queira participar) um pouco. Nunca terminou o chat, sabe como funciona?
DXM

@ DXM: o bate-papo é trivial. E não é muito útil. Se você tiver mais perguntas - mais detalhadas que esta pergunta inicial -, faça essas perguntas mais detalhadas. Essa é a questão. Em alguns casos, "discussão adicional" equivale a "Não gosto da sua resposta à minha pergunta pelos seguintes motivos ...", o que é meio bobo. Não gostar de uma resposta simplesmente não está gostando de uma resposta e não requer nenhuma discussão. Em alguns casos, a discussão equivale a "minha pergunta não é vaga, você simplesmente não pode ler". Inútil, realmente. Faça suas perguntas. Como perguntas.
S.Lott

4

Suponho que você seja mais jovem do que alguns dos desenvolvedores, mas mais alto na cadeia alimentar.

Correndo o risco de ser enterrado em votos negativos, pode ser que os 'engenheiros experientes' estejam de fato fazendo a coisa certa - ou como esse é um produto maduro que já existe há décadas, o que já foi a coisa certa.

O código mais antigo tende a ter sido otimizado para executar rapidamente no hardware da época; entre outras coisas, isso significa reduzir os níveis de herança e evitar funções / métodos que exigem operações triviais.

Os compiladores ficaram muito mais inteligentes ao longo dos anos, então nem tudo o que era verdade agora é - por exemplo, um compilador pode optar por incorporar uma pequena função.

Talvez um caminho a seguir seria adotar uma abordagem diferente - peça aos desenvolvedores que expliquem como / por que o método deles é melhor do que a teoria que você aprendeu - e sejam sinceros.


0

Pressionar para testes de unidade com uma cobertura de 100% de ramificação de cada método novo / alterado não levaria a minimizar o acoplamento entre os métodos.


UT é uma boa ideia, mas não estou convencido de que isso atingiria o resultado desejado. Além disso, um dos princípios fundamentais do OO é que o acoplamento entre funções é inevitável; portanto, é melhor explicitar e agrupar essas funções acopladas em uma única classe.
MSalters

Concordo que "o acoplamento entre funções é inevitável". No entanto, um bom design reduz o número de outras funções em que cada função também é acoplada. (Uma classe é apenas um meio para essa finalidade)
Ian

0

Convém pegar o livro "Design Patterns" da Gang of Four. Não é específico para C ++, portanto você não está criticando abertamente o conhecimento de C ++ de seus colegas quando se refere a ele. No entanto, ao mesmo tempo, aborda tópicos que você considera relevantes. Além disso, o livro é amplamente aceito como relevante, então eles não podem facilmente descartá-lo como teórico ou impraticável.

Por outro lado, considere que o C ++ não é uma linguagem OO pura, nem no design nem na prática. Toda a história do construtor / memset parece que você deve apresentar o RAII, que não é uma técnica de OO, mas é específico para C ++ (infelizmente - o IDispose do .Net mostra o que acontece quando o RAII é uma reflexão tardia). Os livros relevantes aqui são (Mais) C ++ Efetivo e (Mais) C ++ Excepcional.


2
Mas os autores afirmam claramente que os padrões de design não são uma introdução ao OOP / OOD em geral! O público deve primeiro familiarizar-se com as técnicas oferecidas pelo OOP antes de mergulhar em um catálogo de padrões de design de código rígido! "Head First Design Patterns" será uma boa introdução.
Falcon

2
Parece que, na descrição do OP, eles conhecem OOP / OOD, eles simplesmente não o usam (talvez por medo de que seja muito complicado); nesse caso, um livro que explica por que é útil pode motivar melhor do que exemplos de código.
wildpeaks

@wildpeaks: O OP sais o contrário. Eles não sabem OOP / OOD. Eles estão programando OOP de maneira processual. Eles precisam de algo para apresentá-los às técnicas de design e o livro do GoF não se adequa a esse cenário.
Falcon

Eu estava me referindo às frases But every time I bring up OOP, everyone always nods and makes it seem like they know exactly what I'm talking aboute My teammates are not new to OO languages, mas posso ver como é realmente um pouco vago, pois elas podem estar mentindo sobre saber OOP quando o OP fala com eles sobre isso.
wildpeaks

1
@MSalters - Prefácio de padrões de design: "Este livro não é uma introdução à tecnologia ou ao design orientado a objetos. Muitos livros já fazem um bom trabalho. Esse livro pressupõe que você seja razoavelmente proficiente em pelo menos uma linguagem de programação orientada a objetos e você deve ter alguma experiência em design orientado a objetos também ". Este livro não se encaixa nos requisitos. Eles devem ler algumas coisas OOD de nível de entrada.
Falcon
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.