Pourquoi Go est un langage puissant à apprendre en tant que développeur PHP

Je programme en PHP professionnellement depuis 10 ans maintenant. Après mon diplôme en génie informatique, tout ce que je savais, c'est que Java n'était plus mon morceau de gâteau (après plus de 6 ans à l'utiliser pour des projets personnels et académiques), je voulais unbeaucouppile plus simple et j'ai compris qu'un moyen rapide de me commercialiser en tant que développeur indépendant était de pénétrer le marché en plein essor des CMS PHP.

Au fil des années, PHP a changébeaucoupet alors que beaucoup de gens aiment le dénigrer ou le critiquer, beaucoup le font sur la base d'une expérience très ancienne et très limitée. PHP moderne, surtout si vous avez le luxe d'utiliser les types PHP 7 et de laisser PHP 5.x derrière, est très agréable à utiliser, et bien sûr, PHP a l'avantage d'être, pour une raison quelconque, le langage que vous pouvez presque déployer. partout, c'est pourquoi de nombreux CMS sont construits en PHP, et pourquoi ils réussissent si biencarils sont basés sur PHP (Gravinclus).

Bien sûr, PHP n'est qu'un outil, et récemment, je me suis plongé dans Go tête la première.

Comparé à PHP, Go est un langage et un environnement complètement différents.

Ce n'est pas une diatribe ou un article visant à vous éloigner de PHP, mais plutôt à vous présenter, développeur PHP, pourquoi Go est un bon langage à apprendre en tant qu'outil complémentaire.

Tout d'abord: qu'est-ce que Go?

Go est un langage de programmation impératif orienté objet conçu chez Google il y a 10 ans.

La connaissance combinée des membres fondateurs et la philosophie originale de créer le meilleur langage pour les besoins qu'ils avaient, ont conduit à Go.

Go est un langage compilé, typé statiquement, avec un ramasse-miettes et des fonctionnalités de programmation simultanée intégrées.

Ce n'est rien de nouveau

La façon dont Go procède à l'innovation est assez intéressante. Il ignore complètement le battage médiatique sur les nouvelles fonctionnalités supposées qu'un langage moderne devrait avoir, et ce que d'autres langages de programmation fournissent, mais choisit plutôt le concept de base des langages testés au combat, regroupant des décennies d'expérience de programmation dans un bel outil à utiliser.

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

Go a de nombreuses fonctionnalités uniques, bien sûr, ce n'est pas seulement un langage de mashup. Allez présentégoroutines, qui sont un moyen incroyable de gérer la concurrence. Allez présentéreporter, un excellent moyen d'exécuter quelque chose lorsque la fonction externe revient (désormais également ajoutée à Swift).

Go a été le premier langage à introduire un formateur dans les outils standard. Et la possibilité de compiler pour d'autres plates-formes sans friction, ainsi que bien d'autres choses «nouvelles».

Go a de solides racines. Une belle présentation à la GopherCon 2015 par Robert Griesemer l'illustre: Go fusionne de nombreux principes des deuxCet Oberon-2, qui est une langue issue de la famille Pascal. Ces deux langues proviennent d'Algol 60, qui a été introduit en 1960.

Alors la prochaine foisquelqu'un demande pourquoi Go ressemble à une langue d'il y a 20 ans, vous pouvez tout aussi bien répondre qu'il a en fait plus de 60 ans d'expérience à son actif. Comme l'a dit un jour Robert Griesemer, il faut 10 ans pour qu'un langage de programmation devienne courant.

Go ne fait que commencer, ce qui est assez excitant de penser à son avenir et à ce que les gens peuvent construire avec!

Go est complémentaire de PHP

Si vous avez déjà utilisé Ruby ou Python en plus de PHP, vous avez peut-être réalisé qu'ils se résument plus ou moins à une version différente de PHP, si vous supprimez le fanboyisme et les préférences personnelles de l'équation, car tous sont interprétés, des langages mal typés.

On pourrait passer de Ruby à PHP et Python et faire les mêmes choses. Le seul «langage Web» qui diffère sensiblement estJavaScript, ce qui est différent en raison du modèle non bloquant (mais qui a été migré vers d'autres langages, y compris PHP également via des bibliothèques) et parce que c'est le seul langage actuellement exécuté en natif dans le navigateur, ce qui lui donne un énorme avantage. En outre, c'est un écosystème beaucoup plus sauvage d'environnements d'exécution incontrôlés, tous différents de manière éventuellement subtile.

Par contre, c'est une bête complètement différente. C'est un langage système, comme C. Et contrairement aux langages dynamiques, Go est rapide.

PHP est construit en C, et vous pouvez écrire et exécuter PHPCextensions, de sorte que le concept de langage système ne doit pas êtrecetteétranger à vous.

Go est capable de remplacer votre pile Web, et il existe des frameworks Web disponibles pour cela, ce qui facilite les choses, mais PHP a toujours sa place, en particulier lors du prototypage et vous ne savez toujours pas quelle partie de votre code nécessitera une forte optimisation, et si votre code sera vraiment utilisé après tout.

Alors, quand devriez-vous utiliser Go? Lorsque vous utilisez PHP, mais PHP n'est pas vraiment le meilleur outil pour le travail. Si PHP consomme trop de mémoire ou de ressources pour une fonctionnalité particulière, et qu'un programme Go hautement optimisé fonctionnera beaucoup mieux. Aussi simple que cela. PHP 7 a été incroyable pour améliorer les performances de PHP. C'était un cadeau gratuit. Mais lorsque vous devez traiter des millions d'entrées de base de données ou récupérer des gigaoctets de données à partir d'une API avec un processus de longue durée, PHP peut ne pas être le bon outil.

J'ai compté surNode.jsdepuis quelques années pour résoudre ce problème, mais comme j'ai appris à connaître Go, jusqu'à présent, tout ce que je propose Go est une solution beaucoup plus simple et meilleure.

Et cela ne s'arrête pas là, bien sûr. Avec Go, vous créez des applications multiplateformes et simultanées en un rien de temps, ce qui est très différent du développement Web PHP, beaucoup plus difficile, mais aussi - personnellement parlant - plus intéressant, et cela pourrait vous ouvrir de nombreux emplois enrichissants.

Ainsi, en tant que développeur PHP, vous pouvez commencer à confier des tâches exigeantes à Go, tout en devenant compétent dans ce domaine enrichira sûrement vos choix de carrière.

Pourquoi Go et pas C C ++ ou Java?

Toute langue a sa place. Go ne peut certainement pas battre les performances C et C ++. Il existe de nombreux repères que vous pouvez trouver.

Go se situe au milieu de ces 2 langages traditionnels et historiques et des langages dynamiques: vous voulez plus de performances que ce que vous pouvez obtenir d'un langage interprété, mais vous n'êtes pas prêt ou pas prêt à utiliser C ou C ++, qui sont plus rapides mais ils sont trop bas, et vous auriez besoin de gérer manuellement la mémoire, et cela prendrait beaucoup plus de temps à se développer. Go correspond à cet endroit.

Pour un morceau de code fortement optimisé - C ou C ++ pourrait être une meilleure solution, si vous en maîtrisez parfaitement. Je pourrais dire la même chose pour l'Assemblée.

Par rapport à Java, c'est une situation complètement différente. Java nécessite beaucoup de temps système en termes d'environnement, tandis que les programmes Go sont un fichier unique, léger, portable et natif.

Et nous comparons probablement des pommes aux oranges, vous n'utiliserez jamais Go là où vous utilisez Java, et le contraire est vrai.

Go est simple dans l'âme

(Et rappelez-vous: simple ne veut pas dire facile) Éviter le fluage des fonctionnalités était clairement l'un des objectifs des concepteurs de Go. Le légendaire Ken Thompson, l'un des 3 concepteurs originaux de Go, également créateur d'UNIX et du langage B (entre autres), a dit un jour

Quand nous trois [Thompson, Rob Pike et Robert Griesemer] avons commencé, c'était de la recherche pure. Nous nous sommes réunis tous les trois et avons décidé que nous détestions le C ++. [rires]… [De retour à Go,] nous avons commencé avec l'idée que nous devions tous les trois être parlé dans chaque fonctionnalité de la langue, donc il n'y avait pas de déchets superflus mis dans la langue pour quelque raison que ce soit.

Cela a abouti à un langage incroyablement simple pour tout développeur expérimenté qui codait dans n'importe quel langage.

Java, C ++, C, C #, Erlang, JavaScript, Swift, presque tous les langages de programmation modernes sont bien plus complexes que Go.

Et ici je veux dire complexe à utiliser pour le programmeur, complexe à lire, complexe à devenir maître. À l'intérieur, Go cache toute la complexité et expose une API simple. Non seulement Go dispose d'un garbage collection, mais il n'y a pas du tout de fonctionnalité de gestion de la mémoire exposée.

Pensez simplement que PHP a 67 mots-clés, tandis que Go en a 25.

Le point clé ici est que nos programmeurs sont des Googleurs, ce ne sont pas des chercheurs. Ils sont généralement, assez jeunes, fraîchement sortis de l'école, probablement appris Java, peut-être appris C ou C ++, probablement appris Python. Ils ne sont pas capables de comprendre un langage brillant, mais nous voulons les utiliser pour créer de bons logiciels. Ainsi, le langage que nous leur donnons doit être facile à comprendre et à adopter pour eux. - Rob Pike

Ceci est au cœur de la philosophie de Go, et explique pourquoi Go choisit d'éviter d'implémenter des fonctionnalités (évitant le fluage des fonctionnalités), et pourquoi de nombreux concepts de programmation fonctionnelle sont laissés de côté, car ils sont complexes à raisonner, ouvrant des débats. La programmation fonctionnelle pure est trop éloignée des concepts de la machine pour être pertinente à Go, qui est un langage impératif dans l'âme.

Cela dit, Go a mis en œuvre de nombreux concepts de programmation fonctionnelle, comme les fonctions de première classe (permettant d'attribuer des fonctions à des variables), les fermetures, la récursivité.

Mais par rapport à PHP ou JS, vous n'avez pas d'opérations fonctionnelles comme mapper, réduire ou filtrer, vous devez vous fier aux boucles. Pourquoi? Parce que ces opérations sont inefficaces et que Go doit trouver un équilibre.

En parlant de choses manquantes, il n'y a pas d'exceptions pour gérer les erreurs. Il n'y a pas de classes (même si elle est orientée objet, avec des structures avec des méthodes associées, forçantcomposition sur héritage- si vous avez des connaissances sur l'implémentation d'objet prototype de JavaScript, ce sera familier, mais très différent), pas de génériques (bien que PHP ne les ait pas aussi), etvoici pourquoi.

Moins est plus, ou (encore mieux!)moins est exponentiellement plus.

Le «secret» d'une bonne conception de logiciel n'était pas de savoir quoi mettre dans le code; c'était en sachant quoi laisser de côté! C'était en reconnaissant où se trouvaient les points durs et les points faibles, et en sachant où laisser de l'espace / de la pièce plutôt que d'essayer de s'entasser dans plus de design

Il n'y a qu'une seule façon d'écrire une boucle:for. Oublierwhileetdo — whileetforeach(quelque chose de plus?).

[…] Ce qui fait le succès de Go, c'est ce qui a été laissé de côté, tout autant que ce qui a été inclus.

La possibilité de renvoyer plusieurs valeurs d'une fonction évite de nombreuses astuces (l'exemple le plus simple est de renvoyer un tableau contenant 2 valeurs, et de devoir les extraire sans connaître le type exact passé).

La simplicité est héritée de l'outillage.gofix corrige automatiquement les changements de rupture de l'API dans les nouvelles versions de Go.

Et Go est simple de par sa conception et restera toujours simple.

Comme le dit Rob Pike, de nombreux autres langages copient des fonctionnalités les uns des autres, perdant leurs aspects uniques (pensez à JavaScript introduisant la syntaxe des classes pour plaire aux développeurs Java et PHP) et ils convergent tous idéalement vers un langage conceptuellement unique.

Go n'est pas en concurrence dans les fonctionnalités. Cela me rappellecet article Getting Real.

Attention: Go polarise

Go a beaucoup de fans et beaucoup de haineux aussi. En tant que développeur PHP, je suis sûr que vous avez développé une peau épaisse sur ce genre de guerre des flammes, et nous pouvons rapidement passer au point suivant. C'est très populaire et les développeurs ont des opinions bien arrêtées.

Quels que soient les compromis que vous faites, il y aura toujours des critiques, car aucun langage de programmation ne peut être parfait

Go résout un problème à merveille. Et vous n'avez pas besoin d'être un génie pour commencer à l'utiliser, même si cela pourrait vous blesser.

Go est très opiniâtre et a des conventions claires

L'une des premières choses que vous remarquerez à propos de Go est que presque tout le code que vous pouvez trouver est presque identique.

C'est parce que Go a des conventions claires et forcées. L'outillage intégré fournit 2 commandes liées aux conventions (gofmtetGolint, avec le premier code de formatage automatique, et le second ne faisant qu'imprimer des avertissements), et ils peuvent vérifier si votre code est conforme, et même ajuster automatiquement votre style aux directives Go.

C'est différent de JSESLint/ JSHint, car ces outils sont des applications à l'échelle de l'équipe. Comme dans tout JS, vous pouvez personnaliser n'importe quoi dans les préférences.gofmtest un, pas de configuration, c'est-à-dire le style de la voie à suivre.

C'est génial pour assurer la cohérence de votre propre code (le code que vous avez écrit il y a 5 ans en PHP ou JavaScript peut êtretrèsdifférent de vos conventions et préférences actuelles) et sur du code quitout le mondedistribue.

Imaginez plus de discussions en équipe interne sur le meilleur style de code, imaginez tous les PR de votre projet open source formatés et lintés de la même manière. Espaces vs 0 onglets, enregistrez les cycles de l'esprit - ce sont des onglets. Accolades sur la même ligne ou dans la suivante? Une même ligne, toujours (il y a une raison à cela, c'est de permettre d'omettre les points-virgules)

Go génère une erreur de compilation si une variable ou une importation n'est pas utilisée, empêchant vos programmes d'accumuler des déchets au fil du temps.

Les conventions de dénomination sont si importantes que les modificateurs d'accès ont été totalement supprimés de l'équation. Variable minuscule? Privé. Variable capitalisée? Publique. Aussi simple que cela, une simple convention supprime des tonnes d'utilisation inutile de l'espace d'écran, et c'est immédiatement compréhensible.

Les commentaires répondent à un besoin particulier, et vous les écrivez dans une syntaxe spéciale afin que votre package puisse être inspecté en utilisantgo docet vous disposez de toute la documentation dont vous avez besoin sans la rechercher sur Google.

go getest à votre disposition, intégré (ce qui est idéal pour l'open source et la distribution). Bien que PHPland soit beaucoup plus avancé à mon avis en termes de gestion des dépendances.

PHPUnit / Codeception? Ce n'est pas nécessaire,go testest déjà là pour votre*_test.godes dossiers.

Cela fait de vous un meilleur programmeur

Si vous venez de PHP, apprendre Go vous fera penser d'une manière différente et nouvelle. Cela fera de vous un meilleur programmeur, tout comme l'apprentissage de n'importe quel langage différent: cela vous présente de nouveaux concepts. Si cela vous semble étrange et étranger, c'est un bon signe que vous apprenez et grandissez en tant que développeur.

Pour commencer, Go est compilé au lieu d'être interprété. Flux de travail et déploiement complètement différents.

Si vous n'avez pas d'expérience avec la frappe forte, c'est un changement de paradigme. PHP 7 est livré avec une vérification de frappe, et c'est d'une grande aide si vous n'avez pas à prendre en charge les anciennes versions de PHP. Go est fortement typé. De nombreux problèmes de types, sinon tous, sont résolus au moment de la compilation.

Go est incroyablement simple, conçu pour être simple, et être un développeur Go signifie reconnaître cette simplicité et en tirer parti, et ne pas essayer d'écrire Go comme Java, mais l'adopter.

Et par simple, je ne veux pas dire que Go est un langage jouet, ce n'est certainement pas le cas, et ce n'est pas un langage dans lequel j'introduirais quelqu'un au codage.

Par simplicité, je veux dire plusminimalismeetsans peluches.

Lorsqu'une langue vous offre de nombreuses façons de faire la même chose, vous êtes obligé de penser à ce qui est le mieux, ce qui vous distrait du problème que vous essayez de résoudre.

Vous pouvez exécuter du code Go à partir de PHP

Je suggère donc de commencer par coder une routine lourde ou un morceau de code de longue durée qui consomme trop de mémoire en tant que service Go.

sommes de nombreux façonspour appeler directement les programmes Go depuis PHP, mais vous pouvez également choisir d'implémenter unfile d'attente de service via ZeroMQ, ou accédez à un programme go de longue durée en exposant un point de terminaison d'API via un proxy inverse. Vous avez de nombreuses options.

L'arme spéciale de Go: la concurrence

PHP-FPM est connu pour gérer très bien les requêtes simultanées, engendrant un nouveau processus qui exécute le code PHP réel pour chaque utilisateur. Et généralement, dans une application Web, la base de données est le goulot d'étranglement. Mais qu'en est-il des processus de longue durée (quelque chose que vous ne voulez pas vraiment construire en PHP), ou lorsque vous devez démarrer une boucle de calcul lourde dans une requête PHP, où vous devez exécuter des dizaines de milliers de processus simultanés?

PHP prend en charge les threads, il peut donc effectuer un traitement simultané, mais alors que PHP (ou même C et autres) peut faire de la concurrence à l'aide de bibliothèques externes au langage, Go estconçuavec programmation simultanée intégrée, et fournit des moyens natifs de communiquer entre les goroutines.

Les fils sont lourds, comparés àgoroutines. Un système pourrait supporter 10k threads, et le même système pourrait supporter des millions de goroutines, car l'implémentation interne de la mémoire des goroutines est beaucoup plus légère, comme en Java ou Erlang.

Ainsi, même si vous n'avez pas besoin de millions de requêtes simultanées, les gains de performances sont évidents.

De plus, il est très facile de digérer les goroutines et de comprendre ce que fait le code d'un simple coup d'œil.

Pas besoin d'étendre les classes ou d'inclure des extensions spéciales, qui peuvent ne pas être toujours disponibles (cela limite effectivement la mesure dans laquelle nous pouvons utiliser la concurrence PHP pour le code distribué auto-installé)

Tapez simplementgo someFunction()et cette fonction sera exécutée dans un goroutine.

Conclusion

Si vous êtes un développeur PHP novice dans Go, j'espère que vous êtes maintenant intéressé par cet outil et que vous vous demandez où il aurait pu être utile, ou si c'est le bon choix pour vous.

Si vous êtes un programmeur qui préfère la simplicité à la complexité, préférez le code direct et lisible aux abstractions, alors je suis sûr que vous trouverez Go vraiment intéressant.


Plus de tutoriels go: