Cómo dominar los lenguajes de programación
Las personas que aprenden lenguajes de programación suelen tener la siguiente psicología, por lo que sienten que tienen un sinfín de cosas que aprender, o que están en el camino equivocado. A continuación analizaré brevemente esta psicología, esperando aclarar algunas dudas.
1. Buscar un “nuevo lenguaje”.
La filosofía básica nos dice que las cosas nuevas no son necesariamente "cosas nuevas", pueden ser un retroceso histórico. Los hechos han demostrado que muchos de los idiomas emergentes son peores que los que han existido durante mucho tiempo. Seamos realistas, ¿cuántos "conceptos nuevos" en los idiomas modernos no existen en algunos de los idiomas más antiguos? Los lenguajes de programación son como productos básicos y, en realidad, todas las empresas hacen publicidad. Y la gran mayoría de los diseños, incluidos los conceptos de algunos de los lenguajes más "difíciles" y "teóricos", pueden ser superficiales y de corta duración. Si no puedes ver a través del diseño de estas cosas, quedarás cegado por ellas. El entusiasmo excesivo y la publicidad excesiva a menudo significan superficialidad. De hecho, muchos diseñadores de lenguajes no comprenden realmente los principios del diseño de lenguajes de programación, por lo que a menudo repiten los mismos errores que cometieron sus predecesores en el diseño. Pero para vender su idioma y su sistema, tuvieron que utilizar retórica y propaganda religiosa.
2. “La existencia es razonable”.
Recuerdo que cierta celebridad dijo: "No hay necesidad de un lenguaje que no pueda generar nuevas formas de pensar". Hay tantos idiomas en el mundo, ¿cuáles aportan nuevas formas de pensar? De hecho, son muy pocos. La mayoría de los idiomas no traen más que confusión al mundo. Alguien puede responder: "¿Cómo puedes decir que el idioma A no necesita existir? La biblioteca L que quiero usar no es compatible con otros idiomas, por lo que solo puedo usar A". necesidad" de la existencia.
Si consideras el "hecho" de la existencia como la "necesidad" de la existencia, tu lógica se desordenará. Al igual que si no logramos derrotar a Hitler en la Segunda Guerra Mundial y ahora somos sus esclavos, entonces dices: "Hitler debería existir porque nos alimentó". Obviamente hay un problema con esta lógica, porque si la historia hubiera tomado otro camino (es decir, Hitler no existe), viviremos una vida libre y feliz, por lo que Hitler no debería existir. Comparar las dos posibles consecuencias de la existencia y la no existencia de una cosa y luego emitir un juicio es la lógica correcta. Según este razonamiento, si el lenguaje A mal diseñado no existe, entonces es probable que el lenguaje B mejor diseñado obtenga más soporte, logrando así o incluso superando la funcionalidad de la biblioteca L.
3. Buscar “nuevas funciones”.
A los diseñadores de lenguajes de programación siempre les gusta "inventar" nuevos términos y promocionarlos. Los programadores comunes a menudo no se dan cuenta de que la mayoría de estos "nuevos conceptos" en realidad tienen una apariencia sofisticada y moderna, pero no tienen una connotación real. A menudo, cuando acaba de aprender un idioma A, aparece otro idioma B y le dice que tiene una nueva característica llamada XYZ. Entonces empiezas a aprender B de nuevo, y así sucesivamente. Desde la perspectiva de los conocedores, la mayoría de estas llamadas "nuevas características" son vino viejo en botellas nuevas. A muchas personas les gusta titular sus artículos así: "XYZ: Un método novedoso para...". Esto resultó en una explosión de conceptos sin avances sustanciales. Se puede decir que esta es la deficiencia más fatal de la informática.
4. Sigue los “trucos”.
A muchos libros de programación les gusta mostrar algunos consejos para que el programa parezca "corto". Por ejemplo, le dirán qué resultado debe obtener "(i) - (i)" o le preguntarán sobre la precedencia de los operadores, diciendo que puede usar menos corchetes o le dirán "Si solo hay; una línea de código después de si, no es necesario usarlo." Agregar llaves", etc. Como todo el mundo sabe, la mayoría de estos consejos son en realidad fallas en el diseño del lenguaje de programación o problemas que quedaron de la historia. Lo que aportan no es un pensamiento claro, sino confusión lógica y carga cognitiva. Por ejemplo, los operadores del lenguaje C aparecieron porque la memoria de la computadora utilizada por los diseñadores del lenguaje C era muy pequeña y "i" obviamente tenía 2 caracteres menos que "i = i 1", por lo que pensaron que podían ahorrar algo de espacio.
Ahora ya no nos falta ese pequeño recuerdo, pero la confusión y confusión que provocan los operadores se ha transmitido de generación en generación. A algunos de los idiomas más recientes también les gusta jugar este tipo de trucos gramaticales. Si sigues estos consejos, a menudo te perderás la esencia.
5. Dirigirse a “áreas especializadas”.
Muchos lenguajes no tienen nada nuevo para ocupar un área determinada, afirman ser adecuados para determinadas tareas, como procesamiento de textos, consulta de bases de datos, programación web, diseño de juegos, computación paralela o. otras tareas especializadas. ¿Pero realmente necesitamos diferentes lenguajes para hacer estas cosas? De hecho, la mayoría de estas cosas se pueden resolver con el mismo lenguaje común o con pequeños cambios basados en los lenguajes existentes. Es solo que, por diversas razones políticas y comerciales, se diseñan diferentes idiomas para capturar el mercado. En lo que respecta al aprendizaje, en realidad son irrelevantes y los problemas de "colaboración multilingüe" que plantean casi encubren los beneficios que aportan. De hecho, puedes aprender la esencia de todos estos "lenguajes especializados" a partir de algunos lenguajes de propósito general bien diseñados. Recomendaré uno o dos de esos idiomas más adelante.
Debo señalar que la mentalidad anterior no sólo es perjudicial para mí, sino también muy perjudicial para toda la industria. Cuando las personas a las que les enseñan estos pensamientos ingresan a la empresa, comenzarán a convertir las cosas que alguna vez temieron en dogmas y los utilizarán para seleccionar a nuevas personas, lo que conducirá a un círculo vicioso.
Cómo dominar todos los lenguajes de programación
Honestamente puedo decir que tengo conocimientos expertos sobre casi todos los estilos de lenguajes de programación. En mi opinión, son tan simples que ya no soy "partidario" de ningún idioma (incluidos los lenguajes funcionales). Pero he pasado demasiado tiempo explorando este camino y espero poder extraer algunos "trucos" que puedan ayudar a las personas a lograr esta comprensión general en un corto período de tiempo. Los detalles específicos ocuparían un libro, por lo que aquí sólo ofreceré algunas sugerencias preliminares.
1. Centrarse en la “esencia” y los “principios”.
Como todas las ciencias, en realidad sólo existen unos pocos principios esenciales de los lenguajes de programación, pero pueden usarse para construir muchos conceptos complejos. Pero la gente suele ignorar la importancia de los principios simples y se centra en los conceptos más recientes y complejos después de examinarlos rápidamente. No se dieron cuenta de que la mayoría de los conceptos más recientes se pueden combinar con los conceptos más simples. Su comprensión parcial de los conceptos básicos les impide ver la esencia de los conceptos complejos. Por ejemplo, uno de los conceptos más importantes entre estos conceptos es la recursividad. Muchos estudiantes en China solo entienden la recursividad en programas como la Torre de Hanoi, y también tienen un gran malentendido sobre la eficiencia de la recursividad, creyendo que la recursividad no es tan eficiente como los bucles. De hecho, la recursividad es mucho más expresiva que el bucle y su eficiencia es casi la misma. Algunos programas, como los intérpretes, son básicamente imposibles de completar sin recursividad.
2. Implementar un lenguaje de programación.
La mejor forma de aprender a utilizar una herramienta es fabricarla, por lo que la mejor forma de aprender un lenguaje de programación es implementar un lenguaje de programación. Esto no requiere un compilador completo, solo requiere escribir algunos intérpretes simples para lograr las funciones más básicas. Más adelante descubrirá que sabe aproximadamente cómo implementar todas las funciones nuevas del lenguaje, no solo a nivel de usuario. La forma más rápida de implementar un lenguaje de programación es utilizar un lenguaje como Scheme donde el código pueda tratarse como datos. Le permite escribir rápidamente intérpretes para nuevos idiomas. Hay algunos ejemplos de intérpretes que escribí en mi GitHub (por ejemplo, este código corto implementa la semántica diferida de Haskell). Si está interesado, puede consultarlo.
Varios estilos comunes de lenguajes
Permítanme hablar brevemente sobre varios estilos comunes de lenguajes y sus problemas. Tenga en cuenta que las clasificaciones aquí no son de naturaleza estrictamente académica y algunas pueden tener superposiciones conceptuales.
1. Lenguaje orientado a objetos
Los hechos muestran que todo el concepto de "orientado a objetos" es básicamente incorrecto. Su popularidad se debió a la "crisis del software" original (Dios sabe si esta crisis realmente existió).
La intención original del diseño es separar "interfaz" e "implementación" para que los cambios en la implementación de la capa inferior no afecten las funciones de la capa superior. Sin embargo, el diseño de la mayoría de los lenguajes orientados a objetos sigue un principio fundamentalmente erróneo: "Todo es un objeto". Por lo tanto, todas las funciones deben ubicarse en los llamados "objetos", por lo que no pueden pasarse directamente como parámetros o parámetros. variable. Esto a menudo lleva a la necesidad de utilizar patrones de diseño engorrosos para lograr cosas que son sencillas incluso para el lenguaje C. De hecho, la separación de "interfaz" e "implementación" no requiere poner todas las funciones en objetos. Otros conceptos, como herencia y sobrecarga, en realidad causan más problemas de los que resuelven.
El uso excesivo de "métodos orientados a objetos" ha comenzado a provocar efectos negativos en toda la industria. A los programadores de muchas empresas les gusta copiar patrones de diseño innecesarios, de hecho, no hacen nada bueno y simplemente hacen que el programa sea largo y difícil de entender. Cabe señalar que el libro "Design Patterns" es responsable de gran parte de esta complejidad. Desafortunadamente, un libro que es tan superficial, no tiene contenido y cambia el concepto, en realidad es elogiado por muchas personas como un clásico.
Entonces, ¿qué opinas de los lenguajes orientados a objetos con funciones de alto orden, como Python, JavaScript, Ruby y Scala? Por supuesto, con funciones de orden superior, puedes expresar muchas cosas directamente sin utilizar patrones de diseño. Sin embargo, debido a la omnipresencia del pensamiento de patrones de diseño, algunos programadores en realidad utilizan patrones de diseño engorrosos en lenguajes que no requieren patrones de diseño, lo que hace que la gente se ría o llore. Por tanto, lo mejor es no utilizar estos idiomas a la hora de estudiar para evitar interferencias innecesarias. Cuando sea necesario, regresa y úsalos para extraer la esencia y desechar la escoria.