¿Cuál es el mejor camino para obtener un conocimiento profundo de los fundamentos de la informática con los recursos disponibles en 2017?

Pregunta impresionante

Ir directo al grano. El camino de aprendizaje es una combinación de caminos de aprendizaje que van en paralelo. Estas rutas incluyen aprender a escribir programas simples, conocimiento de hardware y sistemas operativos, estructuras de datos y algoritmos, bases de datos, redes y compiladores. Y para fortalecer los fundamentos, siempre preferiría los libros sobre cualquier cosa.

Lógica de programación, implementaciones ad-hoc, bloques de construcción (bucles, variables, condicionales)

  • Lenguaje de programación C
    C te permite jugar con memoria de bajo nivel y punteros. Estas cosas pueden ser difíciles de entender al principio, pero eso no es necesario en este punto. Es más importante aprender a programar utilizando variables, bucles, sentencias condicionales, etc. al principio. C tiene una sintaxis muy peculiar en comparación con otros idiomas. Es muy fácil aprender otros idiomas después de C.
    Recursos:
    El lenguaje de programación C: Brian W. Kernighan, Dennis M. Ritchie
  • C ++
    Al igual que C, C ++ también ofrece manipulación de memoria de bajo nivel. Además está orientado a objetos.
    Recurso:
    Principios y práctica utilizando C ++: Amazon.in: Bjarne Stroustrup: Libros

Arquitectura de Computadores
Esta es mi parte favorita, especialmente los sistemas operativos. Esta parte trata sobre el diseño de hardware informático. Conocerás cómo se construyen la RAM y los procesadores. Luego, el sistema operativo los conecta con dispositivos de E / S para ejecutar software de nivel de usuario y kernel. Este camino de aprendizaje consta de tres temas:

  • Electrónica digital
    Números binarios, números hexadecimales, álgebra booleana, puertas lógicas, registros, lógica secuencial y combinada
    Recurso:
    Diseño digital: con una introducción al Verilog Hdl
  • Organización de la computadora
    Formato de instrucciones, direccionamiento, organización de la memoria, programación de una computadora básica
    Recurso:
    Arquitectura del sistema informático, Morris Mano, 3e
  • Sistemas operativos
    Procesos, subprocesos, programación, gestión de memoria, implementación de sistema de archivos
    Recurso:
    Sistemas Operativos: Internos y Principios de Diseño, 7e
    Conceptos del sistema operativo: Silberschatz, Galvin, Gagne

Estructuras de datos y algoritmos
Cuando la gente dice ciencias de la computación, esto es lo primero que viene a la mente.

  • Estructura de datos
    Resumen de tipo de datos e implementación de Array, Lista enlazada, Pila, Cola, Árbol binario, Árbol de búsqueda binaria, Gráficos
    Recurso:
    Estructuras de datos – GeeksforGeeks
  • Algoritmos
    Dividir y conquistar, búsqueda, clasificación, programación dinámica, algoritmos codiciosos, retroceso
    Recursos:
    Algoritmos – GeeksforGeeks
    Introducción a los algoritmos: Cormen, Leiserson, Rivest, Stein 3ED

Red de computadoras
Arquitectura de red en capas, Mecanismos de conmutación, Protocolos, Tecnología de Internet
Recurso:
Redes Informáticas, Tanenbaum, Libro 5e
TCP / IP Protocol Suite: Forouzan

Bases de datos
Diseño de bases de datos, Tablas, SQL
Recursos:
Sistemas de gestión de bases de datos: Ramakrishnan y Gerke
SQLZOO

Teoría de la computación y diseño de compiladores.

  • Teoría de la computación
    Automatismo Finito, Expresiones Regulares, Gramáticas, Máquinas De Turing
    Recurso:
    Introducción a la teoría de los autómatas, lenguajes y computación, 3e, Ullman
  • Diseño del compilador
    Análisis léxico, análisis de sintaxis, análisis, gramáticas, detección y recuperación de errores, generación de código
    Recurso:
    Principios del diseño del compilador: Aho, Ullman

Editar:
Inteligencia Artificial (sugerida por el Dr. E. Douglas Jensen en comentarios)
Recurso:
Inteligencia Artificial: Un enfoque moderno por Stuart Russell y Peter Norvig

Esta lista cubre todos los principales temas fundamentales de la informática. El siguiente objetivo es ver cómo todas estas partes se conectan entre sí para formar sistemas complejos.

Ahora no tengo tiempo para una respuesta detallada, pero aquí hay una introducción rápida a nuevos fundamentos importantes (que aún se están creando, ¡de hecho!) Que acabo de descubrir: es una visita obligada, se debe ver al 100%:

Informática – YouTube

Después de eso depende de lo que ya sabes, supongo. Hay algunas grandes series de cursos en línea de lugares como MIT, udacity, etc., pero dependen de su nivel de sofisticación en cuanto a dónde comenzar.

Recomiendo centrarse en temas como los siguientes: muchos cursos y recursos en línea sobre este tipo de temas:

  • Punteros de estilo c
  • Estructuras de datos y algoritmos (vea, por ejemplo, esta serie de conferencias del MIT o este libro: Algoritmos en pocas palabras: una guía práctica (9781491948927): George T. Heineman, Gary Pollice, Stanley Selkow: Libros)
  • Sistemas operativos
  • Arquitectura de Computadores

También recomendaría un título universitario en ciencias de la computación (licenciatura + al menos maestría), ya que sigue siendo la mejor manera de obtener un “conocimiento profundo” de las ciencias de la computación, pero me doy cuenta de que no siempre es práctico.

También recomendaría aprender al menos los siguientes idiomas:

  • pitón
  • Java o C #
  • C / C ++
  • opcional: un lenguaje funcional, como Scheme, Haskell, OCaml, etc.

También es opcional: hacer un pequeño proyecto usando Arduino (ejemplos aquí) para un conocimiento práctico de la interacción hardware-software.

Internet tiene muchos recursos valiosos que lo ayudarán a comprender los fundamentos de la informática y la mejor parte es que puede aprender a su propio ritmo. Solo tienes que centrarte y con el tiempo verás mejoras.

Hace dos días, encontré este jwasham / codificación-entrevista-universidad en github.