Como eu estudo completamente a Ciência da Computação? [fechadas]

46

Sendo um programador completamente autodidata, eu gostaria que pudesse me aperfeiçoar aprendendo sozinho o curso de ciências da computação ministrado a um típico aluno de ciências da computação.

Encontrar recursos diferentes na Internet tem sido fácil, é claro que existe o software aberto para cursos do MIT e existem cursos Coursera de Stanford e de outras universidades. Existem inúmeros outros recursos abertos espalhados pela Internet e alguns bons livros que são repetidamente recomendados.

Eu tenho aprendido muito, mas meu estudo é muito fragmentado, o que realmente me incomoda. Eu adoraria Se em algum lugar pudesse encontrar um caminho a seguir e uma pilha à qual me deveria limitar, para ter certeza sobre as partes essenciais da ciência da computação que estudei e depois abordar sistematicamente as que não tenho.

O problema com a Wikipedia é que ele não diz o que é essencial, mas insiste em ser uma referência completa.

Curso aberto do MIT para ciência da computação e engenharia elétrica. Também possui uma lista enorme de cursos, sem informar quais cursos são essenciais e quais são opcionais conforme o interesse / requisito da pessoa. Não encontrei menção de uma ordem na qual se deveria estudar assuntos diferentes.

O que eu adoraria é criar uma lista que eu possa seguir, como essa manequim

SUBJECTS                                                        DONE

Introduction to Computer Science                                  *
Introduction to Algorithms                                        *
Discrete Mathematics                   
Adv. Discrete Mathematics
Data structures                                                   *
Adv. Algorithms
...

Como você pode ver claramente, tenho pouca ideia de em que assuntos específicos a ciência da computação consiste.

Seria extremamente útil, mesmo se alguém apontasse cursos essenciais do MIT Course ware (+ assuntos essenciais não presentes no MIT OCW) em uma ordem de estudo recomendada.

Vou listar as postagens pelas quais já passei (e não consegui o que estava procurando lá)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - a resposta principal diz que não vale a pena estudar cse

https://softwareengineering.stackexchange.com/questions/110345/how-can-a-self-taught-programmer-learn-more-about-computer-science - aponta para MIT OCW

https://softwareengineering.stackexchange.com/questions/49167/studying-computer-science-what-am-i-getget-myself-into

https://softwareengineering.stackexchange.com/questions/19912/overview-of-computer-science-programming

Optimus
fonte
Completamente? Todo o material teórico divertido também?
Sim, eu realmente gosto de coisas teóricas divertidas, acho que isso aumentará minha compreensão do assunto (embora isso seja uma questão de debate no meu círculo). Além disso, me sinto sozinho quando meus amigos do CS discutem sobre coisas do CS ou os irrito fazendo muitas perguntas.
Optimus
2
Observe que existem alguns tipos de "ilhas" no currículo em que as coisas estão juntas. Você raramente precisa de cálculo lambda na teoria dos grafos. Considere também que pode ser bom ter mentores por perto - você mora perto de uma instituição educacional adequada?
Na verdade, sim, e sou amigável com os profissionais, mas não posso incomodá-los o tempo todo. Eles contribuíram para um monte de conhecimento fragmentado que tenho em primeiro lugar.
Optimus
3
Nesse caso, você poderá fazer um curso ou dois selecionados - o que permite incomodar os profissionais o tempo todo.

Respostas:

24

Eu já vi algum material do curso do MIT, e foi chocantemente ruim . Eles tinham materiais de ensino que exigiam VC5, grupos de variáveis ​​globais implícitas, passando cores como "Azul" em vez de ARGB de 32 bits, e muito menos 4x [0,1] carros alegóricos, esse tipo de coisa. Eu não confiaria em um currículo ou código apenas porque se trata de uma universidade de grande nome.

Meu diploma de CS (de uma universidade entre os 10 melhores no Reino Unido para CS) consistia em:

Primeiro ano:

  1. OOP- o super básico
  2. Sistemas de computador - coisas como representações inteiras binárias.
  3. Teoria básica de banco de dados relacional
  4. Matemática para CS - geometria 2D e 3D simples.
  5. Um pouco de HTML / JS - complete as coisas para iniciantes
  6. Um pouco igualmente pequeno de PHP.
  7. Um pouco de programação funcional

Segundo ano:

  1. Questões legais na computação - coisas como leis que giram em torno da proteção dos dados do usuário
  2. Linguagens de programação - a hierarquia e lexing de Chomsky foi abordada
  3. Sistemas operacionais, redes e Internet - principalmente coisas como memória virtual e paginação, pilha IP
  4. Computação gráfica em 2D - principalmente apenas provando teoremas da matemática subjacente
  5. AI- descrições básicas de redes neurais, sistemas de crenças bayesianas, etc.
  6. Análise de requisitos - breve visão geral da UML, requisitos funcionais / não funcionais.
  7. Projeto de equipe

Terceiro ano:

  1. Análise de algoritmos - teoria da complexidade, principalmente
  2. Implementação de linguagens de programação - técnicas de análise LL / LR, CFGs e outras coisas.
  3. Gerenciamento de Projetos de Software - uma visão dos modelos Waterfall / Agile
  4. International Computing- Unicode e outra diversão de localização
  5. IA avançada - não sei, honestamente, e eu tenho um exame em breve
  6. Computação gráfica 3D - principalmente, novamente, apenas provando teoremas para matrizes de rotação e
  7. Sistemas baseados em agentes - principalmente sobre agentes assíncronos se comunicando, alcançando decisões de grupo etc.
  8. Aplicações de microprocessador - processamento de sinal digital
  9. Robótica - abrange coisas como visão computacional e tomada de decisão de robôs em alto nível

Como você notará, praticamente tudo é "o básico" de algo e quase nada é coberto com profundidade útil.

O material que realmente valia a pena fazer, essencial:

  1. OOP- e mais um pouco, e mais um pouco
  2. Programação funcional - também um pouco mais. Tente escolher um idioma como C ++ ou C # em que você não precise reaprender a sintaxe e as ferramentas etc. para cobrir os dois estilos.
  3. É bom saber sobre a memória virtual da parte do sistema operacional, assim como o modo kernel versus modo usuário. Pule a segmentação e a pilha IP.
  4. Análise de requisitos - deve ser útil para qualquer projeto
  5. Análise de algoritmo - é importante saber o que é complexidade algorítmica, como reduzi-la e qual é a complexidade das operações comuns.
  6. Modelos de gerenciamento de projetos de software - muitas lojas fazem Agile e muitas mais antigas ainda fazem modelos no estilo Waterfall.
  7. Computação internacional - Unicode é essencial

O material que valia a pena fazer, opcionalmente:

  1. Linguagens de programação - hierarquia de Chomsky, as ferramentas de lexing e análise. Ignore a teoria por trás dos analisadores LL ou LR - um analisador LR pode aceitar praticamente qualquer CFG realista e inequívoco e, quando não puder, a documentação do gerador de analisador informará sobre isso.
  2. Gráficos 3D. Não quero dizer "provar que esta é uma fórmula de matriz de rotação" desperdícios de tempo, quero dizer coisas reais "Este é um sombreador de vértice", ou GPGPU. Isso é divertido, interessante e diferente.
  3. Algumas das coisas da IA ​​são divertidas, como campos em potencial e busca de caminhos.

Coisas que são essenciais, mas eu não as cobri de qualquer maneira:

  1. Simultaneidade - um must-know, pelo menos o básico, para qualquer pessoa em 2012.

O resto foi uma completa perda de tempo. Infelizmente, a maioria desses nove pontos que eu já conhecia ou pegou as partes úteis em outros lugares. Se você ler sobre coisas como o problema do FizzBuzz , rapidamente se torna aparente que você realmente não precisa saber muito para estar no topo da lista - o que é uma sorte, pois meu diploma e muitos dos materiais que eu vi online para outros graus realmente não ensina muito.

DeadMG
fonte
3
@ ThorbjørnRavnAndersen: A teoria é uma ferramenta para escrever código, nada mais. Uma teoria não vale nada se você não puder usá-la para criar um código melhor.
DeadMG
3
@ Optimus: A grande maioria de toda a teoria não pode ajudá-lo a criar um código melhor.
DeadMG
3
A teoria é a base para saber qual código pode ser escrito e o que não.
17
Há alguns conselhos muito bons neste post, mas você é dogmático demais ao declarar alguns campos como uma perda de tempo. Atualmente, existe uma variedade considerável de tarefas de programação, e o que é perda de tempo para uma tarefa pode ser essencial para outra. Ao invés de simplesmente dispensar algo como um desperdício de tempo que seria útil para descrever os tipos de desenvolvimento que você está envolvido.
Charles E. Grant
4
Eu fiz muitas entrevistas nos últimos anos, e parece que a maior lacuna hoje em dia nas faculdades está no ensino de estruturas e algoritmos de dados. A segunda maior lacuna está em entender como as ferramentas são implementadas internamente. Na minha opinião, as aulas de uso de uma ferramenta específica são uma perda de tempo. Não faz muito sentido conhecer a sintaxe do C ++ se você não puder explicar quando usar uma tabela de hash e quando usar uma árvore.
Gort the Robot
5

O Open Course ware é apenas uma lista dos cursos que eles disponibilizaram. Se você quiser saber o que um aluno levaria, visite o site do MIT (não OCW) e consulte o programa atual. Eles têm uma lista do que é necessário e o que é considerado um pré-requisito para o que. Aqui está a página deles.

pedregoso
fonte
Estou analisando, mas achei os requisitos deles bem concisos. e onde está a longa lista de cursos?
Optimus
1
web.mit.edu/catalog/degre.engin.ch6.html É a grande lista. CS é referido como 6,3
stonemetal
graças, este também será útil, é bom saber o que curriculares grandes univs estão seguindo
Optimus
1
Estou fazendo EECS em Berkeley agora. Se o programa MIT EECS estiver estruturado como o de Berkeley, você não receberá muita orientação: temos uma breve sequência de introdução e, literalmente, fazemos o que você quiser na ordem que quiser, desde que faça um número mínimo de opções avançadas. cursos. Eu acho incrível, mas provavelmente não vai ajudar você a descobrir quais cursos tomar: eu mesmo tive que tomar as mesmas decisões. (Eu tive a ajuda do meu orientador, mas, por completa coincidência, o conselho dele foi fazer o seminário de graduação :)).
Tikhon Jelvis
@TikhonJelvis É mais fácil fazer as escolhas do que você gostaria de aprender e do que não gostaria, depois de ter uma idéia de qual é o escopo do campo e que escopo deve, no mínimo, ser coberto. Eu, sendo um graduado em Engenharia Civil, tenho pouca idéia do que acontece em Ciência da Computação e Engenharia. Field
Optimus
5

Tente as recomendações curriculares de Ciência da Computação de 2001 da ACM / IEEE, link aqui: http://www.acm.org/education/curricula-recommendations

juntamente com as atualizações de 2008 do CS.

A página 17 do relatório de 2001 possui um gráfico útil que sublinha todo o conhecimento "básico" e ainda lista as eletivas.

Um programa de graduação não teria tempo para cobrir até os cursos considerados essenciais por essas recomendações; portanto, eles agrupam algumas das categorias e permitem que os alunos escolham entre elas (por exemplo, sistemas operacionais, idiomas de programação e engenharia de software) Software e os alunos escolhem uma faixa).

Você pode encontrar os cursos necessários no site do departamento de CS para praticamente qualquer escola, e eles devem ser uma versão disso.

Ruan Caiman
fonte
bom, um pouco desatualizado, mas ainda assim muitas disciplinas deixadas para escolha em um currículo normal são consideradas essenciais aqui, é bom ter uma escolha mais ampla de estudo disponível se você ficar sem o que está na fila +1.
Optimus
Para os preguiçosos, essa lista contém: Fundamentos de programação de estruturas discretas (DS) Algoritmos e complexidade (AL) Arquitetura e organização (AR) Sistemas operacionais (SO) Sistemas operacionais (SO) Computação centrada em rede (NC) Linguagens de programação (PL) Linguagem de programação (computador) Gráficos de Interação (HC) e Computação Visual (GV) Sistemas Inteligentes (SI) Gerenciamento de Informações (IM) Questões Sociais e Profissionais (SP) Engenharia de Software (SE) Ciência da Computação e Métodos Numéricos (CN).
Damien Roche
-4

Se eu puder, gostaria de sugerir se juntar ao github.com como parte do seu processo de aprendizado.

Em seguida, você pode procurar por código que tenha algum aplicativo do mundo real do seu interesse, cloná-lo por conta própria, trabalhar com ele, codificar nele e conhecê-lo, e eventualmente começar a enviar patches de volta ao projeto de origem , e abaixo da linha, esteja trabalhando em um projeto de código aberto no qual você tenha interesse.

E, é claro, você se familiarizará com o git, que é ainda melhor.

Kzqai
fonte
5
-1: Embora valioso, isso não o expõe aos aspectos teóricos em ciência da computação que ele precisa conhecer.
Ken Bloom
foi lá que fez, nós também temos um repositório git pessoal, Suspensão ao redor github faz de você um programador melhor embora
Optimus