LINUX.ORG.RU

Почему Go это плохо, и он вам, на самом деле, не нужен.

 ,


7

15

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

Дело в том, что Go это, на самом деле, «решение» внутренних гугловских проблем. Но отнюдь не проблем горизонтального масштабирования серверного ПО, как многие почему-то думают. Он приспособлен специально для использования в гугле вот в каком контексте.

Гугл нанимает большое количество тупых студентов, только-только после вуза или ПТУ, и заставлять их писать хоть какой-то простой код. И делать минимум ошибок, при этом. Для этого Go сделан таким тупым и упрощенным. И выкинут в паблик он только для того, чтобы вероятность, что у такого студента, только пришедшего в гугл, было хоть какое-то знание Go, была выше нуля.

Но дело вот в чем. В гугле, на самом деле, над каждой командой гошников стоит тимлид, или целая группа, который/которая вот этим взаимозаменяемым роботам-гошникам расписывает всю систему, чуть ли не вплоть до состояния конечного автомата, до if-ов, и показывает куда и что писать. Поэтому же Go на корню режет всю креативность, поэтому там нет практически никаких средств абстракции, и поэтому он не дает делать вообще ничего сложного. Дабы программисты на нем вообще ничего лишнего не думали, а кодировали все чуть ли не побуквенно по указаниям умных людей.

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

Тут возникает вопрос - а почему этому тимлиду не дать в руки кодогенератор, вместо всей этой accidental complexity, возникающей из-за огромного количества строк кода, и из-за затрат на коммуникацию?

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

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

Естественно, это все отражается на качестве продуктов, и это видно как по полному прекращению инноваций в гугле, так и по постоянно мелькающим и закрывающимся высерам этой компании - hangouts, duo, google plus, google wave, и прочее и прочее, можете еще вспомнить много чего.

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

Никакой мифической простоты в отладке и в понимании кода Go не приносит. Да и сложность программных систем растет совершенно не из-за понятности/непонятности какой-то отдельной взятой строчки кода или функции. Потому, что, во-первых, понятность это понятие субъективное, во-вторых потому, что, отдельно взятая фунцкия на 5 строк понятна любому опытному программисту, будь она написана хоть на Rust, хоть на Common Lisp.

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

В случае если вы не хотите выкидывать кучу денег просто так, и скорее предпочли бы нанять немного, но более-менее опытных программистов, Go будет только вреден, потому что все вменяемые люди от него, на самом деле, плюются. Он реально отталкивает опытных людей, которые способны понять сложные требования и написать, и поддерживать, более-менее сложные системы уровнем хотя бы нескольких сервисов плюс БД и MQ.

★★
Ответ на: комментарий от Forum0888

В CL есть обобщенные функции, для ad-hoc полиморфизма, а вот генерики а-ля C#/Java там в принципе не нужны, потому что типизация - динамическая. Есть массивы с типом данных T(== object). Суй в них что хочешь. При этом в лиспе это все дело оптимизированно, например небольшие числа(до 60 битов, вроде, на 64-битной платформе) и флоаты(32-битные если на 64-битной платформе) не подвержены боксингу, и помещаются в регистры и передаются через регистры.

lovesan ★★
() автор топика
Ответ на: комментарий от lovesan

заколебали каждое левое поделие лиспом называть

в лиспах не особо используют рекурсию

Что поделаешь, люди, когда говорят «лисп», обычно имеют в виду принадлежность к семейству лиспоподобных. Когда имеют в виду конкретный лисп(оподобный язык) или подсемейство, то уточняют — например, Common Lisp, Emacs Lisp, Scheme, Guile Scheme и т.д.

Потому что люди ленивые и не хотят писать «лиспоподобный язык» вместо «лисп».

Nervous ★★★★★
()
Ответ на: комментарий от eao197

Тебе самому не смешно по популярности судить о качестве? На музыку современную посмотри. Канье вест и прочий рэпачок вон - популярны. Это знак качества?

lovesan ★★
() автор топика
Ответ на: комментарий от Nervous

Блеать, ну это как Java, C# итд - называть Си.

Или еще хлеще - это как Java, Python и Scala - называть Алголом.

Что-то никто так не делает, да? А почему с лиспами такое коверкание терминов?

lovesan ★★
() автор топика
Ответ на: комментарий от lovesan

никто так не делает, да?

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

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

Что тут сложного — всё чётко, прозрачно, понятно даже ёжику робату. В отличие от «приставить к нужному месту».

молотка вот нет. а то специалист будет головой забивать. и нет определения процесса - забить.

alysnix ★★★
()
Ответ на: комментарий от alysnix

молотка вот нет.

Это детали реализации. Может, у исполнителя встроенный гвоздомёт есть.

нет определения процесса - забить.

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

Nervous ★★★★★
()
Ответ на: комментарий от Forum0888

при забитии гвоздя не надо философских ваших обобщений. а то работа будет слишком дорого стоить.

надо конкретно колотить молотком пока гвоздь не встанет! и все. без отсылок к Канту, Шопенгауэру или еще к кому.

alysnix ★★★
()
Ответ на: комментарий от Nervous

Это детали реализации. Может, у исполнителя встроенный гвоздомёт есть.

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

alysnix ★★★
()
Ответ на: комментарий от alysnix

Да здесь дураку ясно, что нужна монада, чтобы завернуть в нее весь грязный ввод-вывод на чистую воду!

Virtuos86 ★★★★★
()
Ответ на: комментарий от Virtuos86

Монада это всего лишь моноид в категории эндофункторов!

это же это меняет все дело!.. похоже от гвоздей вообще придется отказаться. слишком сложно это все.

alysnix ★★★
()
Ответ на: комментарий от alysnix

Да не. Там какая-то хитрая магия, в результате которой гвозди сами оказываются в доске, а кто бил непонятно – все с белыми ручками. Главное, не пытаться выяснить, кто же всё это делает на самом деле, иначе придет ктулху и пожрет моск.

Virtuos86 ★★★★★
()
Ответ на: комментарий от lovesan

Тебе самому не смешно по популярности судить о качестве?

Мне смешно с типа илиты (которая на самом деле обычные ничем не выдающиеся программеры, типа вас), которые не могут понять, что для массового производства нужны другие инструменты. Поэтому Go востребован, а CLOS, Haskell или C++ – нет (хотя CLOS вааще никому не всрался). И от этого нежелания смотреть на мир как он есть у вас подгорает. Что смешно, да.

Это знак качества?

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

eao197 ★★★★★
()
Ответ на: комментарий от Virtuos86

моноид в категории эндофункторов

И никаких гвоздей! :D

Nervous ★★★★★
()
Ответ на: комментарий от Nervous

При использовании — почти никакой. Кроме производительности.

При реализации — весь синтаксис алгоритма определяется доступными абстракциями.

Вот есть алгоритм быстрой сортировки. Словами описывается примерно как «поделить все элементы на две группы: не больше первого и остальные, отсортировать группы, поместить первый результат, затем и второй». А реализация уже определяется структурой данных: у массива есть взятие и запись произвольного элемента, у списка есть взятие первого элемента и создание списка из элемента и списка.

monk ★★★★★
()
Ответ на: комментарий от sbu_shpigun

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

Хотя лично мне импонирует. Даже думаю ради интереса потыкать палочкой как-нибудь.

Zhbert ★★★★★
()
Ответ на: комментарий от eao197

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

Судя по всему, я то буду более выдающийся чем ты, что бы ты там не думал.

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

Это ты менеджеркам рассказывай, они, особенно кто потупее и из постсовка, любят, вон Golang, и прочее говно, и разговаривать про Массовое Производство, и прочие говноаналогии с заводов, которые к IT вообще не применимы.

Поэтому Go востребован

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

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

Не хватает конечно. Это инструмент дегенератов. Который все только нихерово усложняет, и ухудшает качество результата. Но, вон в гугле «на то и расчет».

lovesan ★★
() автор топика
Ответ на: комментарий от lovesan

Судя по всему, я то буду более выдающийся чем ты, что бы ты там не думал.

Ну, во-первых, я и не претендую, да и мне поздновато как-то метаться, до пенсии хотя бы дойти своим ходом…

Во-вторых, я ваш C++ный код труба шатал уже как-то обозревал. Средненькое такое качество, помнится, было. ЧСВ у вас явно на порядок круче способностей к программированию (на C++ по крайней мере).

А в-третьих, «судя по всему» – это судя по чему? Любопытно.

Это ты менеджеркам рассказывай

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

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

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

Не хватает конечно.

А давайте вы по пунктам претензии к качеству выкатите?

Тут вот люди уже перечислили реальные качества Go: высокая скорость компиляции, кроссплатформенная компиляция забесплатно, бинарники без лишних зависимостей, защита от «слишком умных» программистов, низкий порог входа, скорость сгенерированного кода гораздо выше Питона и на одном уровне с C#/Java, но без жирных рантаймов, гороутины из коробки + заточенная под них стандартная библиотека.

Да еще и поддержка со стороны Google, а не условного Васи Пупкина из условного Бобруйска.

При таких вводных чуть ли не каждая вторая большая контора должна кричать «Дайте два!»… Ах да, уже же ведь же ж ;)

eao197 ★★★★★
()
Последнее исправление: eao197 (всего исправлений: 1)

фунцкия на 5 строк понятна любому опытному программисту

{
     (Ti To q W)←⍵ ⋄ T←(⊂∘⍋⌷⊢)Ti,To
     d←(¯2-⌿⊢)T ⋄ m←(2÷⍨¯2+⌿⊢)T ⋄ t←¯1↓T
     ((0≠d)⌿t)←0
     b←(t∘.=Ti)×t∘.=To ⋄ ts←(m∘.>Ti)×m∘.<To 
     raw←0,+⍀(b+.×q)+d×ts+.×W ⋄ T raw
 }
buddhist ★★★★★
()
Ответ на: комментарий от eao197

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

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

Neuromagus
()
Ответ на: комментарий от alex1101

Там это именование исторически прижилось. А так - лисп концептуально это AST голой жопой к программисту, потому и макросы, расширяемость, eDSL в каждый дом и в итоге lisp curse, из-за того, что каждый суслик очень агроном.

Dark_SavanT ★★★★★
()
Последнее исправление: Dark_SavanT (всего исправлений: 1)
Ответ на: комментарий от Forum0888

Поддержу. Лавсан хорошо поджёг, старая школа.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от eao197

но без жирных рантаймов

Смотря с чем сравнивать. Рантайм у го всё ещё жирный, хотя наверное и меньше чем у java/.net. В условиях когда флеша мало - 12 мегабайт бинаря это довольно много.

Dark_SavanT ★★★★★
()
Ответ на: комментарий от Dark_SavanT

С этим соглашусь. Я сравнивал с Java/.Net/Python (Python с учетом библиотек).

eao197 ★★★★★
()
Ответ на: комментарий от Zhbert

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

Хайп уже прошёл на флаттер, сейчас оно просто живёт и развивается себе. Ещё там довольно таки хорошая документация, прям как во vue.js они даже похожи чем-то. Флаттер это хороший вариант, сделать под мобилки, не разбираясь ни в свифте, ни в котлине.

sbu_shpigun
()
Ответ на: комментарий от buddhist

Кажется вот в этом месте вызвали ктулху: 2÷⍨¯. Но если разобраться со всеми значками, то будет вероятно что-то тривиальное. Ну это как написать «жопа» на иврите, и тоже ниче непонятно, даже с какой стороны это читается. А на самом деле всё просто

bread
()
Ответ на: комментарий от buddhist

Спросил у https://chat-gpt.org/chat:

Где ошибка?

Ошибка возникает на строке:

((0≠d)⌿t)←0

Ошибка заключается в том, что (0≠d) возвращает булевскую матрицу 
той же формы, что и d, и оператор ⌿ применяется к каждой строке 
этой матрицы. Однако, t имеет размерность (количество строк T) х 
1, поэтому здесь ошибка. Корректным решением может быть замена 
этой строки на:

t[(0≠d)]←0
Что делает этот алгоритм?

Этот алгоритм выполняет следующие действия:

Распаковывает входные аргументы Ti, To, q и W в переменные Ti, 
To, q и W соответственно.

Создает переменную T, которая представляет собой два столбца из 
Ti и To, отсортированных в порядке возрастания по первому столбцу.

Вычисляет переменную d как разность между предыдущим элементом и текущим элементом для каждой строки в T.

Вычисляет переменную m как среднее значение между предыдущим элементом и текущим элементом для каждой строки в T.

Создает переменную t как T, за исключением последней строки.

Заменяет ненулевые значения в t, где соответствующие значения в d не равны нулю, на нули.

Создает переменную b, которая является матрицей, в которой каждый
элемент равен 1, если соответствующие значения в Ti и To равны, и 0 в противном случае.

Создает переменную ts, которая является матрицей, в которой 
каждый элемент равен 1, если соответствующие значения в m больше 
значения в Ti и меньше значения в To, и 0 в противном случае.

Вычисляет переменную raw как результат следующей формулы: b умноженное на q, результат умноженный на d, и результат 
умноженный на W.
Затем это суммируется с произведением d и ts, и результат суммируется по столбцам.

Возвращает переменную T raw.

Нравится вам этот синтаксис?

{
(Ti To q W)←⍵ ⋄ T←(⊂∘⍋⌷⊢)Ti,To
d←(¯2-⌿⊢)T ⋄ m←(2÷⍨¯2+⌿⊢)T ⋄ t←¯1↓T
((0≠d)⌿t)←0
b←(t∘.=Ti)×t∘.=To ⋄ ts←(m∘.>Ti)×m∘.<To raw←0,+⍀(b+.×q)+d×ts+.×W ⋄ T raw }

К сожалению, я не могу оценить этот синтаксис, так как 
предложенный код не принадлежит ни одному известному языку 
программирования.
Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 5)
Ответ на: комментарий от lovesan

А что тут читать. JVM и ко слишком жирные. Node.js и ко слишком тормозные. А го и быстрый и лёгкий.

А что там в языке - вообще пофиг. Важна реализация. А писать можно хоть на бейсике. Тут даже наоборот - чем проще язык, тем лучше. Если к тому же паскалю прикрутить GC, то и был бы идеал. Процедуры, записи и GC, больше ничего толкового не придумали.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

чем проще язык, тем лучше

А так как синтаксически проще лиспов нет ничего… то чем больше язык похож на лисп, тем лучше %)

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

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

(defun factorial(n)
    (if (= n 1)
            (setq a 1)
    )
    (if (> n 1)
        (setq a (* n (factorial (- n 1))))
    )
    (format t "~D! is ~D" n a)
)

->

function factorial(n: integer) {
  var a: integer;

  if (n == 1) {
    a := 1;
  }
  if (n > 1) {
    a := n * factorial(n - 1);
  }
  printf("%d! is %d", n, a);
}

Видишь, ничего по сути не изменилось, а результат - почти идеален.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 4)
Ответ на: комментарий от vbr

но синтаксис нужно использовать сишный

Thanks, but no.

людям нравятся фигурные скобки

{defun square {x} 
  {* x x}}

А чо, недурно выглядит.

Nervous ★★★★★
()
Ответ на: комментарий от vbr

(defun factorial(n)

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

результат - почти идеален

Ну да, ага. Вот так уже гораздо лучше %)

(defun fac (n)
  "Returns n!, consumes the stack."
  (if (zerop n)
      1
      (* n (fac (1- n)))))

(defun fac-1 (n)
  "Returns n!, does not consume the stack."
  (labels ((fac-iter (n result)
             (if (zerop n)
                 result
                 (fac-iter (1- n) (* result n)))))
    (fac-iter n 1)))
(fac 5) ; => 120 (7 bits, #x78, #o170, #b1111000)
(fac-1 20) ; => 2432902008176640000 (62 bits, #x21C3677C82B40000)

P.S. Я честно пытался взорвать стек первой реализацией, но у меня не вышло. Наверное, какая-то особая лиспомагия.

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 2)
Ответ на: комментарий от ugoday

Forth проще.

Там же вроде синтаксически более-менее тот же лисп, только наоборот (постфиксная нотация) и без скобачек. А скобачки же помогают ограниченным человекам понимать структуру. Скобачки человеку друг!

Nervous ★★★★★
()
Последнее исправление: Nervous (всего исправлений: 1)
Ответ на: комментарий от Nervous

zerop

* n

1-

Мда, ради этой гомо… гомо… гомоиконности, во!, лисп идет на кровавые жертвы) В итоге, что называется, money well spent)

goingUp ★★★★★
()
Последнее исправление: goingUp (всего исправлений: 1)
Ответ на: комментарий от goingUp

ради этой гомо… гомо… гомоиконности

Не понял сути претензий, особенно к *. Если назвать zero? и dec, станет лучше? %)

Nervous ★★★★★
()
Ответ на: комментарий от lovesan

Лично я на Go не кодил и не собираюсь, но на нем написали docker и syncthing, обоими вещами пользуюсь. А еще есть gtea/gogs которыми возможно воспользуюсь. Короче, людям нравится писать на нем, и эти люди работают с этим языком весьма продуктивно раз уже успели написать столько всего востребованного.

А вот например возьмем для контратса haskel, что на нем написано? Я знаю только про тайловый менджер xmonad.

Aber ★★★★★
()
Ответ на: комментарий от alysnix

есть только молоток, гвоздь, доска

Вы сделаете класс «Молоток» с методом «забитьГвоздьВДоску» или класс «Гвоздь» с методом «забитьсяВДоскуМолотком»? CLOS мог бы помочь в этом, но не вам.

ugoday ★★★★★
()
Ответ на: комментарий от DanilaZabiakaa

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

ЗЫ он мне очень сильно напоминает шарикова. вот прям из этой сцены https://www.youtube.com/watch?v=BB7V9Ii0tvg

ergo ★★★
()
Ответ на: комментарий от ergo

Лично мне Go нравится другим подходом к ООП. Не могу судить правильный это подход но он по крайне мере другой.

mx__ ★★★★★
()
Ответ на: комментарий от hateyoufeel

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

nager
()
Ограничение на отправку комментариев: