Cuidado com bugs no código acima; eu só provei que ele está correto, não testei – Donald Knuth
Recentemente, eu me deparei com um artigo, durante uma sessão de google-fu, que afirmava que ninguém deveria usar a função make_heap da biblioteca padrão do C++, porque quase ninguém a utiliza corretamente. Eu imediatamente comecei a classificar mentalmente sobre o quão ridícula é essa afirmação, pois qualquer um que tenha feito uma aula de algoritmo básico saberia como usar apropriadamente o make_heap. Então eu comecei a pensar em todos os programadores que não sabem o que é um heap e, mais do que isso, provavelmente nem precisem saber.
Então eu percebi que ambos os grupos ainda são chamados programadores.
Quando eu era um pequeno rapaz, foram-me dados muitos maus conselhos sobre técnicas adequadas de programação. Com o passar dos anos, tenho observado que a maioria dos conselhos não se tratava necessariamente de maus conselhos, mas sim que eles estavam sendo dados fora de contexto. A onda atual de startups tem surtido um efeito interessante de fazer com que muitos hackers se deem conta de que “desempenho não importa” é um pedaço de conselho enigmático com ressalvas e contextos sutis, principalmente quando lidam com arquiteturas complexas que podem interagir de diferentes formas. Embora esse efeito de telefone sem fio decorrente da falta de contexto seja um problema generalizado por si só, na realidade ele é simplesmente um sintoma de um problema ainda mais profundo.
A palavra programador cobre um espectro enorme de níveis de habilidades e talentos. No eixo vertical, os programadores poderiam mal saber como utilizar vbscript, ou eles poderiam estar escrevendo compiladores para a Intel e desenvolvendo softwares de computação científica para empresas de aviação. No eixo horizontal, eles poderiam ser experts em banco de dados, ou estar eliminando desempenho de uma GPU, ou construindo bibliotecas de processamento paralelo, ou fazendo motores de física, ou fazendo processamento de imagem, ou gerando modelos 3D, ou escrevendo drivers de impressoras, ou usando coffeescript, HTML5 e AJAX para construir aplicações web, ou usando nginx e PHP para escrever uma pilha LAMP na qual a aplicação web está baseada, ou talvez eles estejam escrevendo bibliotecas de networking ou fazendo pesquisas em inteligência artificial. Eles são todos programadores.
Isso é loucura.
Nosso mundo está sendo consumido por software. No futuro, programação será um curso básico ao lado de leitura e matemática. Você terá quatro bases – Leitura, Escrita, Matemática e Recursão. Dizer que alguém é programador se tornará sem sentido, já que 10% ou mais da população serão um programador em algum nível. A palavra “programador” tem tantos possíveis significados, que é como chamar você mesmo de cientista em vez de físico.
No entanto, que outras opções nós temos? A única tentativa atual de se consertar isso se resumiria em reles três opções (desenvolvedor, programador e cientista da computação), que são simplesmente incapazes de cobrir as diferenças entre mim e alguém que graduou em uma universidade com PhD em inteligência artificial. Eles fazem análises matemáticas multidimensionais e avaliações utilizando linguagens funcionais as quais eu nunca vou entender sem anos de pesquisa. Eu deveria escrever incrivelmente rápido um código C++ inteligente em HLSL assembly enquanto faço malabarismos com matrizes de transformação complexa para desenhar figuras bonitas na tela. Esses dois trabalhos são extremamente difíceis por razões completamente diferentes, e uma pessoa não pode fazer o trabalho da outra. O que é uma boa prática para um é uma aberração para o outro. Nós somos ambos programadores. Mesmo dentro do nosso campo, nós somos simplesmente programadores gráficos ou programadores de IA ou programadores [x].
Você sabe por que nós temos guerras inúteis de linguagem, e discussões sem sentido sobre o que é bom na prática? Você sabe por que ninguém nunca chega a um consenso sobre esses pontos de vista, exceto em certos círculos nos quais “prática” significa a mesma coisa para todos? Porque nós estamos supergeneralizando nós mesmos. Nós nos vemos como um grupo de programadores que se especializou em certas coisas, e estamos cometendo o erro de pensar que nosso ponto de vista se aplica fora da nossa área de especialização. Nós somos engenheiros industriais tentando dizer a químicos como realizar seus experimentos. Somos arquitetos tentando dizer a profissionais do inglês como escrever um artigo, já que ambos usamos muito papel.
Essa atitude está profundamente enraizada no núcleo da ciência da computação. O ponto principal da ciência da computação é que um monte de estruturas de dados básicas pode fazer tudo que você um dia precisará fazer. É um engano tentar isso e estender para programação em geral, porque isso é simplesmente falso. Nós estamos esquecendo que essas estruturas de dados só fazem tudo que precisamos fazer na terra mágica e perfeita da matemática, e ignoramos todas as diferentes implementações que são construídas para diferentes áreas da programação, para usos completamente diferentes. Donald Knuth entendeu a diferença entre teoria e implementação – nós deveríamos nos esforçar para reconhecer a diferença entre um conselho teórico e um específico para implementação.
Não é mais suficiente simplesmente perguntar a uma pessoa se ela é programadora. Dizer que um programador escreve programas é como dizer que um cientista faz ciência. A diferença é que botânicos não concebem reatores nucleares.
?
Texto original disponível em http://blackhole12.blogspot.com/2012/02/programmers-are-overgeneralized.html
8 Comentários
Qual a sua opinião?