Skip to content

Instantly share code, notes, and snippets.

@vinicius73
Created November 22, 2016 12:26
Show Gist options
  • Save vinicius73/8d121301de6788528bf8a55e824caa97 to your computer and use it in GitHub Desktop.
Save vinicius73/8d121301de6788528bf8a55e824caa97 to your computer and use it in GitHub Desktop.
["LÓGICA DE PROGRAMAÇÃO" É BOBAGEM, e explicarei porquê.]

#["LÓGICA DE PROGRAMAÇÃO" É BOBAGEM, e explicarei porquê.]

Se preparem que o texto é longo.

Várias vezes chegam novatos aqui perguntando como começar, e a galera diz "estuda lógica primeiro, depois vai pra linguagem X". Vivo dizendo que é bobagem. Ontem, em particular, falei isso, e vieram várias pessoas por inbox me perguntar porquê (e uma pra me xingar, achando que falei por arrogância).

Pra facilitar, eu vou escrever uma boa explicação de porquê "lógica de programação" é furada, doa a quem doer, e postar na APDA e no fórum da EnergyLabs (para futuras referências, porque esse assunto vai voltar, ctz).

Primeiro... vamos para a definição. O que a galera chama de "lógica de programação"? Basicamente, um fluxo lógico de instruções para executar uma operação. Professores gostam de exemplificar isso como "a receita de um bolo". Mas na prática, o que isso significa?

Acabam sendo a sequência de ifs e whiles que vão te fazer um programa. Ou ao menos é isso que alguns pensam - erroneamente.

Por que isso é errado? Porque as pessoas assumem nisso uma linguagem imperativa (http://en.wikipedia.org/wiki/Imperative_programming). Alias, muitos dizem "se tu já sabe uma linguagem, aprende qualquer uma, porque é só lógica", o que é uma bobagem enorme.

Linguagens imperativas são linguagens que expressam uma lista de instruções para o programa, sequenciais. Exemplos não faltam: C, C++, Objective-C, Java, C#, Pascal, Delphi (Object Pascal), PHP, Ruby, Python, Perl, JavaScript, Lua, Fortran, Cobol, Smalltalk, Self, PL/SQL...

Talvez alguns não conheçam linguagens além dessas. E é verdade, se tu sabe C vai ser relativamente fácil aprender uma das outras. Mas nem todas as linguagens são imperativas.

O oposto, linguagens declarativas (http://en.wikipedia.org/wiki/Declarative_programming) não descreve como fazer algo, e sim o quê deve ser feito. Tem dois paradigmas que caem aí dentro: linguagens funcionais e linguagens lógicas.

Isso nos deixa, até agora, com três formas completamente diferentes de pensar, baseado em três paradigmas: imperativo, funcional e lógico.

Você pode saber todas as linguagens citadas acima. Vamos assumir que alguém sabe aquelas todas. Essa pessoa não teria facilidade em aprender uma linguagem funcional como Common Lisp, Scheme, Dylan, Clojure, Scala, F#, OCaml, SML, Haskell, Erlang...

Alguém pode pensar: "mas ninguém usa isso!". Estão muito errados - e cada vez mais e mais errados. Os nossos sistemas de telefonia são feitos quase inteiramentes em Erlang. Se você for trabalhar no Facebook, grandes chances de usar Haskell. Mas fica a dúvida pra quem ainda é novato na área: pra que servem?

Bom, servem pra resolver problemas, como linguagens imperativas (como C e Java). Mas por que elas não eram populares - e por que estão cada vez mais populares? Hora, Lisp foi uma das primeiras linguagens de programação, então linguagens funcionais não são coisas novas. Mas as Lisp Machines (processadores feitos pra trabalharem bem com Lisp) eram da antiga União Soviética, então a história ajuda aqui. As linguagens imperativas, especialmente C, parecem mais com o que os nossos processadores (na época, os processadores ocidentais) usam, parecem com assembly (que é imperativo). Logo, tornaram-se mais populares, embora não sejam mais novos.

As pessoas não gostam muito de linguagens funcionais, porque não conseguem entendê-las facilmente (porque estão acostumadas com o pensamento imperativo, com a "lógica de programação"), mas a recíproca também é verdadeira: já vi pessoas que aprenderam a programar com Haskell, que foi sua primeira linguagem, e essas acharam Java muito estranho, e tiveram dificuldade pra acostumar a forma de pensar.

Mas por que linguagens funcionais começaram a aparecerem de novo? Elas tem conceitos de dados imutáveis (não existem variáveis!) e funções puras (sem efeitos colaterais). Na prática, o problema é o paralelismo. É difícil escrever um programa em C ou Java (ou outras linguagens imperativas) para aproveitarem processadores multicore, ou vários processadores (manycore). E você precisa escrever explicitamente. Precisa dizer que quer rodar em vários cores. Linguagens funcionais, pelos motivos que citei no começo do parágrafo, podem seguramente serem paralelizadas pelo compilador. Então é fácil um código em Haskell rodar em 1, 4 ou 16 cores e ganhar muito desempenho com isso, enquanto com C é difícil conseguir isso. E sabemos que cada vez mais é vital esse paralelismo.

As pessoas costumam dizer "C é a linguagem mais rápida!", mas apenas comparando com outras linguagens imperativas. Haskell e Lisp conseguem ser tão rápidos quanto - as vezes até mais rápidos - que C!

Por exemplo: se eu fiz um programa em C, e quero fazê-lo rodar num cluster (computadores em rede, digamos, para um servidor web), eu preciso alterá-lo para funcionar lá. Se eu escrever em Haskell, eu não preciso alterá-lo. A linguagem já garante que isso pode acontecer. Não haverá deadlock porque não é necessário haverem locks (pra quem lembrar da aula de sistemas operacionais). Sem falar que linguagens funcionais são perfeitas pra inteligência artificial. Há linguagens imperativas projetadas para usar paralelismo, como Go, mas o programador tem que ser explícito, o programador precisa se preocupar com o paralelismo. Nas linguagens funcionais ele não precisa.

Mas a "lógica de programação" que o cara tirou tempo pra estudar é inútil em Haskell, pois você não pode pensar de forma imperativa, você precisa pensar de forma funcional. Não dá pra controlar a ordem de execução de funções.

Falei sobre o paradigma lógico. A única linguagem lógica que fez sucesso, que também é antiga (nasceu em 72, mesmo ano que a linguagem C - para comparação, JavaScript surgiu em 95), é a linguagem Prolog .

Mesmo que alguém fosse pica e soubesse todas as linguagens citadas anteriores, tanto imperativas quanto funcionais, o cara iria sofrer pra aprender Prolog! Por quê? Porque precisa pensar de uma forma diferente. Precisa usar a "lógica lógica" (em contrasta à lógica imperativa e à lógica funcional).

Prolog, por exemplo, é usada muito usada para interpretar linguagens naturais (humanas), para inteligência artificial, e vários outros usos. Mas, novamente, a "lógica de programação" que tanto falam se tornou inútil.

Existe também um outro paradigma, uma outra forma de pensar, que é menos comum, que seria dataflow. Esse conceito não tem variáveis, e as vezes não tem nem memória. Surgiu ofic com a linguagem SISAL (http://en.wikipedia.org/wiki/SISAL) em 83, mas é um conceito estabelecido em 66. Podem pensar que também não usam, mas esse paradigma é usado em linguagens de descrição de hardware, VHDL e Verilog (http://en.wikipedia.org/wiki/Hardware_description_language). Hoje em dia processadores (lá na Intel e AMD) não são desenhados, seria inviável, são programados com VHDL e/ou Verilog. Linguagens de dataflow, que precisam de uma forma de pensar bem diferente. Outro exemplo famoso é a linguagem Lucid.

Existem linguagens especiais, também. Um exemplo é a linguagem Forth (http://en.wikipedia.org/wi…/Forth_%28programming_language%29), de 1970 (repararam que todos os paradigmas surgiram mais ou menos ao mesmo tempo?). Novamente assumindo que alguém saiba todas as linguagens citadas ali em cima, o cara ainda ia apanhar um pouquinho pra manjar de Forth. A linguagem é concatenativa, baseada em stack. É muito interessante, realmente. Aos curiosos, recomendo.

Também temos as linguagens dependentemente tipadas, que são quase sempre funcionais. Elas são muito difíceis de se aprender! Quais seriam exemplos? Gallina (COQ), Idris, Agda, ATS... e qual a diferença? Ao invés de tipos como "int", temos conjuntos complexos, como "int de 10 até 100". É um conceito difícil de engolir - sofri pra entender. Mas pra que isso serve? Elas são usadas por provadores automáticos (proof assistants), e elas te garantem que seu programa pode ser 100% sem bugs. Para áreas aeroespaciais e médicas isso é importante. Fizeram um compilador com Gallina, chamado CompCert, um compilador de C que foi provado, matematicamente, a partir dos tipos dependentes, que não tem bugs, e não tem falhas. Isso pode ser muito valioso, e eu apostaria que essas linguagens se tornaram populares no futuro.

Então o conceito de "lógica de programação" é extremamente relativo e abstrato, e nem sequer deveria ser usado, especialmente isoladamente.

Então, aos novatos que estão lendo, gostariam de saber o que recomendo?

Sim, vocês tem que aprender a lógica imperativa, mesmo que talvez não trabalhem com isso sempre, com certeza terão que eventualmente trabalhar com ela. Mas aprendam com alguma linguagem. Eu recomendo, pra quem nunca programou na vida, começar com a linguagem Ruby (http://en.wikipedia.org/wiki/Ruby_%28programming_language%29). Foi com a qual comecei. Ela é imperativa e 100% orientada a objetos. Quem a usa aprende orientação a objetos sem perceber - no meu caso, quando eu li a definição de "orientação a objetos", eu pensei: "ahhhh, então é isso? Eu já sei fazer isso...". Ela é fácil até para crianças, e é bem intuitiva. Realmente recomendo.

Nunca comecem estudando fluxogramas, eles não vão te ajudar a entender nem a lógica imperativa. Programação se aprende apenas na prática, sinto muito. Muita, muita prática.

E para quem já sabe linguagens imperativas e quer saber como aprender a lógica funcional? Eu gostaria de recomendar Scala (http://en.wikipedia.org/wi…/Scala_%28programming_language%29). Scala é o "novo Ruby". É uma linguagem orientada a objetos que roda na JVM, então tem uma integração fácil com Java, e que pode ser tanto imperativa quanto funcional. Ela pode ajudar na transição.

Programação lógica não tem jeito, é Prolog na veia. Recomendo Prolog e Forth para os entusiastas.

Escrevi isso pois trabalho com compiladores e linguagens de programação - faz parte do meu trabalho saber essas coisas. Não quero ninguém achando que estou desmerecendo ninguém. Todos tem que aprender de alguma forma, algum dia. Ninguém nasce sabendo. Eu me esforcei pra saber dessas coisas, e trabalho com elas. Apenas quis deixar claro: "lógica de programação" é bobagem, pois não existem apenas linguagens imperativas. Talvez você, que está lendo e mandava as pessoas aprenderem "lógica de programação", trabalhe com Java e PHP, mas você não é todo mundo.

Enfim, gostaria de desejar boa sorte a todos que estão iniciando na informática, estão na faculdade, ou simplesmente gostam de aprender. Não percam a esperança. Eu também senti vontade de desistir e ir vender cachorro quente na esquina várias e várias vezes, é apenas natural. Confiem em si mesmos. :3

@terremoth
Copy link

Xará, o Paulo Torrens, que escreveu isso, é mestrando em Linguagens de Programação na área de compiladores, tem vínculo com a GNU, está escrevendo um compilador pra diversas linguagens, É também pesquisador na área de Linguagens de Programação e pelo que sei, atualmente começou a trabalhar num compilador de ADvPL da TOTVS.
Certamente ele sabe a diferença entre semântica e sintaxe de uma linguagem.

Ele escreveu esse post para leigos lerem, e por

"Mas a "lógica de programação" que o cara tirou tempo pra estudar é inútil em Haskell"

Ele quis dizer que não adianta vc aprender Java, Ruby, Python, C#, na hora de aprender Haskell vc irá pernar, pois o paradigma é diferente, e nada do que você aprendeu por "lógica de programação" nas outras linguagens vai funcionar em Haskell, sacou?

@wallyvianna
Copy link

Valeu Terremoth!
Quem quer conversar e chega chutando a porta, falando grosso em público, já perde em humildade (sem falar em credibilidade).

@luizorj
Copy link

luizorj commented Jan 3, 2018

Não te conhecia Paulo, sou novo na programação. Na verdade desenvolvo pra web a mais de 6 anos, mas nunca sai de HTML, CSS e PHP, e esse texto me deu uma "sede" de ir mais fundo neste universo. Você impacto uma pessoa com sucesso. Obrigado!

@levysantanna
Copy link

Pelo que sei Java tambem tem programação funcional no Java 8

@terremoth
Copy link

@levysantanna Pois é, Java implementou Lambda um pouco tarde, mas agora dá pra trabalhar de forma funcional!
O Paulo é uma das pessoas que fazem diferença no Brasil, todos podem encontrar o Paulo e cia no grupo da APDA no facebook,
Fora isso, tem o vídeo que ele fez na UDESC a respeito do tema

@a00s
Copy link

a00s commented Apr 8, 2018

Eh verdade. So lembrando que fluxograma, se ja sabe programa ajuda pra caramba quando a coisa comessam a complica. Eh que nem i pra escola e aprende matematica. Se tu nao sabe pra que serve, entra por um ouvido e sai pelo outro.Cara so aprende na pratica mesmo. Fica fazendo algoritmo sem enxerga o computador cuspindo o resultado realmente eh pouco didatico.

@arthurgeron
Copy link

A minha opinião é que as pessoas tendem a querer ver o uso direto e prático de um "módulo" da faculdade nos mais diversos cenários, que caso contrário é julgado como desnecessário (por exemplo algo que já ouvi muito: "Aprendi fluxogramas mas nunca precisei usar isso!"). As coisas não são bem por ai, as matérias que nos passam não tem a intenção de ser algo adaptado para todos os cenários mais atuais do mercado (até porque ele se expande e avança de forma exponencial, seria impossível para a grade de qualquer faculdade acompanhar), a intenção deles ao meu ver é plantar sementes, ensinar o aluno o básico para conseguir desenvolver a capacidade de resolver problemas em alguns cenários e, a partir disso estudar por conta e aprender a lidar com cenários mais diversos.

A gente esquece que muitas pessoas não entram na faculdade tendo aquele "dom" para entender um código ou visualizar uma solução, essas matérias tendem a servir de "receita de bolo" para as pessoas com maior dificuldade e de "semente" para as pessoas que já aprendem mais rápido.

Enfim, acho muito interessante sua colocação porém discordo completamente!

Abs

@sayhicoelho
Copy link

Dizer que "aprender lógica de programação é bobagem" é um equívoco. Dizer que a pessoa precisa "aprender lógica de programação antes de aprender QUALQUER linguagem" também é um equívoco.

Além do mais, minha opinião sobre seu texto é: "Não concordo nem discordo, muito pelo contrário".

@leonardovff
Copy link

Legal o texto. Achei o título meio clickbait, por que?
Pela definição do conceito de lógica de programação, ela realmente é tudo o que foi exposto no texto sobre os diferentes tipos e paradigmas, então dizer que lógica de programação é bobagem eu acho um equívoco.
Concordo plenamente que instruir uma pessoa novata a apenas aprender "lógica" antes é ruim, creio que esse foi o foco do texto. Acho que a melhor abordagem é realmente começar em um paradigma imperativo e colocando a mão na massa, mas aos poucos introduzir idéia da arquitetura de Von Neumann e Sistemas Operacionais.

@XCaminhante
Copy link

XCaminhante commented Sep 13, 2019

Se preparem que o texto é longo.

Não é.

Também temos as linguagens dependentemente tipadas, que são quase sempre funcionais. Elas são muito difíceis de se aprender!
... É um conceito difícil de engolir - sofri pra entender.

Pra mim parece muito natural e comum que a altura de um ser humano seja sempre um valor positivo entre 0 e 3 metros; não entendi o que foi tão difícil no seu aprendizado.

começar com a linguagem Ruby

Ruby eca!

Fora isso, concordo com o texto.

@Delfio
Copy link

Delfio commented Oct 12, 2019

Muito interessante seu ponto de vista! Descordo de algumas coisas mas é muito interessante.
Não liga para estes sem mentalidade que não entendem um ponto de vista, parabéns pela sua filosofia.

@ricardobrg
Copy link

Paulo Torrens vive! rs Dei fork no gist pra nunca mais perder esse texto... pensei que nunca mais o leria dps de ter saído do Facebook

@savi2w
Copy link

savi2w commented Mar 12, 2020

#TorrensVive

@anabastos
Copy link

de vez em quando volto nesse post glorioso

@RodrigoVazOliveira
Copy link

Lindo Post do Paulo, bons tempos de A.P.D.A.
ele deu um exemplo simples de linguagem 'diferente', mas poderia ser PROLOG.

@Camilotk
Copy link

Passando aqui para informar que faz 5 anos desse post e as pessoas ainda tão doidas com ele.

Well done my comrade. 🪖

@DevKiyoshit
Copy link

não entendo de programação, mas vc aprende lógica de programação se aprender lógica aristotelica ou lógica "normal". E inclusive, vai ajudar em várias outras áreas da vida.

@Kineforce
Copy link

Ponto de vista muito interessante!

@hails
Copy link

hails commented Dec 6, 2023

um classico

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment