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?
Respuestas:
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.
fuente
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).
fuente
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.
fuente
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.
fuente
"¿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.
fuente
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.
fuente
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.
fuente
ORDER BY
y C ++std::sort
.