Comienzo de una plantilla para una "puesta a tierra" rápida de desarrolladores PHP en GoDurante 15 años hemos estado haciendo un back-end en PHP. Y una vez que se tomó una decisión estratégica: primero, reescriba los lugares más cargados en Go y luego desarrolle nuevos servicios en él.
Imagínese: desea hablar sobre un nuevo lenguaje a un equipo de 40 desarrolladores que preparan PHP tan bien que crearon un sistema de alta disponibilidad y en tiempo real multiproceso.
En el peor de los casos, te quemarán, en el mejor de los casos te escucharán, pero continuarán haciendo lo mismo que antes. Esto es si ingresas el idioma por la fuerza.
Por lo tanto, decidimos organizar primero un hackathon y luego invitar a todos al lado oscuro. Si al menos diez personas los hubieran reclutado, con el tiempo les habrían mostrado a todos los demás un ejemplo personal de lo genial que es esto.
Te diré paso a paso cómo repetir esa experiencia contigo. Y sobre los resultados de nuestra implementación. Y sobre lo que sucede en la cabeza de un desarrollador de PHP cuando ve un nuevo lenguaje.
Comenzamos con la preparación de la plantilla y el CI / CD, que le permite cerrar en 15 segundos. Para escribirlo usted mismo, necesita alrededor de dos semanas. Lo hicimos de antemano.
Paso 1. Habla sobre Golang
A menudo tenemos muchos seminarios internos. Alguien quiere contar algo, escribe un anuncio, reúne personas y cuenta. Sucede que se trata especialmente de la regulación del tráfico aéreo en Rusia, sucede que es una historia sobre viajes, pero más a menudo se trata de alguna tecnología o característica que se ha implementado. Y puede ser útil para alguien más. Entonces, organizamos un seminario interno sobre Go, donde hablamos sobre los beneficios del lenguaje. Rápido (compilado sin pandereta: PHP también se puede compilar, pero más difícil), multiproceso listo para usar, simplemente soportado, puede escribir sin un marco directamente en un cuaderno, es decir, no hay hemorroides con dependencias de tercer nivel que el marco desarrollado arrastra junto con él. Implementar en 15 segundos. Y parece que ni siquiera hay defectos obvios en nuestra situación. Sugerimos probar. Era como una historia sobre otro mundo: aquí está el lenguaje, mira cómo difiere, el próximo fin de semana habrá un hackathon para aquellos que estén interesados.
Paso 2. Documentación
Tres días antes del hackathon, enviamos un enlace a un curso introductorio de media hora sobre sintaxis, tipos de datos básicos y funcionalidad. Y documentación básica. Esto es lo que obtuvieron los desarrolladores:
golang.org/doctour.golang.orgAdemás de contactos Go-senior en el interior.
Paso 3. Grupos
Además, propusimos dividirnos en grupos y llevar las tareas que nos gustaría implementar aquí y ahora en un nuevo idioma. Inmediatamente advirtieron que el hackathon estaría en la oficina después de horas (el sábado), el asunto era voluntario, pero sería posible resolver la tarea de combate y aprender en la práctica en modo casi en pareja con una persona que conoce los matices del idioma. Esto interesó a 40 personas, y comenzaron a luchar en grupos y reclutar tareas. No todos tuvieron éxito con los grupos: muchos vinieron con la tarea de uno solo, los grupos eran dos, con menos frecuencia, tres personas. Las tareas mismas estaban en la cima de los retrasos o estaban relacionadas con la duplicación de algún tipo de lugar inhibitorio.
El objetivo final era hacer una tarea en el hackathon, que luego se puede enrollar un poco y "vender" al propietario del producto (gerente de dirección). En el espíritu: "Mira, funcionó antes de 40 segundos, y ahora hace todo en dos". Esta parte es la más importante para el éxito estratégico de introducir el lenguaje en equipos: se necesita una pequeña victoria desde el principio.
Paso 4. Trabajo invisible
Preparamos una plantilla, de la que hablé anteriormente, para nuestra infraestructura, que nos permitiría correr inmediatamente sin bailar para construir y conectar todo lo que necesita. Esta plantilla reemplaza el marco. Difundirlo no tiene mucho sentido: repito, está muy encarcelado solo para nosotros.
Enumeraré solo la funcionalidad establecida en la plantilla:
- Integración con k8s.
- Exportar métricas a prometeo.
- Configuración a través de variables de entorno.
- Servidor HTTP.
- Opentracing.
- Registrador
Llevamos mucho tiempo trabajando en el estudio de Kubernetes y, como solución, elegimos OpenShift, que ofrecía grandes oportunidades para personalizar y configurar CI / CD. Entonces afilamos la plantilla inmediatamente debajo de k8s. La aplicación creada en OpenShift crea un repositorio, recopila el esqueleto de la aplicación, el servicio en k8s, aplica políticas de seguridad, recopila el binario, se implementa en k8s y en menos de un minuto el servicio está disponible en la red. Entonces, el hackathon también se convirtió en un evento donde los desarrolladores se presentaron a nuestro futuro PaaS.
También preparamos un tablero en Grafana con métricas básicas, configuramos registros de exportación para Kibana y agentes para Jaeger. Para cada servicio, se generan enlaces a servicios, en los que puede obtener de inmediato toda la información necesaria.
Luego, fue necesario acordar el acceso a las bases de datos que son necesarias para resolver los problemas de los participantes del hackathon. Esto está mal, pero nos conectamos a las bases militares en solo lectura durante la duración del trabajo. Esta es otra razón por la cual el sábado es la carga más pequeña en este día.
Le advirtieron a la cocina (le recuerdo que la tenemos
gratis para bocadillos , frutas de requesón, pero no para comida caliente) sobre el evento. Trajeron comida a la oficina para que no nos distrajáramos.
Paso 5. Hackathon mismo
Por razones obvias (familia, relajación), algunos fallaron el sábado, por lo que dividimos a 15 personas en llamadas.
Hablaron sobre nuestra plataforma PaaS, cómo crear una aplicación a partir de una plantilla, cómo usar una plantilla. Este marco, en el que hay contenedores para recopilar métricas, comprobaciones de estado y métricas, conectarse a una base de datos, etc., mostró cómo conectar todo tipo de cosas diferentes. Fue posible eliminar todo en su lugar o por adelantado (la plantilla también se distribuyó al hackathon). Esta es una aplicación lista para usar que debe ampliarse.
Hablaron sobre las características de implementación y desarrollo de Kubernetes (configuración, registro, métricas, trabajo con muestras listas, asignación de recursos para el procesador y la memoria, etc.). Intentaron desplegar "¡Hola, mundo!".

Los chicos mismos crearon los servicios. Me sorprendió gratamente la simplicidad y facilidad de uso de la plantilla. Alguien ya tuvo tiempo de practicar en Golang, alguien solo hojeó la documentación.

No teníamos el objetivo de mostrar cómo escribir bien, era necesario obtener un código funcional aproximado y mostrar cómo todo puede ir rápidamente al preprod, cómo funciona todo rápidamente y lo fácil que es realizar ediciones.
El plan era este: los equipos escriben, si tiene preguntas, nosotros respondemos. Luego, una sesión de revisión y ayuda sobre cómo hacer algo más correcto en arquitectura en Golang.
De las distorsiones cognitivas de PHP medio, vale la pena señalar la forma "antigua" de pensar en un hilo. Go tiene un buen modelo competitivo incorporado y multihilo listo para usar, que no estaba en PHP. El código resulta ser muy legible, lo que muy pocos esperaban.
En la práctica, no siempre usamos multihilo. Depende de la tarea. Pero debajo del capó, ella también lo está y, cuando es necesario, la velocidad aumenta debido a ella. Por ejemplo, se crea un goroutine separado para cualquier solicitud REST entrante. Golang puede procesar varias solicitudes al mismo tiempo, cuando la mayoría de los otros lenguajes (incluido PHP), de forma predeterminada, los pone en cola y los procesa en un hilo para cada trabajador.
La segunda característica es un gran dolor con la devolución de errores. Si el subprocesamiento múltiple es solo una arquitectura diferente y es fácil acostumbrarse a ella en una o dos horas, en el caso de errores al cambiar de PHP, este es un cambio en todo el modelo de pensamiento. Devolver errores de funciones es el paradigma principal en Go. En PHP, try-catch generalmente envuelve las cosas. Y aquí se requiere procesar explícitamente en el cuerpo de la función. Algunas personas fueron brutalmente bombardeadas por esta "desaceleración", se resistieron activamente. Esto se debe a que el enfoque está bastante cerca de TDD, y TDD requiere paciencia al escribir código, pero es fácil de depurar. Esto aumenta el código línea por línea "si - un error", pero una vez que escribe y no regresa. Esto es muy importante en la arquitectura de los microservicios, porque los microservicios crecen como hongos y un desarrollador puede escribir docenas de microservicios. El cambio constante de contextos y errores de depuración es muy costoso e ineficiente. Si todo se hace correctamente, la aplicación funcionará durante años, tan efectivamente como durante el desarrollo. Y en PHP en la misma situación, es probable que si el código se escribe incorrectamente, aparecerán nuevos errores constantemente, después de lo cual será necesario depurar todo nuevamente.
Resultó paños de pie en principal. Cuando se lanzó la parte funcional, ya descubrieron la mejor manera de dividirla en paquetes. Luego hubo una revisión. Cuando Go-senior te ayuda, es muy útil de inmediato. Le mostraron a alguien cómo reemplazar las visitas constantes a la base con un caché en RAM. Se ayudó a alguien a reescribir el código en ejecución paralela. En algún lugar había pequeños enchufes, como el hecho de que el servidor HTTP en PHP tradicionalmente se eleva y muere, pero aquí queda para colgar.
Paso 6. Repositorio
Al final del hackathon, el código se plegó en el repositorio, donde todos podían ver el código de los equipos vecinos y enviar una solicitud de extracción. Esto también es parte de la capacitación, y durante la semana estas solicitudes fueron bastante activas.
Resumen
Ocho horas de hackathon en dos transmisiones de más o menos 15 personas (les recuerdo que de 70 desarrolladores, 40 querían probar Go y recibieron documentación y una plantilla, pero no todos pudieron participar en un día o quisieron participar físicamente).
Una cuarta parte de los servicios dio el resultado esperado de inmediato. Otra parte requería largas modificaciones por parte del monolito PHP, o simplemente tenía más de ocho horas de ancho. Aproximadamente la mitad de los servicios se completaron antes de la venta posterior.
Como resultado, todos se familiarizaron con el lenguaje, la plataforma OpenShift, cómo casarlos, etc. Vimos la plantilla de la aplicación y el nuevo CI / CD, obtuvimos todo el conjunto de herramientas para resolver aún más nuestros problemas en Go.
Luego, las características se "vendieron" a los propietarios de los productos. Respondimos preguntas de arquitectura de los líderes de equipo.
Durante el mes siguiente, casi todos juntos agregaron una plantilla (que es un mini marco) a las necesidades de los departamentos. Como resultado, se hizo más grande. Sí, otra característica de la plantilla: la configuración completa, a través de variables de entorno, es decir, con el desarrollo local y al cambiar a preprod-prod, todo funciona perfectamente por igual. Docker es bueno.
No solo Go pasó del hackatón a las masas. Las plantillas aparecieron en la plataforma PaaS para PHP y Node.js, pero de todos modos, ceteris paribus, los desarrolladores a menudo eligen Ir como el lenguaje para el microservicio. Como resultado, en la práctica, todos los microservicios de venta nuevos escritos después del hackathon se escriben específicamente en Go. Es decir, cortamos el monolito e inmediatamente escribimos todo nuevo bajo Kubernetes. A finales de año nos trasladaremos allí casi por completo.
Los que no vinieron preguntaron a sus colegas qué era. Luego se acercaron y pidieron el idioma, realizaron varias tareas en segundo plano (para el trabajo principal), luego colocaron el código en el repositorio y recibieron solicitudes de extracción de otros desarrolladores recién capacitados y de especialistas en Go. Interesado en libros. Es decir, todavía teníamos unas pocas semanas de soporte técnico de la segunda línea.
Para aquellos que querían continuar sus estudios, crearon un grupo en Telegram con libros y más. También organizamos un gremio de desarrolladores de Golang, donde discutimos semanalmente los problemas emergentes en el trabajo, desarrollamos componentes comunes y compartimos buenas prácticas. Cualquier desarrollador puede ingresar.
La mayor consecuencia es que después de un mes reescribimos una de las secciones más concurridas, y comenzó a funcionar unas seis mil veces más rápido en la producción. Pero mejor hablaré de esto por separado: no solo hay características del lenguaje, sino también la implementación de subprocesos múltiples, un par de mejoras arquitectónicas y un poco de chamanismo. Lo más importante es nuestra experiencia de aprender el idioma, y generalmente es fácil repetirlo con usted si tiene al menos un especialista Go que pasará un par de semanas aprendiendo.
Otras publicaciones sobre nuestro desarrollo: la
historia del monolito de 15 años , un
acercamiento a la cocina ,
lo que el desarrollador debe saber sobre el negocio , y
especialmente el regreso de los boletos aéreos .