O que significa escrever "bom código"? [fechadas]

41

Em esta questão perguntei se ser um mau dificulta escritor-lo de escrever código bom. Muitas das respostas iniciadas com "depende do que você quer dizer com bom código".

Parece que o termo "código bom" e "código incorreto" são muito subjetivos. Desde que eu tenho uma visão, pode ser muito diferente da visão dos outros sobre eles.

Então, o que significa escrever "bom código"? O que é "bom código"?

gablin
fonte
15
Um bom código é se você olhar para ele depois de dois anos e seu primeiro pensamento não for "Cara, wtf".
Bobby

Respostas:

91

Um bom codificador é como um bom jogador de sinuca.

Quando você vê um jogador profissional de sinuca, a princípio você não fica impressionado: "Claro, eles conseguiram todas as bolas, mas só tiveram chances fáceis!" Isso ocorre porque, quando um jogador de sinuca está fazendo seu arremesso, ela não pensa em qual bola entrará em qual bolso, ela também está pensando em onde a bola branca vai parar . A preparação para a próxima cena exige muita habilidade e prática, mas também significa que parece fácil.

Agora, trazendo essa metáfora para o código, um bom codificador escreve um código que parece fácil e direto de fazer . Muitos dos exemplos de Brian Kernighan em seus livros seguem esse padrão. Parte do "truque" é apresentar uma conceituação adequada do problema e sua solução . Quando não entendemos um problema suficientemente bem, é mais provável que complicemos demais nossas soluções e deixaremos de ver idéias unificadoras.

Com uma conceituação adequada do problema, você obtém tudo o mais: legibilidade, manutenção, eficiência e correção. Como a solução parece tão direta, provavelmente haverá menos comentários, porque uma explicação extra é desnecessária. Um bom codificador também pode ver a visão de longo prazo do produto e formar suas conceituações de acordo.

Macneil
fonte
10
"um bom codificador escreve um código que parece fácil e direto de fazer". << EXATAMENTE! Eu acho que isso ocorre porque as pessoas geralmente pensam que um bom codificador é alguém que pode escrever hacks muito "inteligentes". Se o código está limpo e não é "inteligente" demais, deve ser fácil, certo?
hasen
3
Meus 2 centavos: quando você tem uma linguagem com refatorações automáticas FÁCIL - Java e C # são os dois exemplos que eu conheço melhor - é fácil passar para um bom código iterativamente. Caso contrário, você deve conceituar bem, em primeiro lugar, mas há um tipo de problema com ovos de galinha lá.
precisa saber é o seguinte
3
Alguns algoritmos são intrinsecamente complexos. Um bom codificador não deve ter problemas para escrevê-los quando realmente são necessários - e mantê-los o mais legível possível.
precisa saber é o seguinte
2
@hasenj: sim, isso é devido a este lema: pessoas estúpidas escrevem código que o compilador entende. Pessoas inteligentes escrevem código que as pessoas estúpidas entendem.
v.oddou
49

WTF por minuto

( original )


EDIT: A idéia básica é que "Código de Qualidade" não pode ser colocado em regras, da mesma forma que você não pode colocar "Boa arte" ou "Boa poesia" em regras para permitir que um computador determine "Sim, boa arte" ou "Não, má poesia". Atualmente, a única maneira é ver quão facilmente é compreensível o código para outros seres humanos.


fonte
1
Temos este preso em nosso quadro no trabalho :-)
Ninguém
1
@Cape Cod Gunny Foi no livro um do Tio Bob também
mlvljr
2
Além de ser um ótimo desenho animado, acho que realmente chega ao ponto - bom código é um código que outras pessoas acham agradável de ler e manter.
FinnNk
1
É verdade que código bom é qualquer código que não seja ruim. Por exemplo, é difícil definir código bom, é mais fácil definir código ruim.
Ernelli
5
Normalmente, acho que aqueles "WTF?" Na boa reunião de códigos são seguidos por "Oooooh Ok ... entendo o que você fez".
AndrewKS
7

Realmente não há bons critérios além da rapidez com que você pode entender o código. Você faz com que seu código tenha uma boa aparência, encontrando o compromisso perfeito entre sucessão e legibilidade.

O "WTF por minuto" (acima) é verdadeiro, mas é apenas um corolário da regra mais geral. Quanto mais WTFs, mais lento será o entendimento.

mojuba
fonte
1
@rmx: definir "fazer o trabalho bem"
mojubá
2
Bem, que o RemoveCustomermétodo realmente remova o cutômero sem estragar. Você pode passar horas fazendo com que pareça bonito, mas isso não significa que realmente funcione. 'Quão rápido você consegue entender o código' não é o único critério para 'bom código' é o que estou dizendo.
Ninguém
2
@rmx: mas estar livre de bugs está implícito, não é? Se o seu código não executar o trabalho corretamente, ainda não é código.
Mjuba
4
@rmx: de fato, não. Se seu código é fácil de entender, então, em conclusão, é fácil entender se ele funciona mal. OTOH, se é difícil de entender, é difícil entender se ele faz o seu trabalho.
pillmuncher
2
@rmx: PS simplesmente, a sua redução () é um WTF clássica e, portanto, diminui a compreensão de partes do código onde essa função é usada
mojubá
5

Você sabe que escreve um bom código quando ...

  1. O cliente está feliz
  2. Colegas de trabalho emprestam seu código como ponto de partida
  3. Foi-lhe dito ao novato / a novinho para fazer modificações em um sistema que você construiu 6 meses atrás e ele / ela nunca fez uma pergunta a você uma vez
  4. Seu chefe pede que você desenvolva novos widgets para a equipe usar
  5. Você olha para o código que escreve hoje e diz para si mesmo "Eu gostaria de ter escrito código assim há dois anos"

Como você mede se o código é bom ...

  • Qual é o tempo de resposta?
  • Quantas viagens de ida e volta ao servidor ele faz?
  • Você usaria pessoalmente o aplicativo ou acha que é desajeitado?
  • Você construiria da mesma maneira da próxima vez?

Um bom código funciona quando deveria. Um bom código pode ser facilmente modificado quando necessário. Um bom código pode ser reutilizado para obter lucro.

Michael Riley - também conhecido por Gunny
fonte
2
"O cliente está feliz" é ortogonal a isso.
1
@TRA - Se o cliente está satisfeito, significa que você entendeu os requisitos e forneceu a solução que eles esperavam.
Michael Riley - AKA Gunny
6
código seguro, mas incorreto, pode fazer o mesmo.
4

Um código que é

  1. livre de erros

  2. reutilizável

  3. independente

  4. menos complexo

  5. bem documentado

  6. fácil de mudar

é chamado de bom código.

Um bom programa funciona perfeitamente e não possui bugs. Mas que qualidades internas produzem essa perfeição? Não é nenhum mistério, só precisamos de alguns lembretes ocasionais. Se você codifica em C / C ++, C #, Java, Basic, Perl, COBOL ou ASM, toda boa programação exibe as mesmas qualidades consagradas pelo tempo: simplicidade, legibilidade, modularidade, camadas, design, eficiência, elegância e clareza. e clareza

Fonte: MSDN

Chankey Pathak
fonte
Simplicidade, legibilidade, elegância e clareza são tudo a mesma coisa. Modularidade e camadas são apenas métodos para tornar seu código claro e elegante. A única coisa que resta na lista é a eficiência, o que é meio implícito e, além disso, muitas vezes é uma questão de compromisso entre eficiência e clareza.
Mjuba
Verifique isso: goo.gl/hdQt8
Chankey Pathak
2
O código pode estar livre de bugs?
Casey Patton
Não, não pode. (Praticamente)
Chankey Pathak
Eficiente deve ser adicionado à sua lista. A velocidade não é necessariamente um indicador primário de bom código, mas um bom código não deve ser desnecessariamente lento ou desperdiçador.
Caleb #
3

Isso parece familiar?

A Philips me deu a oportunidade de assistir ao design de um novo produto. À medida que se desenvolvia, fiquei cada vez mais desconfortável e comecei a confidenciar minhas preocupações ao meu supervisor. Eu repetidamente disse a ele que os desenhos não eram "limpos" e que deveriam ser "bonitos" da maneira que os desenhos de Dijkstra eram bonitos. Ele não achou esse comentário útil. Ele me lembrou que éramos engenheiros, não artistas. Em sua mente, eu estava simplesmente expressando meu gosto e ele queria saber qual critério eu estava usando para fazer meu julgamento. Eu não consegui contar a ele! Como não consegui explicar quais princípios estavam sendo violados, meus comentários foram simplesmente ignorados e o trabalho continuou. Sentindo que deve haver uma maneira de explicar e motivar meu "gosto", Comecei a tentar encontrar um princípio que distinguisse bons projetos dos maus. Engenheiros são muito pragmáticos; eles podem admirar a beleza, mas buscam utilidade. Tentei encontrar uma explicação de por que "beleza" era útil.

Por favor, veja o resto aqui .

mlvljr
fonte
1
Como o link na postagem de @ mlvljr está quebrado, aqui está um link para a página do Google Livros: books.google.co.in/…
balajeerc
@balajeerc Graças (Eu também fixou o link, para que ele aponta para uma versão Springer-hospedada do mesmo pdf) :)
mlvljr
1

além dos critérios de qualidade do código natural (mínimo de copiar / colar, sem esparguete etc.), um bom código industrial deve sempre parecer um pouco ingênuo, um pouco detalhado demais, como

int key = i;
const bool do_not_create = false;
Record r = cache.get(key, do_not_create);
++i;

em oposição a

Record r = cache.get(i++, false);
bobah
fonte
Mas do_not_create = falsesignifica "passar falsecomo do_not_createargumento para que ele seja criado" ou "passar falsecomo do_createargumento para que não seja criado"? Em um idioma em que você pode usar nomes de argumentos, eu preferiria cache.get (key:i, create: false); i += 1;.
PJTraill
1

Talvez uma resposta ilustrando o contrário ajudaria (além de ser uma desculpa para obter o XKCD aqui).

texto alternativo

Bom código é

  • simples de entender,
  • de fácil manutenção,
  • não tenta resolver todos os problemas, apenas o que está à mão
  • vive por um longo tempo sem fazer os desenvolvedores procurarem alternativas

Exemplos incluem

  • Apache Commons
  • Quadro de primavera
  • Estrutura de hibernação
Gary Rowe
fonte
1

Vou simplesmente ir com "mantenedor"

Todo o código deve ser mantido: não é necessário que essa tarefa seja mais difícil do que o necessário

Se algum leitor não entender esse requisito simples ou precisar que ele seja explicitado, esse leitor não deverá escrever código ...

gbn
fonte
1

O bom código será diferente para cada pessoa e o idioma com o qual eles estão trabalhando também afeta o que pode ser considerado um bom código. Geralmente, quando abordo um projeto, procuro o seguinte:

  • Como o projeto é organizado? Os arquivos de origem são organizados de maneira limpa e posso encontrar código sem muito esforço?
  • Como o código está organizado? Está claramente documentado o que o código do arquivo faz, como o uso de um cabeçalho de arquivo ou o uso de cada classe que reside em seu próprio arquivo? Existem funções no arquivo que não estão mais sendo usadas no aplicativo?
  • Como são organizadas as funções? Existe um padrão claro de onde as variáveis ​​são declaradas ou é um padrão bastante aleatório? O código possui um fluxo lógico e evita estruturas de controle desnecessárias? Tudo está claramente documentado, com o código sendo auto-documentado, onde necessário e os comentários expressando claramente o porquê e / ou como o que o código está fazendo?

Além de tudo isso, o design do aplicativo faz sentido como um todo? O código que reside no aplicativo pode ser o melhor do mundo, mas ainda pode ser difícil trabalhar se o design geral do aplicativo não fizer sentido.

rjzii
fonte
1

Permitam-me que discorde gentilmente da legibilidade. Não, não completamente: um bom código deve ser legível e isso pode ser facilmente alcançado com comentários suficientes.

Mas considero dois tipos de WTF: aqueles em que você se pergunta se o programador foi além da programação 101 e aqueles em que você absolutamente não entende a genialidade do código. Alguns códigos podem parecer muito estranhos no começo, mas na verdade são uma solução muito inventiva para um problema difícil. O segundo não deve contar no medidor WTF e pode ser evitado por comentários.

Código muito legível pode ser muito, muito lento. Uma solução menos legível pode proporcionar muitas melhorias na velocidade. R é um ótimo exemplo de uma linguagem em que isso geralmente é verdade. Gosta-se de evitar loops o máximo possível. Em geral, considero o código mais rápido o melhor, mesmo que seja menos legível. Ou seja, se a melhoria for substancial fora do curso e forem inseridos comentários suficientes para explicar o que o código faz.

Ainda mais, o gerenciamento de memória pode ser crucial em muitas aplicações científicas. Código que é muito legível, tende a ser meio desleixado no uso da memória: há apenas mais objetos criados. Em alguns casos, o uso inteligente da memória torna o código novamente menos legível. Mas se você manipular gigabytes de seqüências de DNA, por exemplo, a memória é um fator crucial. Novamente, considero o código menos intensivo em memória o melhor código, independentemente da legibilidade.

Então, sim, a legibilidade é importante para um bom código. Conheço o adágio de Uwe Liggis: pensar dói e computadores são baratos. Mas no meu campo (genômica estatística), os tempos computacionais de uma semana e o uso de memória acima de 40 Gb não são considerados anormais. Portanto, uma melhoria de duas vezes a velocidade e metade da memória vale muito mais do que esse pouco mais de legibilidade.

Joris Meys
fonte
Nenhuma regra / regras sem exceção
user2664856
1
Deixe-me discordar da sua discordância: você diz que em seu campo a velocidade é muito importante e diz que é mais importante que a legibilidade. Eu discordo, você deve se esforçar para usar o equilíbrio certo. Se a velocidade não for necessária, por exemplo, para uma interface de alto nível, você pode preferir algo fácil de manter, se a velocidade for necessária, eu concordo com você. Em vez de regras rígidas, é melhor usar o bom senso e você deve evitar a otimização prematura de qualquer maneira.
BlueTrin
@BlueTrin Por que os dois não compilam esses códigos fonte hi-perf e também documentam o que está acontecendo lá (ali nos comentários)?
31815 mlvljr
1

No que diz respeito a mim ... eu sei que estou escrevendo um bom código quando um colega de trabalho que trabalha em outro projeto aparece e é capaz de entender e entender o que estou fazendo sem que eu revise cada bloco de código e mostrando o que está fazendo.
Em vez de ele dizer: "Espere um minuto, o que ?!" Ele está dizendo: "Oh, ok, eu vejo o que você fez lá".

Um bom código também não possui muitas soluções alternativas ou 'hacks' furtivos. Linhas quando, enquanto você está escrevendo, também está dizendo a si mesmo: "Eu sei que essa não é uma boa maneira de fazer isso, mas só vou ter que fazer dessa maneira por enquanto. Vou lembrar para melhorá-lo mais tarde ... "

chiurox
fonte
1

Existem muitos recursos de código 'bom', mas o mais importante, IMHO, é a legibilidade e a manutenção.

Seu código irá conter bugs, irá provavelmente ser ampliado e re-utilizados, e deve estar em algum ponto consignado-re - mesmo que seja você re visitar-lo, as chances são que você não terá uma idéia do que o inferno você fez em primeiro lugar, fazer um favor a si mesmo e não colocar barreiras no caminho.

Claro, use esse algoritmo complexo, porém super eficiente, mas gaste um pouco de tempo extra para documentá-lo, mas, caso contrário, torne seu código claro e consistente.

cjmUK
fonte