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

Fortemente TIPADA ou NÃO? -DÚVIDAS DE UM INICIANTE-

Uma pequena dúvida afinal começar por qual linguagem um fortemente tipada JAVA e C# ou linguagens fracamente tipadas PHP e Javascript?
O foco é ser desenvolvedor Front-End, mas já ouvi de muitas pessoas sobre a importância de começar com uma linguagem onde você vai realmente "aprender" a programar. Acho essa maneira de comunicar um pouco ofensiva, mas pensando por outro lado começar por uma linguagem mais "complexa" ou melhor dizendo, com mais "regras", nos faz ganhar um pouco de "maturidade" forçando a fazer o que deve ser feito.

  1. Porém quanto tempo investir? 
    
  2. Quando saber que posso trocar?
    
  3. Ter uma base já é o suficiente?
    
Carregando publicação patrocinada...
4

Primeiramente, vamos aproveitar para esclarecer alguns termos sobre tipagem. Segue abaixo uma versão resumida desta explicação:

Existem tipagem estática e dinâmica, e tipagem fraca e forte, e é possível ter combinações (uma linguagem pode ter tipagem estática e forte, ou dinâmica e forte, ou estática e fraca, ou dinâmica e fraca).

Tipagem estática é quando uma variável não pode mudar seu tipo. Por exemplo, em Java, se eu definir que uma variável é de um tipo, não posso atribuir um valor de outro tipo (exceto se forem compatíveis, como no caso de sub-classes, por exemplo):

// Java, tipagem estática (o tipo da variável não pode mudar)
int x = 1;
x = "abc"; // erro: não posso atribuir uma String em uma variável com tipo incompatível

Tipagem dinâmica é quando a variável pode mudar o tipo. Por exemplo, em JavaScript:

// JavaScript, tipagem dinâmica (o tipo da variável pode mudar)
var x = 1;
x = "abc"; //operação normal, o tipo que era um number passa ser string

Já as tipagens forte e fraca não são conceitos bem definidos e aceitos universalmente, e por vezes são confundidos com tipagem estática e dinâmica. De qualquer forma, a "força" da tipagem costuma estar associado ao fato de um dado poder ser tratado como se fosse de outro tipo. Em C, por exemplo, vc pode gravar um int e acessá-lo como se fosse um ponteiro, entre outras maluquices que embora possíveis, nem sempre são úteis. Ou seja, C tem tipagem estática (uma variável não pode mudar o tipo) e fraca (um dado pode ser acessado como se fosse de outro tipo).

Também existem as linguagens que fazem coerção automática de tipos, como por exemplo PHP, na qual comparar um número com uma string pode ser verdadeiro (1 == "1" - um dos valores é convertido para o tipo do outro, e depois é feita a comparação). Nesse caso, seria tipagem fraca (um dado é acessado como se fosse de outro tipo), além de ser dinâmica (em PHP, uma variável pode mudar seu tipo).

Já Python tem tipagem dinâmica e forte: uma variável pode mudar o tipo, mas o valor não pode ser acessado como se fosse de outro (ao contrário de PHP, em Python 1 == "1" é falso), não há coerção automática.


Dito isso, falando de forma geral, o link já citado possui uma tabela que resume as vantagens e desvantagens de cada tipo:

Tipagem estáticaTipagem dinâmica
Descobre erros antesDescobre erros no último momento
O código costuma ser mais legível. Os tipos aparecem no código ou o IDE consegue mostrarO programador precisa entender e documentar o código para saber os tipos e nunca é garantido
Fornece melhor semântica para o códigoA tipagem funciona mais como um mecanismo
Fornece melhor performance na maioria dos casosA performance é inferior
SegurançaConcisão
Qualquer alteração no problema exige mudança no códigoAlterações podem ser assimiladas sem alteração no código específico
Ferramentas de desenvolvimento possuem mais informações e podem ajudar mais o programadorÉ dificil ou impossível criar/usar determinadas ferramentas que ajudam o programador
Regras do objeto são bem definidas e fixasRegras variam com o estado do objeto
Facilita a formalizaçãoFacilita o experimento
RigidezFlexibilidade
Mais difícil de aprender e usarMais difícil de manutenção
Reduz a necessidade de testesExige testes em cima dos tipos
Reutilização de código é mais complicadaReutilização de código é mais arriscada
Metaprogramação é complicadaMetaprogramação é mais fácil
Facilita grandes programasFacilita pequenos programas
São consideradas tirânicas (fun)São consideradas subversivas (fun)

As principais vantagens das "linguagens estáticas" são a segurança, performance e auxílio em tempo de desenvolvimento (refatoração, completação de código, informação auxiliar, cobertura de código etc.).

As "linguagens dinâmicas" são flexíveis, rápidas para prototipar, concisas.

Ou seja, pra variar, não existe essa de que uma das opções é sempre melhor. Saiba as vantagens e desvantagens de cada uma, e avalie qual usar em cada situação (claro que pra saber quando usar, também precisa de experiência, mas de qualquer forma, agora vc tem mais informações para decidir melhor).

Falando por mim, acho que a tipagem estática ajuda em bases de código grandes (sendo que "grande" é subjetivo). Muita gente tem percebido o mesmo, o que ajuda a explicar a crescente popularidade e adoção do TypeScript, por exemplo. Além disso, a declaração de tipos explícitos têm sido adicionada em linguagens como PHP e Python.


Por fim, sobre a "força" da tipagem, vale mencionar que na verdade o buraco é mais embaixo, e sugiro esta leitura, que é um ótimo ponto de partida para um aprofundamento maior sobre o tema.

3

Eu não ia responder porque já está muito bem respondida pelo kht, o que não tem como eu discordar já que ele gentilmente usou uma referência minha. Mas resolvi adicionar algo.

E vou começar fazendo um jabá de outras postagem minha que ajuda entender um pouco mais sobre estilos de tipagem. Tipagem é um dos assuntos mais complexos da programação, como é da matemática também. Sim, a teoria de tipos veio da matemática, não foi inventada para a computação. Então tem várias formas de classificar a tipagem.

É muito comum essa confusão com a força da tipagem, aí quando a pessoa pergunta sobre isso não sabemos se ela está falando da força mesmo. Ainda mais com esses exemplos que As duas primeiras são estática e fortemente tipadas, e as duas seguintes são dinâmica e fracamente tipadas. O que acontece se falar de Python, Lua e muitas outras que são dinâmicas e fortemente tipadas? Ou C e outras que são estática e fracamente tipadas?

E o que dizer quando a linguagem não cumpre totalmente o que a classificação indica.

Java e C#, como quase toda linguagem mais conhecida tem furos na tipagem estática null, estou falando de você, entre outros), ou até mecanismos explícitos que escapam disso, principalmente em C#. Ou quando uma linguagem como PHP que permite explicitar os tipos, o que aliás muitas dinâmicas estão fazendo isso agora, por que será?

Precisa resolver essa ambiguidade de termos antes de mais nada.

Provavelmente o termo que está procurando para definir essas linguagens, é "com mais cerimônia".

Então começando responder as perguntas: para aprender a programar bem tem que entender a computação toda. A grande dificuldade das pessoas está em aprender olhando para buracos de fechadura em várias salas, quando elas precisam frequentar todas as salas, em conjunto. E só quem faz isso vê os benefícios de fazer assim.

Por isso você pode começar com qualquer linguagem, mas a tendência (não vale para todos casos, mas a maioria) é que algumas farão você aprender melhor. Mais ainda, evitará você aprender de forma errada, porque depois para corrigir o erro custa caro, e pode não conseguir mais. Se você treina o erro é ele que você cometerá para sempre.

"Todas" as minhas falhas são porque eu treinei o erro por mais tempo que eu deveria. E é comum eu não saber que está errado no começo porque ainda não entende do assunto. E não por esse motivo não sei quanto tempo investir nisso, ou quando é para trocar. Não sabendo isso é melhor começar pelo mais adequado, o que te dá uma base melhor, mesmo que fazendo de outro jeito também dê algum resultado. O risco é menos escolher a linguagem mais certa para entender a computação.

Aprender as regras primeiro e depois a flexibilidade é absurdamente mais fácil do que prender o flexível e depois ter que lidar com as regras depois. Vemos isso em tudo na sociedade. Cada ação vai provando isso quando se trata de seres humanos. Sempre dá para arrumar, mas é mais trabalhoso e muitos nunca farão.

A boa notícias é que não dominando tudo isso muito bem ainda dá para programar, mesmo que apresente deficiências, e tem emprego. A má notícias é que sem ser bom politicamente, os melhores empregos não estarão disponíveis sem isso.

Também é ambíguo falar de frontend. Vai Desenvolver aplicativos para Android, iOS, Windows, MacOS, Linux? Ah, ok, deve estar falando de front end web, que é o que quase todo mundo quer dizer quando usa esse termo, mas ele não é só isso.

Se for isso, então tem que escolher entre TypeScript ou JavaScript. Mas também pode pensar em C# que roda nos navegadores, mesmo que muita gente não saiba. Outras linguagens também.

Eu acho que pode começar com JS, mas o mais rápido possível deveria ir para outra linguagem com mais regras. JS sequer é uma linguagem adequada para fazer o que as pessoas estão fazendo com ela (arrumei briga com fanboys da linguagem), por isso TS foi criada. Sistemas complexos são difíceis de desenvolver, e principalmente de dar manutenção em linguagens de tipagem dinâmica, mais ainda de tipagem fraca.

Você sabia que se tirasse a tipagem fraca, não precisa tirar a dinâmica, PHP e JS eliminam quase todas as críticas que fazem a elas?

Agora, para aprender sério, eu aconselho C. Eu sei, aqui a maioria está fazendo o sinal da cruz, mas é isso. Só para aprender, para entender a computação, não é nem para usar. Para focar no aprendizado de uma coisa e não de duas, que seres humanos não são bons nisso. Ou aprende a computação ou aprende a linguagem. Não é para aprender C de verdade, é só instrumento para aprender computação, sem o artificialismo do Portugol, que dá o resultado oposto. Aliás a única coisa que Portugol tem de bom é regras simples e claras, incluindo a tipagem.

Nem todo mundo precisa ir por esse caminho, tem objetivos profissionais que seria um absurdo a pessoa fazer isso ("Quero aprender teoria músical pois quero ser um grande funkeiro", não é uma ferramenta para ter sucesso nessa área - não falo do funk original que é uma música maravilhosa - e você pode gostar da música quiser também). Eu jamais digo o que as pessoas devem fazer, porque só ela terá as consequências do que ela fizer. Eu apenas prefiro o caminho que eu vi sendo melhor. Eu nunca acharei ofensivo alguém me aprender essa rota em algo que eu ainda não sei. Eu acharei ruim, mas não ofensivo, alguém disser que eu só posso escolher um caminho. Assim como não é ofensivo alguém dizer que prefere não seguir o caminho proposto, mas não imposto, por alguém experiente.

Eu votei na sua pergunta mais cedo porque esse é um assunto que realmente faz diferença na carreira da pessoa, junto com muitos outros. Quem é inexperiente não consegue perceber isso com clareza. Eu tive sorte porque sem querer foi por um caminho bom nesse ponto, não tinha quem me ajudasse. Em outros pontos foi um festival de erros, até eu achar alguém que foi consertando meus vícios. pena que essas publicações nunca ficam populares aqui, mas agradeço pela oportunidade de falar sobre.

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).

1

vai realmente "aprender" a programar.

Além de ofensivo é sem lógica - quem disse isso não sabe programar e você não deveria escutar.

No mais, tanto faz em qual linguagem você comece!
O importante é começar de algum lugar!
Js tem uma curva inicial menor da pra fazer algo raído e já ver, e da pra faer coisas legais com pouco conhecimento. Mas é uma estrada mais longa pois JS tem muita, muita coisa e quanto você mais estuda mais coisa aprende!

Tipada ou não tipada pouco importa, o que importa é vontade de aprender, criar coisas
e ir sempre aprendendo, pode começar com qualquer uma, desde que tenha afinco.

O que da maturidade é estudo e criar coisas. Pegar projetos e ir fazendo.
Se é com uma linguagem tipada ou não isso não importa!

As outras perguntas dependem de você!

Abraços

1

Novamente, seguindo a linha de uma outra postagem semelhante, acho que esssa é a pergunta errada.

Procure que problema vc quer resolver e como quer resolvê-lo que a tecnologia a ser usada aparece naturalmente.

  • "Aprender" a programar independe de linguagem;
  • "Complexa" ou não depende do quão acostumado vc está com a tecnologia;
  • A maturidade vem com o tempo e também independe da linguagem;
  • Quanto tempo investir depende só de vc, de quanto tempo vc tem e que prioridade dá para o aprendizado e qual o interesse nos resultados;
  • Trocar a linguagem vai depender novamente do problema que quer resolver;
-1

Entenda o básico de algoritmos e o básico de programação em qualquer linguagem.

Pela popularidade atual eu recomendo Javascript.

E daí você estará pronto para trabalhar com o que achar mais massa ou tiver oportunidade.

É importante aprender algoritmos e estrutura de dados.

Tenho falado sobre isso muito no CodeFTW, especialmente nesse curso https://www.codeftw.dev/cursos/conceitos-basicos-algoritmos

Atualmente está saindo vídeos de dúvidas com uma pessoa que está aprendendo a programar, o Vini. Já tem vídeo agendado para seg, quarta e sexta até 8/maio.

Confere lá.


O CodeFTW é um projeto que tenho desde 2017 para ensinar desenvolvimento, é de graça, dá uma conferida nos cursos lá. Eles estão na ordem que você deve fazer.

Você pode ir marcando seu progresso pela plataforma do CodeFTW.

Temos também uma comunidade ativa no Discord e WhatsApp para você tirar dúvidas sempre que precisar, a gente responde 100% das dúvidas, assim você nunca fica travado.