2009-04-22 7 views
29

Me parece que la programación funcional es una gran cosa. Elimina el estado y facilita mucho la ejecución automática de código en paralelo.¿Se debe enseñar la programación funcional antes de la programación imperativa?

Muchos programadores a quienes se les enseñó por primera vez estilos de programación imperativa les resulta muy difícil aprender programación funcional, porque es muy diferente. Comencé a preguntarme si a los programadores a quienes se les enseñó la programación funcional primero les resultaría difícil comenzar una programación imperativa. Parece que no sería tan difícil como a la inversa, así que pensé que sería bueno si a los programadores se les enseñara primero la programación funcional.

Entonces, mi pregunta es, si la programación funcional debe enseñarse en la escuela antes que nada, y si es así, ¿por qué no es más común comenzar con ella?

+5

Cuando dices escuela, ¿te refieres a primaria? La programación funcional se enseña en la mayoría de las universidades y en cualquier curso sobre lenguajes de programación. – kgrad

+3

El título es un poco engañoso, la programación funcional se enseña en la mayoría de las escuelas, y su pregunta en el cuerpo no coincide con la pregunta en el título. –

+0

La pregunta en el cuerpo es realmente buena, sin embargo, actualice el tema. –

Respuesta

26

En realidad, algunas escuelas ya lo hacen de esta manera. Donde estudio (Universidad de Copenhague), enseñan SML en el primer semestre, como una introducción a la programación. Luego enseñan Java luego, como una introducción a OOP.

Creo que funciona muy bien, y estoy de acuerdo contigo es mejor que al revés. La programación funcional es bastante intuitiva para alguien que no es (todavía) un programador. Se correlaciona mucho mejor con lo que nos enseñaron como matemáticas en la escuela secundaria o antes, por lo que las personas que aún no han estado expuestas a una programación imperativa suelen aprenderlo sin demasiados problemas.

De hecho, hay una tendencia que las personas que son nuevas en la programación cuando se inscriben eligen 0Lmás rápido que los que ya han aprendido Java o C++.

Parece que hay un gran salto conceptual en ir de imperativo a funcional, pero el revés parece mucho más fácil para la mayoría. Generalmente, los estudiantes no encuentran que Java sea difícil cuando están expuestos a eso después de aprender SML. Una vez que conozca los conceptos "puros" de la programación, pegar los efectos secundarios es bastante sencillo. Pero si su comprensión total de la programación se basa en los efectos secundarios, es mucho más difícil imaginar que cualquier cosa es posible sin ellos.

Creo que un gran beneficio de este enfoque es que los principios de programación funcional se convierten en una parte esencial de su caja de herramientas de programación, en lugar de un complemento esotérico que podría usar si desea presumir. Incluso cuando programo en lenguajes imperativos, creo que hay un beneficio en tener sus antecedentes en un lenguaje funcional. Incluso cuando se programa en algo de bajo nivel como C, hay un beneficio al pensar en minimizar el estado y los efectos secundarios, y estar acostumbrado al concepto de funciones de orden superior (aunque no están disponibles en el idioma)

+2

Mi propia experiencia como estudiante fue Scheme primero, luego C, luego OCaml (curso de compilador) y no tan bueno OO en Java. Scheme fue genial, como principiantes completos tenemos que hacer cosas divertidas como un sistema de inferencia o cálculo simbólico. He estado enseñando C como un lenguaje para principiantes (aún no controlo esa opción) y declaro ES una dificultad para un número de estudiantes. Pero el mayor problema es el ruido conceptual. C está bien, pero difícil, Java es peor. La sintaxis mínima y la semántica como Scheme o Smalltalk funcionan muy bien para los cursos introductorios. Para OO avanzado escogería Smalltalk o Eiffel sobre cualquier otra cosa. –

5

Posiblemente podría tratarse de un problema de mentalidad, ya que la mayoría de los profesores/profesores probablemente también aprendieron estilos imperativos primero.

Además, supongo que hay mucho más trabajo disponible para enseñar estilos imperfectos.

2

sólo puedo asumir su el hecho de que la POO parecía ser una palabra de moda/estilo preferido, así Escuelas pegados a que,

me enseñaron diseño de programación orientada a objetos desde el primer momento, su hasta hace poco que he estado enseñando a mí mismo la Estilo funcional de programación y puedo ver que tiene sus ventajas.

2

Editar: Lo que sigue refleja el título original, "¿Por qué es programación funcional no se enseña en las escuelas," Las escuelas tienen maestros, no profesores. Los maestros de escuela no escriben sus propios libros de texto.

Las compañías de libros de texto de las cuales los maestros pueden comprar sus materiales son el problema más grande. Las compañías de libros de texto son rápidas para saltar sobre "la próxima gran cosa", que era OOP hace unos años. La programación funcional se ha quedado en el camino. Muchos maestros no pueden o no pueden enseñar un curso sin un libro de texto, por lo que la selección del curso generalmente sigue la disponibilidad de libros de texto de los grandes vendedores.

+0

Encuentro esto muy difícil de creer. También muy subjetivo. Además, los lenguajes de programación funcionales están cubiertos en cualquier curso de lenguaje de programación. – kgrad

+0

"Coursepacks" son básicamente libros de texto escritos por el profesor, lo que haría que el último punto sea discutible. Bueno, mientras un profesor realmente lo escriba. – nilamo

+1

Ahora hay un excelente libro de texto para maestros de escuela: http://htdp.org –

1

En primer lugar, creo que la base de su pregunta es errónea porque me enseñaron la programación funcional en la escuela. (No fue con lo que comencé, pero hicimos algo de programación funcional.)

En segundo lugar, cuestiono la facilidad de transferir de la codificación funcional a la codificación imperativa. No creo que sea tan fácil como lo imaginas.

En tercer lugar, la programación es (para la mayoría de las personas) una habilidad laboral. La gran mayoría de las tiendas usa programación imperativa. Por lo tanto, es más útil para los codificadores futuros aprender la programación imperativa.

+0

Me gustaría agregar una referencia a [TIOBE] (http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html). –

9

Muchas (¿la mayoría?) Escuelas enseñan programación funcional. Muy pocos lo enseñan primero difícil, por muchas razones.

  • La mayoría de los entornos de desarrollo para idiomas functionnal chupan, y requieren un amplio conocimiento de programación utilizar adecuadamente. Esto es cada vez menos cierto, pero todavía estamos lejos de Visual Studio for Haskell.

  • Es más difícil saltar en el 'llamativo cosas'. Los kits de herramientas y libs de la interfaz gráfica de usuario absorben para la mayoría de los lenguajes de funciones. Mostrar cosas en la pantalla y recompensar al alumno es importante.

  • Programadores autodidactas tienden a gravitan a imperativo/OO idiomas por razones históricas. Disponibilidad de BASIC en su juventud, sabiendo que su juego favorito fue escrito en C o C++, lo que sea.

  • Recursos y tutoriales simples para lenguajes de programación funcionales son más difícil de conseguir. Compare el número de muestras de C# con las muestras de Lisp en Code Project. Tenga en cuenta que Lisp es más de 5 veces mayor.

+0

También agregaría que la complejidad del estilo funcional de programación y los conceptos son más difíciles de comprender que los orientados a objetos que parecen "tener sentido". Además, la prevalencia de OOP en la fuerza de trabajo es mucho más alta que FP y, por lo tanto, es más probable que una persona al azar use un lenguaje OO que uno funcional. – kgrad

+0

El Dr. Scheme desmiente su primer punto. Es un Esquema IDE dirigido a estudiantes de CS. – RossFabricant

+0

Sí, tenía en mente al Dr. Scheme cuando mitigé el primer punto con "Most" y "less y less true". Aún así, el Dr. Scheme, aunque es bueno, no es exactamente maravilloso cuando se trata de instalaciones de depuración. Pero admito que para un principiante total, esos pueden no ser muy útiles. :) – jfclavette

0

Por lo tanto, mi pregunta es, debe programación funcional se enseña en la escuela antes de imprescindible, y si es así, ¿por qué no es lo más común para empezar con él?

Aunque no tuve la suerte de comenzar con un lenguaje funcional, sí tengo colegas que sí lo hicieron. También tuve un amigo que estudió matemáticas, ¡y el único idioma que aprendió mientras estaba en la escuela fue Haskell!

Hay dos cosas: informática e ingeniería informática. Aunque la línea es muy delgada, IMO, depende mucho del curso (como se mencionó anteriormente) y del área de enfoque del departamento correspondiente con qué idioma cortar los dientes. La mayoría de las escuelas de ingeniería comienzan con C, C++ o Java, que tienen un mercado laboral potencialmente grande. Otros, pueden comenzar con Lisp, Haskell, etc.

0

La programación funcional se enseña en la mayoría de las universidades. Parte de la razón por la que no se enseña en la escuela secundaria se debe probablemente a que el mito de la "programación funcional es difícil".

+0

¿Alguien acaba de hacer un hit-and-downvote? – Rayne

0

Dunno sobre su escuela por en mis estudios de pregrado ML era una parte esencial del curso de lenguajes de programación básica y había un curso extra de currículo dedicado a Haskel.

12

Muchas escuelas enseñan programación funcional. Algunos de ellos incluso lo enseñan primero. Creo que MIT, durante mucho tiempo, solía enseñar el esquema en su introducción a las clases de programación de computadoras.

En mi escuela cubrimos ML como parte de una "clase comparativa de idiomas de programación" que todos debían tomar.

En cualquier caso, no creo que la programación funcional sea tan difícil de aprender para las personas provenientes de idiomas imperativos. Al menos no fue para mí.

Mucha gente piensa que la razón por la que idiomas como Haskell y Scheme no han tenido una adopción más amplia se debe a que las personas están "arruinadas" por la programación imperativa. Eso es una tontería.

La verdadera razón por la que esos idiomas no se han adoptado ampliamente es porque no usan llaves. Seriamente.

El estilo de sintaxis de C/Algol prevalece porque a la gente le gusta cómo se ve.

La clave para aumentar la adopción de la programación funcional no es hablar de cuán grande es Haskell y cómo son los efectos secundarios del mal, o decir la palabra "mónada" repetidamente. En su lugar, solo cree un lenguaje funcional que use llaves y puntos y comas. La gente lo usará.

+3

Cuando tienes razón, tienes razón. – Prankster

+2

Esto me hizo reír, pero creo que tienes razón. – Zifre

+8

Python es bastante popular y no utiliza llaves ni secuaces. – Christian

1

El flujo de control claro de la programación imperativa se presta bien a la implementación y análisis de algoritmos en un entorno de enseñanza. La programación orientada a objetos es una extensión conveniente de eso, por lo que es, naturalmente, lo que se usa con más frecuencia. La programación funcional (programación declarativa de cualquier tipo en realidad), por otro lado, es un paradigma completamente separado que requiere un nuevo conjunto de consideraciones (rendimiento y demás) muchas de las cuales son mucho más fáciles de visualizar si primero se entiende la programación imperativa. Después de todo, todo se reduce a un lenguaje imperativo al final.

+0

+1 porque se reduce a un lenguaje imperativo: el ensamblaje es imperativo, C es imperativo, y la mayoría de los compiladores emiten ensamblado o C. –

1

Tiene que haber un ángulo histórico para esto (mostrando mi edad) para los currículos en la escuela. Funcional era todo lo que tenía que aprender cuando comencé.

Pero dejando eso de lado, tienes que empezar en alguna parte, así que uno de ellos tiene que ser el primero. Si comienzas por imperativo, habrá cosas que alcanzarás que no estarán allí cuando aprendas funcional y tendrás que acostumbrarte a hacer las cosas de manera diferente. Si comienzas con funcional y pasas a imperativo, entonces tendrás que acostumbrarte a aprender nuevos conceptos/construcciones y recordar que están allí.

Cuando está programando, está intentando resolver un problema. Es bueno tener ambos en su caja de herramientas para llegar a resolver el problema en cuestión. Es por eso que creo que sería mejor comenzar con imerative y luego aprender funcional: si te encuentras buscando algo que no es indicativo de haber elegido la herramienta incorrecta para resolver tu problema.

Aparte de eso creo que es un lanzamiento.

0

Honestamente, creo que esta es la pregunta incorrecta para hacer.

Si el objetivo de una clase introductoria es enseñar informática básica, algoritmos, resolver problemas mediante programación, entonces su curso es fundamental y puede elegir uno basado en claridad, simplicidad y transmitir sus ideas. Algunos lenguajes funcionales serán geniales para esto. Particularmente si los estudiantes tienen poca o ninguna experiencia previa.

Normalmente, este no es realmente el objetivo de muchas clases introductorias. Pueden requerir ciertas técnicas o ciertos idiomas para un curso posterior. Es posible que deseen aprovechar bibliotecas particulares, etc. Puede que tengan que coincidir con la lista de casillas de otras "características".

Así que creo que quiere volver su pregunta en su cabeza. Averigüe qué es lo que el curso realmente está tratando de lograr, y elija el mejor idioma que pueda para ese fin. En algunos casos, este puede ser un lenguaje funcional.

Si lo que realmente está preguntando es cuál es la mejor manera de enseñar programación de nivel introductoria y ciencias de la computación, esa es una lata de gusanos diferente.

1

Estaba en una charla dada por la persona que está desarrollando Bootstrap (un currículo de programación actualmente administrado por Citizen Schools). Parecía pensar que el estilo de programación funcional proporcionaba un mejor fondo para el álgebra, ya que se basa en el concepto de funciones como procesos y objetos (con sus propias propiedades). (Por supuesto, los lenguajes de programación declarativos pueden tener funciones de primera clase, también, pero el enfoque no está en eso tanto).

Personalmente, creo que la enseñanza de la programación funcional primero vale la pena. El enfoque declarativo se enseña desde muy temprano en la clase de matemática, por lo que la programación funcional proporciona algunos conceptos nuevos que la programación declarativa no ofrece. Estoy de acuerdo con muchos de los carteles anteriores en que el hecho de que sea "demasiado difícil" es un mito, ya se ha hecho.

0

Creo que debería, sí.

Además, no hay aplicaciones de consola ni "mezcladores de paleta de colores", pero primero se realizan pruebas unitarias.

Solo si los estudiantes se portan bien y escriben casos de prueba con una cobertura extremadamente alta, PUEDEN que se les permita echar un vistazo rápido a cómo leer caracteres del teclado.

En mi opinión, la mayoría de las malas prácticas de codificación (códigos de olores, antipatrones) provienen de una ignorancia total hacia la teoría y las mejores prácticas.

Por lo tanto, enséñeles F # primero, prohíba el uso de la consola de E/S y GUI y solo use pruebas unitarias.

En segundo lugar, enséñeles el estilo mixto imperativo/funcional en un contexto OOP con uso completo y explicación de los patrones de diseño.

Luego, y ÚNICAMENTE, pueden intentar poner botones clicky en alguna parte, tal vez como recompensa. Pero la teoría y las buenas prácticas de codificación primero. De lo contrario, creamos la próxima generación de "RAD", víctimas que ni siquiera pueden usar indentación correctamente y confunden ctrl + c/ctrl + v para el desarrollo del software.

+0

somos una tienda de MSFT, pero ninguna persona en mi empresa usa F # o PowerShell. ¿Por qué empujar a la mierda a las personas? –

Cuestiones relacionadas