+1 Compiladores fue el más difícil y el más gratificante.
dietbuddha
3
Estaba allí con la mayor parte del trabajo y una buena preparación para la codificación gruñona, pero no creo que haya sido tan difícil. Tal vez más difícil sin el uso de YACC o las herramientas que usamos, no lo sé.
Peter Turner el
44
Los compiladores son realmente difíciles porque la mayoría de la teoría data de tiempos de restricciones de hardware increíblemente severas y muchas de las instrucciones formales no han avanzado mucho más allá de eso. Eche un vistazo a Let's Build A Compiler para ver cuán fácil puede ser la escritura del compilador si lo aborda desde un ángulo diferente.
Mason Wheeler
1
@ Martin York, como escritor de compiladores, creo que la complejidad de implementar compiladores se sobreestima severamente. En general, un compilador es mucho más simple que un intérprete. Sospecho que es un Libro del Dragón y su tipo es el culpable, proponen las formas más complicadas de hacer cosas simples y prestan demasiada atención al paso menos importante, es decir, el análisis.
SK-logic
1
@Martin York, existen técnicas para mantener un AST lo más simple y fácil de mantener, sin importar lo complicado que sea el idioma de origen. También hay una serie de técnicas muy simples pero poderosas para mantener cada etapa de compilación trivial y aislada.
SK-logic
22
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;)
s / Análisis / Análisis ... de lo contrario, exactamente lo que pienso ... funciones recursivas primitivas, ¡¡¡¡¡uargh !!
Felix Dombek
De acuerdo, me confundí con mi licenciatura sin tener la certeza de que alguna vez 'probé' con éxito algo (aunque mi clase de Algoritmos era demasiado simple, debido al profesor)
Peter Turner
Te mostraré en estos días lo difíciles que pueden ser los algoritmos :)
Oscar Mederos
18
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.
Es difícil porque no es algo determinista. El desarrollo de un buen reconocimiento de patrones AI requiere experimentación para cada aplicación que desea utilizar para, para asegurar que elija el algoritmo correcto, las características adecuadas, etc ...
Ken Bloom
1
Estoy empezando a escalar esta montaña en particular (reconocimiento de patrones). Es dificil. MUCHAS matemáticas. Grandes, enormes e intimidantes montones de matemáticas, mirándome fijamente, retándome a entrar.
David Poole
así ... patrón de recono también puede ser visto como la estadística aplicada, no es sólo un problema dentro de la gama de CS
Estoy de acuerdo en que la teoría de la computación era difícil, pero también era una de mis asignaturas favoritas. De acuerdo, tenía doble especialización en Matemáticas ...
Poindexter
+1 Yo también me especialicé doblemente. Podría manejar una introducción a estas cosas, pero la versión de posgrado ... ¡me alegro de haberla dejado caer!
Trabajo
fue difícil, no sabemos tanto al respecto que no importa mucho.
Nombre para mostrar
10
Solo hay dos problemas difíciles en Informática: invalidación de caché y nombrar cosas. - Phil Karlton
Aunque cada vez más popular, Crypto no es exclusivo del software.
JBRWilkinson
Crypto no es tan difícil. El problema es que la seguridad no se puede probar fácilmente, por lo que solo notas tus errores cuando alguien te piratea. Pero la falta de capacidad de prueba se aplica a la mayoría de las formas de seguridad de TI, no solo a la criptografía.
CodesInChaos
4
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).
Deje que su esposa escriba el código multiproceso entonces :)
3
Recuerde, cuando se trata de subprocesos múltiples de memoria compartida, la computadora es un cerdo astuto que está listo para atraparlo. Doblemente cuando se trata de un procesador multinúcleo; un núcleo puede distraerte frente a tus ojos donde estás mirando, y el otro puede ir detrás de ti y apuñalarte por la espalda.
Donal Fellows
3
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.
Sí, hubiera tenido más dificultades con los compiladores si no hubiera tomado primero la teoría de la computación.
Peter Turner el
Los DFA y NFA son alimento para pollos. Espere hasta que tenga que hacer el análisis LALR (1).
David Thornley
3
Teoría de colas
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 (tanto como (uno podría (ver), pero (se ha (sabido)). Suceder)).
Martin York
3
Análisis numérico
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.
No estoy seguro de estar de acuerdo con este concepto de informática. Tampoco veo cómo se puede resolver utilizando el método científico.
jmort253 01 de
@ jmort253 - Esto es cierto, pero la informática intenta (sin éxito en mi opinión) investigar este campo con métodos formales de diseño y validación.
Mouviciel 02 de
Estoy de acuerdo en que no es un concepto de "informática", pero cuando comencé mi carrera no era consciente / ajeno al hecho de que los clientes no saben lo que quieren. Pensé que TODOS los proyectos de software venían con algún tipo de documento de requisitos formales. ¿Tal vez un tema de conferencia para un curso de ingeniería de software (tal vez mi universidad no lo cubrió)?
Steven Striga
1
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".
La lógica formal es algo con lo que tuve una relación de amor / odio. Me gustaba pensar en los conceptos, pero nunca pude entender cómo me estaba ayudando hasta más tarde, cuando me encontré con problemas del mundo real que requerían un pensamiento lógico.
jmort253 01 de
@ jmort253 - Realmente fue lo mismo para mí. Incluso luché hasta el punto de pensar que iba a fallar, estudié tanto y duro hasta que finalmente hizo clic en mi cabeza. Después de eso, los beneficios han sido increíbles.
Kyle Rozendo
1
Construcciones de compiladores. Difícil pero debe entender los conceptos detrás
Debería dar un voto positivo por la misma respuesta que recibió antes que usted, en lugar de dar la misma respuesta nuevamente.
Abimaran Kugathasan 01 de
1
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:
Multihilo seguro y sin bloqueo
Seguridad
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.
Lleno de aburrimiento porque están hablando de las complejidades conceptuales de cada sistema, mientras que la mitad de las personas nunca escribieron ningún sistema por sí mismas (pero seguramente usaron una variedad de). Además, los seminarios usan tantas palabras cargadas pero no pueden proporcionar un ejemplo de la vida real en inglés simple. Al igual que los sistemas de apoyo a la toma de decisiones ... ¿no podría simplemente dejar algunas capturas de pantalla de los informes de Google Analytics, FML, solo para que los estudiantes estén en la misma página antes de salir corriendo teniendo un orgasmo intelectual frente a la audiencia?
Filip Dupanović
0
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.
¿De Verdad? Quiero decir, cada persona es diferente, pero creo que hay muchos (quiero decir, muchos ) temas más difíciles que solo punteros . Por ejemplo, Computer's Architecture , Assambler que de alguna manera están relacionados con punteros ;)
Oscar Mederos
Es cierto, pero le resultará mucho más fácil entender las referencias de memoria a través de ensambladores, porque en realidad trabaja con punteros sin procesar , mientras que en C / C ++ trabaja con referencias a punteros, lo que confunde a la gente porque la abstracción nunca se habla abiertamente acerca de.
Filip Dupanović
2
Ah Asaltador, el mejor té del programador
Matt Ellen
El tipo preguntó los temas que son difíciles pero importantes, por lo tanto, sugerencias.
Manoj R
@Matt: Acabas de alegrarme el día: D @Manoj R: Los punteros son triviales si solo piensas en ellos como acceso a la matriz. ¿O es difícil el acceso a la matriz?
back2dos
0
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.
La notación Z / métodos formales utilizados para dañar mi cerebro en la universidad. Principalmente porque lo odiaba. Lo difícil es mucho más fácil cuando disfrutas de lo que estás haciendo y mucho más difícil cuando no lo haces.
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.
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.
Respuestas:
"Hay 2 problemas difíciles en informática: el almacenamiento en caché, los nombres y los errores off-by-1"
fuente
Sinceramente, la construcción del compilador!
fuente
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;)
fuente
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.
fuente
Mi elección es la teoría de la computabilidad
(Hmm ... tal vez no es tan importante, pero seguro que fue difícil)
fuente
fuente
teoría de categorías (matemáticas discretas), pero vale la pena
fuente
Criptografía
Si lo hace un poco mal, podría costarle a una compañía millones.
fuente
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).
fuente
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.
fuente
Teoría de colas
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.
fuente
Análisis numérico
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.
fuente
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.
fuente
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".
fuente
Construcciones de compiladores. Difícil pero debe entender los conceptos detrás
fuente
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.
fuente
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 ...
fuente
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.
fuente
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.
fuente
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.
fuente
Programación de restricciones. que trata problemas combinatorios, problemas NP-completos.
fuente
La optimización del algoritmo es un tema desafiante.
fuente
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. ^^
fuente
La notación Z / métodos formales utilizados para dañar mi cerebro en la universidad. Principalmente porque lo odiaba. Lo difícil es mucho más fácil cuando disfrutas de lo que estás haciendo y mucho más difícil cuando no lo haces.
fuente
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.
fuente
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.
fuente