Почему Go - мощный язык для изучения PHP-разработчика

Я занимаюсь программированием на PHP профессионально уже 10 лет. После получения степени в области компьютерной инженерии все, что я знал, это то, что Java больше не была моим кусочком пирога (после более чем 6 лет использования ее в личных и академических проектах), я хотелмногоБолее простой стек, и я понял, что быстрый способ продвигать себя как независимого разработчика - попасть на растущий рынок PHP CMS.

С годами PHP изменилсямногои хотя многие люди любят его критиковать или критиковать, многие делают это, основываясь на очень старом и очень небольшом опыте. Современный PHP, особенно если у вас есть возможность использовать типы PHP 7 и оставить позади PHP 5.x, очень приятно работать, и, конечно, PHP имеет то преимущество, что по какой-то причине вы можете развернуть почти любой язык. везде, поэтому многие CMS построены на PHP, и почему они так успешныпотому чтоони основаны на PHP (Граввключены).

Конечно, PHP - это всего лишь один из инструментов, и недавно я сначала погрузился в Go.

По сравнению с PHP Go - это совершенно другой язык и среда.

Это не напыщенная речь или статья, нацеленная на то, чтобы увести вас от PHP, а, скорее, чтобы познакомить вас, разработчика PHP, с тем, почему Go - хороший язык для изучения в качестве дополнительного инструмента.

Перво-наперво: что такое Go?

Go - это императивный объектно-ориентированный язык программирования, разработанный в Google 10 лет назад.

Объединение знаний членов-основателей и оригинальной философии создания лучшего языка для удовлетворения их потребностей привело к созданию Go.

Go - это скомпилированный язык со статической типизацией, со встроенными функциями сборки мусора и параллельного программирования.

Ничего нового

Путь к инновациям в Go довольно интересен. Он полностью игнорирует шумиху о том, какие предполагаемые новые функции должен иметь современный язык и что предоставляют другие языки программирования, а вместо этого отбирает базовую концепцию из проверенных в боях языков, объединяя десятилетия опыта программирования в прекрасный инструмент для использования.

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

Конечно, у Go много уникальных функций, это не просто язык гибридных приложений. Go представилгорутины, которые являются прекрасным способом обработки параллелизма. Go представилоткладывать, отличный способ выполнить что-то при возврате внешней функции (теперь она также добавлена в Swift).

Go был первым языком, который представил средство форматирования в стандартных инструментах. И возможность компилировать для других платформ без проблем, плюс еще много «новых» вещей.

Го имеет сильные корни. Прекрасная презентация Роберта Гриземера на GopherCon 2015 иллюстрирует это: Go объединяет многие принципы обоихCи Оберон-2, язык, происходящий из семейства Паскаля. Оба этих языка произошли от Алгола 60, который был представлен в 1960 году.

Так что в следующий разкто-то спросит, почему Go похож на язык 20-летней давности, вы также можете ответить, что на самом деле за его плечами более 60 лет опыта. Как однажды сказал Роберт Гриземер, требуется 10 лет, чтобы язык программирования стал мейнстримом.

Go только начинается, и довольно интересно думать о его будущем и о том, что люди могут с его помощью построить!

Go дополняет PHP

Если вы когда-либо использовали Ruby или Python в дополнение к PHP, вы могли понять, что они более или менее сводятся к другой версии PHP, если вы удалите из уравнения фанатизм и личные предпочтения, поскольку все они являются интерпретируемыми, слабо типизированными языками.

Можно было переключиться с Ruby на PHP и Python и делать то же самое. Единственный «веб-язык», который существенно отличается, - этоJavaScript, который отличается из-за неблокирующей модели (но она была перенесена на другие языки, включая PHP, а также через библиотеки) и потому, что это единственный язык, который в настоящее время работает изначально в браузере, что дает ему огромное преимущество. Кроме того, это гораздо более дикая экосистема неконтролируемых сред выполнения, каждая из которых, возможно, тонко отличается.

Го же - совсем другой зверь. Это системный язык, как C. И в отличие от динамических языков Go работает быстро.

PHP построен на C, и вы можете писать и запускать PHPCрасширения, поэтому понятие системного языка не должнокоторыйчуждый вам.

Go способен заменить ваш веб-стек, и для этого доступны веб-фреймворки, что упрощает работу, но PHP все еще имеет свое место, особенно при прототипировании, и вы все еще не знаете, какая часть вашего кода потребует серьезной оптимизации, и если ваш код действительно будет использоваться.

Итак, когда вам следует использовать Go? Когда вы используете PHP, но PHP - не лучший инструмент для работы. Если PHP потребляет слишком много памяти или ресурсов для определенной части функциональности, то высокооптимизированная программа Go будет работать намного лучше. Просто как тот. PHP 7 замечательно улучшил производительность PHP. Это был бесплатный подарок. Но когда вам нужно обработать миллионы записей базы данных или получить гигабайты данных из API с длительным процессом, PHP может оказаться неподходящим инструментом.

Я полагался наNode.jsв течение нескольких лет, чтобы решить эту проблему, но, как я узнал о Go, до сих пор все, что я придумывал, является гораздо более простым и лучшим решением.

И конечно же, это не все. С Go вы легко создаете кроссплатформенные параллельные приложения, и это сильно отличается от веб-разработки на PHP, намного сложнее, но также - лично говоря - более интересно, и это может открыть для вас множество полезных вакансий.

Итак, как PHP-разработчик вы можете начать передавать сложные задачи Go, а приобретение навыков в этом, несомненно, обогатит ваш выбор карьеры.

Почему Go, а не C C ++ или Java?

У любого языка есть свое место. Конечно, Go не может превзойти производительность C и C ++. Вы можете найти множество тестов.

Go находится посередине между этими двумя основными и историческими языками и динамическими языками: вам нужна более высокая производительность, чем то, что вы можете получить от интерпретируемого языка, но вы не готовы или не хотите использовать C или C ++, которые быстрее, но они слишком низкий уровень, и вам придется вручную управлять памятью, и на разработку потребуется больше времени. Иди подходит этому месту.

Для сильно оптимизированного фрагмента кода - C или C ++ могут быть лучшим решением, если вы хорошо разбираетесь в них. То же самое можно сказать и о сборке.

По сравнению с Java ситуация совершенно иная. Java требует много накладных расходов с точки зрения среды, в то время как программы Go представляют собой один файл, легкие, портативные и нативные.

И мы, вероятно, сравниваем яблоки с апельсинами, вы бы никогда не использовали Go там, где используете Java, и наоборот.

Go прост в душе

(И помните: просто - не значит легко). Избежать расползания функций явно было одной из целей разработчиков Go. Легендарный Кен Томпсон, один из трех первоначальных разработчиков Go, а также создатель UNIX и языка B (среди прочего), однажды сказал:

Когда мы трое [Томпсон, Роб Пайк и Роберт Гриземер] начали, это было чистое исследование. Мы втроем собрались и решили, что ненавидим C ++. [смех]… [Возвращаясь к Go,] мы начали с идеи, что всех троих нужно обсудить с каждой особенностью языка, чтобы в язык не было постороннего мусора по какой-либо причине.

В результате получился язык, который удивительно прост для любого опытного разработчика, кодирующего на любом языке.

Java, C ++, C, C #, Erlang, JavaScript, Swift, почти все современные языки программирования намного сложнее Go.

И здесь я имею в виду сложный для программиста, сложный для чтения, сложный для того, чтобы стать мастером. Внутри Go скрывает всю сложность и предоставляет простой API. Не только в Go есть сборка мусора, но и вообще отсутствует открытая функция управления памятью.

Подумайте, что в PHP 67 ключевых слов, а в Go - 25.

Ключевым моментом здесь является то, что наши программисты - гуглеры, а не исследователи. Как правило, они довольно молоды, только что закончили школу, вероятно, изучали Java, возможно, изучали C или C ++, возможно, изучали Python. Они не способны понимать блестящий язык, но мы хотим использовать их для создания хорошего программного обеспечения. Таким образом, язык, который мы им даем, должен быть простым для понимания и усвоения. - Роб Пайк

Это основа философии Go и объясняет, почему Go предпочитает избегать реализации функций (избегая расползания функций), и почему многие концепции функционального программирования не учитываются, поскольку их сложно обдумывать, открывая дебаты. Чистое функциональное программирование слишком далеко от машинных концепций, чтобы иметь отношение к Go, который по своей сути является императивным языком.

Тем не менее, в Go реализовано множество концепций функционального программирования, таких как функции первого класса (позволяющие назначать функции переменным), замыкания, рекурсия.

Но по сравнению с PHP или JS у вас нет функциональных операций, таких как map, reduce или filter, вы должны полагаться на циклы. Почему? Потому что эти операции неэффективны, и Go необходимо найти баланс.

Говоря о том, что чего-то не хватает, нет никаких исключений для обработки ошибок. Нет классов (даже если он объектно-ориентированный, со структурами со связанными методами, принудительнокомпозиция выше наследования- если вы знакомы с реализацией объекта-прототипа в JavaScript, это будет вам знакомо, но сильно отличается), нет универсальных шаблонов (хотя в PHP их тоже нет) ивот почему.

Меньше - больше, или (даже лучше!)меньше экспоненциально больше.

«Секрет» хорошего дизайна программного обеспечения не в том, чтобы знать, что нужно вставить в код; это было в знании того, что оставить! Это было в распознавании жестких и слабых мест и знании того, где оставить пространство / комнату, а не в попытках втиснуть больше дизайна.

Есть только один способ написать цикл:for. Забыватьwhileиdo — whileиforeach(Нечто большее?).

[…] То, что делает Go успешным, - это то, что было исключено из языка, равно как и то, что было включено.

Возможность возвращать несколько значений из функции позволяет избежать множества уловок (простейший пример - возврат массива, содержащего 2 значения, и необходимость их извлечения, не зная точного переданного типа).

Простота унаследована инструментами.gofix автоматически исправляет критические изменения API в новых выпусках Go.

Go прост по дизайну и всегда будет оставаться простым.

Как говорит Роб Пайкмногие другие языки копируют функции друг друга, теряя свои уникальные аспекты (подумайте о JavaScript, вводящем синтаксис классов, чтобы угодить разработчикам Java и PHP), и все они идеально сходятся в концептуально уникальный язык.

Go не конкурирует по функциям. Это напоминает мне оэта статья "Getting Real".

Остерегайтесь: Go поляризует

У Го много поклонников и много ненавистников. Как разработчик PHP, я уверен, что вы хорошо разбираетесь в подобных «огненных войнах», и мы можем быстро перейти к следующему пункту. Он очень популярен, и у разработчиков есть твердые мнения.

Независимо от того, какие компромиссы вы сделаете, всегда будут критики, потому что ни один язык программирования не может быть идеальным.

Go прекрасно решает проблему. И вам не нужно быть гением, чтобы начать его использовать, хотя это может задеть ваши чувства.

Go очень самоуверен и имеет четкие условности

Первое, что вы заметите в Go, - это то, что почти весь код, который вы можете найти, выглядит почти одинаково.

Это потому, что в Go есть четкие и принудительные условности. Встроенный инструментарий предоставляет 2 команды, связанные с соглашениями (гофмтиГолинт, с первым кодом автоформатирования, а вторым - просто выводом предупреждений), и они могут проверить, соответствует ли ваш код, и даже автоматически настроить ваш стиль в соответствии с рекомендациями Go.

Это отличается от JSESLint/ JSHint, поскольку эти инструменты являются общекомандным приложением. Как и во всем JS, вы можете настроить что угодно в настройках.gofmtодин, без конфигурации, готовый к работе.

Это замечательно для обеспечения согласованности вашего собственного кода (код, который вы написали 5 лет назад на PHP или JavaScript, может бытьоченьотличается от ваших текущих соглашений и предпочтений) и в коде, которыйкаждыйраздает.

Представьте себе, что больше не будет обсуждений внутри команды о лучшем стиле кода, представьте, что все PR для вашего проекта с открытым исходным кодом отформатированы и оформлены одинаково. Пробелы vs0 вкладок, сэкономьте циклы разума - это вкладки. Фигурные скобки в той же строке или в следующей? Одна и та же строка, всегда (для этого есть причина, и она позволяет опускать точки с запятой).

Go вызывает ошибку компиляции, если переменная или импорт не используются, что не позволяет вашим программам со временем накапливать мусор.

Соглашения об именах настолько важны, что модификаторы доступа полностью исключены из уравнения. Строчная переменная? Частный. Переменная с заглавной буквы? Публичный. Все очень просто, простые соглашения устраняют тонны бесполезного использования экранного пространства, плюс это сразу становится понятно.

Комментарии служат для особых нужд, и вы пишете их в специальном синтаксисе, чтобы ваш пакет можно было проверить с помощьюgo docи у вас есть вся необходимая документация, без поиска в Google.

go getв вашем распоряжении, встроенный (что отлично подходит для открытого кода и распространения). Хотя, на мой взгляд, PHPland намного более продвинутый с точки зрения управления зависимостями.

PHPUnit / Codeception? Нет потребности,go testуже есть для вашего*_test.goфайлы.

Это делает вас лучшим программистом

Если вы пришли с PHP, изучение Go заставит вас думать по-другому, по-новому. Это сделает вас лучшим программистом, как и изучение любого другого языка: оно познакомит вас с новыми концепциями. Если это кажется странным и чуждым, это хороший знак, что вы учитесь и растете как разработчик.

Для начала Go компилируется, а не интерпретируется. Совершенно другой рабочий процесс и развертывание.

Если у вас нет опыта строгой типизации, это изменение парадигмы. PHP 7 поставляется с проверкой набора текста, и это отличный помощник, если вам не нужно поддерживать более старые версии PHP. Go строго типизирован. Многие, если не все проблемы типов решаются во время компиляции.

Go удивительно прост, разработан, чтобы быть простым, и быть разработчиком Go означает признать эту простоту и воспользоваться ее преимуществами, а не пытаться написать Java-подобный Go, а принять его.

Говоря просто, я не имею в виду, что Go - это игрушечный язык, это определенно не так, и это не тот язык, на котором я бы познакомил кого-то с программированием.

Под простотой я имею в виду большеминимализмибез пуха.

Когда язык предлагает вам множество способов сделать то же самое, вы вынуждены думать, какой из них лучше, отвлекаясь от проблемы, которую пытаетесь решить.

Вы можете запускать код Go из PHP

Итак, один из способов, с которого я предлагаю начать, - это написать тяжелую рутину или долго выполняющийся фрагмент кода, который потребляет слишком много памяти в качестве службы Go.

Тамнаходятся много способыдля прямого вызова программ Go из PHP, но вы также можете реализоватьочередь обслуживания через ZeroMQили получить доступ к долгоживущей программе go, открыв конечную точку API через обратный прокси. У вас есть много вариантов.

Особое оружие Go: параллелизм

Известно, что PHP-FPM очень хорошо обрабатывает параллельные запросы, порождая новый процесс, который выполняет фактический код PHP для каждого пользователя. И обычно в веб-приложении узким местом является база данных. Но как насчет длительных процессов (то, что вы действительно не хотите создавать в PHP), или когда вам нужно запустить тяжелый вычислительный цикл в запросе PHP, когда вам нужно запустить десятки тысяч одновременных процессов?

PHP имеет поддержку потоков, поэтому он может выполнять параллельную обработку, но в то время как PHP (или даже C и другие) может выполнять параллелизм с помощью внешних по отношению к языку библиотек, Go - эторазработансо встроенным параллельным программированием и предоставляет собственные способы взаимодействия между горутинами.

Нити тяжелые, по сравнению сгорутины. Система может поддерживать 10 тыс. Потоков, и та же система может поддерживать миллионы горутин, поскольку внутренняя реализация горутин потребляет гораздо меньше памяти, как в Java или Erlang.

Таким образом, даже если вам не нужны миллионы одновременных запросов, выигрыш в производительности очевиден.

Кроме того, очень легко переваривать горутины и быстро понимать, что делает код.

Нет необходимости расширять классы или включать специальные расширения, которые могут быть не всегда доступны (это эффективно ограничивает степень, в которой мы можем использовать параллелизм PHP для самостоятельно устанавливаемого распределенного кода)

Просто введитеgo someFunction()и эта функция будет выполнена в горутине.

Вывод

Если вы новичок в Go, я надеюсь, что теперь вам интересно узнать об этом инструменте и вы думаете о том, где он мог бы быть полезен или подходит ли он для вас.

Если вы программист, который предпочитает простоту сложности, предпочитает прямой и читаемый код абстракциям, то я уверен, что Go вам действительно понравится.


Больше руководств по go: