Seções iMasters
Desenvolvimento

“Programador” é uma supergeneralização

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

Mensagem do anunciante:

Torne-se um Parceiro de Software Intel®. Filie-se ao Intel® Developer Zone. Intel®Developer Zone

Comente também

8 Comentários

Vinicius Serpa

Programador é supergeneralização, Analista de Sistemas também é.

Eu estava em uma reunião com quatro profissionais de áreas distintas (um gerente de ti, um gerente de melhoria contínua, um profissional da controladoria e um do administrativo) e todos estavam com um objetivo comum: todos estavam analisando sistemas. Cada um com um ponto de vista específico e para uma finalidade diferente mas todos estavam exercendo a mesma atividade de análise. Posso chamar todos de analistas de sistemas então? Todas as profissões analisam sistemas, sejam eles de informação, organizacional, fisiológico, mecãnico, elétrico, etc.

A área que eu trabalho convive com um problema de identidade. Cria-se nome diferente para tudo, o cliente muitas vezes não sabe nem o que contratar, mas o mercado não assume uma verdade: assim como existe a tecnologia mecânica, civil e elétrica e seus engenheiros, tecnólogos e técnicos, isso também deveria ocorrer com a tecnologia da informação.

Dessa forma ficaria mais simples: engenheiro conhece todo o ciclo de vida de um produto. Pode se tornar gerente de uma equipe, assim como pode se tornar um especialista em uma disciplina da engenharia de software (engenheiro de testes, engenheiro de front-end, engenheiro de implementação, etc). As outras engenharias já trabalham dessa forma, existe o engenheiro calculista, o engenheiro orçamentista, etc.

E essa abordagem também poderia resolver o problema com as áreas de atuação. Assim como um engenheiro mecânico com cinco anos de experiência na produção de um vaso de pressão pode não se dar bem com engenharia de autos, poderíamos assumir que um engenheiro web não necessariamente se daria bem com engenharia de IA (e vice-versa).

E essa questão vai esbarrar numa afirmação que muitos irão levantar: “o desenvolvimento de sistemas não é engenharia”. Eu penso que não é engenharia básica, tradicional, mas é sim uma nova engenharia, que trabalha de forma parecida com a antiga (entregando um bem de valor para um grupo de pessoas) mas com a questão de que os sistemas (tão complexos quanto da engenahria tradicional) são extremamente adaptativos (e aí entra a questão dos métodos ágeis).

Se não me falha a memória, na Inglaterra existe um curso de graduação de Engenharia de Software desde os anos 70. No Brasil isso só começou em 2009. As vagas anunciadas nos EUA geralmente contém os termos Engineer, Developer ou uma combinação de ambos. No Brasil ainda se mantém o Analista de Sistemas.

Bom, um dia chegamos lá.

    João Víctor Rocon Maia

    excelente observação!

    Guilherme Oderdenge

    Excelentíssima! Odeio a ciência da computação, e agora eu entendo mais o porquê.

Aurélio Saraiva

Muito bom esse artigo, parabéns!

Guilherme Oderdenge

“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.”

Esse final aí me deixou sem palavras.

Excelente artigo!

douglas

haha pode cree…

existem: programador PCP, programador CLP, programador de sistemas…

e provavalmente deva existir outros…

João Analista

Aplausos: Excelente artigo, explicação, abordagem e tudo mais. Se eu conhecesse o cara que escreveu o artigo original eu pagaria uma caixa de cerveja pra ele, pq merece. Sabe do que tá falando. Mais aplausos.

Junio Silva

Excelente artigo, penso que deveríamos ter algum tipo de representação profissional para que nossa área seja melhor classificada e valorizada.

Qual a sua opinião?