Criterios para seleccionar el idioma para el primer curso de programación


35

Como educador de CS de nivel universitario, la cuestión de qué lenguaje de programación enseñar en el primer curso de programación a menudo se debate. Hay miles de idiomas para elegir, y mucha fiebre religiosa (o fevour) que apoya un campamento de idiomas sobre otro. Todo este sesgo subjetivo que rodea a cada lenguaje de programación hace que sea muy difícil para un educador elegir uno.

Mi pregunta es:

¿Qué criterios objetivos puede usar un educador para seleccionar un lenguaje de programación para usarlo como base para un curso de programación universitaria de primer año? ¿Cuál es la base de estos criterios?

Nota : No quiero ver una lista de lenguajes de programación y por qué son los mejores para usar. La pregunta no es sobre el mejor idioma, sino sobre los criterios para seleccionar un idioma . Sin embargo, las respuestas pueden ser utilizar lenguajes de programación para ilustrar puntos particulares.


Esta pregunta se inspiró en otra pregunta que se consideró fuera de tema: https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language .


1
Meta hilo abierto sobre si esta pregunta está dentro o fuera del tema: meta.cs.stackexchange.com/questions/362/…
Dave Clarke

77
<Agarra palomitas de maíz> Parafraseando a Otto Neugebauer : Ningún primer lenguaje de programación conocido por el hombre es capaz de arruinar a todos.
JeffE

3
@Raphael: Creo que la respuesta de Dijkstra probablemente sería " Cada primer lenguaje de programación conocido por el hombre es capaz de arruinar a todos".
JeffE

2
@ edA-qamort-ora-y, sí, deberían estar expuestos a varios paradigmas de programación. No, eso no se puede hacer en el primer curso.
vonbrand

3
Teníamos SMLsimplemente porque es poco probable que algún estudiante conozca ese idioma de antemano. Esto equilibró a cada estudiante más o menos al mismo nivel para comenzar el curso.
Markus Malkusch

Respuestas:


14

Echaré mis dos centavos, aunque creo que este tema es un pozo sin fondo. No me malinterpreten, creo que es una pregunta fascinante, pero probablemente no la resolveremos aquí para satisfacción de todos.

En pocas palabras, diría que el idioma debe hacer lo que quieres que haga , de la manera más simple e inequívoca posible, y no más .

Mi propia experiencia proviene de dar clases particulares a varias generaciones de estudiantes de primer y segundo año con el lenguaje de programación Oberon . Las personas que conocen este idioma reconocerán su influencia en mis opiniones. Tenga en cuenta que este lenguaje se utilizó para enseñar "Algoritmos y estructuras de datos". En ese momento (en aquel entonces), la programación funcional y el diseño orientado a objetos se enseñaban en cursos separados a partir del segundo año.

Importante : sin embargo, antes de entrar en los detalles de cualquier idioma, me gustaría enfatizar que lo más importante es ser absolutamente claro, para usted y sus alumnos, sobre cuáles son los objetivos de su curso. ¿Estás enseñando programación per se ? ¿O algoritmos y estructuras de datos? ¿O ingeniería de software? Antes de elegir un idioma, vale la pena pensar un momento sobre a dónde vas con él. Las diferencias en este nivel (objetivos) es lo que probablemente, en mi opinión, lleva a la mayoría de los desacuerdos sobre este tema.

Los puntos que considero importantes pueden superponerse con varias cosas que ya se han dicho, pero creo que la mayoría terminan siendo subconjuntos de uno de los siguientes cuatro:

  • Sencillez : los estudiantes generalmente están allí para aprender programación, algoritmos y estructuras de datos, y no las características y complejidades de ningún lenguaje de programación específico. Wirth usó la cita de Einstein "Hazlo lo más simple posible, pero no más simple" como principio rector en el diseño de Oberon, y hay varios otros idiomas que lo hacen igual de bien. El lenguaje de programación que elija debería poder implementar todos los conceptos requeridos en su conferencia, pero debería hacerlo con el conjunto más pequeño posible de características / detalles. El lenguaje de programación suele ser solo la herramienta, no el objetivo.

  • No ambigüedad : un hermano cercano de la simplicidad, debe haber una construcción para cada concepto, con la menor superposición posible. Piénselo como si hubiera una sola forma "correcta" de implementar cada concepto. ¿Tres tipos diferentes de bucles que semánticamente todos hacen lo mismo? ¿O quince formas diferentes de incrementar una variable? No está bien. Esto también hace que corregir la tarea o, en general, simplemente comprenda el código de sus estudiantes mucho más fácil. Sus asistentes de enseñanza lo apreciarán.

  • Portabilidad : los estudiantes irán a clase con máquinas Linux, Windows y OSX, y el entorno de programación debe ser lo más similar (idéntico) posible en los tres. Los resultados de cualquier programa también deben ser idénticos. Este es otro punto que los asistentes de enseñanza, responsables de marcar la tarea y abordar las preguntas / problemas, apreciarán mucho.

  • Preferencia de la industria : En serio, deberíamos comenzar a preocuparnos por esto solo si la "Industria" misma decide qué lenguaje de programación le gusta más. Desde la invención de las computadoras, este ha sido un objetivo en constante movimiento. Por el momento, si sus alumnos realmente aprenden a programar, no dependerá del idioma. Sin embargo, hay algunas áreas donde la industria logra acordar un estándar, por ejemplo, VHDL para diseño de circuitos o SQL para consultas de bases de datos, por lo que este sigue siendo un punto válido.

Una vez más, ¡cómo un idioma se ajusta a esta lista depende en gran medida de lo que estás tratando de enseñar!


44
En realidad, hay una división en el diseño del circuito entre VHDL y Verilog.
avakar

@avakar: Aw, mierda. Arreglaré esto en mi respuesta, ¡gracias por señalarlo!
Pedro

Ay, lee esto y pensé que era uno de mis profesores. +1 para Oberon, siempre que el cambio de palabras clave en minúsculas esté habilitado automáticamente; tan doloroso de escribir, WHILE expr DO stmts ENDetc.
Callum Rogers

3
+1 para "¿cuáles son los objetivos de tu curso?" y una nota adicional, uno de los objetivos más comunes, incluso si no está escrito, es dar lo básico para otras cosas (cursos y pasantías) que tienen la programación como requisito previo.
Programador

Un punto importante (al menos hoy) es que permite a los estudiantes crear programas visualmente atractivos pronto y sin dolor. Están expuestos a tantas aplicaciones y juegos intensivos en gráficos que naturalmente piensan que así es como se supone que las computadoras interactúan con las personas.
vonbrand

13
  • Desarrollar el pensamiento algorítmico para resolver problemas como el objetivo principal: Una cosa mala acerca del uso de un paradigma orientado a objetos en el primer curso es que lograr que los nuevos estudiantes se involucren en cosas como la herencia, el polimorfismo, etc., los distrae del objetivo principal mencionado anteriormente. De hecho, la introducción de cualquier consideración secundaria además de este objetivo central, como la ingeniería de software, la portabilidad, la utilidad de la industria, etc., son contraproducentes, por la razón indicada.

  • No es un lenguaje orientado a objetos: hoy en día, la mayoría de las universidades comienzan a enseñar programación correctamente con un lenguaje orientado a objetos. Creo que esto es un error. Hay cosas en el mundo que pueden entenderse realmente solo en contraste con su opuesto. Sin estar expuestos a un paradigma procesal de programación (datos y funciones como dos aspectos separados del programa), muchos pueden pasar por alto la idea básica de orientación a objetos (datos y comportamiento vistos como intrínsecamente unidos). Y debido a que la programación orientada a objetos es tan importante, perder su idea básica no es poca cosa. Además, dado que lo más probable es que en los cursos más avanzados los estudiantes de CS programen principalmente en OO, también necesitan estar expuestos al lado procesal de las cosas.

Entonces, al final, optaría por un lenguaje de procedimiento, evitando funciones avanzadas, centrándome en el desarrollo del pensamiento algorítmico. Pero, al evitar funciones avanzadas, no me refiero a evitar problemas desafiantes. Quiero decir, que incluso los problemas desafiantes, se debe exigir a los estudiantes que lo resuelvan utilizando los primeros principios, herramientas simples.


Puede comenzar fácilmente con un subconjunto de, digamos, Java primero para mostrar el estilo de procedimiento. Luego abres la caja de Pandora y muestras cómo se ven las mismas cosas con OOP.
Raphael

3
@Raphael: es imposible de evitar public static void main()en Java, que tiene que estar dentro del contexto de alguna clase. Esto hace que Java sea menos que ideal como primer idioma, aunque, por supuesto, el obstáculo no es demasiado grande.
Dave Clarke

Un buen IDE puede diferir public static void main()por mucho tiempo. BlueJ es un buen ejemplo de un IDE que permite a los estudiantes escribir programas sin mainninguno en ningún lugar.
Barry Brown,

2
El problema con OOP es que, para la gama de problemas de juguetes cubiertos en el primer año de programación, simplemente se interpone, sin ninguna ventaja clara. OOP se vuelve importante (y se agradece) cuando sus programas son más o menos mil líneas. "Java sin OOP" es horrible, muchas cosas completamente opacas que "tienen que ser escritas de esta manera" van en contra de las personas que aprenden , no los loros.
vonbrand

11

Como estamos hablando del primer curso de programación en un programa de Ciencias de la Computación, diría que el aspecto más importante sería qué conceptos fundamentales de CS enseñará a sus estudiantes. Como no existe un lenguaje que pueda enseñar todos los conceptos a la vez, debe considerar qué conceptos se necesitarán más adelante.

No estoy de acuerdo con la noción de @ Kaveh de que la relevancia de la industria es importante; Puede ser una ventaja, pero es de menor importancia aquí. Con una base sólida en los principios de CS, aprender un lenguaje "industrial" en cursos posteriores será relativamente fácil.

Como nota al margen, independientemente del idioma elegido para ser el primero, es importante someter a sus alumnos a otro idioma radicalmente diferente lo antes posible.


1
La relevancia de la industria puede considerarse secundaria, pero no creo que sea un problema menor. Como este es un curso de introducción a la programación, no veo por qué uno quisiera enseñar todos los conceptos, a menudo hay un segundo curso de programación y otro curso sobre el tema del lenguaje de programación donde se discuten varios lenguajes, y muchos otros cursos concentrado en áreas específicas de aplicación, por ejemplo, la programación para la web, etc.
Kaveh

@Kaveh: Eso me parece el plan de estudios de una universidad técnica.
Rafael

66
"Es importante someter a sus alumnos a otro idioma radicalmente diferente lo antes posible". -- absolutamente correcto. Establecemos a los más novedosos que piensan que pueden programar directamente al introducir primero la programación funcional: casi todos son nuevos en este paradigma, y ​​cuanto más C (++) haya estado expuesto, más difícil parece ser.
Raphael

3
@Kaveh: Los idiomas diseñados para hacer las cosas en el mundo real no son necesariamente óptimos para enseñar conceptos o desarrollar habilidades. Los objetivos son muy diferentes.
JeffE

1
@Kaveh: Nunca escribí que el conocimiento de los idiomas utilizados en la industria no sea importante. Lo que quiero decir es que dado un primer lenguaje de programación sólido, los cursos posteriores no tendrán problemas para enseñar a los estudiantes algo sobre lo que realmente harán cuando se gradúen. Habiendo sido parte de la enseñanza de varios cursos introductorios yo mismo (como un TA), diría que las habilidades que aprende no se parecen en nada a las necesarias en la industria (hay muy poco tiempo para eso). Si este es el caso, me parece mejor darles conceptos sólidos para que puedan convertirse en mejores programadores, no solo programadores de $ LANGUAGE.
evilcandybag

8

Mi principal preocupación es la universalidad , en el sentido de que aprender este lenguaje de programación debería hacer que el estudiante sea capaz de manejar la mayoría de los lenguajes de programación.

Por mucho que me arrepienta, este criterio excluye los lenguajes funcionales puros. También se aplica al curso que no debe usar características exóticas del idioma.

... pero esto es solo sentido común.


1
Con mónadas como en Haskell, es discutible que este criterio ya no sea aplicable a los lenguajes funcionales puros.
Dave Clarke

@DaveClarke: las mónadas son una forma muy agradable de hacer cosas no funcionales. Pero, ¿no es demasiado arriesgado aprender primero estas cosas con la mónada por encima en lugar de hacerlo directamente? (¡Tal vez no lo sea, no lo sé!)
jmad

2
@ jdam: Probablemente tengas razón. El problema no está en las mónadas, per se, sino en la generalidad y la dificultad de presentar buenos mensajes de error al programador. La variante Haskell Helium aborda estos problemas y se ha utilizado con éxito con estudiantes de primer año.
Dave Clarke

@DaveClarke: wow, no he oído hablar de eso. ¡Eso es genial! Desafortunadamente, si bien eso es muy útil para aprender Haskell, eso no resuelve el problema de que puede no ayudar a aprender otros idiomas.
jmad

44
@Ben: creo que la gestión manual de la memoria es algo que hoy en día es específico de algunos lenguajes (y que aprendes en estos casos específicos) más que una cosa fundamental de la programación. Si no está de acuerdo con eso, supongo que apunta a C (o C ++).
jmad

8

Al elegir un primer lenguaje de programación, hay muchos problemas que deben considerarse. Muchos de estos han sido considerados en las respuestas anteriores. Incluyo 3 más ya que fueron parte de mi respuesta a la pregunta cerrada ( https://cs.stackexchange.com/questions/1946/criteria-for-choosing-a-first-programming-language ) que originalmente inspiró esta pregunta . Copié mi respuesta aquí (y la modifiqué) según la política actual de eliminar preguntas cerradas.

Aquí hay 3 puntos a considerar, usando algunos lenguajes de programación como ejemplos.

Programación en grande vs programación en pequeño

Cuando se aprende a programar por primera vez, es necesario aprender a programar en pequeño , antes de pasar a aprender mecanismos para ayudar a programar en grande .

Al programar en pequeño, me refiero a escribir programas con menos de 100 líneas. Estos programas incluirán algoritmos que manipulan estructuras de datos simples, tienen un flujo de control simple y resolverán problemas simples. En general, no se considerarán como aplicaciones .

Al programar en grande, me refiero a escribir grandes programas creados a partir de muchos componentes / clases, construidos sobre una API, con una GUI, una base de datos, posiblemente en una configuración cliente-servidor.

Las cosas en las que un programador necesita pensar cuando programa en pequeño son muy diferentes de cuando programa en grande. La programación en general requiere que el programador piense en la modularidad, las buenas interfaces, el buen diseño, la reutilización y muchos otros problemas. Los lenguajes de programación modernos proporcionan muchas construcciones para ayudar a programar en general. Estas construcciones incluyen clases, módulos, interfaces, ocultación de información, etc. Cuando se programa en pequeño, estos problemas son mucho menos importantes.

Un lenguaje de programación como C ++ tiene muchas características para ayudar a programar en general, pero es más difícil sentarse y comenzar a escribir un programa muy simple. Java es similar

Por otro lado, un lenguaje como Python, Ruby, Scheme o Haskell hace que sea mucho más fácil escribir directamente un programa.

Alto nivel vs bajo nivel

Lenguajes como C ++ y C son más bien de bajo nivel. Permiten al programador manipular referencias en la memoria directamente. Aunque esto le permite a uno escribir código muy eficiente, los detalles de bajo nivel pueden ser difíciles para que un primer programador aprenda el idioma. Algunos dirían que estos detalles de bajo nivel se interponen en la forma de escribir la lógica para resolver el problema.

Un lenguaje de nivel superior como Python hace que sea más fácil expresar conceptos más directamente en términos del dominio del problema.

Mecanografiado estadísticamente vs mecanografiado dinámicamente

C ++, Haskell, Java y muchos más lenguajes están tipificados estáticamente. Esto significa que el compilador busca automáticamente lugares donde se producen errores potenciales en función de los tipos de valores esperados en cada ubicación del código. Hay una pequeña guerra religiosa sobre si la escritura estática es algo bueno o no, pero me mantendré alejado de eso. Un problema con la escritura estática para los nuevos programadores es que los mensajes de error informados por el compilador a menudo son difíciles de entender. Este es especialmente el caso con las plantillas C ++ y los programas Haskell en general.

Python, Ruby y Scheme se escriben dinámicamente. Esto significa que se detectan errores mientras se ejecuta el programa. Se puede argumentar que esto es demasiado tarde para detectar los errores (pero también se pueden usar pruebas para evitar tales errores). Nuevamente, evitando el argumento religioso, la ventaja del tipo de errores que uno encuentra al escribir programas simples en un lenguaje de programación de tipo dinámico son del tipo que este objeto no sabe cómo hacer esta operación . En el contexto de un pequeño programa, estos errores son fáciles de entender y rastrear.

Los lenguajes como C tienen una escritura débil, lo que significa que aunque el compilador ayuda con algunos errores, el tiempo de ejecución no logra atrapar otros que ocurren, como accesos de memoria no válidos. Como resultado, el mensaje de error devuelto al programador es similar a "Programa bloqueado". Un lenguaje de tipo dinámico atraparía estos errores y los convertiría en un mensaje de error más comprensible.

Otros

Para otros idiomas, pueden entrar en juego diferentes consideraciones, como el soporte proporcionado por el entorno de programación, las API disponibles, la calidad de los libros y los tutoriales en línea, etc.


De todo corazón de acuerdo.
vonbrand

1
También tengo mis propias preferencias sobre la contención "tipos estáticos vs dinámicos". Sin embargo, en un programa general de CS, siempre y cuando ambos se enseñen como un punto, creo que el orden no importa tanto. Sin embargo, si solo se presenta una cara de la moneda, ese es un gran problema para mí.
chi

8

Como comentario introductorio, considere la posibilidad de presentar más de un idioma (en un curso). En mi primer término, mostramos SML y Java. El contraste tenía un mensaje muy propio e importante: elija la herramienta adecuada para el trabajo.

Pero ahora por criterios, en orden arbitrario.

La dificultad para aprender es un problema subjetivo, pero importante: no quiere que su estudiante pierda tiempo aprendiendo el idioma, sino haciendo cosas con él. Podría decirse que los lenguajes dinámicos como Ruby pueden ganar en este frente: puede alimentarlos con cualquier cosa, y hay excelentes tutoriales "ficticios" en la web. Si no recuerdo mal, también hay estudios que muestran que los estudiantes que no han programado antes obtienen mejores resultados con lenguajes funcionales que con otros.

Riqueza : el idioma (s) debe ser lo suficientemente rico para todos los conceptos que desea enseñar. Por ejemplo, si desea analizar funciones de orden superior, necesita un lenguaje donde las funciones sean valores, como lenguajes funcionales o Scala.

Escalabilidad : es probable que sus estudiantes no aprendan más idiomas por sí solos que los que les muestra. Por lo tanto, desea que los idiomas elegidos se escalen en el curso de sus estudios: necesitan escribir los ejercicios de su mascota ahora, pero también pueden atacar un proyecto de tamaño mediano más adelante. Java y lenguajes con ecosfera similar son buenas opciones aquí.

Soporte de herramientas : esto está relacionado con la escalabilidad. Si espera / desea que sus estudiantes sean productivos con el idioma, entonces deben existir buenos IDE, administradores de compilación y bibliotecas. Las conchas interactivas (Ruby, Scala) también son buenas, especialmente para empezar. Las herramientas también tienen que funcionar en todas las plataformas principales.

Documentación : Probablemente no quiera enseñar el idioma, pero haga que los estudiantes se enseñen a sí mismos con su guía (abstracta). Por lo tanto, una buena documentación es importante. Discutible, cuanto más popular y establecido sea un idioma, mejor será la documentación. Por ejemplo, la documentación de Scala es bastante pobre (pero está mejorando). Herramientas como Hoogle son una ventaja.

Disponibilidad : En realidad, hay personas que enseñan utilizando Matlab o Visual C ++. Tenga en cuenta que no todos pueden tener una licencia o una máquina que pueda ejecutar los programas necesarios. Probablemente debería preferir los idiomas gratuitos que se ejecutan en una variedad de plataformas.

Limpieza : Probablemente quieras moldear la forma en que piensan tus alumnos. Cuanto más desordenado sea el lenguaje, más desordenado pensarán; Nunca propondría PHP en un curso. Los lenguajes dinámicos en general tienen desventajas aquí: permiten, a veces incluso promueven, malos hábitos.

Los criterios que son más importantes para usted que otros también dependen de lo que quiera enseñar. ¿Es esto literalmente un curso de programación? ¿Es un curso de algoritmos y estructuras de datos? ¿Es un curso que introduce conceptos de lenguajes de programación en diferentes paradigmas? ¿Es un curso sobre desarrollo de software en grande?


For example, if you want to discuss higher-order functions, you need a language where functions are values, such as functional languages or Scala. ... o C o Pascal, que han tenido punteros de función prácticamente para siempre. Prácticamente el único lenguaje (convencional) que este criterio realmente excluye es Java.
Mason Wheeler

Tratar de enseñarles a los novatos un sinfín de diferentes sintaxis y conceptos subyacentes es simplemente una confusión mental.
vonbrand

6

Pregunta fascinante; Me gusta su énfasis en criterios objetivos. Queremos que los estudiantes de primer año aprendan:

conceptos de programación : el primer lenguaje de programación debe admitir: llamadas de función, iteración, recursión

ideas fundamentales : el primer lenguaje de programación debe admitir matrices (para los primeros pasos en una introducción suave sobre cómo funciona realmente la memoria y cómo funcionan los punteros)

habilidades prácticas de programación : cómo usar el depurador, cómo usar el generador de perfiles, cómo resolver problemas grandes (un lenguaje de alto nivel), cómo armar sistemas grandes, cómo desglosar problemas (descomposición de problemas), cómo evitar escribir código complicado, cómo comunicar a los humanos la intención detrás de una serie (a menudo críptica) de declaraciones ejecutables.

el hecho de que existen bibliotecas preescritas para cosas como sort () y cómo usarlas, es decir, el hecho de que no es necesario escribir todo desde cero.

Otros criterios para un primer idioma :

interpretado (la retroalimentación rápida ayuda al proceso de aprendizaje).

Un entorno interactivo que acelera el aprendizaje, las pruebas y la depuración.

el código fuente de alta calidad está disponible para que los estudiantes lo lean en ese idioma

"fácil de leer", "sintaxis que se acerca al lenguaje natural" (para que sea más fácil leer y calificar el código fuente)

portátil (se ejecuta en Mac OS, Windows, Unix). Al menos una implementación de software libre del lenguaje.

rápido para enseñar, "pocos problemas", por ejemplo, "[I] t puede ser más rápido enseñar primero a los principiantes Python y luego Java, en lugar de Java como primer OOPL". - "Comparación de lenguajes de programación orientados a objetos" y TelescopeRule

Matthias Felleisen desarrolló un lenguaje de programación con mensajes de error adaptados a un público principiante. Él enfatiza que la elección particular del idioma no es tan importante como enseñar una buena metodología de diseño. De hecho, ve el primer curso de CS como una clase de Artes Liberales, que enseña pensamiento crítico, resolución de problemas y atención al detalle.

criterios para un segundo lenguaje de programación

Cosas que queremos que los estudiantes aprendan, pero tal vez esto pueda esperar al segundo lenguaje de programación:

un lenguaje "relevante" que no es "demasiado esotérico"; algo "popular en la industria"

Teoría de la complejidad: cómo reconocer tareas que son imposibles con la tecnología actual.

cosas de nivel superior: cómo elegir la herramienta adecuada para el trabajo , cómo usar un compilador, estructuras, programación orientada a objetos, programación funcional, programación lógica, diseño del compilador, funciones de composición y manipulación (en el sentido de Lisp / ML), programación concurrente y distribuida,

cosas de bajo nivel: aritmética de punteros, arquitectura informática. administración de memoria, marcos de pila, programación de ensamblaje, arquitectura de la máquina, controladores de dispositivos y diseño del sistema operativo (para que la máquina "no parezca una caja negra aterradora que no puedan penetrar")

EDITAR: Me parece decepcionante que publicar un resumen de algo que escribí, en colaboración con muchos otros, "no sea una publicación legal".

Así que agrego una cita más formal a mi enlace informal anterior, intentando cumplir con el uso justo y otros problemas de derechos de autor de wiki.

Esta respuesta es un resumen del primer idioma de primer año (Anon 2011) en el Portland Pattern Repository.

(Anon 2011) Muchos autores anónimos y varios otros. "Primer idioma de Freshmans". Depósito de patrones de Portland. 27 de septiembre de 2011. http://c2.com/cgi/wiki?FreshmansFirstLanguage .


¿Ha verificado con los autores originales si puede reproducir su contenido? La fuente es un sitio web corporativo y no pude encontrar una declaración de que el contenido era gratuito, ¡así que esta puede no ser una publicación legal!
Raphael

1
@Raphael La fuente es un wiki (por lo que potencialmente tiene muchos autores diferentes). Si el autor (cualquier coautor) de este material no quiere que se incluya aquí, debe enviar un aviso de eliminación de DMCA a la [dirección de contacto que figura en la parte inferior de esta página] (mailto: team+cs@stackexchange.com) . Además, la información no está cubierta por derechos de autor, solo por la forma en que se expresa. Un poco de refactorización y eliminación de WordRunTogetherWikiWikiStyle mejoraría esta respuesta y eliminaría cualquier riesgo de violación de derechos de autor.
Gilles 'SO- deja de ser malvado'

1
+ Buena respuesta, pero tengo que elegir: perfiladores. No hay ninguna teoría detrás de ellos, solo "conocimiento común". En general, no se aprecia entre los académicos que hay muchos problemas que no encuentran, y otra técnica sí. Mira este enlace.
Mike Dunlavey

5

Creo que la simplicidad y la facilidad de aprendizaje es uno de los criterios principales. En un curso introductorio sobre programación, nos gustaría evitar obstáculos innecesarios de programación y enfocarnos tanto como sea posible en los principios de programación y resolución de problemas algorítmicos. El primer año, los estudiantes a menudo carecen de la capacidad de pensar algorítmicamente sobre los problemas, por lo que el curso también trata sobre la enseñanza del pensamiento algorítmico.

Otro criterio es la utilidad del lenguaje en la industria. No quisiéramos enseñar un idioma que no sirve para nada en la industria. Una clara mayoría de los estudiantes van a trabajar en la industria, por lo que uno debe tener en cuenta lo que se está usando (y se usará cuando los estudiantes se gradúen) en la industria.

El tercer criterio sería los cursos que los estudiantes tomarán en los años posteriores. Los cursos, particularmente los cursos requeridos, no están diseñados en sí mismos sino en coordinación con otros cursos.

Lo último en lo que puedo pensar en este momento es lo mismo que la respuesta de jmad, el idioma debería facilitar el aprendizaje de otros idiomas importantes. Debería ser lo suficientemente rico y aprender los idiomas importantes posteriores sería fácil (aquí, importante significa importante desde la perspectiva de los estudiantes).

Creo que muchas universidades han cambiado su curso principal de introducción a la programación de Java / C ++ / C a Python, aunque de vez en cuando pueden proporcionar una introducción a la programación en otros lenguajes (a menudo para especializaciones no informáticas, por ejemplo, C para especializaciones en ingeniería eléctrica) aunque pueden mostrar flexibilidad si el instructor quiere experimentar con la enseñanza de otro idioma de vez en cuando.


3
No calificaría la utilidad en la industria terriblemente en un curso introductorio de programación. Un programador exitoso en la naturaleza probablemente tendrá que aprender varios idiomas durante su carrera, algunos de ellos "en el trabajo", por lo que la capacidad de aprender y aprender nuevos idiomas es una habilidad clave que debe enseñarse. En consecuencia, no esperaría que el primer idioma que se enseñe en un curso de duración universitaria sea necesariamente el más fuerte cuando se gradúen.
Ben

1
@Ben: La utilidad en la industria es especialmente importante si los estudiantes no van a especializarse en CS. De donde vengo, muchas personas van a trabajar en biología u otras ciencias y, dado que no tendrán tiempo para aprender muchos idiomas, aprender algo común en su ecosistema como Python probablemente será más útil que ML, Java o C.
hugomg

1
Hablando como alguien de la industria (una industria en particular, no necesariamente representativa), no creo que la relevancia de la industria sea un factor cuando se trata de futuros programadores de nivel 1. La exposición a múltiples paradigmas hace mejores programadores, incluso si en mi dominio (programación integrada) usamos principalmente C. Los detalles de un lenguaje se pueden aprender en un manual, los conceptos generales se enseñan mejor en la escuela. Para los programadores incidentales (p. Ej., Científicos), las prioridades son diferentes, pero centrarse demasiado en Fortran puede hacer que las personas ignoren a Numpy cuando eso es lo que deberían estar usando.
Gilles 'SO- deja de ser malvado'

5

Entonces, prescindiré de mi reacción instintiva de inmediato, que es que todos deberían aprender a programar a través de SICP porque Lisp es lo correcto.

Ya se han ofrecido muchos buenos criterios para seleccionar un idioma ... la simplicidad y la portabilidad se encuentran entre las más importantes. Sin embargo, también creo que es vital para los estudiantes nuevos en la programación no tener una idea equivocada (o no tener idea) sobre lo que sucede detrás de escena con los lenguajes modernos.

Aunque algunas de estas otras publicaciones han ofrecido excelentes criterios, me gustaría utilizar un lenguaje particular para ilustrar cómo se ve 'cumplir los criterios'.

Algunas de estas preocupaciones se han abordado (mucho mejor de lo que podría intentar) en la publicación del blog de Joel Spolsky, The Perils of JavaSchools . Elegir lenguajes como Java o Python cierra sobre dos de los conceptos más difíciles (y más vitales) en CS; a saber, punteros y recursividad.

Por supuesto, enseñar un curso de introducción en C va a ser increíblemente denso, mientras que probablemente falten muchos conceptos importantes relacionados con la recursividad. Del mismo modo, un curso impartido en Lisp tendrá que abordar los punteros debajo de las portadas, care cdrimplicar conceptos importantes relacionados con las listas vinculadas, al tiempo que permite que el lenguaje maneje los detalles.

Básicamente, lo que quiero decir es que los estudiantes necesitan comprender los fundamentos de las estructuras de datos y algoritmos, así como la implementación práctica.

Tampoco estoy de acuerdo con la sugerencia de no utilizar un lenguaje orientado a objetos. Creo que la utilidad de los lenguajes orientados a objetos para modelar el mundo real es un activo positivo para los nuevos programadores, siempre que se aclare la falta de coincidencia de impedancia, y que los lenguajes orientados a objetos sean un paradigma entre muchos.

Yo propondría que Ruby (sugerido como una posibilidad por otra publicación también) ejemplifique muchas cualidades para buscar en un lenguaje para usar en una introducción al curso de programación.

Justificaré esta afirmación momentáneamente, pero primero quiero comentar sobre una tendencia que me perturba en los cursos introductorios de CS. Trabajo en una universidad que, como muchas escuelas, recientemente cambió a usar Python para sus cursos de introducción. Creo firmemente que Python es el nuevo BASIC, y la tendencia del lenguaje es elegir la nueva amistad sobre el poder y la expresividad, como dije recientemente en otra parte . Esto es un mal servicio, y debemos pensar en los programadores en que se convertirán, no en los novatos que son en este momento.

De todos modos, justificando a Ruby como un lenguaje introductorio ...

  • Ruby, aunque no está optimizado para la cola, hace la recursión bastante bien. Entonces ahí está eso.
  • Ruby es multi-paradigma. Aunque es un lenguaje puro orientado a objetos, también abarca la programación funcional, además de tener algunas ruedas de entrenamiento imperativas derivadas de C añadidas. Compare esto con Python, que es un lenguaje de procedimiento con algunos OO añadidos (aunque se muestran los pernos) y algunos elementos funcionales (que el BDFL de Python ha intentado eliminar repetidamente ).
  • CRuby (también conocido como MRI o 'Ruby Classic') está escrito y extendido en C. Puede enseñar a los estudiantes sobre punteros, administración de memoria y el dios temible malloc()enseñándoles a extender el lenguaje en C.
  • Incluso si se trata de un lenguaje dinámico de alto nivel, puede enseñar mucho sobre estructuras de datos, tipos, etc. hay bibliotecas (gemas) para cualquier cosa que puedas imaginar, desde árboles rojo-negros hasta hacer cosas extrañas con la escritura de patos.

De todos modos, no hay sustituto para aprender muchos idiomas, desde muchos paradigmas, ya sea que los uses profesionalmente o no. Básicamente, creo que todos deberían entender , si no usar , C y Lisp. Ruby es el mejor compromiso que se me ocurre para un semestre introductorio.

De todos modos ... esos son mis US $ .02. No estoy tratando de convencerte de que uses Ruby, fíjate ... solo lo uso como un ejemplo de cualidades para buscar en un idioma para enseñar un curso de introducción.


2
"Creo firmemente que Python es el nuevo BASIC" - copie eso. "dos de los conceptos más difíciles (y más vitales) en CS; a saber, punteros y recursividad" - Nunca aprendí un lenguaje que trata explícitamente con punteros, y nunca me perdí nada. Cuando aprendí cómo funcionan los compiladores, los punteros se explicaron con la suficiente rapidez.
Raphael

Estoy de acuerdo en que un lenguaje de paradigmas múltiples tiene su encanto (aunque enseñar dos o trese idiomas "puros" podría ser mejor), pero no elegiré Ruby por esa razón. Otros idiomas para un mejor trabajo, en mi humilde opinión, en particular con respecto a la biblioteca básica. Scala, por ejemplo, tiene una biblioteca completa de colecciones inmutables.
Raphael

3
También creo que Python es el nuevo BASIC. Pero, ¿por qué es un argumento en contra de Python?
JeffE

1
@Raphael, los punteros son difíciles solo cuando comienzas con C, lo que de alguna manera te obliga a estar expuesto a los punteros cuando no se establecen demasiadas cosas y tienen una relación confusa con las matrices. Los punteros no fueron difíciles para mí cuando aprendí por mi cuenta Pascal. Los punteros no fueron difíciles para las personas de mi clase a quienes se les enseñó en Algol 68 (se nombran referencias allí, pero son punteros con otro nombre, al igual que en Java; lo que es difícil en Algol 68 son las reglas de desreferencia automática), los punteros ni siquiera son difíciles con C ++ si no comienza enseñando el subconjunto de C.
Programador

1
@DaveClarke: sangra con espacios en blanco, lo que compensa con creces esos.
Raphael

5

Mi primer lenguaje de programación fue un lenguaje ensamblador de juguetes. El segundo fue Fortran. En el medio, me enseñaron una notación de "algoritmos", que era aproximadamente Algol 60. Resulté bastante bien. De hecho, creo que lo que me enseñaron fue bastante perfecto.

Cuando examiné por primera vez la programación funcional, en los trabajos de investigación, aunque no en un lenguaje implementado, dije "wow, esto es completamente diferente. ¡Es bastante matemático!" La mayoría de las personas a las que se les enseña programación funcional todavía tienen el mismo tipo de experiencia "guau". Pienso que es estupendo.

Creo que la programación imperativa y la programación funcional son dos formas completamente diferentes de ver el mundo. Les perjudicaríamos a nuestros estudiantes si les robáramos esa experiencia diversa.

El mejor primer lenguaje de programación debe ser algo lo más simple posible y lo más claro posible, para que los estudiantes puedan concentrarse en cómo pensar con claridad. Desafortunadamente, la simplicidad y la claridad del ensamblaje, Fortran y Algol 60 no tienen comparación con la mayoría de los lenguajes de programación modernos. Haskell es una buena excepción. Pero, Haskell sería mi segundo lenguaje de programación ideal, no el primero. Eiffel o Oberon tal vez podrían cumplir con los requisitos.


5

En la Escuela de Ciencias y Matemáticas de Carolina del Norte , hemos presentado a los estudiantes a Python desde 2004. Lo usamos para enseñar programación de procedimientos, porque creemos que la capacidad de escribir procedimientos cortos y correctos es vital para progresar más tarde con herramientas más pesadas, incluyendo OO programación.

Nos gusta por estas razones.

  1. Python no es un lenguaje de formato libre. Obliga a los estudiantes a escribir su código en bloques usando sangría. (Como nota técnica, usamos el editor de texto vim y set tabstop=4 set etcolocamos [ ] en .vimrc para eliminar problemas molestos y que la sangría del código sea notable pero no cause una desviación horizontal fea y excesiva). Nuestros estudiantes se acostumbran a ver la estructura jerárquica de los programas delimitados por espacios en blanco. Como resultado, sus hábitos de formateo tienden a ser muy buenos ya que programan en otros idiomas.

  2. La simplicidad sintáctica de Python lo hace amigable para principiantes. Se pueden escribir programas simples con un mínimo de palabras clave arcanas y encantamientos mágicos. Queremos que los estudiantes que normalmente no pensarían en la programación lo prueben. Tenga en cuenta la simplicidad encantadora de Python hello.py; Es claro como el cristal lo que está sucediendo.

  3. Python se escribe dinámicamente y se escribe con pato. Esto facilita la introducción de variables. Les digo a mis alumnos que las variables son solo etiquetas. Apuntan a los objetos. Envías un mensaje a un objeto usando el nombre de la variable, de la misma forma que alguien te envía un mensaje llamándote por teléfono.

  4. Python es una herramienta que los estudiantes ambiciosos no superarán. Tiene bibliotecas sofisticadas que hacen hosts de cosas útiles. Es una poderosa herramienta creativa accesible para principiantes.

  5. Python es gratuito y se ejecuta en todas las plataformas principales. Nuestra escuela es un entorno de sistema operativo heterogéneo con todo tipo de máquinas. No tenemos que preocuparnos por dolores de cabeza como problemas de compatibilidad. Se ejecutará en casi cualquier computadora.

  6. Python tiene una excelente documentación. Alentamos a nuestros estudiantes a explorar, jugar y colorear fuera de las líneas. Aprenden sobre el uso temprano de la documentación de Python y, a menudo, terminan explorando cosas interesantes fuera de clase.

Estamos muy contentos con Python.


1
¡Bienvenido! Este es un buen estudio de caso, pero hace poco para responder la pregunta después de los criterios de selección, en mi humilde opinión. Leer tus artículos al revés puede hacer eso, pero no estoy seguro de si lo hiciste así.
Raphael

No se pretendía ningún orden en particular. Es un "y".
ncmathsadist


1

TL; DR: No hay forma deresponder objetivamente esto porque no hay una base objetiva para los criterios detrás de esto. Es tan arbitrario como tratar de debatir si el azul es, objetivamente , un color "mejor" que el rojo, o si el helado de vainilla es objetivamente "más sabroso" que el chocolate.


Creo que hay algunas publicaciones maravillosas ya presentes, pero agregaré mis propios 2 centavos.

¿Qué criterios objetivos puede usar un educador para seleccionar un lenguaje de programación para usarlo como base para un curso de programación universitaria de primer año?

Esta pregunta es similar a preguntar si hay una manera de elegir objetivamente el primer sabor de helado que alguien más debería probar al visitar un lugar de helados por primera vez. No, no hay una forma objetiva de elegir algo que sea inherentemente subjetivo .

¿Por qué? Porque incluso cuando miramos los criterios razonables mencionados en la respuesta de Pedro , todos tendrán una visión subjetiva de cómo cada factor "se sostiene" frente a las opiniones de otra persona.

Por ejemplo, ¿es Ruby objetivamente "más simple" que Python? ¿Más simple en qué sentido? ¿Con respecto a qué? ¿Qué significa "más simple" para ti ? ¿Significa "menos líneas de código"? ¿Significa "más fácil de leer y entender"? ¿Qué hay de los demás? ¿Por qué debería alguien estar de acuerdo con alguna selección en particular aquí? No creo que podamos responder esa pregunta objetivamente .

Esto lleva a la siguiente pregunta.

¿Cuál es la base de estos criterios?

Por más razonables que sean algunos criterios, creo que esto se basa más en la preferencia subjetiva que en cualquier otra cosa. Por ejemplo, no hay razón por la que deba aceptar los criterios de simplicidad , inequívoca , portabilidad y preferencia de la industria de Pedro, independientemente de lo razonable que algunos puedan pensar que es. De hecho, la preferencia de la industria es subjetiva por definición y simplemente conduciría a un círculo vicioso. (Todos se entrenan en él, por lo que todos lo usan en la industria, por eso todos se entrenan en él, ...)

Por ejemplo, porque no

  • Eficiencia: los tiempos de ejecución y la huella de memoria se pueden medir.
  • Tamaño: la menor cantidad de palabras reservadas posibles facilitaría el aprendizaje del idioma.
  • Conjunto de características: un conjunto más amplio de características compatibles (por ejemplo, lambdas, genéricos, orientación a objetos, sobrecarga del operador, etc.) le permitiría enseñar más conceptos sin tener que cambiar de idioma y volver al punto de partida.
  • Interoperabilidad: un lenguaje que facilita el trabajo con otros lenguajes y sistemas nativos (por ejemplo, Win32 API de C # o Python, etc.) podría plantearse como una mejor inversión de tiempo a largo plazo, etc.

El punto es que, si bien podría llegar a un conjunto diferente de criterios de evaluación y aún ser considerado razonable, no podemos afirmar que sea objetivamente superior / inferior al de otra persona.

En conclusión, no hay una base objetiva para los criterios. Es tan arbitrario como tratar de debatir si el azul es, objetivamente , un color "mejor" que el rojo, o si el helado de vainilla es objetivamente más sabroso que el chocolate.

Eso no quiere decir que no pueda tener buenas razones para justificar sus preferencias, pero al final del día, son solo sus preferencias.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.