Diez años de programación en Erlang


Me uní a la comunidad de Erlang hace unos 10 años, en medio de la primera fase de exageración. Nos dijeron que Erlang es el futuro de la competencia y la concurrencia. Implementarlos en este idioma es el más fácil y rápido, y aún así obtienes distribución gratuita. En ese momento, el futuro parecía increíble. La máquina virtual ha recibido recientemente compatibilidad con SMP , pero para usar realmente todos los procesadores, tuvo que ejecutar varias máquinas virtuales en la misma computadora.

Quiero reflexionar sobre la última década. En este artículo hablaré sobre las fases de exageración con respecto a Erlang, sobre la escala de ideas en el idioma y sobre su posible impacto en la distribución del idioma, sobre los cambios que experimenté durante estos 10 años. En conclusión, compartiré mis pensamientos sobre lo que Erlang todavía tiene que aportar a la comunidad de programadores en general.

Fase de bombo


El ciclo de bombo consiste en las fases del ciclo de vida de un producto o tecnología. Este es un concepto de marketing, no científico, pero a menudo ayuda a describir la esencia de lo que está sucediendo. Lo que más me interesa es la fase de exageración , una especie de fiebre del oro que cubre a la comunidad de programadores. Tal vez te hayas encontrado con esto más de una vez, y todas estas fases están conectadas con alguna aplicación asesina que todos se apresuran a usar.

Los ejemplos que se me ocurren de inmediato son Ruby on Rails, Cómo construir un motor de blog en 15 minutos (la frase "¡Mira todo lo que no hago!" Sigue siendo gracioso) o Ve con Kubernetes (trabajaron juntos antes de eso, y entonces hubo una oleada directa). Esto incluye Elixir y Phoenix.

Durante la fase de exageración, hay una increíble afluencia de recién llegados que quieren ver de qué se trata todo este alboroto. Queda alguien, la mayoría se va. Puedes quedarte durante meses o años, en casos excepcionales te encuentras un hogar durante décadas. Sin embargo, la gran mayoría es un flujo constante de personas en serie que saltan de tecnología en tecnología, buscando oportunidades para beneficiarse del hecho de que son los primeros en usar un marco, lenguaje o kit de herramientas.

Por lo tanto, la mayoría de las veces necesita hacer una verdadera "aplicación asesina", y las personas llegarán a su ecosistema. La aplicación asesina estimula la emoción. Si lo escribes, vendrán a ti. Y si puede mantener una pequeña fracción de ellos y mantenerlos activos, entonces tendrá una comunidad vibrante en el futuro previsible. Esto recuerda un poco a la idea de la lluvia después de un arado :

El Señor maneja el arado ... Después de esta maravillosa adaptación, que es el único dominio del hombre sobre la naturaleza, las nubes caen fuertes lluvias ... [arado] es una herramienta que separa la civilización de la barbarie, convierte el desierto en granjas y jardines. ... En resumen, la lluvia sigue al arado.

La esencia de la teoría era que la habitación humana y la agricultura tienen un impacto irreversible en el clima de las regiones áridas y semiáridas, lo que hace que estas regiones sean más húmedas. Esta teoría se generalizó en la década de 1870 como justificación para el asentamiento de las Grandes Llanuras, una región conocida anteriormente como el Gran Desierto Americano. En esos años, esta teoría se utilizó para justificar la expansión de los cultivos de trigo en las tierras marginales del sur de Australia.

Si podemos lanzar un proyecto grande, aparecerán los desarrolladores, y será autosuficiente. Creo que esta idea es claramente errónea, principalmente porque Erlang tuvo docenas de aplicaciones asesinas durante la fase de exageración más grande, pero la comunidad aún es pequeña. Aquí hay ejemplos de estas aplicaciones:

  • ejabberd (2002, primer lanzamiento estable en 2005): fue uno de los servidores de chat más escalables, si no el más escalable. Ejabberd ha logrado un gran éxito y, en cierta medida, sigue siendo relevante. Hoy en StackOverflow todavía hay preguntas sobre los módulos para este servidor. Alrededor de 2011, se bifurcó en MongooseIM , y ambas soluciones aún son compatibles.
  • CouchDB (2005): una de las bases de datos más populares escritas en Erlang, que se basa en el teorema CAP . Se refiere al momento de la aparición de repositorios multimaster. Aunque MongoDB tomó la mayor parte del mercado, CouchDB tiene sucesores espirituales entre los motores de almacenamiento como BarrelDB , que todavía es compatible.
  • RabbitMQ (2007): un servidor de colas de mensajes que aplastó la mayor parte del mercado AMQP. Se desarrolla y a menudo compite con Kafka cuando se trata de cargas de transmisión, aunque estos productos tienen diferentes capacidades y aplicaciones.
  • Chat de Facebook (2008): la versión inicial del chat de Facebook se escribió en Erlang. Por una serie de razones internas (estabilidad, una gran cantidad de programadores de C ++ y varias soluciones establecidas) se reescribió más tarde en C ++.
  • WhatsApp (2009, comprado en 2014): cuando Facebook se deshizo del sistema de chat de Erlang, compraron WhatsApp, que solo requería 50 ingenieros para soportar 900 millones de usuarios . Él vive hasta el día de hoy, y lo que es más, el equipo de WhatsApp ha fortalecido aún más los lazos con las comunidades de Erlang y Elixir.
  • Riak (2009): uno de los mejores ejemplos de demostración de poder en el mundo de los sistemas distribuidos. Riak era un almacenamiento distribuido confiable del tipo clave-valor. Este es un producto de Basho que aún funciona en sistemas de salud y otras partes críticas de la infraestructura. Más tarde, Basho se declaró en quiebra (en gran medida debido a violaciones de los deberes fiduciarios , que "a toda velocidad llevaron a la compañía al colapso" ). Luego Bet365 compró todas sus IP, las abrió generosamente y, desde entonces, la base de datos ha estado viviendo en el mundo de código abierto, aunque hoy está pasando por tiempos difíciles.

Muchos de estos productos fueron lanzados durante la primera edición del libro Programming Erlang de Joe Armstrong. Como resultado, surgió una explosión de la popularidad del idioma y Erlang ganó muchos admiradores. Un impacto significativo fue incluso el hecho de que Hacker News forzó todas las discusiones sobre las entrañas de Erlang . Sin embargo, pocos se han mantenido fieles a este idioma.

Ahora creo que las aplicaciones asesinas son creadas por personas que forman la fase inicial de exageración, y no al revés. Siempre hay una pequeña parte de las personas que buscan tecnologías interesantes antes que otras, deciden si les gustan y luego crean algo, y si obtienes una aplicación asesina, esto estimula el desarrollo de una fase de publicidad aún más poderosa. La gente se dedicará al culto de la carga, y los proyectos exitosos producirán imitadores. Además, la situación estándar es la fase de la "invención de la rueda", cuando todos pasan su tiempo reinventando cosas existentes, y hay una ola de mensajes sobre la "implementación de X, pero en el lenguaje Y".

Sin embargo, solo crear una aplicación asesina no es suficiente. Curiosamente, todos estos productos, como RabbitMQ y Ejabberd, a pesar de su popularidad, tienen una comunidad de usuarios mucho más grande que la comunidad de desarrolladores. Miles y miles de corporaciones que usan estos productos no necesariamente hacen una contribución significativa a la comunidad de Erlang.

Esto se debe en parte al hecho de que la mayoría de las aplicaciones asesinas de Erlang se utilizan en infraestructuras especializadas. Ha creado un componente altamente confiable en forma de una caja negra que todos usan, y si funciona bien, nadie mirará dentro. Varias docenas de desarrolladores han proporcionado la base para miles de otros productos y servicios. La infraestructura especializada, por definición, no necesita una gran cantidad de personas para garantizar su impacto generalizado. Siempre tiene pocos desarrolladores y una pequeña comunidad en comparación con las tecnologías que están más cerca del producto final, por ejemplo, marcos web o infraestructuras aún más generalizadas que se utilizan en pequeños proyectos de implementación adecuados para cualquier empresa.

Pero incluso con todo esto, es obvio que Erlang se perdió de las muchas personas que pasaron por esto durante la fase de exageración.

Escalera de ideas


No hablaré sobre lo que podría o debería haberse hecho. En cambio, quiero hablar sobre los patrones de aprendizaje populares que he encontrado en la comunidad de Erlang durante los años de mi enseñanza y programación de este idioma. Observo los mismos patrones hoy en la comunidad de Elixir, y esto puede indicar un futuro similar para él.

Tengo la teoría de que un tema tan técnico como un lenguaje de programación (y su ecosistema) tiene varios niveles de complejidad en los que se ubican los diferentes conceptos. Usé esta teoría en el proyecto Learn You Some Erlang . Se presenta en el diagrama, que llamé los círculos Nueve Earl .

Por supuesto, esta es una idea irónica, no creo que el estudio de una tecnología sea un sufrimiento sin fin (al menos no debería serlo). Simplemente me gustó el juego de palabras. En pocas palabras, siempre hay algún tipo de camino o secuencia "principal" de los que aprende al estudiar tecnología: esta es la "escalera de las ideas", y cuanto más alto se ubica el concepto en esta escalera, más valioso y más difícil es lograrlo, menos personas la conozco

Cómo se vería la escalera de ideas en Erlang:

  1. Programación funcional
  2. Procesos aislados y competitividad.
  3. Competitividad confiable (enlaces, monitores, tiempos de espera).
  4. Principios de OTP y otras abstracciones del sistema.
  5. Cómo estructurar sistemas de acuerdo con los principios de OTP.
  6. Cómo recopilar versiones y trabajar con ellas (implementación).
  7. Cómo evitar un bloqueo del sistema y trabajar con él.

Si solo conoce a Erlang y compra un libro para principiantes, entonces probablemente pase los primeros días en el primer paso de la escalera: familiarización con la programación funcional, la inmutabilidad (inmutabilidad), la recursión y otros conceptos similares. Tarde o temprano llegará a la competitividad y el paralelismo, los procesos y la mensajería. Inmediatamente después de ellos, comenzará a aprender sobre enlaces y monitores, manejo de fallas y qué Erlang hace lo que es. Durante la gran fase de publicidad, los pasos segundo y tercero contenían oportunidades que para la mayoría de los observadores parecían simplemente increíbles. Si necesita aprender algo que utilizará en todos los proyectos futuros, puede elegir una de estas características de Erlang.

Puede continuar con otros pasos más adelante, pero solo si se adhiere al programa de capacitación paso a paso. En particular, OTP (cuarta etapa) puede describirse como "de qué se trata todo esto". La competitividad y la programación funcional son buenas, pero el marco general presentado con OTP era realmente único y necesitaba ser utilizado. Con el tiempo, muchos trabajarán con él, descubrirán que pueden crear abstracciones geniales, pero no les gustará el enfoque de la estructuración.

De hecho, para crear aplicaciones como Ejabberd fue suficiente para superar el cuarto paso. En aquellos días, el ecosistema se parecía al Salvaje Oeste, y el conocimiento de OTP era propiedad de especialistas que trabajan en Ericsson, así como de los autodidactas más motivados. La mayoría nunca llegó a la quinta etapa, a menos que enviaran algo a producción y luego encontraran problemas, o si no buscaban una solución mejor. El logro del sexto paso fue raro hasta 2015-2016, y luego apareció Relx , lo que simplificó el montaje de lanzamientos y su desarrollo. Casi nadie alcanzó el séptimo paso, y muchas personas piensan que no deberían realizar una actualización en caliente del nodo Erlang, e, idealmente, nunca necesitará usar SSH para la depuración en la producción.

En la práctica, no todos suben en la escala de ideas en el mismo orden; sus pasos en algunos libros se invierten (por ejemplo, en Erlang y OTP en acción ). No hay nada de malo en eso, la escalera fue inventada solo como una ilustración.

El tamaño de las comunidades está cambiando en oleadas. Durante las fases de la exageración, el tamaño durante algún tiempo puede aumentar en decenas o cientos de veces, y todas estas personas sentirán curiosidad y se irán. La mayoría de los participantes se sientan en el primer escalón y rara vez lo dejan atrás. Algunos suben a la segunda etapa, incluso menos a la tercera, y así sucesivamente, hasta llegar a un círculo estrecho de expertos al más alto nivel.

Creo que subir los primeros tres pasos de Erlang fue fácil. Para subir al cuarto, era necesario desarrollarse durante varios años y, de hecho, sentir la necesidad de seguir estudiando. En el quinto paso ya es muy difícil. El conjunto de herramientas y el ecosistema de Erlang eran pobres. Los miembros de la comunidad soportaron este ambiente estéril y fueron indiferentes a la difícil situación de los recién llegados. Para acortar el artículo (bueno, largo, pero no absurdamente largo), vea mi charla sobre el ecosistema del lenguaje en la Conferencia de Usuarios de Erlang:


Si escribe en Elixir, entonces probablemente verá en qué escalón de esta escalera inventada está parado, y ya puede imaginar en qué proporciones se distribuye la comunidad sobre ella. Muchos participantes hablan con fluidez solo en Phoenix, pero rara vez se elevan por encima del cuarto paso, y muchos están atrapados en el tercero y más abajo. Y a menudo esto es suficiente. No culpo, pero solo comparto la observación. Al igual que cualquiera que haya subido muchos pasos (y probablemente haya varios pasos más por delante, como "parchar una máquina virtual" u otra cosa), veo que estas personas no saben mucho. Pero, sinceramente, toda esta información puede ser inútil para ellos. Y eso está bien.

Lo que quiero decir sobre: ​​creo que nosotros, como comunidad, probablemente estamos aserrando perras debajo de nosotros, lo que hace que la escala de ideas sea muy difícil de dominar por encima del nivel básico. Algunos temas deben estudiarse lentamente, y en algunos temas, los ciegos guían a los ciegos porque Erlang es tan pequeño que tenemos muy pocas personas que puedan compartir toda la experiencia necesaria. Hoy es más simple, y si no viniste a Erlang en la fase de exageración, probablemente obtendrás ayuda, ya que mucha menos gente la solicita al mismo tiempo.

Me gustaría pensar que si la segunda fase de exageración comienza mañana en el mundo de Erlang, podremos aceptar a los recién llegados mejor que durante la gran ola, cuando llegué. Y espero que esta experiencia, junto con una colaboración más estrecha entre las comunidades de Erlang y Elixir, duplique nuestras posibilidades de ampliar con éxito el uso de estos idiomas.

Lo que ha cambiado


Erlang no nada en el matraz, esperando que lo saquen a la luz. Está en constante evolución. Esto se debe en parte a la competencia y las sugerencias de la comunidad Elixir, que, afortunadamente, espera mucho más de sus herramientas de lo que están acostumbrados los usuarios de Erlang. Y en parte, el desarrollo está determinado por las necesidades urgentes de la industria y los deseos de la comunidad académica.

Creo que alguien estará contento con estos cambios que han ocurrido desde 2009 o incluso antes:

  • El soporte multinúcleo ahora funciona bien. Anteriormente, si había más de 2-4 núcleos, el sistema descansaba en todo tipo de cuellos de botella que no estaban sujetos al desarrollador de la aplicación. Luego se hizo posible usar 12-16 núcleos. Hoy ni siquiera sé cuál es el límite superior, pero escribí y gestioné pilas que funcionaron en más de 32 núcleos sin ningún problema.
  • Las trazas de pila ahora tienen números de línea. Es casi impensable regresar al pasado, antes de que aparecieran los números. En esos años, "escribir funciones cortas y auto documentadas" no era una cuestión de arquitectura, sino de supervivencia. Ahora puedes depurar programas Erlang sin habilidades de depuración sobrenaturales, aunque nunca te harán daño.
  • La calidad de soporte Unicode es actualmente aceptable. El módulo de cadenas contiene los algoritmos más importantes, y el módulo Unicode hace un excelente trabajo con la mayoría de los tipos de transformaciones y normalizaciones. Existen enfoques típicos para trabajar con puntos de código, UTF-8, UTF-16 y UTF-32. El soporte local todavía deja mucho que desear, pero todo lo demás está operativo. Los módulos como re (un módulo para trabajar con expresiones regulares) y todas las funciones de alto nivel para trabajar con archivos tampoco tienen problemas al trabajar con Unicode.
  • Se admiten mapas (implementados como HAMT ) con sintaxis explícita de coincidencia de patrones. Con la ayuda del análisis de tipo Dialyzer se les aplica, lo que les permite ser utilizados en aquellos casos en los que antes el uso de registros requería mucho esfuerzo.
  • Las máquinas virtuales ahora utilizan excelentes mecanismos para trabajar con el tiempo , hacen frente a un cambio en la escala de tiempo, diferentes tipos de relojes y más. Sin embargo, trabajar con zonas horarias y formato de tiempo es mejor con la ayuda de bibliotecas desarrolladas por la comunidad.
  • Se han agregado herramientas de alto rendimiento como atómicas , contadores y términos persistentes para ayudar a mejorar los diversos mecanismos subyacentes a las herramientas de vigilancia y las bibliotecas de base de bajo nivel.
  • Todo el procesamiento de la señal se volvió asíncrono , incluido el trabajo con puertos , lo que nos salvó de muchos cuellos de botella.
  • El compilador se ha reescrito y todavía se está reescribiendo para mejorar el análisis y el rendimiento de alto nivel utilizando SSA.
  • Había un tipo especial de planificadores para su uso en NIF: planificadores sucios, que simplificaban la integración con código escrito en óxido o incluso óxido, que admitía procesos intensivos de CPU y E / S. Entonces, aunque el lenguaje en sí no se ha vuelto mucho más rápido (aunque hay progreso), se ha vuelto mucho más fácil conectar bibliotecas de alto rendimiento sin afectar indebidamente la estabilidad de la máquina virtual.
  • Se han realizado varias mejoras en el mecanismo para asignar y administrar la memoria.
  • El análisis del programa se ha vuelto más preciso y rápido gracias a un rastreo y contabilización de microestados más rápidos y flexibles.
  • El comportamiento OTP más flexible de gen_statem permitió la implementación de máquinas de estados finitos que pueden procesar datos de entrada de forma selectiva.
  • Nuevo y mejorado marco de registro con soporte incorporado para registros estructurados.
  • El módulo de cifrado se reescribe y usa NIF en lugar de los controladores más complejos (y a menudo más lentos).
  • El controlador de archivo se reescribió completamente con NIF, lo que mejoró enormemente el rendimiento.
  • Para lograr el mismo rendimiento, continúan reescribiendo los controladores de red utilizando NIF.
  • Completamente rediseñado el uso de SSL para el procesamiento de TLS. Cuando trabajé en Heroku, tratamos de hacer que el producto fuera comparable con las soluciones de C ++ en términos de retraso (quizás un 5 por ciento peor) y superamos significativamente la previsibilidad (10-30 veces menos que los percentiles 99).
  • Mejora significativa del rendimiento de ETS.
  • Escribí una guía para administrar y depurar sistemas de producción en máquinas virtuales Erlang.
  • Una herramienta de compilación completamente nueva ( rebar3 ), integrada con el administrador de paquetes unificado para el ecosistema Erlang.
  • , . Elixir, Efene, LFE, Luerl, Clojerl Gleam Alpaca.
  • Erlang.

, . , OTP Ericsson 13-16 ( 22!), Erlang . , Ericsson. Erlang Elixir, Erlang VM , Erlang Ecosystem Foundation , , , (observability — ), , ..

, , , , , , , , , Erlang . .

Erlang


, , 2007-2009, , . Erlang , . , , BEAM Conf. (Property-Based Testing), Erlang Elixir . , . , .

? , , , . , Elixir. , , , . , . , . . , . Erlang, , .

, Erlang . , , Erlang-, Erlang-: , , . , .

Erlang -, Elixir-.

, , Erlang . , . Erlang , . , .

, . ? ? , - ? , , ? ? , ? « - »?

, , « ». , Erlang . , . junior senior-, , , , .

, 15 ( , ), . , sistemas, y su creación y puesta en funcionamiento. Todos tienen su propia motivación.

No puedo imaginar que obtendría tanto en otra comunidad. Estos 10 años han sido asombrosos. Es curioso que la comunidad de Erlang sea aún pequeña y su potencial no se revele. Esto significa que hay muchas oportunidades para participar en todo, para comunicarse cara a cara con personas llenas de sabiduría y que desean compartirla, y encontrar su lugar.

PS. Gracias por traducir mail ru group; Comunidad Erlang en Telegram (Evgeny M., Sergey Ivanov, Vladimir Sekisov, Greg)

Source: https://habr.com/ru/post/460115/


All Articles