Caro programador iniciante, fundamentos!
Eu sempre me preocupei em aprender a linguagem de programação, seus frameworks, os checklist das tecnologias que as vagas de emprego exigem, mas isso não estava funcionando muito bem.
Em pouco tempo, percebi que estava travado, não conseguia evoluir, estava ficando mais difícil entender conceitos mais profundos, então percebi que estava estagnado.
Eu sempre fui teimoso e batia naquela mesma tecla – talvez se eu aprender tal framework vou conseguir fazer mais com ele – mas essa outra linguagem nova pode ser mais interessante – vou voltar focar na primeira linguagem que estudei porque descobri que tem mais chances de conseguir um emprego. Na verdade, eu não percebia que o que estava me limitando a evoluir na área não era a linguagem de programação, nem os frameworks ou qualquer outro conjunto de skills. O que estava me limitando era uma deficiência nos fundamentos!
Eu tive essa virada de chave quando fui ler sobre Threads em Java e percebi que eu mal sabia explicar o que era um processo, então pensei, estou lendo sobre threads mas nem sei o que é um processo direito, como posso eu querer criar softwares, que são processos em execução, se mal compreendo o que é um! Não quero ser um programador que escreve uma aplicação simplesmente porque aprendeu que é assim que escreve, confiando nas abstrações que a linguagem ou o framework me dá. Eu quero saber como isso tudo acontece de verdade, usar um framework pela agilidade que ele proporciona, mas sabendo que posso muito bem escrever essas abstrações se eu quiser. Nesse dia percebi também que eu sabia uma linguagem orientada a objetos mas não compreendia muito conceitos de OO profundamente, sendo assim, então eu não sabia tanto essa linguagem como eu pensava!
Após isso, a primeira coisa que fiz foi estudar orientação a objetos, todos os conceitos, encapsulamento, herança, polimorfismo, entre outros. Quando entendi profundamente esses conceitos, percebi que antes tinha uma visão muito estreita da linguagem Java, e agora compreendia uma estrutura completa. E o framework Spring, comecei a entender muita coisa que estava por trás daquelas abstrações, e continuar estudando Spring ficou muito mais fácil e muito mais rápido. Comecei pegar gosto por saber mais, comecei a estudar a fundo sobre coleções, tipos de dados avançados, várias formas de manipulação de arquivos, conexão com banco de dados com JDBC … enfim, estou a um tempo estudando OS, lendo Sistemas Operacionais Modernos de Tanenbaum, inclusive acho requisito básico e indico.
O que quero dizer com isso, compreendendo melhor os fundamentos, já consigo ter uma grande facilidade para avançar nos estudos em outras tecnologias, e está sendo muito mais rápido avançar. Essa virada de chave foi muito importante. Claro que os estudos não param, nessa área o que não para é o estudo.
Ainda não sou um programador profissional, ainda estou no rumo para conseguir o primeiro emprego, porém já consigo desenvolver muita coisa bacana sozinho, mas isso tudo depois de compreender mais os fundamentos.
A Mensagem
Se você está iniciando e se identifica com a mesma situação que eu estava, a mensagem é para você, reavalie a sua base! Como está seu conhecimento nos fundamentos da computação ou minimamente da linguagem que você programa? Quando você foca nos fundamentos, tudo fica mais fácil e rápido para evoluir! É só uma dica de um programador, que como vários outros, já tropeçou nesta parte da trilha. Há! E não acredite nos cursos de três meses! rs
Obrigado por postar isso e oportunidade de falar mais um pouco sobre o assunto (tá quase virando um livro), eu vivo repetindo aqui e em outros lugares a importância dos fundamentos. Porque é realmente a falta dele que está fazendo as pessoas patinarem, e não é fácil elas, que ainda não têm experiência, perceberem isso, ainda mais com a internet inundando com material sobre tecnologia e não fundamento.
Fundamentos
Mas falo muito também que o fundamento em computação/engenharia de software (note que não é só questão de programação) não existe no vácuo. Ninguém vai aprender bem isso sem estar com o mínimo de matemática, comunicação e expressão e ciências.
Ninguém vai resolver problemas de lógica com programação. Ninguém vai aprender bem programação sem estar com a lógica em ordem. Não vai aprender os conceitos de programação sem os conceitos de matemática estarem dominados. Até porque tudo na programação vem da matemática. Só terraplanista acha que dá para programar sem matemática dominada (sem ter que decorar fórmulas e coisas avançadas).
Ninguém vai obter requisitos sem interpretar texto, escrito ou falado, ou até visualizado, e mais ainda, até o que está oculto. Ninguém vai se comunicar bem com outros profissionais, e até com o computador sem ter se virado minimamente bem com comunicação e expressão, saber o mínimo de línguas, o porquê de escrever de um jeito ou de outro, como forma as frases e a motivação disso. Não vai se dar bem quem não tem atenção aos detalhes, por mais dificuldade que a pessoa tenha. Ao mesmo tempo que não consegue ver o todo do que o "texto" do produto que está desenvolvendo.
Não dá para criar soluções sem tudo isso e entender como a ciência funciona. Sem saber o método científico. Parece coisa da NASA, mas é super simples. è fazer a tal análise de sistemas de forma correta. O termo nem anda sendo usado mais. Isso é o que diferencia quem faz um monte de remendo e quem faz software. Entender a ciência, olhar o todo, fazer experimentos, observar os resultados, prever o que poder acontecer de errado ou certo, corrigir rotas, criar hipóteses, reconhecer erros, fazer a evolução acontecer, ser crítico e questionador com o que está fazendo, olhar para a sociedade e entregar algo realmente positivo e não apenas fruto do ego.
Orientação a objetos
Comecei a mexer com orientação a objetos nos anos 80. Pouco antes eu achei que eu tinha inventado o treco (ahhh, a adolescência). Claro que eu não sabia o nome, nem era exatamente o que as pessoas aprendem hoje, não importa se seguem a escola do Alan Kay ou do Bjarne Stroustrup, mas eu vislumbrei que aquilo era o caminho.
E eu estava errado, em parte. Não era só ele o caminho. Abusei dele muito, mas hoje consigo achar o equilíbrio, até onde dá, o mercado te força um pouco ao abuso. Mas fui vendo o que funciona melhor e o que é mais ilusão. Fui entendendo que algumas pessoas só se sentem mais confortáveis. E fui vendo muita gente entrando na área e só adotando isso porque é o que está na moda. Muitas vezes a pessoa não tem a menor ideia do que é OO, mesmo dizendo que faz. E isso precisa mudar para a pessoa evoluir. Não deixa de ser um fundamento entender OO.
A orientação a objetos em si não é um fundamento da computação ou engenharia de software. As pessoas acham isso porque está na moda, falam demais nela. Isso é um conceito avançado que deve ser dominado de todo, mas não é fundamental, no começo. Não é isso que selará o destino da pessoa. Eu até acho que as pessoas colocando como fundamento faz desviar do mais importante para algo com relevância menor.
No momento certo, quando os reais fundamentos estão bem, até para aproveitar melhor algo que é difícil (sim, OO é mais difícil do que as pessoas pensam, fazer errado é fácil, certo é difícil), aí deve aprender OO com profundidade, deve ir no fundamento de OO, não só copiar receita de bolo sem contexto, não ir apenas no fluxo, ver por cima o que a tecnologia usada obriga saber de OO.
Quem não tem tempo para criar os fundamentos, para evoluir, para consertar os defeitos, nunca terá tempo para nada, porque a pessoa passa boa parte do tempo que faria isso "apagando incêndios". Desde "moleque" eu já falava isso para as pessoas. Eu conheço gente que há mais de 30 anos não tem tempo para estudar corretamente, e cada vez pior porque estão gastando o tempo consertando problemas, muitas vezes de decisões erradas. Tem um monte gente "experiente" que toma decisões erradas por falta dos fundamentos e que paga um preço alto. Mas nem consegue perceber. E alguns viram gurus de outras pessoas criando um círculo vicioso.
Conclusão
Pode ser que não precise de algo, mas sempre vai te ajudar de formas que você nem espera. Os fundamentos que diferenciam o bom profissional do medíocre. Não é só dar resultado, é dar bom resultado, e quem não tem fundamento não consegue nem avaliar se é bom ou não.
Todos nós erramos, eu errei e ainda erro muito, mas tive a sorte de ter algumas pessoas no meu caminho que foram ajustando o que eu ia errando. Algumas pessoas próximas, outras só na internet. Já tem gente no Tabnews que está fazendo isso por mim.
Não sei se estou certo, falo da minha experiência.
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).
Cara, tudo o que você falou é verdade, eu estou embarcando nesse mundo e comecei a estudar shell-script no linux e estou tentando absorver toda a teoria, mas também já comecei a praticar, escrevendo meus primeiros scripts e fazendo pacotes de instalação, mas isso tudo pegando a base de como funciona o SO e seus processos e teorias, quero aprender ainda mais sobre isso, focando nos fundamentos e evoluindo cada vez mais, nunca dá para aprender tudo, temos que buscar evolução constante
O meu medo em mensagens como essa e que as pessoas fiquem tentadas a "estudarem demais" uma coisa(linguagem, framework ou até logica) e não serem nem um pouco pragmáticas.
Eu acredito em equilíbrio em relação ao estudo teorico e prática. Meu conselho sempre foi: se você ja tem uma certa "autonomia" com a linguagem/framework/whatever em questão vá em frente e construa uma soluçao pra um problema real, nada de projeto de curso e não importa que seja algo simples te garanto que seu aprendizado será completo.
Eae Thiago beleza? Cara atualmente também estou estudando programação, nunca me aprofundei muito em OO, e deve ser por isso que tenho dificuldade em algumas questões. Achei bacana que está aprendendo java, vamos bater um papo? Manda um alô no linkedin rsrs....https://www.linkedin.com/in/kaillyarruda/
também fui assim no começo, primeiro comecei meu domínio em Linux, hoje entendo bastante sobre o vasto mundo Unix/Posix, não so mais Linux, mas em Multiplataforma. Uma coisas que me identifiquei muito foi querer aprender varias coisas, mas nem consegui fazer um, e hoje domino muito Javascript e Typescript por repensar como funciona tudo e não querer aprender 3 coisas ao mesmo tempo. hoje consigo fazer um backend Nodejs Funciona por completo, e agora posso sair do backend e ir para o front end mais tranquilo. não só na parte de programação mas também em Hardware também.