Gövnokod — bu aşağı keyfiyyətli mənbə kodunun jarqon adıdır: oxunmayan, zəif strukturlaşdırılmış və çətin saxlanılan. Stripe (2022) hesabatına görə, proqramçılar iş vaxtının 40%-nə qədərini pis yazılmış kodu oxumaq və anlamaq üçün sərf edirlər. Rusdilli icmada bu termin o qədər geniş yayılmışdır ki, proqramçıların xüsusilə parlaq nümunələri dərc etdiyi ixtisaslaşdırılmış govnokod.ru saytı mövcuddur.
Başlıca
Gövnokod — bu minimal keyfiyyət standartlarına cavab verməyən kodun subyektiv, lakin ümumi qəbul edilmiş xarakteristikasıdır. Robert Martin „Təmiz kod” (2008) kitabında pis kodu „nə etdiyini anlamağa mane olan” kod kimi təyin edir. Gövnokod sintaktik cəhətdən düzgün və hətta işləyə bilər, lakin onun saxlanması komanda üçün kabusa çevrilir.
Gövnokod termini məhz rusdilli icmada geniş yayılmışdır. İngilis dilində daha formal terminlər istifadə olunur: spaghetti code, dirty code, technical debt code. Lakin gövnokodun emosional çaları proqramçıların belə koda münasibətini — qıcıq, ikrah və peşəkar inciklik qarışığını — daha dəqiq çatdırır.
McKinsey (2023) tədqiqatına görə, yüksək texniki borcu olan şirkətlər — və gövnokod onun əsas tərkib hissəsidir — yeni funksiyaların hazırlanmasına 20–40% daha çox resurs sərf edirlər. Kod keyfiyyəti biznes göstəricilərinə birbaşa təsir edir və bu metafora deyil, təsdiqlənmiş faktdır.
Objektiv metrikalar yoxdur, lakin praktiki meyarlar var: əgər proqramçı 20 sətirlik funksiyanı anlamaq üçün 5 dəqiqədən çox vaxt sərf edirsə — bu gövnokoddur. Əgər bir sətirin dəyişdirilməsi üç əlaqəsiz modulu pozursa — bu gövnokoddur. Əgər kodu tam yenidən yazmadan testlərlə əhatə etmək mümkün deyilsə — bu gövnokoddur.
Kopyala-yapışdır (copy-paste programming) — ən parlaq və asan aşkarlanan əlamətlərdən biridir. Eyni kod bloku minimal dəyişikliklərlə bir neçə yerdə təkrarlanırsa, bu sadəcə gövnokod deyil, həm də gələcək səhvlərin mənbəyidir. Bir yerdə düzəldib digərini buraxmaq — tipik haldır.
Mənasız dəyişən adları — klassika. `a`, `b`, `x`, `data`, `temp`, `tmp`, `result`, `list`, `obj` adlı dəyişənlər öz məqsədi haqqında heç bir məlumat daşımır. Kod oxuyucusu dəyişəndə nəyin saxlandığını anlamaq üçün bütövlükdə funksiyanı təhlil etməli olur. Robert Martin bunu „adda yalan” adlandırır — ad məlumat vəd edir, amma vermir.
Dərin iç-içə yerləşmə — şərtlər, dövrlər və xəta idarəetməsi 5+ səviyyəli abzas yaratdıqda. Belə kodu yan sıçrayışsız və ya bütün səviyyələri zehni olaraq izləmədən oxumaq mümkün deyil. Bu səhvlərə birbaşa yoldur: məntiqi operatorları asanlıqla qarışdırmaq olar, bağlayıcı mötərizələri isə görməmək olar.
| Ɔlamət | Gövnokod nümunəsi | Təmiz kod |
|---|---|---|
| Kopyala-yapışdır | Bir blok 5 dəfə köçürülüb | Funksiyaya çıxarılıb |
| Adlar | `var a = getData()` | `var userList = getData()` |
| Yerləşmə | 6 səviyyə if/for | 2–3 səviyyə return early ilə |
| Funksiyalar | 300 sətirlik funksiya | 3–5 metodlara bölünüb |
| Komentarlar | `i++ // increment i` | Şerhsiz başa düşülən kod |
Dead code — heç yerdə istifadə olunmayan funksiyalar, dəyişənlər, siniflər. Bu kodun həcmini artırır, proqramçını yayındırır və sistemin imkanları haqqında yalan təsɟ6vür yaradır. Magic numbers — kontekstsiz rəqəmlər. God-siniflər — hər şeyi birdən edən, tək məsuliyyət prinsipini (SOLID: S) pozan siniflər.
Vaxtın çatışmazlığı — ən tez-tez rast gəlinən səbəb. Son tarixlər yaxınlaşdıqda, proqramçılar sürətin xeyrinə keyfiyyətdən qurban verirlər. Taktiki olaraq bu əsaslandırıla bilər, lakin strateji olaraq — bu texniki borcun yığılmasıdır. Problem ondadır ki, „müvəqqəti” gövnokodu düzəltməyə nadirən qayıdırlar.
Kod revyusunun olmaması — əhəmiyyətinə görə ikinci səbɨb. Kod həmkarlar tərəfindən yoxlanılmadan tək yazıldıqda, pis nümunələr möhkəmlənir və çoxalır. Code review sadəcə keyfiyyətə nəzarət deyil, həm də komanda daxilində bilik ötürülməsidir. Revyusuz layihələr qaçınılmaz olaraq gövnokoda çevrilir.
Proqramçının aşağı ixtisası və ya mentorluğun olmaması. Nəzarətsiz qalan junior proqramçılar təbii olaraq gövnokod yazır — bu öyrənmə prosesinin bir hissəsidir. Problem bu kodun revyu və refaktorinq olmadan produksiyaya düşməsi ilə yaranır.
İşləyir — yaxşıdır” şüarı olan komandalarda gövnokod çiçəklənir. Kodlaşdırma standartlarının, test tələblərinin və revyu proseslərinin olmaması kod keyfiyyətinin heç kimi maraqlandırmadığı mühit yaradır. Belə layihələr tez bir zamanda „legacy” — toxunmağa qorxduqları koda çevrilir.
Əsas nəticə — inkişafın yavaşlaması. Pis kodun paradoksu ondadır ki, ilk versiyanı tez yazmağa imkan verir, lakin hər sonrakı düzəliş getdikcə daha çox vaxt aparır. İnkişaf sürətinin kod keyfiyyətindən asılılıq qrafiki eksponensialdır — müəyyən həddən sonra yeni funksiyaların əlavə edilməsi praktiki olaraq qeyri-mümkün olur.
Kadr dəyişimi — dolayı, lakin ciddi nəticədir. Proqramçılar, xüsusən də təcrübəlilər, gövnokodla işləmək istəmir. Stack Overflow Developer Survey 2024-ə görə, proqramçıların 47%-i iş yeri seçərkən kod bazasının keyfiyyətini əsas amillərdən biri kimi qeyd edir. Pis kodu olan layihələr ən yaxın ışçıları itirir.
Təhlükəsizlik — gövnokodun daha bir qurbanı. Pis yazılmış kod daha çox zəiflik ehtiva edir: idarə olunmayan istisnalar, SQL-injection, XSS, yaddaş sızıntıları. Unit testlər və kod revyu ilə keyfiyyətli kod bu problemlərin əksəriyyətini produksiyaya çıxmamışdɑn yaxalayır.
SonarQube və oxşar alətlər texniki borcu adam-saat və ya günlə qiymətləndirə bilir. Məsələn, kopyala-yapışdır haqqında 500 xəbərdarlıq, sehrli rəqəmlər haqqında 200 və dərin iç-içə yerləşmə haqqında 50 — 30 gün texniki borc deməkdir. Bu rəqəmləri refaktorinqi əsaslandırmaq üçün rəhbərliyə göstərmək olar və lazımdır.
DRY (Don't Repeat Yourself) prinsipi — ilk tətbiq edilməli olan. Məntiqin hər bir parçası tək nüsxədə olmalıdır. Kopyala-yapışdır əvəzinə təkrarlanan kodu ayrıca funksiyaya, sinifə və ya modula çıxarın. Sehrli rəqəmlər əvəzinə — adlandırılmış sabitlər. Uzun funksiyalar əvəzinə — bir neçə kiçik funksiya.
KISS (Keep It Simple, Stupid) prinsipi həddən artıq mürəkkəblikdən qoruyur. Əgər tapşırığı 10 sətirdə həll etmək olarsa — 50 yazmayın. Əgər dövrü axından sadədirsə — dövrdən istifadə edin. Əgər adi funksiya dekoratordan daha başa düşüləndirsə — funksiya yazın. Sadəlik — asan saxlanılan kodun əsas keyfiyyətidir.
Boy Scout Rule prinsipi — „kodu tapdığından daha yaxşı burax”. Hər dəyişiklikdə kiçik yaxşılaşdırmalar belə zamanla gövnokodu layiqli koda çevirir. Dəyişəni adlandırmaq, böyük funksiyanı bölmək, test əlavə etmək — hər yaxşılaşdırma əhəmiyyətlidir.
// pis kod — kopyala-yapışdır, sehrli rəqəmlər, pis adlar
function calc(a, b, c) {
let x = a * 0.85;
if (b > 1000) { x = x * 0.9; }
let y = c * 0.85;
if (b > 1000) { y = y * 0.9; }
return x + y;
}
// təmiz kod — aydın adlar, DRY, sabitlər
const DISCOUNT_RATE = 0.85;
const BULK_THRESHOLD = 1000;
const BULK_DISCOUNT = 0.9;
function applyDiscount(amount, quantity) {
let price = amount * DISCOUNT_RATE;
if (quantity > BULK_THRESHOLD) {
price = price * BULK_DISCOUNT;
}
return price;
}
function calculateTotal(items, quantity) {
return items.reduce((sum, item) => {
return sum + applyDiscount(item, quantity);
}, 0);
}
Nəzərdən keçirək tipik Python nümunəsini. Funksiya sifarişləri emal edir, lakin pis edir: 80 sətir, dərin iç-içə yerləşmə, sehrli rəqəmlər, təkrarlanma. Refaktorinqdən sonra kod oxunaqlı, test edilə bilən və asan saxlanılan olur.
# pis kod — tək funksiya hər şeyi edir
def process_order(order):
if order.get("type") == "premium":
if order["amount"] > 100:
discount = 0.8
else:
discount = 0.9
else:
discount = 1.0
total = order["amount"] * discount
return total
# təmiz kod — ayrılmış funksiyalar və sabitlər
class OrderProcessor:
PREMIUM_DISCOUNT_HIGH = 0.8
PREMIUM_DISCOUNT_LOW = 0.9
PREMIUM_THRESHOLD = 100
def get_discount(self, order):
if order.type == "premium" and order.amount > self.PREMIUM_THRESHOLD:
return self.PREMIUM_DISCOUNT_HIGH
return self.PREMIUM_DISCOUNT_LOW
def calculate_total(self, order):
return order.amount * self.get_discount(order)
Yaxşı funksiya bir şey edir və onu yaxşı edir. Əgər funksiya üç müxtəlif hərəkət edirsə — bölün. Əgər funksiya 20 sətirdən çoxdursa — çox gömrə onu bölmək olar. Əgər funksiyada ikidən çox abzas səviyyəsi varsa — refaktorinq lazımdır.
Statik kod analizatorları — gövnokoda qarşı ilk müdafiə xətti. ESLint (JavaScript), Pylint (Python), SonarQube (çoxdilli), Checkstyle (Java) avtomatik olaraq kopyala-yapışdır, sehrli rəqəmlər, boş catch blokları, çox uzun funksiyalar və yüzlərlə digər anti-nümunələri aşkarlayır.
Code style və formatlayıcılar — ikinci müdafiə səviyyəsi. Prettier, Black, gofmt kodu avtomatik formatlayır, boşluq, abzas və mötərizə problemlərini aradan qaldırır. Komandada vahid stil kodu kimin yazmasından asılı olmayaraq oxunaqlı edir. Formatlaşdırma mübahisələri avtomatlaşdırılmalıdır.
Kod revyu — üçüncü və ən vacib səviyyə. Heç bir analizator həllin arxitekturasının səhv olduğunu və ya proqramçının yanlış yanaşma seçdiyini görən insanı əvəz edə bilməz. Effektiv revyu vaxt tələb edir, lakin gövnokodun miqdarını dəfələrlə azaltmaqla özünü doğruldur.
Tez-tez verilən suallar
Çox nadir hallarda. Prototipləşdirmə və ya hakatonlarda sürət keyfiyyətdən vacibdir, lakin belə kod müvəqqəti kimi qeyd edilməli və refaktorinqsiz produksiyaya düşməməlidir. Produksiyada gövnokod üçün bəraət yoxdur — indiki vaxta qənaət gələcəkdə dəfələrlə itkiyə çevriləcək.
Yeni başlayanın kodu — təcrübəsiz, lakin çox vaxt səmimi koddur, bacarıqlar artdıqca düzəlir. Gövnokod isə keyfiyyətə şüurlu və ya laqeyd etinasızlıqdır. Yeni başlayan optimal olmayan, lakin oxunaqlı kod yaza bilər. Gövnokod isə qəsdən oxunmazdır — onun müəllifinə digərlərinin onu başa düşüb-düşməyəcəyi vecinə deyil.
Yenidən yazmaq — son çarədir. Tədrici refaktorinq daha təhlükəsizdir: modulu ayırırsınız, testlərlə əhatə edirsiniz, hissə-hissə yenidən yazırsınız. Tam yenidən yazmaq risklidir — köhnə kodda toplanmış biznes məntiqini, o cümlədən heç kimin sənədləşdirmədiyi kənar halların emalını itirə bilərsiniz.
Metrikalardan istifadə edin: SonarQube texniki borcu saatlarla göstərəcək. Köhnə koddakı səhvlərə nə qədər vaxt itirildiyini göstərin. Layihənin „təmiz” və „çirkli” hissələrində yeni funksiyaların hazırlanma sürətini müqayisə edin. Biznes dilinə tərcümə edin: vaxt puldur, gövnokod isə pula başa gəlir.
„Təmiz kod” Robert Martin (2008) — keyfiyyətli proqramlaşdırmanın İncili. Orada adlandırma, formatlaşdırma, xəta idarəetməsi və test prinsipləri təsvir edilir. Əlavə olaraq: „Mükəmməl kod” Steve McConnell, „Refaktorinq” Martin Fowler, „Dördlərin qrupu” dizayn nümunələri haqqında. Bu kitabları hər bir proqramçı oxumalıdır.
Yekun
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun