Blog
Dentro da Matrix
date
Oct 17, 2023
slug
dentro-da-matrix
author
status
Public
tags
Aprendizagem
Carreira
Vida
summary
2º post de 4 sobre a mudança de carreira da psicologia para a tecnologia. Post mais técnico sobre os primeiros cursos, CS50 e o clássico Bootcamp de JavaScript.
type
Post
category
Blog
updatedAt
Feb 5, 2024 12:00 PM
No episódio anterior…Links para os outros artigosDentro da MatrixDentro do BootcampProjeto 1 - Uma página web estáticaProjeto 2 - Frontend e consumo de APIProjeto 3 - Servidor, banco de dados e design de APIProjeto 4 - Backend + Frontend = E-Commerce!Tempos de luta, tempos de glóriaConteúdo bônus #2 - Vídeos!Estruturas de Dados e AlgoritmosFerramentas e Conceitos de Engenharia de SoftwareBoas Práticas e Design de Código
No episódio anterior…
Olá, meu nome é Tiago e esse é o segundo artigo da minha série de textos sobre minha transição de carreira da Psicologia para a Programação. Leia a partir do texto anterior clicando aqui. Ou não também, faça o que quiseres pois é tudo da Lei.
Na linha do tempo, estamos por volta de Maio e Junho de 2022, onde decidi arriscar e tentar algo novo. Tinha decidido começar a estudar como aprender programação por conta própria, e agora vou entrar em alguns detalhes técnicos. Mas a intenção do texto anterior continua a mesma: ser mais uma narrativa pessoal da jornada, com pensamentos e sentimentos a cada etapa. Bora então?
Links para os outros artigos
- Dentro da Matrix - Você está aqui!
- Artigo #4 - Ainda não publicado
Dentro da Matrix
Assisti vários tutoriais de como aprender a aprender a programar. Tracei uma rota. Mas estava sem norte, e ainda não tinha entendido na carne uma verdade que é repetida várias e várias vezes dentro do mundo dos estudantes de programação: isso é uma habilidade, e habilidades se aprendem fazendo. Ninguém aprende a costurar, a trocar um pneu, só assistindo tutoriais - eles te ajudam até um ponto inicial. Mas em seguida, tem que pôr a mão na massa e pegar calo. Teoria e prática precisam andar juntas, porque prática sem teoria é ação sem sentido, e teoria sem prática é decorar conteúdo.
Para sair logo desse limbo chamado de Tutorial Hell, meu amigo me recomendou o lendário curso online de introdução à ciência da computação de Harvard, o CS50. Entrei no site, estudei a grade do curso, e me intimidei. Era em C, uma linguagem ancestral e conhecida entre os novatos por ser difícil. As tarefas eram criar programas e algoritmos que passassem em testes automatizados: ou seu programa estava correto, ou errado, sem meio termo. Num sentido pedagógico, é um programa bastante intimidador, porque ele pede de você dedicação, atenção e compreensão. Não adianta dar jeitinho. (Até dá pra achar respostas prontas e copiar, mas então, qual seria o sentido?)
Depois de engolir uma dose de coragem, decidi encarar e assistir a primeira aula, 2 horas e 28 minutos de aula carregadíssima de conteúdo. Mas…nada impossível de entender!
Eis então, o meu primeiro programa!
Impressionante, né? Eu que fiz a arte original também. Não deixe o tamagocat passar fome! Se não ele vai ficar miando (aviso: é bem alto).
Continuando essa introdução lúdica ao CS50, mas que foi bem útil pra ensinar os tijolos da lógica da programação, segui então com C estudando tipos de dados, operadores, condicionais, laços de repetição e como usar a linha de comando. Tudo básico, essencial, fundamental. Mas o mais importante: estruturado. Enquanto estivesse nos trilhos desse curso, sentia que sairia com uma competência muito maior do que quando eu entrei.
Os Problem Sets foram…severos, mas muito interessantes. Algumas coisas que acabei escrevendo:
- Um algoritmo para minimizar o número necessário de moedas para devolver de troco em uma compra
- Um editor de fotos por linha de comando, com as funções de espelhar horizontalmente uma imagem (invertendo a ordem dos bytes no eixo horizontal), além de filtro sépia e preto e branco usando laços de repetição duplos para percorrer uma matriz de bytes, alterando o esquema RGB
- Um modulador simples de áudio, alterando volume.
- Um identificador de genes em uma sequência genética: falando assim parece muito chique, mas é nada mais que um identificador de substrings em uma série de strings gigantes.
- Um verificador ortográfico.
Isso tudo é só até a 5ª aula de 10. Na sequência, refiz alguns desses códigos em Python, e explorei o lado Web da programação usando Flask, HTML, JavaScript e CSS. Tive também minha primeira experiência consumindo uma API e fazendo um servidor simples.
Saí desse curso sentindo algumas coisas importantes. A primeira dessas, foi a alegria que o senso de competência me trouxe, confesso que fiquei um pouco viciado nisso. A segunda, é que eu sabia que essa competência só veio porque eu tinha feito coisas, não só lido ou assistido. A programação, num certo sentido, tinha sido desmistificada, e sentia que com dedicação e persistência poderia aprender qualquer coisa.
Foi também talvez um dos desafios mais difíceis que eu já enfrentei, intelectualmente falando. Senti como se tivesse sido jogado numa piscina funda para aprender a nadar. Não só não me afoguei, como peguei gosto pela coisa. Só que também cheguei a bater a cabeça na mesa. Também sonhei com o código, e acordei com a solução. Esqueci de comer porque um programa não funcionou, e um bug se tornou uma obsessão. Acho que fiquei um pouco “mais” maluco nessa época, chegou a ter uma noite que chorei de alegria quando consegui entender a solução. E isso tudo foram 3 meses de estudo incansável e obcecado. E quando terminei o CS50, senti na minha alma que era isso que eu queria fazer.
Terminando o CS50, estava pronto para dar um passo a mais engajado. Não queria seguir com mais cursos online soltos, sentia que precisava de mais estrutura. Estava disposto a investir, não apenas tempo. Nem só de curso grátis vive um autodidata, e eu queria algo que me colocasse mais próximo de competências que me orientassem para algo mais direcionado para empregabilidade.
Dentro do Bootcamp
Graças ao meu amigo (quem tem amigo tem tudo), pedindo orientação sobre próximos passos, ele me orientou ao Curso de Desenvolvimento Web da Gama Academy. Eu já sabia que precisaria abrir a carteira, então saquei tudo que tinha na minha poupança e investi. Já estava entrando num modo “tudo ou nada”, e o olhar era pro primeiro emprego na área, além do aprendizado que eu teria no curso.
E que curso interessante foi esse. Primeiro, completamente remoto, o que me obrigou a participar das aulas apenas por videoconferências, ou interagindo com o Slack (nunca tinha usado antes) com meus outros 50 colegas, usando mais o Trello, e assistindo a aulas pré-gravadas. A orientação do curso, pelo menos na propaganda que recebi, era que haveria uma “feira de empregos” ao final do curso, coisa que não vi acontecer, já pra adiantar uma certa frustração ao final.
Claro que o curso não foi perfeito e não quero tecer críticas ao curso nesse momento, mas acho importante mencionar isso mesmo que de relance porque muita gente que também trilhou esse caminho comigo saíram frustrados, ou sentiram que não aprenderam muito. Infelizmente a metodologia não funcionou pra muita gente. No geral, senti novamente que não basta só fazer o curso e pegar um certificado (que sozinho, não vale quase nada). Precisava fazer uma limonada com meus limões. Mas, vamos falar de coisas boas? Projetos!
Projeto 1 - Uma página web estática
Após algumas aulas introdutórias, aprendi o básico de HTML, CSS, como trabalhar remotamente com GitHub e Slack, e recebi meu primeiro trabalho em grupo e virtual. A tarefa era seguir um guia de estilo recebido por um Figma, bem simples em princípio, mas extremamente trabalhoso, até porque foi feito com HTML e CSS cru e sem nenhuma biblioteca ou Frameworks modernos.
Uma das lições que tirei foi que: manipular Flexbox ou Grid na mão, com olhar pra responsividade, é…complicado.
Projeto 2 - Frontend e consumo de API
Tive o prazer de conhecer ótimos colegas nesse projeto, o Thiago Corrêa de Almeida (ele vai voltar no final!) e a Lilian Oliveira, onde nossa tarefa era usarmos JavaScript para fazer o consumo de uma API desenvolvida pela equipe da Gama Academy, fazendo as operações CRUD básicas, bem como estilizar a página com animações, como o que dá pra ver no carrossel. Foi bem interessante principalmente porque aprendemos muito uns com os outros, fazendo reuniões online e coordenando as features com os commits e o que cada um poderia fazer.
Projeto 3 - Servidor, banco de dados e design de API
Neste projeto, desenvolvido com a Cláudia Arai e Matheus Boneli, tive minha segunda experiência escrevendo um servidor (o primeiro foi um em Flask no CS50). Mas esse servidor tinha que ser muito mais robusto que aquele primeiro exercício. Envolveu MySQL, migrações, desenho de rotas e testagem das operações CRUD, e tive a chance de usar o Postman pela primeira vez. Eu aprendi muito com essa experiência, e fiquei muito feliz com esse exercício. Até então eu estava meio aberto ao que eu acabaria gostando mais, se seria o Frontend ou o Backend. Mas neste projeto, eu achei os desafios do Backend muito interessantes!
Importante destacar que esse projeto foi feito só com JavaScript, coisa que, olhando hoje com mais experiência de linguagens tipadas, me deixa arrepiado. Eu nunca mais vou fazer um servidor só com JavaScript puro, socorro.
Projeto 4 - Backend + Frontend = E-Commerce!
Esse foi nosso projeto final, um E-commerce de uma loja fictícia de produtos Nerds. Dividimos ele em dois grupos: eu junto com o Thiago (olha ele de novo) desenvolvemos o Backend, enquanto no Frontend, desenvolveram Gabriel Barbosa e Flávio Gatti Montefusco. Porém, agimos como pequenos times separados, onde traçamos um plano comum no início, e semanas depois de desenvolvimento, coordenamos a configuração do deploy do sistema na máquina de todos, e experimentamos um pouco com o deploy do servidor no Railway, já que o free-tier do Heroku havia deixado de existir a poucos meses.
No lado do Backend, Tiago e Thiago trabalharam dia e noite para desenvolver o servidor mais robusto possível para o nível que havíamos conseguido chegar no curso. Criamos um Modelo Entidade-Relacionamento (MER) para gerar a primeira versão do Banco de Dados com o MySQL Workspace, aprendemos sobre TypeScript, novas funções do Sequelize como nosso ORM, e como fazer relações complexas como a inserção de uma lista de itens e uso de algumas boas práticas para melhorar a arquitetura do servidor. Além disso, me orgulho de ter escrito minha primeira documentação de API via Swagger manualmente, o que foi ao mesmo extremamente trabalho, mas que acabei aprendendo muito!
E como resultado, nosso projeto foi o melhor avaliado dentre vários outros projetos incríveis! Esse momento é até hoje, para mim, ainda um pouco inacreditável.
Tempos de luta, tempos de glória
Esse período de 6 meses foi muito difícil. O curso não pedia que eu entregasse num patamar altíssimo de qualidade, muitas coisas acabei me impondo mesmo quando eu começava a pesquisar “qual seria a melhor maneira de fazer isso?”. Acabei me entendendo como alguém que sempre quis ir mais e mais longe, aprender aquilo que era difícil, saber fazer e me tornar alguém competente nesse mundo. Eu não estaria satisfeito se eu simplesmente não conseguisse debugar um problema, eu trabalhava horas até funcionar. O bug dos meus colegas eram meus bugs, e aprendi a me comunicar e coordenar o trabalho em conjunto com as equipes que me envolvi. Os projetos, muito mais do que as aulas, foram experiências incríveis. Algumas pessoas, espero poder trabalhar um dia junto novamente (pena que moro longe de todos!).
Foi tão difícil concluir o curso que, terminado ele, tirei pelo menos um mês de folga, e meu Abril foi relaxado. Não recomendo a ninguém a rotina que eu fiz, mas de alguma maneira, foi tudo tão interessante que consegui sustentar o interesse contínuo no curso do começo ao fim.
Antes de fechar esse capítulo, queria dar destaque que saí desse período sentido um ótimo sentimento de competência, mas que não vinha de qualquer ideia de “domínio” ou “maestria”. Eu ainda me sentia um iniciante, me sentia um bebê nesse mundo. A competência vem exatamente do campo daquilo que eu “sabia que sabia”, mas aquilo que eu “sabia que não sabia”, ainda me causava curiosidade e frio na barriga. E por mais que eu aprenda coisas novas, entendo que esse sentimento nunca vai embora, não importa o que eu estude. Fazer as pazes com a própria ignorância é meu antídoto pra tão falada “síndrome do impostor”.
No próximo artigo quero falar sobre o último programa no qual participei, o +Devs2Blu, daqui da cidade em que moro. Vou mencionar um pouco os projetos que fiz, os colegas que caminharam comigo, mas quero dar mais destaque para os “então” e os “finalmente” que vieram depois de tanto treinar. Afinal, não sou uma pessoa que só programa por paixão (tem um pouco disso, claro), mas nunca perdi de vista a linha de chegada.
Conteúdo bônus #2 - Vídeos!
Quase tudo em Inglês mesmo. Não que não existam bom conteúdo em português, é só que como eu já tinha o inglês desde o início, e muitas referências usavam outras referências em inglês, uma coisa levou a outra e…ah, pra que eu to me justificando? Bora aprender inglês!
Estruturas de Dados e Algoritmos
- Data Structures Easy to Advanced Course - Full Tutorial from a Google Engineer
- Autor: William Fiset
- Plataforma: FCC
- Nota: acabei fazendo várias anotações nesse curso, recomendo fortemente!
- C Programming Tutorial for Beginners
- Autor: Mike Dane
- Plataforma: FCC
- Nota: suplemento na época que eu estava estudando CS50
- Quicksort explicado ao vivo
- Autor: Guto Kawakami
- Nota: eu não conseguia entender QS até ver esse vídeo
Ferramentas e Conceitos de Engenharia de Software
- Tech Talk: Linus Torvalds on git
- Autor: Linus Torvalds
- Nota: entender a motivação que levou à criação do git finalmente me deu a compreensão necessária para conseguir usar ela completamente. Hoje eu uso git pra versionar até minhas anotações em Markdown
- How to OVER Engineer a Website // What is a Tech Stack?
- Autor: Fireship
- Nota: muitos vídeos desse canal são incríveis, mas esse me ajudou em particular, no começo, para começar a dar sentido para tanta tecnologia que não conhecia na época
- The JavaScript Survival Guide
- Autor: Fireship
- Nota: começar a aprender programação com JS é meio amaldiçoado…
- 10 Spring and Spring Boot Common Mistakes You Need To STOP
- Autor: Amigoscode
- Nota: um dos tipos mais interessantes de tutoriais para se aprender algo novo é justamente ir pro lado inverso e aprender o aquilo que não é para se fazer
- Software Testing Tutorial - Learn Unit Testing and Integration Testing
- Autor: Amigoscode
- Nota: testagem de software ainda é um desafio
Boas Práticas e Design de Código
- The Flaws of Inheritance
- Autor: CodeAesthetic
- Nota: recomendo fortemente esse canal, nem que seja para olhar para uma questão por um outro ponto de vista. Lembrem-se, não existem dogmas. A edição dos vídeos desse canal também é de outro mundo.
- Typescript Mistakes Every Junior Developer should Avoid
- Autor: CoderOne
- Nota: mais um vídeo sobre o que não fazer. Sair do JS e migrar para TS pode te tentar a tirar o modo strict do tsconfig, ou usar any sem cuidado.
- the coding project that improved my skills the most
- Autor: PIRATE KING
- Nota: quando estava entre cursos, ver essa proposta de projeto dele começou a me fazer pensar que eu até teria “como” fazer esse projeto, ou que não seria impossível, pena que ainda não consegui tempo pra implementar. Tenho certeza que quem percorrer por esse tipo de caminho, de fazer aplicativos fullstack por conta, aprenderá muito!
- CS75 (Summer 2012) Lecture 9 Scalability Harvard Web Development
- Autor: David Malan
- Nota: Existem poucos vídeos atuais sobre o assunto no Youtube dados pelo programa de CS gratuito de Harvard.
- Desvendando o CSS Grid na prática
- Autor: Mayk Brito
- Nota: Esse vídeo DESTRAVOU o Grid para mim, e sempre volto pra ele quando me esqueço.
- Hashes 4 Hash Functions for Strings
- Autor: Rob Edwards
- Nota: útil para senhas e outras coisas mais.