Golang — це як пиво, мовна, від якої не хочеться відмовлятися.

pic

Вступ

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

Як це працює

Зрозумівши, чому Ruby повільний і як спільнота масштабує Ruby-продукти, я побачив, як Ruby втрачає популярність на користь таких мов, як NodeJS і Elixir. Коли ти використовуєш красиву, але повільну мову, будь-яка спроба зробити її швидкою і масштабованою часто призводить до того, що проект стає негарним і складнішим для підтримки — іноді навіть гіршим за проект на C++.

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

Шукаючи альтернативи (Elixir)

Після того, як я зрозумів, що Ruby — не найкращий інструмент для великих продуктів, я побачив, як велика частина спільноти переходить на Elixir. Один із розробників Ruby on Rails (José Valim) створив мову Elixir, щоб виправити проблеми Ruby, використовуючи екосистему BEAM VM. Коли я почав вивчати Elixir, мені було важко зрозуміти синтаксис, нові структури даних, примітивні типи та концепції паралелізму. Elixir схожий на Ruby, але насправді це не так. Але головною причиною, чому я не продовжив з Elixir, була проста: спільнота.

Спільнота

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

Ринок поділений на наступні групи:

  • Боги працюють в FAANG-компаніях з висококласними технологіями (C/C++, Rust, Zig, Golang)
  • Смертні використовують звичайні технології (NodeJS, Ruby, PHP)
  • Хіпстери працюють з Clojure, Elixir, F#

Пошуки

З урахуванням цього контексту, я почав шукати мову з найкращими компромісами: компанії, що наймають інженерів для цієї мови, чудова спільнота з великою кількістю інженерів, які розробляють бібліотеки та фреймворки, і хороший досвід розробки (тому що я заслуговую бути щасливим). Якщо ми подивимося лише на велику спільноту з багатьма відкритими вакансіями, ми можемо говорити про Java, але тоді забуваємо про досвід розробника. Ви будете страждати через анотації, XML файли, перезбірку програми та очікування перезапуску JVM. Це не щастя для мене. Я хочу бути щасливим, як коли я працював з Ruby, або хоча б близько до цього.

Альтернативи, які я пробував

Python

Python має хороший досвід розробки, отримав хороші оновлення з duck typing, асинхронним програмуванням та фреймворками, такими як Django і FastAPI. Але він ще більше страждає від проблем з продуктивністю (як і кожна інтерпретована мова). Кожного разу, коли мені потрібно створити корпоративний додаток на Python, я потребую додаткових бібліотек для перевірки складних типів, запуску юніт-тестів паралельно та налаштування JIT компілятора у проекті — що може бути несумісним з фреймворком, який я використовую через фрагментовану екосистему. Управління залежностями також включає багато інструментів, таких як venv, virtualenv, poetry та conda. Тепер здається, що UV може об'єднати те, як ми працюємо з залежностями.

Щоб писати дійсно надійне і безпечне програмне забезпечення сьогодні, типи є строго необхідними — JSDoc недостатньо — тому я бачу, як спільнота схиляється до TypeScript, і я безпосередньо перейшов до нього.

TypeScript

TypeScript — це щось, до чого я маю велике почуття, особливо з Deno та Bun. Він намагається виправити проблеми JavaScript, і для мене він робить це чудово, звісно, з певними компромісами.
If you start a big application in TypeScript, hot reload might not be so fast, and build times can be a pain. If you can, please use a monorepo to make life easier, but you don’t always have time to create a new module and plan how things communicate. If you’re creating new modules just to avoid big build times and slow hot reloads, maybe those modules don’t need to exist. Another point is the tsconfig files, which can be complex when you need to configure types correctly.

C

C# — це мова, яка зробила величезний стрибок у розвитку. Вона отримала нові можливості, більше не має обмежень за платформою, зручний спосіб роботи з async/await, а також перенесла хороші частини з F# (такі як Records, Immutability, поліпшення для readonly, типове виведення з var і анотації для Nullability). Крім нових можливостей, .NET Core приніс Minimal APIs, Razor, Maui, Aspire і багато покращень для досвіду розробника з IDE, а також зростаючу екосистему. Вона дозволяє розробляти програмне забезпечення для будь-якої платформи з чудовим досвідом роботи та гарною продуктивністю.

Попри те, що вона вирішує багато проблем Java, C# все ще страждає від складності і надмірної вербозності, а також активно використовує анотації (як Spring). Інші проблеми виникають через старий код, який працює лише на Windows і сильно залежить від Visual Studio. Платні ліцензії на екосистему Windows — також велика проблема (Нік Чапсас говорив про це в одному з відео). Попри ці проблеми, я вважаю C# мовою рівня S+.

І, зрештою, переможець на мою думку

Golang

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

  • Async Await і паралелізм: Golang не має найкращого рішення для паралелізму (як у Elixir/Erlang) або найпростішого (як у JS/Node), але він пропонує невеликий, корисний інтерфейс для роботи з async/await і паралелізмом, використовуючи лише стандартні бібліотеки та прості алгоритми. Це робить роботу з паралельними операціями дуже простою і легкою для підтримки.
  • Продуктивність і складність: Golang не такий швидкий, як Rust, але дає продуктивність, близьку до Rust, з меншою складністю і коротшою кривою навчання, майже як інтерпретована мова.
  • DX (Developer Experience): Golang не такий простий, як Python, але має дуже прості зарезервовані ключові слова і принципи розробки, що дає чудовий досвід розробки без жертвування продуктивністю.
  • Великі кодові бази: Golang надає типобезпечний досвід із дуже швидким часом компіляції, навіть для великих репозиторіїв.
  • Розробка для багатьох платформ: За допомогою Golang можна створювати API, веб-додатки та ігри. Хоча наразі не має стабільних мобільних інструментів, я думаю, що він має хороші принципи, які можна буде розширити і на мобільні платформи колись.

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

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

Перекладено з: Golang Is Like Beer, the Programming Language You Stop

Leave a Reply

Your email address will not be published. Required fields are marked *