Linguagens de Programação

Linguagem de programação é para muitos na área de tecnologia uma paixão, fonte de longos debates. Respeitando esse aspecto, mas buscando critérios mais claros e objetivos é possível facilitar a escolha da linguagem a ser utilizada. O tema apresenta como times de desenvolvimento podem atuar para fazer avaliações, comparações e decisões que envolvem (além da paixão) questões técnicas e a arquitetura definida.

Linguagem de programação nas últimas décadas se tornou uma grande paixão para desenvolvedores(as) de software, que embora possuam um perfil técnico, deixam a emoção falar alto quando o assunto é “linguagem predileta”.

Número de linguagens

As linguagens de programação de alto nível tiveram início ainda na década de 50, e quando perguntado “quantas linguagens existem?”, normalmente desenvolvedores(as) lembram de 5, 10, talvez 15 linguagens. Mas esse universo é bem mais vasto, a exemplo da imagem apresentada a seguir e retirada do vídeo “Sua Linguagem NÃO É Especial! (Parte 1)”.

Número de linguagens Fonte: Canal de Fábio Akita, vídeo Sua Linguagem NÃO É Especial!

Contabilizando linguagens de programação em geral, não há um número exato com relação a quantidade e diversas fontes (artigo 1, artigo 2, artigo 3) estimam um número que varia entre 700 a 9.000. Considerando apenas as linguagens ativas atualmente, há um número acima de 250, segundo o TIOBE’s index.

Essa quantidade de linguagens explicita que provavelmente as prediletas de desenvolvedores(as) não são únicas com relação ao que elas propõem. Para implementar um software, há tantas opções que dificilmente há uma escolha perfeita.

As linguagens de programação, principalmente nas últimas 2 décadas, se equipararam com relação aos recursos que oferecem a desenvolvedores(as). Embora a sintaxe e implementação possa variar entre elas e algumas sigam paradigmas diferentes, é possível afirmar que boa parte das necessidades atuais com relação a software podem ser atendidas por várias.

Neste vasto grupo de opções, a escolha da linguagem pode considerar sim a paixão, mas precisa também considerar critérios técnicos, o domínio do negócio, a arquitetura planejada e a empatia dos times. A sequência do tema elenca como lidar com essas questões de forma madura e consciente.

Paradigmas de programação

Programar está associado a conhecer as possíveis formas de como codificar a resolução de um problema e não apenas conhecer a sintaxe da linguagem. Desta forma o guia entende que compreender os paradigmas de programação facilita o aprendizado e escolha de linguagens. Por ser um tema extenso e complexo, o guia trata tal assunto em um tema próprio.

Abaixo, neste tema, é apresentado apenas uma visão resumida e simples dos principais paradigmas:

  • O paradigma imperativo surgiu para que humanos pudessem enviar ao computador instruções do mesmo modo que fazem no mundo real através de uma sequência completa de instruções determinando como deve ser o processamento.
  • O paradigma estruturado possibilitou o uso de estruturas de controle e repetição a partir de condicionais.
  • O paradigma procedural trouxe a capacidade de agrupar instruções em procedimentos que podem ser reutilizados.
  • O paradigma de Orientação Objetos, possibilitou que o código e instruções sejam modelados a partir de classes, atributos e métodos que representam objetos do mundo real.
  • O paradigma declarativo atua a partir de instruções de focam no resultado esperado, o que é oposto ao imperativo que determina a sequência de instruções a serem executadas.
  • O paradigma funcional, o qual deriva do declarativo, atua focado no uso de funções, que recebem um entrada e retornam uma saída, elas podem ser utilizadas de forma combinada até chegar ao resultado desejado, isso sem fazer mudanças no estado do software em execução.

Estrutura de tipos

Toda linguagem de programação trabalha com um modelo de estrutura de tipos, essa definição determina como desenvolvedores(as) devem escrever seus códigos e também como o software poderá se comportar durante a execução. Os tipos determinam a combinação de valores e de operações que podem ser executados sobre uma variável.

Há 3 estruturas a serem consideradas:

  • Tipagem Forte ou Fraca: Sendo forte quando a linguagem exige que o tipo de dado de um valor seja do mesmo tipo de variável ao qual este valor será atribuído. Quando é fraco, não há necessidade de explicitar o tipo de dado, e ele pode mudar conforme o valor que é atribuído a variável.
  • Tipagem Estática e Dinâmica: Sendo estática quando o tipo de variável é definido em tempo de compilação. Quando dinâmica, o tipo de variável é definido em tempo de execução.
  • Tipagem Primitiva ou Composta: Sendo primitivo (ou também chamado de nativo) quando o tipo é fornecido pela linguagem como um bloco de construção básica. Quando composta refere-se a uma composição a partir de tipos primitivos e/ou de outros tipos compostos, que podem ser fornecidos a partir de uma implementação base da linguagem ou criados conforme necessidade.

Linguagens que utilizam tipagem forte e estática, normalmente são mais verbosas, já que obrigam ao desenvolvedor declarar os tipos de forma explícita no código e qualquer questão arbitrária será apontada na compilação. Por outro lado essas características diminuem a necessidade de implementação de validações com relação ao tipo de dados e em muitos casos eliminam a necessidade de implementação de testes automatizados que garantam os devidos tratamentos no software relacionados a tipagem.

Em linguagens com tipagem fraca e dinâmica, há redução de código e de certa forma fica mais fácil a implementação. Porém diminui a legibilidade já que ao olhar a declaração de uma variável não há explícito o tipo de dado esperado para ela. Essa característica também pode facilitar a construção de algoritmos que não estejam focados no tipo de dado, mas sim apenas no valor em si. Por outro lado, é comum a necessidade de codificar validações que garantam o uso adequado das variáveis, além da necessidade de implementações de testes automatizados que garantam os devidos tratamentos no software relacionados a tipagem.

Com relação a tipagem primitiva ou composta, normalmente quando a estrutura de dados representa um objeto do mundo real, haverá uma composição de um tipo, que poderá ser o resultado de outros tipos compostos e tipos primitivos. Para tipagem primitiva, muitas linguagens apoiam o uso de tipos compostos que atuam como um Wrapper sobre seus tipos primitivos, isso porque os Wrapper’s dão poder para que alguns tratamentos sejam encapsulados ao tipo primitivo. O tipo de dado double é um exemplo comum em função de tratamentos para arredondamentos e casas decimais.

Muitos desenvolvedores(as) tendem a escolher linguagens de tipagens fracas e dinâmicas acreditando que isso torna mais fácil a programação, porém isso pode ser algo relativo.

Em resumo não há uma escolha melhor ou pior, na prática desenvolvedores(as) precisam garantir que seus software não terão erros com relação a tipagem de dados. Se a preferência for não se preocupar com isso na declaração, certamente haverá que haver uma preocupação explicitada na lógica de validação dos dados. E na situação inversa, ao não querer se preocupar com isso na lógica de validação fará com que seja optado por linguagens cuja tipagem seja explicitada na declaração.

Desenvolvedores(as) têm liberdade com relação a escolha de linguagens cuja o modelo de tipagens lhe agrade mais, mas também precisam ter a responsabilidade de garantir que uma facilidade de programação não torne frágil o seu software e que o usuário não seja penalizado com erros durante a execução.

Qual melhor linguagem?

Uma pergunta frequente no desenvolvimento de software é: qual é a melhor linguagem de programação? Profissionais da área de negócio, produto, e outras que orbitam o desenvolvimento de software, além de iniciantes na área são os que mais fazem tal pergunta. Considerando a paixão que desenvolvedores(as) têm por suas linguagens, a resposta normalmente reflete suas preferências e não necessariamente um diagnóstico detalhado e consciente.

Muitos desenvolvedores(as) acreditam ter essa resposta, porém considerando o já citado número de linguagens existentes, os paradigmas envolvidos e outras questões relevantes, não há como afirmar que há uma “linguagem melhor”. Essa resposta pode variar muito de acordo com as necessidades, contexto, negócio, times envolvidos, recursos disponíveis, dentre outros. O primeiro passo é justamente entender essas questões para então filtrar as linguagens mais aderentes e sobre elas fazer um processo de comparação.

Comparando linguagens

Comparar linguagens é uma tarefa que pode se tornar bastante subjetiva. Inúmeras comparações já foram realizadas, principalmente entre linguagens mais populares, e boa parte destas comparações estão inclusive disponíveis na internet, basta uma busca rápida de linguagem A vs linguagem B. Os resultados normalmente são convincentes, e muitos deles realmente ajudam na tomada de decisão.

Número de linguagens

A grande questão é: os critérios utilizados nas comparações condizem com as necessidades da solução e dos times? Quem publicou o resultado, está isento com relação a “paixão por uma linguagem”, ou há possibilidade de haver um resultado tendencioso?

Esses pontos são muito relevantes, pois a decisão final irá impactar a solução e os times, e tomar uma decisão considerando apenas a avaliação de terceiros pode custar caro.

Para auxiliar nessa tarefa, o guia destaca pontos relevantes que podem ser utilizados para construir uma comparação.

☛ Domínio do negócio

Escolher uma linguagem parece ser algo puramente técnico, e de fato é, mas isso não exclui a importância de entender o domínio do negócio da solução. Isso porque dependendo do domínio, haverá linguagens cuja maturidade ou recursos tornarão a implementação mais fácil e confiável. Alguns exemplos:

  • Domínio financeiro.
  • Domínio de ERP.
  • Domínio de saúde.
  • Domínio de e-commerce.
  • Domínio de logística.
  • Domínio de marketing.
  • Domínio de engenharia civil.
  • Domínio de educação.
  • Domínio de controle de acesso e segurança.
  • Domínios que envolvem ciência de dados.
  • Domínios que envolvem acompanhamento em tempo real.
  • Domínios que envolvem processamento de imagens.
  • Domínio de simulações climáticas.
  • Domínio matemático.

Cada domínio citado acima possui suas particularidades, alguns demandam maior capacidade de processamento, outros de modelagem, grandes volumes de dados em memória, transações paralelas, concorrência, cálculos matemáticos, integrações, suporte a protocolos de comunicação, algoritmos complexos, dentre muitos outros detalhes.

O fato é que entender o domínio do negócio ajudará a entender qual o paradigma mais adequado, que estrutura de tipos de dados pode ser mais conveniente, que recursos nativos são essenciais, quais bibliotecas podem contribuir, etc.

Qualquer linguagem dará condições para programar soluções de qualquer domínio, porém várias delas amadurecem ao longo do tempo se mostrando mais eficientes e aderentes a alguns domínios específicos, sejam pelos seus recursos ou comunidade envolvida.

☛ Arquitetura pretendida

Entender a arquitetura é algo que sempre deve ocorrer antes da escolha da linguagem, porém é comum o inverso, escolhe-se uma linguagem e depois define-se a arquitetura.

Os padrões arquiteturais são independentes de linguagens, eles abordam conceitos sobre como construir software e não sobre como usar uma linguagem A ou B. Após entender o negócio e estabelecer uma arquitetura é que deve-se então considerar as linguagens que melhor darão suporte a implementação seguindo tal arquitetura. Pontos arquiteturais relevantes a serem considerados:

  • A arquitetura escolhida será monolítica ou segregada em serviços.
  • O software será organizado em camadas? Caso sim, quais serão camadas físicas e quais serão camadas lógicas?
  • Haverá um frontend e backend?
  • A arquitetura será orientada a eventos?
  • Quais as formas de comunicação em casos de uso de serviços/microsserviços?
  • Qual estratégia para persistência de dados?
  • A solução deverá rodar na nuvem?
  • O Frontend, caso existir, será um “cliente rico”?
  • Qual modelo de escala pretendido, vertical ou horizontal?
  • Qual estratégia de resiliência?
  • Qual previsibilidade e estratégia pretendida para volume de requisições.
  • Haverá processos agendados?

Os pontos a serem considerados podem variar de acordo com o domínio do negócio e a arquitetura escolhida, mas a grande questão é atuar sobre esse itens para escolher a linguagem, e não o inverso, pois alguns pontos podem não ser bem atendidos pela linguagem escolhida.

Uma grande mudança nos últimos anos com o avanço de soluções distribuídas é a possibilidade de utilizar linguagens diferentes para serviços distintos, de acordo com a necessidade de cada parte da solução. Comparado a soluções monolíticas isso representa um avanço, mas também um ponto de atenção, pois a gestão do uso de várias linguagens também pode se tornar algo complexo.

☛ Performance e gerenciamento de memória.

Avaliar a performance de uma linguagem parece algo simples, mas precisa ser realizada sobre um cenário bem controlado, caso contrário os resultados podem ser distorcidos.

Pontos relevantes a serem considerados são:

  • Tempo de carregamento inicial até a execução do software.
  • Tempo de processamento de algoritmos com metaprogramação (se isso for um requisito).
  • Tempo de processamento na comunicação com banco de dados (o que pode variar conforme frameworks utilizados).
  • Tempo de processamento de serialização de dados de formatos comuns como Json, XML (o que pode variar conforme frameworks utilizados).
  • Tempo de processamento para execução de algoritmos com iteração sobre estrutura de dados.

Estes são apenas alguns itens que podem ser considerados na avaliação de performance. O grande desafio é estar atento a questões externas que podem interferir no processamento.

Com relação ao gerenciamento de memória vale avaliar:

  • Forma de liberação de memória de objetos não mais utilizados (Garbage collection).
  • Uso de cache sobre dados repetidos.
  • Memória mínima alocada para execução da máquina virtual.

Criar um cenário controlado que garanta resultados confiáveis é um desafio, dentre algumas ações de controle estão:

  • Executar os testes com o mínimo de concorrẽncia com outros programas.
  • Executar repetidos testes e trabalhar com tempo médio.
  • Coletar os tempos de execução de forma automática, através do próprio software com uso registros de logs ou através do uso de ferramentas como APM’s (Application performance management), sendo a segunda opção mais recomendável.
  • Uso de Profiling através de IDE’s ou execução por linha de comando.
  • Usar configurações de execução semelhantes na medida do possível para cada linguagem avaliada.

☛ Modo de compilação, distribuição e execução.

Muitas linguagens possuem formas distintas com relação ao processo de compilação, distribuição e execução do software. Algumas trabalham com artefatos compilados e empacotados em um único executável para um determinado SO (Sistema Operacional), outras atuam com artefatos pré-compilados, outras sobre código interpretado em tempo de execução.

São pontos que podem influenciar na escolha, pois é preciso entender se o software irá rodar em uma infraestrutura central do cliente, se rodará em Cloud, se rodará no computador do cliente. Há várias formas de fazer o software chegar ao cliente e dependendo da necessidade, algumas linguagens podem não oferecer opções viáveis, ou ainda a complexidade para fazer o software chegar ao cliente pode ser alta e tornar moroso o processo de entrega.

O amadurecimento da Cloud, uso de Containers, browsers, dentre outros, tem tornado essa questão mais fácil de ser tratada e absorvida pela maioria das linguagens populares, porém ainda assim é relevante considerar essas questões para evitar surpresas ao fim do processo de desenvolvimento.

☛ Recursos e bibliotecas disponíveis

Recursos neste contexto está relacionado ao que a linguagem oferece de opções para trabalhar com temas como:

  • Processamento paralelo.
  • Computação distribuída.
  • Uso de camadas físicas e lógicas.
  • Integração com banco de dados.
  • Protocolos de comunicação.
  • Integração com serviços de mensageria.
  • Integração com serviços de cache.
  • Integração com serviços externos.

Vale considerar para essa questão todos os pontos aos quais espera-se que os times de desenvolvimento não precisem “implementar” porque a linguagem, framework ou bibliotecas já disponibilizam.

☛ Plataformas disponíveis

Embora menos relevante do que já foi no passado, entender as plataformas nas quais o software deve rodar ainda é importante. E mesmo que soluções de backend cada vez menos dependam deste tipo de questão, no todo ainda é válido estar atento há:

  • Sistemas operacionais onde a linguagem roda (no caso do Linux vale também considerar as distribuições mais confiáveis).
  • Arquiteturas computacionais a qual o software precisará rodar, o que atualmente é mais aplicável a software embarcado.
  • Sistemas Operacionais / dispositivos para soluções mobile ou outros dispositivos móveis.

Com o uso de Cloud, grande parte das funções e processamentos de uma solução ocorrem no backend, o qual é um cenário controlado, porém o frontend ainda está mais suscetível a variações de plataforma.

☛ Estabilidade de versionamento

Entender o ciclo de evolução e atualização de uma linguagem é relevante para compreender os impactos que a escolha pode ter a médio e longo prazo. Inevitavelmente linguagens surgem, estabilizam e algumas entram na “zona do desuso”. Desta forma é normal que:

  • Linguagens novas sofrerem muitas atualizações, o que é positivo na questão de melhorias, mas negativo caso gere constante necessidade de validação de compatibilidade do software.
  • Linguagens pouco maduras realizem alguma mudança drástica e conceitual. O que pode quebrar a compatibilidade e obrigar o software a se manter em uma versão anterior, ou ainda a uma refatoração no software.
  • Linguagens percam popularidade, e não ganham novos recursos ou demorem a implementar recursos que outras linguagens já disponibilizam.

Ponderando esses pontos, é sempre válido considerar linguagens que sejam estáveis, mas que ainda ganhem novos recursos de forma planejada e responsável.

☛ Documentação oficial e suporte da comunidade

Desenvolvedores(as) dificilmente conhecerão todos os recursos e detalhes de uma linguagem de programação, desta forma é comum a necessidade de recorrer a documentação oficial e a outros canais normalmente mantidos pela comunidade engajada na linguagem. Vale então avaliar:

  • Documentação oficial clara e confiável.
  • Comunidade ativa em canais de conversação ou de dúvidas.
  • Comunidade ativa em eventos.
  • Treinamentos disponíveis no mercado.

☛ Casos de sucesso

Obter informações detalhadas sobre como outras empresas tiveram sucesso ao utilizar uma linguagem não é uma tarefa tão simples. Tudo depende do desejo das mesmas em publicar seus casos de sucesso. Porém felizmente nas últimas décadas cada vez mais empresas têm compreendido o valor deste tipo de colaboração.

Desta forma, antes de escolher uma linguagem, é válido procurar os casos onde a linguagem foi utilizada e se a experiência foi de sucesso. Sobre esses casos vale ainda avaliar se as necessidades do negócio são semelhantes a da solução pretendida.

Estar apoiado sobre grandes casos de sucesso dá mais segurança para a decisão.

☛ Profissionais no mercado

Um ponto às vezes desconsiderado, porém não menos importante é avaliar a disponibilidade de profissionais no mercado para a linguagem pretendida. Isso porque após escolher uma linguagem, inevitavelmente será necessário contar com desenvolvedores(as) para implementar o software. Embora essa questão não seja técnica, ela pode se tornar um grande problema caso os times tenham dificuldade em encontrar profissionais que conheçam e desejem trabalhar com a linguagem.

Escolhendo linguagem

O primeiro passo é estabelecer os critérios para o comparativo, que podem seguir os sugeridos no tópico anterior e outros relacionados a situações específicas. Embora existam muitas linguagens de desenvolvimento, o processo de escolha precisa filtrar para um número pequeno de opções, sendo de duas a três linguagens. Mais que isso, provavelmente tornará o processo moroso e talvez até inconclusivo.

Considerando o comparativo, é normal haver itens aos quais haverá um empate e/ou questões sem conclusão. É importante destacar quais critérios possuem maior peso, e utilizá-los para guiar a escolha.

Ao fazer a escolha, os times de desenvolvimento podem estar em momentos distintos, como:

  • Time sendo montado, poucos desenvolvedores: neste caso a escolha deve considerar que a linguagem escolhida irá interferir na montagem do time.
  • Time existente, muitos desenvolvedores: neste caso a escolha deve levar em conta as considerações e expectativas do time. Poderão haver desenvolvedores que não desejarão trabalhar com a linguagem escolhida, e será necessário atuar de forma pró ativa para resolver a questão de modo que todos fiquem satisfeitos.

Sempre que houver um time já montado é fundamental envolvê-lo em todo o processo de comparação e escolha da linguagem, pois isso aumenta o sentimento de participação na decisão e também contribui para decisões mais adequadas.

Aprendendo uma linguagem

Considerando todos os paradigmas e linguagens existentes, é comum que desenvolvedores precisem ou desejem ao longo do tempo aprender novas linguagens. Atualmente o acesso a conteúdo e treinamentos é abundante, então aprender novas linguagens já não é um desafio tão grande, porém ainda assim é válido considerar:

  • Estar livre de paixões para a linguagem já conhecida e preconceitos para as linguagens a aprender.
  • Estar aberto às diferenças existentes entre linguagens e que elas não representam algo ruim ou bom, são apenas outras abordagens.
  • Conhecer os paradigmas ao qual a linguagem é baseada.
  • Conhecer a estrutura de tipos utilizada pela linguagem.
  • Conhecer estruturas de dados e como a linguagem dá suporte a elas.

O primeiro passo mais comum para aprender uma nova linguagem é implementar o famoso “Hello World”, e de fato isso é válido. Mas além disso vale considerar também:

  • Definir um objetivo a ser implementado, preferencialmente algo cuja já se possua o conhecimento das “regras” para que o foco fique apenas na linguagem.
  • Ler a documentação oficial, e seguir os passos indicados por ela caso exista.
  • Encontrar fontes confiáveis de ajuda, sejam grupos de comunidades, canais na internet, dentre outros.
  • Ler livros com foco para iniciantes, e mesmo que contenham informações simples, o todo provavelmente ainda valerá a pena.
  • Crie um projeto para testes, experimente e aprenda a partir de um código descartável, até estar confiante a atuar sobre código de um projeto real.

Aprofundar o conhecimento em uma linguagem pode ser algo que leve anos. Muitas vezes desenvolvedores(as) aprendem o necessário para resolver as questões do dia a dia, e isso basta. Porém é importante buscar um aprofundamento sobre as linguagens utilizadas no dia a dia.

Isso normalmente ocorre através da leitura de livros avançados sobre a linguagem, e mesmo que sejam extensos e contenham material que a princípio parece ser algo pouco aplicável, ainda poderão ser válidos no futuro. Adquirir o conhecimento, mesmo que não utilizado na sequência, prepara desenvolvedores(as) com relação a conhecerem as possibilidades, e desta forma a oportunidade pode ser criada por já conhecer as possibilidades.

Rankings

Considerando os comparativos já citados, atualmente é comum haver a publicação de diversos rankings que qualificam as linguagens. Os rankings são um auxílio para a decisão da linguagem utilizada, mas é preciso estar atento a quais critérios um ranking utiliza para classificar a linguagem. Abaixo alguns critérios normalmente utilizados:

☛ Popularidade e utilização

Um dos critérios mais aplicados na composição de rankings de linguagens. Um famoso é o TIOBE’s index. Ele utiliza como critério os resultados em motores de busca e sites como Google, Baidu, Bing, Amazon, dentre outros para verificar o quanto uma linguagem está presente e sendo procurada pelas pessoas.

É um bom termômetro para entender como uma linguagem está posicionada, porém mesmo sendo um ranking respeitado, ele não considera questões técnicas, muito menos as especificidades de um negócio ou projeto em específico. Desta forma a classificação das linguagens em rankings como este não entregam uma resposta conclusiva.

☛ Performance

Este critério normalmente não gera rankings com uma lista de linguagens, mas sim benchmarking de comparação entre 2 ou 3 linguagens. É comum também benchmarkings que envolvem frameworks destas linguagens. São úteis para um direcionamento inicial, mas padecem de um problema básico, normalmente as condições de controle para execução do benchmarking não são claras ou confiáveis. Abaixo questionamentos comuns a serem feitos sobre benchmarkings para linguagens implementando um mesmo algorítmo:

  • As configurações de memória e alocação de recursos do SO são idênticas para ambas as linguagens?
  • Os times que implementaram os algorítmos e configuraram o ambiente de execução, possuem conhecimento para extrair o máximo da linguagem?
  • As execuções foram em um ambiente totalmente controlado e livre de processamentos externos do SO ou tráfego de rede?
  • Os resultados e tempos de execução foram coletados manualmente ou automaticamente, e tais tempos são sobre uma única execução ou sobre tempo médio considerando as repetições de testes?

Tais questionamentos são essenciais para obter resultados confiáveis. Linguagens possuem diferenças de performance, isso é um fato, porém é necessário haver isenção e certeza de que os benchmarkings estão sobre o “máximo potencial” de cada linguagem.

☛ Facilidade de aprendizado

Um critério menos famoso, mas o qual é utilizado para orientar principalmente aqueles que estão iniciando carreira. Também possui aplicabilidade, afinal um dos itens de comparação é “Profissionais no mercado” e uma linguagem fácil de aprender pode influenciar. Porém apenas o fato de uma linguagem ser fácil de aprender não determina o quão boa ela será para o todo.

Ao considerar o aprendizado, deve-se olhar além da linguagem e sintaxe da mesma. Esse conhecimento é importante, porém é mais importante que desenvolvedores(as) aprendam a programar independentemente de linguagem. Quando se possui um conhecimento sólido sobre programação em geral, as linguagens de programação se tornam mais fáceis de aprender.



É importante que na escolha de uma linguagem as pessoas estejam conscientes e confortáveis com a escolha. Quando a escolha envolve apenas a paixão há um risco maior de que a mesma não agrade a todos, por isso é importante trazer os aspectos técnicos para embasar essa decisão.

Os critérios que serão comparados e utilizados para a decisão devem ser os necessários para embasar a decisão com confiança, o que pode ser apenas um ou todos os citados neste tema, ou ainda outros mais.

É importante que no processo de escolha, o negócio, a arquitetura e pessoas sejam considerados.

Histórico