Cómo realizar una investigación en informática

Hay mucho para recomendar la respuesta de David Maier, pero no captura mi experiencia (ni, debo decir, estaba tratando de hacer eso).

Comencemos con la parábola del pez luna.

Un estudiante de posgrado equipado con honores y diplomas fue a Agassiz para recibir los toques finales y finales. El gran hombre le ofreció un pez pequeño y le dijo que lo describiera.

Estudiante de posgrado: “Eso es solo un pez luna”.

Agassiz: “Lo sé. Escribe una descripción”.

Después de unos minutos, el estudiante regresó con la descripción del Ichthus Heliodiplodokus , o cualquier término que se use para ocultar el pez sol común del conocimiento vulgar, la familia de Heliichtherinkus , etc., como se encuentra en los libros de texto de la asignatura.

Agassiz nuevamente le dijo al estudiante que describiera el pez.

El alumno produjo un ensayo de cuatro páginas. Agassiz luego le dijo que mirara al pez. Al final de las tres semanas, el pez estaba en un estado avanzado de descomposición, pero el estudiante sabía algo al respecto.

Ezra Pound entendió todo mal sobre los detalles, pero escribe como un Jefe, así que esta es la versión del estilo de enseñanza de Louis Agassiz que es más conocida. La realidad es mucho más convincente.

Nathaniel Shaler dejó sus estudios humanistas y se unió al laboratorio de Agassiz en la Universidad de Harvard, ya había leído el ensayo introductorio de Agassiz sobre clasificación. Su autobiografía detalla sus interacciones iniciales con Agassiz. Con respecto a su primera asignación, Shaler registró que Agassiz le trajo un pez pequeño para estudiar con la condición de que Shaler no lo discutiera con nadie ni leyera nada sobre el tema hasta que Agassiz le hubiera dado permiso. Cuando Shaler le pidió a Agassiz instrucciones más explícitas, Agassiz respondió que no podía ser más explícito que decir “[f] descubra lo que puede sin dañar el espécimen”. Después de las primeras horas, Shaler pensó que había “compadecido a ese pez”, pero a pesar de que Agassiz siempre estaba “a la orden”, no se le pidió que presentara sus conclusiones. Durante el transcurso de la semana siguiente, Shaler registró los detalles de “cómo fueron las escalas en serie, su forma, la forma y la colocación de los dientes, etc.”

Finalmente, el séptimo día, llegó la pregunta “¿Y bien?” y mi disgusto de aprender con él mientras estaba sentado en el borde de mi mesa fumando su cigarro. Al final de la hora contando, se apartó y dijo: “Eso no está bien”.

Shaler concluyó que Agassiz lo estaba probando para ver si era capaz de “hacer un trabajo duro y continuo sin el apoyo de un maestro” y redobló sus esfuerzos, comenzando desde cero y, en el transcurso de siete días de diez horas, logró describir el espécimen a satisfacción de Agassiz.

También hay análogos de esto en física: a cada alumno de una clase se le da un cubo de hielo en un platillo y se le asigna la tarea de escribir 100 observaciones en el transcurso de diez minutos.

Para la investigación en informática usaría un ejemplo ligeramente diferente. Tome el cubo de hielo (o pez luna) y escriba cien preguntas que podrían responderse experimentalmente.

Solo para comenzar con el cubo de hielo:

1. ¿Qué impurezas hay en el hielo?
2. ¿Cuál es la distribución de estas impurezas?
3. ¿En qué medida la distribución se explica por la distancia desde el piso o las paredes de la bandeja de cubitos de hielo?
4. ¿El congelamiento causó esta distribución, o fue la misma distribución que cuando el agua estaba en forma líquida?
5. ¿En qué medida la distribución se explica por la gravedad?
6. ¿Cómo cambiaría la distribución si la gravedad no estuviera presente?
7. ¿Cuál es la distribución de las temperaturas internas en el cubo de hielo?
8. ¿En qué medida esta distribución se explica por impurezas?
9. ¿Las impurezas afectan el patrón de fusión?
10. ¿Las impurezas afectan las características ópticas del cubo de hielo?

¿Son estas preguntas estúpidas? La mayoría de ellos probablemente lo sean. Pero no estoy tratando de llegar a 100 preguntas inteligentes y perspicaces. Estoy tratando de ver este objeto tal como es en realidad, en lugar de ver mi colección de atajos mentales que generalmente uso para representar el objeto.

Así que ahora tomemos un ejemplo de Computer Science. En lugar de observar o crear experimentos, voy a agarrar un concepto y ver a dónde va. (Estoy haciendo esto en vivo, por cierto).

1. Ok, entonces, existen símbolos débiles. ¿Y qué?
2. Bueno, bueno, si solo tengo una función X en un binario, no importa si es débil o fuerte. Eso es lo que se llama si llamo X.
3. Y si agrego un símbolo fuerte que también se llama X en el binario (probablemente vinculado con una biblioteca diferente), entonces no hay error; se llama al símbolo fuerte. Hasta ahora, tan aburrido.
4. Pero apuesto a que podría tener muchas versiones débiles de X en el mismo binario y se llamaría a la versión fuerte (si está presente). Si no hubiera una versión fuerte, probablemente sea mala; el cargador (?) no sabe qué símbolo débil elegir.
5. Apuesto a que podría usar dlopen para averiguar cuántos símbolos débiles había y dónde vivían. Y podría usar la versión fuerte de X para decidir llamar a qué versión débil de X. Ok …
6. Ahora, ¿por qué querría un montón de X débiles flotando?
7. Bueno, cada uno de ellos podría compilarse en un procesador diferente. Meh, la arquitectura del procesador no va a cambiar debajo de ti. Ser capaz de seleccionar eso en tiempo de ejecución no te compra mucho.
8. Ah, pero ¿y si tuviéramos varias versiones diferentes de X, cada una sintonizada a un tipo particular de entrada (si esto fuera una matriz multiplicada o algo así)?
9. Meh, podrías poner todas esas posibilidades en una función y descubrir qué parte de la función usar en tiempo de ejecución.
10. ¡Ah, pero espera! ¿Qué pasa si el rango de posibles patrones de entrada es realmente grande, tan grande que no querríamos hinchar el binario compilando un código optimizado para todas esas posibilidades, especialmente? cuando solo podríamos ver unos pocos en una carrera determinada?
11. Entonces, tal vez tenemos varios cientos / miles de bibliotecas en el disco duro, y el programa decide a cuál de ellas vincular en función de lo que observa en tiempo de ejecución.
12. Pero, ¿y si hubiera millones de posibles patrones de entrada? ¿Realmente queremos estar cargando tantas bibliotecas, especialmente? como la gran mayoría de ellos nunca se acostumbrarán?
13. Ah, ¿y si recompilamos la biblioteca en tiempo de ejecución con la información sobre los patrones de datos observados? Y luego usamos una combinación de símbolos débiles y dlopen para tomar la biblioteca una vez que se compila.
14. Y monitorearíamos los patrones de datos para que si fuera necesaria una nueva compilación dinámica, pudiéramos recompilar y volver a vincular sobre la marcha.

Entonces ese es un proyecto de investigación potencial. Puede que ya se haya hecho. Puede ser completamente innecesario para la gran mayoría de los programas. Puede ser inviable en arquitecturas actuales. Las ganancias de rendimiento pueden ser mínimas.

Pero responder esas preguntas es más o menos mecánico. Cualquier buen sistema Ph.D. el estudiante podría recoger esto y correr con él, incluso si fuera solo para ver dónde me había equivocado.

Lo más difícil para la mayoría de las personas parece ser pasar de una idea que todos conocen (símbolos débiles) a una idea de investigación que podría no haberse hecho antes (recompilación dinámica). Puedo darte un ejemplo de cómo hago esto, pero me temo que no puedo desglosarlo más.

(Y parece que esto ya se ha hecho: “recompilación dinámica” – Google Scholar).

Creo que podría no haber fallado por completo en responder tu pregunta. Gracias por el A2A.

Creo que hay muchos, muchos modelos. Pero aquí está el mío:

  1. Busco algo que no entiendo completamente entre las cosas que sé bastante bien. Es decir, busco lagunas en el conocimiento. Hay muchas cosas así, así que elijo una que se siente útil e interesante. Ejemplos concretos: (A) a alguien se le ocurrió un nuevo algoritmo que funciona muy, muy bien, pero realmente no entiendo por qué funciona tan bien (B) alguien ha demostrado un resultado, pero aunque puedo seguir la teoría, Realmente no entiendo qué lo hace funcionar.
  2. Luego procedo a hacer experimentos rápidos utilizando el software que programo. Si estoy examinando una afirmación hecha por otros investigadores, no es raro que no pueda reproducir sus resultados. Si examino algunos resultados teóricos, no es raro que la fuerza del resultado sea realmente decepcionante en la práctica. De todos modos, a través de experimentos baratos, generalmente obtengo información adicional que no está disponible en la literatura.
  3. Luego procedo a escribir software más serio y a hacer una teoría más seria. Recojo notas aleatorias a medida que avanzo.
  4. En algún momento, tengo suficiente para un trabajo de investigación en mis notas, así que lo limpio y lo publico. A menudo esto corresponde a un punto en el que fui tan lejos como sabía.

Es importante darse cuenta de lo que no estoy haciendo. No estoy adoptando un enfoque existente y tratando de mejorarlo. Esto sucede a menudo, pero es más una consecuencia de la pregunta “¿podríamos mejorar esta técnica?” Mi conductor es realmente curiosidad. Tampoco estoy tratando de “resolver nuevos problemas”. No es que no sea una buena idea, pero no intento hacer nuevas preguntas a propósito. De hecho, estoy seguro de que me estoy haciendo las mismas preguntas que otros. La razón por la que termino con un trabajo de investigación es que sigo persiguiendo mis preguntas durante mucho tiempo.

Oh! Y tampoco tengo un plan establecido. No sé qué averiguaré.

Solía ​​investigar, y mi investigación se dividió principalmente en tres clases amplias:

1) Encontrar formas de usar computadoras para interpretar, visualizar y básicamente combinar los resultados de la simulación y los estudios empíricos con el propósito de verificar hipótesis y conducir a nuevas.

2) Encontrar algoritmos que se mapeen en configuraciones de hardware inusuales, como máquinas y clústeres SIMD (Single Instruction Multiple Data), en lugar de simplemente usar algoritmos tradicionales y escalarlos.

3) Adaptar y consolidar puntos de vista y modelos de diferentes campos científicos, ya sea para una simple polinización cruzada o para desarrollar una comprensión más general que se reduzca a casos especiales para campos particulares.

4) Descubrir cómo escalar sistemas complejos de modo que se puedan agregar nuevas características en el tiempo O (1).

Se podría argumentar que solo los números 2 y 4 eran pura investigación sobre CS, y los números 1 y 3 tenían grandes componentes sociales, antropológicos y aplicados. Los cuatro involucraron considerables cosas nuevas. El número 4 no era algo para lo que me contrataron, pero tenía que hacerlo para hacer las cosas que tenía que hacer, si entiendes lo que quiero decir. Lo cual hice, pero no creo que mucha gente esté interesada.

Daré ejemplos de 1 a 3:

1) Hubo un problema con la simulación de tormenta eléctrica. Los modelos de tormentas eléctricas produjeron estas corrientes ascendentes largas y puntiagudas, y nadie creía que los modelos fueran buenos porque no los vieron en los datos. Sin embargo, esto resultó ser solo porque estaban mirando mal los datos. Trabajé con algunos datos Doppler de Socorro, NM y descubrí una forma de ver las corrientes ascendentes en los datos reales, lo que convenció a la gente.

También se realizaron algunas investigaciones sobre enfoques cercanos de partículas con carga diferente. Se giran unas cuantas veces antes de separarse. Nadie percibió lo que sucedía en las vistas tradicionales de los datos. Entonces descubrí cómo mostrarlo.

2) Varias veces, pudimos encontrar y adaptar algoritmos del pasado (siglos XVII y XVIII) que nadie recordaba porque parecían tan difíciles, que funcionaban perfectamente en arquitecturas inusuales.

3) Creo que el mejor trabajo que hice aquí fue la generalización de las cuadrículas como múltiples muestreadas geométricamente con estructuras y mapeos puramente topológicos. Muchos campos diferentes usan cuadrículas, pero cada uno tiene una vista diferente de lo que son. Consolidé esto.

La “informática” puede ser un nombre inapropiado, en la medida en que lo que muchos, o incluso la mayoría, hacen los científicos informáticos no es ciencia. La excelente respuesta de Joshua Engel distingue entre los lados puros y aplicados de la informática, pero una distinción diferente, que me gusta, es entre los informáticos que son “ingenieros” (que construyen cosas), “matemáticos” (que prueban cosas) y “científicos” (que miden cosas) Todos estos, en varias proporciones, son partes importantes de la investigación en ciencias de la computación.

Algunas personas usan solo uno de esos sombreros, pero algunos usan los tres. Por ejemplo, tengo un amigo que investiga la recolección de basura. Los recolectores de basura de alto rendimiento son grandes hazañas de la ingeniería de software, pero también tienen una teoría importante detrás de ellos. Como “ingeniero”, diseña y construye recolectores de basura con algoritmos novedosos, tratando de cumplir con los objetivos de rendimiento y latencia. Como “matemático”, formalmente modela recolectores de basura y prueba teoremas sobre ellos, por ejemplo, que en realidad solo recolectan basura o que cumplirán con límites de tiempo particulares. Usando su sombrero de “científico”, formula hipótesis sobre el desempeño de la vida real de los recolectores de basura, y realiza experimentos para medir el desempeño. Todas estas cosas constituyen la investigación en informática.

Soy un investigador de lenguajes de programación. Muy raramente hago “ciencia”, pero hago “matemáticas” e “ingeniería” todo el tiempo. Esto se debe a que diseño e implemento idiomas y características de lenguaje, pero también modelo idiomas para demostrar que tienen propiedades saludables particulares, principalmente que hacen lo que están destinados a hacer. A los investigadores de mi área les gusta hacer afirmaciones de que ciertos idiomas o características particulares son fáciles de usar o aumentar la productividad, pero en su mayor parte, no sabemos cómo “científicamente” corroborar esas afirmaciones. (La gente lo ha intentado, pero los resultados no son, en su mayor parte, muy esclarecedores). Por otro lado, hay áreas de la informática, como la interacción humano-computadora, en las que los investigadores hacen mucha “ciencia” ejecutando estudios de usuarios para probar hipótesis sobre artefactos de software que ellos “diseñan”. Y hay otras áreas que son casi completamente “matemáticas”, donde la gran mayoría de la investigación consiste en probar teoremas.

Esta es una pregunta difícil de abordar en un espacio pequeño, ya que los estilos de investigación en CS son muy amplios. En un extremo está la informática teórica, donde la investigación se parece mucho a las matemáticas: presenta las definiciones correctas, intenta demostrar teoremas o derivar resultados analíticos. En el otro extremo, puede ser más empírico: observar el comportamiento de sistemas particulares (o de humanos). Y hay mucha investigación de CS que es ingeniería: encontrar una manera de hacer algo mejor o con menos recursos. Intentar generalizar a través de estos estilos es difícil, pero aquí va:

  1. Obtenga los antecedentes apropiados en el área en la que planea trabajar. Este paso implicará tomar cursos apropiados, pero también lectura independiente.
  2. Descubra (y quizás practique) los principales métodos de investigación en su área. ¿Es el benchmarking de rendimiento? ¿Es estudios de usuarios? Un aspecto importante para comprender lo que es evidencia aceptable de “bondad” para la investigación en su área. ¿Corrección de las pruebas? ¿Mejora de rendimiento o habilidad de algoritmos? ¿Estudios de usuarios que muestran una mejor facilidad de uso?
  3. Identificar un problema de investigación. Este paso probablemente implicará una lectura más centrada. ¿En qué están trabajando otros investigadores en el área? ¿Qué tipo de progreso han hecho? ¿Dónde hay margen de mejora? En esta etapa, es fundamental contar con un asesor de investigación que tenga una imagen de lo que está sucediendo actualmente en su área. Asegúrese de comprender cuál sería el beneficio de resolver el problema que identifica.
  4. Intenta resolver el problema que identificaste. Probablemente este paso implicará modificar el problema a medida que aprenda más sobre él (o incluso volver al Paso 3 y elegir un problema diferente). Si está investigando para obtener un título, en algún momento se le pedirá que describa y motive su problema y sugiera un enfoque creíble para resolverlo. El mejor indicador de credibilidad de un enfoque son los resultados iniciales de su uso.
  5. Una vez que encuentre una solución (o una solución parcial), debe comunicar sus resultados para obtener crédito por producirlos. La comunicación ocurre principalmente a través de trabajos de investigación, pero también puede ocurrir a través de otros medios, como dar charlas o difundir software.

A2A. Has puesto el carro delante del caballo sin conductor.

Los profesores de las universidades de investigación tienen cursos de división superior, posgrado y seminarios que llevan a los estudiantes desde la introducción a los problemas abiertos, y cuando los estudiantes han completado especializaciones, hacen un estudio independiente con un asesor. Comienza a investigar cuando puede leer los resultados de la investigación en artículos o revistas. Por ejemplo de especialización, ver Stanford Computer Science.

Cuando tiene resultados de investigación, los documenta en documentos de trabajo que envía a revistas revisadas por pares. Son los resultados los que determinan la fama. La fama es realmente un efecto secundario que puede suceder o no.

Necesitaría mirar su programa de ingeniería para ver cómo está estructurado para ver si tiene seminarios como Seminars · Stanford HCI Group. Puede ver estas charlas en Stanford HCI – YouTube, y los conferencistas del Seminario PCD enumeran alfabéticamente a los posibles asesores en HCI a los que se dirigiría cuando se postule a la escuela de posgrado.

La “informática” es un campo muy, muy amplio. Por un lado, está cerca de las matemáticas. Pruebas teoremas sobre las computadoras. Por otro lado, es más como ingeniería.

Comienza con dos divisiones amplias: pura y aplicada (como física o química). El lado puro se parece más a las matemáticas: teoría de codificación, algoritmos, teoría del lenguaje, teoría de autómatas, etc.

El lado aplicado sigue siendo investigativo, pero con énfasis en las computadoras reales en lugar de las abstractas. La investigación gráfica es la razón por la cual Toy Story 3 se ve mejor que Toy Story 1. La ingeniería de software es la investigación sobre cómo funcionan los programadores y cómo se puede hacer mejor.

La mayoría de los informáticos abarcan ambos lados, hasta cierto punto. La criptografía es altamente matemática, pero requiere implementaciones reales (utilizando avances de métodos numéricos, tanto puros como aplicados). La inteligencia artificial es altamente teórica, pero el trabajo a veces sale del laboratorio (incluso en el nuevo Kinect, que hace un trabajo bastante notable en el área increíblemente difícil de la visión por computadora).

Los programadores informáticos a menudo, pero no siempre, se especializan en informática. Hay una especie de ajuste desigual allí, ya que gran parte de la programación es un oficio en lugar de una ciencia, algo que podría aprenderse mejor como un campo separado pero relacionado, como lo es la ingeniería para la física. De hecho, existe “ingeniería informática”, pero ese nombre se refiere al trabajo de hardware. Se acerca a la “tecnología de la información”, un campo que está desarrollando gradualmente una identidad distinta (aunque en este momento está más estrechamente vinculada al mantenimiento de la computadora).

Si te unes a un grupo establecido, generalmente es bastante fácil hacer cualquier tipo de investigación, especialmente la investigación en aprendizaje automático a gran escala. Esta es un área relativamente nueva, por lo que hay muchas frutas bajas esperando a ser publicadas en comparación con las áreas más establecidas. Además, el “aprendizaje automático a gran escala” tiende a implementar algoritmos muy simples debido a la escala del problema. Además, es muy probable que pueda simplemente usar la infraestructura existente creada por uno de los estudiantes de posgrado mayores y simplemente hacer pequeños ajustes para realizar sus propios experimentos.

En general, hay un período de “tutoría” de 1 a 3 años en el que trabajará con un estudiante de posgrado superior. Este estudiante graduado le dirá exactamente qué aprender y qué implementar, por lo que no tiene sentido preocuparse por eso ahora. La gente de Quora tampoco podrá darte consejos sobre esto, ya que no conocemos el proyecto preciso en el que estás trabajando. Obviamente, es posible que deba tomar algunas clases de nivel de posgrado para obtener la formación que necesita. La persona correcta para preguntar sobre esto es su asesor y su mentor, no Quora.

La mayoría de los programas de maestría se basan en el plan de estudios, en lugar de la investigación. Pasará la mayor parte de su tiempo tomando clases. Si desea investigar, debe solicitar el programa de doctorado. Para prepararse para esto, sugeriría leer revistas en el área que le interesa, busque un investigador permanente cuyo trabajo le resulte interesante e intente comprender su enfoque de estudio y luego desarrolle una pregunta de investigación en esa área. Use eso como base para comenzar una conversación con ese profesor. La base para abordar este tipo de problema debe provenir de un interés genuino, no solo del deseo de obtener un título de una universidad prestigiosa. Recibimos correos electrónicos de personas todo el tiempo que solo quieren trabajar con nosotros porque estamos en una universidad prestigiosa y generalmente los desechamos. La gente ofrece venir a trabajar para mí de forma gratuita, pero a menos que puedan demostrar un interés genuino en mi trabajo y demuestren que pueden contribuir a mi trabajo, los ignoro.

Empieza resolviendo problemas de ejercicio en la parte posterior de su libro de texto y sigue resolviendo cada vez más hasta que se da cuenta de que ha resuelto un problema en ese lote que nadie resolvió antes.

Piensas en cosas relacionadas con la informática. Eventualmente, plantea una pregunta en la que la respuesta no está clara o está rodeada de especulaciones. Entonces intentas probar dicha pregunta. Además, no importa cuál sea el resultado que diga que su hipótesis falla, aún es válida la investigación aporta claridad a su pregunta.

Si quieres investigar, busca un doctorado.
También puede hacer cosas como la investigación en el nivel de B.Tech si realiza una pasantía con un profesor de un IIT o universidad equivalente.

Al trabajar duro y leer muchos libros en primer lugar, debe saber qué es la computadora y cómo funciona, de lo que debería comenzar una investigación

A2A.

Consigue un gran mentor.

A menudo es para hacer una gran investigación que necesita un gran mentor. Él / Ella puede ser cualquier persona que sea investigador.