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.
- ¿Quiénes son los mejores académicos y practicantes del aprendizaje automático?
- ¿Cuál es la diferencia entre la complejidad del tiempo promedio y la complejidad del tiempo esperado?
- ¿Cuál es el panorama actual del lenguaje de programación?
- ¿Cuál es la intuición detrás de la computación de modelado?
- ¿Hay ex concursantes de competencias similares a ICPC que ahora son investigadores famosos en informática?
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.