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

Muito bom, também acredito nessa ideia de focar em fundamentos. Para pessoas como eu que são autodidatas, dois livros muito bons são o "The Self-taught Programmer" e "The Self-Taught Computer Scientist" ambos do Cory Althoff que te dá uma visão geral e um norte sobre onde você pode se aprofundar
Já me passou pela frente, mas nunca comprei, bom lembrar, pode ser que eu me interesse aprofundar nele pra ajudar criar conteúdo. Muito obrigado pela indicação.
Eu não podia ter explicado de forma melhor! Excelente argumento. E quando mencionei OO como um fundamento, quis dizer que era um fundamento para entender Java com profundidade (ou qualquer outra linguagem OO).

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

Exatamente MrBacon, é muito interessante entender como funciona um sistema operacional, entender memória, processos, concorrência, entender escalonamento. Cara isso é muito importante e legal, e com certeza te faz um programador melhor. E sim, nessa área é constante aprendizado! Boa sorte na sua jornada. :)

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.

Sim eu compreendo completamente o que está dizendo, e claro, praticar é mais do que importante, é essencial! colocar um projeto real em prática traz muito aprendizado. Inclusive, quando você coloca um projeto em prática, você aprende a resolver problemas reais, sem contar a experiência de aprender a pesquisar, resolver problemas que encontra só construindo um projeto, ou seja, você aprende a aprender. Mas o que eu quis dizer na mensagem foi específico a uma situação em que fazendo só dessa forma, você trava no processo de aprendizagem em algum momento, e o problema é que quando iniciante você não sabe o que falta, e muitas vezes vamos avançando cada vez mais na tecnologia esperando que lá na frente podemos entender melhor conceitos que não sabemos que é fundamento. Então avançar não vai suprir isso, aí você trava. Claro que dá pra construir muita coisa mesmo com buracos de entendimento na base, as abstrações estão aí para isso. Mas para algumas pessoas só juntar as peças e por pra funcionar não é o suficiente. Sou voltado para prática, entendo a importância disso,talvez o foco da minha mensagem não tenha dado espaço para colocar essa perspectiva. As duas juntas com certeza é o cenário ideal. :)
Não se preocupe, para cada uma dessa tem 20 implicitamente dizendo para não estudar isso e ir só para o que dá gratificação imediata, então essa mensagem não funciona bem. As pessoas vão no que parece popular, que é o que se fala mais. Por isso é importante ter o contraponto. "Estudar demais" nunca é demais. Até porque estudar é o processo todo, não é só ler algo. Eu tenho mais medo do que ser pragmático. É bom ser, mas algumas pessoas entendem que é deixar de lado tudo que não produz gratificação imediata, o que não é pragmático. Eu não garanto nada que a pessoa terá aprendizado completo com qualquer técnica porque nenhuma exige isso. Fazer um projeto real pode ser bom, ou ruim, depende de quem faz, como faz. Se a pessoa fizer errado ela terá um aprendizado completamente cheio de erros, ela treinará o erro e fará sempre assim. Eu quase não acredito em tantas pessoas que treinaram o erro e vão aos trancos e barrancos entregando resultados, mas não bons. É muito mais fácil achar que está se dando bem quando entrega um resultado pragmático. É sempre uma forma de fazer, eu não me arrependo de preferir ir pelo caminho dos fundamentos, porque ele não me tomou tanto tempo assim. E me deu mais gratificação, ainda que não imediata.

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/

Beleza Kailly! Exato, se você está aprendendo programar em uma linguagem orientada a objetos, é essêncial compreender este paradigma. Foi quando eu dei atenção de verdade para o conceito que pude compreender melhor a linguagem (no meu caso Java). E olha, tenho muito que aprender ainda rs. Claro entrarei em contato!

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.

Entendo Sirherobrine23, a um tempo atrás eu estava estudando Java e Python ao mesmo tempo. Acho que se eu tivesse me organizado melhor poderia ter sido mais efetivo rs, mas mesmo assim acho que, como no meu caso, estudar duas linguagens ao mesmo tempo não é muito interessante, na minha opnião. Claro que aprender uma linguagem em paralelo com alguma outra tecnologia como por exemplo um banco de dados, acredito ser tranquilo, por se tratar de coisas diferentes, mas duas iguais ao mesmo tempo, acho desnecessário e ineficiente. E assim como você disse que fez, é muito importante às vezes parar, repensar, reavaliar se tudo que estamos estudando em conjunto é realmente efetivo, ou é só pressa de chegar em algum lugar. E parabéns pela sua evolução! :)
Obrigado, estou também feliz pela sua evolução e aprendizado.