É copiar e colar código perigoso? O control-c e o control-v devem ser tratados não como atalhos de teclado essenciais para a programação, mas como armas registradas?
(sim, eu sei que no OS X, o atalho de teclado para cortar e colar usa “crazy Tecla de símbolo Prince” em vez de controle, como Deus pretendia. Qualquer dissonância cognitiva que o senhor possa estar experimentando neste momento também é intencional).
Aqui está minha posição sobre copiar e colar para programadores:
Copiar e colar não cria código ruim. Programadores ruins criam códigos ruins.
Ou, se o senhor preferir, armas não matam pessoas, pessoas matar pessoas. Apenas certifique-se de que o código-fonte não esteja apontado para mim quando ele explodir. Sempre há riscos. Quando se copia e cola código, é necessário estar atento para garantir que o senhor (ou alguém com quem trabalha) não caia na armadilha de duplicação de código copiar e colar:
Sem dúvida, o motivo mais popular para criar uma rotina é evitar a duplicação de código. Código semelhante em duas rotinas é um sinal de alerta. David Parnaso diz que se o senhor usar copiar e colar enquanto estiver codificando, provavelmente está cometendo um erro de design. Em vez de copiar o código, mova-o para sua própria rotina. As modificações futuras serão mais fáceis porque o senhor precisará modificar o código em apenas um local. O código será mais confiável porque o senhor terá apenas um local para se certificar de que o código está correto.
Alguns programadores concordam com Parnaso, chegando ao ponto de defender a desativação total do recurso de cortar e colar. Acho que isso é um pouco extremo. Eu uso copiar e colar durante a programação o tempo todo, mas o nunca de uma forma que vá contra o Lei de Curly.
Mas a Internet de alta velocidade generalizada e toda uma nova geração de jovens programadores hiperconectados, criados na Web, mudaram a dinâmica da programação. Copiar e colar não é mais um termo pejorativo, mas uma simples observação sobre como grande parte da codificação moderna é feita, gostemos ou não. Essa nova dinâmica foi codificada em lei como Oitava regra de reutilização de código de Bambrick:
É muito mais fácil e muito menos trabalhoso encontrar e usar um trecho de código mal implementado e cheio de bugs escrito por um blogueiro de 13 anos do outro lado do mundo do que encontrar e usar um trecho de código equivalente escrito pelo líder da sua equipe do outro lado da divisória de um cubículo.
(E eu acho que o a escola de copiar e colar da reutilização de código está florescendo e sempre florescerá, mesmo que dê resultados muito abaixo do ideal).
Por Sr. Bambrick, o código copiado e colado da Internet é bom porque:
- O código armazenado em blogs, fóruns e na Web em geral é muito fácil de encontrar.
- O senhor pode inspecionar o código antes de usá-lo.
- Os comentários em blogs fornecem um pequeno nível de feedback que pode melhorar a qualidade.
- Pagerank significa que o senhor tem mais chances de encontrar códigos que podem ser de melhor qualidade.
- O código que é fácil de ler e entender será mais copiado e colado, levando a uma espécie de dominância reprodutiva viral.
- O ego do programador pode levá-lo a publicar apenas o código que ele acredita ser de qualidade suficiente.
Mas o código copiado e colado da Internet é ruim porque:
- Se o autor melhorar o código, é provável que o senhor não obtenha esses benefícios.
- Se o senhor melhorar o código, não é provável que passe essas melhorias de volta para o autor.
- O código pode ser copiado e colado às cegas, sem que o senhor entenda o que o código realmente faz.
- O Pagerank não trata da qualidade do código ou de sua adequação ao seu propósito.
- O código geralmente é um “código de demonstração” e pode propositalmente ignorar questões importantes, como tratamento de erros, injeção de sql, codificação, segurança etc.
Agora, se o senhor estiver copiando projetos inteiros ou grupos de arquivos, deverá herdar esse código de um projeto que já esteja sob controle de origem adequado. Isso é apenas engenharia de software básica (esperamos). Mas o tipo de código que provavelmente vou cortar e colar não é projetos ou arquivos inteiros. Provavelmente é um trecho de código — um algoritmo, uma rotina, uma página de código ou talvez um punhado de funções. Há vários serviços de compartilhamento de trechos de código estabelecidos:
O controle de código-fonte é ótimo, mas é um exagero enorme para, digamos, este pequeno trecho de animação Objective-C:
- (void)fadeOutWindow:(NSWindow*)window{ float alpha = 1.0; [window setAlphaValue:alpha]; [window makeKeyAndOrderFront:self]; for (int x = 0; x < 10; x++) { alpha -= 0.1; [window setAlphaValue:alpha]; [NSThread sleepForTimeInterval:0.020]; } }
Para mim, a limitação mais preocupante do programação de copypasta é a completa desconexão entre o código que o senhor colou e todas as outras cópias virais dele na Web. É impossível localizar novas versões do snippet ou incluir seus recursos e correções de bugs novamente no snippet original. O senhor também não pode esperar encontrar todos os outros cantos e recantos do código em todo o mundo em que esse snippet se infiltrou.
O que proponho é o seguinte:
// codesnippet:1c125546-b87c-49ff-8130-a24a3deda659
- (void)fadeOutWindow:(NSWindow*)window{
// code
}
}
Anexar uma convenção de comentários de uma linha com um novo GUID para qualquer trecho de código que o senhor publicar na Web. Isso vincula o trecho de código ao seu autor e a todos os clones subsequentes. Uma pesquisa trivial do GUID do trecho de código identificaria todas as outras cópias do trecho na Web:
http://www.google.com/search?q=1c125546-b87c-49ff-8130-a24a3deda659
Sei que o que estou propondo, por mais simples que seja, ainda pode ser um requisito oneroso para programadores que copiam e colam. Eles estão ocupados demais copiando e colando para se preocupar com convenções bobas! Em vez disso, imagine os serviços centralizados de compartilhamento de trechos de código aplicando automaticamente um comentário GUID de snippet a cada snippet que compartilham. Se o fizessem, essa convenção poderia ganhar força praticamente da noite para o dia. E por que não? Estamos apenas seguindo a bela tradição de engenharia de software da fazer a coisa mais estúpida que poderia funcionar.
Não, esse não é um sistema perfeito, de forma alguma. Por um lado, as variantes e os aprimoramentos do código provavelmente precisariam de seu próprio GUID de snippet, idealmente adicionando uma segunda linha para indicar o snippet pai do qual foram derivados. E o que o senhor faz quando combina snippets com seu próprio código ou mescla snippets? Mas também não vamos pensar demais nisso. Essa é uma melhoria simples e facilmente implementável em relação ao que temos agora: um caos total de código de copiar e colar.
Às vezes, códigos pequenos exigem soluções pequenas.