¿Por qué es Scheme mi primer idioma en la universidad?

80

Escucho sobre C, C ++, Java todos los días cuando las personas comienzan a hablar de informática, pero en mi primera clase de informática se nos pide que escribamos en Scheme (DrRacket).

¿Porqué es eso?

¿Qué diferencias hará esto para mi futura comprensión de la programación?

ACTUALIZACIÓN: He terminado mi primer mandato, pero no he terminado por completo con Scheme. En mi segundo mandato (que es ahora) ingresamos a la programación en C. Al principio fue frustrante aprender punteros, pero ahora me siento mucho mejor.

No hay mucho más que decir que eso. Estoy tratando de enseñarme Java (¿o C ++?) Para la parte de OOP que me falta. Hasta ahora, todavía me gusta más la programación funcional. Lambda es simplemente fascinante. :)

Erica Xu
fuente
148
Felicitaciones, parece (para mí) como si estuvieras yendo a una de las pocas escuelas que quedan que realmente trata de enseñar ciencias de la computación. El esquema de aprendizaje como primer idioma es (IMO) algo muy bueno. No, no es tan comercial como muchos otros, pero es un lenguaje excelente para aprender la verdadera esencia de la informática.
Jerry Coffin
21
C, C ++ y Java son subproductos de la industria de la informática. Las raíces completas de Scheme están en la informática. Los idiomas en uso comercial tienen tanto que ver con la informática como McDonalds tiene que ver con la cocina.
JasonTrue
33
Estos tipos son correctos; estás confundiendo la programación de computadoras con la informática ; como dijo Dijkstra, eso es como confundir la construcción del telescopio con la astronomía. Scheme trata sobre el mejor lenguaje que existe para aprender conceptos básicos en informática . Si espera que obtener un título en informática se trate de aprender a escribir aplicaciones de línea de negocio en Java, es posible que esté inscrito en el programa incorrecto.
Eric Lippert
29
Por la misma razón que los cursos de zoología enseñan biología evolutiva, anatomía y comportamiento animal en lugar de cómo eliminar un establo de elefantes
jk.
44
Una vez que tenga los pies debajo de usted con la comprensión de la sintaxis básica de Scheme, intente leer "The Little Schemer". Es un libro delgado, pero si puede comprender todo lo que contiene, tendrá una comprensión realmente sólida de los fundamentos de los lenguajes de programación funcionales.
Eric Lippert

Respuestas:

91

¡Suena como una gran escuela! Los dialectos de Lisp siguen el paradigma matemático de algoritmos mucho más de cerca. Forzan a los programadores a aprender la recursividad y el estilo funcional. Esta es una experiencia excelente. Su escuela está en las filas con MIT, que todavía usa a Abelson y Sussman para el CS 6.001 requerido.

Puede encontrar este artículo alentador y útil para comprender el problema.

Jonathan Henson
fuente
66
"Fuerza" probablemente no sea una buena palabra para usar. ¿Qué tal "tren"?
Barry Brown
44
En realidad, ha habido cambios radicales en el plan de estudios EECS del MIT en los últimos años. Su curso de introducción se divide en dos cursos ahora (ver mit.edu/6.01/mercurial/fall11/www/index.html para la primera mitad), y la mayoría de la instrucción de idiomas está en Python.
jonsca
44
Estoy de acuerdo en que Scheme es un gran idioma y es una buena idea aprenderlo. Sin embargo, seamos sinceros; casi todos los trabajos de programación del mundo real emplean un lenguaje imperativo; La mayoría de los trabajos de programación realmente serios requieren C ++, y los programadores de C ++ generalmente lo desalientan activamente a usar todas las buenas ideas basadas en matemáticas para el diseño de programas por una razón u otra. La recursión no jugará un papel importante en sus programas imperativos.
Felix Dombek
44
@FelixDombek, ¿estás seguro? Todas las ideas? De Verdad? Un bucle imperativo es una idea matemática también, eso sí.
SK-logic
3
@FelixDombek, solo puedo ver una razón para usar la iteración en lugar de una recursión de cola en C ++. Todas las otras formas de recursión se sirven exactamente de la misma manera que en las implementaciones de lenguajes funcionales. Así que no puedo estar de acuerdo con tu comentario en absoluto. Cuantas más matemáticas pongas en tu codificación C ++, mejor. Dudo que intentes implementar, digamos, árboles rojo-negros en C ++ sin recurrencia.
SK-logic
37

Nadie espera que, como estudiante de primer año, sea lo suficientemente competente en cualquier idioma para obtener un trabajo real, entonces, ¿por qué no comenzar con uno que sea fácil de aprender? Esperar que los principiantes aprendan programación usando un lenguaje profesional en un IDE profesional es como darle un bisturí a un estudiante de medicina de primer año y hacer que trabajen en cuerpos vivos.

No te preocupes eventualmente aprenderá Java / C / C ++, probablemente comenzando su segundo año. Si comenzó a aprender Java 6 ahora, para cuando se gradúe, Java 8 ya no estará disponible. O habrá sido reemplazado por Python. O algún otro idioma que aún no se haya inventado pero que asalte la industria. Es mejor posponer el aprendizaje de las cosas "populares" el mayor tiempo posible para que no sea obsoleto cuando salga de la fuerza laboral.

Scheme / Racket lo ayudará a enfocarse en los conceptos importantes: diseño de algoritmos, estructuras de datos y manipulación de información. Ya sabes, las cosas que son comunes a todos los idiomas.

Barry Brown
fuente
36

Felicitaciones, ahora te estás convirtiendo en el equivalente de un vegano en el mundo de la informática, y en dos años no podrás terminar ninguna discusión sin informar a la gente sobre el fundamento moral más elevado en el que te pones de pie. ;)

De todos modos, conseguiste una muy buena escuela. Las escuelas que no son azotadas por la industria son buenas.
Como alguien más dijo, te enseñan la ciencia, de la cual derivas el oficio .

Muchas granjas de monos de código malos le enseñan el oficio, y luego puede llegar a inferir la ciencia de él, pero no está garantizado. (y puede terminar con ideas erróneas bastante raras al respecto)

De todos modos, como miembro honrado de la multitud funcional, cuando salgas de allí, siempre te sentirás incomprendido y subestimado .

Lo cual, admitámoslo, para el asistente informático promedio no es nada nuevo.

Ahora tiene un alto riesgo de:

  • tratando de terminar en una carrera académica ,
  • embarcarse en la búsqueda de un doctorado ,
  • ... emacs .

Probablemente también le gustará el código abierto, pero nunca encontrará suficientes colaboradores para sus proyectos funcionales.

ZJR
fuente
2
Lo siento, comentar necro, pero ¿por qué emacs? Soy curioso. Estoy en el mismo barco que OP (comenzando el primer año de la universidad este otoño) y vamos a usar Racket (similar a Scheme).
Kevin Johnson
2
@KevinJohnson emacs se refiere con frecuencia como un sistema operativo escrito en LISP que accidentalmente ayuda a muchas personas a editar el código . Si hace paradigmas funcionales y (se les enseña) que les gustan las obscenidades de las sintaxis tipo LISP, es probable que crezca en usted como su editor de texto preferido.
ZJR 01 de
1
"Te enseñaré la ciencia, de la cual derivas el oficio": +1
Giorgio
23

¿Qué diferencias hará esto para mi futura comprensión de la programación?

Eso es un poco como preguntar cómo leer a Shakespeare te ayudará a escribir trabajos académicos. La programación (en cualquier idioma) es solo un medio para expresar sus ideas en forma ejecutable. La informática proporciona los bloques de construcción conceptuales que le darán algo interesante que decir. La sintaxis del esquema es relativamente simple, por lo que puede obtener ideas interesantes rápidamente y sin encontrarse con muchos errores de compilación, bibliotecas estándar, etc.

Presta mucha atención en clase: aprenderás muchas cosas interesantes este semestre.

Caleb
fuente
14

Parece que eres muy nuevo en la programación y no tienes experiencia previa. Aquí hay algunas aclaraciones:

¿Por qué Scheme y no C / C ++ / Java ...?

Cuando el aprendizaje de un lenguaje de programación (una analogía se podría hacer con el idioma Inglés) se aprende la sintaxis que debe seguir para que su código es gramaticalmente correcta. Sin embargo, un lenguaje no le enseñará la lógica detrás de la resolución de problemas. Para aprender esa lógica, aprendes diferentes paradigmas de programación .

Cada idioma puede implementar (más o menos exactamente) uno o más paradigmas. Un paradigma es una forma de estructurar su lógica, y el paradigma implementado por Scheme se llama Programación Funcional (FP).

Entonces, la verdadera pregunta que hace es: ¿Por qué FP?

Como mencionó, C, C ++ y Java (que no implementan FP) son mucho más populares. De hecho, (y por varias razones, todos tienen su opinión) FP no es muy popular en la industria.

Por otro lado, FP es muy apreciada en los círculos académicos. Está más cerca del enfoque matemático común, se enfoca más en la capacidad de prueba y la optimización de algoritmos, y la mayoría de la gente estará de acuerdo en que lo convertiría en un mejor programador en general.

Es similar a las escuelas que enseñan latín para estudiar literatura inglesa.

rahmu
fuente
1
El esquema no tiene que usarse funcionalmente, aunque es más probable que lo haga que en C, C ++ y Java.
Ricky Clarkson
"Es similar a las escuelas que enseñan latín para estudiar literatura inglesa". O a las clases de sistemas operativos que enseñan un sistema operativo tipo Unix en lugar de otros sistemas operativos más extendidos.
Giorgio
11

Se supone que debes aprender cómo se realiza la programación y cuáles son los conceptos básicos. Los lenguajes cotidianos utilizados en la mayoría de las empresas pueden ser adecuados para producir el software que se necesita hoy en día, pero no son necesariamente los más adecuados para enseñarle las bases de la programación.

Una vez que haya comprendido los conceptos, es fácil aplicarlos a otros idiomas.

perdian
fuente
44
"Los idiomas cotidianos utilizados en la mayoría de las empresas podrían ser adecuados para producir el software que se necesita hoy en día" - Considerando el costo típico, la calidad y las tasas de éxito, esa es una declaración bastante optimista :-)
Jörg W Mittag
Eso es definitivamente cierto! Es por eso que escribí "might" en lugar de "are" :-)
perdian
1
"Una vez que haya comprendido los conceptos, es fácil aplicarlos a otros idiomas". - Esta afirmación es muy cierta. Sospecho que me tomaría aproximadamente una semana captar la sintaxis en casi cualquier idioma nuevo y ser competente. Me enseñaron C / C ++ y Asamblea en la escuela, pero me enseñé Python a un lado y Lisp para un proyecto de investigación. Sin la comprensión fundamental que obtuve de Python, Lisp y Assembly, dudo que sería casi el programador que soy hoy.
Wayne Werner
9

Si está aprendiendo con DrRacket, apuesto a que también está utilizando el plan de estudios Cómo diseñar programas.

Esto es lo que uno de los autores (ciertamente sesgados) de HtDP tiene que decir acerca de cómo la enseñanza de Scheme ha preparado a los estudiantes de pregrado en la Northeastern University para el programa de educación cooperativa ("cooperativo": estudiantes alternan semestres de estudio académico con semestres de tiempo completo empleo).

Antes de mi llegada, Northeastern había estado utilizando un plan de estudios estándar durante dos décadas: tres términos del lenguaje actualmente de moda (Pascal, C ++, Java), utilizando un conjunto de ejercicios extremadamente ricos en gráficos entrelazados con lecciones sobre aplicaciones prácticas. El plan de estudios fue ampliamente publicado en SIGCSE y comunidades relacionadas, pero no funcionó. En el apogeo de la burbuja web, solo alrededor de un tercio de los estudiantes obtuvieron cooperativas de programación; la mayoría de los demás terminaron como "técnicos" como se llamaban a sí mismos: mover computadoras, ejecutar scripts, configurar enrutadores y redes, etc. Y toda esta educación cuesta $ 150,000 en matrícula.

Después de un año en Northeastern, nuestro decano me pidió que tomara el primer curso. La primera instancia fue un éxito, contrario a las predicciones de algunos profesores locales. A pesar de que se había considerado una prueba, ¡cambiamos al TeachScheme! plan de estudios de forma permanente; el decano sugirió que diseñara un curso puente para conectar el curso HtDP con el resto del plan de estudios; Esto comenzó mi colaboración en HtDC con Viera Proulx. Vea la posdata a continuación. En un par de años, comencé a escuchar de nuestra facultad cooperativa que la cantidad de puestos de programación estaba aumentando. En 2007, la última vez que participé en el curso, me dijeron que la proporción de programación en la primera cooperativa aumentó a dos tercios y más. Mientras tanto, todo TeachScheme! los cursos han sido impartidos por numerosos miembros de la facultad con estilos de enseñanza y personalidades bastante diferentes a los míos La proporción de cooperativa de programación ha aumentado a tres cuartos y más, y todo el profesorado intermedio está contento con las habilidades de programación de los estudiantes.

Editar: para aquellos muy interesados ​​en lo racional detrás del plan de estudios, aquí está la explicación del arquitecto principal: http://www.youtube.com/watch?v=m3be1PHW5X0

pidge
fuente
6

Mi escuela comenzó con Scheme también. Una razón que se mencionó fue que esto ayudó a nivelar el campo de juego. La mayoría de las ciencias comp. De primer año pueden tener una exposición parcial o mucho mayor a idiomas más comunes. Era menos probable que cualquier persona tuviera mucho conocimiento de Scheme.

fader oscuro
fuente
44
Estoy de acuerdo; Comencé CS conociendo Pascal, C, Basic, x86 Assembler, mientras que otros tenían experiencias en diferentes idiomas o ninguno. Nos presentaron a ML, que no solo nadie tenía experiencia previa, sino que tenía un paradigma tan extraño que era como comenzar de nuevo incluso para los más experimentados entre nosotros. Más tarde, creo que ML (el paradigma funcional) es lo más útil que aprendí en CS.
KaptajnKold
6

En realidad, como Lisp (el esquema es un dialecto) es la Gran Dama de los lenguajes funcionales (piense en F #, Groovy, Clojure, Haskell, etc.), esta capacitación tampoco lo deja en ningún tipo de desventaja comercial, ya que esta es la mejor tema en el bloque de desarrollo en este momento.

adrianmcmenamin
fuente
4

Scheme lo ayudará a mejorar y pensar de la manera adecuada para usar lenguajes de programación funcionales. Scala, por ejemplo, es un híbrido funcional / OO que es bastante brillante, aunque un poco denso. Sin embargo, idiomas como este marcan el futuro, con suerte.

Sin embargo, los lenguajes tipo Lisp tienen una pureza y simplicidad en su diseño que los hace un poco más fáciles de enseñar. Sin embargo, el buen beneficio es que después te resultará mucho más fácil aprender algo como Scala.

egervari
fuente
3

Completamos Scheme en la primera y primera mitad del segundo semestre. No fue hasta que empezamos a trabajar con C que comencé a darme cuenta del poder de Scheme.

En cuanto a su pregunta, por qué se elige Scheme: la respuesta es que es uno de los idiomas más simples y le permite hacer mucho (especialmente cuando comenzamos a jugar con listas perezosas más adelante). Por otra parte:

  1. Para las personas que no tienen experiencia en programación, es más fácil de aprender. No hay muchos detalles técnicos y solo algunas formas especiales.
  2. Permite una abstracción de nivel superior. Un buen curso puede centrarse en enseñar a los programadores cómo pensar en lugar de centrarse en los detalles técnicos que permiten a los estudiantes convertirse en mejores programadores.
  3. Las listas son asombrosas. Hay tanto que puedes hacer con ellos. Car y cdr demuestran ser herramientas poderosas y es solo cuando comienzas a trabajar con punteros que te das cuenta de que Scheme fue increíble en el manejo de listas.
Aviar78
fuente