¿Cómo estudio completamente completamente la informática? [cerrado]

46

Siendo un programador completamente autodidacta, me gustaría que pudiera mejorar aprendiendo por mí mismo el curso de informática que se imparte a un típico graduado de CS.

Encontrar diferentes recursos en Internet ha sido fácil, por supuesto , hay cursos de cursos abiertos del MIT , y hay cursos de Coursera de Stanford y otras universidades. Existen muchos otros recursos abiertos repartidos por Internet y algunos buenos libros que se recomiendan repetidamente.

He estado aprendiendo mucho, pero mi estudio está muy fragmentado, lo que realmente me molesta. Me encantaría si en algún lugar, pudiera encontrar un camino que debería seguir y una pila a la que debería limitarme, para poder estar seguro de qué partes esenciales de la informática he estudiado, y luego acercarme sistemáticamente a las que no tengo.

El problema con Wikipedia es que no te dice lo que es esencial, sino que insiste en ser una referencia completa.

Curso abierto del MIT para Informática e Ingeniería Eléctrica. tiene una gran lista de cursos que tampoco le dicen qué cursos son esenciales y qué opcionales según el interés / requisito de la persona. No encontré ninguna mención de un orden en el que uno debería estudiar diferentes temas.

Lo que me encantaría es crear una lista que pueda seguir, como esta ficticia

SUBJECTS                                                        DONE

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

Como puede ver claramente, tengo poca idea de en qué consisten las materias específicas de informática.

Sería de gran ayuda, incluso si alguien señalara cursos esenciales de MIT Course ware (+ materias esenciales no presentes en MIT OCW) en un orden de estudio recomendado.

Enumeraré las publicaciones que ya pasé (y no obtuve lo que estaba buscando allí)

https://softwareengineering.stackexchange.com/questions/49557/computer-science-curriculum-for-non-cs-major - la respuesta principal dice que no vale la pena estudiar cse

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

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

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

Optimus
fuente
¿Completamente? ¿Todas las cosas teóricas divertidas también?
Sí, en realidad me gustan las cosas teóricas divertidas, creo que aumentará mi comprensión del tema (aunque eso es un tema de debate en mi círculo). Además, me siento solo cuando mis amigos de CS tienen discusiones sobre cosas de CS o los irrito al hacer demasiadas preguntas.
Optimus
2
Tenga en cuenta que hay algunos tipos de "islas" en el plan de estudios donde las cosas se unen. Por ejemplo, rara vez necesita cálculo lambda en la teoría de grafos. También considere que podría ser bueno tener mentores cerca: ¿vive cerca de una institución educativa adecuada?
De hecho, sí, y soy amigable con los profesionales, pero no puedo molestarlos todo el tiempo. Han contribuido a una gran cantidad de conocimiento fragmentado que tengo en primer lugar.
Optimus
3
En ese caso, es posible que pueda tomar un curso seleccionado o dos, lo que le permite molestar a los profesionales todo el tiempo.

Respuestas:

24

He visto material del curso del MIT, y fue sorprendentemente malo . Tenían materiales didácticos que requerían VC5, grupos de variables globales implícitas, pasando colores como "Azul" en lugar de ARGB de 32 bits, y mucho menos 4x [0,1] flotadores, ese tipo de cosas. No confiaría en un plan de estudios o código solo porque proviene de una universidad de renombre.

Mi título de CS (de una universidad que está entre los 10 mejores en el Reino Unido para CS) consistió en:

Primer año:

  1. OOP- los súper básicos
  2. Sistemas informáticos: cosas como representaciones enteras binarias.
  3. Teoría básica de bases de datos relacionales
  4. Matemáticas para CS: geometría simple en 2D y 3D.
  5. Un poco de HTML / JS: completa las cosas para principiantes
  6. Un pedacito igualmente pequeño de PHP.
  7. Un poco de programación funcional

Segundo año:

  1. Cuestiones legales en informática, como leyes relacionadas con la protección de los datos del usuario.
  2. Lenguajes de programación: se cubrió la jerarquía y lexing de Chomsky
  3. Sistemas operativos, redes e Internet, principalmente cosas como memoria virtual y paginación, pila IP
  4. Gráficos por computadora en 2D: en su mayoría solo demuestran teoremas de las matemáticas subyacentes
  5. AI: descripciones básicas de redes neuronales, sistemas de creencias bayesianas, etc.
  6. Análisis de requisitos: breve descripción de UML, requisitos funcionales / no funcionales.
  7. Proyecto de equipo

Tercer año:

  1. Análisis de algoritmos: teoría de la complejidad, principalmente
  2. Implementación de lenguajes de programación: técnicas de análisis LL / LR, CFG y otras cosas.
  3. Software Project Management: una mirada a los modelos Waterfall / Agile
  4. Computación internacional - Unicode y otra diversión de localización
  5. Inteligencia artificial avanzada: no lo sé, sinceramente, y tengo un examen pronto
  6. Gráficos de computadora en 3D, principalmente, nuevamente, solo demostrando teoremas para matrices de rotación
  7. Sistemas basados ​​en agentes: principalmente sobre agentes asincrónicos que se comunican, toman decisiones grupales, etc.
  8. Aplicaciones de microprocesador: procesamiento de señal digital
  9. Robótica: cubre cosas como la visión por computadora y la toma de decisiones de robots a un alto nivel

Como notará, casi todo es "lo básico" de algo y casi nada está cubierto a una profundidad útil.

Lo que realmente valía la pena hacer, esencial:

  1. OOP- y luego un poco más, y luego un poco más
  2. Programación funcional, también un poco más. Intente elegir un lenguaje como C ++ o C # donde no tenga que volver a aprender la sintaxis y las herramientas, etc., para cubrir ambos estilos.
  3. Es bueno conocer la memoria virtual parcial del sistema operativo, al igual que el modo kernel frente al modo usuario. Omita la segmentación y la pila de IP.
  4. Análisis de requisitos: debe ser útil para cualquier proyecto
  5. Análisis de algoritmo: es importante saber qué es la complejidad algorítmica, cómo reducirla y cuál es la complejidad de las operaciones comunes.
  6. Modelos de gestión de proyectos de software: muchas tiendas hacen Agile y muchas más antiguas todavía hacen modelos al estilo Waterfall.
  7. Computación internacional: Unicode es esencial

Las cosas que valía la pena hacer, opcionalmente:

  1. Lenguajes de programación: jerarquía Chomsky, las herramientas de lexing y parsing. Omita la teoría detrás de los analizadores LL o LR: un analizador LR puede aceptar prácticamente cualquier CFG realista y no ambiguo, y cuando no puede, la documentación de su generador de analizador le informará al respecto.
  2. Gráficos 3D No me refiero a "Demostrar que esta es una fórmula de matriz de rotación", desperdicios de tiempo, me refiero a cosas reales como "Esto es un sombreador de vértices", o GPGPU. Eso es divertido, interesante y diferente.
  3. Algunas de las cosas de IA son divertidas, como campos potenciales y búsqueda de caminos.

Cosas que son esenciales pero no las cubrí de todos modos:

  1. Concurrencia: algo que debe saber, al menos lo básico, para cualquier persona en 2012.

El resto fue una completa pérdida de tiempo. Desafortunadamente, la mayoría de estos nueve puntos ya los conocía o recogí las partes útiles en otra parte. Si lees sobre cosas como el problema de FizzBuzz , rápidamente se hace evidente que no necesitas saber tanto para estar en la cima del paquete, lo cual es una suerte, ya que mi título y muchos de los materiales que he visto en línea para otros grados realmente no enseñan mucho en absoluto.

DeadMG
fuente
3
@ ThorbjørnRavnAndersen: La teoría es una herramienta para escribir código, nada más. Una teoría no vale nada si no puede usarla para hacer un mejor código.
DeadMG
3
@Optimus: La gran mayoría de todas las teorías no pueden ayudarte a crear un mejor código.
DeadMG
3
La teoría es la base para saber qué código se puede escribir y qué no.
17
Hay algunos consejos muy buenos en esta publicación, pero eres demasiado dogmático al declarar que algunos campos son una pérdida de tiempo. Hay una considerable variedad en los trabajos de programación en estos días, y lo que es una pérdida de tiempo para un trabajo puede ser esencial para otro trabajo. En lugar de simplemente descartar algo como una pérdida de tiempo, sería útil describir los tipos de desarrollo en los que ha estado involucrado.
Charles E. Grant
44
He realizado muchas entrevistas en los últimos años, y parece que la mayor brecha en estos días en las universidades es en la enseñanza de estructuras de datos y algoritmos. La segunda brecha más grande es entender cómo se implementan las herramientas internamente. En mi opinión, las clases sobre el uso de una herramienta en particular son una pérdida de tiempo. No tiene mucho sentido conocer la sintaxis de C ++ si no puede explicar cuándo usar una tabla hash y cuándo usar un árbol.
Gort the Robot
5

Open Course ware es solo una lista de cursos que han puesto a disposición. Si desea saber qué hubiera tomado un estudiante, visite el sitio web del MIT (no OCW) y mire el programa real. Tienen una lista de lo que se requiere y lo que se considera un requisito previo para qué. Aquí está su página.

metal de piedra
fuente
Lo estoy investigando, pero sus requisitos me parecen bastante claros. ¿Y dónde está la larga lista de cursos?
Optimus
1
web.mit.edu/catalog/degre.engin.ch6.html Es la gran lista. CS se
conoce
gracias, esto también será útil, es bueno saber qué plan de estudios están siguiendo las grandes universidades
Optimus
1
Estoy haciendo EECS en Berkeley ahora mismo. Si el programa MIT EECS está estructurado de manera similar a Berkeley, entonces no obtendrá mucha orientación allí: tenemos una secuencia de introducción corta y, literalmente, hará lo que quiera en el orden que desee, siempre que haga un número mínimo de cursos. Creo que es increíble, pero probablemente no te ayudará a decidir qué cursos tomar: tuve que tomar las mismas decisiones yo mismo. (Tuve la ayuda de mi asesor de facultad, pero en una completa coincidencia su consejo fue tomar su seminario de posgrado :)).
Tikhon Jelvis
@TikhonJelvis Es más fácil elegir lo que le gustaría aprender y lo que no, una vez que tenga una idea de cuál es el alcance del campo y qué alcance debe al menos cubrirse. Yo, al ser un graduado de Ingeniería Civil, tengo poca idea de lo que sucede en Ciencias de la Computación y Engg. Campo
Optimus
5

Pruebe las recomendaciones del plan de estudios de Ciencias de la Computación de 2001 de ACM / IEEE, vinculadas aquí: http://www.acm.org/education/curricula-recommendations

junto con las actualizaciones de CS 2008.

La página 17 del informe de 2001 tiene un gráfico útil que subraya todo el conocimiento "básico" y aún enumera las asignaturas optativas.

Un programa de pregrado no tendría tiempo para cubrir incluso los cursos considerados esenciales por estas recomendaciones, por lo que agruparán algunas de las categorías y dejarán que los estudiantes elijan entre ellas (por ejemplo, sistemas operativos, lenguajes de programación e ingeniería de software). Software, y los estudiantes eligen una pista).

Puede encontrar los cursos requeridos en el sitio web del departamento de CS para casi cualquier escuela, y deberían ser alguna versión de esto.

Ruan Caiman
fuente
bueno, un poco desactualizado, pero aún así muchas materias que se pueden elegir en un plan de estudios normal se consideran esenciales aquí, es bueno tener una opción más amplia de estudio disponible si te quedas sin las cosas que tienes en cola +1.
Optimus
Para los perezosos, esa lista contiene: Estructuras discretas (DS) Fundamentos de programación (PF) Algoritmos y complejidad (AL) Arquitectura y organización (AR) Sistemas operativos (OS) Computación centrada en la red (NC) Lenguajes de programación (PL) Humano-Computadora Interacción (HC) Gráficos y computación visual (GV) Sistemas inteligentes (IS) Gestión de la información (IM) Cuestiones sociales y profesionales (SP) Ingeniería del software (SE) Ciencias computacionales y métodos numéricos (CN).
Damien Roche
-4

Si puedo, me gustaría sugerirle que se una a github.com como parte de su proceso de aprendizaje.

Luego, puede buscar el código que tenga alguna aplicación del mundo real que le interese, clonarlo usted mismo, trabajar con él, codificarlo y conocerlo, y eventualmente comenzar a enviar parches al proyecto fuente y, más adelante, trabajará en un proyecto de código abierto en el que tenga un interés personal.

Y, por supuesto, te familiarizarás con git, que es mucho mejor.

Kzqai
fuente
55
-1: Si bien es valioso, eso no lo expone a los aspectos teóricos en informática que necesita saber.
Ken Bloom
Después de eso, también tenemos un repositorio personal de git. Sin embargo, pasar el rato con github te hace un mejor programador
Optimus