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.

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

Два слова - «туда» и «же», какое из них грубое? Хер - буква русского алфавита.

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

Во всех случаях было обоснование почему и зачем,

Ну, естественно, было. И обоснование, и графики с презентациями, и совещания на разных уровнях, всё было. Как иначе? Но под красивыми слайдами покоится то самое чувство «мы не хотим это говно править, мы хотим это говно переписать (и ещё попробовать поиграться с новой кульной фичей Х в языке Y)».

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

Давно было сказано, программист на фортране может написать программу на фортране на любом языке программирования. Мне кажется это общее свойство, от языка особо не зависит.

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

Но под красивыми слайдами покоится то самое чувство «мы не хотим это говно править, мы хотим это говно переписать (и ещё попробовать поиграться с новой кульной фичей Х в языке Y)».

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

В отличии от.

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

goto конечно будет не хватать, но byte[] и off-heap memory никто не запрещал, код конечно будет не идеоматичным для Java. Но там где требуется производительность так и пишут.

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

Вы упустили ключевой момент

Давеча LIDL (сеть магазинов, типа пятёрочки) пыталась мигрировать на SAP (немецкий 1С). Потратили 7 лет и $580M, после чего поняли, что ни за какие деньги они не смогут завершить переезд, плюнули и смирились с поражением.

А ещё одна контора, в которой работает моя подруга с её парнем, мигрировала инфраструктуру, был колхоз на паппете-апаче-томкате, а хотелось как у нормальных пацанов на кубернетесе всё сделать. И конечно же у них всё получилось. Ушло, правда, 4 года, но получилось. И теперь там, где раньше 4 человека едва справлялось со своей работой, с ней уже легко справляется два отдела, человек 16 в совокупности (и ещё два отдела находятся в процессе создания, авось в следующем году запустят).

Успешный успех он такой, никого не пощадит.

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

Мне-то это не надо рассказывать, я это знаю, но это не полностью заменяет пошаговую отладку. И не error вообще-то, а break, если уж ты пытаешься рассказать мне, как работать в CL.

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

Пошаговый дебаггер в стандарте Common Lisp.
Форма STEP.

(step
  (progn
    (print "first step")
    (print "second step"))
  )

Опции:

 0: [STEP-CONTINUE] Resume normal execution
 1: [STEP-OUT] Resume stepping after returning from this function
 2: [STEP-NEXT] Step over call
 3: [STEP-INTO] Step into call
 4: [RETRY] Retry EVAL of current toplevel form.
 5: [CONTINUE] Ignore error and continue loading file " ... somefile.lisp".

В Emacs Lisp пошаговый дебаггер доступен в любой момент на уровне нажатий клавиш. Но есть только error, break нет.

В Common Lisp есть ещё TRACE.
Можно сделать макрос который оборачивает в STEP или нет разные части кода в зависимости от глобального символа, и сидеть делать шаги по разным функциям. Будет такой «debug build».
В Scheme в новых типах макросов кажется не сделать такое, если нет нормальных Lisp macros в имплементации.

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

А с чего бы ей быть наособицу, там какие-то нечеловеческие организмы работают?

Нет, она уже и есть типа «фортран» :)

Из того, с чем пришлось работать, Java меньше всего подходила для изобретения велосипедов и построения eDSL-ей.

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

Java меньше всего подходила для изобретения велосипедов

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

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

И никаких страшных DSL’ей, которые могли бы кого-нибудь запутать.

Как человек, который делал DSL-и на C++ и Ruby, могу сказать, что да. Выглядит страшно, но вот запутать не смогут.

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

Ты это не мне рассказывай. Расскажи это джаваскриптеру, который нажимает в браузере F12 и один раз мышкой щёлкает - и вот у него готов код для отладки. Расскажи это питонисту, который точно так же делает это за одно нажатие. Объясни, почему описанное тобой лучше (хотя trace, конечно, реально лучше, не знаю, может оно тоже есть в Chrome Dev Tools).

Форма step - это просто чушь, потому что в реальности у тебя N огромных скомпилированных файлов и тебе надо, не сломав ничего и не перекомпилируя, что-то отлаживать. step можно внутри функции написать? Может ли она работать со скомпилированным кодом? А если ты дошёл до конца формы, которую обернул step, и обнаружил, что хочешь шагнуть до возврата из этой функции, как это сделать? Ась?

«Можно сделать» макрос = Можно сделать (R)

Я лично:

  • спрашивал у мейнтенеров SBCL и они признались, что да, они хотят когда-нибудь сделать нормальный пошаговый отладчик
  • неоднократно пользовался отладчиком в Lispworks, который действительно похож на отладчик, и он умеет расширять макросы, невзирая на то, что такие великие самоназванные эксперты, как @lovesan, не умеют догадаться, как это можно сделать и испытывают затруднения. Что характерно, в Allegro он тоже есть. Так и запишем: lovesan не осилил.
  • безусловно знаю и про trace
  • реализовал прототипы отладчика на базе профайлера (инструментирующие) для SBCL и CCL, но мне всё равно не удалось доделать их до конца - нужно было что-то менять в самой реализации.

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

  • и естественно умею отлаживать принтами и нажимать c-c c-c.

Но факт остаётся налицо - в бесплатных реализациях нет нормального пошагового отладчика, во всяком случае, его не было те 4-5 лет назад, когда меня это ещё интересовало. Хотя сделать его можно. Но опять же, «мы такие великие, мы весь код в уме можем выполнять, а кому нужен отладчик, тот лох». Вот поэтому-то и нет вакансий на лиспе. Люди просто стесняются столь великих нанимать. Боятся померкнуть в вашем сиянии.

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

Объясни, почему описанное тобой лучше

Трансляция в нативный код учитывалась в стандарте Common Lisp. Упростить задачу. STEP. TRACE.
В коммерческом Lispworks есть WATCH. Указывается переменная которая показывается в GUI интерфейсе, видно когда она меняется.

Форма step - это просто чушь, потому что в реальности у тебя N огромных скомпилированных файлов и тебе надо, не сломав ничего и не перекомпилируя, что-то отлаживать. step можно внутри функции написать? Может ли она работать со скомпилированным кодом? А если ты дошёл до конца формы, которую обернул step, и обнаружил, что хочешь шагнуть до возврата из этой функции, как это сделать? Ась?

Может. SBCL транслирует любой входной код в нативный.
У тебя огромные «скомпилированные» файлы на Common Lisp?

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

Например в Emacs Lisp нет BREAK. Пошаговая отладка через рекомпиляцию в debug-байткод функции на лету, как невидимый STEP.

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

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

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

Лулзы Извлекаются, Сраки Полыхают!

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

Ну может быть ты и можешь поставить step внутри функции. Дошагал до конца step, а надо дальше шагнуть. Как ты объяснишь джаваскриптеру, что это нельзя?

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

У него там болота. Видимо, они заводили в болото и жертва тонула, не успев испугаться.

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

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

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

Ну может быть ты и можешь поставить step внутри функции. Дошагал до конца step, а надо дальше шагнуть. Как ты объяснишь джаваскриптеру, что это нельзя?

STEP ставить и переставлять для себя. Это временная форма.

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

Может. SBCL транслирует любой входной код в нативный.

Во-первых, уже давно это не так. Во-вторых, в Питоне есть отладчик. В тикле есть. Даже для баша подобие отладчика уже есть (правда, на деле какая-то лажа). В Дельфи есть. В Java есть. В Перле. В JS у кода вообще сложная судьба - он компилируется в машинный код сразу, потом код может ещё кешироваться, потом ещё оптимизация горячих точек (вроде бы так в V8, но они там всё время всё меняют, может быть это уже не так). Но и там отладчик есть.

Везде, везде есть пошаговая отладка. Даже в Прологе она есть, представь себе. Даже машинный код можно прошагивать, даже в QEMU можно начальные загрузчики шагать. Даже в Transact-SQL.

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

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

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

Вот ты запиши коротенькое видео на 2 минуты, как это делать, приди к JS-макаке и покажи. Потом расскажешь, что получилось. Удалось ли убедить перейти на лисп или макака ещё подумает.

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

В Lispworks отладчик присутствует и можно мышкой брекпойнты ставить.

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

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

А в лиспворксе всё то же самое - компиляция в нативный код, смешанная с интерпретацией, и fasl-файлы там тоже присутствуют, и declare optimize. Но они сделали. Потому что им не пальцы гнуть, а деньги зарабатывать продажей своей среды нужно. Они не только упивались своим величием, но и делали инструменты для макак.

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

Но если мне будут платить 50 долларов в час, то так и быть, я займусь доделыванием отладчика, форкнув SBCL и SLIME, и скорее всего за пару месяцев чистого времени (за пару кварталов календарного) у меня это получится. Потому что у меня уже был 3-4 года назад работающий прототип, в том числе и по макросам в скомпилированном коде там можно было ходить, даже, кажется, не делая повторно macroexpand во время выполнения, а пользуясь ровно тем результатом, который был во время исходной компиляции. Хотя не помню. В целом я лиспом уже давно не занимаюсь, но это хорошие деньги, да и технология приятная. Но вам же это не нужно для упивания величием. Поэтому сидите сами в этом.

Хотя нет, для халтуры маловато. Надо 100.

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

Я констатирую превосходство(superiority) Common Lisp.
Не уговариваю.

STEP реализован полностью как macro. Достаточно было получить код как данные и добавить кодовые вставки для шагов. Instrumentation.
Внутри пошаговой функции/формы, чтобы пройти дальше в вызываемую функцию - ту функцию тоже надо обернуть в STEP, иначе step-into сработает как step-over.

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

Человек просто чересчур откровенно страдает дурью, хотя в таком длинном треде это в общем-то не зазорно. Кое-кто тут вообще намеки на танцопол пытается изредка воткнуть во в принципе вполне адекватные рассуждения, которые выглядят от этого еще более неожиданно и нелепо. Ну так у каждого свои минусы.

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

А ты и не сможешь уговорить, потому что плюсы сферического CL в вакууме отлично компенсируются минусами конкретных реализаций и инструментов. Мы ещё про asdf не вспоминали :)

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

Мы ещё про asdf не вспоминали :)

Я так тоже умею: „Javascript отстой, потому что у меня в node_modules помойка развелась“.

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

javascript-то конечно отстой, но он не претендует на величие. Его просто навязали в качестве стандарта и деваться некуда. А тут великий язык, а система сборки у него такая, что хоть стой, хоть падай. Хотя может быть за последнее время что-то и наладили.

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

Пойми, в SBCL отладчик просто не сделали. Не потому, что это невозможно, а потому что не была поставлена задача, или не осилили.

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

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

Лисп – это прибежище конкретно поехавших.

Слегка.
Любимый Инструмент Слегка Поехавших.

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

Либо Издохнет Совсем. Посмотрим.

Луну И Солнце Переживёт.

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

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

http://www.lispworks.com/documentation/lw80/ide-w/ide-debugger-5.htm

Наверное, где-то есть и видосик, но мне не попался. Соответственно, при попадании на макрос, лиспворкс спрашивает, расширить макрос или нет. Если ответить «да», то он делает macroexpand-1 (в текущем определении макроса, со всеми вытекающими последствиями), и подсовывает расширенный текст прямо в исходник. Дальше идёшь уже по расширенному тексту. А @lovesan не осилил такое дизайнерское решение придумать, а ещё мнит себя экспертом.

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

В смысле ваши DSLи на C++ и Ruby путали

Да какой там! Поскольку я программировать не умею, то произвожу говнокод от которого все ржут и кричат «Образцовое нинужно!»

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

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

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

Тяжело объяснить js-макаке, что вместо нажатия мышкой breakpoint устанавливается путём изменения исходных текстов

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

А не хошь — как хошь. Была бы честь предложена.

брекпойнты ставятся мышью

Цитата_№1_на_лорквотес.org

Я смотрю, второй тебе больше понравился? Много всяких кнопочек и окошечек, так и просят — тыкни нас! тыкни! мышкой! %)

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