Ambientes de desenvolvimento rápido suprimem os sintomas de impotência ao criar a ilusão de poder.
Corolário Weissmann sobre desenvolvimento
Aquela infindável discussão “minha linguagem de programação é melhor que a sua”, que nada mais é do que um reflexo de nossa infância “meu brinquedo é melhor que o seu”, devo confessar, sempre chamou minha atenção. Fico horas e horas me divertindo com estes tópicos. É quando me pergunto: uma linguagem de programação pode emburrecer um indivíduo? Cheguei a conclusão de que sim. E muito.
Quando fiz o curso de Filosofia, fiquei muito impressionado com o conceito de determinismo linguistico, ou seja, o fato de que a linguagem que usamos modela nosso pensamento. Alguns filósofos vão além. Wittgenstein, por exemplo, chega a afirmar (e eu concordo plenamente) que os limites do mundo (pode ser entendida aqui a percepção do mesmo) de um indivíduo correspondem aos limites de sua linguagem. Realmente, trata-se de um ponto válido visto que o mundo só recebe o nosso feedback a partir da nossa linguagem e vice-versa. Transmitimos ao mundo aquilo que captamos a seu respeito e em seguida processamos a partir de nossa linguagem.
E de onde vêm a nossa linguagem? Bem, esta é fruto do ambiente no qual estamos (ou seria algo intrínseco?). O ambiente influencia nossa linguagem. Há alguns exemplos hoje considerados banais, como o esquimó que consegue perceber n variações distintas do branco, que são refletidas em sua própria linguagem (há um nome para cada variação). Outro bom exemplo é o brasileiro: nós conhecemos diversos tipos de banana. Curiosamente, para um estrangeiro, todas as bananas são iguais. E nosso vocabulário expõe esta riqueza: banana nanica, caturra, etc.
O que me faz pensar na seguinte citação de Dijkstra: “the college pretending that learning BASIC suffices or at least helps, whereas the teaching of BASIC should be rated as a criminal offence: it mutilates the mind beyond recovery.“. No caso, esta frase foi dita na palestra “The threats to Computer Science”, que tratava do modo como a ciência da computação é ensinada nas faculdades. Aliás, atualmente há inclusive gente que usa um argumento bastante similar no que diz respeito ao Java.
A pergunta que se faz portanto é: pode uma linguagem de programação “mutilar” a mente de um desenvolvedor? Na minha opinião, sim. Em minha experiência, já vi diversos casos de desenvolvedores que criam coisas incrívelmente interessantes em Visual Basic mas não conseguem de modo algum sair desta linguagem. Até tentam aprender outras, mas sempre acabam voltando ao Visual Basic, o que justifica-se pelo fato de que trabalhar com algo com o qual já se está confortável é mais seguro.
Algo muito similar observo com Java. Visto a sua aplicação com sucesso em diversos ambientes distintos (móvel, desktop, web, etc.), muitas vezes o desenvolvedor fixa-se no Java e dele não sairá jamais. Assim como no caso do Visual Basic, trata-se novamente da mesma justificativa: “se já sei Java tão bem, por que me arriscar com outras linguagens ou ambientes?”. No caso do Visual Basic, a deficiência fica mais nítida pelo fato de ser uma linguagem ultrapassada. Neste sentido, quem programa em VB possui uma vantagem em relação a quem programa em Java. Há menos arrogância (“por que aprender outra coisa se Java já é uma linguagem de ‘ponta’?”), e portanto a necessidade de se aprender algo novo se torna mais nítido. Mas em ambos os casos, ambas as linhas de raciocínio levam em consideração apenas o medo de se tornar obsoletos tecnologicamente (mais especificamente, para o mercado), ignorando um problema que é ordens de magnitude mais sério: o determinismo linguistico.
O que nos leva a pensar no papel do desenvolvedor: espelhar/reproduzir/criar no ambiente computacional uma solução necessária no ambiente real. Ora, dado que, como já mencionei anteriormente, nosso mundo (percepção) é resultado de nossa linguagem, e as linguagens de programação são a nossa percepção do ambiente digital em que atuamos, o fato de conhecermos apenas uma linguagem de programação contribui para que nosso raciocínio criativo torne-se também limitado. Pior ainda se a única linguagem que conhecermos nos apresentar uma descrição limitada deste ambiente.
Focar-se em uma única linguagem consiste em ignorar o porquê de sua criação: resolver problemas presentes na época de sua introdução. São linguagens de uso geral? Sim, com certeza. Neste caso, não deveriam nos dar uma visão ampla? Com certeza, porém foi criada visando também superar algumas das limitações presentes em sua época de desenvolvimento. Se não fosse assim, existiria hoje provávelmente uma (no máximo duas) linguagem de programação. Logo, o argumento de que “aprender outra linguagem é trivial, pois só muda a sintaxe” mostra-se como falacioso.
Para ilustrar o raciocínio, irei expor de modo fenomenologico o desenvolvimento de um profissional fictício. Este profissional começará sua carreira com o Visual Basic 6, o que ilustra muito bem o comportamento que já observei com alguns profissionais. Escolhi o Visual Basic 6 só por se tratar de um ambiente de desenvolvimento rápido (outros poderiam entrar em seu lugar portanto).
Num primeiro estágio, todo software é composto por uma série de formulários a partir dos quais o usuário envia seus dados e então, através de uma série de eventos, faz o que deve fazer. Não há muita preocupação com módulos ou algo similar. Apenas com os eventos. O trabalho consiste basicamente em agrupar componentes em uma janela, incluir os eventos necessários, compilar a aplicação, entrega-la ao cliente e, conforme o tempo for passando, ir dando manutenção no produto final.Com o passar do tempo, a complexidade do software aumenta. Isto fica nítido a este profissional pelo número de formulários criados. São diversos, e em diversos momentos, ocorre a necessidade de se copiar código de um formulário para outro. Quando o uso do famigerado Control-C/Control-V começa a dar muito trabalho a este desenvolvedor, ele começa a perceber que programar realmente é algo “difícil”.
É quando o usuário passa para o segundo estágio. Surgem os famosos módulos. Neles é possível incluir todo aquele código que até então era copiado de um formulário para outro. Fantástico! Agora basta referenciar estes métodos nos formulários e pronto. O trabalho diminuiu.
O tempo passa e a aplicação continua crescendo. Desta vez, o cliente quer que o sistema se comunique com clientes externos. Já tenho módulos, o que facilita, no entanto, um novo paradigma surge. A web. Como a web funciona? O que devo fazer?
Neste exato momento, o profissional trava. Gastou tanto tempo pensando no desktop que ao se deparar com a web, pelo fato de sua linguagem favorita não lhe oferecer suporte fácil a este novo paradigma, simplesmente não sabe nem por onde começar. “Engenharia de software? Coisa pra gente besta. Há até alguns recursos no Visual Studio. Um tal de ASP… Lembra muito o VB. Será que eu uso ele? HTTP? Que é isto? Eu poderia também procurar algum componente que resolva meu problema…”
Chega-se a seguinte solução: “vou disponibilizar o banco de dados para eles. Assim, eles enviam seus dados aqui pra dentro de acordo com as regras que eu venha a definir e pronto. Problema solucionado. Sou um gênio!”
Lógicamente, a solução irá se mostrar um fracasso. É quando este profissional é expulso do segundo estágio de evolução e aprende outra linguagem de programação. No caso, Java.
Terceiro estágio: aprendendo Java. “Aprender Java é fácil, porque todas as linguagens são iguais. Só muda a sintaxe” pensa nosso pobre profissional. Ao iniciar seu trabalho com Java, a primeira coisa que procura saber é como são criados os formulários, e começa a achar a plataforma um lixo enquanto não encontrar um editor visual que lhe permita trabalhar assim como fazia no caso do Visual Basic. Quando finalmente o encontra, aí sim começa a trabalhar. Cria então algumas classes, lotadas de métodos estáticos. Estas classes “utilitárias” corresponderão para este usuário aos módulos com os quais estava habituado ao trabalhar com Visual Basic.
Algumas aplicações desktop são criadas, já é possível escrever no banco de dados, e tudo anda bem, até que o mesmo profissional percebe a necessidade de criar uma aplicação web. E é neste ponto que dá de cara com a parede de novo. Como não aprendeu orientação a objetos direito (no VB não havia isto. Haviam classes e tal, mas nunca entendeu ao certo para que serviam), não consegue entender como um servlet funciona. Consequentemente, não consegue aprender a trabalhar com outros frameworks. Diz que o Java é um lixo, que o bom mesmo era o VB, aonde conseguia fazer tudo de forma fácil, sem estas “frescuras”.
Repare na constante: como aprendeu a programar usando apenas um ambiente de desenvolvimento, sempre que ocorrer uma mudança, irá tentar trabalhar assim como fazia no ambiente inicial. Se o mesmo profissional, ao iniciar o seu trabalho, tivesse começado com duas ou mais linguagens, vamos supor: Visual Basic e C, ou qualquer outra, o mesmo não teria ocorrido.
Ao se acostumar com o ambiente visual, o programador passa a ignorar que por trás dos seus lindos formulários, há uma estrutura complexa que é preciso conhecer para que se possa progredir. Ambientes de desenvolvimento rápido como Visual Basic ou Delphi banalisam a nossa tarefa.
Curiosamente, se o profissional fictício acima tivesse começado sua carreira aprendendo apenas C, possuiria uma visão mais abrangente? Com certeza. Isto porque linguagens como o Visual Basic ou qualquer ambiente visual apenas suprimem os sintomas de impotência incluindo a ilusão de poder. Nosso programador fictício ao criar seus formulários se sentia incrívelmente podroso. Afinal de contas, estava criando algo realmente útil com apenas alguns cliques do mouse. No entanto, esta ilusão desaparece a partir do momento em que precisa interagir com algo mais complexo. No caso de quem começou usando C/C++ ou outra linguagem que não ofereça este tipo de ambiente, as coisas são mais difíceis no começo.
Este outro desenvolvedor possuirá a visão de baixo pra cima, ao contrário do primeiro. Consequentemente, ao evoluir, ficará mais simples para este compreender as camadas posteriores. Afinal de contas, são desenvolvidas com base naquela da qual está partindo, e não o contrário. Este outro desenvolvedor vê a sua percepção do ambiente digital evoluir conforme vai conhecendo estes novos frameworks ou bibliotecas.
Qual seria a solução portanto? Começar pelo assembler? Claro que não, mas pelo menos fugir dos ambientes de desenvolvimento rápido o máximo possível e, se possível, sempre conhecer pelo menos duas linguagens de programação distintas (melhor ainda: ao menos dois paradigmas). Isto quer dizer também que todos os ambientes de desenvolvimento rápido são um veneno terrível? Não! Só que devemos utilizá-los apenas após possuir uma base teórica/prática sólida sobre os fundamentos da computação.
(não vou chover no molhado e dizer “quanto mais linguagens aprendermos, melhor”, pois é óbvio demais)
No final das contas, não é a popularidade de uma linguagem que torna um profissional competente (COBOL tá aí pra provar isto), mas o modo como lida com o determinismo linguistico.
PS: outro bom exemplo de determinismo linguistico. Windows!
Aqueles que só usam Windows, acham comum os erros que o sistema apresentam, e jamais reclamam. No entanto, no dia em que passam a usar outro sistema, como o Linux ou Mac OS, nunca mais retornam ao mesmo. Isto porque sua linguagem cresceu (ele conhece mais de um sistema operacional) e, consequentemente, possui uma visão mais ampla do mundo.
Concordo, mas em partes. Como vc disse hj os programadores primam por ter uma IDE desde o início, o que é um grande erro.
Olha acho que faltou comentar sobre a teoria da evolução, pois assim como nossa linguagem (propriamente dita) sofre evoluções, para melhor ou pior , nossos mundo “informatiques” também.
Centa vez quando estava em uma reunião com um parceiro de negócio, falando sobre um sistema desenvolvido em Cobol, o parceiro falou, “.. sabe qual vai ser a linguagem que vai estar bombando no mercado daqui uns anos??… o Java.. ” bom fique com isso pra mim…depois de anos estudei Java e hoje já posso disser que tenho bons conhecimentos sobre tal. No entanto, passei por asp.net, php (estou atuante com projeto nessa linguagem) e Java (o ganha pão) , não torço o nariz para uma ou outra, serve tambêm para linux ou windows, o que importa para mim a necessidade do mercado. Levo comigo a teoria e pratica, conheça seu mundo ao redor e utilize o que tem de melhor.
Outro ponto, para adicionar nisso seria o aspecto cultural. Uma pessoal aprende a editar um texto no Word e não em um editor de texto qualquer, ela aprende a trabalhar com o Excel e não com uma planilha eletronica. Nosso programador fictício aprendeu VB, aprendeu asp.net.. mas não a real essência dos paradigmas da programação.
Pingback: /dev/Kico » Blog Archive » “Windows 2008 Server está fabuloso! Está igualzinho o Linux!” (ou por que software livre importa)
Pingback: Armadilhas para desenvolvedores (ou, o que o tornará mais um idiota) — /dev/Kico
Idéia interessante. Aprendam gnu/linux(Gnu-Debian, Slackware, Fedora…), freebsd, openbsd … e vejam a verdade no escrito abaixo.
Aqueles que só usam Windows, acham comum os erros que o sistema apresentam, e jamais reclamam. No entanto, no dia em que passam a usar outro sistema, como o Linux ou Mac OS, nunca mais retornam ao mesmo. Isto porque sua linguagem cresceu (ele conhece mais de um sistema operacional) e, consequentemente, possui uma visão mais ampla do mundo.
Se é ruim para o programador, imagine para o proprietário de um software que primeiro escreveu para Dos, depois reescreveu para Windows e agora tem que reescrever para web. kkkkkkk!
“Qual seria a solução portanto? Começar pelo assembler? Claro que não…”
Claro que sim! Afinal de contas são os “verdadeiros comandos” que um computador executa, certo? Sem contar que o programador se expõe à complexidade da máquina. Depois ele pode ir subindo nas abstracões de linguagem.
O problema desta sua abordagem é que se a gente for seguir a risca, iremos acabar tendo de aprender microeletrônica.
E como uma linguagem de médio nível como C já expõe o suficiente, acho que já da como um bom ponto de partida.
Claro que nao, uai? Depende muito do mercado em que você for se inserir, ora. Vale lembrar tb q não precisamos perder tempo com complicações que não farão a diferença em nossos futuros projetos! É diferente da observação feita sobre o determinismo linguístico aqui no artigo, pelo menos ao meu ver. Uma coisa é ficar limitado demais e achar que não está. Outra coisa é ficar indo pelo caminho mais difícil pra conseguir fazer a mesma coisa. Pra quê aprender monte de detalhes que não farão a diferença no seu mercado de trabalho.
cara, o problema nao eh esse
vc quando faz um curso de computacao decente (numa universidade que preste, n numa uni-esquina) estah formando a base para toda a sua carreira (30-40 anos seguintes)
claro q comecar pelo assembly seria suicidio, pois ai vc precisaria conhecer a plataforma com detalhes que somente conseguiria entender com alguns anos de curso
o ideal eh comecar pelo C puro, que eh uma linguagem com uns 40 anos de existencia, ainda em uso e simples o suficiente para se entender o que estah fazendo (diferente dos javas da vida, C nao esconde a magica)
eh q nem hj em dia vc achar desnecessario uma crianca aprender a tabuada nos primeiros anos escolares pq existem calculadoras e iSomething para “substituir”
Concordo com a observação. E sei disso por experiência própria. Já vi alguns programadores por aí que só se dão bem com este paradigma (ainda) porque “nunca precisam” progredir e melhorar o paradigma do sistema deles. Tem gente que nunca sai do clipper e pouco liga para os gargalos da linguagem, desde q o sistema realize a função mais importante. Esses caras vendem somente os mesmos programas de sempre para os mesmos clientes, que porventura, estão sempre reclamando de “defeitos mínimos”. IDE como os do Visual FoxPro, Visual Basic, Delphi e NetBeans, realmente banalisam nossa tarefa, suprimindo os sintomas de impotência e incluindo a ilusão de poder. Por isso o trabalho fica fácil no começo e difícil quando o progrmaador ganha experiência sobre complexidade e estruturação do sistema. Porém, como já fui programador Delphi, sei q a linguagem não é somente um IDE que banalisa a tarefa. O Object Pascal está lá e expande um monte de possibilidades desconhecidas pela maioria dos programadores Dephi. Não somos obrigados sequer a usar os formulários prontos, nada pronto, e sim, codificar tudo na unha (quando necessário). E muitos dos conceitos conhecidos ali na Object Pascal são reaproveitados em uma linguagem mais nova como Java.
Meu conselho é este: Você pode e deve usar um ambiente de desenvolvimento rápido como o IDE do VB, do Delphi ou NetBeans, poré, não deve se limitar às facilidades do IDE, mas procurar conhecer as formas alternativas e mais complexas dentro deste mesmo ambiente de desenvolvimento, o que podrá fazer a diferença quando precisar criar um sistema mais complexo.
Também concordo sobre SO Windows como outro bom exemplo de determinismo linguistico. Especialmente quando o usuário é um desenvolvedor de software. Para o usuário final acho que não faz muita diferença. Pois para estes, o Windows está bom enquanto houver os programas necessários rodando nele. Se assim não fosse, acho q o Windows já estaria enterrado.
Oi Junior, concordo com você. O ambiente também deve propiciar o aprimoramento do profissional.
Um outro bom exemplo é a linguagem PHP e a ferramenta de CMS JOOMLA. JOOMLA é feito em PHP e traz muito do que há de mais interessante na web prontinho, sem precisar ficar programando centenas de scripts. Tem gente que faz um trabalho danado em php, e tudo o que ele faz tem no JOOMLA e nem sequer fica melhor! Porém, o php possibilita ainda implementar idieas novas e criar soluções novas. Neste último caso, está quase impossível, pois o que foi colocado no JOOMLA provém de experiências e correções feitas com o php.
Pingback: Armadilhas para desenvolvedores (ou, o que o tornará mais um idiota) « Mundo do Programador
Uma analogia interessante, mas repleto de falácias. Cuidado com o que lêem.
Uai: que tal então enriquecer a discussão apontando-as? ;)
cara, aprender linguagens eh facil se o paradigma for o mesmo
nesse caso vira uma questao de apenas se habituar com a sintaxe (q tendem a manter um padrao dentro de um msm paradigma)
quanto ao exemplo q desse, nesse caso independente de se aprender com um ambiente cheio de facilidades, o estudante apresentaria as mesmas dificuldades, pois nao aprendeu a programar, e sim a “fazer umas coisinhas em basic”
eu msm, aprendi a programar em java no eclipse, mas aprendi a programar, nao a digitar codigos em java
quando precisei aprender C/C++, haskell ou assembly, tendo um ambiente mais amigavel ou simplesmente usando um editor de texto simples, nao tive tantas dificuldades
o problema que mts estudantes sofrem (acho q metade do cin, pra ser mais exato no chute) eh aprender a usar o eclipse, nao aprender a programar em orientacao a objetos com java, levando a casos de estudantes de 4 periodo que nao sabem diferenciar uma classe de uma instancia de um objeto…
Algum tempo atrás eu estava com a pulga atrás da orelha em relação ao
determinismo linguistico, mas o conhecia com outro nome:
http://en.wikipedia.org/wiki/Linguistic_relativity
Contudo, em ambos os artigos temos:
“Linguistic determinism is far from universally accepted”.
Não sei se o que você disse no artigo é realmente válido para as linguagens humanas. Mas concordo em relação à programação. Bom artigo. :)
Opa, valeu!
Assim, eu programei em VB usando WinAPI32, classes e modelava usando UML, comecei com isso em 94 por ai, o problema não é o VB, e sim, a preguiça de quem só quer mexer no trivial. Programo em Java há uns 11 anos, e vejo gente usando Java como se fosse VB, o problema é de quem usa, continua o mesmo problema do VB. A pré-disposição de se aprender algo, vai muito além do que se ensina em faculdades, cursos ou qualquer outro lugar, a culpa das coisas não serem utilizadas corretamente são das pessoas, que não querem sair da zona de conforto. VB era bastante produtivo embora limitado, mas resolvia coisas triviais. Java é bem melhor, mas eh como uma Ferrari na mão de um condutor de charretes, não adianta muita coisa.
Concordo parcialmente… É realmente um texto interessante, mas apenas começar aprendendo uma linguagem em um ambiente de desenvolvimento rápido não precisa, necessariamente, fechar a mente do desenvolvedor. Existem outras variáveis nesse sistema e uma delas é o próprio programador, que é um indivíduo racional. Cabe a ele ter coragem e determinação para conhecer e aprender outros paradigmas e outras linguagens de programação. =)
Oi Guilherme, concordo com você. Mas sabe o que eu observo?
Como as ferramentas RAD são de fato muito mais produtivas para executar tarefas básicas como criação de CRUDs, muitas vezes o sujeito ao ir para outros ambientes de desenvolvimento e sofrer o choque com a ausência do modo de trabalho com o qual estava acostumado E a pressão para manter a sua produtividade original o faz retroceder ao ambiente original. É uma realidade bastante triste, e, infelizmente, diz mais respeito ao ambiente corporativo do que ao próprio desenvolvedor.
Como o tempo passa, o sujeito vai criando resistência ao outro ambiente e, consequentemente, acaba se isolando.
PARABÉNS PELO TEXTO !!! MUDEI HJ ALGUNS CONCEITOS !!!
Boa Kiko! Muito interessante. Encontrei seu blog ontem e estou contente por ler assuntos tão interessantes. Obrigado.
Oi Arthur, que bom que tenho um novo leitor!
Fico feliz que tenha gostado, valeu!
Excelente abordagem, me fez refletir sobre muitos pontos. Parabéns!
Que bom que gostou e foi útil Julio, valeu!
Bah muito bom bom seu artigo, excelente ponto de vista. Tão inspirador que até me encoraja a expor meu humilde caminho de conhecimento que trilhei(e ainda trilho) em desenvolvimento de sistemas.
Eu aprendi a programar em C, tive noções de assembler, e uma boa base de PL/SQL, aprendi web inicialmente apenas com css,html e js, depois tive boas noções de php
(de forma procedural), então fui para o mundo OO com Java, e por último me dediquei fortemente para a web com o java e sua sopa de letrinhas(SERVLET/JSP/JPA/JSF/EJB…)
Hoje com minha experiencia de quatro anos programando profissionalmente, tenho a certeza que cada etapa teve sua importância em minha formação profissional e consciente que tenho muito trajeto para percorrer ainda. Por fim seu artigo me deixa no minimo contente com as decisões que tomei;)
Oi Tirq, obrigado, valeu! :)
Concordo plenamente, quando eu estava aprendendo C, eu me sentia um inutil, pensei em iniciar por outra linguagem mais facil diversas vezes…agora que já estou bem avançado em C, me sinto um Deus na computação.