¿Por qué se enseña a CS a ser memorizado? [cerrado]

23

He estado tomando Ciencias de Computación de Colocación Avanzada durante el año pasado en la escuela secundaria. Parece que se nos enseña simplemente a memorizar código y funciones y no a ser ingeniosos y eficientes en el uso de documentación y similares.

Prácticamente, imagino que muchos (si no todos) los trabajos de programación le permitirían hojear la documentación, revisar el código pasado y el código de otros, esencialmente haciendo lo que mi maestro consideraría "hacer trampa".

Si bien estoy de acuerdo en que los conceptos básicos son esenciales para memorizar (en cualquier tema), me parece superfluo y poco práctico dar un examen escrito para una clase de CS, especialmente cuando prácticamente tendría un compilador, depurador, referencia manuales y todo internet para consultar en cualquier situación laboral del mundo real.

¿Por qué se enseña CS centrándose en la memorización de código y funciones en lugar de enseñar habilidades útiles que incluyen cómo usar e interpretar documentación, código de muestra, el depurador y demás?

esqew
fuente
34
CS no se trata de memorizar código y funciones. ¿Dónde diablos estás estudiando CS? ¿Puedo sugerir que el verdadero problema es que el curso que estás tomando es una mierda?
Andres F.
1
@AndresF. OP está en Ciencias de la Computación de Colocación Avanzada, que es un curso ofrecido a estudiantes de secundaria (antes de la universidad).
3
@GlennNelson ¡Vaya! Leí mal eso. Ok, en ese caso: esqew : se sentirá aliviado de saber que, a nivel universitario, CS no se trata (principalmente) de memorización de código. Sin embargo, tendrás que leer muchas cosas;) Una educación en CS tampoco se trata necesariamente de encontrar un trabajo (probablemente te decepcionará si crees que lo es)
Andres F.
1
Debes saber que no es así en la mayoría de las universidades. En mi escuela, cada prueba de informática ha sido notas abiertas / libro abierto.
Casey Patton
2
Tenga en cuenta que parte de la respuesta más probable es que CS no es un título de programación . No esperes aprender programación de una clase de CS. Espere aprender todo tipo de teorías y conceptos subyacentes que resultan ser relevantes para un programador. Y claro, aprenderá algunos lenguajes de programación y se le enseñará un poco de programación básica, pero principalmente, la programación real es algo que suponen que obtendrá para que pueda concentrarse en todas las cosas de CS , y no al revés alrededor.
jalf

Respuestas:

37

En una clase de secundaria, estás en el nivel más básico de tu camino hacia el dominio. Las cosas que están cubiertas en su clase son el tipo de cosas que se espera que un programador profesional sepa frío. En muchos sentidos, esto es similar a aprender sus "tablas de tiempos". Por supuesto, siempre podrá tomar una calculadora en un entorno del "mundo real", pero esta memorización no solo aumenta su velocidad en tareas más complejas, sino que también promueve una comprensión más profunda de los principios básicos.

Por ejemplo, debe conocer varios algoritmos de clasificación, cómo se implementan, cómo funcionan, cuándo se usan mejor y cuándo no usarlos. Esto siempre se puede buscar, pero no debería ser así, más de lo que un matemático debería tener que buscar 6 veces 8.

Jeffrey
fuente
99
Debes conocer la naturaleza básica de los algoritmos de clasificación, pero han pasado unos 15 años desde que tuve la oportunidad de escribir algo más que una clasificación de burbujas. (Para N muy pequeña, a veces es la mejor respuesta)
Loren Pechtel
1
Me gustaría poder decir que todas las clases de informática son tan buenas. En mi escuela secundaria enseñaron la sintaxis básica de Java ... durante todo el año. Muchos de los de la clase se jactaban de ser "programadores" cuando ni siquiera podían explicar la diferencia entre Bubble sort y el algoritmo de Dijkstra.
Daniel Gratzer
2
Como ejemplo, dado que puedes buscar cualquier palabra en un diccionario, teóricamente deberías poder entender este artículo sobre meanone . Pero nuestros cerebros solo manejan un número limitado de incomprensiones anidadas.
Benjol
1
Y la sorpresa de memorizar mis tablas de tiempos no me ha sido de ninguna utilidad. ¿Cuánto tiempo pasa el ingeniero de software promedio implementando algoritmos de clasificación? Oh, espera, probablemente alrededor de 0 . Incluso en la remota posibilidad de que el tipo proporcionado por el entorno no sea lo suficientemente bueno para usted, solo necesita un tipo para escribir un algoritmo más apropiado, y él puede usar la información trivialmente disponible en algo como Wikipedia para seleccionar e implementar el algoritmo óptimo, y luego puede reutilizarlo por el resto del tiempo.
DeadMG
2
@kaoD: Y memorizar la referencia no ayudará con ese poquito. No implica idear nada, es solo una copia pegar. La única diferencia entre responder desde la memoria y copiar y pegar desde Wikipedia es que uno está almacenado en la RAM y el otro está almacenado en su cerebro. Todavía es una copia y pega.
DeadMG
14

A menudo se enseña de esta manera porque los maestros generalmente no conocen otra forma de evaluar la comprensión. Tus sentimientos son completamente correctos en el sentido de que no vale la pena que te enseñen así. ¡La forma en que las personas están educadas en general necesita una reforma desesperada!

Sin embargo, la vida mejora, al menos en UIUC he descubierto que cuanto más alto vayas en tus clases de CS, menos se orientarán los exámenes como lo estás describiendo y en la mayoría de mis cursos se nos ha permitido una hoja de trucos para toda la basura. que probablemente hubieras buscado en Google si estuvieras sentado frente a una computadora.

Dicho esto, cuanto más alto he ido en mis clases, menos te enseñan sobre idiomas o cómo implementar algo. De hecho, solo he tenido una clase en la que realmente nos han enseñado algo sobre programación, en su mayoría han sido conceptos matemáticos abstractos y se esperaba que resolviéramos la parte de programación por nuestra cuenta (siempre que siempre estuvieran felices de ayudar, pero esto fue nunca algo en un examen).

rudolph9
fuente
2
+1 Amén. Solía ​​enseñar programación a nivel universitario, y mi objetivo era mover a los estudiantes lo más rápido posible hasta el punto en que pudieran hacer sus propios proyectos únicos. Odio cuando los maestros lo tratan como memorizar o hacer las cosas "de la manera correcta". Lo que intenté hacer fue poner suficientes habilidades en el lugar para desatar la creatividad de los estudiantes.
Mike Dunlavey
... tuve estudiantes que eran muy inteligentes y muy buenos para memorizar. Les tomaría una o dos pruebas antes de que pudiera transmitirles que necesitan escribir programas para aprender programación, no memorizar cosas.
Mike Dunlavey
¡Escucha Escucha! Es curioso, de pequeño nunca fui bueno en la escuela; mala puntuación de ACT, malas calificaciones, etc. Pero al ser introducido en CS, todo tenía sentido. Definitivamente lucho en ciertas áreas, pero solo he aprendido a superar las cosas que me han impedido entender los conceptos que he aprendido en mis clases de CS.
rudolph9
10

No permita que la escolarización interfiera con su educación.

-- Mark Twain

Soy mexicano y te digo esto porque en México no es exactamente un buen lugar para la educación (en ningún nivel), al menos en la educación pública.

Bueno, a la mitad de mi carrera (CS) me siento exactamente igual que tú, así que comienzo a aprender por mi cuenta y paso un año aprendiendo algoritmos, Linux, scripting, cómo funciona mi computadora, un poco de relación bases de datos, html, css, etc. (un poco sobre todo). Y, por supuesto, tuve que omitir las clases *, bajar mis calificaciones * y graduarme un año después *, todo para poder aprender.

Después de ese año, vuelvo a mi rutina "normal", de regreso a clases regulares, tareas, exámenes y proyectos. Las clases seguían siendo aburridas, nada nuevo que aprender, todo era igual. Así que decidí ingresar a sitios de concursos de programación como juez de UVA en línea , chef de código y proyecto euler , luego vi algunas conferencias en el MIT Open Course Ware y todavía estaba aprendiendo por mi cuenta, pero de una manera diferente.

La lección: no dejes que las cosas sucedan, haz que sucedan. Si no estás contento con la forma en que estás aprendiendo, ¡cámbialo!

* No son las decisiones más sabias que he tomado.

razpeitia
fuente
44
"No dejes que las cosas sucedan, haz que las cosas sucedan", si alguna vez hubo palabras para vivir, ¡son esas!
GrandmasterB
+1 para la cotización. <Casi> no tuve que leer el resto de la respuesta
Chani
3

Depende de lo que intentes memorizar ...

Para estudiar matemáticas, por ejemplo, tienes que estar familiarizado con el álgebra y con frecuencia debes ser bastante creativo en la forma en que realizas las manipulaciones algebraicas para simplificar las ecuaciones. Pero tienes que haber memorizado ciertos bloques de construcción para poder concentrarte en esas partes interesantes. Debe, por ejemplo, conocer las tablas de multiplicar de memoria y conocer algunas identidades para poder reconocer cómo manipular las ecuaciones para usar esas identidades.

Para estudiar ciencias de la computación, también debe estar familiarizado con las estructuras y los algoritmos de datos básicos de los bloques de construcción porque necesitará aplicarlos a problemas de nivel superior. Es muy poco probable que alguna vez, por ejemplo, escriba su propia implementación de lista enlazada en el mundo real, simplemente use la que proporciona su biblioteca. Pero sabiendo cómo se implementa una lista vinculada y cómo implementar la suya, podría razonar sobre dónde y si usar una lista vinculada cuando comience a trabajar en problemas de nivel superior. Del mismo modo, nunca escribiría su propia función de búsqueda binaria, pero es importante comprender cómo funciona para poder razonar sobre cosas como dónde una base de datos podría usar un índice y dónde no.

Una vez que haya memorizado algunos bloques de construcción básicos, es mucho más fácil hacer cosas como interpretar la documentación. La documentación podría indicar que se está utilizando una lista y asumir que el programador sabe implícitamente que esto significa que las inserciones son O (1) y las búsquedas son O (n). Los bloques de construcción también son mucho más estables con el tiempo: es muy probable que use nuevos depuradores cada pocos años, es probable que use la misma búsqueda binaria en toda su carrera.

Justin Cave
fuente
Dónde y si usar una lista vinculada se basa en cosas como su complejidad para varias operaciones y su rendimiento de memoria. No necesita implementar uno para conocer ninguna de esas cosas. ¿Dónde puede una base de datos usar una búsqueda binaria? Para llaves que sabe comparar. Bueno, eso fue fácil.
DeadMG
3

"¿Por qué se enseña CS centrándose en la memorización ... en lugar de enseñar habilidades útiles"? Creo que estás descartando demasiado la memorización. Así como debería practicar escribir código, interpretar documentación, usar el depurador, también debería practicar la memorización.

Es posible que se sorprenda de lo mucho más eficiente que puede llegar a ser si no tiene que ir a la referencia de API con tanta frecuencia o buscar tantos comandos de depurador.

Una de las mejores cosas que aprendí en la escuela secundaria fue observar a un amigo que nunca tomó notas en clase. Su argumento fue que podía recordar lo importante. Comencé a hacer lo mismo y creo que mejoró mis habilidades de memorización, lo que encuentro muy útil a diario, incluso con todas esas referencias de API disponibles.

DXM
fuente
2
No tener que buscar la API viene a través de la práctica, no enseñar la API como educación formal.
DeadMG
@DeadMG: ser capaz de recordar más cosas viene con la práctica, como todo lo demás. Requerirle que recuerde ciertas API no es un objetivo en sí mismo, sino un medio de entrenar su cabeza para retener información para que no tenga que buscarla con tanta frecuencia. Y no estoy hablando solo de API, si puedo recordar una cosa extra, ese es un viaje menos que necesito hacer a Google / MSDN / otro archivo fuente y con la práctica esto hace una diferencia en la rapidez con la que puede trabajar .
DXM
Practica con esa API específica . No memorizar cosas en general. Y el tiempo dedicado a la educación es una pequeña nota al pie en comparación con el tiempo profesional.
DeadMG
2

Los exámenes en papel y lápiz realmente tienen sentido si el objetivo es evaluar una comprensión completa del tema en cuestión. Hice el examen de Computer Science AB hace casi una década y estoy de acuerdo con el método de lápiz y papel.

Debe saber lo suficiente de cualquier algoritmo que aprenda en los niveles inferiores de Ciencias de la Computación para poder razonar cómo escribir el código de implementación en su idioma de destino. Los estudiantes también deberían poder escribir código a mano con la sintaxis más correcta. Todos echamos de menos un punto y coma o paréntesis a veces :). También se pueden probar las habilidades de depuración y diseño sin la inferencia de un IDE útil.

Si un estudiante no puede hacer esto, entonces no posee el dominio de ese tema, solo tal vez una familiaridad pasajera.

Peter Smith
fuente
-1: Toda la escritura manual de código sintácticamente correcto le indica que la persona es capaz de escribir un programa compilable (probablemente un millón de veces más lento que la computadora más lenta), que puede no funcionar como se esperaba. Peor aún, solo tienen buena memoria y probablemente puedan recitar Shakespare si se les pregunta. No sirve para indicar la habilidad de la persona como desarrollador.
mattnz
Esta respuesta no presenta ningún razonamiento para la opinión presentada. ¿Por qué alguien debería poder escribir una implementación para cualquier algoritmo de clasificación en su idioma favorito?
DeadMG
El punto no es que esta persona sea un buen desarrollador, es que conocen el material de Ciencias de la Computación enseñado en su clase. Si a un alumno se le ha enseñado cómo graficar una función, entonces es razonable esperar que ese alumno lo haga en un examen. Las buenas pruebas también superan la memorización al hacer preguntas que requieren una comprensión conceptual, como implementar la clasificación de burbujas utilizando múltiples claves para esta estructura de datos que acabo de sacar de la nada, o explicar la diferencia entre este psuedocódigo de búsqueda que le doy y la búsqueda binaria.
Peter Smith
-2

En mi experiencia, la memorización viene con una práctica simple y no hay absolutamente ninguna necesidad de enseñarla. Más importante aún, este enfoque significa solo memorizar lo que realmente necesitas recordar en lo que sea que estés haciendo, no un montón de basura aleatoria que tu maestro espera que puedas necesitar e invariablemente no lo harás. El tiempo dedicado a memorizar la implementación de algún algoritmo podría dedicarse mucho mejor a alguna otra causa.

Después de todo, ¿por qué necesitarías practicar escribir un algoritmo? Una vez que lo escriba una vez, puede volver a usarlo todo el tiempo, incluso en la remota posibilidad de que alguien más no haya escrito una implementación disponible libremente para el idioma de su elección y que su entorno no proporcione un algoritmo para su uso, que trivialmente no es cierto para la gran mayoría de algoritmos simples como la clasificación y demás. ¿Practicar algo donde es muy poco probable que alguna vez tengas que hacerlo en primer lugar e incluso si lo haces solo tendrás que hacerlo una vez? No es un uso valioso del tiempo.

Lo importante que debe saber sobre Heapsort no es cómo implementarlo en absoluto. Es la complejidad operativa en el mejor y el peor de los casos, y cosas similares. Pero, sorpresa, hay una tabla práctica en Wikipedia que le brindará esta información al instante. De nuevo, no tiene ningún valor tener ese conocimiento. Está disponible instantáneamente para usted cuando lo desee desde ahora hasta el final de los tiempos sin costo alguno. Entonces, ¿por qué querrías memorizarlo? Carece de sentido.

En mi experiencia, no hay absolutamente ninguna razón para requerir que un estudiante memorice algo. Si está haciendo una pregunta que puede ser respondida desde una fuente de referencia, entonces está haciendo una pregunta en la que poder responderla no tiene valor.

DeadMG
fuente
2
Vaya, muchachos, no se molesten en explicar sus
votos negativos
El único momento en que necesitaba saber el montón era cuando necesitaba una cola de prioridad modificable (el montón funciona muy bien como cola de prioridad). Ser capaz de adaptar algoritmos conocidos es una buena razón para saber cómo implementarlos.
David Thornley
@David: No necesita saber cómo funciona el montón. Una implementación usando cualquier algoritmo de clasificación estaría bien.
DeadMG
No en ese caso particular, no lo haría. Tenía que manejar muchos eventos, con frecuencia, en un sistema que ya podría estar sobrecargado. Para ese proyecto, necesitábamos eficiencia, y lo conseguimos. Por contexto, eso sucedió una vez en una carrera bastante larga, y toda mi selección durante mucho tiempo ha sido cosas como la familia de SQL ORDER BYy C ++ std::sort.
David Thornley
@David: Por lo tanto, sugeriría que no es algo que todo programador necesita.
DeadMG