gadfi: когда-то программирование не сводилось к разработке интернет-магазина. Для тех кому нужно что-то продавать и особо не париться уже есть куча движков на всевозможных языках. Достаточно немного переделать под задачу (накопав кучу дров при этом). Все проходят через стадию когда производительность не важна или важна но не так что бы сильно. И через стадию поиска. И по большому счёту не важно куда это вас приведёт. В мир разработки высоко-популярных высоко-нагруженных приложений или к созданию очередного сайта визитки для транспортной или строительной компании.
Недавно составлял список сложного софта который всегда хотелось сделать, но не было такой возможности в силу отсутствия нужных инструментов. Что бы вы привели в качестве такого списка?
LeEnot: логами покрывать нет никакой необходимости. Достаточно пробрасывать ошибку вверх от библиотек к бизнес-логике.
В случае panic сразу видно где упало, никакого дополнительного трейса делать не нужно.
В случае локов достаточно проверить вручную в два-три потока (простые случаи поймаете сразу), а в остальном только много думать и ещё раз думать прежде чем делать.
Для panic так же полезно расставлять defer который его ловит, для него можно написать отдельную функцию которая единообразно отправит информацию об ошибке к вам на почту, например. Главное правило тут что бы при возникновении такой ситуации ваша программа понимала такую возможность и что делать в этом случае. Когда этим пользуешься это просто кайф.
В остальном срабатывает правило - поменьше лишнего кода. Например нет смысла делать кучу ненужных горутин, кучу ненужных встраиваний, код должен быть прост и логичен, благо Golang к этому располагает.
Точно так же если у вас есть логическая единица которая делает какую-то работу просто и хорошо - пускай это будет метод в пакете или целый пакет, тестируется отдельно (а тесты тут очень хорошие и писать их надо - привыкните быстро), поддерживается отдельно, обновляется по сути тоже отдельно.
Это касаемо ошибок. А вот с профилированием не всё так просто. Стоит посмотреть один из докладов Badoo. https://www.youtube.com/watch?v=pOgAnWfNjms и статью habrahabr.ru/post/229169
Пока что статьи приходится собирать по кусочкам, но они отлично гуглятся. В совокупности точка актуальности в Golang была уже пройдена год-пол года назад точно.
Golang достаточно производителен что бы прощать некоторые не оптимальные куски кода и в фактические потолки из-за не оптимального применения вы упрётесь далеко не сразу, всё равно получив отличный результат.
gadfi: всю жизнь прожил в Новосибирске, сейчас уже почти год живу в Великом Новгороде. PHP проекты тут (в Новгороде) особо не встречаются, всё чаще мобильная разработка, компилируемый софт для предприятий, crm и прочие корпоративные штуки. Но когда начинаешь говорить с местными о возможностях Golang - появляется живой интерес.
По поводу работы. Есть люди которые едут, например, в Новосибирск, в Красноярск, не то что бы это сильно мега-полисы, но едут вообще не ради Golang, на самом деле:)
Golang вакансии можно встретить (те о которых я знаю):
Новосибирск
Москва
Санкт-Петербург
Рязань
В ряде европейских городов. Так же есть удалённая работа или работа в которой не важно ходите ли вы в офис или нет. Так можно устроиться в Островок.ру и работать откуда угодно.
Хотите фундаментальных знаний - отправляйтесь в школу, а потом в институт. Изучайте школьную и институтскую программу, куда входит Си, Asm и ещё несколько довольно редко теперь популяризуемых языков вроде Delphi. Скажете что для таких студентов рынка нет? Нет, как раз именно таких студентов все и хотят... от мейла до яндекса.
gadfi: у каждого есть свои предпочтения о том как должен выглядеть ORM и нужен ли он вообще. Другой вопрос что никто за вас не проверит нужную вам библиотеку, а надеяться на туториалы смешно и наивно.
В официальной документации к встроенным в PHP библиотекам (например GD) есть расхождение с действительностью и вы этого не узнаете пока ну сильно не копнёте вглубь.
В Golang'е приходится решать всё теже проблемы что и при использовании других языков программирования:
1. какие конфиги и как использовать, а что делать если я захочу рестартнуть приложение перезагружая только конфиги, а не саму программу? а как не читать файлы конфигов по сто раз?
2. как подключиться к базе данных что бы это не было болью? как передать доступ в базу модулям? как красиво и удобно получать данные из базы?
3. как бы сделать такой ORM что бы удовлетворял конкнкретным потребностям и может быть такой уже написан?
И ещё куча других вопросов... от роутинга, до архиваторов...
Другой вопрос в том что потенциально в Golang это решается продуктивнее... важно лишь понимать какие алгоритмы вам нужны для решения тех или иных задач. Если не понимаете как работает ORM вашей мечты то стоит это выяснить и построив его в Golang точно будете приятно наблюдать результат.
Про то что в Golang сложнее получить опыт... мир вообще сложная штука, сложно сравнивать что сложнее, на самом-то деле:) Вот Си сложный язык, после Golang, который на него в чём-то похож, начинаешь проще и к Си относится.
Вы пока просто не замечаете как много пишут на Golang'е уже сейчас, критическая точка или уже пройдена или будет пройдена в течении полугода-года.
Надо понимать что PHP и Golang во многом разные языки программирования и опыт у них в разном. Вот мой список причин почему вам стоит попробовать что-то сделать работающим на Golang вместо того что бы доказывать его не состоятельность:
1. что бы разобраться в Golang достаточно дня, за два месяца можно написать с нуля сложный код, с многопоточностью, веб-сервером и кучей всего
2. производительность вас действительно порадует, а ещё подход к тому как это работает. Всё таки есть большая разница между скриптами и демонами которые надо запускать лишь единыжды
3. у вас будет доступ к отличной, если не самой лучшей, документации, в том числе к тем пакетам которые написали сущие ламеры (благодаря godoc)
4. у вас изменится мировозрение, вы поймёте что можете при желании сделать что угодно, что потолок ограничений не такой уж и низкий, а в PHP он просто катастрофически ниже вашего текущего в Golang
5. вы сможете полагаться на сильные стороны которых у вас ещё не было в самых рутинных, казалось бы, вещах, получая от этого удовольствие и профит
6. вам есть куда расти, сейчас все компании первой величины либо уже опубликовали вакансии либо уже имеют один-два отдела которые пишут на Golang: Яндекс, Mail.Ru Group, Google, Badoo, DigitalOcean, The New York Times, вот ещё небольшой список https://github.com/golang/go/wiki/GoUsers и он далеко не полный.
Опять таки вы дискутируете потому что не потратили на это время что бы говорить о том что оно не подходит.
У меня был план по переходу на Node.js с последующим переходом на Golang, потому что я тоже не знал что там внутри, как оно всё выйдет и не мог себе позволить заниматься тем что не понятно принесёт ли профит или нет. В результате первый же проект на Node.js показал его сырость в стандартной http библиотеке, я постарался починить или разобраться почему простая и логичная для меня вещь там не работает, но заглянув в череду js файлов движка понял что там сущий ад. Конечно на это можно потратить время и таки разобраться и жить с Node.js хорошо, но смысл? Мне не понравилось качество на примере. Тогда я решил уделить неделю на Golang что бы понять а сложно ли будет пропустить процесс миграции на Node.js что бы перейти сразу на Golang... и чем больше я им занимаюсь тем больше он мне нравится. Даже по тому скудному опыту с Node.js могу сказать что по сравнению с Golang он полный шлак и профита в том что бы его мучать никто так толком и не представил.
Есть ещё одна опасность выбора "языка попроще" для начала, с последующим переходом на что-то посложнее, вроде Golang. Вы теряете время. 8 лет на PHP могут дать многое, но скорость обучения, скорость осознания там маленькая, а то что можно взять с собой дальще - очень не велико.
В PHP вы учите то как это делать именно в PHP, запоминаете почему та или иная функция работает плохо и как это скрестись с чем-то ещё. В Golang'е у вас чистый язык программирования (хоть и с некоторыми плюшками) где вы думаете прежде всего об алгоритмах, вам уже нет нужды абстрагироваться от них через стопку функций в исходный код которых вы никогда в PHP не загляните. Здесь же это обязательная задача - посмотреть что внутри и понять подходит ли этот алгоритм или его надо переписать. Это отличный язык программирования, в том числе и в качестве первого.
Для многих первым языком был QBASIC :) Вторым Turbo/Borland Pascal :) Третьим Delphi... ну и так далее... все они не того же типа что и PHP и тому есть причина.
gadfi: ну в общем "рынок студентов за копейки" он конечно не про Golang:) Особенность таких споров именно в том что один уже использует, а другой именно что "рассматривал" и "не рассмотрел" в пользу какого-то другого языка.
В микросервисной архитектуре можно использовать любые языки программирования, хоть бейсик если захочется и найдутся библиотеки для HTTP или чего-нить ещё для взаимодействия с внешним миром.
Если вас интересуют какие-то конкретные вопросы связанные с Golang и в которых вы не уверены (и именно по этому решили таки его не использовать), то это дело поправимо, можно и рассказать на эту тему.
Вот список того что мне нравится в Golang уже сейчас:
1. производительность, да он адекватно шустрый и я делаю одно действие только один раз, а не при каждом запуске скрипта, алгоритмы упрощаются
2. я пишу в основном серверные варианты (демоны) и гарантировать что они работают и будут работать очень просто, вот что я виду:
- нагрузка предсказуемо распределена по всему приложению
- очень простые потоки (горутины) и работа между ними (то что всегда хотелось в Си, но что в Си делалось куда как сложнее и чего в PHP нет и ещё долго не будет)
- отсутствие исключений, по своей сути в Golang только два вида ошибок - методы возвращают сразу несколько значений, одно из которых можно использовать для возвращения ошибки определённого типа (по сути везде во всех библиотеках используется один и тот же интерфейс ошибки, хоть иногда и с разными реализациями) и panic ошибки которые приводят к полному завершению приложения
- возможность обрабатывать стандартные ошибки как стандартную практику программирования
- возможность обрабатывать panic ошибки изолированно в определённом куске кода, например я знаю что здесь "сложный кусок говна" и если там что-то вдруг упадёт в panic то я знаю что хочу сделать при этом. Например пропустить текущую итерацию и перейти к следующей, при этом на всё оставшееся приложение это не повлияет никак
- отличная работа с памятью, хотя в 1.4 и более ранних версиях наблюдались до 30 секунд залипания при сборке мусора, но это наблюдалось только на 900 миллионах поинтерах и легко снижалось до 3 секунд при определённых манипуляциях (можно посмотреть доклад badoo.com на эту тему), в 1.5 с этим обещали покончить и уже потихоньку приходят тому подтверждения
- единообразие, как синтаксиса так и оформления библиотек
- по настоящему правильно сделанная документация напрямую показывающая все связи в коде (в основном благодаря статической типизации которая тут очень важна), теперь нет такого что код написан так, а документация эдак и не совпадают. Всегда можно посмотреть что там на самом деле
- качество библиотек хорошее, а при желании можно и переписать
- можно переписать стандартные библиотеки входящие в язык программирования, потому что они написаны на том же Golang, в PHP всё совсем не так и мало кто из PHP программистов могут там что-то сделать
- отличная работа со сложными вещами - по сути всё байты
- отличные методологии работы с данными, io.Reader чего только стоит:)
Я попробовал решить на Golang'е все задачи что у меня накопились за 8 лет в PHP, вышло что уровень возможностей с переходом вырос на несколько порядков. В PHP бессмысленно совершенствоваться потому что потолок очень низкий, как только до него доходишь - начинаются пляски и бубны с:
1. PHP Extensions
2. всё равно приходится залазить в код PHP и смотреть почему иногда он работает не адекватно
3. подключать внешние костыли, очереди, скрипты и прочее...
4. делать демоны на PHP одно "удовольствие", что бы гарантировать клиентам адекватную работу с течением времени надо не хило приложиться усилиями
5. выдумывать различные связки что бы один скрипт не убил всё
6. однажды понимаешь как делать пакетную обработку данных на PHP и всё становится веселее:)
P.S. Рынок веб-разработки (вы упоминали upwork), сайто-строение для среднего и малого бизнеса это далеко не весь рынок, а лишь оооочень маленькая часть. Сейчас всё больше и больше компаний не играет в этой лиге.
gadfi: вы когда говорите что "экосистема значительно уступает" вы что имеете в виду?:) И с чем сравниваете.
Количество вакансий маленькое совсем по другой причине, а код вовсе не зелёный. Все основные (а именно сложные) библиотеки на удивление хорошо написаны, а количество багов довольно мало. Многие компании переучивают своих специалистов на Golang не открывая вакансий, некоторые компании зазывают писать на Python, Си, Си++, а по факту дают им Golang.
Есть такой предмет, называется "программирование", в его обучение входит:
1. алгоритмы
2. типы данных
3. методы хранения
4. методы передачи
5. методы обработки
6. формальная логика
7. математика
8. ещё куча всего...
Язык программирования лишь дополняет этот список и как правило изучается не один и изучается не конкретно язык, а программирование на его основе. Я так говорю потому что у меня была определённая школа программирования до PHP.
Опыт на PHP вам мало чем поможет при построении распределённых многопоточных высоконагруженных приложений на Golang. А вот опыт такой работы на Си/Си++ будет очень кстати.
Если речь о студенте который просто хочет найти работу - то альтернатив масса, от макдака, до KFC, если же его задача не тупануть и не проглядеть новое поколение классной разработки - то волей не волей надо смотреть на то что делается на Golang, Rust, R, D, и прочих новых языках, по многим причинам, не только потому что они новые.
Проблема PHP в том что технически теперь нет ни одной причины что бы делать проекты именно на нём. А то что его или любой другой язык будут выбирать сотни и тысячи раз ещё много лет - так это нормально. neodekvat09: хочешь быть высококлассным и всегда зарабатывать кучу денег - изучай Си, потом Си++, всё остальное покажется детским садом.
gadfi: мы с вами по разному на рынок и на задачи смотрим, только и всего. Всегда будут люди считающие Java лучшим языком программирования или люди которые считают что RoR лучшая платформа для CRM и люди которые мечутся из языка в язык что бы решить свои проблемы. Это всегда было и ещё долго можно ожидать что так и будет. Вопрос в другом. Для многих java, python, си, си++ были пройденным этапом с переходом на PHP по ряду причин:
1. простота вхождения
2. терпеливость к ошибкам
3. много уже написанного говнокода который можно как-то адаптировать
4. множество программистов которые могут помочь
5. множество ресурсов на котором уже разобраны проблемы и даны некоторые рекомендации
Были и те кто наоборот из PHP таки перебрался в Java или другой язык что бы вздохнуть свободно при решении каких-то своих конкретных задач.
Но если посмотреть сверху, то получается что ни по одному пункту кроме "очень большое количество говнокодеров" PHP уже не опережает Golang, по крайней мере в мире некоторых программистов. Коих не много, но становится больше с каждым годом.
С переходом на Golang мне абсолютно пофиг на рынок PHP, ибо ни одно из крутых новых решений которые туда превносят за последнии год-два не дотягивают до возможностей которые даются в Golang'е. В этом и причина моего мнения.
А что делает?:) Посмотрите в net консоли происходит ли что-нибудь. Посмотрите в обычной консоли происходят ли ошибки, почитайте документацию... поизучайте то как можно отправлять запросы. А домен в url и домен в ajax запросе совпадают? Учитесь делать ресёрч самостоятельно:)
Практика:) Я по началу тоже искал решение как обозначить несколько каталогов статичными. Например /css /js и некоторые другие... потом просто сделал несколько хандлеров указывающих на одну и туже функцию. Так и нагрузка по горутинам идёт на каталоги не зависимо.