Recursos teóricos de auto-estudo da ciência da computação para programadores

14

Sou um engenheiro de software bastante proficiente, mas não conheço muita teoria. Eu quero aprender mais teoria. Os tópicos específicos que me interessam são: complexidade computacional, linguagens formais e teoria dos tipos. Mas não sei como começar a aprender sobre esses campos.

Quais recursos você recomendaria para alguém que deseja aprender mais teoria através do auto-estudo? Existem guias teóricos de auto-estudo de ciência da computação para engenheiros de software?

Henry H.
fonte
3
Depende do que você deseja aprender. Arora-Barak fornece uma introdução completa à teoria da complexidade computacional (e está disponível gratuitamente on-line). Então esse é um bom lugar para começar.
Thomas suporta Monica
4
Você fez cursos teóricos em faculdades / universidades, como estruturas de dados, algoritmos etc.? Se você não tiver feito cursos de teoria de graduação normalmente exigidos, os livros didáticos desses cursos seriam um bom ponto de partida. Depois disso, você pode dar uma olhada nos artigos da wikipedia, nossa lista de livros e vídeos , cursos on-line no Coursera / Udacity / EdX / ... O Coursera possui cursos teóricos bastante agradáveis.
Kaveh
O que você estudou na faculdade?
Omar Shehab
Em que tipo de idiomas você programa? Muito do CS teórico pode ser aprendido em conjunto com algo concreto. Por exemplo, se você quiser aprender mais sobre linguagens formais, linguagens / expressões regulares (ou seja, expressões regulares do regexp) são um bom lugar para começar, assim como aprender para compiladores. Para a teoria dos tipos, você pode querer jogar com uma linguagem de tipo estaticamente, como haskell, F # ou ML.
Baby Dragon
experimente o New Turing Omnibus da Dewdney como uma seção de referência ampla / acessível ref / survey / cross. veja também livros de ciências pop que inspiram o TCS
vzn

Respostas:

7

É um campo amplo, com algumas áreas bem diferentes.

Eu começaria com algumas das idéias mais fundamentais sobre o que os computadores são: Hopcroft e Ullman, "Introdução à teoria de autômatos, linguagens e computação".

A razão pela qual eu recomendo isso, em particular, é a ênfase deles nas provas. Eles o guiam através de uma maneira rigorosa de pensar. Essa é a diferença entre escrever programas e ser científico.

Kate F
fonte
1
Obrigado! Não sei se isso muda alguma coisa, mas, na verdade, tenho alguma experiência em matemática baseada em provas (eu provavelmente deveria ter mencionado isso na pergunta). Fiz análises reais baseadas em provas, topologia de conjunto de pontos e álgebra abstrata.
Henry H.
Então você vai ser capaz de trabalhar com ele muito rapidamente :)
Kate F
é uma diferença, mas não a diferença. CS implica muitos outros princípios etc
vzn
Não acho que a necessidade de rigor seja realmente a diferença entre programação e matemática. Teoremas de programação e prova são tarefas muito relacionadas (cf. Isomorfismo de Curry-Howard), e dificilmente qualquer tarefa não matemática exige mais rigor do que a programação. Os compiladores perdoam menos os erros do que os humanos que lêem as provas.
Jan Johannsen
2
@JanJohannsen Eu discordo completamente - por exemplo, consulte Comportamento indefinido para C. #
Kate F
9

Existem várias maneiras de aprender sobre a teoria dos tipos. Para um programador que trabalha, Tipos e linguagens de programação de B. Pierce é um bom começo. Fundamentos práticos para linguagens de programação de R. Harper também podem ser bons. Se você quiser um pouco de conhecimento fácil de ler sobre semântica operacional, recomendo G. Winskel, The Semântica Formal de Linguagens de Programação: Uma Introdução . Com T. Nipkow, G. Klein, Semântica Concreta, uma variante do livro de Winskel foi formalizada para o assistente de prova interativa Isabelle / HOL. Eu suspeito que é realmente difícil lidar com um provador apenas deste (ou de qualquer outro) livro, você gostaria que um especialista por perto fizesse perguntas. Se você deseja uma abordagem mais matemática da teoria de tipos, pode olhar para JR Hindley, JP Seldin, Lambda-Calculus e Combinators: An Introduction , ou H. Barendregt, Lambda Calculi with Types , de H. Barendregt . Embora eu não recomendo a partir de Barendregt.

Se você quiser uma única recomendação, eu diria que leia tudo de Pierce, exceto a Parte VI (Sistemas de Ordem Superior), e implemente as linguagens de brinquedos discutidas no livro. Você terá uma forte base na teoria dos tipos e provavelmente um programador melhor também.

Martin Berger
fonte
2

Eu recomendo Computabilidade, Complexidade e Idiomas de Martin Davis, Ron Sigal e Elaine Weyuker.

valepert
fonte
Esse é um livro bonito para o velho skool TCS. Exceto pela parte da semântica teórica do domínio, que pode ser ignorada.
Martin Berger
1

Eu sou um grande fã de teoria e algoritmos. Uma vez tive a oportunidade de visitar a Ciência da Computação Teórica no Instituto Indiano de Tecnologia, Madras (IIT-M), na Índia. Conheço muitos teóricos no IIT-M. Quando fui para lá, não fazia ideia do que era a teoria, mas hoje sou totalmente apaixonada por ela.

Graças a @Kate F pelo ponteiro, sim Hopcroft e Ullman são um excelente lugar para começar.

No entanto, aqui está como eu comecei,

  1. Leia a Introdução aos algoritmos de Cormen. <\ Br> Este é um excelente lugar para começar. Ao estudar, tente entender cada prova o máximo possível. Se você entende bem a prova, tente codificar a mesma lógica em qualquer idioma de sua escolha. (Demora um pouco mais, mas vale a pena tentar)

  2. Siga as principais conferências em Teoria como
    FOCS
    SODA
    STOC
    EC (Comércio Eletrônico) - Teoria Algorítmica dos Jogos
    COLT (Conferência sobre Teoria da Aprendizagem) - Teoria da Aprendizagem
    CRYPTO - Criptografia
    SOCG (Simpósio em Geometria Computacional) - Geometria Computacional
    CCC (Conferência sobre Complexidade Computacional) - Teoria da Complexidade

Mesmo que você não entenda muito, tente ler e PENSAR o máximo possível. Você precisa fazer o máximo de provas possível.

  1. Este é um lugar maravilhoso para se olhar se você está pensando em complexidade computacional em particular ( este é de Stanford ).
  2. Sanjeev Arora, Boaz Barak, Jelani Nelson, Madhu Sudão
  3. Aqui está um conjunto de informações sintetizadas no campo da Complexidade Computacional
Jaugust
fonte