¿Cómo diseñarías una licenciatura en informática perfecta?

Diseñaré un grado demasiado específico y demasiado general, pero bastante completo para producir un científico informático completo. Dado que la informática es actualmente la amalgama de las matemáticas de los datos, la programación y la ingeniería informática, cada semestre debe tener al menos una teoría, una clase de sistemas / programación y una clase de matemáticas / aplicaciones / ece.

Este también será un curso agnóstico de idiomas: no quiero jugar idiomas favoritos (aunque jugaré paradigmas favoritos). También estoy diseñando esto alrededor de un sistema semestral y no un sistema trimestral, ya que esto es lo que todas las escuelas en las que he estado han tenido.

Freshman Fall: elimine algunos requisitos previos.

  • Física con E&M : esto es necesario y útil para aprender ( realmente aprender) cualquier espacio, gráficos, simulación física e incluso algunos aspectos de la visión por computadora.
  • Álgebra lineal: el álgebra lineal debe ser sobre pruebas. No es necesario multiplicar las matrices a mano, pero el álgebra lineal aparece una y otra vez en casi todos los aspectos de todo. También es bueno acostumbrarse a las pruebas temprano.
  • Introducción a la prueba discreta de matemáticas y teoremas: se requiere para comenzar el recorrido teórico. la mayoría de las personas ni siquiera saben que este es un tema hasta que lo toman, por lo tanto, debe tomarse temprano.
  • Lenguaje de programación funcional de elección (haskell, ml, lisp, python ?, prolog ?, ruby ​​?, javascript?): Se ha demostrado que las personas aprenden mejor los lenguajes funcionales declarativos si se les enseña como primer idioma. Estos lenguajes también tienden a tener excelentes bibliotecas para crear cosas.
  • Comunicación para estudiantes de informática: no me refiero a cómo escribir documentos técnicos aquí, me refiero a cómo decir las cosas en general de una manera hermosa.

Freshman Spring: ahora prepárate para la investigación o la primera pasantía.

  • Algoritmos y estructuras de datos : el siguiente paso después de las matemáticas discretas. Esto debería abarcar una variedad de estructuras de datos que han demostrado ser útiles una y otra vez, así como cómo crear algoritmos con ellos y cómo analizar el tiempo de ejecución de los algoritmos.
  • Lenguaje de programación de sistemas de elección (fortran, c, c ++, básico, ensamblaje): Esta es una pista de informática. Si no puede manejar el sistema, no sea cs major.
  • Encuesta teórica de informática: teoría de la complejidad, teoría de la computabilidad, teoría de los autómatas, teoría de los gráficos, teoría de los números, teoría del lenguaje de programación, teoría de grupos, geometría computacional, lenguajes formales, combinatoria. Debería pasar un poco de tiempo en cada uno.
  • Introducción a la ingeniería informática: circuitería, un poco de ciencia de los materiales, lógica de tablas, organización y arquitectura de una computadora, organización y arquitectura de un chip.
  • Escritura creativa: a menudo se dice que la programación y la escritura son actividades muy similares. De ello se deduce que fortalecer uno beneficiará al otro. Además, este es un gran alivio del estrés durante un semestre tan difícil.

Otoño de segundo año: Comienza a obtener algunos detalles.

  • Introducción a los sistemas informáticos: cualquier cosa que le permita leer y escribir ensamblajes x86 y escribir en bajo nivel C. Una versión perfecta de esto también introduciría Verilog y, por lo tanto, combinaría un poco de ingeniería informática.
  • Combinatoria: Realmente no puedes ser bueno para analizar algoritmos si no sabes un poco más que lo básico en combinatoria.
  • Lenguajes de programación e ingeniería de software: una clase en lenguajes como Java, Scala, C ++, Fortran y Haskell diseñada para que pueda escribir código mantenible en lenguajes diseñados para proyectos gigantes. Al mismo tiempo, debe presentarle conceptos como frp, mvc, visitantes, oop, actores, refactorización, separación de preocupaciones, reflexión y encapsulación.
  • Gestión, liderazgo y emprendimiento: una vez más, una clase de comunicación con el mundo. ¿De qué te servirá si al salir de la carrera no puedes hablar con los humanos? Casi todas las personas exitosas terminan en algún momento u otra tarea de administrar a otras personas en un proyecto (ni siquiera puedes escapar de esto en la academia). También lo ayudará cuando esté buscando trabajo.

Sophomore Spring: Las cosas se ponen difíciles.

  • Teoría de la complejidad: esta es una buena clase de teoría para tener desde el principio. Tomado de escribir, te coloca en la mentalidad perfecta para resolver problemas para resolver preguntas de entrevistas.
  • Sistemas distribuidos, redes: Internet no es escapable como informático. Es una teoría y una industria invasoras.
  • Teoría del lenguaje de programación: Haskell, ML, Prolog, Lisp. Esto debería enseñar sobre las propiedades de prueba de los lenguajes por recursión, sobre programación lógica y sobre programación funcional con patrones.
  • Economía: es realmente una pena si entras en el mundo y no sabes nada sobre por qué te pagan.

Junior Fall: terminando.

  • Minería de datos / Bases de datos: existe una gran posibilidad de que en cualquier trabajo de software termine consultando una base de datos.
  • Geometría computacional: se relaciona bien con la minería de datos.
  • Probabilidad y estadística para estudiantes de CS: mientras haces un poco de álgebra lineal, ¿por qué no hacer también otras matemáticas continuas?
  • Seguridad informática : las cookies están en todas partes. En algún momento, alguien intentará entrar en sus servidores. Mantenerlos fuera podría ahorrarle millones.
  • Historia del siglo XX : idealmente una que se centre en la tecnología. Sinceramente, no soy muy fanático de la historia, pero es bueno no ofender a los profesores o jefes con hechos erróneos.

Junior Spring: se necesita algo de profundidad.

  • Álgebra abstracta y teoría de números para estudiantes de CS: la relación entre estos temas y la teoría de autómatas y la criptografía y entre sí.
  • Sistemas operativos: Esto no necesita estar escribiendo un núcleo. Sería bueno que salieras de esta clase después de haber escrito al menos 2000 líneas de ensamblaje en C con un compañero y aprendido a escribir un controlador.
  • Aprendizaje automático e inteligencia artificial: una vez más, un subcampo extremadamente útil y frecuente de la informática.
  • Finanzas computacionales: toda persona libre y trabajadora en un país capitalista debe saber algo de finanzas. Es solo una ventaja que las finanzas se puedan hacer computacionales para los informáticos.

Caída Senior: Relajándose.

  • Gráficos por computadora y diseño de interfaz: no veo ninguna razón no histórica por la que estas sean clases separadas. Eventualmente te encontrarás con un usuario. Y eventualmente tendrás que mostrar algo
  • Autómatas y teoría de la recursividad: esto es genial.
  • Álgebra por computadora / Prueba de teorema automatizado: uno de estos podría salvarle la vida. El primero es un gran repaso para el álgebra lineal y el cálculo multivariable, el segundo es un gran repaso para la teoría del lenguaje de programación.
  • Psicología: no puedes engañar a una persona si no sabes cómo piensa. Esto beneficiará a sus programas frontales, así como a su capacidad de interactuar en el lugar de trabajo, así como a su vida hogareña.

Senior Spring: Fiesta.

  • Diseño del compilador: una vez más, esta no tiene que ser una clase demasiado difícil. A menudo es útil saber qué necesita optimizar en su código y qué no, incluso si nunca escribe un compilador. Es una buena idea aprender a aprovechar el recolector de basura.
  • Procesamiento del lenguaje natural: este tema se puede utilizar desde el análisis de ensayos hasta las estadísticas de los motores de búsqueda.
  • Teoría de gráficos / Teoría de juegos / Teoría de conjuntos / Teoría de categorías: estos temas se traducen bien a otros campos y en su mayoría son muy interesantes.
  • Filosofía: Toma esto último para que no tengas la tentación de cambiar de carrera.

Aunque esta es una pregunta bastante sesgada, ya que fue hecha por un amigo de A2A a quien me he quejado con bastante frecuencia sobre el plan de estudios, es realmente una obligación moral para mí responder esta pregunta.
Sin embargo, es importante tener en cuenta que el diseño de un plan de estudios es más o menos una decisión personal, o debería ser una, guiada por intereses personales y aspiraciones. Sería incorrecto que cualquiera forzara una forma particular de programa académico sobre alguien que pudiera tener sus propias ideas y propósitos para la educación.
Por lo tanto, mi respuesta más o menos solo refleja lo que sugeriría a un aspirante a CS Major para optar entre los diversos cursos que puede tomar. Sin embargo, como cuestión de gusto personal, podría ser posible que mi respuesta se vea sesgada hacia la teoría, pero eso es así porque promovería la enseñanza de principios y conocimientos por encima de la capacitación en herramientas, ya que creo que la educación debería abordar Ideas más permanentes. Además, probablemente seré más tradicional en cursos de modelado en torno a textos importantes, en lugar de recursos en línea, etc.

Primer semestre :

1) Matemática discreta
Fundamentos (conjuntos y relaciones), combinatoria, teoría de grafos y estilo de pensamiento matemático (pruebas y otros) son algunos de los requisitos más básicos para trabajar en cualquier campo técnico tan orientado matemáticamente como la informática. Un cierto equilibrio entre partes de Matemática discreta y sus aplicaciones (Kenneth Rosen) y Matemática discreta (Richard Johnsonbaugh) sería suficiente contenido, con la adición de material para resolver problemas de varias fuentes. También sugeriría un enfoque donde la inducción bien fundada y las consecuencias se discuten en detalle, ya que no es una subestimación de que “Probar en informática es equivalente a aplicar la inducción”.

2) Unix forma de hacer las cosas
Familiarización con el shell de Linux y la filosofía de Unix. No importa cuántas variedades diferentes de IU surjan, es esencial que todos los programadores de computadoras vean las cosas desde la perspectiva de un verdadero hacker. Aspectos importantes como la programación Shell y los sistemas Posix, no solo son importantes como características, sino que su uso en sí mismo ofrece una perspectiva bastante profunda y reveladora sobre la computación y la organización del sistema.

3) El arte de la programación informática
Yo personalmente haría todo lo posible en la forma de Knuth de presentarles a todos la programación y la forma algorítmica de pensamiento. Pero seguramente debe ejercerse flexibilidad en el modelo de pensamiento, ya que el objetivo de TAOCP no es enseñar cómo programar en código de ensamblaje, sino enseñar a modelar soluciones mediante la resolución de problemas.

4) Lógica digital y procesadores
Cuando a George Boole se le ocurrió “Las leyes del pensamiento” , podría haber sonado una especie de exageración, pero en retrospectiva, todas las formas de dispositivos informáticos que se han fabricado o se fabricarán en un futuro próximo solo funcionarán en álgebra booleana en un momento nivel fundamental El estudio de los circuitos lógicos combinacionales, los circuitos lógicos secuenciales y el diseño de procesadores digitales es un aspecto extremadamente importante de la educación en informática, ya que ayuda a comprender los átomos del diseño digital. Personalmente, creo que Digital Logic & Computer Design de Morris Mano es un buen texto, pero podrían existir varias alternativas.

5) Dinámica discreta
Dado que toda la computación es parte de un proceso, y dado que el concepto de proceso precede al de algoritmo (un algoritmo es simplemente un proceso cuyo resultado puede leerse de alguna manera significativa), es importante comprender los procesos de una manera lógicamente consistente y flexible. . Varios conceptos matemáticos como invariantes, monovariantes y puntos fijos son fundamentales para la sicencia de la computadora y pueden entenderse bien por las iteraciones y su dinámica. De hecho, gran parte de la programación de computadoras, gracias a la semántica denotacional, puede reducirse a operadores de punto fijo. Pero también esto puede ayudar a comprender dinámicas discretas de una manera en la que varias propiedades, como compartir recuerdos o entradas en tiempo real, etc., se puedan modelar bien.

Segundo semestre :

1) estructuras de datos
Un curso en estructuras de datos es esencial para pasar a temas avanzados en informática. Además, recientemente ha habido una tendencia a inclinar el curso de estructuras de datos naturalmente hacia estructuras de datos concurrentes, lo cual es algo bueno para un programador de aprendizaje.

2) Organización del sistema informático
Este es un curso estándar de CS, que generalmente discute arquitecturas ARM o MIPS, y aunque se pueden proponer muchas alternativas, no habría mucha diferencia en el contenido siempre que conceptos importantes como Pipelines, Cache, etc. discutido

3) Teoría de números y álgebra
Un curso típico de álgebra abstracta, con mucha teoría de números algebraicos realizada también. Concrete Mathematics (Knuth), cualquier libro de texto estándar en álgebra como Abstract Algebra: Theory and Applications o Algebra (Michael Artin), junto con una buena fuente de problemas (como los de Putnam) sería un excelente contenido por supuesto, aunque solo sea lo básico están cubiertos.

4) Fundamentos de software / Estructura e interpretación de programas de computadora
Es extremadamente importante que un estudiante de CS sepa cómo programar, y eso no significa tanto aprender muchos lenguajes y herramientas, sino tener una comprensión decente de las estructuras y paradigmas programáticos. Personalmente, creo que la Estructura e Interpretación de los Programas de Computadora puede ofrecer una muy buena introducción, si se complementa con los lenguajes de introducción mencionados por Norvig, citados aquí.

5) Métodos formales y teoría de la computación
Teoría de autómatas, en forma puramente clásica. Hacer la teoría de los autómatas después de haber sido introducido en los diagramas de estado en la lógica digital, es el siguiente paso lógico, y los autómatas deben introducirse de una manera en gran parte libre de desarrollos de la teoría de la complejidad y otros. En más o menos la forma Auotmata era conocida por Kleene o Turing. La introducción a la teoría de los autómatas, los idiomas y la computación podría ser excelente si se realiza con criterio. Los autómatas ofrecen una vista independiente de la implementación de los procesos computacionales, de tal forma que el comportamiento de la máquina puede analizarse de manera manejable.

Tercer semestre

1) Algoritmos y Teoría de la Computación
Obviamente, una encuesta sobre las técnicas en el diseño y análisis de algoritmos es imprescindible. Personalmente, creo que aunque cualquier contenido puede ser cubierto aquí, lo que sigue siendo esencial son los principios de diseño de algoritmos y resolución de problemas que siguen siendo el foco.

2) Computación simbólica y de orden superior
Este es probablemente el único curso en el que me veo obligado a dejar de lado el agnotismo del lenguaje, ya que Lisp es el único lenguaje que permite pensar de manera impensable sobre la recursividad y el diseño de software. La meta-circularidad, el código como datos, etc. son algunos conceptos que son fácilmente manejables con Lisp. El curso debería explorar en gran medida los trabajos en sistemas simbólicos, como los realizados por piratas informáticos de los días del laboratorio de IA del MIT. Y debería ser una introducción suficientemente buena para escribir un buen software y comprender la computación simbólica.

3) Análisis real
Un curso básico de análisis es imprescindible para cualquier estudiante universitario de STEM, y especialmente para los informáticos, un curso sobre cálculo y análisis real es esencial para mantenerse en contacto con el mundo del continuo, lejos de la discreción.

4) Fundamentos filosóficos y teóricos de la computación
Cómo el conocimiento y la observación forman algunos de los fundamentos de la computación, la criptografía y la física. Probablemente parte del curso podría cubrir la computación cuántica desde Demócrito (Scott Aaronson), con el resto del curso.
podría discutir trabajos de Russell, Whitehead, Smullyan, etc. Deben discutirse cosas como la lógica ordinaria de Turing, el teorema de incompletitud de Godel y el teorema de indefinibilidad de Tarski. Y parte del enfoque también debería estar en cómo la filosofía de la información se encuentra en el centro de campos como la Mecánica Cuántica.

5) Representación de datos y lenguajes de consulta
Se pueden enseñar los conceptos básicos de cálculo relacional, álgebra relacional y SQL para dar una idea general de la computación teórica de conjuntos y el poder de la lógica en el diseño de consultas. Los fundamentos de las bases de datos se pueden utilizar para introducir la teoría sobre los poderes expresivos de la representación de datos o los lenguajes de consulta.

Una vez que se realiza el Core, se deben ofrecer muchas asignaturas optativas, que se pueden ordenar en el plan de estudios según la conveniencia. Algunas de las asignaturas optativas que deben estar disponibles son:

Fundamentos de la inteligencia artificial: razonamiento (de primer orden, bajo incertidumbre, etc.) y encuesta de representación del conocimiento; Ontología formal; Buscar heurística y juegos

Algoritmos avanzados y estructuras de datos: estructuras de datos avanzadas; Algoritmos aleatorizados; Algoritmos de aproximación

Sistemas operativos: teoría de concurrencia, subprocesos automatizados y programación de procesos; Gestión de memoria y memoria virtual; Sistemas de archivos; Mensaje que pasa y proceso de comunicación; Tolerancia a fallos

Compiladores: más o menos compiladores: principios, técnicas y herramientas, el Libro del Dragón

Teoría de la complejidad: más o menos complejidad computacional: un enfoque moderno. Complejidad del tiempo, Complejidad del circuito booleano, Complejidad del espacio, Complejidad aritmética, et al. Pero quizás también se pueda incluir el trabajo reciente de Scott Aaronson en complejidad cuántica.

Principios de los lenguajes de programación: fundamentos prácticos para lenguajes de programación + tipos y lenguajes de programación / Lambda Calcluls; Sistemas de tipo; Compiladores meta circulares; Introducción a la teoría de categorías y Haskell; Documentos de Lambda the Ultimate

Sistemas de bases de datos : fundamentos de bases de datos + El libro completo

Criptografía y seguridad de la información: principalmente fundamentos de la criptografía + Introducción a la criptografía moderna + Criptografía cuántica + Control de flujo de información

Prueba de teorema automatizada: teorías de tipo; Teoría de la categoría; Teoría de la prueba; Teoría del tipo de homotopía; Coq, Agda, LF, etc.

Programación paralela y distribuida: principalmente El arte de la programación multiprocesador + quizás alguna teoría de concurrencia per se.

Teoría de la información cuántica: Informática cuántica: una introducción

Y varios otros, tales como geometría computacional, aprendizaje automático, lingüística computacional, minería de datos, gráficos por computadora, et al. junto con otros cursos como Teoría de optimización, Teoría de números avanzada, Topología algebraica, Filosofía de la metáfora y analogía, etc.