Go dilinə giriş: niyə Go?
Bir dili seçmək sintaksisini bəyənməkdən daha böyük qərardır. Go-nun sadəlik, komanda işi və backend sistemləri arasında qurduğu tarazlığı anla.
Go dilinə giriş: niyə Go?
Matt Holiday · Go Class · İngilis dilində · 6 dəq 28 san
YouTube-da izləBu dərsdə nə öyrənəcəksən?
- Go-nun hansı problemi həll etdiyini anla.
Sadə sintaksisin və ortaq qaydaların böyüyən komandada kodu oxumağa, dəyişməyə və saxlamağa necə kömək etdiyini gör.
- Üç əsas mexanizmi yerinə oturt.
Kompilyasiya kodu icraya hazırlayır, garbage collection yaddaşı təmizləyir, concurrency isə bir neçə işin irəliləyişini təşkil edir. Hər birinin rolunu və sərhədini ayır.
- Dil seçimini əsaslandır.
Real backend ssenarisində Go-nun verəcəyi faydanı, gətirəcəyi xərci və qərardan əvvəl nəyi ölçməli olduğunu müəyyən et.
Dil seçiminin arxasındakı mühəndislik problemi
Təsəvvür et ki, sifarişləri qəbul edən backend xidməti hazırlayırsan. İlk versiyanı bir nəfər yazır. Bir müddət sonra layihəyə yeni mühəndislər qoşulur, sorğular artır və xidmət mütəmadi yenilənir. Artıq əsas məsələ təkcə işləyən kod yazmaq deyil. Başqasının həmin kodu anlaması, dəyişməsi və etibarlı şəkildə yayımlaması da vacibdir.
Go-ya bu baxışla yanaşmaq faydalıdır. Dilin məqsədi proqramçıya mümkün olan bütün ifadə vasitələrini vermək deyil. Gündəlik proqram mühəndisliyində təkrarlanan çətinlikləri azaltmaqdır: mürəkkəb kod bazası, uzun gözləmə dövrləri, fərqli yazı üslubları və bir neçə işi koordinasiya etmək ehtiyacı.
Go Google-da Robert Griesemer, Rob Pike və Ken Thompson tərəfindən hazırlanmağa başlanıb, 2009-cu ildə açıq mənbə kimi təqdim edilib. Dilin rəsmi adı Go-dur; Golang isə axtarışda və gündəlik danışıqda işlənən addır. Bu tarixdən daha vacib olan səbəbdir: böyük proqramları böyük komandalarla idarə etmək.
Sadəlik kodu oxuyan adam üçün də işləməlidir
Bir funksiyanı bu gün yazmaq bir dəfə baş verir. Onu oxumaq isə kod icmalı, xəta araşdırması və yeni tələb zamanı təkrarlanır. Məsələn, sifarişin niyə rədd edildiyini tapmaq üçün beş fayl və bir neçə gizli qayda arasında gəzmək lazımdırsa, az sətirli kod belə baha başa gəlir.
Go aydın idarəetmə axınını və kiçik, konkret məsuliyyətləri təşviq edir. Oxucu əməliyyatın harada başladığını, hansı məlumatdan istifadə etdiyini və uğursuzluğun necə ötürüldüyünü izləyə bilməlidir. Sadəlik burada problemin asan olması demək deyil; həllin lazımsız mürəkkəbliyi azaltması deməkdir.
Komanda üçün ortaq qaydalar da bu yanaşmanın hissəsidir. Formatlaşdırmanın standartlaşdırılması kod icmalında boşluq və mötərizə müzakirələrini azaldır. Mühəndis diqqətini daha faydalı suallara yönəldir: sərhəd halı yoxlanılıbmı, xəta itirilirmi, məsuliyyət düzgün yerdədirmi?
- Ad niyyəti göstərsin.
Funksiyanın adını oxuyanda gördüyü iş aydın olsun. Məsələn, calculateTotal adı hesablamanı bildirir; process adı isə oxucunu funksiyanın içinə baxmağa məcbur edir.
- Məsuliyyətin sərhədi görünsün.
Kiçik interfeys və aydın məlumat axını dəyişiklik zamanı hansı hissələrin təsirlənəcəyini görməyə kömək edir. Ödənişi hesablayan hissə ilə onu göndərən hissənin vəzifəsini ayır.
- Oxunaqlılığı sətir sayına qurban vermə.
Bir neçə açıq addım bəzən sıxılmış bir ifadədən daha anlaşılandır. Kodu oxuyan adam nəticənin necə alındığını təxmin etməli olmasın.
Kompilyasiya, tiplər və yaddaş idarəetməsi
Go statik tipli və kompilyasiya olunan dildir. Statik tipləmə dəyərlər üzərində hansı əməliyyatların mümkün olduğunu proqram işləməzdən əvvəl yoxlamağa kömək edir. Bu, bütün xətaların əvvəlcədən tapılması demək deyil: səhv biznes qaydası və ya əlçatmaz verilənlər bazası yenə sınaq və icra zamanı üzə çıxa bilər.
Adi Go proqramı hədəf platforma üçün maşın koduna çevrilir. Eyni zamanda proqramın daxilində yaddaşın təmizlənməsi və goroutine-lərin planlaşdırılması kimi işləri görən runtime mövcuddur. Buna görə Go-da virtual maşın tələb olunmur fikri ilə Go-da runtime yoxdur fikrini qarışdırmaq olmaz.
Garbage collector artıq əlçatan olmayan obyektlərin yaddaşını geri qaytarır. Bu, əl ilə yaddaş azad etmə yükünü azaldır, amma resurs idarəetməsini aradan qaldırmır. Açılmış fayl, şəbəkə bağlantısı və bitməyən iş hələ də diqqət tələb edir. Lazımsız məlumatı kolleksiyada saxlasan, proqram onu əlçatan hesab edə bilər.
| Xüsusiyyət | Nəyə kömək edir? | Nəyə zəmanət vermir? |
|---|---|---|
| Statik tipləmə | Uyğunsuz tip əməliyyatlarını erkən tutmağa | Biznes qaydasının düzgünlüyünə |
| Kompilyasiya | İcra üçün maşın kodu hazırlamağa | Hər proqramın avtomatik sürətli olmasına |
| Garbage collection | Yaddaşın bir hissəsini avtomatik idarə etməyə | Fayl və bağlantıların vaxtında bağlanmasına |
Concurrency: gözləyərkən başqa işi irəlilətmək
Sifariş səhifəsi qiymət və anbar qalığını iki ayrı xidmətdən oxuyur. Birinci cavabı gözləmədən ikinci sorğunu başlatmaq mümkündürsə, bu iki işi koordinasiya etmək ümumi gözləməni azalda bilər. Burada prosessorun daha sürətli hesablamasından çox, müstəqil gözləmələrin üst-üstə düşməsi əhəmiyyətlidir.
Concurrency bir neçə işin irəliləyişini birlikdə təşkil etməkdir. Parallelism isə işlərin eyni anda, məsələn müxtəlif prosessor nüvələrində icra olunmasıdır. Bir nüvəli sistemdə də concurrency mümkündür. Hər gözləyən əməliyyatın ayrıca nüvəyə ehtiyacı yoxdur.
Slaydlarda çoxnüvəli prosessorlara keçid də bu ehtiyacın səbəblərindən biri kimi göstərilir. Daha çox nüvədən faydalanmaq üçün proqramın işini uyğun hissələrə bölmək lazımdır.
Go bu cür işləri təşkil etmək üçün goroutine və channel anlayışlarını təqdim edir. Goroutine icra olunan yüngül iş vahidi kimi düşünülə bilər; channel işlər arasında məlumat ötürmək və koordinasiya qurmaq üçün vasitədir. Onların sintaksisini sonrakı dərslərdə öyrənəcəyik. İndi vacib olan müstəqil işlərlə bir-birindən asılı addımları ayırmaqdır.
İki müstəqil sorğu, bir cavab
Qiymət sorğusu 200 ms, anbar sorğusu 300 ms çəkir. İcra formasını dəyişərək ümumi gözləməni müqayisə et.
Ardıcıl: 200 + 300 = 500 ms
Tədris modeli: sorğular müstəqildir, vaxt şkalası 500 ms-dir. Planlaşdırma və cavabların birləşdirilməsi xərci nəzərə alınmır. Bunlar ölçülmüş Go benchmark nəticələri deyil.
Backend və bulud mühitində nə qazandırır?
Backend xidməti çox vaxt bir sorğunu qəbul edir, başqa sistemlərdən məlumat alır, nəticəni emal edir və cavab qaytarır. Bu işdə şəbəkə gözləmələri, eyni vaxtda gələn sorğular və əməliyyatların həyat dövrü əsas mövzulardır. Go-nun icra modeli və standart kitabxanası bu tip proqramlar üçün əlverişli başlanğıc verir.
Əməliyyat tərəfini də düşün. Xidməti işə salan komanda hansı faylı yayımlayacağını, hansı konfiqurasiyanın lazım olduğunu və proqramın necə dayandırılacağını bilməlidir. Go-da bir çox tətbiqi tək icra faylı kimi çatdırmaq mümkündür. Bu, ayrıca interpreter quraşdırılması ehtiyacını aradan qaldıra bilər.
Amma tək icra faylı bütün asılılıqların yox olması demək deyil. Sertifikatlar, konfiqurasiya, statik fayllar və bəzi hallarda sistem kitabxanaları yenə lazım olur. Verilənlər bazası və xarici xidmətlər də proqramdan kənarda qalır. Paylama sadələşə bilər, sistemin bütöv əməliyyat məsuliyyəti isə qalır.
- HTTP xidmətləri.
Sorğunu qəbul et, lazım olan məlumatı topla və cavabı qaytar. Məsələn, sifarişin statusunu göstərən API.
- Komanda sətri alətləri.
Təkrarlanan işi bir əmrlə yerinə yetir. Məsələn, konfiqurasiyanı yoxlayan və nəticəni göstərən alət.
- Fon işçiləri.
Tapşırığı növbədən götür və istifadəçini gözlətmədən emal et. Məsələn, sifariş təsdiqini e-poçtla göndərən proses.
- İnfrastruktur alətləri.
Xidmətlərin və resursların idarə edilməsini avtomatlaşdır. Məsələn, xidmətlərin vəziyyətini yoxlayan alət.
Go nə vaxt uyğun seçimdir?
Dil seçərkən yalnız sürət və populyarlığa baxmaq kifayət etmir. Problemin növünü, mövcud kitabxanaları, komandanın təcrübəsini və sistemin saxlanma müddətini birlikdə qiymətləndir. Go yaxşı namizəd ola bilər, amma namizəd olmaq avtomatik qalib gəlmək deyil.
Məsələn, bir neçə xarici API ilə işləyən kiçik xidmət üçün sadə paylama və aydın concurrency modeli dəyərli ola bilər. Hazır Java sisteminə kiçik dəyişiklik etmək üçün isə ayrıca Go xidməti yaratmaq əlavə monitorinq, yerləşdirmə və istismar yükü gətirə bilər. Yeni dilin verdiyi fayda həmin xərcdən böyük olmalıdır.
Sərt real vaxt tələbi, xüsusi aparatla sıx əlaqə və ya konkret elmi kitabxanadan asılılıq varsa, seçim ayrıca araşdırılmalıdır. Garbage collection olan bir dili son tarixlərə zəmanət tələb edən mühit üçün ölçmədən seçmək olmaz. Eyni şəkildə, başqa ekosistemdə hazır həlli yenidən yazmaq da həmişə yaxşı mühəndislik qərarı deyil.
| Ssenari | Qərarı hansı sual müəyyən edir? |
|---|---|
| Şəbəkə ilə çox işləyən xidmət | Əməliyyatlar müstəqildirmi, paralel sorğu sayı necə məhdudlaşdırılacaq? |
| Kiçik əməliyyat aləti | Hədəf platformalarda paylama və işlətmə nə qədər sadə olacaq? |
| Mövcud böyük sistemə əlavə | Yeni dilin faydası əlavə xidmətin saxlanma xərcini ödəyirmi? |
| Xüsusi hesablamalar və ya real vaxt | Lazım olan kitabxana və gecikmə zəmanətləri varmı? |
Bu dərsdən sonra nəyi izah edə bilməlisən?
Go-nun dəyəri bir xüsusiyyətdə cəmlənmir. Anlaşılan kod, qısa inkişaf dövrü, concurrency üçün dil dəstəyi və praktik paylama birlikdə müəyyən işlərdə fayda verir. Hər bir üstünlüyü konkret tələblə əlaqələndirə bilirsənsə, dil haqqında reklam cümləsindən mühəndislik qərarına keçmisən.
Növbəti dərsdə ilk Go proqramının quruluşuna baxacağıq. Hələlik sintaksis əzbərləməyə ehtiyac yoxdur. Aşağıdakı ssenarini həll et və özünü yoxlama suallarında seçiminin səbəbini izah etməyə çalış.
- Sadəlik komandanın vaxtına təsir edir.
Aydın kod yeni həmkarın layihəyə qoşulmasını, xəta axtarışını və sonrakı dəyişiklikləri asanlaşdırır.
- Hər mexanizmin öz işi var.
Statik tipləmə uyğunluğu yoxlayır, kompilyasiya icra kodunu hazırlayır, runtime isə yaddaş və goroutine-lərin idarə edilməsində iştirak edir.
- Birlikdə irəliləmək və eyni anda işləmək fərqlidir.
Concurrency işlərin koordinasiyasıdır; parallelism onların eyni anda icrasıdır. Şəbəkə cavabını gözləyərkən başqa sorğunu başlatmaq bu fərqi yadda saxlamaq üçün yaxşı nümunədir.
- Dil seçimi konkret tələbə söykənir.
Go seçimini əsaslandırarkən iki fayda ilə yanaşı bir məhdudiyyət də göstər. Sonra qərarını kiçik prototip və ölçmə ilə yoxla.
Komandanın dil seçimini əsaslandır
Üç nəfərlik komanda bir neçə mağazadan məhsul qiymətlərini oxuyan xidmət hazırlayır. Sorğuların böyük hissəsi şəbəkə cavabını gözləyir. Xidmət Linux serverində işləyəcək. Komanda Go ilə yeni tanış olur.
Go seçiminin iki üstünlüyünü və iki riskini yaz. Sonra bir sınaq planlaşdır: qərar verməzdən əvvəl hansı nəticəni ölçərdin?
Öz cavabını nümunə yanaşma ilə müqayisə et
Go müstəqil şəbəkə sorğularını koordinasiya etmək və xidmətin paylanmasını sadələşdirmək baxımından uyğun namizəddir. Amma komandanın öyrənmə vaxtı və xarici API-lərin sorğu limitləri nəzərə alınmalıdır. Çox goroutine açmaq həmin limitləri aradan qaldırmır.
Kiçik prototipdə eyni yük altında cavab gecikməsini, yaddaş istifadəsini və uğursuz sorğuları ölç. Vaxt aşımı və eyni anda işləyən sorğu sayı üçün sərhəd qoy. Təkcə orta sürətə yox, gec cavabların davranışına da bax.
Özünü yoxla
Cavabı seç, sonra izahı oxu. Seçimini dəyişərək yenidən yoxlaya bilərsən.
Mənbələr və əlavə baxış
Bu dərs Matt Holiday-nin Go Class giriş slaydlarındakı mövzular əsasında Azərbaycan dilində hazırlanıb. Praktik ssenari, müqayisələr və yoxlama sualları bu dərs üçün ayrıca yazılıb.