Съдържание на курса

Урок 0 — Какво е Go, откъде се появи и защо си струва да го научиш

От Dorian Chávez · основател на Hábil и архитект на интеграции ·

Продължителност: 30–45 минути четене, все още без писане на код.

Като приключиш, ще можеш:

  • Да разкажеш кой създаде Go, кога и какъв конкретен проблем се опитваше да реши.
  • Да обясниш защо съществува нов език, след като вече имаше десетки.
  • Да назовеш три програми, които използваш или администрираш и които са написани на Go.
  • Да кажеш в какво Go е добър и в какво не е, за да не го използваш там, където не е подходящ.
  • Да поставиш Go сред другите езици, които вече познаваш или за които си чувал.

Защо е важно

2007 година е. Google има една от най-големите кодови бази в света, написана предимно на C++. И има един много конкретен и много скучен проблем: компилацията трае цяла вечност.

Една-единствена промяна в заглавен файл можеше да предизвика прекомпилация от 45 минути или повече.

Помисли какво означава това за онзи, който програмира. Променяш един ред. Чакаш 45 минути. Откриваш, че си сбъркал една запетая. Променяш друг ред. Чакаш още 45 минути. За един работен ден успяваш да опиташ осем неща.

На 21 септември 2007 г. трима инженери на Google застанаха пред една бяла дъска, за да проектират език, който да не ги кара да чакат. Именно за този език е целият курс, а останалата част от този урок обяснява как от онази дъска са стигнали до езика, който ще инсталираш в урок 1.


Понятията

0.1 Кой го създаде (и защо това е важно)

Не бяха трима случайни програмисти:

Кой е
Ken Thompson Създаде Unix. И създаде езика B, прекия предшественик на C, който написа заедно с Dennis Ritchie. Награда „Тюринг“ — еквивалентът на Нобелова награда в компютърните науки — през 1983 г.
Rob Pike Работи по Unix и създаде Plan 9, неговия наследник. Съизобретател на UTF-8 — начина, по който днес се съхранява текст практически навсякъде по света, включително този документ
Robert Griesemer Работи по JavaScript двигателя V8 (този на Chrome и Node.js) и по виртуалната машина на Java

🔑 Прочети това още веднъж: един от създателите на Go е създателят на Unix и съавтор на C. Петдесет години след като изобрети инструментите, върху които е изграден целият съвременен софтуер, същият човек проектира Go.

Това обяснява много за характера на езика: Go се усеща като C — пряк, малък, без украшения — но без капаните, които правеха C минно поле.

0.2 Трите изисквания, които никой не покриваше

Тримата искаха език с три свойства едновременно:

  1. Да се компилира бързо. Първоначалният проблем.
  2. Да се изпълнява бързо. Google пуска софтуер на хиляди машини: скоростта струва истински пари.
  3. Да се програмира лесно. Нов човек в екипа да може да прочете чужд код и да го разбере още първия ден.

Прегледаха съществуващите езици. И тук е интересното откритие: намериха езици, които покриваха две от трите, но нито един, който да покрива и трите.

Компилира се бързо Изпълнява се бързо Лесен за програмиране
C / C++ ❌ ✅ ❌
Java 🟡 ✅ 🟡
Python ✅ (не се компилира) ❌ ✅
Go ✅ ✅ ✅

0.3 Как беше постигната простотата: чрез премахване на неща

Ето най-неочакваното решение в Go и онова, което най-много го отличава.

Почти всички езици растат: всяка версия добавя възможности. C++ е натрупвал такива с десетилетия и резултатът е толкова голям, че никой не го познава изцяло. Има хора, които програмират на C++ двайсет години и продължават да откриват ъгълчета, които не са познавали.

Go направи обратното: реши какво да остави навън. Той няма:

  • Класове и наследяване. Начинът за преизползване на код е друг и ще го видиш в урок 3.
  • Изключения (try / catch). Грешките се обработват по друг начин и ще го видиш в урок 2.
  • Предефиниране на оператори. + означава събиране, винаги, и това не може да се промени.
  • Конструктори и деструктори.
  • Куп начини да се направи едно и също. Почти винаги има един идиоматичен начин.

⚠️ Това ще те дразни понякога. Ще поискаш да направиш нещо, което на друг език става с един ред, а на Go ще ти отнеме пет. Компенсацията е огромна и се вижда след месеци: можеш да четеш код на Go, написан от когото и да е, и да го разбираш. Няма диалекти, няма трикове, не е нужно да учиш как програмира всеки отделен екип.

🔑 Цитатът, който обобщава философията, на Rob Pike: „Яснотата е по-добра от хитроумието.“

0.4 Другата причина: компютрите спряха да ускоряват

Зад Go има и втори мотив и той е свързан с хардуера.

До около 2005 г. всяка година излизаха по-бързи процесори и твоята програма работеше по-бързо, без да пипнеш нищо. Това свърши: процесорите спряха да увеличават скоростта си и започнаха да умножават ядрата. Твоят лаптоп няма един изключително бърз процесор: той има 4, 8 или 16 скромни процесора.

Проблемът: една обикновена програма използва едно ядро. Другите петнайсет стоят там и гледат.

За да ги използваш, трябва да пишеш програми, които правят няколко неща едновременно, а това — конкурентността — традиционно беше една от най-трудните и най-податливи на грешки задачи в цялото програмиране.

Go беше проектиран около това. Да накараш две неща да се случват едновременно в Go буквално означава да напишеш една дума:

go revisarServicio()

Тази дума go — същата, която дава името на езика — е възможността, която го направи известен. Ще я научиш в урок 6 и когато стигнеш дотам, ще разбереш защо толкова много хора преминаха към този език.

0.5 Хронологията

Дата Какво се случи
21 септ. 2007 Griesemer, Pike и Thompson проектират Go на бяла дъска
средата на 2008 вече има работещ компилатор
10 ноем. 2009 Google го обявява публично и го пуска като свободен софтуер
28 март 2012 Go 1.0, първата стабилна версия
от 2012 нататък две големи версии годишно, всеки февруари и август
днес Go 1.27

🔑 И нещо, което си струва да знаеш: обещанието за съвместимост на Go 1. От 2012 г. екипът на Go обеща, че програма, написана за Go 1.0, продължава да се компилира и днес, четиринайсет години по-късно. Удържаха на думата си.

Това не е нормално. При много езици код отпреди пет години вече не се компилира. В Go това, което научиш днес, ще ти служи и след десет години, а това прави времето, което ще вложиш, много по-оправдано.

0.6 Какво е написано на Go (вероятно вече го използваш)

Това не е рекламен списък: целта е да видиш къде се използва този език, защото това казва много за какво служи.

Какво е
Docker инструментът, който пакетира приложения в контейнери
Kubernetes системата, която управлява хиляди контейнери на сървъри. Използва го половината индустрия
Terraform създава инфраструктура в облака чрез писане на файлове
Prometheus · Grafana събират метрики от сървъри и ги изобразяват графично
Traefik · Caddy уеб сървъри и балансьори на натоварването
CockroachDB · InfluxDB бази данни
Hugo генератор на статични уебсайтове, известен със своята скорост
ngrok, rclone, gh (CLI-ят на GitHub) инструменти за команден ред

🔑 Виждаш ли закономерността? Почти всичко са инфраструктурни инструменти: неща, които работят на сървъри, които трябва да са бързи, които се разгръщат като един самостоятелен файл и които обслужват много връзки едновременно. Именно там Go печели и това не е случайно: това е точно проблемът, който имаше Google.

0.7 И тогава защо ти да го научиш?

Четири честни причини:

1. Учи се бързо. Спецификацията на Go се прочита за един следобед. Тази на C++ има над 1,800 страници. Ще можеш да пишеш полезни програми за седмици, а не за години, а това е много важно, когато тепърва започваш.

2. Учи те на неща, които са полезни във всеки език. Тъй като е компилиран и със строги типове, Go те задължава да мислиш за типове, за памет и за грешки. Тези понятия се пренасят: ако после програмираш на Java, C# или Rust, вече ги имаш.

3. Има работа. Всичко, което работи на съвременни сървъри, има Go вътре. Ако те интересуват инфраструктура, облак, DevOps или бекенд, това е един от най-сигурните залози.

4. Това, което научиш, няма да остарее. Благодарение на обещанието за съвместимост на Go 1.

0.8 Какво ще изградиш в този курс

Програма за команден ред, наречена revisor (проверител): получава списък от услуги, проверява ги всичките едновременно и изготвя отчет.

$ revisor --config servicios.txt --formato tabla
SERVICIO    ESTADO    TIEMPO  DETALLE
catalogo    OK         142ms  200
inventario  LENTO       2.3s  200
pagos       OK          87ms  200
reportes    FALLA          —  connection refused

Изглежда малка. Не е. За да я напишеш добре, ще ти трябва всичко: типове, structs, грешки, интерфейси, списъци, конкурентност, HTTP, конфигурационни файлове, тестове и компилиране на изпълним файл.

И тя ще расте заедно с теб: всеки урок добавя по едно парче. Накрая ще имаш програма, която наистина би могъл да използваш, а не упражнение от учебник.


Грешката, която ще видиш

Този урок все още няма собствен код, така че няма съобщение от компилатора, което да ти покажа. Но има една грешка в мисленето, която почти всеки прави, докато чете раздел 0.3, и си струва да те предупредя предварително, за да не те спре, когато ти се случи.

Грешката: да прочетеш списъка с онова, което Go няма — класове, наследяване, изключения, предефиниране на оператори — и да заключиш „значи е беден език, липсват му неща, които ми трябват“.

Защо е грешка: бърка да имаш по-малко инструменти с да можеш да решаваш по-малко проблеми. Go не ти е отнел възможността да преизползваш код, нито да обработваш грешки: дал ти е един начин да го правиш вместо десет и този начин ще научиш в уроци 2 и 3. Разочарованието е истинско и е нормално — и ти ще го почувстваш през първата седмица, — но се преодолява с програмиране, а не с избягване на езика. Когато завършиш урок 3, ще можеш отново да прочетеш раздел 0.3 и да видиш защо всеки ред от онзи списък е решение, а не недостатък.


Какво се прави погрешно

Толкова важно, колкото да знаеш за какво служи един инструмент, е да знаеш за какво не служи. Никой език не е добър за всичко и който ти казва обратното, се опитва да ти продаде нещо. Да използваш Go там, където не е подходящ, е първият антипатърн (antipattern) в този курс, още преди да си написал и един ред:

Не е най-добрият избор за Какво се използва вместо него Защо
Приложения за iPhone или Android Swift, Kotlin платформите са направени за тях
Уеб страници (това, което работи в браузъра) JavaScript, TypeScript браузърът изпълнява само JavaScript
Наука за данните, изкуствен интелект Python всички библиотеки на света са там
Големи видеоигри C++, C# нуждаят се от абсолютен контрол над паметта и хардуера
Системи, в които една микросекунда има значение C, C++, Rust Go има събирач на боклук (garbage collector), който понякога паузира програмата

Упражнения

Въпроси за преговор

0.1 Какъв конкретен проблем мотивира създаването на Go и в коя година?

0.2 Назови тримата създатели на Go и кажи защо е важно кой е Ken Thompson.

0.3 Кои бяха трите изисквания, които търсеха, и защо нито един съществуващ език не им вършеше работа?

0.4 Посочи три неща, които Go няма, нарочно. Какво се печели, като се премахнат?

0.5 Какво се промени в хардуера около 2005 г. и каква е връзката с Go?

0.6 Какво е обещанието за съвместимост на Go 1 и защо е изгодно за теб?

0.7 Назови три програми, написани на Go, и кажи какво общо имат.

0.8 Дай два случая, в които не би използвал Go, и кажи какво би използвал.

Отвъд основите

0.9 Потърси в интернет оригиналната лекция или статия „Go at Google: Language Design in the Service of Software Engineering“ на Rob Pike. Прочети въведението и запиши една причина за дизайна, която не е в този урок.

0.10 Избери две от програмите в раздел 0.6, които не познаваш. Разбери с едно изречение какво прави всяка от тях и го запиши в своя дневник.

0.11 Намери съдържанието на спецификацията на езика Go (The Go Programming Language Specification) и преброй колко страници или раздела има. Сравни го със стандарта на C++. Запиши двете числа: това е най-конкретният начин да видиш какво означава „прост“.

0.12 (За размисъл, без верен отговор) Go премахна изключенията, класовете и наследяването — неща, които други езици смятат за незаменими. Хрумва ли ти някаква причина, поради която премахването на една възможност може да направи един език по-добър? Напиши мнението си в дневника преди да започнеш курса и го прочети отново, когато приключиш. Интересно е да видиш дали се е променило.

Решения

0.1 Времето за компилация на C++ в Google: една промяна в заглавен файл можеше да струва 45 минути прекомпилация. Започнаха на 21 септември 2007 г.

0.2 Robert Griesemer, Rob Pike и Ken Thompson. Thompson създаде Unix и езика B, предшественик на C, който написа с Dennis Ritchie. С други думи: един от авторите на инструментите, върху които е изграден съвременният софтуер, проектира и Go, петдесет години по-късно.

0.3 Бърза компилация, бързо изпълнение и лекота на програмиране. Съществуващите езици покриваха две от трите: C++ беше бърз при изпълнение, но бавен при компилация и труден; Python беше лесен, но бавен при изпълнение.

0.4 Класове и наследяване, изключения, предефиниране на оператори, конструктори. Печели се четимост: код на Go, написан от когото и да е, може да се прочете и разбере, защото няма диалекти, нито много начини да се направи едно и също.

0.5 Процесорите спряха да ускоряват и започнаха да умножават ядрата. Една обикновена програма използва само едно, така че беше нужен език, на който писането на конкурентни програми да е лесно. Оттам и думата go.

0.6 Обещанието, че програма, написана за Go 1.0 (2012), продължава да се компилира и днес. Изгодно е за теб, защото това, което научиш, не остарява, а кодът, който напишеш, ще продължи да работи години наред.

0.7 Docker, Kubernetes, Terraform, Prometheus, Grafana, Hugo… Всички те са инфраструктурни инструменти: работят на сървъри, разпространяват се като един самостоятелен изпълним файл и обслужват много връзки едновременно.

0.8 Мобилни приложения (Swift/Kotlin), код за браузъра (JavaScript), наука за данните (Python), големи видеоигри (C++), системи със строго реално време (C или Rust).

0.9-0.12 Нямат един-единствен верен отговор: те са за проучване и лична рефлексия. Сравни записаното с някой съученик или в дневника на курса, а не с фиксиран отговор.


Как разбирам, че съм успял

В този урок няма код за компилиране, така че контролният списък е за разбиране. Отбележи всяка точка само ако можеш да я изпълниш без да поглеждаш отново текста:

  • ☐ Обясняваш със свои думи, за по-малко от минута, защо се появи Go и какъв проблем решаваше.
  • ☐ Назоваваш тримата създатели и казваш защо това, че Ken Thompson е един от тях, не е факт за пълнеж.
  • ☐ Казваш какво са бързата компилация, бързото изпълнение и лекотата на програмиране и защо нито един език преди Go не притежаваше и трите.
  • ☐ Назоваваш по памет поне три неща, които Go реши да няма, и обясняваш какво се печели с премахването им.
  • ☐ Обясняваш връзката между ядрата на процесора, конкурентността и думата go.
  • ☐ Назоваваш три програми, написани на Go, и казваш какво общо имат.
  • ☐ Даваш пример за проблем, за който не би използвал Go, и казваш какво би използвал вместо него.
  • ☐ Реши осемте въпроса за преговор, без да поглеждаш решенията, преди да сравниш.

Ако нещо ти липсва, не продължавай още към урок 1: прочети отново съответния раздел. Всичко, което следва, се опира на това.


Резюме

  • Go се появи през 2007 г. в Google заради разочарованието от времето за компилация на C++: 45 минути заради една промяна в заглавен файл.
  • Създадоха го Robert Griesemer, Rob Pike и Ken Thompson; Thompson създаде Unix и е съавтор на C.
  • Търсеха три свойства заедно — бърза компилация, бързо изпълнение, лекота — които нито един език от онова време не притежаваше едновременно.
  • Go постигна простотата, като премахна неща: без класове, без наследяване, без изключения, без предефиниране на оператори.
  • Вторият мотив беше хардуерът: процесорите умножиха ядрата вместо да ускоряват, а използването им изискваше конкурентността да е лесна. Оттам и думата go.
  • Беше обявен през 2009 г., а версия 1.0 излезе през 2012 г.; днес е на 1.27, с две големи версии годишно.
  • Обещанието за съвместимост на Go 1 гарантира, че кодът от 2012 г. продължава да се компилира: това, което научаваш, не остарява.
  • Go доминира в инфраструктурата: Docker, Kubernetes, Terraform, Prometheus, Grafana.
  • Не е най-добрият избор за мобилни устройства, браузър, наука за данните, видеоигри или строго реално време.

За допълнително четене

  1. Спецификацията на езика — The Go Programming Language Specification, на go.dev/ref/spec. Това е официалният източник и, както видя в упражнение 0.11, се прочита за един следобед. Не е нужно да я разбереш цялата днес; струва си да знаеш, че съществува и е кратка.
  2. Официалният блог на Go — go.dev/blog, където самият екип публикува новостите на всяка версия и статии за дизайна.
  3. Rob Pike, „Go at Google: Language Design in the Service of Software Engineering“ — оригиналната лекция/статия, в която един от създателите обяснява решенията за дизайна в контекста на Google. Това е четивото от упражнение 0.9 и най-прекият път да разбереш защо стои зад всяко решение, което видя в този урок.

Термини от този урок

компилирам превеждам изходен код в машинни инструкции
конкурентност програмата да прави няколко неща едновременно
заглавен файл (header) в C/C++ — файл с декларации, който други файлове включват
Go 1 (обещание за съвместимост) ангажимент старият код да продължава да се компилира
ядро (core) всеки независим процесор в един и същ чип
награда „Тюринг“ най-високото признание в компютърните науки
събирач на боклук част от езика, която освобождава паметта автоматично
UTF-8 стандартен начин за представяне на текст, съизобретен от Rob Pike и Ken Thompson
Да обсъдим вашия проект

Предпочитате имейл? Пишете ни на hola@habil.mx