É aceitável usar a meta-programação, mesmo que nem todos os meus colegas a entendam?

102

Eu uso muita meta-programação para evitar tarefas repetitivas e criar abstrações mais seguras para usar.

Recentemente, mudei-me para um novo emprego onde estou trabalhando em uma equipe maior e isso preocupa alguns de meus colegas, porque eles não compreendem isso.

Eu sempre tento aproveitar todo o potencial da linguagem, mas alguns (nem todos) dos meus colegas percebem isso como um risco (alguns acolhem a abordagem).

Concordo que é um problema escrever código que ninguém na equipe possa compreender. Por outro lado, somos todos desenvolvedores profissionais de C ++ e acho que devemos aspirar a um padrão mais alto do que escrever C com classes.

Minha pergunta é: quem está certo, o que devo fazer?

Esclarecimento: Tentando aproveitar todo o potencial da linguagem, não significa que eu jogue TMP em todos os problemas. C ++ é uma caixa de ferramentas e para mim a proficiência em C ++ é sobre poder usar todas as ferramentas da caixa e escolher a certa para um trabalho em particular.

    
por kamikaze 03.03.2018 / 11:07
fonte

10 respostas

182

A metaprogramação está correta. O que você está tentando fazer não está bem.

Eu uso metaprogramação o tempo todo no meu trabalho. É uma ferramenta poderosa que pode ser usada para fazer muitas coisas de uma forma mais legível e sustentável. É também um dos mais difíceis de compreender os estilos de programação lá fora, por isso realmente precisa ganhar seu sustento. Eu gosto quando eu posso reduzir 1000 linhas de código para 50, mas eu tento limitar isso como tal.

A questão não é metaprogramação, mas isso:

On the other hand we are all professional C++ developers and I think we should aspire to a higher standard than writing C with classes.

É aqui que você se mete em apuros. Você tem uma opinião. É bom ter uma opinião de que a metaprogramação é boa. É bom ter uma opinião de que todos nós devemos ser melhores desenvolvedores de C ++.

Não é bom obrigar os seus colegas e futuros contratados que terão que manter o código que você escreveu para concordar com a sua opinião. Esse é o trabalho do seu chefe. Seu chefe é quem deve se preocupar em garantir que seu código seja sustentável a longo prazo. Eles (espero) têm muito mais experiência de negócios, porque acredite em mim quando digo que é uma decisão de negócios, não uma decisão ideológica.

É bom querer metaprogramar. É bom querer ensinar os outros a metaprogram. Mas entenda que também é bom para os outros escolherem não aprender a metaprograma, e isso será verdade até que você esteja em uma posição de poder. (e, como um segredo da indústria: quando você finalmente é um desenvolvedor líder, em uma posição de poder, você não está em posição de poder. Há alguém controlando os perseguidores que estão no poder).

Se você quiser incentivar a ficar bem com a metaprogramação, comece pequeno . Comece com um único enable_if que facilite a leitura da API. Então comente os daylights com isso. Então, talvez encontre um caso em que uma metafunção de modelo transforma 10 grandes classes repetitivas em 1 classe com 10 pequenos ajudantes. Comente o heck fora dele. Obter feedback. Encontre o que as pessoas pensam sobre isso. Fique bem se eles disserem para você não fazer isso. Encontre um nicho onde a metaprogramação seja tão completa que seus colegas concordem (a contragosto) que é a ferramenta certa para o trabalho.

Como um conto, eu escrevi uma linda biblioteca uma vez, usando extensa metaprogramação. Ele fez exatamente o que precisávamos na época, quando nenhuma outra abordagem poderia ficar remotamente próxima. Na verdade, mudou a direção do aplicativo em que eu estava escrevendo. Mas foi metaprogramação. Apenas uma ou duas pessoas em toda a minha empresa puderam lê-lo.

Mais tarde, meu colega deu outra olhada no problema. Em vez de alavancar a metaprogramação para fazer exatamente o que era necessário, ele trabalhou com a liderança para relaxar as restrições impostas ao problema, de modo que a metaprogramação não era necessária. Talvez mais precisamente, a metaprogramação foi menos necessária. Ele foi capaz de confinar o que a metaprogramação faz melhor.

A biblioteca resultante está agora em uma posição para ser usada em um mercado notavelmente , e isso é certamente em grande parte devido ao fato de que o novo código pode ser mantido por uma faixa muito maior de desenvolvedores. Tenho orgulho de abrir caminho com a metaprogramação, mas é o código do meu colega que vai atingir o público mais amplo e há boas razões para isso.

    
por 03.03.2018 / 16:18
fonte
39

Em primeiro lugar, esse é o problema da equipe e você precisa resolvê-lo com a equipe. Se você tiver backup da equipe para programação usando certos elementos e construções, faça isso; se não, discuta-as com eles e se você não conseguir convencê-los e argumentar por que "sua abordagem" é claramente melhor, será melhor não usá-los.

Note que usar a meta-programação de template em C ++ é sempre um trade-off: claro, às vezes pode ajudar a projetar certas partes de um aplicativo mais DRY, e é definitivamente útil para criar bibliotecas altamente eficientes e altamente reutilizáveis. / p>

Por outro lado, esses benefícios têm um certo custo: o código fica mais abstrato, muitas vezes muito mais difícil de ler, muito mais difícil de depurar e muito mais difícil de manter. Isso faz com que a utilidade da meta-programação na programação de aplicativos seja questionável. Assim, supondo que você não irá criar o próximo STL, toda vez que estiver tentado a usar a meta-programação, pergunte a si mesmo se essas desvantagens valem a pena. E se você não tiver certeza, discuta isso com seu revisor durante a revisão do código.

    
por 03.03.2018 / 11:28
fonte
18

Minha opinião geral: se você tiver uma escolha, como é frequentemente o caso, entre as três opções a seguir:

  • Digite muitas estruturas de código não triviais à mão;
  • Use a metaprogramação de modelos C ++ para automatizar a geração de código;
  • Use outro mecanismo de geração de código, como macros ou alguma outra linguagem de programação para gerar arquivos de origem em C ++

A metaprogramação do modelo, feita corretamente, provavelmente será a mais legível e sustentável das três opções. Este é o argumento que eu faria para a equipe, se eu estivesse em sua posição. Exemplos com código real ajudariam a convencê-los.

Quando você usa Template-Meta-Programming ( TMP ) para evitar repetições, você deve usá-lo para construir abstrações bem documentadas e cuidadosamente testadas que localizem a complexidade dentro do código TMP, facilitando escreva o código correto do cliente. Este é o design da biblioteca padrão C ++.

Eu não acho que podemos julgar quem está certo ou errado sem ver um exemplo do tipo de código que você está tentando escrever.

    
por 03.03.2018 / 23:27
fonte
12

Desenvolvedores de software devem aspirar a escrever código que funcione, que funcione obviamente, que possa ser testado, que possa ser revisado, que possa ser depurado e que possa ser adaptado quando mudanças forem necessárias. Se escrever "C com classes" conseguir isso, então tudo bem.

E esses são os padrões com os quais você deve medir seu código. Especialmente: Funciona obviamente, pode ser testado, pode ser revisto, pode ser depurado e pode ser adaptado quando necessário?

    
por 04.03.2018 / 22:13
fonte
8

Um argumento da compaixão:

O seu trabalho dá tempo livre para aprender, ou, alternativamente, você consegue convencer seus chefes a alocar algumas horas para aprender esses recursos de linguagem?

Se não, usá-los é essencialmente dar-lhes trabalho extra não remunerado. Você pode pensar que um programador em C ++ deve conhecer a língua inteira, ou algo assim, mas um ponto acadêmico não alivia o fardo que você estará impondo a eles. Seus colegas têm filhos, pais doentes, cônjuges doentes - ou o inferno, apenas uma vida social razoável que não envolva o aprendizado de C ++. O oponente mais vocal da sua proposta pode ser preguiçoso - ou eles podem estar passando por um momento difícil e não precisam de nada extra em suas vidas agora.

    
por 04.03.2018 / 22:36
fonte
8

O código deve ser escrito primeiramente para os seres humanos lerem, e apenas incidentalmente para o compilador analisar.

Agora, a coisa a ser lembrada sobre o TMP não trivial é que você está restringindo o número de pessoas que podem ler esse código, pode ser uma troca válida, mas eu diria que é muito mais uma troca razoável em bibliotecas e você tem uma pequena equipe especializada de especialistas, então está em uma aplicação maior.

Quando você retira todos os truques do livro, impõe custos a todos os outros, pois agora eles precisam entender o idioma, incluindo todos os casos jurídicos que você explorou. Você também impõe um custo na contratação em que você tem levantou a barra para trabalhar na aplicação de uma forma útil, agora talvez valha a pena, mas observe os custos ...

Para mim, um pouco mais de digitação, talvez até alguma duplicação de código, mas que eu possa colocar na frente do Mr "C com classes mais STL" quando precisar de modificação é muito mais útil que alguma coisa TMP incrivelmente elegante Eu posso manter (E, portanto, serei sempre mantendo). Lembre-se também que o cara C com classes pode ser o especialista no assunto, e esse conhecimento é geralmente muito mais valioso do que ser um advogado de idiomas.

Eu esqueci quem disse isso, mas "Todo mundo sabe que a depuração é mais difícil do que escrevê-la em primeiro lugar, então se você programá-la da forma mais inteligente possível, como você irá depurá-la?".

Mesmo se eu puder escrever realmente o C ++ moderno, eu geralmente prefiro não fazer isso, isso significa que eu tenho que fazer menos da programação de manutenção.

    
por 05.03.2018 / 16:37
fonte
7

Não, você não deveria. Você está empregado para produzir código que satisfaça uma especificação. Este código tem que ser sustentável, não uma viagem do ego. Você pode ser atropelado por um ônibus amanhã, então alguém tem que ser capaz de pegar seu código e progredir na tarefa em mãos. No entanto, é positivo tentar convencer seus empregadores a incorporar novas técnicas aos seus padrões de programação.

    
por 04.03.2018 / 17:49
fonte
2

A única maneira de responder a essa pergunta no contexto é examinar os problemas específicos e a maneira específica como você os resolveu com metaprogramação. A menos que você postar código aqui, não podemos saber se você se entregou a uma complicação desnecessária que é divertida para você, sozinho, "resolvendo" um problema inexistente; ou se você empregou todo o poder da linguagem para escrever uma solução simples e elegante que não está disponível por outros meios.

Se for este último, eu o encorajaria a continuar com sua equipe. Toda boa equipe deve fazer revisões de código significativas que discutam não apenas questões de estilo, mas também se a solução do programador usa a melhor abordagem, usa os recursos de linguagem apropriados, é sustentável e testável etc. Sua solução de metaprogramação deve preencher uma dessas sessões de revisão, provavelmente uma tarde inteira. Os programadores que rejeitam sua abordagem devem apresentar alternativas (como geração de código com perl, duplicação de código, etc.) e mostrar como ela se comporta de acordo com os critérios mencionados, em comparação à sua solução. Seu trabalho, como seu "oponente" amigável no argumento, é mostrar que é uma maneira de fazer o trabalho rapidamente, que a manutenção é fácil, que o teste é fácil e que o código é realmente legível quando você passa do obstáculo analisando a gramática engraçada. (Se você é estratégico, você pode mostrá-lo a um amigo no escritório antes e convencê-lo de que é muito legal; isso o ajudará na discussão porque você não estará sozinho.)

A maioria dos programadores é preguiçosa e gosta de soluções pequenas e elegantes. Se o seu é um, é provável que você possa convencê-los, especialmente se as alternativas demonstradas forem insuficientes.

    
por 06.03.2018 / 09:22
fonte
0

Não há uma única resposta correta para essa pergunta.

Porque a primeira coisa que você deve se perguntar é: em que situação você é colocado pelo seu emprego? Algumas pessoas são de fato empregadas como macacos codificados para codificar especificações, outras são empregadas como integrantes de equipes, outras são empregadas como profissionais especializados ou especialistas.

A única linha de fundo constante é que você precisa olhar para ele da perspectiva do seu empregador, uma vez que, essencialmente, isso significa ser um empregado. Às vezes é no melhor interesse do seu empregador, de fato, cutucar seus colegas para que se tornem melhores e dominem as técnicas avançadas. No entanto, em uma situação diferente, você pode criar muitos problemas e responsabilidades e colocar em risco o sucesso dos projetos em que está envolvido.

    
por 13.04.2018 / 02:25
fonte
-4
A questão não é realmente se a meta-programação é boa ou não, mas sim se é OK ser melhor que os outros membros da equipe, então aqui estão alguns pontos controversos sobre como eu vejo isso ... / p>

I recently moved to a new job where I am working in a larger team and this [meta-programming] worries some of my colleagues, because they do not comprehend it.

Eles estão preocupados que você é melhor do que eles. Isso é bom. Você vai ser o novo especialista. Você acabou de destruir o mundo do status quo.

I always try to leverage the full potential of the language, but some (not all) of my colleagues perceive that as a risk (some welcome the approach).

Claro, ninguém gosta de ser menos habilidoso do que ninguém, então eles estão tentando impedi-lo de usar técnicas que são complexas demais para eles. Eles não podem compreender ou não vão, porque se sentem seguros agora.

I agree it is a problem to write code that nobody else on the team can comprehend.

Eu não sei. Eu acho que está mostrando sua experiência.

My question is, who is right, what should I do?

Você deve usar todas as suas habilidades para escrever o melhor código que você pode escrever e não olhar para trás para aqueles que não o entendem. Caso contrário, você ficará preso ao nível deles e será apenas um codificador comum. É bom ser melhor que os outros, e é bom se esforçar para ser melhor que eles. Você nunca ganhará nenhuma experiência nova se não tentar usar nada novo ou fazer as coisas de maneira diferente.

Eu sei que vou ser downvoted, mas é assim que parece. Não é um crime ser melhor que outros no time, e não é um crime usar suas habilidades. É só que todo mundo tem medo de admitir isso ... porque eles estão do lado não-habilidoso e odeiam que o novo cara subitamente possa fazer algo que eles não podem. Se eles fossem espertos, pediriam ajuda e conselhos e não criticariam seu código por ser incompreensível.

EDITAR

Parece haver muita confusão sobre essa questão. Como os comentários mostram, muitas pessoas pensam que é sobre a legibilidade geral do código. Não, não é. É sobre se determinados recursos / construções de linguagem devem ser proibidos ou evitados porque alguns membros da equipe não os entendem.

Minha resposta é não . Eles não devem ser proibidos. Se você quer proibir algo, como você faria isso? Você teria que preparar algum tipo de questionário para descobrir o que os membros de sua equipe podem ou não - ou melhor, não querem aprender, pois acho que todos os recursos da linguagem são úteis em algum lugar, então conhecê-los e usá-los é sempre bom e quanto mais você souber o melhor código que você pode escrever. Você também precisa de uma escala para definir quais recursos são iniciantes, intermediários ou avançados.

Para demonstrar como essas restrições são bobas, vamos dar um exemplo muito simples: você será contratado como engenheiro de software, mas seu futuro chefe lhe dirá que você não poderá usar do/while loops porque são algumas pessoas da equipe que nunca as usaram antes e também não vão porque sempre usaram for loops para tudo, então acham do/while loops confusos.

Agora você acha que isso é estúpido e louco, não é? Mas também está proibindo outros recursos. Algumas pessoas podem usá-las e outras não querem aprendê-las.

Por que você deveria produzir um código pior se você sabe que há algo que lhe permite fazer o mesmo com muito menos esforço e, ainda assim, resultar em um código muito mais legível e robusto?

E não importa se você usa apenas recursos básicos de linguagem ou avançados, você pode usar qualquer um deles para produzir um código igualmente incompreensível e inatingível, então esse é um tópico totalmente diferente.

    
por 04.03.2018 / 12:51
fonte