Tərəqqi Tech
· 8 minutes read · Kamran Mammadov

Abstraksiya və ya anlamadan necə iş görürük

Abstraksiya həyatımızın hər anında qarşılaşa biləcəyimiz bir anlayışdır. Heç kim gündəlik işlərini yerinə yetirəndə durub "konkret" şəkildə icra etmir, heç kim tam şəkildə nə baş verdiyini anlamır. Buna bir misal çəkim.

Otağa giririk, açara basırıq, işıq yanır. Bu bir saniyəlik hərəkətdə əslində nə baş verdiyini izah etmək üçün elektromaqnit induksiyasını, dəyişən cərəyanı, transformator yarımstansiyalarını, qoruyucu avtomatı və közərmə telinin minlərlə dərəcəyə qədər qızmasını bilmək lazımdır. Bizim heç birindən xəbərimiz yoxdur. Buna baxmayaraq işıq yanır və daha maraqlısı, biz hətta nəyi bilmədiyimizi də bilmirik. Bizə bir divar verilib: iki vəziyyəti olan plastik düymə. Divarın arxasında nə olduğunu bilmirik və bilmək məcburiyyətində deyilik. Abstraksiya budur, nəyisə tam şəkildə, dərindən anlamayaraq bizə vacib xassəsindən yararlanmağa icazə verən bir divar. Bu yazı həmin divarlar haqqındadır. Niyə qurulduqları və baş verə biləcək problemlər haqqındadır.

Abstraksiyanın faydası

Abstraksiyanın bizə verdiyi güc sadə dildə desək "nəyisə tam şəkildə, dərindən anlamayaraq bizə vacib xassəsindən yararlanmağa icazə verən bir anlayışdır". Əslində heç kim işlədiyi hər şeyi konkret şəkildə bilə bilməz, nə vaxtımız çatar, nə də yaddaşımız. Abstraksiya elə buna görə lazımdır: alt qatı hər dəfə başdan anlamağa məcbur olmadan onun üzərində iş görməyə imkan verir.

Hər şeyi bilməkdən ziyadə bəzən sistemin parçalarını səliqəli şəkildə ayırmalı oluruq ki, qarışıqlığı aradan qaldıraq.

Məsələn, veb proqramlaşdırmada istifadə edilən çoxqatlı arxitektura:

 

Təsvir olunmuş arxitektura veb proqramlaşdırma ilə məşğul olmuş mühəndislərə çox tanışdır. Burada arxitekturanı üç qata bölmüşük. Bu arxitekturada biznes məntiqini icra edən qat, yəni service, repository qatının daxili işləməsindən xəbərsizdir. Bildiyi tək şey hansı girişin hansı çıxışa gətirdiyidir. Yəni onun funksionallığından istifadə edə bilir, nə etdiyini bilir, amma necə etdiyi artıq service-in maraq çərçivəsində deyil.

Abstraksiyadan törəyə biləcək problemlər

Hər şeydə olduğu kimi abstraksiyada da problemlərlə qarşılaşmaq mümkündür. Abstraksiyanın yaratdığı ən primitiv çətinlik onun gərəksiz yerə olmasıdır. Bəzən hazır nəyisə götürüb anlamadan üzərinə yeni abstraksiya qatı əlavə edə bilərik:

Bu kod parçasında toUpper(...) funksiyası tamamilə gərəksizdir; bu kod baxımından heç bir avantaj yaratmır, çünki yeni funksiya yaratmadan da birbaşa strtoupper(...) yaza bilərdik və işimiz həll olardı. Üstəlik, kodu oxuyan proqramçı boş yerə toUpper(...)-in nə etdiyini yoxlamalı olacaq. Bəziləri buna hətta "təmiz" kod deyə bilər, amma bu gərəksizdir, çünki heç bir əlavə davranış qatmır.

Abstraksiyadan istifadə zamanı bizə yarada biləcək başqa bir çətinliyi 2002-ci ildə Joel Spolsky çox aydın şəkildə qələmə almışdır. Bununla da yeni anlayış çıxartmış oluruq "the law of leaky abstractions" və ya bizim dildə desək sızan abstraksiyalar qanunu. Hər kəsə, xüsusən də İT və proqramlaşdırma sahəsində çalışanlara bu postu əvvəldən sona kimi oxumağınızı çox tövsiyə edirəm. Deməli, Spolsky abstraksiyanı TCP protokolu nümunəsində izah edir. TCP verilənləri itkisiz çatdırır, paketlər itsə, onları yenidən göndərir. Maraqlısı budur ki, TCP bu etibarlılığı etibarsız bir qatın, IP-nin üzərində qurur. Yəni "etibarlılıq" əslində bir abstraksiyadır. Bu abstraksiya nə qədər ki alt qatda ciddi problem yoxdur, düzgün işləyir. Amma şəbəkədə fiziki nasazlıq baş verərsə, məsələn kabel kəsilərsə, TCP artıq heç nə edə bilməz, çünki sızma məhz gizlətməyə çalışdığı o alt qatdan gəlir. Bu nümunə də onu göstərir ki, abstraksiya alt qatı tam gizlədə bilmir, ona görə alt qatı yaxşı bilməyə hələ də ehtiyacımız var.

Abstraksiyanı nə vaxt istifadə etməliyik

Abstraksiyanın üstünlüyünü və ondan törəyə biləcək problemi aydınlaşdırdıqdan sonra sıra onu necə sağlam şəkildə işimizə tətbiq etməyə gəlib çatır. Əgər bunu düşünüb aydınlaşdırmasaq, praktiki olaraq çox da bir şey əldə etmiş olmarıq. İnsan beyni məhdud sayda informasiyanı saxlayıb emal edə bildiyindən abstraksiyadan qaçış yoxdur. Abstraksiyanın bizə rahatlıq, sadəlik və nizam kimi müsbət cəhətləri var. Abstraksiya rahatlıq üçün nəzərdə tutulub: əgər verilmiş sistem qarışıq gələrsə, yeni bir abstraksiya qatının yaranması dəstəklənir; amma abstraksiyanın çoxluğu da elementləri və onlar arasındakı əlaqəni boşuna qəlizləşdirə bilər.

Abstraksiyanın məğzini Edsger W. Dijkstra (məşhur yol tapma alqoritmi olan Dijkstra alqoritminin yaradıcısı) The Humble Programmer adlı 1972 Turing Award mühazirəsində bizə maraqlı bir tövsiyə ilə çatdırıb:

The purpose of abstraction is not to be vague, but to create a new semantic level in which one can be absolutely precise.

Tərcümə etsək:

Abstraksiyanın məqsədi qeyri-müəyyən olmaq deyil, tamamilə dəqiq ola biləcəyi yeni bir semantik səviyyə yaratmaqdır. 

Bunu özünüz YouTube-dan izləyə və ya yazılı şəkildə internetdən PDF-ni tapa bilərsiniz.

Dijkstra-nın fikri, deyərdim ki, abstraksiya ilə bağlı deyilmiş ən yaxşı məsləhət ola bilər. Abstraksiyanı olduğumuz mühitə düzgün tətbiq etmək istəyiriksə, fəaliyyət göstərdiyimiz abstraksiya qatının sərhədlərini aydın şəkildə təyin etməliyik. Praktiki bir meyar belədir: əgər abstraksiya kodu oxuyan proqramçıya alt qatı tez-tez açmadan düşünməyə imkan verirsə, deməli yerində tətbiq olunub. Amma onu daim açıb içinə baxmalı oluruqsa, abstraksiya və bu, dəyişikliyə ehtiyac olduğunun göstəricisidir.

Nəticə

Abstraksiya kompleks və çoxqatlı sistemin bir parçasının öz qatında rahat şəkildə işini görə bilməsi üçün nəzərdə tutulmuş, olduqca faydalı bir alətdir. Onun önəmini anlamaq isə gündəlik iş mühitində daha düzgün qərarlar verməyimizə kömək edir.