Recursos teóricos de autoaprendizaje informático para programadores

14

Soy un ingeniero de software bastante competente, pero no conozco mucha teoría. Quiero aprender más teoría. Los temas particulares que me interesan son: complejidad computacional, lenguajes formales y teoría de tipos. Pero no sé cómo comenzar a aprender sobre estos campos.

¿Qué recursos recomendarías a alguien que quiera aprender más teoría a través del autoestudio? ¿Hay alguna guía teórica de autoaprendizaje de informática para ingenieros de software?

Henry H.
fuente
3
Depende de lo que quieras aprender. Arora-Barak ofrece una introducción completa a la teoría de la complejidad computacional (y está disponible gratuitamente en línea). Entonces ese es un buen lugar para comenzar.
Thomas apoya a Mónica el
44
¿Has tomado cursos de teoría en el colegio / universidad como estructuras de datos, algoritmos, etc.? Si no ha tomado cursos de teoría de pregrado típicamente requeridos, los libros de texto para esos cursos serían un buen punto de partida. Después de eso, puede echar un vistazo a los artículos de Wikipedia, nuestra lista de libros y la lista de videos , cursos en línea en Coursera / Udacity / EdX / ... Coursera tiene cursos de teoría bastante buenos.
Kaveh
¿Qué estudiaste en la universidad?
Omar Shehab
¿En qué tipo de idiomas programa? Gran parte de la CS teórica se puede aprender en conjunto con algo concreto. Por ejemplo, si desea obtener más información sobre los idiomas formales, los lenguajes / expresiones regulares (es decir, expresiones regulares) son un buen lugar para comenzar, al igual que aprender sobre los compiladores. Para la teoría de tipos, es posible que desee jugar con un lenguaje tipado estáticamente como haskell, F # o ML.
Baby Dragon
pruebe New Turing Omnibus de Dewdney como una introducción / encuesta / sección transversal amplia / accesible. ver también libros de ciencia pop que inspiran TCS
vzn

Respuestas:

7

Es un campo amplio con algunas áreas bastante diferentes.

Comenzaría con algunas de las ideas más fundamentales sobre qué son las computadoras: Hopcroft y Ullman, "Introducción a la teoría de los autómatas, los idiomas y la computación".

La razón por la que lo recomendaría en particular, es su énfasis en las pruebas. Te guían a través de una forma rigurosa de pensar. Esa es la diferencia entre escribir programas y ser científico.

Kate F
fuente
1
¡Gracias! No sé si esto cambia algo, pero en realidad tengo algunos antecedentes en matemáticas basadas en pruebas (probablemente debería haber mencionado eso en la pregunta). He realizado análisis reales basados ​​en pruebas, topología de conjuntos de puntos y álgebra abstracta.
Henry H.
Entonces podrás resolverlo muy rápidamente :)
Kate F
Es una diferencia pero no la diferencia. CS implica muchos otros principios, etc.
vzn
No creo que la necesidad de rigor sea realmente una diferencia entre la programación y las matemáticas. Los teoremas de programación y demostración son tareas muy relacionadas (véase el isomorfismo de Curry-Howard), y casi ninguna tarea no matemática requiere más rigor que la programación. Los compiladores son mucho menos indulgentes con los errores que los humanos que leen pruebas.
Jan Johannsen
2
@ JanJohannsen No estoy de acuerdo, por ejemplo, ver Comportamiento indefinido para C.
Kate F
9

Hay varias formas de aprender sobre la teoría de tipos. Para un programador que trabaja, Tipos y lenguajes de programación de B. Pierce es un buen comienzo. Los fundamentos prácticos para los lenguajes de programación de R. Harper también podrían ser buenos. Si desea un poco de información fácil de leer sobre semántica operativa, le recomiendo G. Winskel's, La semántica formal de los lenguajes de programación: una introducción . Con T. Nipkow, G. Klein, Semántica de hormigón, una variante del libro de Winskel se ha formalizado para el asistente de prueba interactivo Isabelle / HOL. Sospecho que es realmente difícil familiarizarse con un probador solo de este (o cualquier otro) libro, querrás que un experto cercano haga preguntas. Si desea un enfoque más matemático de la teoría de tipos, puede consultar JR Hindley, JP Seldin, Lambda-Calculus and Combinators: An Introduction , o H. Barendregt's, Lambda Calculi with types . Aunque no recomendaría comenzar desde Barendregt.

Si desea una sola recomendación, le diría que lea todo Pierce excepto la Parte VI (Sistemas de orden superior) e implemente los idiomas de los juguetes que trata el libro. Terminará con una sólida base en la teoría de tipos, y probablemente también sea un mejor programador.

Martin Berger
fuente
2

Recomiendo computabilidad, complejidad e idiomas por Martin Davis, Ron Sigal y Elaine Weyuker.

valepert
fuente
Ese es un hermoso libro para TCS old-skool. Excepto por la parte de la semántica teórica de dominio, que se puede omitir.
Martin Berger
1

Soy un gran admirador de la teoría y los algoritmos. Una vez tuve la oportunidad de visitar Ciencias de la Computación Teóricas en el Instituto Indio de Tecnología, Madras (IIT-M), India. Conozco muchos teóricos allí en IIT-M. Cuando fui allí, no tenía idea de qué era la teoría, pero hoy estoy totalmente enamorada de ella.

Gracias a @Kate F por el puntero, sí, Hopcroft y Ullman es un excelente lugar para comenzar.

Sin embargo, así es como empecé,

  1. Lea la Introducción a los algoritmos de Cormen. <\ Br> Este es un excelente lugar para comenzar. Cuando estudies, trata de entender cada prueba con la mayor longitud posible. Si comprende bien la prueba, intente codificar la misma lógica en cualquier idioma de su elección. (Tarda un poco más pero vale la pena intentarlo)

  2. Siga las principales conferencias en Teoría como
    FOCS
    SODA
    STOC
    EC (Comercio Electrónico) - Algorithmic Game Theory
    COLT (Conferencia sobre Teoría del Aprendizaje) - Teoría del Aprendizaje
    CRYPTO - Criptografía
    SOCG (Simposio sobre Geometría Computacional) - Geometría Computacional
    CCC (Conferencia sobre Complejidad computacional) - Teoría de la complejidad

Incluso si no comprende mucho, intente leer y PIENSE tanto como sea posible. Tienes que hacer tantas pruebas como sea posible ...

  1. Este es un lugar maravilloso para mirar si está pensando en la complejidad computacional en particular ( Esto es de Stanford ).
  2. Siga al Prof. Sanjeev Arora, Boaz Barak, Jelani Nelson, Madhu Sudán
  3. Aquí hay un conjunto de información sintetizada en el campo de la complejidad computacional
Jaugust
fuente