El debate sobre el primer lenguaje de programación: la decisión final

Algunos se relacionan con el debate sobre la elección del primer lenguaje de programación algo como esto:



dicen que un millón de factores afectan la elección y no tiene sentido discutir sobre esto. Sin embargo, los holivars continúan.

Vitaly Bragilevsky decidió ponerle fin y presentó la decisión final en Saint AppsConf . Después de leer el artículo (o ver el informe), sabrá cómo responder correctamente a familiares o conocidos que han aprendido cuánto ganan en TI y que el control remoto no es un obstáculo, y ahora se preguntan por dónde empezar.


Vitaly Bragilevsky trabaja en JetBrains y enseña en la Universidad Estatal de San Petersburgo en la Facultad de Matemáticas y Ciencias de la Computación, miembro del Comité Haskell para la Normalización del Lenguaje de Programación y del Comité de Desarrollo del Compilador Haskell Glasgow Haskell, autor del libro Haskell in Depth.

Entonces, descubramos cómo comenzar a aprender programación, ¿qué herramientas usar? De hecho, este es un tema importante.
Dijkstra escribió en 1972: "... las herramientas que estamos tratando de usar y el lenguaje o la notación que estamos usando para expresar o registrar nuestros pensamientos son los principales factores que determinan lo que podemos pensar o expresar."
A menudo, el lenguaje de programación (y el lenguaje en general) simplemente no nos permite hacer lo que queremos, o no lo hace de la manera que queremos. El idioma es una herramienta importante, y su elección debe tomarse en serio.

Si comete un error en esta elección (o más a menudo alguien toma una decisión por el alumno), las consecuencias pueden ser graves. Así es como aparecieron los programadores:

  • mimado por Fortran;
  • afectado por BASIC;
  • C ++ aplastado;
  • Java estrangulado.

De ahí las bromas de que un verdadero programador de Fortran puede escribir un programa de Fortran en cualquier idioma. O historias sobre chicos que están en el primer año plagados de C ++, y luego ya son imposibles de convertirse en programadores, solo ellos saben cómo <y >escribir.

Como vemos a esas personas, es lógico suponer que el primer lenguaje de programación influye de alguna manera .

Tengo una historia personal al respecto. Mi primer lenguaje de programación fue Fortran, excepto por el viaje infructuoso a una conferencia básica, en la que el maestro ya hablaba de matrices, y como principiante, todo era incomprensible para mí y me desanimó a continuar. Luego fui a la biblioteca, tomé un libro de Fortran y comencé a realizar ejercicios de programación en una hoja de papel. Para ser honesto, fue aún más conveniente para mí, pero el compilador no lo jura.

Antecedentes


Comenzaré con el llamado problema de Richard Vekselblat. Este hombre es conocido por ser su primer doctorado en informática. En 1980, escribió un artículo sobre las consecuencias de elegir el primer lenguaje de programación ( Richard L. Wexelblat. Las consecuencias del primer lenguaje de programación. Actas del 3er simposio ACM SIGSMALL y el primer simposio SIGPC sobre sistemas pequeños, 1980 ).

Todo comenzó en 1978, cuando Richard escribió una carta a la revista con el provocativo titular "Errores de la juventud, o es básico básico malo para su salud?" Las respuestas a esta carta sirvieron como material para el artículo.


Basado en puntos de vista recurrentes, Richard Vekselblat llegó a las siguientes conclusiones:

  • , (Pascal, PL/C) , (COBOL, FORTRAN). .
  • , . — , .
  • , , . .

Por supuesto, este fue un estudio muy ingenuo, sin tener en cuenta los factores sociológicos, sin embargo, y nos permitió sacar algunas conclusiones.

Habiendo estudiado la historia del asunto más profundamente, estaba convencido de que había cientos de estudios dedicados a la elección de un lenguaje de programación. Incluso hay trabajos que resumen el trabajo sobre la elección de las armas nucleares, por ejemplo: Kevin Parker, Bill Davey. La historia de la selección del lenguaje informático. (En Arthur Tatnall. Reflexiones sobre la historia de la informática: preservar recuerdos y compartir historias, AICT-387, Springer, pp. 166-179, 2012, IFIP Avances en tecnología de la información y la comunicación (ENCUESTA)) .

Los autores, basándose en una extensa bibliografía, identifican factores que afectan la elección del idioma, no solo para la enseñanza, sino también para la implementación de proyectos:

  • : , ( ). , .
  • : ( 150 «Hello world!» 500 IDE); problem-solving, ; .
  • : (, 2000- ); .

Muchos expertos están involucrados en la comparación de idiomas, en particular con respecto a qué tan bien son adecuados para el estudio inicial. Linda Mannila y Michael de Raadt en su artículo "Una comparación objetiva de idiomas para la enseñanza de la programación introductoria" formularon grupos de criterios para evaluar PL:

  1. Aplicabilidad en la formación.
  2. Lenguaje y entornos de desarrollo.
  3. Soporte y disponibilidad.
  4. Usar fuera del curso introductorio.

Armados con estos criterios, Linda Mannila y Michael de Raadt compilaron una tabla de comparación de idiomas.



En el original, cada criterio tiene características adicionales que no son tan importantes para nosotros. Estamos interesados ​​en el hecho de que los líderes en la calificación final de Autores son Python y Eiffel , un lenguaje que difícilmente se puede llamar popular.

Al principio, esperaba clasificar el YP de acuerdo con estos criterios y sacar mis propias conclusiones, pero, mirando la columna de Haskell, ¡encontré mentiras sobre cada elemento! Y decidió que la tabla no tiene nada que ver con la realidad: esta es una comparación tan "objetiva".

Tras reflexionar, llegué a la conclusión de que tal comparación no tiene sentido. Supongamos que agregaría una columna con Kotlin y marcaría cada elemento, o no. Eso no significaría absolutamente nada.

Entonces decidí ver qué se usa para el entrenamiento, de hecho. Aquí la imagen es diferente.


Fuente de datos .

El hecho de que los datos de 2014 no lo confundan, ya que los sistemas de educación superior están cambiando muy lentamente y el panorama general no ha cambiado mucho por ahora.

Python todavía está en primer lugar, Java: refleja las solicitudes de Oracle, Sun Microsystems y otras compañías para aprender este idioma. Entre las universidades que comienzan a enseñar programación en C ++ están probablemente la Universidad de Texas: Björn Straustrup lee el curso inicial allí y, creo, los estudiantes lo hacen bien.

Muchos idiomas de interés para la comunidad académica no cayeron en esta calificación, en particular:

  • PL funcionales con tipificación estática de Haskell y ML, popular entre los investigadores.
  • Ampliamente utilizado en desarrollo web, con tipeo dinámico de JavaScript, Ruby, PHP.
  • Lenguajes industriales específicos de plataforma Objective-C y C # / Visual Basic.

Con esto último, es comprensible que históricamente las universidades no quieran lazos rígidos con nada.

La voz de la gente


Después de estudiar la historia del problema, decidí averiguar la opinión de los desarrolladores modernos a través de una encuesta en Twitter . La pregunta se formuló de la siguiente manera: "¿Qué propiedad de un lenguaje de programación considera más importante al elegir el PRIMER lenguaje para enseñar programación?" Y propuso opciones de respuesta que son bastante fáciles de correlacionar con idiomas específicos.

Dadas todas las características técnicas de las encuestas en twitter, los resultados son los siguientes.



Más de la mitad de los encuestados dijo que la simplicidad es lo principal. El 25% que respondió prevalencia aparentemente piensa que deberíamos pensar inmediatamente en la demanda en el mercado. Un alto porcentaje de personas que piensan que primero debes lidiar con los punteros es alarmante. Y el hecho de que solo el 8% para un conjunto rico de bibliotecas muestra que el primer idioma aún no debe diseñarse para hacer algo real.

Respuestas a encuestas


Daré algunas opiniones interesantes de la discusión de la encuesta.

Dmitry Kovanikov ( @ChShersh ), un desarrollador y profesor experimentado, expresó una serie de consideraciones importantes, con las cuales estoy completamente de acuerdo: “ Alto nivel e interactividad. Para obtener el resultado del programa y poder verlo, fue posible con un número mínimo de pasos. La programación no se trata de crear variables, bucles o recursiones, se trata de resolver problemas con los medios de PL ".

Artyom Pelenitsyn ( @ ulysses4ever ) señaló el componente metodológico: "La presencia de herramientas metodológicas especializadas (libros de texto, libros de tareas, tutoriales, foros de preguntas y respuestas) y técnicas (IDEs simples e inteligibles con una interfaz minimalista, steppers / depuradores con GUI)".

Andrei Miskov ( @andreymiskov ) recordó otro factor importante: “ Previsibilidad : no se distraiga con nulo / indefinido y 0.1 + 0.2. Aumento gradual de oportunidades: no hay POO ni mutaciones hasta que domine los datos y las funciones. Como en Racket / HtDP o Pyret / PAPL ".

Se encontraron defensores de C: “Personalmente, creo que C fue y sigue siendo el mejor para un estudio más fundamental. En mi opinión, la sintaxis es simple y bastante intuitiva , y hay muchos conceptos diferentes (memoria, punteros, pila, asignaciones). Solo un PERO, de ninguna manera C89, al menos C99, pero mejor C11 ".

Había referencias a Scala y Rust, y en el contexto de la mecanografía y la simplicidad. Lo que nos hace pensar que, desafortunadamente,lenguajes de programación como sectas totalitarias . Tienen seguidores que, a pesar de todo, promueven su idioma favorito y no quieren escuchar las críticas (y, en general, las opiniones de otras personas).

Un vívido ejemplo de tal "sectarismo" es el debate sobre cómo designar la asignación "=" o ": =". Esta disputa ya tiene más de 40 años, hay artículos dedicados solo a este tema. Y esta es solo una de las razones de cientos de estos "temas importantes".
No holivarit: popularice su idioma, pero no actúe como adherente de sectas totalitarias.

Diferencias entre lenguaje industrial y educativo.


Casi hemos llegado a encontrar la solución final en el problema de elegir el primer idioma. Solo queda determinar cómo el lenguaje educativo difiere del industrial.

Primero, en un lenguaje industrial, siempre hay muchas formas de lograr el mismo objetivo.

En segundo lugar, los mensajes de error en lenguajes industriales tienen como objetivo garantizar que el profesional comprenda rápidamente cuál es el problema y lo corrija. Como resultado, contienen mucha información técnica útil para un especialista, que un principiante puede asustar y confundir. Este aspecto a veces hace que sea imposible utilizar un lenguaje profesional para la enseñanza. Si alguna vez has visto mensajes de error en C ++, entonces entenderás de lo que estoy hablando.

Y finalmente, los objetivos son diferentes. Por ejemplo, la velocidad es importante en la operación industrial, pero no importa mucho cuando solo domina la programación.
Aprender YP cuando sabes programar es fácil. En el problema con el primer idioma, tienes que aprender a programar, y esto es más difícil.
Sobre el tema de la programación de la enseñanza como tal, también hay libros, por ejemplo.



En un libro muy clásico (solo mire la portada), "La estructura e interpretación de los programas de computadora", uno tiene la impresión de que la programación es una actividad mágica, y de los programadores como magos con habilidades excepcionales. Esto, por supuesto, es una mentira completa.

La portada del segundo libro, Cómo diseñar programas, refleja un enfoque completamente diferente: la ingeniería. Me gusta mucho más, y creo que necesitas aprender a programar como cualquier otro negocio de ingeniería.

Hay varios principios importantes en Cómo diseñar programas que necesita aprender cuando aprende programación:

  • Cómo leer el enunciado del problema e identificar en qué componentes debe consistir la solución.
  • Cómo transferir una tarea a la estructura del programa.
  • , , .
  • , .

Beginning Student Language


Para implementar estos principios, al autor del libro Matthias Felleisen se le ocurrió la idea de los idiomas para el aprendizaje. Estos son idiomas que están ampliando gradualmente sus capacidades.

Todo comienza con BSL - Principio del lenguaje del estudiante - en el que solo existe el mínimo necesario: definición de función, llamada a función, operación condicional, aritmética. Y luego, junto con las tareas, el lenguaje crece gradualmente, se agregan construcciones como listas, recursión y funciones de orden superior. Poco a poco, con la ayuda del lenguaje, ya SL, se hace posible resolver problemas más complejos. Esta cadena termina con el lenguaje Racket de la familia Lisp, que es el cierre de todos los anteriores y permite al programador implementar cualquier cosa.

Así es como se ve un programa de primaria en el entorno DrRacket para un estudiante principiante.


Pyret


Shriram Krishnamurthi et al. Propusieron otro enfoque para la programación de la enseñanza. Crearon el lenguaje Pyret y publicaron el libro Lenguajes de programación y programación, porque, repito, nadie aprenderá el idioma sin materiales de capacitación.

Presta atención a los títulos de algunos capítulos de este tutorial:

  • Introducción a los datos tabulares (4)
  • Juegos interactivos como sistemas reactivos (11)
  • Ejemplos, pruebas y verificación de programas (12)
  • Gráficos (19)
  • Programas de procesamiento: análisis (23)
  • Razonamiento sobre los programas: una primera mirada a los tipos (27)
  • Objetos: interpretación y tipos (32)

En el capítulo 11, al final del primer mes de entrenamiento, enseñan a escribir juegos interactivos como sistemas reactivos. El programa completo está diseñado durante aproximadamente seis meses y los objetos y sistemas de tipos se introducen casi al final.

El lenguaje Pyret está construido de tal manera que es posible ir de acuerdo al plan sin mirar hacia el futuro. En él, de hecho, puede programar todo lo que ocurre antes del capítulo 27, sin saber que hay tipos en el idioma. Y en el capítulo 27 resulta que hay una escritura estática y puedes usarla. Este lenguaje fue creado específicamente para moverse de principio a fin, introduciendo gradualmente nuevos conceptos en circulación.

A continuación se muestra un programa de ejemplo en Pyret y el entorno en el que se utiliza este lenguaje.


Por ejemplo, las pruebas que están integradas en un programa (bloque where:) son una parte esencial de la sintaxis. La documentación también está incrustada en la sintaxis ( doc:). Tales construcciones útiles son de nivel superior en el lenguaje y su uso se inculca en el proceso de aprendizaje.

Codeworld


La idea de una implementación gráfica simple se implementa en el entorno CodeWorld. Tiene su propio idioma, pero puede usar Haskell e inmediatamente obtener algo hermoso; para principiantes es atractivo.


PascalABC.NET


Nuestra respuesta BSL y Pyret se están desarrollando en SFU en Rostov-on-Don Stanislav Mikhalkovich y sus estudiantes.

Este es un Pascal que no está desactualizado. Contiene, por ejemplo: foreach, descripciones de variables intrabloque, caso por líneas, enteros largos, clases y rutinas generalizadas, interfaces, sobrecarga de operaciones, expresiones lambda, excepciones, recolección de basura, métodos de extensión.

Algunas cosas de .NET aparecen allí incluso antes que en C #. Es decir, en el familiar envoltorio de sintaxis Pascal, es un superlenguaje con acceso completo a las características de la plataforma .NET. Implementa conceptos modernos desde el punto de vista del desarrollo de armas nucleares.


Arriba en la captura de pantalla, el programa de 120 líneas maravillosamente y con animación recoge las torres de Hanoi.

Decisión final


El lector astuto ya ha adivinado que no hay una solución final a la cuestión de elegir el primer lenguaje de programación. Ni yo ni nadie más lo tiene. Y esto es bueno: en informática no necesitamos libros de texto de historia uniformes que indiquen el único punto de vista correcto.

Al comienzo del artículo descubrimos qué es más importante, cómo aprender que en qué idioma. Sin embargo, hay formas de comenzar a estudiar la programación más correctamente desde el punto de vista del desarrollo futuro.

Es mejor comenzar con un lenguaje que sea más adecuado para esto: Racket, Pyret, Python, PascalABC.NET. Lo principal es que la etapa inicial, este primer idioma, sentó las bases para el desarrollo futuro.



Desde los lenguajes de primer nivel en este esquema, será fácil cambiar a algunos de los lenguajes industriales o académicos básicos: JavaScript, C, C #, Java, Haskell, OCaml, F #. Pero si comienzas de inmediato con JavaScript, obtienes un programador Fortran de una nueva manera, que luego escribirá en todas partes como en JS, y será terrible. Y si se trata de un segundo idioma, no se producirá dicha deformación.

Además, cuando se establecen los cimientos en un área determinada, se abren un millón de oportunidades. Solo algunos de ellos se muestran en el diagrama.

Es posible que no necesite saber muchos idiomas en este momento. Especialmente si eres un desarrollador móvil. Pero todas las plataformas tarde o temprano se vuelven obsoletas, y cuando esto sucede, resulta que se beneficiará la que tenga un fondo más amplio y que conozca más idiomas de diferentes áreas.

Si revisa los idiomas del nivel inferior del esquema y representará aproximadamente su dispositivo, esto lo convertirá en el mejor desarrollador en cualquier idioma.

Si (y de qué otra manera, lo leyó en Habré) ya ha comenzado con éxito la carrera de desarrollador, ha profundizado en cualquier área y ahora quiere saber qué está sucediendo fuera de él y hacia dónde dirigir su atención, únase al festival RIT ++ en línea . Allí, en dos días (25 y 26 de mayo), puede obtener una porción de toda la industria de TI, y en las clases magistrales del 27 de mayo al 10 de junio, puede desarrollar habilidades individuales.

All Articles