¿Qué idioma debo usar al enseñar un curso de pregrado en programación de computadoras?

22

Voy a enseñar a los estudiantes de pregrado un curso titulado Introducción a la programación de computadoras. Estoy un poco confundido En Física Computacional, los científicos usan C / C ++ o Python o Fortran, CUDA, etc. ... este es el momento de construir su base. ¿Qué debo usar? Sé que puedes aprender un nuevo lenguaje de programación en cualquier momento de tu vida, pero es una elección más sabia para mí elaborarlos todos los conceptos básicos de programación y los conceptos de OOP más adelante.

Afnan Bashir
fuente
99
@ k20: Espero que su sugerencia sea irónica; de lo contrario sería una grave violación de la ética académica.
Christian Clason
66
@ k20: Todo esto está fuera de tema, pero elegir software basado en sobornos (de cualquier tipo) para el maestro y no en el contenido que se enseñará es definitivamente poco ético. (Solo para dejarlo claro, es el "botín" al que me opongo). Lo que generalmente se hace es que las compañías pongan a disposición software a un costo significativamente reducido (o gratis).
Christian Clason
3
@ k20: Además, tenga en cuenta que la motivación de la compañía de software no es del todo altruista: sus estudiantes pueden obtener el software de forma gratuita ahora, pero también es probable que tengan que comprar el software algún tiempo más tarde en su vida (o aprender un nuevo software).
Wrzlprmft
3
@ k20 Matlab y Mathematica no se usan mucho para la computación científica seria. Son herramientas más exploratorias para probar ideas. Si el propósito del curso es enseñar algoritmos básicos, entonces estos podrían ser adecuados (especialmente Matlab), pero si se trata de programación general, entonces querrá utilizar un lenguaje de programación más general como Python de C ++.
Truman Ellis
2
MATLAB tiene un diseño (si no fuera diplomático, diría que es defectuoso :)) que requiere lo que en otros idiomas son malas prácticas. Muchas otras cosas son diferentes de cualquier otra cosa, por lo que "salir" puede ser difícil. Mathematica tiene, en mi opinión, un diseño hermoso, pero no es nada similar a ningún otro idioma (excepto tal vez Lisp, pero no se usa en ciencias), por lo que lo que aprendió es inútil para aprender otro idioma. OTOH, ir a C <-> Python es mucho más fácil.
Davidmh

Respuestas:

32

Primero, si sus estudiantes universitarios son como los nuestros y no tuvieron una introducción previa a las computadoras, esperen pasar algún tiempo enseñándoles cómo usar cosas básicas como usar un editor adecuado (es decir, no MS Word), la línea de comandos, etc.

Creo que la respuesta depende en cierta medida de dónde establezca el enfoque de su curso (o de lo que debe enseñar). Por ejemplo: ¿Cuán relevantes son los funcionamientos internos de la computadora? ¿Necesita clases y otras estructuras avanzadas de OOP? ¿Quieres enseñarles cómo producir programas eficientes o estás contento si producen programas de trabajo? Además, no olvide que probablemente necesitará tutores capaces.

Pero ahora estoy familiarizado con las ventajas y desventajas de los idiomas. Tenga en cuenta que esto se debe principalmente a mi experiencia como físico computacional y algo de esto puede depender del campo particular, grupo de trabajo, universidad, etc.

Pitón

En general, recomiendo usar Numpy desde casi el principio y supongo que se usará a continuación.

Ventajas:

  • Es fácil de aprender y también lo es leer el código de otras personas (por ejemplo, su código de ejemplo, pero también el código de los estudiantes para los tutores).
  • La entrada y salida (que no debería ser el foco de su curso) pueden ser cubiertas por printNumpy's savetxty loadtxt, y tal vez sys.argv. Se puede introducir sobre la marcha y no consume mucho tiempo de programación.
  • No necesita tratar o solo debe tratar poco con detalles tales como representación de números, administración de memoria, tipos de datos. Por lo tanto, es rápido de programar y puede centrarse en los algoritmos reales.
  • No es un lenguaje compilado. Esto tiene dos ventajas: los estudiantes no necesitan lidiar con un compilador y pueden probar cosas directamente en la consola sin tener que compilar, reiniciar y volver a ejecutar el programa. Relacionado, la depuración es más fácil.
  • Hay bibliotecas fáciles de usar para casi todo.
  • No necesita aprender lenguajes de script adicionales como scripts de shell, Make, Gnuplot, etc. Todo esto puede hacerse desde Python.
  • Hay muchos buenos tutoriales (gratis).

Desventajas

  • No está compilado. Por lo tanto, los programas Python pueden ser drásticamente más lentos que los programas compilados en algunos casos relevantes para la física computacional. En otros casos, sin embargo, las bibliotecas (especialmente Numpy) pueden producir un rendimiento comparable. Otra forma, para obtener un buen rendimiento con Python es escribir los fragmentos de código relevantes en otro lenguaje como C¹. Obviamente, necesita aprender este idioma para esto, pero esto se puede hacer más tarde y no perderá su tiempo aprendiendo Python.
  • Es más difícil enseñar detalles como la representación de números, la gestión de memoria, los tipos de datos y sus dificultades, ya que están algo ofuscados.

C / C ++

Ventajas:

  • Se compila y, por lo tanto, es más fácil producir código eficiente.
  • Se trata directamente de la representación de números, la gestión de la memoria, los tipos de datos y, por lo tanto, es más intuitivo enseñarlos: sus alumnos se acercarán a lo que realmente está sucediendo en su computadora.
  • Hay bibliotecas para básicamente todo, pero comprender y usar una biblioteca requiere algo de trabajo.
  • Hay una cantidad relevante de código existente en C / C ++ y, por lo tanto, los estudiantes deben aprender el idioma si quieren trabajar con este código.
  • Si ya conoce C / C ++, puede aprender Python (por ejemplo) muy rápido.

Desventajas

  • Está compilado y sus alumnos tienen que lidiar con el compilador, el preprocesador, los encabezados, etc. Te sorprendería la cantidad de estudiantes que fallan en este paso, incluso al final del semestre.
  • También es más lento aprender y lleva más tiempo producir código de trabajo.
  • Lidiar con cosas marginales como la entrada y la salida lleva algún tiempo tanto en la enseñanza como en la programación. En C ++, hay una sintaxis adicional para entrada y salida.
  • Compilador y dependencias del sistema operativo.
  • Tienes que lidiar con la confusión C / C ++.
  • Leer el código de otros especialmente en C ++ puede ser bastante difícil debido a la gran cantidad de características de sintaxis.

Las principales ventajas de C ++ sobre C (clases, plantillas) no deberían ser relevantes para su curso y solo se están volviendo relevantes para proyectos más grandes. Por lo tanto, elegiría C de los dos, ya que es más conciso.

Otros

Algunos comentarios sobre los otros idiomas:

  • Fortran: Esto todavía es utilizado por muchos grupos y hay muchos códigos heredados, pero no puedes lidiar con los viejos estándares y sus enormes limitaciones y dificultades (mucha gente todavía está trabajando con Fortran 77). Además, será mucho más difícil encontrar tutoriales, ayuda en Internet, etc.
  • Matlab / Mathematica: todos los problemas del software propietario. Considere en particular que es probable que sus alumnos colaboren con personas que no tienen acceso a este software y los problemas que se derivan.
  • Cuda: Esto solo es relevante para ciertos problemas, si el rendimiento es importante. Además, después de todo lo que sé, no quieres aprender a programar de esta manera.

¹ Cuál es el flujo de trabajo estándar al menos en nuestro grupo.

Wrzlprmft
fuente
Respuesta muy precisa
Afnan Bashir
1
También quisiera decir que uno de los bonos no mencionados de Python es que hay una serie de distribuciones científicas (Anaconda / Enthought / PythonXY / SAGE) que realmente suavizan el proceso de lograr que todos estén en la misma página informática. Además, aún más interesantes son los enfoques basados ​​en la web (Wakari y SAGE) que lo proporcionan todo a través de un navegador, también conocido como software instalado. Enseñar a los estudiantes de licenciatura c ++ o Fortran resultará en más tiempo perdido luchando contra un compilador que el tiempo ganado en velocidad de código.
meawoppl
Hay un ecosistema increíble en Python para la física computacional. Numpy, scipy por proporcionar infraestructura básica, mayavi, tvtk para visualizaciones. Python es bastante maduro en la comunidad de computación científica. Yo uso C ++ en producción, pero no importa lo que sea difícil de usar.
Sai Venkat
@meawoppl: "Enseñar a los estudiantes de licenciatura c ++ o Fortran resultará en más tiempo perdido luchando contra un compilador que el tiempo ganado en velocidad de código". - No es la velocidad de código para los ejercicios del curso lo que importa (los programas serán muy rápidos de cualquier manera, a menos que los ejercicios se realicen específicamente para que no lo sean), pero la velocidad del código de los programas que escribirán para la vida real o similar. Y hay algunas cosas que no se pueden hacer de manera eficiente solo en Python.
Wrzlprmft
1
Diría que CUDA está fuera de discusión para un curso de propósito general, ya que requiere hardware que no todos tienen. Y si solo tiene una computadora portátil sin ella, casi no hay forma de que pueda instalar una.
Davidmh
22

En 2014, habría dicho Python. En 2017, creo sinceramente que el idioma para enseñar a los estudiantes universitarios es Julia.

La enseñanza siempre se trata de una compensación. Por un lado, desea elegir algo que sea lo suficientemente simple como para que sea fácil de entender. Pero en segundo lugar, desea enseñar algo que tenga poder de permanencia, es decir, algo que pueda crecer con usted. Los lenguajes dinámicos comunes (Python / MATLAB / R) caen fácilmente en la categoría 1 debido a su código repetitivo inexistente y la facilidad de abrir un intérprete y escupir código, mientras que C / C ++ / Fortran entran en la segunda categoría como Los idiomas con los que se escribió el software central de alto rendimiento del mundo de hoy.

Pero hay problemas con el uso de un lenguaje que no captura completamente la otra categoría. Cuando se usa un lenguaje como Python, abstrae muy bien cosas como los tipos y el desbordamiento de enteros. Esto es bueno para enseñar la computación del primer semestre, pero como quieres profundizar cada vez más en cómo funcionan realmente las cosas, el lenguaje de Python está demasiado alejado del metal subyacente como para ser una buena herramienta de enseñanza. Pero C / C ++ / Fortran (o Java ... aprendí Java primero ...) todos tienen un costo de inicio tan grande que lo más difícil de aprender es cómo configurar y maincompilar los encabezados , lo que distrae de aprender realmente a programar .

Entra Julia. Cuando usa Julia por primera vez, puede abstraer la idea completa de los tipos y usarla como MATLAB o Python. Pero como quieres aprender más, hay un "agujero de conejo" de profundidad en el idioma. Dado que es realmente una capa de abstracción basada en un sistema de tipos + despacho múltiple sobre LLVM, es esencialmente "una manera fácil de escribir código compilado estáticamente" (y las funciones de tipo estable pueden compilarse estáticamente). Lo que esto significa es que los detalles de C / C ++ también son accesibles. Puede aprender a escribir bucles y funciones simples sin código repetitivo, y luego profundizar en los punteros de función. Las funciones de metaprogramación de Julia le permiten acceder directamente al AST, y hay macros que muestran cada parte de la cadena de compilación. Además, como Lisp, es susceptible de estilos de programación funcionales. Y tiene muchas capacidades de computación paralela. Ideas como la escritura paramétrica y la estabilidad de tipo son bastante únicas y profundas en Julia.

Si desea estudiar los lenguajes de programación ellos mismos, puede aprender los pasos de cómo funciona la compilación utilizando @code_loweredpara ver qué es la reducción, ver el AST escrito con @code_typed, ver LLVM IR con @code_llvm, y finalmente el código de ensamblado nativo con @code_native. Esto puede usarse para mostrar cuál es el costo de las variables dinámicas y exactamente cómo funciona el "boxeo variable", y esta publicación de blog muestra cómo estas herramientas de introspección pueden usarse para enseñar cómo las optimizaciones del compilador pueden / no pueden ocurrir.

No solo hay que explorar ideas de ingeniería informática y de informática, sino también ideas matemáticas ricas. Dado que las bibliotecas principales de Julia están escritas teniendo en cuenta la tipificación genérica, es trivial crear operadores libres de matrices y usar IterativeSolvers.jl para realizar GMRES usándolos. Puede usar herramientas de introspección @whichpara mostrarle exactamente cómo se implementó cualquier cosa. Por ejemplo, ¿cómo \funciona?

@which rand(10,10)\rand(10)
#\(A::AbstractArray{T,2} where T, B::Union{AbstractArray{T,1}, AbstractArray{T,2}} where T) in Base.LinAlg at linalg\generic.jl:805

Eso me lleva directamente a la definición de \ . Se implementa en Julia, por lo que alguien que conoce a Julia puede aprender el algoritmo y cómo funciona mediante la identificación de subtipos de matriz y especializándose cuando sea posible (recurriendo a la eliminación gaussiana). Dado que el código de Julia tiene licencia MIT (y casi todos los paquetes tienen licencia MIT), los estudiantes pueden usar estas ideas en su propio código (con atribución) (cuando el código tiene licencia GPL, como es el caso con la mayoría de los paquetes MATLAB y R, ¡deben tener cuidado con los problemas de licencia!).

Dado que el núcleo del lenguaje está construido con una comunidad de código abierto muy activa, también hay un rico recurso en la historia del desarrollo del lenguaje: sus problemas de Github . ¿Comprender preguntas de lenguaje como lo que realmente es una transposición matricial? puede ser muy esclarecedor para comprender estos objetos matemáticos con mayor detalle.

Pero por último, al final, quieres enseñar a tus alumnos cómo crear. Lamentablemente, aprender Python o R no significa necesariamente que tenga lo que se necesita para "desarrollar Python / R", ya que la mayoría de los paquetes ampliamente utilizados y bien optimizados tienen una cantidad sustancial de código C / C ++ / Fortran en orden para obtener rendimiento Por lo tanto, para que estos estudiantes puedan contribuir a los ecosistemas científicos de estos idiomas, eventualmente tendrán que aprender otro idioma en algún momento. Si bien eso no es del todo horrible, es subóptimo ahora que Julia existe. Dado que el tipo de letra estable Julia puede alcanzar la velocidad de C / Fortran, la mayoría de los paquetes en el ecosistema de Julia son códigos puros de Julia. Aprender a Julia significa que uno ha aprendido a desarrollar a Julia. Y dado que Base Julia también es principalmente código de Julia (solo algunas primitivas y el analizador no lo es),

Dicho esto, hay algunas desventajas en la elección de Julia. Por un lado, es mucho más nuevo que estos otros idiomas y, por lo tanto, es un poco más escaso en recursos. Tendrá que encontrar muchas herramientas de enseñanza por su cuenta, o extraer recursos de la web que figuran en el sitio web de Julia . Además, los detalles del idioma no están del todo definidos, aunque 1.0 saldrá pronto (a fines de 2017). Y también es muy probable que usted, el potencial maestro de un curso en Julia, no tenga mucha experiencia con el idioma. Sin embargo, estos son los tipos de problemas que desaparecen con el tiempo, mientras que los beneficios de Julia que mencioné anteriormente son mucho más importantes para los propios idiomas.

Chris Rackauckas
fuente
Me pregunto si usar un poco de lenguaje usado tiene sentido ya que es probable que se pierda el conocimiento de la sintaxis y no se garantiza que los estudiantes aprenderán varios idiomas. Quizás en ese punto de vista, Python sigue siendo una buena opción.
Xavier Combelle
1
Es por eso que no hubiera dicho Julia antes, pero ahora que es bastante común, también podrías usarlo.
Chris Rackauckas
Creo que Julia todavía es demasiado nueva. En la industria, se espera que los estudiantes conozcan Python, C ++, (ew) MATLAB y R. Creo que es mejor como segundo o tercer idioma para aprender, como una experiencia enriquecedora. Es poco probable que los estudiantes usen a Julia nuevamente en el futuro cercano.
Mateen Ulhaq
2
Los estudiantes deben aprender habilidades transferibles, no una plantilla para copiar y pegar. En ese sentido, Python / MATLAB / R abstrae demasiado lejos de la computadora para ser una buena herramienta de enseñanza más allá de la programación más simple, pero C ++ tiene un nivel demasiado bajo para ser una buena herramienta de enseñanza. Claro, si va a tener un lenguaje adicional como en un curso de análisis numérico, haga lo que usará porque el curso no se trata de programación. Pero si se trata de conceptos de programación, Julia es prácticamente el único lenguaje simple que en realidad tiene la mayoría de los conceptos en su diseño.
Chris Rackauckas
2

Hablando como un estudiante universitario no muy lejano, y suponiendo que no estás enseñando en el departamento de CS, creo que sería un desastre introducir a los estudiantes en la programación de computadoras con algo como C, C ++ o Fortran (o Dios no lo quiera) CUDA), a pesar de que otros han señalado que probablemente son el status quo en la informática científica.

Si espera enseñar a los estudiantes computación científica y presentarles la programación en el mismo curso, apuesto a que es demasiado para cubrir en un semestre a menos que se apegue a un lenguaje interpretado como matlab o python. En mi experiencia, la mayoría de las clases de computación científica en el nivel de pregrado se imparten en uno de esos dos de cualquier manera, y Python se está volviendo cada vez más útil como lenguaje de nivel de producción todos los días, por lo que todavía tiene alguna utilidad como habilidad práctica ( más allá de solo enseñar conceptos básicos de programación, quiero decir).

Solo mis dos centavos.

Sumedh Joshi
fuente
44
Desastre es una palabra demasiado fuerte para describir a los estudiantes de enseñanza C, C ++ o Fortran. Cualquiera de estos lenguajes (C, C ++, Fortran o Python) puede estar bien para enseñar programación y computación científica dependiendo de cómo lo hagas.
Bill Barth
1
Desde mi experiencia en una clase del departamento de CS (C ++) y una clase para astrónomos (Fortran 77), C / C ++ / Fortran no proporcionan suficiente ayuda en comparación con Python para programadores completamente nuevos (segfaults vs excepciones). El uso de C / C ++ / Fortran implica aprender a usar un depurador (o el uso de un IDE), mientras que Python se puede usar solo.
James Tocknell
0

C, C ++ y Fortran (enumerados sin ningún orden en particular) son los tres lenguajes de programación principales utilizados para las matemáticas / física computacional si desea resolver grandes problemas en supercomputadoras. Creo que CUDA se considera una biblioteca que se usa junto con otros idiomas para la computación acelerada por GPU. Matlab y Python son excelentes para aprender a ejecutar diagnósticos de salida y crear modelos prototipo. También son más fáciles de aprender y pueden ser mejores para un curso en el que desea ver algoritmos y versos que aprenden a programar.

Por lo tanto, si su curso es puramente sobre programación, elegiría C ++ o, si esta es la primera vez que los estudiantes programan, Python. Ambos lenguajes tienen una gran utilidad fuera del mundo de la informática científica. Si el curso se centra en el aprendizaje de algoritmos para resolver problemas basados ​​en la física, entonces creo que Matlab es, sin duda, el ganador.

James
fuente
0

en resumen: tenga en cuenta que la informática científica es complicada en sí misma. ¿Realmente quieres que el lenguaje de programación entre en juego?

Las matemáticas usan la abstracción para resolver problemas que no pueden resolverse por intuición. Por lo tanto, los conceptos tienden a ser abstractos. Por eso no es trivial entender qué conceptos encapsular. En informática científica, los ejemplos habituales para clases como "Animal" "Vehículo" son bastante inútiles. Esto es cierto para la programación orientada a objetos, pero creo que reproducir conceptos abstractos en una computadora tampoco es trivial en la programación imperativa.

Es por eso que creo que aquí estamos tratando con dos esfuerzos diferentes: programación, por un lado, y computación científica por el otro. A nivel de pregrado, donde los estudiantes provienen de entornos heterogéneos, puede terminar enseñando dos cosas diferentes al mismo tiempo.

Si su objetivo es enseñar informática científica, creo que es bastante difícil. Tener una barrera adicional ya que el lenguaje de programación (todos estamos de acuerdo en que C ++ requiere capacitación) desmotivaría a una buena parte de los estudiantes, por eso sugiero ir con Python.

Si su curso es "Introducción a SC", creo que Python tiene la mejor relación resultado / esfuerzo.

PD: ahora tenemos computadoras bastante buenas, realmente no necesitamos buscar eficiencia a nivel de pregrado.

Nicola Cavallini
fuente
Con respecto a su PS: ¿Por qué el rendimiento no es importante solo para estudiantes universitarios? Además del hecho de que es fácil concebir tareas para estudiantes universitarios donde el rendimiento sí importa, no son aquellas tareas para las que están aprendiendo rendimiento, sino la vida real. Además, la velocidad de la computadora puede haber aumentado, pero también nuestras expectativas.
Wrzlprmft
Lo siento, fui demasiado fuerte. Permítanme reformularlo en "los estudiantes pueden ejecutar grandes aplicaciones satisfactorias con un lenguaje interpretado, antes de profundizar en la optimización del código y luego ir a un lenguaje compilado".
Nicola Cavallini