Por que linguagens de programação são boas para tarefas diferentes se a base é igual?
Como um programador iniciante descobrindo as linguagens, eu vejo vários videos de 'curso gratuito: python em 2 horas', 'curso gratuito: java em 8 horas', 'curso gratuito: dart em 5 horas' e são sempre os mesmo conteúdos: If, else, for, while, function. E como eu não quero ficar sobrecarregado, escolhi java como back-end pra me aprofundar e react como front-end.
A questão é que eu sempre ouço falar "java é melhor para sistemas empresariais, python é bom para analise de dados, c# é bom para web" (Não exatamente assim, mas entenda que cada linguagem é atribuida a alguma coisa).
O que isso significa? Que parte do python que é pra analise que em um java é fraca? Que parte do c# é bom pra web que em python nem é citado? Quão profundo em uma linguagem eu tenho que estar para começar a entender esse conceito?
Acho que todos esses direcionamentos se resumem a uma única palavra: comunidade. Geralmente a comunidade ele realiza essas "pré-definições" por conta de bibliotecas disponíveis, e um pouquinho de "puxada de sardinha para o próprio lado". Então, justificando melhor sobre o porquê das linguagens que você citou terem sua "área" (minha própria opinião):
- Java é considerado "bom" para sistemas empresariais porque foi uma das primeiras linguagens a pegar o conceito de "multiplataforma", que é no caso escrever uma vez o código, e rodar em qualquer máquina, sistema operacional, arquitetura de processador, entre outros. E, por conta disso, muitas empresas adotaram justamente por essa facilidade, já que geralmente empresas tem ambientes heterogêneos. Sendo assim, foram criadas várias soluções, as mais notáveis o Spring e, mais recentemente, o Quarkus, que possuem várias bibliotecas que fornecem várias ferramentas, como framework ORM, serializadores, integrações com bancos de dados, tudo isso já pronto, só usar as classes. Obviamente Java também tem a parte web, como JavaServer Faces, e desktop, como o Java Swing, mas a comunidade se focou a servir a soluções mais focadas à empresas, então outros tipos de soluções ficaram em escanteio.
- Python é utilizada para análise de dados, principalmente, por conta da facilidade da linguagem, na qual foi utilizada principalmente por cientistas para desenvolver bibliotecas de análise de dados e inteligência artificial. Hoje a principal biblioteca do Python para análise é o Pandas, mas também há outros frameworks como PyThorch e Tensorflow por exemplo. Python, assim como Java, é uma linguagem que tem múltiplos propósitos, e não exclui você fazer outros tipos de aplicações, como aplicações Web (temos o Django e Flask por exemplo), aplicações Desktop (temos o Kivy), entre outros. Porém o ambiente mais forte pra Python é, de fato, automatizações e análise de dados.
- C# é quase a mesma coisa que Java, com a diferença de que a Microsoft está por trás, então até pouco tempo atrás C# era a linguagem de facto para desenvolvimento de aplicações para Windows. Hoje em dia C# permite um desenvolvimento multiplataforma, mas também permitia o desenvolvimento de aplicações web, com o framework .NET e de jogos com o framework Mono.
Então, como citado, tudo depende da comunidade, porém os exemplos acima e que você passou são de linguagens multipropósito, então tanto C# quanto Python quanto Java geralmente podem fazer de tudo um pouco, mas não é especializado pra uma determinada coisa, porém existem linguagens específicas para determinadas funcionalidades. Linguagens como [Julia](https://pt.wikipedia.org/wiki/Julia_(linguagem_de_programa%C3%A7%C3%A3o) e [R](https://pt.wikipedia.org/wiki/R_(linguagem_de_programa%C3%A7%C3%A3o) são focadas para computação científica, enquanto PHP é uma linguagem muito mais focada para programação web, assim como JavaScript, porém JavaScript hoje é uma linguagem multipropósito igual os 3 exemplos acima por causa da comunidade. C, C++ e Rust são linguagens de programação de sistemas, que você também pode usar pra fazer qualquer coisa, mas são linguagens de baixo nível, então você precisa lidar com gerenciamento de memória, o que é uma coisa bem chata e que na maioria das situações você não precisa se preocupar, principalmente em linguagens que possuam Garbage Collector.
Por fim, além da comunidade e do propósito explícito de algumas linguagens, também tem o fator de familiaridade. Não é porque Java é bom para aplicativos empresariais que eu não possa utilizar PHP por exemplo. Na empresa que eu trabalho a maioria esmagadora das APIs são feitas em Python, utilizando o framework Django. Funciona? Claro. É o que a maioria das empresas usa? Não.
Então outro item que tem que ser colocado em consideração é a familiaridade com a linguagem. Aprendeu Python na faculdade? É provável que tu funde uma empresa usando Python ou vá atrás de empresas que usem Python, já que é sua zona de conforto.
Por fim, não acho que você tem que estar profundamente envolvido na linguagem pra saber que ela não é boa para desenvolvimento de sistemas. Você precisa saber como a linguagem funciona, seu paradigma de programação e as bibliotecas disponíveis pra entender o ecossistema e verificar se vale a pena para determinado caso de uso ou não. Isso é questão de experiência que tu adquire ao longo do tempo. Toda tecnologia tem seus pontos positivos ou negativos, então você vai ter sua própria opinião ao longo do tempo sobre se tecnologia x é boa para algo ou não.
Simples: a base não é igual. Só que 90% dos programadores acham que é por falta de conhecimento no assunto.
Como você é um iniciante vai ser difícil eu responder exatamente a sua pergunta. Mas grave na sua memória que existe uma diferença gigantesca entre saber usar uma linguagem de programação e entender sobre linguagens de programação. 90% dos programadores só sabem usar as linguagens sem entender quase nada sobre elas. É como um motorista que não entende nada de engenharia mecânica (mas acha que entende). Daí o motivo de surgirem frases absurdas como "basta aprender lógica de programação que você poderá programar em qualquer linguagem".
Bom, dito isso. Pesquise sobre Programming Language Theory (PLT) que é um ramo da Ciência da Computação, é de extrema importância entender a teoria por trás das linguagens de programação para entender porque linguagens são melhores em resolver determinados problemas do que outras (dentre outras coisas muito importantes também).
Para dar um resumo muito grosseiro: linguagens de programação são projetadas seguindo um determinado modelo de máquina abstrata, suportam determinados paradigmas de programação, tem um determinado sistema de tipos, seguem um determinado modelo de memória entre outros detalhes que fazem com que a linguagem funcione de maneira diferente de outras linguagens. E cada um dessses detalhes teóricos fazem ela funcionar melhor para determinados tipos de problema do que outras.
Também existe o runtime da linguagem que pode determinar como um programa escrito na linguagem vai ser executado. Isso pode determinar a performance de execução, portabilidade, consumo de recursos (como memória RAM), gerenciamento de threads, gerenciamento de memória dinâmica e por aí vai.
A sintaxe (for, if, while etc.) é um detalhe quase insignificante da linguagem de programação. Avaliar uma linguagem pela sintaxe é como avaliar um carro pela pintura e ignorar completamente o seu motor, para quem não entende de engenharia mecânica só o que muda de um carro para outro é a pintura mesmo... 90% dos programadores acham que linguagem de programação é só sintaxe, infelizmente esse é o "normal" no Brasil.
Sugiro dar uma lida sobre cada conceito que eu mencionei, aprendendo sobre essas coisas tu já vai estar acima da média no Brasil. E sugiro ler esses dois PDF também sobre sistema de tipos e paradigmas de programação:
No meu ponto de vista isso depende das ferramentas que a linguagem te dá para certas tarefas. Exemplo: Python é uma linguagem que já tem muitas e muitas ferramentas prontas e boas para análise de dados.
A questão é analisar as ferramentas que a linguagem entrega, talvez o Java entregue bastante desempenho e segurança, por exemplo, e por isso é mais indicado para sistemas empresariais e por aí vai.
E vai muito também da competência do programador de usar a linguagem, já que não adianta nada o python te dar ferramentas pra análise de dados se o programador não sabe usar ou usa de maneira incorreta. Então tudo depende muito, pois não existe uma linguagem que é a melhor do mundo.
Eu acho que a opinião do @Silva97 e do @jooojano são válidas. Vou ver se consigo agregar algo. Ou complicar.
Sim, a teoria é importante. Vejamos um caso simples:
Python se baseou em ABC e Icon (entre outras). Acho a endentação de ABC muito interessante por evitar um monte de pontuação que é necessária apenas para o compilador/interpretador ficar mais fácil de programar. Os generators são de Icon, mas muito menos poderosos. Qual o problema? A sintaxe de Icon é derivada do ALGOL (como grande parte das linguagens) mas em cima do conceito de sucesso e falha (derivada de SNOBOL que é do mesmo autor de Icon). Por exemplo:
procedure main(args)
every write("Oi ",!args,". Coo você está?")
end
Sintaticamente parece um C+Pascal sem pontuação desnecessária. O !args
retorna cada argumento passado para o comando e falhando
quando não tiver mais. Mais ou menos como um try ... except ...end
. Em outras linguagens necessitaria de um loop do estilo for a in args
.Mas Icon também permite outras coisas como:
procedure main()
c := 5
if (soma := c + 1) > 5 then write("soma > 5")
write("soma = ",soma)
end
Motivo de eu ter escrito tudo isto? Achei que fica claro que a sintaxe é apenas um aspecto e, mesmo sendo parecida, a semântica é totalmente diferente. Python teve que criar o Walrus Operator para lidar com uma situação que Icon é corriqueira. Expressões como if 9 > 5 > 3 then
ou if (x | y) > (3 | 4) then
fazem todo o sentido em Icon mas não em outras linguagens. Verse, a linguagem planejada para o metaverso , claramente se baseia nesse paradigma (mesmo que o Simon Peyton Jones tenha enrrolado no vídeo). Mas esquece Icon. O autor pediu que não fizessem alterações após a morte e, como ele já faleceu...). Mas tem Unicon que continua em desenvolvimento (lento por causa da comunidade pequena).
Por outro lado, a comunidade tem muita influência na adoção de novas linguagens. Algumas ruins. Como a maioria das linguagens são de uso geral e abertas, o pessoal fica pedindo um monte de coisas e o pessoal aceita algumas para não ficar atras do concorrente Y. Aí podem dizer: A minha também faz ou faz em uma linha e a tua precisa de 5. E parece que é tudo acadêmico e não vivem no mundo real. A grande maioria das linguagens possuem matrizes que iniciam em zero. Não vejo ninguém falando o contrário. Só é bom para o cara que faz o compilador. No mundo real deveria ser arbitrária. Pascal (e algumas outras) implementaram de forma mais correta. Preciso do comportamento de um material entre -10°C e 45°C. Em Pascal seria array [-10 .. 45]
. Sem nenhum cálculo idiota no meu programa ou a necessidade de algum comentário para informar que condicao[3]
= -7°C ou escrever temperatura += 10
. Já existem trocentas linguagens mas vem alguém e resolve criar uma nova (sei lá se para aparecer ou por desconhecimento mesmo) que substituirá todas as antigas (Carbon?).
De qualquer forma, acho interessante aprender, mesmo que superficialmente, alguma linguagem de outro paradigma (se o cara tiver tempo já que vai aprender Java, React, CSS, HTML, framework tal, etc.).
Já que escolheste Java, acho que poderias dar uma olhadinha em Clojure (procura por Clojure e Nubank que deve vir resultados). Vais ter algo bem diferente sem sair da JVM e até podes usar profissionalmente (se permitirem ).
Só para citar um link que acho interessante, é o Beating the Averages, principalmente o tópico The Blub Paradox.
Vou te dar uma dica que pode soar arrogante, mas não é, eu juro.
O problema da maior parte dos programadores que eu conheço que ficam estagnados na carreira e não saem do mesmo lugar é justamente por que eles ficam procurando 1000 pelos em um ovo que se realmente for encontrado não muda em absolutamente nada.
O que você tem que fazer é estudar coisas por demanda e que são relevantes pra sua atividade fim, ou seja, se você hoje precisa fazer alguma coisa use ferramentas que te facilite naquilo.
Entender de tudo pra não usar nem 10% disso não é ser sábio é só ter muito conhecimento guardado.