Es una especie de error enseñar a los programadores principiantes un lenguaje que se usa profesionalmente: les hace pensar que pueden aprender un idioma y luego obtener un trabajo escribiendo código profesional en ese idioma, mientras que tener programadores con ese tipo de competencia general limitada es uno de las razones por las que el estado del software es tan pobre.
Cuando doy recomendaciones para programadores principiantes, sugiero que aprendan Lua primero. Lua es, semánticamente, similar a Python, pero es bastante más simple y también carece de algunas de las idiosincrasias que hacen de Python un lenguaje muy extraño (como la sangría es sintácticamente significativa). Lua no hace una distinción entre diccionarios y objetos, por lo que es una buena puerta de entrada a JavaScript. Es trivial implementar un prototipo-modelo-objeto de estilo JavaScript en Lua, y a menudo la mejor manera de entender una característica de lenguaje es implementarla. tú mismo. Lua está escrito en puro ansi C y es trivialmente extensible en C, además de tener una implementación bastante pequeña y limpia, lo que la convierte en una buena puerta de entrada a C. Lua tiene una biblioteca estándar muy pequeña, por lo que el riesgo de pasar todo el tiempo aprendiendo Las llamadas a la API en lugar de las funciones básicas del lenguaje son pequeñas. A pesar de todo esto, el uso de Lua en el mundo profesional se limita principalmente a extensiones para otros proyectos. Básicamente, no puede salirse con la suya al aprender solo a Lua y conseguir un trabajo, porque cada posición de Lua también requiere otro idioma.
Aprender C para comenzar es probablemente un error. Es relativamente fácil escribir código malo, inestable e inseguro en C sin darse cuenta. A medida que los procesadores se vuelven más rápidos, los lenguajes como C se vuelven menos importantes porque se pueden realizar más clases de problemas en los lenguajes de nivel superior que antes solo eran útiles para la creación de prototipos. En estos días, se está realizando un análisis legítimo a gran escala de los datos en Python (lo cual es de alguna manera). hilarantemente ineficiente: como lo demuestra la existencia de PyPy, un intérprete de Python en Python que es más rápido que Python normal porque aprovecha las enormes y típicamente inesperadas diferencias de eficiencia entre diferentes métodos para hacer lo mismo, como que x + x es el doble rápido como 2 * xy ocho veces más rápido que x << 1). Un programador completo será competente en C, pero comenzar en C es una barrera para llegar a ser competente en él.
Muchas escuelas (tanto escuelas secundarias como universidades) enseñan Java como primer idioma. Java no lo alienta a hacer garabatos en toda la memoria principal como lo hace C, pero tiene sus propios problemas. Es demasiado complicado. Es un nivel demasiado bajo para ser un sustituto aceptable de los lenguajes de secuencias de comandos para el desarrollo rápido, sin embargo, tiene demasiadas restricciones de tipo HLL para tener capacidades o rendimiento comparables a los que podría obtener (por ejemplo) C ++ o D (dos idiomas con la misma forma Orientada a Objetos / Procesos que tiene Java, con una sintaxis similar y reglas de herencia similares). Puede escribir un sistema operativo en C ++ o D si primero destruye la biblioteca estándar; En Java, esta es una tarea más difícil, porque Java cree que no se puede confiar a los simples humanos con punteros mutables. En última instancia, Java es un híbrido situado en un nivel de abstracción de utilidad limitada para cualquier persona, excepto las grandes empresas, que aman a Java porque su burocracia de objetos refleja perfectamente la organización, en gran medida disfuncional, de corporaciones que son demasiado pesadas para innovar realmente. Las personas que aprenden Java como primer lenguaje obtienen Java-itis: piensan que Java representa el ideal de la orientación a objetos, el ideal de los lenguajes tipo c, el ideal de los lenguajes con recolección de basura, el lenguaje ideal de resolución general para cualquier cosa. Entran en el campo y hacen todo en Java, y luego nunca aprenden otro idioma, ya que Java se adapta aproximadamente a todas las tareas comunes, por lo que nunca tienen el indicio de que algún otro idioma pueda facilitar ciertas tareas. (También hay problemas didácticos en la enseñanza temprana de Java. Java hace que ciertas cosas que deberían ser muy fáciles sean muy difíciles, como la entrada directa desde un teclado o desde un archivo. Por lo que entiendo, estos problemas se han solucionado un poco desde que tuve para aprenderlo en la escuela, pero cuando estaba aprendiendo Java por primera vez, la forma más fácil de leer una línea de entrada de un usuario era crear seis objetos para poder manejar uno de ellos que podía leer líneas desde la fuente.)
C ++, en gran parte, sufre la mayoría de los mismos problemas que Java, además de la mayoría de los mismos problemas que C; como resultado, recomendaría enseñar eso a los principiantes incluso menos, aunque considero que es un lenguaje más útil profesionalmente porque no impone sus extrañas preferencias a través de un compilador. Enseñar C ++ como primera lengua es raro en estos días, pero era algo común en los años 90. Ya que estamos hablando de personas que enseñan a Pascal y BASIC como primer idioma en la escuela secundaria, algo que se detuvo más o menos por completo al mismo tiempo que la enseñanza de C ++ y la enseñanza de Java comenzaron (es decir, hace unos 15 años), esto es probablemente vale la pena decir.
Hay un conjunto de universidades que enseñan esquema primero. Me alegro de que no estén enseñando algo común, al menos. El esquema tiene el beneficio de que su uso profesional es muy limitado. Sin embargo, parte de eso se debe a que el estándar del esquema es realmente ambiguo, hasta el punto en que la portabilidad de los programas del esquema entre implementaciones que cumplen con el estándar es extremadamente baja. El esquema difiere demasiado de otros idiomas en el uso común como para ser particularmente útil como punto de partida. Sin embargo, las universidades que enseñan en el esquema en primer lugar tienden a ser las que solo toman a estudiantes que son expertos programadores desde la infancia o que son altamente talentosos y altamente motivados. Para los simples mortales, es probable que sea un error enseñar primero el esquema: muchos estudiantes tendrán el mismo problema que mucha gente hizo con el básico: aprendieron un idioma, pero a pesar de que no pueden usarlo, el abismo entre lo que saben y un lenguaje que pueden poner en su currículum es demasiado grande, por lo que se detienen después de algunos intentos y pasan el resto de su vida escribiendo el código en el primer idioma que aprendieron o ningún idioma en absoluto.
No recomendaría Python como primera lengua, aunque es una mejor lengua materna que muchas de las que se enseñan con frecuencia. Python perpetúa la división clase vs objeto frente a diccionario que C ++ y Java tienen, una división totalmente artificial que a veces es útil para proyectos grandes y complicados de varias personas, pero solo interfiere con la OO simple. Python tiene una enorme biblioteca estándar, y es muy fácil para los programadores principiantes aprender de memoria una serie de llamadas a la API de tipo libro de cocina para hacer algo llamativo e interesante y no darse cuenta hasta que es demasiado tarde que nunca se preguntaron a sí mismos qué eran esas llamadas. realmente funciona o cómo se implementó la API detrás de escena y, por lo tanto, no pueden transferir sus habilidades a algún otro idioma donde esa API en particular funciona de manera diferente o falta. Python fomenta una combinación de estilos de orientación a objetos, procedimientos y funcionales, y si bien es una buena idea entender todos estos estilos, probablemente sea un error mezclarlos de forma idiomática específica para un solo idioma antes de tener la experiencia de diferenciarse. ellos. Python tiene un conjunto de idiomas extremadamente fuerte y complejo, con complicadas razones técnicas e históricas detrás de ellos, y es demasiado fácil para los programadores principiantes aprender estos idiomas de forma remota y luego quedarse atascados cuando el mismo idioma no existe en otro idioma.
En cuanto a Haskell, estoy preocupado por esto. Haskell tiene un montón de los mismos problemas que Scheme, pero en realidad es más común usar Haskell para “proyectos reales”, y muchos nuevos lenguajes tienen una sintaxis y características similares a las de Haskell (Julia me viene a la mente). Haskell es un problema porque requiere que los estudiantes que aún no han aprendido qué es una variable o un bucle, y que les enseñen sobre las mónadas, la recursión de la cola, los generadores y los thunks. Al igual que New Math, se debe argumentar que tal vez enseñarles primero estas ideas abstractas los llevará a pensar sobre la codificación de una manera abstracta y, en última instancia, les permitirá escribir mejor código al razonar más claramente. Creo que, en la práctica, descubrir qué es un bucle es lo suficientemente difícil para los principiantes, que muchos de ellos solo quieren hacer un videojuego simple y les gustaría aprender lo mínimo posible para dibujar fichas y sprites, y se desanimarán. cualquiera que quiera que aprendan a pensar claramente sobre la inversión de la función o el cierre diferido de las listas infinitas antes de eso.