Executando verificação de segurança...
9

Uma conversa fiada sobre "linguagens bonitas"

Nos últimos anos, eu tenho me interessado bastante por Data Science, e por consequência, por Python.

Foi o meu primeiro contato com uma linguaguem dita "moderna". Eu amei a praticidade.

Amei a forma como você sai encadeando funções e resolvendo tudo em poucas linhas. Amei coisas como map, reduce, set... Me apaixonei por Python.

Mas, por conta dos trabalhos do meu último ano de facul, fui obrigado a aprender Java, coisa que eu ja vinha procrastinando há anos.

No início, preconceito puro. "Java é verbosa". "Um código de 5 linhas vira um código de 20 linhas em Java...".

Mas, um mês após estar mergulhado na linguagem... QUE LINGUAGEM BONITA! É o estado da arte quando o assunto é POO.

Minha esposa, que começou a aprender front-end no ano passado, leu um código meu em Java e ficou impressionada sobre como é fácil entender o que está acontecendo ali. Realmente...

E ainda, pra finalizar a conversa fiada, lembro dos meus primeiros dias em C, há mais de 10 anos. Sofri pakas para aprender, mas QUE LINGUAGEM BONITA, TAMBÉM!

Se, em Java, você tem clareza sobre o que está acontecendo a nível de negócio, em C, você tem clareza sobre o que está acontecendo em nível computacional.

Há alguns dias, eu estava revisitando aquele famoso livro "C Completo e Total" e estava me deliciando com as "soluções sem filtro" da Linguagem C.

E vocês? Tem essas pirações, também? Quais são as linguagens que vocês acham bonitas, e por que?

Carregando publicação patrocinada...
4

Eu fiz o caminho inverso: depois de muito tempo trabalhando em Java (até hoje), tem hora que toda aquela verbosidade cansa. É verdade que nas versões mais novas tem melhorado muito, mas ainda sim, parece que está chegando a um limite.

Então quando comecei a estudar Python mais a fundo, gostei bastante. Claro que a quantidade de linhas não é - ou não deveria ser - critério para definir qualidade, mas é incrível como algumas coisas são tão mais simples de fazer. Java tem um legado que impede que muitas dessas coisas sejam feitas de forma simples (às vezes acho que eles levam a questão da retro-compatibilidade mais a sério do que deveria), e muitas coisas ficam mais "feias" do que em outras linguagens (lembrando sempre que "feio" e "bonito" é muito subjetivo).


Mas falando de forma geral, eu não acho que linguagens em si são "bonitas" ou "feias". Feio é código mal escrito, ineficiente, cheio de gambiarra, que faz as coisas de um jeito mais complicado do que deveria (talvez pra "parecer inteligente"), ou de um jeito mais confuso só pra "economizar linhas". É possível fazer código bonito e feio em qualquer linguagem.

3

É, como você mesmo reconhece, beleza é uma conversa fiada. Até agradável como essas conversas costumam ser. Beleza é algo bem subjetivo, todo mundo pode achar o que quiser.

Eu jamais diria que Java é bonita, é das menos bonitas entre as mainstream, e é fraca em termos de orientação a objeto por qualquer critério que adote. Não é péssima.

Eu gosto de C, mas bonita? Ela é inteligente demais, mas bonita eu não diria. E boa parte dos programadores gostam de fazer códigos muito feios, parece que é competição.

Clareza só o programador consegue obter. Em negócio isso é quase 100%. Em computação C ajuda um pouco sim. Mas pode não ajudar nas mãos de alguns programadores.

Ah, o C Completo e Total...Já falei dele aqui. Leia toda a thread.

Eu gosto muito de linguagens, especialmente de sintaxe, mesmo sabendo que isso é menos relevante. Logo depois de começar a mexer com isso há 40 anos, por causa de joguinhos, me apaixonei por linguagens, e fiz um pseudo compilador de BASIC em BASIC em uma máquina de 16KB de memória sem IO ou storage ativo. Era bem ruim, mas era o que eu conseguia fazer na época. Não tinha, internet, cursos, pessoas para perguntar, até mesmo livros era complicado de achar (importação deles era essencialmente proibida pela ditadura militar).

Eu gosto da sintaxe de F#, mas sei que ela é estranha para alguns. Citando algo para sair do lugar comum. Pra mim bonita está intimamente ligado a ser expressivo, sem cerimônia desnecessária, que a linguagem trabalhe por você.

Python tem seu charme, mas toda linguagem que começa ter gambiarras, muita gente mete a mão, começa perder o rumo um pouco. Eu gostava da brasileira Boo que é meio C# com Python.

Em termos de beleza e até alguma inteligência em certos pontos JavaScript é bem interessante, mas o monte de decisões erradas em semântica, e a maneira como começaram usá-la começando por fazer aplicações em linguagem de script é raro eu ver um código nela que eu ache bonito mais.

Me lembro de uma linguagem que um francês estava criando que tinha uma coisa bem bonitas, pena que nunca saiu do papel, chama-se Merd. É sério.

Essa coisa de ter muitas linhas não é a questão principal, porque se é importante, tudo que quiser pode sair de muitas linhas para uma, basta a pessoa saber fazer as abstrações. Mas dá trabalho fazer isso em algumas linguagens, e em alguns casos não é a quantidade de linhas, é todo o código que fica menos expressivo, e aí discordo que Java deixa claro do ponto de vista de negócio, ela não é capaz de fazer certas abstrações. Kotlin é bem mais bonita que Java.

Obrigado pela oportunidade.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

2

"C Completo e Total" é aquilo que todos nós sabemos que ele é. Quem é das antigas, lembra bem.

Eu só o citei porque realmente foi ele quem me fez lembrar da linguagem C, que estava esquecida por mim há anos.

E sobre Kotlin, ainda nao conheço.

E sim, tudo isso é uma conversa fiada. Mas, de conversa fiada tambem se vive (desde que vc não esqueça que não passa de comversa fiada. Ou entao vc vira fanboy de linguagem, ai ja era...)

2

Python tem seu charme, mas toda linguagem que começa ter gambiarras, muita gente mete a mão, começa perder o rumo um pouco.

Concordo 100%. Como geralmente são linguagens de uso geral e a comunidade pode pedir qualquer coisa vão implementando coisas sem cabimento. As vezes fica mais difícil de ler um código com 10 linhas do que um com duas linhas por algo que implementaram só para poder dizer "minha linguagem também tem". No caso de Python, implementaram o walrus operator para escrever um pouco menos de código. Faz todo o sentido em Icon (uma das lingaugens em que Python foi baseada), Unicon, Verse mas em Python? Ruby tem o flip-flop. Será que é usado?

Eu gosto muito de linguagens, especialmente de sintaxe, mesmo sabendo que isso é menos relevante.

Eu acho que a sintaxe e semântica são relevantes para deixar a linguagem bonita ou não, além de outras coisas. Quanto menos pontuação para agradar o compilador melhor (eu acho). Como ler um livro. Um exemplo de Red (REBOL) para ler a página do tabnews e imprimir o título

Red[]

text:  read https://www.tabnews.com.br
rules: [thru <title> copy titulo to </title>]

parse text rules

print titulo

o resultado é:

TabNews: Conteúdos para quem trabalha com Programação e Tecnologia
  • read lê de uma porta, arquivo, url, bloco, etc..
  • regras é como se fosse ER só que legível e integrada na linguagem. thru exp = procura por exp e coloca o ponteiro logo após; copy local to exp vai copiar o conteúdo localizado na posição do ponteiro até encontrar exp. Mais verboso que ER? Sim. Mas mais legível.
1

Então vou concordar 100%, com uma parte :D

Todas as linguagens mais conhecidas estão colocando coisas para competir no mercado, mesmo que não faça sentido. Algumas mais que outras, algumas fazem pelo menos do jeito certo, outras implementam errado pela pressa ou porque os mantenedores não entendem muito bem o que estão fazendo. Não vou citar nomes porque os fás das linguagens que mais fazem coisas erradas são os mais ferozes :D

Não que eu seja contra qualquer novidade que ajude, mas nem sempe ajuda. Até porque muitas vezes o legado impede fazer do jeito certo.

Tem linguagens que virou frankestein, não sabe se quer ser dinãmica ou estática, se quer ser de script ou enterprise, se quer descer um pouco o nível ou ficar mais acima, e assim por diante.

Quando a linguagem dá muita margem para ambiguidade para o programador ler ou o compilador saber o que fazer pode começar se tornar um problema, é o ponto onde o que é mais bonito pode trazer problemas.

2

legal a menção a F#, gosto muito da sintaxe das linguagens ML (e a inferencia), acho uma pena n ter alguma linguagem do tipo com um grande uso.

  • ocaml: ja foi mais usada mas sempre em dominios muitos especificos, e demorou muito pra ter alguns recursos necessarios oq pode ter influenciado a n aumentar o uso
  • f#: muitos projetos legais usando isso (tem bibliotecas q impressionates nessa linguagem q n tem em nem mesmo em c#) mas q é totalmente ofuscada pelo c# (e pela pouca atenção da microsoft)

n tem mais nenhuma da familia ML q tem alguma relavancia maior.

acho que a sintaxe combina muito com ciencia de dados, se ler os codigos q os pessoal faz em notebooks/jupyter, as linguagens ML encaixa perfeitamente (pelo menos nos codigos de analise de dados e coisas do tipo, quando coloca os modelos pra rodar dai ficam bem diferentes a aparencia dos codigos)

1

A Microsoft até que dá atenção pro F#, as pessoas é que não :( Eu conheço pessoalmente boa parte da equipe, eles fazem um bom trabalho e não precisam muito mais do que dispõem, para fazer mais precisa de mais popularidade.

Eu falo que se as pessoas gostassem mesmo de sintaxe simples aprenderiam F# e não Python.

1

Gostaria de entender melhor essa frase:

é fraca em termos de orientação a objeto por qualquer critério que adote.

Eu não sou javeiro, nem sei java, mas gostei desta frase.
Você escreveu aqui no tabnews falando com mais detalhes sobre isso?

Queria entender seu ponto de vista, eu concordo que java não é bem oop, como dizem.
Mas queria saber seu ponto.

Abraços

2

Não escrevi, uriel, nada especifico, que eu me lembre.

Claro que OOP é um termo a ser definido, isso eu já falei.

Por qualquer definição Java foge do que é OOP, algumas mais que outras. Ela não cumpre todos os critérios de tudo ser objeto, até mesmo nos tipos mais simples, nem só na linguagem em si, e não cumpre completamente todos os pilares quando olha a definição mais completa, mas chega perto (não tem sobrecarga de operadores, herança múltipla, despacho múltiplo, com isso a capacidade de abstração fica comprometida). Sem falar que OO é um paradigma secundário, então ele sequer é tão importante assim, Java tem um paradigma mais importante que deveria ser destacado antes de falar em OO. Java é OO, em certa medida. Claro que não pura, nem Smalltalk é.

Farei algo que muitos pedem para aprender a programar corretamente, gratuitamente. Para saber quando, me segue nas suas plataformas preferidas. Quase não as uso, não terá infindas notificações (links aqui).

Só avisando que agora o sistema pune quem não recebe likes no que escreve, portanto se ficar em 1 aqui não estranhe se eu apagá-lo. Lamento, mas é necessário para não ser prejudicado. Se não teve, é porque ninguém gostou, então não fará diferença mesmo. Se acha que é interessante, considere dar like aqui.

2

Seria bom um texto bem abrangente aqui no Tabnews ou em outro lugar sobre isso.
É muito interessante!
E vai ajudar muita gente.
E todo lugar que a gente pesquisa é martelado que JAVA é OOP, é tudo de bom em OOP.
Não tem essas coisas a mais que mostram que java não é tão OOP assim.

Java tem um paradigma mais importante que deveria ser destacado antes de falar em OO

Outra coisa interessante que precisa de mais textos :)

Abraços

2

Sinceramente por ser conversa fiada preciso participar disso aqui. Comecei criando joguinhos com Scratch (que até hoje não sei a linguagem por baixo dos panos)... era fenomenal!

Minha próxima linguagem seria a de marcação HTML, em seguida CSS e por fim um pouco de JavaScript... assustei demais quando vi o tanto de código que precisaria saber e que para desbloquear uma lógica para apresentar telinhas de maneiras diferentes eu precisaria no mínimo saber os fundamentos destes 3 tipos de linguagens... era assustador pra mim!

Depois na universidade aprendi C e confesso aqui: Achei incrível demais a forma que C trabalha no baixo nível, usar ponteiros e criar coisas comuns em linguagens de alto nível da maneira como ela é, é uma experiência única... gostei demais quando fui brincar com listas encadeadas, duplamente ligadas, structs etc. Saudades!

Mas quando fui tentar me expressar com essa linguagem faltava algo, pois sei que não era tão simples expressar ideias rápidas em um mundo com informações circulando rapidamente. Então C desbloqueava muita coisa, mas para coisas com maiores abstrações o tempo de expressividade era alto - e muitas vezes frustrantes - e não só pela falta de conhecimento mas tempo, orientação e maturidade... são tantas coisas hehehe

Minha próxima linguagem foi Java e te digo, achei uma linguagem bonita por tentar expressar a realidade da vida de uma maneira prágmaticamente orientada a objetos. Mas nem tudo é como é visto e existem diversas outras considerações que java não leva em conta e com suas decisões feitas, muuuuuuitas complexidades foram incluídas para coisas simples e muuuuuuitas outras simplicidades foram removidas para atender a tentativa de corresponder ao paradigma e as modernidades de mercado. Mas cá entre nós: Dá pra fazer tudo com java não é mesmo? Se tem uma linguagem completa é o java... nisso concordo com os colegas, a beleza é muito engraçada pois é relativamente relativa heheushuhusehuhse

Após traumatizar com o java (não me leve a mal, pois hoje trabalho com java quase que diariamente hahahaha), estudei um pouco de PHP e que linguagem senhores, que linguagem massa!!! Gostei de praticamente todas as features, a comunidade, documentação... enfim... a partir daí já tava entendendo melhor minha inclinação para trabalhar com Backend. Lembro quando fiz um site com Wordpress e que coisa linda é trabalhar com todas aquelas linguagens como HTML (Marcação), CSS (Estilo), JS (Script) e PHP (Server-Side),,,, mas do sonho de princípe, virou um sapo quando passei a ver as espaguetificações, que terror kkkkkkkkkkkkkk

Foi quando vi um tutorial no youtube mostrando como fazer um hello world com um simples print e aí foi o famoso match do hello world, amor ao primeiro print no terminal. Passei a estudar e me aprofundar em python até ficar proficiente o suficiente para passar a me expressar... e o melhor de tudo isso é python ter como base C, o que resolve aquele meu problema que eu tinha para se expressar com essa linguagem e passar a ser mais pontual, dinâmico e nas variedades de situações, problemas, com python eu podia encontrar as mais bonitas soluções... algumas nem tanto pra falar a verdade kkkk tem alguns detalhes em python que só pythonistas irão saber o motivo, como é o caso do GIL, mas enfim, py ainda continua sendo minha linguagem do heart.py.

Mas não sou fã boy de nenhuma linguagem, uso aquela que me ajuda a melhor me expressar, que é o caso de python. Mas já experimentei um pouquinho de Lua (fenomenal), Julia (incrivelmente incrível), Elixir (tem um cheirinho bom), Go (ela vai, mas o cérebro fica kkk), Rust (este é bruto), Dart (tenho muito que conhecer este pai), kotlin (esta linguagem me deixou mais javafeliz) e hoje em dia aprecio e uso demais uma linguagem que nem falamos aqui, ainda, que é o DataWeave, linguagem de expressão da Mulesoft... ela é linda de se ver e trabalhar! Fora outras linguagens que poderia fazer menção honrosa aqui, mas deixa para um próximo momento, né Lisp?

1

elixir tem uma otima legibilidade apesar de eu não gostar muito de blocos separados com palavras chaves elixir do ... end

não gosto de javascript, e typescript melhora um pouco mas ainda tem varios problemas pois ainda no é javascript né, eu acho que dart é o que o typescript deveria ser, é muito agradavel de escrever

1
2
1
2

Eu acho que, quanto menos pontuação que serve apenas para o compilador/interpretador, mais bonita é a linguagem. Qualquer programador acima do nível -1 endenta o programa. Nada mais simples do que usar o deslocamento para eliminar os símbolos para a definição dos blocos de programação. Arrays devem ter os índices arbitrários e não ser obrigado a iniciar em zero que eu acho meramente acadêmicas.

De qualquer forma, todas as linguagens que eu conheço sempre possuem algo que eu não gosto.

1

Deixa eu confessar um pecado aqui: comecei a mexer com VBA em 2015, pra automatizar algumas coisas no trabalho, e achei lindo a relativa falta de pontos e chaves (à epoca, eu so tinha mexido com C, C++ e um pouquinho de Java na vida, e ainda não comhecia Python).

Tá vendo como é bom uma conversa fiada kkkk

1

Também tinha o mesmo preconteito com Java mas quando comecei a estudar me apaixonei rsrsrs. Ela pode requerer algumas linhas ou palavras a mais no código mas se torna tudo muito mais simples com o atalhos e os autocompletes que ele oferece. Você percebe a vantagem em se trabalhar com uma tecnologia consolidada, que tem suporte e na qual os responsáveis trabalham constantemente por melhorias.

1

Gosto dessa vibe de tentar enxergar beleza nas coisas. Acho que no piloto automático a gente passa a vida achando ruim de muitas delas, e assim perde também o lado bom que elas podem ter.

Quase não tenho experiência com outras linguagens, mas R e Python realmente me surpreenderam. Eu comecei com elas por pura necessidade e sinto que isso rompeu uma barreira mental que eu tinha, uma impressão de que tudo precisava ser complicado e trabalhoso na programação. Gosto muito de como elas são fluidas.

1

eu gosto de codigo limpo e com uma redibilidade direta, no sentido de ter pouca coisa "atrapalhando", por isso tenho preferencia por linguagens baseada em identação no quesito beleza
a primeira paixão nisso foi python

def func(animais,alimento):
    for i in animais:
        if i.come(alimento):
            return true
    return false

gosto dessa parte minima com poucas coisas no meio, isso em outras linguagens ja teria varias chaves, parenteses, e ponto e virgula,

porem com o tempo que fui usando python fui achando alguns incomodos primeiro a parte não ser tipagem estatica (só pra deixar claro q python tem tipagem forte porem n é estatica, sempre vejo confusão com isso), e ficar chamando varias funções seguida acho feio

map(funcao_que_sera aplicada,valida_dados(pega_algo_da_base(escolhe_qual_base,parametros_de_filtro)))

nesse ponto acho feio, dai a alternative é ficar separando isso em variaveis e acho que aumenta muito a carga de inutilidade do codigo

com esses problemas cheguei na linguagem nim, q tambem é baseado em indentação porem com tipagem estatica (o que resolve um dos problemas que tenho com python)

func funcao(animais: array[animal],alimento:comida):bool=
    for i in animais:
        if i.come(alimento):
            true
    false

outra coisa que gosto do nim é o chamado UFCS(Uniform Function Call Syntax), basicamente faz com que os 2 codigos a seguir sejam equivalentes

map(funcao_que_sera_aplicada,valida_dados(pega_algo_da_base(escolhe_qual_base,parametros_de_filtro)))
pode ser usada da como

pega_algo_da_base(escolhe_qual_base,parametros_de_filtro)
.valida_dados()
.map(funcao_que_sera aplicada)

porem ainda tem os tipos explicitos, coisa que gosto no python é que não preciso escrever os tipos(mas é uma linguagem dinamica, sem tipagem estatica o que acho ruim)

dai conheci F# (e a familia de linguagem deriva da linguagem ML):

  • é baseado em identação
  • é estaticamente tipada
  • não é necessario explicitar os tipos
    pra mim pareceu a parfeição de sintaxe
let func arg1 arg2 =
    for i in arg1 do
        if i |> come arg2 then
            true
    else

n tem chaves nem parentes, (claro q isso poderia ser um simples filter mas preciso de exemplos pra descrever)

pode n parecer mas isso é estaticamente tipado, se passar parametro com tipo errado o compilador vai dar erro, é inferencia de tipo que consegue analise o arquivo/modulo inteiro, graças ao algoritmo de Hindley–Milner, é caracterisco das linguagem ML, em varios casos é possivel escrever um projeto inteiro sem escrever os tipos mas sendo estaticamente tipado então tem auxilio do compilador de do LSP(IntelliSense)

aquele encademento pode virar

  pega_algo_da_base(escolhe_qual_base,parametros_de_filtro)
  |> valida_dados()
  |> map(funcao_que_sera aplicada)

elixir teria algo identico, em questão de beleza esses seria os q mais gosto, até por essas questões que as linguagens do tipo lisp são totalmente o contrario dessas coisas(então n curto)
em lisp a função seria algo como

(def func [arg1 arg2]
    (for i in arg1 do
        (if come(i,arg2) 
            true 
            else)))

em lisp é comum ver função terminando em muitos parentes ))))))))))

agora aproveitar o espaço pra fazer uma reclamação de golang, tem uns negocio feio em, pra escrever um simples metodo é

func (*self TipoDoObjeto) nome_do_metodo(primeiro_argumento tipo_do_argumento) (tipo_do_retorno, error)
{ codigo}

comparação com rust,

impl TipoDoObjeto {
    fn nome_do_metodo(&mut self,primeiro_argumento:tipo_do_argumento) -> Result<tipo_do_retorno,error>{}
}

questão de tamanho não muda muito, mas acho muito mais legivel, em go para cada metodo do mesmo objeto teria q repetir (*self TipoDoObjeto) deixando com pouco legivel. rust apesar de ser carregado na sintaxe(diferente da minha preferencia) é muito legivel e agradavel de usar, diria q apesar do rust ser verboso, o codigo diz mais coisa sobre o que esta acontecendo a nivel de LINGUAGEM. gosto de go mas n pelo sintaxe, aqueles encademaneto de função ia ser da forma que acho feia no go(parecido com python), enquanto no rust seria parecido com nim e fsharp