Esse tópico tem a intenção de ser algo mais focado, com compartilhamento de informações, artigos da área de TI, cursos, tutoriais, etc, em resumo, mais educacional. Sei que já tem várias discussões em tópicos com o de Salários ou o de Cursos gratuitos, mas acho interessante um lugar para divulgar informações das mais variadas. Eu pelo menos, tentarei manter o tópico atualizado.
Carreira em TI, áreas de atuação:
- Serviços e Infraestrutura;
- Redes;
- Estratégia e Negócios de TI;
- Gestão de TI;
- Segurança da Informação;
- DevOps e Nuvem;
- Armazenamento e Dados;
- Desenvolvimento;
Linguagens de Programação
Resumo rápido das linguagens de programação.
Devo aprender...
Existem muitas linguagens por aí, e a maioria delas tem muitas sobreposições sobre domínios de problemas comuns. Em princípio, todas as linguagens sendo Turing completas, não há nada que impeça você de realizar qualquer tarefa em qualquer linguagem. Mas, na prática, pode haver uma diferença de ordens de magnitude (estamos falando de 100-1000x aqui) em quanto tempo leva para fazer um projeto em uma linguagem adequada versus uma não adequada. Entre as alegrias que você pode experimentar ao escolher a linguagem errada estão:
Se você for experiente (regra geral: você criou um software útil e foi pago por ele em mais de uma linguagem?), A escolha se torna muito mais fácil. Com base nas linguagens que você conhece, provavelmente já terá um gostinho de determinados recursos. Considere as linguagens com os quais você já está familiarizado - o que eles fazem bem? O que você mudaria? A linguagem que você está pensando em aprender invariavelmente será melhor em alguns aspectos e pior em outros do que aqueles que você já conhece. A questão é se os profissionais fornecem o suficiente para justificar os contras e o esforço extra de aprender uma nova linguagem.
Em última análise, você deve aspirar a aprender a programar, não a aprender uma determinada linguagem. A saber, toda a programação gira em torno de fazer o computador fazer coisas: o computador conhece um pequeno conjunto de "coisas" fundamentais atômicas que já pode fazer. É sua tarefa, como programador, definir como essas tarefas fundamentais devem ser combinadas entre si para executar novas tarefas. Dependendo de como as tarefas fundamentais de uma linguagem são escolhidas, e quais regras governam sua combinação, algumas tarefas serão tornadas fáceis ou difíceis, intuitivas ou não intuitivas.
Intrínseco vs. Extrínseco
Ao comparar os méritos comparativos das linguagens, podemos dividi-los em dois grupos principais: propriedades extrínsecas e propriedades intrínsecas. As propriedades intrínsecas são propriedades da própria linguagem, como a sintaxe. Propriedades extrínsecas são tudo o que não faz parte da própria linguagem: a comunidade, os tutoriais disponíveis, as bibliotecas que foram escritas, como a linguagem e seus usuários são percebidos, e assim por diante. Basicamente, as propriedades intrínsecas são o que você obtém se estiver usando a linguagem em um ambiente vago, com nada além de uma descrição da sintaxe e um compilador básico.
Linguagens não existem em uma vaga, mas considera- las em uma vaga pode informar a decisão maior de qual linguagem vale o seu tempo. Portanto, fazemos a distinção entre aspectos intrínsecos e extrínsecos pelas seguintes razões:
Propriedades intrínsecas
Para a maioria das linguagens projetadas sem um propósito específico em mente, os intrínsecos serão bastante semelhantes. Eles não serão falhas gritantes ou melhorias radicais. Quando as linguagens são projetadas com um propósito específico em mente, elas tendem a ter mudanças mais drásticas. Normalmente, se uma linguagem especializada é projetada a partir de um domínio de problema, é muito difícil lidar com esse domínio de problema usando linguagens mais generalistas.
Sintaxe
A sintaxe determina a aparência da instrução que você escreve em um idioma. Você deve se perguntar:
Açúcar sintático são as diferentes abreviações que uma linguagem pode ter, como ser capaz de dizer em
Se você costuma fazer as coisas que o açúcar do seu idioma tenta facilitar, isso pode tornar sua vida muito mais fácil.
Se o açúcar não ajudar, é claro que você não pode usá-lo, mas lembre-se de que ignorar o açúcar ruim não fará com que ele desapareça. Se sua linguagem tem algum açúcar retardado que todo mundo adora usar por algum motivo, isso pode tornar a leitura do código de outras pessoas um inferno (este também é um exemplo de intrínsecos influenciando extrínsecos).
Paradigma (imperativo vs. declarativo)
A humanidade descobriu até agora duas maneiras de especificar instruções para um computador.
Historicamente, as linguagens imperativas têm dominado e são consideradas mais fáceis de entender. Talvez a ideia de dar a alguém instruções passo a passo explícitas seja mais intuitiva para a mente humana do que sistemas de funções, mas, independentemente, a maioria das pessoas acham as linguagens imperativas mais fáceis, e o interesse por linguagens funcionais frequentemente está relacionado à aptidão matemática. Se você não sabe o que está fazendo, provavelmente deve começar com uma linguagem imperativa.
Em um nível mais profundo, há uma observação interessante sobre ter dois paradigmas juntos: Existem maneiras de essencialmente chamar módulos escritos em um estilo funcional a partir de um programa imperativo e vice-versa. Provavelmente, é melhor aninhar a lógica declarativa dentro da lógica imperativa: as duas vantagens da lógica imperativa são a capacidade de impor uma sequência e a fácil interação com o usuário. Ambos são mais poderosos quando feitos no nível superior do programa. As vantagens da lógica funcional envolvem flexibilidade na solução de um problema bem definido - portanto, são adequadas para atuar como um módulo especializado.
Em muitas linguagens imperativas modernas, é realmente possível escrever uma lógica quase declarativa de estilo funcional (em particular, procure por "expressões lambda"). Como a linguagem não foi projetada com programação puramente funcional em mente, isso pode ser impraticável (difícil de depurar, desajeitado de digitar, lento e não otimizado), mas em alguns subconjuntos de problemas pequenos, mas importantes, você pode realmente misturar os dois paradigmas.
Programação orientada a objetos (OOP)
A lógica básica do OOP é:
Essa forma de pensar é adequada para alguns problemas. Por exemplo, ao programar uma GUI, pode ser conveniente representar todas as barras de rolagem, botões, caixas de seleção e campos de texto como classes com comportamentos compartilhados. Em outras ocasiões, adicionar OOP pode dificultar uma coisa trivial.
Rigor
Existe uma grande variação entre as linguagens em termos de quantos detalhes eles exigem. Digamos que você queira definir uma variável para armazenar um número. Algumas linguagens são muito pedantes, você deve especificar que tipo de número, se valores negativos são possíveis, qual deve ser o valor máximo, se é um número inteiro ou decimal, e quantos dígitos armazenar se for decimal. Outras linguagens apenas permitem que você defina seu número e nunca faça perguntas, tentando fazer suposições razoáveis sobre todas as coisas que você deixou de fora.
O alto rigor pode ser útil de duas maneiras. Primeiro, dá a você melhor controle sobre exatamente o que o programa está fazendo. Isso ajuda na otimização: se você sabe que uma variável nunca armazenará um número maior do que 255, não faz sentido usar um formato maior e desperdiçar memória. Em segundo lugar, eles o forçam a pensar constantemente em cada detalhe de seu código e podem ajudar a reduzir bugs (mas não necessariamente). Exemplos: C, C ++, Java, Haskell (funcional).
O baixo rigor é bom quando você tem apenas uma ideia simples e deseja colocá-la em funcionamento rapidamente, sem se prender a detalhes. Infelizmente, alguns dos detalhes que você não especificou acabarão por causar erros sutis que serão difíceis de consertar. Exemplos: Python, JavaScript.
Linguagens estritas tendem a ser boas para software de nível de produção onde a confiabilidade, a aderência às especificações e um alto nível de otimização são necessários. Linguagens não estritas são boas para prototipar e hackear scripts one-shot.
Propriedades extrínsecas
Documentação
Sempre verifique quais livros, tutoriais e fóruns de ajuda (ou quantas perguntas no StackOverflow) existem para um idioma. Pode ser a melhor linguagem já criada, mas não ser capaz de fazer perguntas simples no Google rapidamente pode realmente retardar seu aprendizado.
Bibliotecas
Exercícios de aprendizagem à parte, hoje em dia é estúpido escrever um programa do zero. Muitas funcionalidades comuns, como E/S de arquivo, trabalho com matrizes, classificação, funções matemáticas, gráficos, rede, etc, já foram implementadas e, esperançosamente, empacotadas como bibliotecas. Você não deve reinventar a roda.
Pode ser difícil avaliar o ecossistema de uma linguagem, mas tente pesquisar coisas como "Como fazer X na linguagem Y" no Google - você obtém resultados curtos e fáceis de ler que usam bibliotecas bem mantidas e bem documentadas, ou você pegar um monte de gente escrevendo seus próprios hacks ilegíveis?
Exemplos:
Em princípio, qualquer linguagem pode ser executada em qualquer plataforma, mas é completamente diferente se sua estrutura favorita está disponível em qualquer lugar (por exemplo, embora C++ funcione em qualquer lugar, o DirectX é somente para Windows), qual será o desempenho e quanto suporte está disponível. Algumas plataformas são dominadas por uma linguagem:
Vou colocar isso em extrínseco, porque depende muito da implementação. Geralmente, qualquer coisa com uma VM terá um impacto no desempenho. Qualquer coisa interpretada sempre será lenta. Coleta de lixo, digitação dinâmica, tudo torna as coisas mais lentas. Felizmente, os computadores hoje em dia são tão rápidos que o desempenho geralmente não importa. Mas em aplicativos de alto desempenho (jogos 3D, criptografia, computação estatística) você precisa de uma linguagem adequada para programação de sistemas. Linguagens funcionais às vezes podem ser muito mais rápidas do que imperativas, porque você pode otimizar algumas coisas muito bem nelas.
Percepção
Se você quer programar como um hobby, isso é irrelevante, mas se você quer conseguir um emprego, vale a pena pesquisar cuidadosamente o que está em demanda e onde. Por exemplo, Python, C # e Java são os 3 principais se você deseja escrever bots de trader em Wall Street. Java e C# são escolhas de carreira de merda, porque você competirá com milhões de terceiros por cargos de baixa remuneração.
Comunidade
Algumas linguagens parecem atrair mais fanboys do que outras. Por exemplo, Ruby já foi famoso por seus fãs hipsters, e a maioria dos usuários do Rust parece mais preocupada com a justiça social do que com o desenvolvimento de software.
O que mais se usa por aí?
Existem MUITAS linguagens, e há constantes discussões em fóruns sobre a melhor linguagem, sem uma linguagem geral acordada. Abaixo está uma lista de linguagens frequentemente votados a favor/contra e explicações simples de porque eles são amados/odiados.
Linguagens individuais
ADA
O PHP tem uma péssima reputação entre os desenvolvedores. Existem muito mais linguagens comercializáveis por aí que farão tudo o que você gostaria de fazer em PHP. Apesar da opinião ruim de muitos, a linguagem continua em desenvolvimento ativo. Nos últimos anos, surgiram muitos novos recursos e uma quantidade considerável de tentativas de limpeza de código legado.
Existem muitas linguagens por aí, e a maioria delas tem muitas sobreposições sobre domínios de problemas comuns. Em princípio, todas as linguagens sendo Turing completas, não há nada que impeça você de realizar qualquer tarefa em qualquer linguagem. Mas, na prática, pode haver uma diferença de ordens de magnitude (estamos falando de 100-1000x aqui) em quanto tempo leva para fazer um projeto em uma linguagem adequada versus uma não adequada. Entre as alegrias que você pode experimentar ao escolher a linguagem errada estão:
- Luta contra a sintaxe passivo-agressiva que o incomoda com detalhes irrelevantes de baixo nível
- Você não deve subestimar a importância das decisões sintáticas simples e do açúcar sintático. Aprender uma linguagem e desenvolver softwares exige muito empenho e trabalho árduo. Se você não gostar da sua linguagem, isso destruirá sua motivação e será muito difícil chegar a qualquer lugar.
- Ter reinventado a roda porque ninguém se incomodou em portar a biblioteca crítica X
- Ter que descobrir por conta própria porque todos os guias para o tópico X são escritos para outras linguagens (traduzir código de exemplo que você não entende é muito divertido!)
- Comprometendo centenas ou milhares de horas de trabalho em um projeto, apenas para perceber que você não pode mais melhorar o desempenho ou um conjunto de recursos por causa das decisões de design que sua linguagem fez, e se você quiser progredir, sua única esperança é reescrever tudo em outra linguagem primeiro
- Gastar tempo e esforço aprendendo uma linguagem apenas para perceber o mercado de trabalho, pois é uma merda (se você tem um objetivo de carreira em vez de ser um amador)
Se você for experiente (regra geral: você criou um software útil e foi pago por ele em mais de uma linguagem?), A escolha se torna muito mais fácil. Com base nas linguagens que você conhece, provavelmente já terá um gostinho de determinados recursos. Considere as linguagens com os quais você já está familiarizado - o que eles fazem bem? O que você mudaria? A linguagem que você está pensando em aprender invariavelmente será melhor em alguns aspectos e pior em outros do que aqueles que você já conhece. A questão é se os profissionais fornecem o suficiente para justificar os contras e o esforço extra de aprender uma nova linguagem.
Em última análise, você deve aspirar a aprender a programar, não a aprender uma determinada linguagem. A saber, toda a programação gira em torno de fazer o computador fazer coisas: o computador conhece um pequeno conjunto de "coisas" fundamentais atômicas que já pode fazer. É sua tarefa, como programador, definir como essas tarefas fundamentais devem ser combinadas entre si para executar novas tarefas. Dependendo de como as tarefas fundamentais de uma linguagem são escolhidas, e quais regras governam sua combinação, algumas tarefas serão tornadas fáceis ou difíceis, intuitivas ou não intuitivas.
Intrínseco vs. Extrínseco
Ao comparar os méritos comparativos das linguagens, podemos dividi-los em dois grupos principais: propriedades extrínsecas e propriedades intrínsecas. As propriedades intrínsecas são propriedades da própria linguagem, como a sintaxe. Propriedades extrínsecas são tudo o que não faz parte da própria linguagem: a comunidade, os tutoriais disponíveis, as bibliotecas que foram escritas, como a linguagem e seus usuários são percebidos, e assim por diante. Basicamente, as propriedades intrínsecas são o que você obtém se estiver usando a linguagem em um ambiente vago, com nada além de uma descrição da sintaxe e um compilador básico.
Linguagens não existem em uma vaga, mas considera- las em uma vaga pode informar a decisão maior de qual linguagem vale o seu tempo. Portanto, fazemos a distinção entre aspectos intrínsecos e extrínsecos pelas seguintes razões:
- As propriedades intrínsecas são constantes no tempo (pelo menos até que uma nova versão da linguagem seja lançada). As propriedades extrínsecas são muito inconstantes (quem sabe qual linguagem será popular em cinco anos?).
- As propriedades intrínsecas influenciam as propriedades extrínsecas, mas não vice-versa (a exceção é quando os designers de linguagem ouvem o que a comunidade deseja para a versão subsequente da linguagem).
Propriedades intrínsecas
Para a maioria das linguagens projetadas sem um propósito específico em mente, os intrínsecos serão bastante semelhantes. Eles não serão falhas gritantes ou melhorias radicais. Quando as linguagens são projetadas com um propósito específico em mente, elas tendem a ter mudanças mais drásticas. Normalmente, se uma linguagem especializada é projetada a partir de um domínio de problema, é muito difícil lidar com esse domínio de problema usando linguagens mais generalistas.
Sintaxe
A sintaxe determina a aparência da instrução que você escreve em um idioma. Você deve se perguntar:
- É fácil lembrar os comandos neste idioma?
- É fácil compreender a sintaxe?
- Posso codificar apenas com um editor de texto básico ou é impraticável sem um programa utilitário sofisticado que o ajude destacando o código ou gerando segmentos de código repetitivos?
- Existem muitas palavras-chave?
- É legível?
Açúcar sintático são as diferentes abreviações que uma linguagem pode ter, como ser capaz de dizer em
x++
em vez de x = x + 1
.Se você costuma fazer as coisas que o açúcar do seu idioma tenta facilitar, isso pode tornar sua vida muito mais fácil.
Se o açúcar não ajudar, é claro que você não pode usá-lo, mas lembre-se de que ignorar o açúcar ruim não fará com que ele desapareça. Se sua linguagem tem algum açúcar retardado que todo mundo adora usar por algum motivo, isso pode tornar a leitura do código de outras pessoas um inferno (este também é um exemplo de intrínsecos influenciando extrínsecos).
Paradigma (imperativo vs. declarativo)
A humanidade descobriu até agora duas maneiras de especificar instruções para um computador.
- A abordagem imperativa fornece ao computador uma lista de instruções. O computador executa os comandos na ordem fornecida (embora alguns dos comandos em si possam envolver a alteração da ordem inicial). Por exemplo, para calcular a circunferência de um círculo, você diria ao computador para primeiro tirar o raio, depois multiplicá-lo por dois para obter o diâmetro, depois multiplicá-lo por um valor aproximado pré-calculado de pi e, em seguida, imprimi-lo na tela. Existem dezenas, senão centenas de linguagens imperativas como C, C ++, Java e muitas outras.
- A abordagem declarativa simplesmente define o que cada coisa significa e permite que o computador junte as definições. Pode ser difícil fazer os cálculos acontecerem em uma determinada ordem, mas como nenhuma ordem é especificada, fazer paralelização de tarefas para melhorar o desempenho pode ser muito fácil. Para a circunferência, você daria ao computador a fórmula da circunferência, a fórmula para aproximar pi (por exemplo 22/7), e pediria a circunferência dado um raio. Observe como eu não digo "imprimir na tela" - a comunicação com o usuário também pode ser um problema com linguagens declarativas. Na prática, os principais representantes dessa classe são linguagens funcionais como Haskell ou Lisp.
Historicamente, as linguagens imperativas têm dominado e são consideradas mais fáceis de entender. Talvez a ideia de dar a alguém instruções passo a passo explícitas seja mais intuitiva para a mente humana do que sistemas de funções, mas, independentemente, a maioria das pessoas acham as linguagens imperativas mais fáceis, e o interesse por linguagens funcionais frequentemente está relacionado à aptidão matemática. Se você não sabe o que está fazendo, provavelmente deve começar com uma linguagem imperativa.
Em um nível mais profundo, há uma observação interessante sobre ter dois paradigmas juntos: Existem maneiras de essencialmente chamar módulos escritos em um estilo funcional a partir de um programa imperativo e vice-versa. Provavelmente, é melhor aninhar a lógica declarativa dentro da lógica imperativa: as duas vantagens da lógica imperativa são a capacidade de impor uma sequência e a fácil interação com o usuário. Ambos são mais poderosos quando feitos no nível superior do programa. As vantagens da lógica funcional envolvem flexibilidade na solução de um problema bem definido - portanto, são adequadas para atuar como um módulo especializado.
Em muitas linguagens imperativas modernas, é realmente possível escrever uma lógica quase declarativa de estilo funcional (em particular, procure por "expressões lambda"). Como a linguagem não foi projetada com programação puramente funcional em mente, isso pode ser impraticável (difícil de depurar, desajeitado de digitar, lento e não otimizado), mas em alguns subconjuntos de problemas pequenos, mas importantes, você pode realmente misturar os dois paradigmas.
Programação orientada a objetos (OOP)
A lógica básica do OOP é:
- Tudo é um objeto pertencente a uma classe de objetos
- As classes têm suas próprias variáveis (campos) e comportamentos (métodos)
- As classes são taxonomicamente relacionadas umas às outras e podem herdar e estender a funcionalidade umas das outras (herança)
Essa forma de pensar é adequada para alguns problemas. Por exemplo, ao programar uma GUI, pode ser conveniente representar todas as barras de rolagem, botões, caixas de seleção e campos de texto como classes com comportamentos compartilhados. Em outras ocasiões, adicionar OOP pode dificultar uma coisa trivial.
Rigor
Existe uma grande variação entre as linguagens em termos de quantos detalhes eles exigem. Digamos que você queira definir uma variável para armazenar um número. Algumas linguagens são muito pedantes, você deve especificar que tipo de número, se valores negativos são possíveis, qual deve ser o valor máximo, se é um número inteiro ou decimal, e quantos dígitos armazenar se for decimal. Outras linguagens apenas permitem que você defina seu número e nunca faça perguntas, tentando fazer suposições razoáveis sobre todas as coisas que você deixou de fora.
O alto rigor pode ser útil de duas maneiras. Primeiro, dá a você melhor controle sobre exatamente o que o programa está fazendo. Isso ajuda na otimização: se você sabe que uma variável nunca armazenará um número maior do que 255, não faz sentido usar um formato maior e desperdiçar memória. Em segundo lugar, eles o forçam a pensar constantemente em cada detalhe de seu código e podem ajudar a reduzir bugs (mas não necessariamente). Exemplos: C, C ++, Java, Haskell (funcional).
O baixo rigor é bom quando você tem apenas uma ideia simples e deseja colocá-la em funcionamento rapidamente, sem se prender a detalhes. Infelizmente, alguns dos detalhes que você não especificou acabarão por causar erros sutis que serão difíceis de consertar. Exemplos: Python, JavaScript.
Linguagens estritas tendem a ser boas para software de nível de produção onde a confiabilidade, a aderência às especificações e um alto nível de otimização são necessários. Linguagens não estritas são boas para prototipar e hackear scripts one-shot.
Propriedades extrínsecas
Documentação
Sempre verifique quais livros, tutoriais e fóruns de ajuda (ou quantas perguntas no StackOverflow) existem para um idioma. Pode ser a melhor linguagem já criada, mas não ser capaz de fazer perguntas simples no Google rapidamente pode realmente retardar seu aprendizado.
Bibliotecas
Exercícios de aprendizagem à parte, hoje em dia é estúpido escrever um programa do zero. Muitas funcionalidades comuns, como E/S de arquivo, trabalho com matrizes, classificação, funções matemáticas, gráficos, rede, etc, já foram implementadas e, esperançosamente, empacotadas como bibliotecas. Você não deve reinventar a roda.
Pode ser difícil avaliar o ecossistema de uma linguagem, mas tente pesquisar coisas como "Como fazer X na linguagem Y" no Google - você obtém resultados curtos e fáceis de ler que usam bibliotecas bem mantidas e bem documentadas, ou você pegar um monte de gente escrevendo seus próprios hacks ilegíveis?
Exemplos:
- Por um tempo, C# foi uma escolha muito boa para fazer jogos graças ao XNA (infelizmente a Microsoft parou de desenvolvê-lo quando o Windows 8 foi lançado). O XNA lida com muitas coisas para você, como entrada de teclado / gamepad, gráficos 2D / 3D, som, ciclos de atualização do jogo, taxa de quadros, ativos e assim por diante, e tem funções bem documentadas e muitos tutoriais bons. C# por si só é uma linguagem decente, mas não tão boa - XNA foi o que permitiu que muitos jogos independentes como Terraria e Bastion fossem feitos com uma equipe pequena.
- Python tem algumas bibliotecas que são tão boas que fazer webcraping (BeautifulSoup, etc) ou computação científica (SciPy) em outra coisa é simplesmente estúpido neste ponto.
Em princípio, qualquer linguagem pode ser executada em qualquer plataforma, mas é completamente diferente se sua estrutura favorita está disponível em qualquer lugar (por exemplo, embora C++ funcione em qualquer lugar, o DirectX é somente para Windows), qual será o desempenho e quanto suporte está disponível. Algumas plataformas são dominadas por uma linguagem:
- A base para aplicativos Android é Java. Você pode fazer com que outros executem, mas todos os tutoriais que encontrar estarão em Java. Atualmente está em migração para o Kotlin.
- Se você quer programar para iOS, você tem que usar Objective-C ou Swift (aliás, uma linguagem inútil para qualquer outra coisa).
- Webapps geralmente são feitos em Python (Django), Ruby (com Rails) ou JavaScript.
- Os jogos de navegador usam HTML5.
Vou colocar isso em extrínseco, porque depende muito da implementação. Geralmente, qualquer coisa com uma VM terá um impacto no desempenho. Qualquer coisa interpretada sempre será lenta. Coleta de lixo, digitação dinâmica, tudo torna as coisas mais lentas. Felizmente, os computadores hoje em dia são tão rápidos que o desempenho geralmente não importa. Mas em aplicativos de alto desempenho (jogos 3D, criptografia, computação estatística) você precisa de uma linguagem adequada para programação de sistemas. Linguagens funcionais às vezes podem ser muito mais rápidas do que imperativas, porque você pode otimizar algumas coisas muito bem nelas.
Percepção
Se você quer programar como um hobby, isso é irrelevante, mas se você quer conseguir um emprego, vale a pena pesquisar cuidadosamente o que está em demanda e onde. Por exemplo, Python, C # e Java são os 3 principais se você deseja escrever bots de trader em Wall Street. Java e C# são escolhas de carreira de merda, porque você competirá com milhões de terceiros por cargos de baixa remuneração.
Comunidade
Algumas linguagens parecem atrair mais fanboys do que outras. Por exemplo, Ruby já foi famoso por seus fãs hipsters, e a maioria dos usuários do Rust parece mais preocupada com a justiça social do que com o desenvolvimento de software.
O que mais se usa por aí?
Existem MUITAS linguagens, e há constantes discussões em fóruns sobre a melhor linguagem, sem uma linguagem geral acordada. Abaixo está uma lista de linguagens frequentemente votados a favor/contra e explicações simples de porque eles são amados/odiados.
- C - Provavelmente a linguagem mais aceita. Embora haja muitos que afirmam que C é datado, a maior parte do UNIX/Linux é escrita (e ainda está sendo escrita) em C. TempleOS foi escrita na própria versão de C de Terry; HolyC.
- C++ - Para quem gosta de C, mas acha que está desatualizado, C++ existe e é muito popular no mundo real.
- Haskell/Lisp/Linguagens funcionais - Linguagens funcionais são muito úteis para mudar a maneira como você pensa sobre programação. Escrever em uma linguagem funcional irá forçá-lo a pensar mais sobre seu código e projetar funções/algoritmos muito mais agradáveis. No entanto, com isso dito, as linguagens funcionais não representam com precisão como o computador funciona, e isso tem seus problemas.
- Python - Uma linguagem muito controversa. Alguns acreditam que é uma boa linguagem para iniciantes. Outros acreditam que é a pior linguagem de programação em todos os aspectos. Ele tem muitas falhas e muitas razões para não ser usada, no entanto, é muito fácil para alguém com pouco conhecimento começar a escrever código (o que pode ou não ser uma coisa boa).
- JavaScript/Node.js - Recomendado por aqueles que odeiam Python, para aqueles que são novos. Ainda é uma linguagem fácil para iniciantes e tem muitas falhas, mas perto do Python parece ouro.
- Assembly - Recomendado por masoquistas porque, como o Gentoo, você precisa ser um louco completo para usá-lo (veja como escrever hello world em assembly ). Provavelmente a linguagem com o melhor desempenho possível, pois é 1:1 com instruções de código de máquina, porém muitas pessoas serão rápidas em apontar que se você fizer algo ineficiente, outras linguagens podem ser mais rápidas, pois seu compilador não fará o mesmo erro.
Linguagens individuais
ADA
- Projetado para detectar o máximo de erros possível, o mais rápido possível
- Sintaxe semelhante a Pascal
- Excelente para programação embarcada, de sistemas ou em tempo real, mas adequado para praticamente qualquer coisa
- Programação por contrato em Ada 2012
- Muitos recursos avançados, como tarefas, genéricos e exceções foram integrados à linguagem na década de 80
- Bom suporte para provar a correção do código, especialmente na variante SPARK
- Código detalhado
- Falta de tutoriais atualizados e documentação para iniciantes
- Não é muito usado fora das indústrias de defesa e aeroespacial
- Conciso, mas pedante pra caralho.
- Programas pequenos são simples de escrever, mas os maiores tornam-se uma bagunça complicada e complexa na maioria dos casos.
- Baseado no ASM da Motorola, tantas variantes, tanto download de porta serial.
- O x86 ASM também é muito legal, também conhecido como PC ASM. Complicada demais porque a sintaxe AT&T ASM é o padrão UNIX, e a sintaxe Intel ASM é o padrão DOS e eles são tão próximos, mas são as pequenas coisas que são diferentes. Diferente o suficiente para ser um pé no saco.
- Não é portátil. Isso é o mais próximo do metal que você consegue sem escrever os códigos operacionais reais da máquina. Cada instrução é um mapeamento 1:1 para um opcode da máquina. Cada arquitetura de CPU possui um conjunto diferente de instruções.
- Atualmente, Intel x86-64 ASM é o maior conjunto de instruções.
- > Ele pode fazer qualquer coisa que C pode fazer
- Muitas implementações proprietárias, apenas algumas FOSS decentes.
- Ainda mais lento que C
- > muh goto
- muh programação excel
- Projetado para ser uma "linguagem assembly portátil"
- Linguagem pequena e simples, cujas partes se compõem bem
- Biblioteca padrão muito pequena
- Você precisará implementar a maioria das coisas não triviais por si mesmo.
- Lingua franca para grandes bibliotecas e APIs
- Se não tem API C, provavelmente é uma merda
- Compiladores muito maduros que produzem código extremamente rápido e bem otimizado
- Implementações para praticamente todas as arquiteturas ou plataformas imagináveis
- Se algum hardware não tiver um compilador C para ele, provavelmente isso não importa em primeiro lugar
- Muitas coisas são deixadas indefinidas para que as implementações possam fazer a melhor escolha possível em termos de velocidade
- Fácil de cometer erros perigosos no código
- Você mesmo gerencia seus próprios recursos
- Você realiza suas próprias verificações de segurança, se quiser
- Absolutamente nada de mãos dadas
- Comportamento indefinido onde tudo pode acontecer
- O forçará a aprender muito sobre problemas de memória e de nível inferior
- Também pode ser usado para programação de aplicativos
- Linguagem muito, muito ampla e cheia de recursos
- Considerado prolixo às vezes
- C, mas com OOP no topo e um grande conjunto de bibliotecas enormes
- Padrão da indústria para software comercial amplamente utilizado
- Considerado perigoso de escrever porque, como C, não há gerenciamento de memória
- Existem coletores de lixo para C ++
- Quase tão rápido quanto C
- Compilar leva muito tempo por causa do sistema de ligação arcaico, é basicamente o que xkcd Compiling mostra
- Toneladas de recursos muito poderosos, muitas maneiras de fazer as mesmas coisas
- O cara cujo código você está lendo sempre escolhe o pior
- Apesar de ser chamado de C/C++ com frequência, um bom C++ é completamente diferente de um bom C
- O designer da linguagem tinha o seguinte a dizer sobre isso: "C torna mais fácil atirar no próprio pé; C ++ torna mais difícil, mas quando você o faz, estoura toda a sua perna"
- O que Java deveria ter sido
- Muito semelhante ao Java, mas corrige muitos dos problemas do Java, que o Java está preso devido à compatibilidade com versões anteriores
- Funciona em .NET,
que é apenas Windowse Mono, que é FLOSS e multiplataforma. - .NET é uma ótima biblioteca e agora de código aberto
- LINQ é uma maneira muito poderosa de trabalhar com coleções (listas/conjuntos/matrizes) e bancos de dados (se mapeados para coleções)
- Visual Studio/ReSharper é um IDE muito bom para C#
- Terceira linguagem mais popular no StackOverflow, comunidade muito ativa com muitos especialistas
- Alternativa aberta ao .NET iniciada quando o .NET era de código fechado (estrutura Mono que permite executá-lo em GNU/Linux)
- Implementa quase todo o .NET, mas deixa de fora muitos WinForms e WPF (coisas de GUI)
Situação legal duvidosa porque partes da linguagem estão sobrecarregadas com a patente da MS- Adquirido pela Microsoft, agora com segurança legal.
- Torna a simultaneidade/multithread uma merda muito fácil.
- Usa uma VM especializada que tem dificuldade em processar números e ainda mais em lidar com strings.
- Também conhecido como Go
- Criado por Rob Pike (um dos caras originais do UNIX) e alguns outros engenheiros do Google
- Mascote parece suspeitamente semelhante à mascote Plan9
- É basicamente C com extras mínimos, mas com coleta de lixo e alguns recursos básicos da linguagem para torná-lo realmente bom para programação simultânea (fazer várias coisas ao mesmo tempo). Não tão rápido quanto C, no entanto.
- A estrutura do diretório deve ser definida de uma determinada maneira para construir projetos
- Tem um tutorial interativo em seu site e uma ferramenta go que permite que você extraia do GitHub e empacote em Go, etc.
- Usa Goroutines para simultaneidade, que são como threads leves que se encaixam em threads para obter mais eficiência. O compilador lida com os threads para você.
- Extremamente expressivo, oferece recursos de abstração próximos ao Lisp
- Concentra-se em programação funcional pura e sistemas de tipo
- Linguagem muito rígida, se você fizer algo errado, provavelmente nem mesmo compilará
- Leva muito tempo para aprender completamente
- Pode ser difícil de manejar para problemas inerentemente com estado
- Muito portátil; compila para bytecode, que é então executado pela JVM
- A linguagem que tornou OOP comum
- Algumas decisões iniciais de design causaram problemas, mas não podem ser corrigidas devido à compatibilidade com versões anteriores
- Muito grande e empresarial
- Bibliotecas enormes e muitos softwares são escritos nela, incluindo código de trabalhos acadêmicos
- APIs muito verbosas
- Recebe muitas críticas indevidas
- Costumava ser lento há muitos anos, mas hoje em dia é muito rápido
- Pode ser complicado para escrever às vezes
- Tanto a linguagem em si quanto as bibliotecas centrais são muito burocráticas
- É ridicularizado pelos padrões de design que as pessoas usam com ele e pelos esquemas de nomenclatura detalhados frequentemente usados
- Exemplo:
public abstract class AbstractSingletonProxyFactoryBean
- Exemplo:
- Linguagem de programação da web, a maioria dos navegadores vem com um console JS nativo
- Normalmente usado em conjunto com HTML/CSS
- Bom para aprender como a programação funcional funciona com digitação de código menos explícita (por exemplo, as variáveis são assumidas como strings ou inteiros)
- Pode ser usado para fazer aplicativos de desktop (embora lentos se não forem otimizados de forma adequada) e código do lado do servidor com Node.js
- Leia JavaScript: The Good Parts de Douglas Crockford para obter uma melhor compreensão de como essa bagunça de uma linguagem pode ser usada de forma eficiente e consistente
- JSLint é uma excelente maneira de verificar se o seu JS é uma merda ou não
- Os recursos ES6/ES7 estão prontos e disponíveis para uso em navegadores modernos com Babel ™
- Família de linguagens de programação que possuem as características mais notáveis de usar notação de prefixo totalmente entre parênteses e serem homoicônicas.
- Inicialmente apareceu em 1958.
- Diz-se que o Lisp muda a maneira como se pensa sobre programação, porque expõe a árvore de sintaxe abstrata ao programador para modificação e extensão da própria linguagem para se adequar às necessidades específicas do domínio de uma tarefa particular.
- Sem limite (visível) para abstração
- Baseado em Lisp com foco no minimalismo e na simplicidade
- Popular em muitas universidades e apresentado no SICP
- Ótimo para programas com base em recursão e iteração
- Carece de portabilidade e tem poucas implementações
- Linguagem bonita com recursos de nível extremamente alto para matemática
- Capacidades matemáticas simbólicas incríveis (resolução de equações, prova de teoremas)
- A documentação oficial tem muitos exemplos interessantes de matemática
- Comum com físicos, matemáticos
- Mensagens de erro são terríveis
- Proprietário
- O criador é um megalomaníaco insano
- Projetado originalmente para trabalhar em matrizes e álgebra linear
- Funções de matriz muito rápidas
- IDE muito completa com boas opções de visualização e kits de ferramentas
- Normalmente usado para engenharia, aprendizado de máquina e computação científica
- Linguagem dinâmica interpretada
- Toneladas de código de merda por aí, escrito por alunos de pós-graduação sem noção
- Octave é um compilador FOSS que aceita um superconjunto da sintaxe do Matlab, com pequenas diferenças (menos inchaço e custo muito menores).
- Sistema de tipo muito forte, seguro e com recursos
- Sintaxe simples que prefere palavras a símbolos e é altamente estruturada
- Projetado originalmente para o ensino e muito fácil de aprender
- Compiladores rápidos de passagem única
- Cobre bem os conceitos de baixo e relativamente alto nível
- Não é mais muito popular, você não encontrará um emprego usando-o e faltam recursos de aprendizagem mais recentes para isso
- A sintaxe é considerada muito detalhada por alguns
- Preconceito herdado de problemas com versões anteriores da linguagem
- Grande número de dialetos modernos variados e compiladores podem confundir os recém-chegados
- Linguagem somente para escrita
- Sintaxe muito tácita e ilegível
- Chamada de "motosserra do exército suíço" por sua versatilidade
- Lento para tarefas não processuais
- A gramática dinâmica torna divertido escrever um código impossível
- Odiado por fanboys de Python em todo o mundo
- Pode ser OO, imperativo e ainda possui elementos funcionais.
- Evita o uso de palavras-chave reservadas, prefere rabiscos de teclado (&, $, @, ->, etc.)
- Saindo da moda
- Excelente para concursos de golfe de código ou ofuscação
O PHP tem uma péssima reputação entre os desenvolvedores. Existem muito mais linguagens comercializáveis por aí que farão tudo o que você gostaria de fazer em PHP. Apesar da opinião ruim de muitos, a linguagem continua em desenvolvimento ativo. Nos últimos anos, surgiram muitos novos recursos e uma quantidade considerável de tentativas de limpeza de código legado.
- Uso opcional de argumentos estritos e tipos de retorno (PHP 7.1+)
- Escolha para implementar padrões de projeto procedurais, funcionais ou OOP
- PHP 7 ainda é lento em comparação com Java
- Não foi projetado para durar muito
- Pode consumir muita memória, especialmente ao usar estruturas comunitárias
- Boa documentação e uma grande comunidade de desenvolvedores ativos
- Você será ridicularizado por outros desenvolvedores por usá-lo
- Muito fácil de ler e simples (e divertido) de escrever
- Biblioteca padrão enorme e versátil (uma filosofia que eles chamam de "baterias incluídas")
- Meio lento
- Usa recuo de espaço em branco para separar blocos lógicos
- Excelente para scripts
- Considerada a antítese de Perl
- OO/imperativo, tem alguns elementos funcionais, mas o designer tem uma estranha obsessão em removê-los
- É bom começar e programar, mas depois de alguns anos, você começará a querer brincar com algumas das coisas que o Python sacrifica, como ponteiros e velocidade.
- Feito para computação estatística, se destaca nisso, mas não é muito bom para qualquer outra coisa
- Bibliotecas como ggplot criam gráficos bonitos e de primeira linha
- Bibliotecas R são a vanguarda da visualização de dados
- Rstudio é um ambiente muito bom
- Os frames de dados são tipos de dados nativos fortemente tipados para trabalhar com dados tabulados
- Muito comumente usado na academia, ciência de dados, análise, etc.
- Fodidamente impossível pesquisar algo sobre isso no Google
- O namespace mais poluído e inconsistente conhecido pela humanidade
- Foco na felicidade do programador
- A ideia de felicidade do criador pode ser muito diferente da sua
- Totalmente orientado a objetos
- Código elegante e legível
- Tão lento quanto qualquer linguagem dinâmica será
- Excelente para programação de uso geral, scripts, processamento de texto e desenvolvimento web
- Base de usuários cheia de descolados e fanboys insuportáveis
- Ser substituído por linguagens menos desagradáveis que têm as mesmas vantagens (Python e JS)
- Desenvolvido por Mozilla
- Também conhecido como rust-lang
- Como Golang, também é projetado para programação simultânea
- Primeira versão estável no final de 2014
- A resposta da fundação GNOME ao C++
- Compila para código C, que pode então ser compilado com um compilador C normal
- Usa as bibliotecas GTK e GObject (GNOME)
- Tem elementos de C++ e C#, mas é mais lógico
Última edição: