Às vezes, os programadores intencionalmente complicam o código? [fechadas]

26

Parece muitas vezes no stackoverflow, que as pessoas (especialmente os programadores) tendem a complicar demais uma solução para um problema, onde a solução é muito mais complicada do que o problema original? Eu não sou um especialista de forma alguma, mas muitas vezes eu tento usar a solução mais simples que funciona (e obviamente isso não funciona EM TODA PARTE), mas tive um bom sucesso ao sugerir soluções simples no trabalho que as pessoas parecem ignorar para soluções MUITO mais complicadas?

Isso é algo normal para programadores ... ou simplesmente não estou pensando na perspectiva correta.

usuário
fonte
5
1. Sim, acho que às vezes. 2. Sim, pelo menos alguns programadores complicam demais seu código, pelo menos algumas vezes intencionalmente. 3. Casos encerrados.
3
Você já teve alguém gritando com você: "Você deveria ter pensado nisso!" quando você perdeu algum requisito que não foi declarado na coleta de requisitos inicial? É isso que pode levar alguns a tornar as coisas mais complexas do que o necessário.
JB King

Respostas:

18

Obviamente, alguns programadores estão ansiosos para mostrar o quão inteligentes são, criando um código escandalosamente complicado que ninguém consegue entender. Outros programadores estão disparando em um nível tão alto que a complicação nas soluções é uma evolução natural.

Um dos piores códigos que já vi foi um método que continha mais de 2000 linhas de código. Sem dúvida, esse código era complexo, mas também era muito ruim.

Eu acho que um bom programador evita código excessivamente complicado. Isso inclui evitar a tentação de forçar um padrão de design a se encaixar em uma solução que realmente não exige. Também inclui evitar objetos de Deus, botões mágicos, otimização prematura, generalização prematura e outros antipadrões.

Estou constantemente refatorando e procurando oportunidades para simplificar minhas soluções, porque o crescimento da complexidade é uma coisa orgânica. Como muitas outras coisas orgânicas, ele deve ser aparado e podado, se quisermos que continue sendo útil. Eu odeio ter que interagir com soluções excessivamente complicadas porque, com maior complexidade, aumenta a probabilidade de quebrar o código.

Penso que a legibilidade é o elemento mais importante da manutenção do código, e as soluções excessivamente complicadas quase sempre diminuem a legibilidade e aumentam os custos de manutenção.

Tim Claason
fonte
32

Eu já vi muitos códigos mais complexos do que precisavam e quase sempre por esses três motivos:

1) Engenharia excessiva devido à generalização prematura ou à tentativa de antecipar necessidades futuras que nunca surgiram

2) Os desenvolvedores queriam aprender / experimentar um novo padrão ou tecnologia de design que eles não usavam antes e colocá-lo em prática mesmo quando havia um exagero. Eles fazem isso porque isso torna seu trabalho mais interessante e eles aprendem algo novo.

3) Recursos e correções foram adicionados, mas o código existente não foi refatorado corretamente no momento. Pode ser apenas um pequeno pedaço de duplicação ou colocar outro argumento de flag em um método, mas tudo se soma. Efetivamente, hacks são adicionados e não demora muito para que tudo fique muito complicado devido a todo o cheiro do código. Este é o mais comum e geralmente devido ao desconhecimento ou pressão do tempo.

Alb
fonte
Eu sou culpado de # 2, eu temo. Com a experiência que agora tendem a abster-me embora ... e experimentar em casa em vez :) (e maturidade?)
Matthieu M.
Eu vejo as pessoas fazem 1 o tempo todo, eles acabam criando 5 vezes mais trabalho para si
Ally
11

É absolutamente uma coisa comum. Como a maioria dos livros diz, um bom desenvolvedor sabe como mantê-lo simples. É muito fácil complicar demais algo com uma nova tecnologia ou uma estrutura "legal" que você acabou de encontrar, para começar a procurar maneiras de usá-lo, em vez de pensar da perspectiva dos problemas.

Como Martin Fowler disse, aqueles que aprendem uma nova tecnologia têm um problema de curto prazo em que suas soluções direcionadas à "tecnologia".

Martin Blore
fonte
4
-1: Como a maioria dos livros diz, um bom desenvolvedor sabe como mantê-lo simples. - Você está absolutamente certo sobre isso. Mas então você sugeriu que o abuso de novas tecnologias é a maior causa de complicar demais o código. Você está errado sobre isso. Acredite, há muitos códigos complicados por aí que não têm nada a ver com o abuso de novas tecnologias.
Jim G.
Onde exatamente eu sugeri que essa é a "maior causa de códigos complicados demais"? Certamente é uma questão: "Ei, eu acabei de aprender o padrão X, onde posso aplicá-lo" - Patternitus. Você realmente colocou palavras na minha boca, Jim.
Martin Blore
4
"Fiz essa carta mais do que o habitual, apenas porque não tive tempo de encurtá-la". - Blaise Pascal Muito aplicável aqui também. "Complicado" geralmente é um sinal de codificação apressada, preguiçosa ou incompetente.
Bill
@ Bill O interessante é que é um bom argumento para um código mais complexo do ponto de vista comercial - se você recebe um valor fixo para implementar algo e leva mais tempo para refatorar ou reduzi-lo, a menos que você possa fazê-lo bem na primeira vez (quem pode?), há essencialmente uma penalidade por tornar seu código já em funcionamento menos complexo.
Michael
10

Não acho que seja normal para todos os programadores, mas definitivamente vi muitos programadores fazer isso.

Eu acho que algumas pessoas acreditam que algumas pessoas veem tornar algo realmente simples 'muito fácil', e que não é uma boa demonstração de suas habilidades. Portanto, eles precisam criar uma solução grande e complexa, que possa dizer 'veja o que eu posso fazer!', Mesmo que essa não seja a melhor solução para o problema em questão.

GSto
fonte
1
É assim que eu vejo. IE se é muito fácil, não vale a pena usar?
@ Mercfh Eu não entendo a vista. O que a facilidade de uma solução tem a ver com sua eficácia?
GSto
Eu estava comentando o comentário dele dizendo "Sim, eu concordo" que, às vezes, programadores pensam "Oh, se é muito simples, não é muito bom".
7

Vi programadores frequentemente escreverem várias linhas de código para realizar uma tarefa que eles não sabiam que já estava embutida na linguagem. Isso não é exatamente intencional, mas certamente pode ser evitado.

JD Isaacks
fonte
Eu vi programadores que escreveram um loop para cada cópia de string. Nunca usei uma chamada para uma função de biblioteca padrão. (O que é pior é as plataformas cópia foi otimizado para ler uma palavra de cada vez.)
BillThor
7

Depende do que você chama de "simples". Algumas pessoas veem o código altamente refatorado como mais "complexo" porque há mais código e vários gráficos de chamada. No entanto, esse código é mais "simples", pois é muito mais fácil fazer alterações.

Costumo achar que uma função grande parece "simples" até que você precise fazer alterações, depois fica complexa rapidamente.

Em outras palavras, simples está nos olhos de quem vê, em muitos casos.

Erik Funkenbusch
fonte
2
+1: muitos programadores não pensar nisso
Luca
5

O problema é que você não consegue ver claramente as soluções simples (é aqui que entram as discussões com os colegas) ou se você generaliza demais cedo demais.

Em outras palavras, você cria loops simples em funções avançadas da biblioteca porque pensa que que será necessário para o seu próximo projeto de qualquer maneira (exceto que não será desta forma exata). Faça isso por muito tempo e você terá um aplicativo imensamente complexo com um núcleo muito simples.

Você também pode achar que precisa ter um código muito robusto, e toda a robustez o torna complexo por padrão. Eu não acho que esse seja o seu problema, no entanto.

user1249
fonte
4

Em alguns casos, pode ser apenas a complexidade de encontrar uma solução limpa / simples.

Há uma citação que eu não consigo lembrar ou achar que vale algo sozinho, as linhas de "Código não está completo depois que você escreveu tudo o que precisa escrever, mas é concluído apenas quando você não tem mais nada a remover"

A falta de clareza dificulta a capacidade das pessoas de remover todo o excesso.

Stephen Bailey
fonte
4
Outra citação relevante é: "Eu teria escrito uma carta mais curta, mas não teria tempo".
user16764
3
“A perfeição é a perfeição para que você não tenha mais benefícios, mas você pode obter mais perfeição para retrancher.” (“Parece que a perfeição é alcançada não quando não há mais nada a acrescentar, mas quando não há mais nada a remover. ”) - Piloto, poeta e engenheiro francês Antoine Marie Roger Vicomte de Saint-Exupéry, 1939 (do livro Terre des Hommes ( Vento, Areia e Estrelas )).
Jörg W Mittag
Obrigado, parece que eu nunca soube a verdadeira origem :-) Legal.
Stephen Bailey
3

Os melhores engenheiros são os que conseguem resolver problemas realmente complicados e transformá-los em soluções fáceis de implementar e entender. Parece simples, mas não existem muitos engenheiros / desenvolvedores como esse. De fato, não existem muitas pessoas assim que existem. Na realidade, a maioria das pessoas lá fora faz exatamente o oposto. Eles pegam problemas simples e os complicam além do reconhecimento. Basta olhar para nossos políticos em busca de um exemplo de pessoas que conseguem resolver problemas simples e transformá-los em caos total. Programadores não são diferentes a esse respeito.

Dunk
fonte
3
Ai! Eu estava prestes a dar um +1, mas depois vi sua analogia com a política, e isso é fraco na melhor das hipóteses. // É verdade - há muita ofuscação, movimento desperdiçado, acenar com as mãos e interesses especiais incorporados na política e, como resultado, as contas podem ficar complicadas demais. Mas a complicação excessiva é um subproduto da ofuscação, movimento desperdiçado, acenar com a mão e interesses especiais. Não é uma causa raiz.
Jim G.
Seja qual for o motivo, existem soluções muito simples para muitos dos problemas do país, mas os políticos optam por torná-los mais difíceis do que precisam. Assumimos que isso se deva a dinheiro, poder ou votos, mas também acredito que se trata principalmente de recursos. Nesse caso, minha analogia é sólida.
Dunk
1
@JimG. Sim, eu concordo com você ... parece-me que muitos dos problemas com soluções políticas são políticos que alegam que existe uma solução fácil (deles!) Para um problema realmente complicado que realmente não tem uma solução fácil.
Michael
2

Pessoalmente, nunca tentei intencionalmente tornar um software mais complicado. No entanto, eu terminei algo e pensei "uau, isso é muito complicado" e voltei a ele e refatorado. Algumas pessoas podem ver isso e apenas pensam que funciona e é bom o suficiente e não o refatoram.

jmq
fonte
1

Um homem sábio teria dito que você deveria manter as coisas o mais simples possível, mas não mais simples. O mesmo pode se aplicar ao código. Às vezes, é necessário usar uma técnica que alguns consideram complexa (a recursão pode ser um bom exemplo, geralmente assusta os programadores juniores).

No entanto, em geral, acho que código complexo geralmente surge organicamente. Um problema simples é resolvido com um código simples, então o escopo se expande e o código é modificado sem muita reflexão. Com o tempo, você obtém um código que tenta cobrir o novo problema, mas foi realmente projetado para resolver um problema diferente. Torna-se uma colcha de retalhos de diferentes peças de lógica. Em geral, esse código pode parecer muito mais complexo do que o problema exige, mas ficou assim porque cada pequena alteração parecia, na época, a maneira mais fácil de fazer o código funcionar.

Eu não acho que a maioria dos desenvolvedores decidiu deliberadamente tornar o código complexo (embora você tenha uma ideia estranha de quem usará alguma técnica para provar sua própria habilidade), acho que o código fica assim se não for mantido e refatorado agressivamente .

Steve
fonte
É incrível como muitos sistemas começam com um núcleo realmente simples que quase se encaixa nos requisitos, mas fica aquém de muitas maneiras distintas, e acabam adicionando muitas complicações para lidar com muitas lacunas que poderiam ter sido evitadas com um design um pouco mais complicado. Considere o design simples dos tipos inteiros de C e algumas das regras bizarramente complexas que os acompanham. Se para cada tipo houvesse uma opção "isso deve ser promovido", isso duplicaria nominalmente o número de tipos (embora não seja realmente diferente de um qualificador como volatileetc.), mas ...
supercat
... teria facilitado bastante as regras de promoção / balanceamento. Um curto não assinado não promovível adicionado a um int promotável produziria um curto não assinado não promocional, com ou sem o shorttamanho de int. Um promotável unsigned shortadicionado a um promotável intproduziria um int. Adicionar itens assinados e não assinados do mesmo tamanho ou adicionar itens não promocionais de tamanhos diferentes seria um erro. Acrescente um pouco de complexidade logo no início, e as caixas de canto estranhas desaparecem.
Supercat
1

Outro motivo que ainda não foi levantado é que as pessoas podem complicar demais as soluções fornecidas para garantir que você precisará dos serviços deles posteriormente para dar suporte a essas soluções. Em outras palavras: para segurança no emprego.

quant_dev
fonte
Não sei por que isso foi prejudicado, eu me deparei com projetos extremamente grandes, codificados por um homem, que criou seu próprio framework, e era pago de hora em hora trabalhando exclusivamente nesse projeto. Se o empregador o irritasse, toda a linha de produtos seria ferrada. Levou meses para outro desenvolvedor entender completamente o código, enquanto o codificador "onisciente" levaria alguns minutos para atualizar sua bagunça de espaguete.
SSH Este
0

Talvez um problema de um erro clássico?

30. Desenvolvedor de revestimento de ouro.

Os desenvolvedores são fascinados por novas tecnologias e, às vezes, estão ansiosos para experimentar novos recursos de seu idioma ou ambiente ou para criar sua própria implementação de um recurso sofisticado que viram em outro produto - seja ou não exigido em seu produto. O esforço necessário para projetar, implementar, testar, documentar e dar suporte a recursos desnecessários aumenta o cronograma.

  • Steve McConnell, Desenvolvimento Rápido.
Camarão Crackers
fonte
0

Sim, às vezes complicamos demais o código para nos divertir. Principalmente, embora a percepção de que o código esteja sendo excessivamente complicado venha de um participante ignorante ou júnior do projeto.

P. Roe
fonte
1
-1 Os desenvolvedores seniores que culpam categoricamente os problemas pelos desenvolvedores juniores provavelmente não entendem as motivações para seu próprio trabalho ou o trabalho de outros. Se os desenvolvedores juniores tiverem dificuldade em seguir seu código, será muito complicado.
Brandon
Eu direi que se um desenvolvedor Jr achar o código impossível de entender, isso é um cheiro de código e pode ser que o código seja muito complicado, no entanto, você está usando muito para fazer uma escova aqui. Na verdade, esse cheiro de código pode existir apenas porque o desenvolvedor Jr precisa de ajuda para entender uma técnica avançada, não que a própria técnica seja a responsável.
P. Roe
-1

SIM ... e eu paguei o preço muitas vezes.

Meu quadro branco agora tem uma declaração em asteriscos no topo, que diz

"Se não é simples, não está certo"

... e sempre que protótipo de algo no quadro branco, sempre me chama a atenção.

Realmente funciona para mim porque meus projetos complexos se tornam muito mais simples, o que se traduz em código mais limpo.

Dal
fonte