Mühəndislik karyeramız ərzində hər gün, hər an, məlumat çatışmazlığı səbəbindən qərar verməli və ya təxirə salmalı olduğumuz müxtəlif mürəkkəblik və vəziyyətlərdə çoxlu müxtəlif problemlərlə qarşılaşırıq. Biz hər dəfə yeni xidmətlər quranda, infrastruktur quranda və ya hətta inkişaf proseslərini formalaşdıranda biz müxtəlif çətinliklərin böyük dünyasına toxunuruq.
Bütün problemləri sadalamaq çətin və bəlkə də qeyri-mümkündür. Bu problemlərdən bəziləri ilə yalnız müəyyən bir sahədə işləsəniz qarşılaşacaqsınız. Digər tərəfdən, İT sistemlərinin qurulması üçün həlledici əhəmiyyət kəsb etdiyi üçün hamımızın necə həll edəcəyimizi anlamalı olduğumuz çox şey var. Böyük ehtimalla bütün layihələrdə onlarla qarşılaşacaqsınız.
Bu yazıda proqram proqramları yaratarkən qarşılaşdığım bəzi problemlərlə bağlı təcrübələrimi paylaşacağam.
Vikipediyaya baxsaq, aşağıdakı tərifi tapa bilərik
Aspekt yönümlü proqram təminatının işlənib hazırlanmasında kəsişən narahatlıqlar proqramın bir neçə modula təsir edən aspektləridir, onların heç birində əhatə olunma ehtimalı yoxdur. Bu narahatlıqlar çox vaxt həm dizaynda, həm də tətbiqdə sistemin qalan hissəsindən təmiz şəkildə ayrıla bilməz və ya səpilmə (kodun təkrarlanması), dolaşıq (sistemlər arasında əhəmiyyətli asılılıqlar) və ya hər ikisi ilə nəticələnə bilər.
Bunun nə olduğunu çox təsvir edir, lakin mən onu bir az genişləndirmək və sadələşdirmək istəyirəm:
Qarşılıqlı narahatlıq bir çox digər hissələrə təsir edən (və ya “keçirən”) sistemin/təşkilatın konsepsiyası və ya komponentidir.
Bu cür narahatlıqların ən yaxşı nümunələri sistem arxitekturası, giriş, təhlükəsizlik, əməliyyatların idarə edilməsi, telemetriya, verilənlər bazası dizaynı və bir çox başqalarıdır. Onların bir çoxu haqqında daha sonra bu məqalədə ətraflı danışacağıq.
Kod səviyyəsində, kəsişən narahatlıqlar tez-tez Aspekt yönümlü Proqramlaşdırma (AOP) kimi üsullardan istifadə etməklə həyata keçirilir, burada bu narahatlıqlar proqram boyunca tətbiq oluna bilən ayrı-ayrı komponentlərə modullaşdırılır. Bu, biznes məntiqini bu narahatlıqlardan təcrid edərək kodu daha oxunaqlı və davamlı edir.
Aspektləri əhatə dairəsi, ölçüsü, funksionallığı, əhəmiyyəti, hədəfi və başqaları kimi müxtəlif xüsusiyyətlərə görə bölmək yolu ilə təsnif etməyin bir çox mümkün yolu var, lakin bu məqalədə mən sadə əhatə dairəsi təsnifatından istifadə edəcəyəm. Bununla mən bu spesifik cəhətin hara yönəldiyini nəzərdə tuturam, istər bütün təşkilat, istər müəyyən bir sistem, istərsə də həmin sistemin konkret elementi.
Beləliklə, mən aspektləri Makro və Mikroya bölmək niyyətindəyəm.
Makro aspekt dedikdə, əsasən bütün sistem üçün izlədiyimiz mülahizələri nəzərdə tuturam, məsələn, seçilmiş sistem arxitekturası və onun dizaynı (monolit, mikroservislər, xidmət yönümlü arxitektura), texnologiya yığını, təşkilat strukturu və s. Makro aspektlər əsasən strateji və yüksək səviyyə ilə bağlıdır. qərarlar.
Bu arada, Mikro aspekt kod səviyyəsinə və inkişafına daha yaxındır. Məsələn, verilənlər bazası, qovluqların və siniflərin layihə strukturu və ya hətta xüsusi obyekt dizayn nümunələri ilə qarşılıqlı əlaqə üçün hansı çərçivədən istifadə olunur.
Bu təsnifat ideal olmasa da, mümkün problemlər və onlara tətbiq etdiyimiz həllərin əhəmiyyəti və təsiri haqqında anlayışı strukturlaşdırmağa kömək edir.
Bu yazıda mənim əsas diqqətim makro aspektlərə yönəldiləcək.
Proqram arxitekturasını yeni öyrənməyə başlayanda Conway qanunu və onun təşkilati struktura təsiri haqqında çoxlu maraqlı məqalələr oxudum. Xüsusilə bu . Deməli, bu qanunda belə deyilir
Sistemi dizayn edən hər hansı bir təşkilat (geniş şəkildə müəyyən edilir) strukturu təşkilatın kommunikasiya strukturunun surəti olan dizayn hazırlayacaqdır.
Mən həmişə inanmışam ki, bu konsepsiya həqiqətən çox universaldır və Qızıl Qaydanı təmsil edir.
Daha sonra modelləşdirmə sistemləri üçün Eric Evansın Domain-Driven Design (DDD) yanaşmasını öyrənməyə başladım. Erik Evans Məhdud Kontekst identifikasiyasının vacibliyini vurğulayır. Bu konsepsiya mürəkkəb domen modelini hər birinin öz məhdud bilik dəsti olan daha kiçik, daha idarə oluna bilən bölmələrə bölməyi nəzərdə tutur. Bu yanaşma effektiv komanda ünsiyyətinə kömək edir, çünki o, bütün sahə üzrə geniş biliyə ehtiyacı azaldır və kontekstdə keçidi minimuma endirir, beləliklə, söhbətləri daha səmərəli edir. Kontekstlərin dəyişdirilməsi indiyə qədər ən pis və ən çox resurs istehlak edən şeydir. Hətta kompüterlər də bununla mübarizə aparır. Kontekstdə keçidin tam olmamasına nail olmaq çətin olsa da, mən hesab edirəm ki, biz buna çalışmalıyıq.
Conway Qanununa qayıdaraq, onunla bağlı bir neçə problem tapdım.
Sistem dizaynının təşkilati strukturu əks etdirdiyini göstərən Konvey Qanunu ilə qarşılaşdığım ilk məsələ mürəkkəb və əhatəli Məhdud Kontekstlərin formalaşdırılması potensialıdır. Bu mürəkkəblik təşkilati strukturun domen sərhədləri ilə uyğunlaşmadığı zaman yaranır və bu, bir-birindən çox asılı olan və məlumatla yüklənmiş Məhdud Məzmunlara gətirib çıxarır. Bu, inkişaf komandası üçün tez-tez kontekst dəyişikliyinə səbəb olur.
Başqa bir məsələ , təşkilati terminologiyanın kod səviyyəsinə sızmasıdır. Təşkilati strukturlar dəyişdikdə, dəyərli resursları istehlak edərək kod bazasında dəyişiklikləri tələb edir.
Beləliklə, Tərs Conway Manevrinə riayət etmək istədiyiniz proqram arxitekturasını təşviq edən sistem və təşkilat yaratmağa kömək edir. Bununla belə, qeyd etmək lazımdır ki, bu yanaşma artıq formalaşmış arxitektura və strukturlarda çox yaxşı işləməyəcək, çünki bu mərhələdəki dəyişikliklər uzun müddətdir, lakin hər hansı bir dəyişikliyi tez təqdim etdikləri üçün startaplarda müstəsna performans göstərir.
Bu naxış və ya “anti-naxış” heç bir arxitektura olmadan bir sistem qurmağa imkan verir. Qaçılmaz artan mürəkkəbliyi idarə etmək üçün heç bir qaydalar, sərhədlər və strategiya yoxdur. Mürəkkəblik proqram sistemlərinin qurulması səyahətində ən qorxulu düşməndir.
Belə bir sistemin qurulmasının qarşısını almaq üçün xüsusi qaydalara və məhdudiyyətlərə əməl etməliyik.
Proqram Arxitekturasının saysız-hesabsız tərifləri var. Onların bir çoxunu bəyənirəm, çünki onlar müxtəlif aspektləri əhatə edir. Ancaq memarlıq haqqında düşünə bilmək üçün təbii olaraq onlardan bəzilərini beynimizdə formalaşdırmalıyıq. Və qeyd etmək lazımdır ki, bu tərif inkişaf edə bilər. Beləliklə, ən azı indiyə qədər özüm üçün aşağıdakı təsvirim var.
Proqram arxitekturası hər gün verdiyiniz və qurulmuş sistemə təsir edən qərarlar və seçimlər haqqındadır.
Qərarları qəbul etmək üçün “çanta”nızda yaranan problemlərin həlli üçün prinsiplər və nümunələr olmalıdır, həmçinin qeyd etmək lazımdır ki, tələbləri başa düşmək biznesin ehtiyac duyduğu şeyi qurmaq üçün açardır. Ancaq bəzən tələblər şəffaf deyil və ya hətta müəyyən edilmir, bu halda daha çox aydınlıq əldə etmək üçün gözləmək və ya təcrübənizə güvənmək və intuisiyanıza etibar etmək daha yaxşıdır. Ancaq hər halda, güvənmək üçün prinsipləriniz və nümunələriniz yoxdursa, düzgün qərarlar qəbul edə bilməzsiniz. Proqram Arxitektura Üslubunun tərifinə gəldiyim yer budur.
Proqram Arxitektura Üslubu proqram təminatının necə qurulacağını təyin edən prinsiplər və nümunələr toplusudur.
Planlaşdırılan memarlığın müxtəlif tərəflərinə yönəlmiş çoxlu müxtəlif memarlıq üslubları var və onlardan bir neçəsinin eyni vaxtda tətbiqi normal bir vəziyyətdir.
Məsələn, məsələn:
Monolit memarlıq
Domen əsaslı dizayn
Komponent əsaslı
Mikroservislər
Boru və filtrlər
Hadisəyə əsaslanan
Mikrokernel
Xidmət yönümlü
və s...
Əlbəttə ki, onların üstünlükləri və mənfi cəhətləri var, amma mənim öyrəndiyim ən vacib şey, memarlığın aktual problemlərdən asılı olaraq tədricən inkişaf etməsidir. Monolit arxitekturadan başlamaq əməliyyat mürəkkəbliyini azaltmaq üçün əla seçimdir, çox güman ki, bu arxitektura məhsulun qurulmasının Product-market Fit (PMI) mərhələsinə çatdıqdan sonra da ehtiyaclarınıza uyğun olacaq. Geniş miqyasda, müstəqil yerləşdirmə, heterojen texnoloji yığın mühiti və daha az əlaqəli arxitekturaya nail olmaq üçün hadisələrə əsaslanan yanaşmaya və mikroservislərə doğru hərəkət etməyi düşünə bilərsiniz (və bu vaxt hadisələrə əsaslanan və pub-sub yanaşmalarının təbiətinə görə daha az şəffafdır. bunlar qəbul edilir). Sadəlik və səmərəlilik yaxındır və bir-birinə böyük təsir göstərir. Adətən, mürəkkəb arxitekturalar yeni funksiyaların inkişaf sürətinə təsir edir, mövcud olanları dəstəkləyir və qoruyur və sistemin təbii təkamülünə meydan oxuyur.
Bununla belə, mürəkkəb sistemlər çox vaxt mürəkkəb və hərtərəfli arxitektura tələb edir ki, bu da qaçılmazdır.
Düzünü desəm, bu çox geniş mövzudur və təbii təkamül üçün sistemlərin necə qurulması və qurulması ilə bağlı çox gözəl ideyalar var. Təcrübəmə əsaslanaraq, aşağıdakı yanaşmanı işlədim:
DAU (Gündəlik Aktiv İstifadəçilər), MAU (Aylıq Aktiv İstifadəçilər), RPC (Saniyədə Sorğu) və TPC (Saniyədə Əməliyyat) kimi rəqəmləri və ölçüləri başa düşmək də çox vacibdir, çünki bu, arxitektura üçün seçim etməkdə sizə kömək edə bilər. 100 aktiv istifadəçi və 100 milyon aktiv istifadəçi fərqlidir.
Son qeyd olaraq deyərdim ki, memarlığın məhsulun uğuruna əhəmiyyətli təsiri var. Ölçəkləmə zamanı məhsullar üçün zəif dizayn edilmiş arxitektura tələb olunur ki, bu da çox güman ki, uğursuzluğa gətirib çıxarır, çünki müştərilər siz sistemi miqyaslandırarkən gözləməyəcək, onlar rəqib seçəcəklər, ona görə də biz potensial miqyasda öndə olmalıyıq. Etiraf etsəm də, bəzən bu, yalın bir yanaşma ola bilməz, ideya miqyaslana bilən, lakin artıq miqyaslı olmayan bir sistemə sahib olmaqdır. Digər tərəfdən, heç bir müştərisi olmayan və ya onların çoxunu əldə etməyi planlaşdırmayan çox mürəkkəb və artıq miqyaslı bir sistemə sahib olmaq, işinizdə heç bir əvəzə pul bahasına başa gələcək.
Texnologiya yığınının seçilməsi həm də makro səviyyəli bir qərardır, çünki bu, işə qəbula, sistemin təbii təkamül perspektivlərinə, miqyaslılığa və sistemin performansına təsir göstərir.
Bu, texnologiya yığını seçərkən əsas mülahizələrin siyahısıdır:
Çoxsaylı texnologiya yığınlarının olması biznesin böyüməsinə necə təsir edə bilər?
Bir nöqteyi-nəzərdən, daha bir yığının təqdim edilməsi işə qəbulunuzu genişləndirə bilər, lakin digər tərəfdən, hər iki yığını dəstəkləməlisiniz, çünki bu, əlavə texniki xidmət xərcləri gətirir. Beləliklə, daha əvvəl dediyim kimi, mənim fikrimcə, yalnız əlavə ehtiyac daha çox texnologiya yığınının daxil edilməsi üçün bir arqument olmalıdır.
Bəs konkret problem üçün ən yaxşı aləti seçmək prinsipi nədir?
Bəzən yuxarıda qeyd olunan eyni mülahizələrə əsaslanaraq müəyyən bir problemi həll etmək üçün yeni alətlər gətirməkdən başqa seçiminiz olmur, belə hallarda ən yaxşı həll yolunu seçmək məna kəsb edir.
Müəyyən bir texnologiya ilə yüksək əlaqə olmadan sistemlərin yaradılması çətin ola bilər. Bununla belə, sistemin texnologiya ilə sıx bağlı olmadığı bir vəziyyətə can atmaq faydalıdır və sabah müəyyən bir çərçivə və ya alət həssas olarsa və ya hətta köhnəlsə, ölməyəcək.
Başqa bir vacib məsələ açıq mənbə və xüsusi proqram təminatından asılılıqlarla bağlıdır. Mülkiyyət proqram təminatı sizə daha az çeviklik və fərdiləşdirmə imkanı verir. Yenə də ən təhlükəli amil, satıcının məhsullarından, qiymətlərindən, şərtlərindən və yol xəritəsindən asılı olduğunuz satıcı kilididir. Satıcı istiqaməti dəyişərsə, qiymətləri artırarsa və ya məhsulu dayandırarsa, bu riskli ola bilər. Açıq mənbəli proqram təminatı bu riski azaldır, çünki tək qurum ona nəzarət etmir. Bütün səviyyələrdə bir uğursuzluq nöqtəsinin aradan qaldırılması inkişaf üçün etibarlı sistemlərin qurulmasının açarıdır.
Tək uğursuzluq nöqtəsi (SPOF) sistemin hər hansı bir hissəsinə aiddir, əgər uğursuz olarsa, bütün sistemin fəaliyyətini dayandıracaqdır. Bütün səviyyələrdə SPOF-ların aradan qaldırılması yüksək əlçatanlıq tələb edən istənilən sistem üçün çox vacibdir. Bilik, kadr, sistem komponentləri, bulud provayderləri və internet kabelləri daxil olmaqla hər şey uğursuz ola bilər.
Tək uğursuzluq nöqtələrini aradan qaldırmaq üçün tətbiq edə biləcəyimiz bir neçə əsas texnika var:
Bu yazıda biz bir neçə əsas makro aspektləri və onların mürəkkəbliyi ilə necə məşğul ola biləcəyimizi əhatə etdik.
Oxuduğunuz üçün təşəkkür edirik! Növbəti dəfə görüşənədək!