¿Cuál es la asignatura / teoría de CS más difícil que estudiaste pero que es importante para el campo? ¿Y la razón por favor?
¿Cuál es la asignatura / teoría de CS más difícil que estudiaste pero que es importante para el campo? ¿Y la razón por favor?
Respuestas:
"Hay 2 problemas difíciles en informática: el almacenamiento en caché, los nombres y los errores off-by-1"
Sinceramente, la construcción del compilador!
Diseño y Análisis de Algoritmos
Creo que esa pregunta depende del maestro que tuviste y de cómo se organizó esa asignatura en tu carrera.
Analizar algoritmos puede ser tan difícil como alguien quiera. Tenga en cuenta que hay problemas no resueltos, y no solo eso: problemas que no se pueden resolver.
El problema es que puede tener un problema, y si sabe que no se puede resolver, eso es perfecto. ¿Pero y si no lo haces? Puede pasar mucho tiempo tratando de demostrar que está NP-Completo, o tratando de encontrar una solución de tiempo polinómico para resolverlo.
Demostrar NP-Completness no es fácil. Sí, se conocen muchos problemas, pero lo importante es encontrar las reducciones para demostrar que es NP-Complete. ¿Y qué pasa si pasas muchas horas / días / meses tratando de demostrarlo, y se puede resolver en tiempo polinómico? :)
También hay otras asignaturas, como compiladores , teoría de grupos y funciones primitivas recursivas que pueden ser tan difíciles como el plan de asignaturas o el profesor quiere;)
Reconocimiento de patrones, es decir, inteligencia artificial. Esto se refiere a la computación inteligente junto con otras herramientas de reconocimiento de patrones como, reconocimiento óptico de caracteres, voz a texto, identificación facial, etc.
Muchas de las cosas "geniales" que puedes hacer o desearías hacer con las computadoras se basan en estos algoritmos, y hemos estado tratando de perfeccionarlos durante décadas sin mucho éxito.
Mi elección es la teoría de la computabilidad
(Hmm ... tal vez no es tan importante, pero seguro que fue difícil)
Solo hay dos problemas difíciles en Informática: invalidación de caché y nombrar cosas. - Phil Karlton
teoría de categorías (matemáticas discretas), pero vale la pena
Criptografía
Si lo hace un poco mal, podría costarle a una compañía millones.
Sistemas operativos, especialmente la parte que tiene algo que ver con el enhebrado.
Y la razón no es porque fue tan difícil hacer que 5 filósofos coman pizza con un tenedor. La razón es porque escribir código multiproceso es en sí mismo difícil y no necesariamente fácil de calcular para la mente humana (al menos, según mi esposa).
Yo también voto por el diseño del compilador. Especialmente donde entra la parte de DFA y NFA. Tampoco tengo muy claros los problemas de NP y demás.
Bueno, técnicamente esta es una rama de las matemáticas, pero es muy relevante en CS.
Casi todo en CS se basa en colas (visibles (obvias) e invisibles (no tan obvias o implícitas)).
En los primeros días de CS las colas eran obvias.
Una cola de programas (cada programa una baraja de cartas).
Hoy en día las colas no son tan obvias. Internet, por ejemplo: una red de paquetes conmutados, pero los paquetes forman colas y el enrutamiento de los paquetes es una forma de minimización de colas.
No es demasiado difícil para los problemas con los juguetes que se te dan en el curso, pero una vez que comienzas a considerar problemas reales, se convierte en un trabajo pesado.
Interpretar los requisitos del cliente cuando el cliente realmente no sabe lo que quiere. Esto no se enseña en la universidad, y es una de las habilidades más esenciales para tener.
Personalmente, el mío era la lógica formal. Al principio fue difícil, pero una vez que aprendes las reglas y logras jugar lo suficiente, tu cerebro funciona Logic++;
, lo que en desarrollo es algo muy bueno.
Como nota al margen, estoy respondiendo la pregunta directamente. Definitivamente, este no era el tema más difícil cuando obtuve mi título, pero probablemente fue el tema más difícil "aplicable en la vida real".
Construcciones de compiladores. Difícil pero debe entender los conceptos detrás
Kernel Design alguien? Bueno, realmente no sé cómo se hace y cuáles son las características específicas para un sistema operativo, pero para mí pensar en diseñar un núcleo debe ser una tarea desalentadora.
También pienso en la seguridad informática ; Realmente no sé qué hace que un sistema sea inseguro, excepto, por supuesto, desbordamientos obvios del búfer, inyecciones XSS y SQL.
No estoy seguro, pero parece que algunos algoritmos también son inseguros; mire el proyecto MetaSploit, enumera todo tipo y tipo de violaciones de seguridad: puede ver que hay muchas formas en que un programa puede tener fallas.
Hay muchos temas incómodos en el campo, pero mis elecciones para la dificultad persistente son aquellas que involucran propiedades del sistema global . Los ejemplos de este tema general incluyen:
Estos son difíciles porque buscas algo que solo existe cuando todo es correcto; necesita una propiedad de sistema global y, sin embargo, prácticamente todas las herramientas disponibles (y todas las que se adaptan a problemas reales en mi experiencia) solo hacen un razonamiento local. Es el proceso de pasar del razonamiento sobre las piezas del programa a todo el shebang que es difícil, particularmente porque es completamente posible tener piezas que son todas correctas en sí mismas pero donde todavía hay errores sutiles porque los componentes están mal organizados; los errores pueden ser características emergentes indeseables ...
Servicios de información gerencial
Durante mi período universitario, solía tener una materia gerencial cada semestre, lo que me volvía loco.
¡Difícil! Bien, temas como el diseño del compilador , el diseño del sistema operativo , etc.son difíciles pero son realmente interesantes y desafiantes. Realmente me metí en temas como el Sistema de Información de Gestión / Servicios, etc., ya que están llenos de aburrimiento y tienes que pasar por muchas teorías.
Si está trabajando en C / C ++, los punteros son el concepto más importante que debe saber. Pero de alguna manera nunca lo entendí completamente en la universidad.
Diseño y Análisis de Algoritmos. No es tanto que sea difícil de entender y analizar algoritmos conocidos , es que diseñar y analizar nuevos algoritmos para problemas difíciles es difícil y requiere una amplia comprensión de muchas áreas y práctica en la aplicación de muchas técnicas diferentes.
¿Cuál es la asignatura / teoría de CS más difícil que estudiaste pero que es importante para el campo?
Matemáticas discretas.
Fue difícil porque las teorías están muy poco relacionadas entre sí, pero se usan en CS. Demasiada memorización, supongo ...
Prueba por inducción, Big O, recursión, división y conquista, teoría de grafos, bla, bla ... ¡argh!
El compilador para mí fue fácil, porque tuvimos que tomar Theory of Automata. ^^
Me gustan sus respuestas (y no me olvidé de votarlas), como el compilador, el núcleo, etc., pero la mayoría de los programadores nunca se encontraron con estos problemas. Hay un problema un poco más fácil, pero más común: concurrencia - hilos, bloqueo. Es muy fácil escribir un programa que produzca errores mágicos, incluso si cometemos un pequeño error en la arquitectura de concurrencia.
Entonces, digo, no es el problema más difícil en informática, pero debido a que se usa comúnmente, es peligroso.
Programación orientada a objetos
Probablemente es porque me corté los dientes en FORTRAN y APL, pero el cambio de lenguajes estrictamente procesales a objetos ha sido algo con lo que he luchado durante años. No ayuda que los llamados 'expertos' escriban artículos y tutoriales contradictorios sobre lo que significa estar orientado a objetos y las formas mejores / adecuadas de construir programas orientados a objetos.