Ensine-se Ciência da Computação

Guia para auxiliar no aprendizado autodidata de ciência da computação

View on GitHub

Se você é um engenheiro autodidata ou graduado em bootcamp, você deve aprender ciência da computação. Felizmente, você pode se dar uma educação de CS de classe mundial sem investir anos e uma pequena fortuna em um programa de graduação.

Há muitos recursos disponíveis, mas alguns são melhores que outros. Você não precisa de mais uma lista “200+ cursos on-line gratuitos”. Você precisa de respostas para estas perguntas:

Este guia é nossa tentativa de responder definitivamente a essas perguntas.

TL; DR:

Estude todos os nove assuntos abaixo, aproximadamente na ordem apresentada, usando o livro ou texto sugerido ou a série de palestras em vídeo, mas é ideal que estude ambos. Você deve gastar em torno de 100-200 horas de estudo de cada tópico, e depois basta apenas revisitar os favoritos ao longo de sua carreira 🚀.

Tópico Por que estudar? Melhor livro Melhores vídeos
Programação Não seja a pessoa que “nunca entendeu muito bem” algo como Recursividade. Structure and Interpretation of Computer Programs Berkeley CS 61A, de Brian Harvey
Arquitetura de Computadores Se você não tiver um modelo mental sólido de como um computador realmente funciona, todas as suas abstrações de alto nível serão frágeis. Computer Organization and Design Berkeley CS 61C
Algoritmos e Estruturas de Dados Se você não souber usar estruturas de dados onipresentes como pilhas, filas, árvores e gráficos, não conseguirá resolver problemas difíceis. The Algorithm Design Manual Palestras de Steven Skiena
Matemática para CS CS é basicamente um ramo descontrolado de matemática aplicada, então aprender matemática lhe dará uma vantagem competitiva. Mathematics for Computer Science MIT 6.042J de Tom Leighton
Sistemas operacionais A maior parte do código que você escreve é ​​executada por um sistema operacional, portanto, você deve saber como eles interagem. Operating Systems: Three Easy Pieces Berkeley CS 162
Redes de Computadores A Internet acabou sendo um grande negócio: entender como funciona para liberar todo o seu potencial. Computer Networking: A Top-Down Approach Stanford CS 144
Bancos de dados Os dados estão no centro dos programas mais significativos, mas poucos entendem como os sistemas de bancos de dados realmente funcionam. Readings in Database Systems Berkeley CS 186 de Joe Hellerstein
Idiomas e Compiladores Se você entender como linguagens e compiladores realmente funcionam, você escreverá um código melhor e aprenderá novos idiomas mais facilmente. Compilers: Principles, Techniques and Tools Curso de Alex Aiken em Lagunita
Sistemas distribuídos Atualmente, a maioria dos sistemas é distribuída. Distributed Systems, 3rd Edition by Maarten van Steen 🤷‍

Por que aprender ciência da computação?

Existem 2 tipos de engenheiros de software: aqueles que entendem bem a ciência da computação para fazer um trabalho desafiador e inovador, e aqueles que apenas se dão bem porque estão familiarizados com algumas ferramentas de alto nível.

Ambos se chamam engenheiros de software e ambos tendem a ganhar salários semelhantes em suas primeiras carreiras. Mas os engenheiros do Tipo 1 crescem para um trabalho mais satisfatório e bem remunerado ao longo do tempo, seja um trabalho comercial valioso ou projetos inovadores de código aberto, liderança técnica ou contribuições individuais de alta qualidade.

Engenheiros do tipo 1 encontram maneiras de aprender ciência da computação em profundidade, seja por meios convencionais ou pelo aprendizado implacável ao longo de suas carreiras. Os engenheiros do tipo 2 normalmente permanecem na superfície, aprendendo ferramentas e tecnologias específicas em vez de suas fundações subjacentes, apenas adquirindo novas habilidades quando os ventos da moda técnica mudam.

Atualmente, o número de pessoas que entram na indústria está aumentando rapidamente, enquanto o número de graduados em CS é essencialmente estático. Esse excesso de oferta de engenheiros do Tipo 2 está começando a reduzir suas oportunidades de emprego e a mantê-los fora do trabalho mais gratificante do setor. Não importa se você está se esforçando para se tornar um engenheiro do Tipo 1 ou simplesmente procurando mais segurança no trabalho, aprender ciência da computação é o único caminho confiável.

Guias de Tópicos

Programação

A maioria dos programas de pós-graduação começa com uma “introdução” à programação de computadores. As melhores versões desses cursos atendem não apenas aos novatos, mas também àqueles que perderam conceitos e modelos de programação benéficos enquanto aprendiam a programar.

Nossa recomendação padrão para este conteúdo é o classico Structure and Interpretation of Computer Programs, que está disponível on-line gratuitamente como livro e como um conjunto de palestras em vídeo do MIT. Embora essas palestras sejam ótimas, nossa sugestão de vídeo é na verdade as palestras do SICP do Brian Harvey (para o curso 61A em Berkeley). Estes são mais refinados e mais direcionados a novos alunos do que as palestras do MIT.

Recomendamos trabalhar pelo menos nos três primeiros capítulos do SICP e fazer os exercícios. Para uma prática adicional, trabalhe com um conjunto de pequenos problemas de programação, como os do exercism.

Para aqueles que acham o SICP muito desafiador, recomendamos o How to Design Programs. Para aqueles que acham que é muito fácil, recomendamos Concepts, Techniques, and Models of Computer Programming.

Arquitetura de Computadores

Algoritmos e Estruturas de Dados

Matemática para Ciência da Computação

Sistemas operacionais

Redes de Computadores

Bancos de dados

Idiomas e Compiladores

Sistemas distribuídos

Perguntas frequentes

E quanto a IA / gráficos / pet-topic-X?

Tentamos limitar nossa lista a tópicos de ciência da computação que sentimos que todo engenheiro de software praticante deve saber, independentemente de especialidade ou setor. Com essa base, você estará em uma posição muito melhor para pegar livros ou documentos e aprender os principais conceitos sem muita orientação. Aqui estão os nossos pontos de partida sugeridos para algumas “eletivas” comuns:

Quão rigoroso é o sequenciamento sugerido?

Realisticamente, todos esses tópicos têm uma quantidade significativa de sobreposição e referem-se uns aos outros ciclicamente. Tomemos por exemplo a relação entre matemática discreta e algoritmos: aprender matemática primeiro ajudaria você a analisar e compreender seus algoritmos em maior profundidade, mas primeiro os algoritmos de aprendizagem forneceriam maior motivação e contexto para a matemática discreta. Idealmente, você revisitaria esses dois tópicos várias vezes ao longo de sua carreira.

Como tal, o nosso sequenciamento sugerido está principalmente lá para ajudá-lo a apenas começar… se você tem uma razão convincente para preferir uma sequência diferente, então vá em frente. Os “pré-requisitos” mais significativos em nossa opinião são: arquitetura de computadores antes de sistemas operacionais ou bancos de dados, e redes e sistemas operacionais antes dos sistemas distribuídos.

Quem é o público-alvo deste guia?

Temos em mente que você é um engenheiro de software autodidata, graduado em um curso técnico ou estudante do ensino médio precoce, ou um estudante universitário procurando complementar sua educação formal com algum estudo autônomo. A questão de quando embarcar nessa jornada é inteiramente pessoal, mas a maioria das pessoas tende a se beneficiar de alguma experiência profissional antes de mergulhar muito na teoria da Ciência da Computação. Por exemplo, percebemos que os alunos adoram aprender sobre sistemas de banco de dados se já trabalharam com bancos de dados profissionalmente ou sobre redes de computadores, se trabalharam em um ou dois projetos da web.

Como isso se compara aos currículos do Open Source Society ou freeCodeCamp?

O guia OSS tem muitos assuntos, sugere recursos inferiores para muitos deles e não fornece nenhum raciocínio ou orientação sobre por que ou quais aspectos de determinados cursos são valiosos. Nós nos esforçamos para limitar nossa lista de cursos àqueles que você realmente deve saber como engenheiro de software, independentemente de sua especialidade, e para ajudá-lo a entender por que cada curso está incluído.

O freeCodeCamp é focado principalmente em programação, não em ciência da computação. Por que você pode querer aprender ciência da computação, veja acima.

E a linguagem X?

Aprender uma linguagem de programação específica é um plano totalmente diferente de aprender sobre uma área da ciência da computação - aprender uma língua é muito mais fácil e tem muito menos valor. Se você já conhece algumas linguagens, sugerimos que você simplesmente siga nosso guia e ajuste a aquisição de linguagens nas lacunas ou deixe-o para depois.

Se você aprendeu a programar direito (como através da Estrutura e Interpretação de Programas de Computador ), e especialmente se você aprendeu compiladores, você deve levar pouco mais que um fim de semana para aprender os fundamentos de uma nova linguagem.

E sobre a tecnologia da moda X?

Nenhuma tecnologia é importante o suficiente para que aprender a usá-la seja uma parte fundamental de sua educação. Por outro lado, é ótimo que você esteja animado para aprender sobre isso. O truque é trabalhar de trás para frente a partir da tecnologia específica para o campo ou conceito subjacente, e aprender isso em profundidade antes de ver como sua tecnologia moderna se encaixa no quadro maior.

Como posso obter livros didáticos de forma barata?

Muitos dos livros didáticos que sugerimos estão disponíveis gratuitamente on-line, graças à generosidade de seus autores. Para aqueles que não são, sugerimos comprar cópias usadas de edições antigas. Como regra geral, se houver mais de duas edições de um livro, é bem provável que uma edição mais antiga seja perfeitamente adequada. É certamente improvável que a versão mais recente seja 10x melhor que uma versão mais antiga, mesmo que seja essa a diferença de preço!

Qaundo houver disponibilidade de tradução de algum livro, vamos disponibilizar aqui neste guia. Muito provavelmente referenciado com a flag do Brasil 🇧🇷

Quem faz isso?

Este guia foi escrito originalmente em inglês por Ozan Onay e Myles Byrne, instrutores da Bradfield School of Computer Science, em San Francisco. Baseia-se na experiência deles no ensino de ciência da computação básica para centenas de engenheiros e graduados em treinamento autodidata.

Atualmente a tradução desse projeto foi inciada por @rafaelvieiras e não se limita a uma tradução fiel, e sim a se basear no projeto para auxiliar brasileiros autodidata no estudo da ciência da computação.

A versão usada como base desse material está em https://teachyourselfcs.com