GoLang: Жарт, що зайшов занадто далеко

Поява GoLang стала неочікуваною подією у світі мов програмування. Запропонована розробниками Google — Робертом Пайком та Кеном Томпсоном (розробниками мови C та операційної системи Unix), мова Go (також відома як GoLang) претендувала на просте розв’язання проблем, що переповнювали сучасні мови програмування. Але що, якщо це був лише добре спланований жарт?

GoLang нібито забезпечує легкість і простоту програмування. На перший погляд, відсутність генериків, мінімалістичний синтаксис та однозначність у поведінці можуть здаватися привабливими рішеннями. Але для тих, хто знайомий зі складністю сучасних проектів, ці «простоти» виглядають не як зручність, а як навмисний пародійний жест.

Одним із найяскравіших прикладів цього є відсутність генериків на ранніх етапах розробки GoLang. Замість універсальних шаблонів програмісти змушені вручну писати функції для кожного типу даних. Це повертає нас до часів C++, коли для кожної реалізації вимагалася окрема функція, що значно знижує ефективність розробки та підтримки коду.

GoLang також відмовився від класичної об’єктно-орієнтованої моделі, яка дозволяє будувати більш складні й логічно структуровані ієрархії. Замість цього розробники змушені копіювати та вставляти код, що нагадує практики 90-х років, незважаючи на всі технічні досягнення сучасності. Ще однією проблемою є практика «покращення» існуючих типів у непов’язаних модулях, через що важко зрозуміти, де саме реалізований певний метод. Це значно ускладнює процес діагностики, перетворюючи його на пошук голки в копиці сіна.

Відмова від винятків і структурованої обробки помилок також підкреслює прагнення до спрощення, що, втім, має свою ціну — зменшення стабільності та передбачуваності. Відсутність концепції Null або None у GoLang робить роботу з відсутніми значеннями додатково ускладненою, що може призводити до непередбачуваних ситуацій. Використання оператора ’after’ замість класичного блоку ’finally’ створює додаткову складність і робить код менш інтуїтивним для підтримки.

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

Ще одним аспектом є заміна класичної багатозадачності на горутини. Горутини реалізують модель кооперативної багатозадачності, де кожна горутина продовжує виконання, поки явно не передасть керування. Це робиться, наприклад, при взаємодії через канали або інших точках синхронізації. На відміну від примусової багатозадачності, яка використовує планувальник ОС для перемикання контексту між потоками, кооперативна модель покладається на добровільну передачу керування. Це означає, що неправильно написана горутина може заблокувати весь процес, оскільки немає автоматичного механізму примусового переривання. Така модель вимагає від програміста більше уваги до координації, що збільшує ризик виникнення помилок синхронізації та блокувань.

Як продовження цієї історії, був винайдений формат protobuf разом з окремою мовою для опису структур даних та компілятором для генерування коду, що покликаний подолати обмеження GoLang. Згодом інші мови програмування змушені були адаптувати protobuf, часто всупереч своїм власним парадигмам, оскільки код, який генерував для них protoc, був зовсім не схожий на звичний код цих мов. Також протягом часу protobuf був змушений додати типи обгортки, щоб забезпечити семантику відсутнього значення, яка раніше не існувала та інші «звичні» можливості.

Отже, якщо ви задумалися, чи можливо вся історія з GoLang — це просто спланований жарт для тих, хто не побачив її справжньої мети, то ви не самотні. У GoLang є щось безперечно відмінне від інших мов — але чи там, де це потрібно? Недостатня простота та відсутність деяких важливих інструментів перетворилася на чисту пародію, яку сприйняли як серйозне рішення серйозних проблем.

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось1
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Такое ощущение, что домохозяйки и куховарки активно ломанусь писать технические топики на ДОУ, заручившись поддержкой базовой версии chatgpt.

Це повертає нас до часів C++, коли для кожної реалізації вимагалася окрема
функція

Автор, а ти нічого не поплутав ?
Бо у C++ шаблони існують з продавних часів.

Я так понял, аллюзии никто из комментаторов не уловил.

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

Взагалі, стаття попахує відредактованим твором від ChatGPT

Перевірив у чеккерах, цей контент згенерований.

Ваш код, написаний в IDE, на 90% складається з символів автокомпліту...

Це правда, можливо навіть більше, і це добре, якщо воно виповнює свою задачу.
Проте є дуже суттєва різниця між кодом, як інструментом рішення софтверних та бізнесових проблем, та контентрайтінгом для людей.

В чому ця різниця? :)) Бойлерплейту у human-to-human навіть більше, ніж в коді :)

Це питання, м’ягко кажучи, дивує, бо на мій погляд, це щось, що зрозуміло на інстиктивному рівн і справа далеко не в бойлерплейті.

Конкретно цей текст плоский, він не має креативної частини, людяного дотику, стилю, і певного роду критики. Не має того, за що ми любимо гарні твори.

При цьому, код має бути плоским, максимально зрозумілим і, навіть, тупим.

Автокомпліт — це максимально тупа фігня, яка детерміновано парсить простір імен та дивиться що може запропонувати.

Ти навіть з допомогою більш потужної LLM облажався дико.

Це повертає нас до часів C++, коли для кожної реалізації вимагалася окрема функція, що значно знижує ефективність розробки та підтримки коду.

ээээ... шаблоны в плюсы добавили больше 30 лет назад

Автор із тих, кто страшного звіра с++ в очі не бачив,,, але осуждаю...

GoLang також відмовився від класичної об’єктно-орієнтованої моделі, яка дозволяє будувати більш складні й логічно структуровані ієрархії.

Останні 7 років працюю з Elixir і ООП в мене, як чогось що покращує розробку, в думках взагалі нема. Тому цей аргумент сильно суб’єктивний

Як на мене, велика проблема у тому, що людина, яка оволоділа однією мовою програмування та однією концепцією, стає настільки затвердлою, що як тільки стикається з кимось іншим, то не в змозі зрозуміти ідеї та починаю критику виключно тому, що це не схоже з його звичками.

GoLang: Жарт

Уявляю. Зібралися такі рада директорів Google.
— У нас все досить сіро та похмуро. Треба вигадати якийсь жарт. Які пропозиції?
— Ну давайте позвемо декілька найкрутіших фахівців у галузі типу Роберта Пайка, ще витратимо тисячі людино годин наших сеньйорів і розробимо нову мову програмування.
— Прийнято. Інвестори жарт зацінять.

витратимо тисячі людино годин наших сеньйорів і розробимо

Судячи з killedbygoogle.com це не проблема

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

Я ще додам окремо по потоках.
Примусове перемикання потоків це найпростіший і найлегший з типів багатопоточності.
Якщо у вас це визиває біль тоя не розумію як ви працуєте з автоматичними переключеннями потоків.
У ас є один поток одні данні, ви їх обробили пішли в сон, передали на потік нижчого приорітету, обробили менш пріорітетні данні, пішли в сон, передали на найнижчий потік з умовно відправкою данних.
Єдине що від вас необхідно — сформувати структуру готовності данних зверху до низу, вам не преба ніяких семафорів, ніяких гонок данних, воно примітивне, тупе, !ШВИДКЕ! і працює без помилок.
Але так, не зручне, якщо у вас система має обробляти не суміжні між собою данні.

Ви просто не розумієте концепцій оптимізації, ваші шаблони змушують робити функції громізткими бо треба враховувати ВСІ виключення для всіх мождивих типів данних, і в мене буде 10 функцій кожна на 20 строк а у вас галерея з іфів на всі випадки в мене буде кожна копійована функція виконуватись за Х часу, а ваша шаблонна за Х*К часу.

Також ви не розуміте концепції багатозадачності, існує багато різних типів від ронд робін до пріоритетності зміни потоків для різного типу задач підходить різна, і пріорітетність, наприклад по перше швидша(уявіть собі переклчення потоків займає час) по друге, якшо ви її розумієте то місцями набагато зручніша, те що ви не можете її відслідкувати це ваша проблема.

Рондробін також чудова штука, але має свої недоліки, але зручніша для інших типів задач.

Щоб в цьому розібратись спробуйте програмувати на контролерах різні задачі, може тоді прийде розуміння чому шаблони це не завжди добре, а автоматична зміна потоків інколи безглузда річ

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

Взагалі цікаво що усі топіки подібного характеру виглядають абсолютно однаковими по змісту.
Якось інші мови хейтять більш цікавіше.
А тут слабувато. Ті ж дженеріки. Ще на самій зорі go розробки памʼятаю як перший аргумент. Мабуть зібралась команда якась

«Так, вийшла нова мова. Треба терміново обісрати Які ідеї?»
«Ну там нема дженеріків»
— Ага, все їм п@зда

Це вже настільки мемно стало, що підозрюю їх ввели навіть не через те, що це сильно було потрібно. Просто задовбали.
Якось жив без них, підвезли — круто. Але чесно не сильно часто юзаю

«Хвилі котились через мол й падали вниз нестримним домкратом...» ©

після прочитання дуже сильно захотілось аргументовано опонувати на цю діч, але не встиг(
в коментах все по полицях пояснили

Замість цього розробники змушені копіювати та вставляти код, що нагадує практики 90-х років, незважаючи на всі технічні досягнення сучасності.

Роблю це успішно з будь якою мовою.

Що за трешину я прочитав

відсутність генериків

Вже завезли

Замість універсальних шаблонів програмісти змушені вручну писати функції для кожного типу даних

interface{} ні не чули?

GoLang також відмовився від класичної об’єктно-орієнтованої моделі, яка дозволяє будувати більш складні й логічно структуровані ієрархії

«класичне» жава-стайл ООП — не єдина і тим більше не найкраща парадігма.

Замість цього розробники змушені копіювати та вставляти код, що нагадує практики 90-х років, незважаючи на всі технічні досягнення сучасності

interface ні не чули?

Відсутність концепції Null або None у GoLang робить роботу з відсутніми значеннями додатково ускладненою, що може призводити до непередбачуваних ситуацій

Поінтер який може бути nil а може мати значення — чи не подобається?

Це нагадує спробу створити поштову систему без адрес, сподіваючись, що повідомлення якось знайде свого отримувача

Що значить якось. Якщо прочитаєш — гарантовано отримаєш.

Використання каналів ускладнює відстеження потоку даних та може призводити до блокувань, якщо горутина неочікувано не зчитує дані з каналу

Буфиризовані канали, select default — ні не чули?

Це означає, що неправильно написана горутина може заблокувати весь процес, оскільки немає автоматичного механізму примусового переривання

Вже завезли, давно.

А тепер найцікавіше!

Ще однією проблемою є практика «покращення» існуючих типів у непов’язаних модулях, через що важко зрозуміти, де саме реалізований певний метод. Це значно ускладнює процес діагностики, перетворюючи його на пошук голки в копиці сіна.

Це ж про traits/typeclasses з раста/хацкеля!
В го не можна навісити нові методи на типи з інших пекеджів, ай яй яй!

Використання оператора ’after’ замість класичного блоку ’finally’ створює додаткову складність і робить код менш інтуїтивним для підтримки.

Але ж в го нема оператора «after», є «defer».

Автор — ChatGPT? Як не соромно :-)

Але ж в го нема оператора «after», є «defer».
Автор — ChatGPT? Як не соромно

Ні, таких тупих помилок ChatGPT точно не робить, на відміну від людини яка не торопає про що пише

Дик навпаки, це виглядає як класична галюцінація. Як і загальний стиль статті.

Ну осіннє загострення. Я на інших форумах ще не таку хрінь читав.
Тут просто про те, що базовий синтаксис Go та інших мов ChatGPT точно знає і не чув щоб він вставляв неіснуючі оператори туди.
P.s defer одна із найулюбленіших моїх фітч базового Go

Go відомий своєю мінімалістичністю, однак це також призводить до браку важливих бібліотек у стандартному наборі. Наприклад, в Go немає вбудованої підтримки таких речей, як робота з JSON Schema, складні операції з рядками або високорівневі засоби для роботи з базами даних. Розробники часто змушені використовувати сторонні бібліотеки, що іноді призводить до проблем з сумісністю або навіть зниження безпеки.

Запитав чатгопоту, дивись що згалюціонувала.

pastebin.com/9QdPEHR8 — почитай весь текст, мені здається там один і той же стиль.

Ну може то колективна творчість. Але у тому що тобі сгенерував чат навіть більше правди і логіки. Все суперечливо, але все ж таки більш логічне.

У автора написано «if you don’t have problems yet, it’s easy to fix»
В принципі відповідає духу цієї статті — нормальна технологія, яка міцно зайняла свою нішу на ринку. Ні, треба обісрати.

відсутність генериків

дивно, щось говорити про дженерики, коли вони вже декілька років є

GoLang також відмовився від класичної об’єктно-орієнтованої моделі

холіварна тема, та це скоріш новий тренд, багато мов створюються подібно і дуже багато кому це подобається

Відмова від винятків і структурованої обробки помилок також підкреслює прагнення до спрощення, що, втім, має свою ціну — зменшення стабільності та передбачуваності.

ще одна дуже холіварна тема. Зараз доречі популярна в інтернеті. Та це теж тренд, який багато кому подобається. Це є в Rust, Go та інші. Та навіть в Swift додали таку можливість

Відсутність концепції Null або None у GoLang робить роботу з відсутніми значеннями додатково ускладненою

є nill, є нульові значення, є error, можна повертати декілька значень і тд. в 99% випадках як на мене цього достатньо. мене навпаки бісить працювати з мовами (а доводиться) де треба працювати з String?

Використання оператора ’after’ замість класичного блоку ’finally’

взагалі не знаю про що мова...

і тд і тд

багато субʼєктивних накидів, але жодного аргумента та прикладу і порівнянь «як треба». не дуже виглядає, як технічна стаття. Може це жарт, а не стаття? ;)

Правильна назва мови — Go. Про це написано на офіційному сайті. Зустрічається також «Golang» в соціальних мережах та тегах, але не «GoLang».

В Go є генеріки. Почитати про їх можна в офіційному блозі команди Go: Intro, Why, When.

По перше, будь-ласка не пиши

GoLang

. Це боляче читати. Це як писати DotNet, PhP, rOr. Ми пишемо або Go або якщо хочемо щоб це можна було шукати то Golang. І жодному разі не Go lang.

Я не знаю звідки в тебе стільки ненависті, до того, що на тебе не впливає. Ну не подобається то не бери. Таке відчуття, що тебе відшила співробітниця з слова «Йду краще на Go попишу».

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

Простота Go не про розробку. Це про бізнес. Просто вчити, просто підтримувати, просто розробляти. Бізнесу насрати на фічі які є в мові. Бізнесу треби швидкий і ефективний інструмент для роботи. А ми розробники вже любимо побавитись з різними цікавими речима.

GoLang також відмовився від класичної об’єктно-орієнтованої моделі, яка дозволяє будувати більш складні й логічно структуровані ієрархії.

Поперше наслідування в класичному варіанті не має нічого спільного з обєктно-орієнтованим програмуванням. В нас є інші способи як досягнути подібного ефекту. По друге зараз багато мов відмовились від наслідування. Тут в нас є Rust i Zig (поправити якщо не прявий). Проблема в додатковій складності і надмірній абстракції. Подивись в сторону інтерфейсів в Go. Це ж карсиво.

Відсутність концепції Null або None у GoLang робить роботу з відсутніми значеннями додатково ускладненою

А-яя—яя—яй. А якже nil? От Rust дісйсно взяв і відмовився. Молодці.

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

А якже event-driven архітектура? Там часто пишеш і уявлення не маєш чи хтось почитає.

оскільки немає автоматичного механізму примусового переривання

Є. Ок. Не вивчим мат частину. Пішов писати злісні пости. Вірю, буває. Конкурентна модель дуже ефективна. В JS доречі є називається event-loop, що є близьким братом.

Це боляче читати. Друже, я реально не розумію, для чого прийти, насрати і ще не приготовитись. Ну я розумію є підлітковий період. Але ти явно його переріс. Кожен інструмент має свою цінь. Навіть той самий РНР, які всі хейтять по звичці но не знають чому. В мене відверто склалось враження, що твій досвід з Го це 2-3 прочитанні статті основі яких ти склав своє враження. Ну не нехай. Але для чого після того йти і обсирати ? :)

По перше, будь-ласка не пиши

Цього достатньо

відсутність генериків,

Та якоби вже 4 версії як є. Але вони ніколи не потрібні :) Ніхто не знає, що з ними робити.

Ну, тому що «просто генеріки», коли все інше яскраво anti-OOP’шне, не дуже допоможуть :)

А яке відношення женерики мають до ооп? В функціональних мовах ооп нема, а на женериках все тримається. Як так?

Нарешті я все зрозумів, піду подам заявку на вивчення Rust

Важко з чимось сперечатись, бо wrong on so many levels і взагалі враження що текст написано штучним інтелектом.

Як продовження цієї історії, був винайдений формат protobuf разом з окремою мовою для опису структур даних та компілятором для генерування коду, що покликаний подолати обмеження GoLang.

Protocol Buffers:

Initial release
Early 2001 (internal)
July 7, 2008 (public)

Golang:

First appeared November 10, 2009

In Springfield, they’re eating the dogs. The people that came in. They’re eating the cats. They’re eating — they’re eating the pets of the people that live there.

They do not eat gophers, so we are ok :)

Це повертає нас до часів C++, коли для кожної реалізації вимагалася окрема функція, що значно знижує ефективність розробки та підтримки коду

... Templates were introduced in Release 3.0 of the language, in October 1991. In The Design and Evolution of C++, Stroustrup reveals that it was a mistake to introduce this feature so late...

Підписатись на коментарі