Por qué Go es un lenguaje poderoso para aprender como desarrollador PHP

He estado programando usando PHP profesionalmente desde hace 10 años. Después de mi título en Ingeniería Informática, todo lo que sabía era que Java ya no era mi pan comido (después de más de 6 años usándolo para proyectos personales y académicos), quería unmuchouna pila más simple y descubrí que una forma rápida de promocionarme como desarrollador independiente era ingresar al creciente mercado de CMS PHP.

A lo largo de los años, PHP ha cambiadoun montony si bien a muchas personas les gusta criticarlo, muchos lo hacen basándose en muy poca experiencia y en muy poco tiempo. PHP moderno, especialmente si tiene el lujo de usar tipos de PHP 7 y dejar atrás PHP 5.x, es muy agradable para trabajar y, por supuesto, PHP tiene la ventaja de ser, por alguna razón, el lenguaje que puede implementar casi en todas partes, razón por la cual muchos CMS están integrados en PHP y por qué tienen tanto éxitoporqueestán basados en PHPGravincluido).

Por supuesto, PHP es solo una herramienta, y recientemente he estado profundizando en Go de cabeza.

Comparado con PHP, Go es un lenguaje y un entorno completamente diferente.

Esto no es una perorata o un artículo destinado a alejarte de PHP, sino más bien presentarte, desarrollador de PHP, por qué Go es un buen lenguaje para aprender como herramienta complementaria.

Lo primero es lo primero: ¿qué es Go?

Go es un lenguaje de programación imperativo y orientado a objetos diseñado en Google hace 10 años.

El conocimiento combinado de los miembros fundadores y la filosofía original de crear el mejor lenguaje para las necesidades que tenían, llevaron a Go.

Go es un lenguaje compilado, tipado estáticamente, con funciones integradas de recolección de basura y programación simultánea.

No es nada nuevo

La forma en que Go va innovando es bastante interesante. Ignora por completo la exageración sobre las supuestas características nuevas que debería tener un lenguaje moderno y lo que proporcionan otros lenguajes de programación, pero en su lugar selecciona el concepto central de los lenguajes probados en batalla, agregando décadas de experiencia en programación en una hermosa herramienta para usar.

The task of the programming language designer is consolidation not innovation – Hoare, 1973

Go tiene muchas características únicas, por supuesto, no es solo un lenguaje mashup. Ir presentadogorutinas, que son una forma asombrosa de manejar la simultaneidad. Ir presentadoaplazar, una excelente manera de ejecutar algo cuando regresa la función externa (ahora también agregada a Swift).

Go fue el primer idioma en introducir un formateador en las herramientas estándar. Y la capacidad de compilar para otras plataformas sin fricciones, además de muchas más cosas "nuevas".

Go tiene raíces fuertes. Una hermosa presentación en la GopherCon 2015 de Robert Griesemer lo ilustra: Go fusiona muchos principios de ambosCy Oberon-2, que es un idioma que proviene de la familia Pascal. Ambos lenguajes se originan en Algol 60, que se introdujo en 1960.

Asi que la proxima vezalguien pregunta por qué Go parece un idioma de hace 20 años, también puede responder que en realidad tiene más de 60 años de experiencia en su haber. Como dijo una vez Robert Griesemer, se necesitan 10 años para que un lenguaje de programación se convierta en algo común.

Go apenas está comenzando, lo cual es muy emocionante pensando en su futuro y en lo que la gente puede construir con él.

Go es complementario a PHP

Si alguna vez usó Ruby o Python además de PHP, es posible que se haya dado cuenta de que se reducen más o menos a una versión diferente de PHP, si elimina el fanboyismo y las preferencias personales de la ecuación, ya que todos son lenguajes interpretados de forma flexible.

Uno podría cambiar a Ruby a PHP y Python y hacer las mismas cosas. El único "lenguaje web" que difiere sustancialmente esJavaScript, que es diferente debido al modelo sin bloqueo (pero que se ha migrado a otros lenguajes, incluido PHP también a través de bibliotecas) y porque es el único lenguaje que actualmente se ejecuta de forma nativa en el navegador, lo que le da una enorme ventaja. Además, es un ecosistema mucho más salvaje de entornos de ejecución incontrolados, todos diferentes en formas posiblemente sutiles.

Ir por otro lado es una bestia completamente diferente. Es un lenguaje de sistema, como C. Y a diferencia de los lenguajes dinámicos, Go es rápido.

PHP está construido en C, y puedes escribir y ejecutar PHPCextensiones, por lo que el concepto de un lenguaje de sistema no debe sereseajeno a ti.

Go es capaz de reemplazar su pila web, y hay marcos web disponibles para eso, lo que lo hace fácil, pero PHP todavía tiene su lugar, especialmente cuando se crean prototipos y aún no sabe qué parte de su código necesitará una gran optimización, y si su código se usará realmente después de todo.

Entonces, ¿cuándo debería usar Go? Cuando usa PHP pero PHP no es realmente la mejor herramienta para el trabajo. Si PHP consume demasiada memoria o recursos para una función en particular, un programa Go altamente optimizado funcionará mucho mejor. Simple como eso. PHP 7 ha sido increíble a la hora de mejorar el rendimiento de PHP. Ese fue un regalo gratis. Pero cuando necesita procesar millones de entradas de bases de datos o obtener Gigabytes de datos de una API con un proceso de larga ejecución, PHP puede no ser la herramienta adecuada.

He confiado enNode.jsdurante bastantes años para resolver este problema, pero a medida que fui conociendo a Go, hasta ahora cualquier cosa que se me ocurra con Go es una solución mucho más simple y mejor.

Y no se queda ahí, por supuesto. Con Go, puede crear aplicaciones simultáneas y multiplataforma en un abrir y cerrar de ojos, y esto es muy diferente del desarrollo web PHP, es mucho más desafiante, pero también, personalmente hablando, más interesante y podría ofrecerle muchos trabajos gratificantes.

Por lo tanto, como desarrollador de PHP, podría comenzar a entregar tareas exigentes a Go, mientras que, sin duda, enriquecerá sus opciones profesionales.

¿Por qué ir y no C C ++ o Java?

Cualquier idioma tiene su lugar. Seguramente Go no puede superar las prestaciones de C y C ++. Hay muchos puntos de referencia que puede encontrar.

Go se encuentra en el medio entre esos 2 lenguajes tradicionales e históricos y los lenguajes dinámicos: desea más rendimiento del que puede obtener de un lenguaje interpretado, pero no está listo o no está dispuesto a usar C o C ++, que son más rápidos pero son de nivel demasiado bajo y necesitaría administrar manualmente la memoria, y llevaría mucho más tiempo desarrollarlos. Vaya encaja en ese lugar.

Para un fragmento de código altamente optimizado, C o C ++ podrían ser una mejor solución, si es muy competente con ellos. Podría decir lo mismo de Assembly.

En comparación con Java, es una situación completamente diferente. Java requiere mucha sobrecarga en términos de entorno, mientras que los programas Go son un solo archivo, livianos, portátiles y nativos.

Y probablemente estamos comparando manzanas con naranjas, nunca usarías Go donde usas Java, y lo contrario es cierto.

Ir es simple de corazón

(Y recuerde: simple no significa fácil) Evitar el deslizamiento de funciones era claramente uno de los objetivos de los diseñadores de Go. El legendario Ken Thompson, uno de los 3 diseñadores originales de Go, también creador de UNIX y el lenguaje B (entre muchas otras cosas), dijo una vez

Cuando los tres [Thompson, Rob Pike y Robert Griesemer] comenzamos, fue pura investigación. Los tres nos juntamos y decidimos que odiamos C ++. [risas]… [Volviendo a Go,] comenzamos con la idea de que los tres teníamos que ser hablados en todas las características del idioma, por lo que no había basura extraña en el idioma por ningún motivo.

Esto resultó en un lenguaje que es sorprendentemente simple para cualquier desarrollador experimentado que haya estado codificando en cualquier idioma.

Java, C ++, C, C #, Erlang, JavaScript, Swift, casi todos los lenguajes de programación modernos son mucho más complejos que Go.

Y aquí me refiero a complejo de usar para el programador, complejo de leer, complejo para convertirse en un maestro. En el interior, Go esconde toda la complejidad y expone una API simple. Go no solo tiene recolección de basura, sino que no hay ninguna funcionalidad de administración de memoria expuesta.

Solo piense que PHP tiene 67 palabras clave, mientras que Go tiene 25.

El punto clave aquí es que nuestros programadores son Googlers, no son investigadores. Por lo general, son bastante jóvenes, recién salidos de la escuela, probablemente aprendieron Java, tal vez aprendieron C o C ++, probablemente aprendieron Python. No son capaces de comprender un lenguaje brillante, pero queremos usarlos para crear un buen software. Por lo tanto, el lenguaje que les damos tiene que ser fácil de entender y de adoptar. - Rob Pike

Esto es fundamental para la filosofía de Go y explica por qué Go elige evitar la implementación de funciones (evitando el deslizamiento de funciones) y por qué muchos conceptos de programación funcional se dejan de lado, ya que son complejos para razonar y abrir debates. La programación funcional pura está demasiado lejos de los conceptos de la máquina para ser relevante para Go, que es un lenguaje imperativo en el fondo.

Dicho esto, Go tiene implementados muchos conceptos de programación funcional, como funciones de primera clase (que permiten asignar funciones a variables), cierres, recursividad.

Pero en comparación con PHP o JS, no tiene operaciones funcionales como mapear, reducir o filtrar, debe confiar en los bucles. ¿Por qué? Porque esas operaciones son ineficientes y Go debe encontrar un equilibrio.

Hablando de cosas que faltan, no hay excepciones para manejar errores. No hay clases (aunque está orientado a objetos, con estructuras con métodos asociados, forzandocomposición sobre herencia- si tiene conocimiento de la implementación de objetos prototipo de JavaScript, esto le resultará familiar, pero muy diferente), no genéricos (aunque PHP tampoco los tiene), yaquí es por qué.

Menos es más, ¡o mejor!)menos es exponencialmente más.

El "secreto" para un buen diseño de software no estaba en saber qué poner en el código; estaba en saber qué dejar FUERA! Fue en reconocer dónde estaban los puntos duros y los puntos débiles, y saber dónde dejar espacio / espacio en lugar de intentar meter más diseño

Solo hay una forma de escribir un bucle:for. Olvidarwhileydo — whileyforeach(¿algo más?).

[…] Lo que hace que Go sea un éxito es lo que se ha dejado fuera del lenguaje, tanto como lo que se ha incluido.

La capacidad de devolver múltiples valores de una función evita muchos trucos (el ejemplo más simple es devolver una matriz que contiene 2 valores y tener que extraerlos sin saber el tipo exacto pasado).

La simplicidad es heredada por las herramientas.gofix corrige automáticamente los cambios importantes en la API en las nuevas versiones de Go.

And Go es simple por diseño y siempre será simple.

Como dice Rob Pike, muchos otros lenguajes están copiando características entre sí, perdiendo sus aspectos únicos (piense en JavaScript introduciendo la sintaxis de las clases para complacer a los desarrolladores de Java y PHP) y todos convergen idealmente en un lenguaje conceptualmente único.

Go no compite en funciones. Esto me recuerda aeste artículo Getting Real.

Cuidado: Go está polarizando

Go tiene muchos fanáticos y también muchos enemigos. Como desarrollador de PHP, estoy seguro de que desarrolló una piel dura en este tipo de guerras de llamas, y podemos pasar rápidamente al siguiente punto. Es muy popular y los desarrolladores tienen opiniones sólidas.

Independientemente de las compensaciones que haga, siempre habrá críticas, porque ningún lenguaje de programación puede ser perfecto.

Go resuelve un problema maravillosamente. Y no necesita ser un genio para comenzar a usarlo, aunque esto podría herir sus sentimientos.

Go es muy testarudo y tiene convenciones claras

Una de las primeras cosas que notará sobre Go es que casi todo el código que puede encontrar se ve casi igual.

Esto se debe a que Go tiene convenciones claras y forzadas. Las herramientas integradas proporcionan 2 comandos relacionados con las convenciones (gofmtyGolint, con el primer código de formato automático y el segundo solo imprimiendo advertencias), y pueden verificar si su código cumple, e incluso ajustar automáticamente su estilo a las pautas de Go.

Esto es diferente a JSESLint/ JSHint, ya que esas herramientas son aplicaciones para todo el equipo. Como en todo JS, puede personalizar cualquier cosa en las preferencias.gofmtes uno, sin configuración, ese es el camino a seguir.

Esto es excelente para proporcionar coherencia en su propio código (el código que escribió hace 5 años en PHP o JavaScript puede sermuydiferente de sus convenciones y preferencias actuales) y en el código quetodosdistribuye.

Imagine que no habrá más discusiones de equipo internas sobre el mejor estilo de código, imagine todos los RP de su proyecto de código abierto formateados y enlazados de la misma manera. Espacios frente a 0 pestañas, ahorre ciclos mentales: son pestañas. ¿Frenillos en la misma línea o en la siguiente? Siempre en la misma línea (hay una razón para esto y es permitir omitir el punto y coma).

Go genera un error de compilación si no se utiliza una variable o importación, lo que evita que sus programas acumulen basura con el tiempo.

Las convenciones de nomenclatura son tan importantes que los modificadores de acceso se han eliminado por completo de la ecuación. Variable en minúscula? Privado. Variable capitalizada? Público. Tan simple como eso, una simple convención elimina toneladas de uso inútil del espacio de la pantalla, además es inmediatamente comprensible.

Los comentarios satisfacen una necesidad especial, y los escribe en una sintaxis especial para que su paquete pueda ser inspeccionado usandogo docy tienes toda la documentación que necesitas sin buscarla en Google.

go getestá a su disposición, integrado (que es ideal para código abierto y distribución). Aunque PHPland es mucho más avanzado en mi opinión en términos de gestión de dependencias.

PHPUnit / Codeception? No hay necesidad,go testya está ahí para tu*_test.goarchivos.

Te convierte en un mejor programador

Si viene de PHP, aprender Go le hará pensar de una manera nueva y diferente. Te convertirá en un mejor programador, al igual que aprender cualquier idioma diferente: te presenta nuevos conceptos. Si se siente extraño y ajeno, es una buena señal de que está aprendiendo y creciendo como desarrollador.

Para empezar, Go se compila en lugar de interpretarse. Flujo de trabajo e implementación completamente diferente.

Si no tiene experiencia con la escritura fuerte, eso es un cambio de paradigma. PHP 7 viene con verificación de escritura y es de gran ayuda si no tiene que admitir versiones anteriores de PHP. Go está fuertemente tipado. Muchos, si no todos, los problemas de tipo se resuelven en tiempo de compilación.

Go es increíblemente simple, diseñado para ser simple, y ser un desarrollador de Go significa reconocer esta simplicidad y aprovecharla, y no intentar escribir Go como Java, sino abrazarlo.

Y por simple no quiero decir que Go sea un lenguaje de juguete, ciertamente no lo es, y no es un lenguaje que yo le presentaría a alguien a la codificación.

Por simplicidad me refiero a másminimalismoysin pelusa.

Cuando un idioma te ofrece muchas formas de hacer lo mismo, te ves obligado a pensar cuál es la mejor, distrayéndote del problema que estás tratando de resolver.

Puede ejecutar código Go desde PHP

Entonces, una forma en la que sugiero comenzar es codificar alguna rutina pesada o un fragmento de código de larga ejecución que consuma demasiada memoria como un servicio de Go.

Allíson muchos maneraspara llamar directamente a los programas Go desde PHP, pero también puede optar por implementar uncola de servicio a través de ZeroMQo acceda a un programa go de larga duración mediante la exposición de un punto final de API a través de un proxy inverso. Tienes muchas opciones.

El arma especial de Go: concurrencia

Se sabe que PHP-FPM maneja muy bien las solicitudes concurrentes, generando un nuevo proceso que ejecuta el código PHP real para cada usuario. Y, por lo general, en una aplicación web, la base de datos es el cuello de botella. Pero, ¿qué pasa con los procesos de larga ejecución (algo que realmente no desea construir en PHP), o cuando necesita iniciar un ciclo computacional pesado dentro de una solicitud de PHP, donde necesita ejecutar decenas de miles de procesos concurrentes?

PHP tiene soporte para subprocesos, por lo que puede realizar un procesamiento concurrente, pero mientras que PHP (o incluso C y otros) puede realizar concurrencia utilizando la ayuda de bibliotecas externas al lenguaje, Go esdiseñadocon programación concurrente incorporada, y proporciona formas nativas de comunicarse entre goroutines.

Los hilos son pesados, en comparación congorutinas. Un sistema podría soportar 10k subprocesos, y el mismo sistema podría soportar millones de goroutines, debido a que la implementación interna del consumo de memoria de goroutines es mucho más liviana, como en Java o Erlang.

Entonces, incluso si no necesita millones de solicitudes simultáneas, las ganancias de rendimiento son claras.

Además, es muy fácil digerir goroutines y comprender lo que hace el código de un vistazo rápido.

No es necesario extender las clases o incluir extensiones especiales, que pueden no estar siempre disponibles (esto limita efectivamente el grado en que podemos usar la concurrencia PHP para el código distribuido autoinstalado)

Sólo tipogo someFunction()y esa función se ejecutará en una goroutine.

Conclusión

Si es un desarrollador de PHP nuevo en Go, espero que ahora tenga curiosidad por esta herramienta y piense en dónde podría haber sido útil o si es la opción correcta para usted.

Si eres un programador que prefiere la simplicidad a la complejidad, prefieres el código directo y legible sobre las abstracciones, estoy seguro de que Go encontrarás realmente interesante.


Más tutoriales de go: