Gavnokod — bu past sifatli manba kodining jargon nomi: o‘qib bo‘lmaydigan, yomon tuzilgan va saqlash qiyin bo‘lgan kod. Stripe (2022) hisobotiga ko‘ra, dasturchilar ish vaqtining 40% gacha yomon yozilgan kodni o‘qish va tushunishga sarflashadi. Rus tilidagi jamiyatda bu atama shunchalik keng tarqalganki, dasturchilar ayniqsa yorqin holatlar misollarini e‘lon qiladigan maxsus govnokod.ru sayti mavjud.
Asosiy
Gavnokod — bu minimal sifat standartlariga javob bermaydigan kodning subyektiv, ammo umumiy qabul qilingan tavsifidir. Robert Martin „Toza kod” (2008) kitobida yomon kodni „nima qilayotganini tushunishga to‘sqinlik qiladigan” kod deb ta‘riflaydi. Gavnokod sintaktik jihatdan to‘g‘ri va hatto ishlashi mumkin, ammo uni saqlash jamoa uchun dahshatli tushga aylanadi.
Gavnokod atamasi aynan rus tilidagi jamiyatda keng tarqalgan. Ingliz tilida rasmiyroq atamalar ishlatiladi: spaghetti code, dirty code, technical debt code. Biroq, gavnokodning hissiy bo‘yog‘i dasturchilarning bunday kodga munosabatini — g‘azab, jirkanish va kasbiy xafagarchilik aralashmasini — aniqroq ifodalaydi.
McKinsey (2023) tadqiqotiga ko‘ra, yuqori texnik qarzi bo‘lgan kompaniyalar — va gavnokod uning asosiy tarkibiy qismidir — yangi funksiyalarni ishlab chiqishga 20–40% ko‘proq resurs sarflaydi. Kod sifati biznes ko‘rsatkichlariga bevosita ta‘sir qiladi va bu metafora emas, balki tasdiqlangan haqiqatdir.
Ob'ektiv metrikalar mavjud emas, ammo amaliy mezonlar bor: agar dasturchi 20 qatordan iborat funksiyani tushunish uchun 5 daqiqadan ko‘proq vaqt sarflasa — bu gavnokod. Agar bitta qatorni o‘zgartirish uchta bog‘liq bo‘lmagan modulni buzsa — bu gavnokod. Agar kodni to‘liq qayta yozmasdan testlar bilan qoplab bo‘lmasa — bu gavnokod.
Nusxa ko‘chirish (copy-paste programming) — eng yorqin va oson aniqlanadigan belgilardan biri. Xuddi shu kod bloki minimal o‘zgarishlar bilan bir necha joyda takrorlansa, bu shunchaki gavnokod emas, balki kelajakdagi xatolar manbaidir. Bir joyda tuzatib, boshqasida o‘tkazib yuborish — odatiy hol.
Ma’nosiz o‘zgaruvchi nomlari — klassika. `a`, `b`, `x`, `data`, `temp`, `tmp`, `result`, `list`, `obj` kabi nomlardagi o‘zgaruvchilar o‘z maqsadi haqida hech qanday ma’lumot bermaydi. Kod o‘quvchisi o‘zgaruvchida nima saqlanganini tushunish uchun butun funksiyani tahlil qilishga majbur. Robert Martin buni „nomdagi yolg‘on” deb ataydi — nom ma’lumot va‘da qiladi, lekin bermaydi.
Chuqur joylashish — shartlar, sikllar va xatolarni boshqarish 5+ darajali konstruksiya yaratganda. Bunday kodni yonma-yon aylantirmasdan yoki barcha darajalarni aqlan kuzatmasdan o‘qib bo‘lmaydi. Bu xatolarga to‘g‘ri yo‘l: mantiqiy operatorlarni osongina adashtirish mumkin, yopuvchi qavslarni esa payqamaslik mumkin.
| Belgi | Gavnokod misoli | Toza kod |
|---|---|---|
| Nusxa ko‘chirish | Bitta blok 5 marta ko‘chirilgan | Funksiyaga ajratilgan |
| Nomlar | `var a = getData()` | `var userList = getData()` |
| Joylashish | 6 daraja if/for | 2–3 daraja return early bilan |
| Funksiyalar | 300 qatorlik funksiya | 3–5 metodga bo‘lingan |
| Izohlar | `i++ // increment i` | Izohsiz tushunarli kod |
Dead code — hech qayerda ishlatilmaydigan funksiyalar, o‘zgaruvchilar, sinflar. Bu kod hajmini oshiradi, dasturchini chalg‘itadi va tizim imkoniyatlari haqida yolg‘on taassurot yaratadi. Magic numbers — kontekstsiz raqamlar. God-sinflar — hamma narsani birdaniga bajaradigan, yagona mas’uliyat tamoyilini (SOLID: S) buzadigan sinflar.
Vaqt yetishmasligi — eng keng tarqalgan sabab. Muddati yaqinlashganda, dasturchilar tezlik foydasiga sifatni qurbon qiladi. Taktik jihatdan bu oqlanishi mumkin, ammo strategik jihatdan — bu texnik qarzning to‘planishidir. Muammo shundaki, ‘vaqtinchalik’ gavnokodni tuzatishga kamdan-kam qaytadilar.
Kod ko‘rib chiqishning yo‘qligi — ahamiyati bo‘yicha ikkinchi sabab. Kod hamkasblar tomonidan tekshirilmasdan yolg‘iz yozilganda, yomon namunalar mustahkamlanadi va ko‘payadi. Code review shunchaki sifat nazorati emas, balki jamoa ichida bilim almashishdir. Ko‘rib chiqishsiz loyihalar muqarrar ravishda gavnokodga aylanadi.
Dasturchining past malakasi yoki mentorlikning yo‘qligi. Nazoratsiz qolgan junior dasturchilar tabiiy ravishda gavnokod yozadi — bu o‘rganish jarayonining bir qismidir. Muammo bu kod ko‘rib chiqish va refaktoring siz ishlab chiqarishga tushganda yuzaga keladi.
‘Ishlaydi — yaxshi’ shiori bo‘lgan jamoalarda gavnokod gullab-yashnaydi. Kodlash standartlari, test talablari va ko‘rib chiqish jarayonlarining yo‘qligi kod sifati hech kimni qiziqtirmaydigan muhit yaratadi. Bunday loyihalar tezda „legacy” — tegishga qo‘rqadigan kodga aylanadi.
Asosiy oqibat — rivojlanishning sekinlashishi. Yomon kodning paradoksi shundaki, u birinchi versiyani tez yozishga imkon beradi, ammo har bir keyingi tuzatish ko‘proq vaqt oladi. Rivojlanish tezligining kod sifatiga bog‘liqlik grafigi eksponensialdir — ma’lum chegaradan keyin yangi funksiyalarni qo‘shish amalda imkonsiz bo‘ladi.
Kadrlar almashinuvi — bilvosita, ammo jiddiy oqibat. Dasturchilar, ayniqsa tajribalilar, gavnokod bilan ishlashni xohlamaydi. Stack Overflow Developer Survey 2024 ga ko‘ra, dasturchilarning 47% ish joyini tanlashda kod bazasi sifatini asosiy omillardan biri deb biladi. Yomon kodli loyihalar eng yaxshi xodimlarni yo‘qotadi.
Xavfsizlik — gavnokodning yana bir qurboni. Yomon yozilgan kod ko‘proq zaifliklarni o‘z ichiga oladi: ishlanmagan istisnolar, SQL-injection, XSS, xotira oqishi. Unit-testlar va kod ko‘rib chiqish bilan sifatli kod bu muammolarning aksariyatini ishlab chiqarishga chiqmasdan ushlaydi.
SonarQube va shu kabi vositalar texnik qarzni odam-soat yoki kunlarda baholay oladi. Masalan, nusxa ko‘chirish haqida 500 ogohlantirish, sehrli raqamlar haqida 200 va chuqur joylashish haqida 50 — 30 kunlik texnik qarzni bildiradi. Bu raqamlarni refaktoringni asoslash uchun rahbariyatga ko‘rsatish mumkin va kerak.
DRY (Don't Repeat Yourself) tamoyili — birinchi joriy qilinishi kerak bo‘lgan. Mantiqning har bir qismi yagona nusxada bo‘lishi kerak. Nusxa ko‘chirish o‘rniga — takrorlanuvchi kodni alohida funksiya, sinf yoki modulga ajrating. Sehrli raqamlar o‘rniga — nomlangan konstantalar. Uzun funksiyalar o‘rniga — bir nechta kichik funksiyalar.
KISS (Keep It Simple, Stupid) tamoyili haddan tashqari murakkablikdan himoya qiladi. Agar vazifani 10 qatorda hal qilish mumkin bo‘lsa — 50 qator yozmang. Agar sikl streamdan soddaroq bo‘lsa — sikl dan foydalaning. Agar oddiy funksiya dekoratordan tushunarliroq bo‘lsa — funksiya yozing. Oddiylik — oson saqlanadigan kodning asosiy sifatidir.
Boy Scout Rule tamoyili — „kodni topganingizdan yaxshiroq qoldiring”. Har bir o‘zgarishdagi kichik yaxshilanishlar ham vaqt o‘tishi bilan gavnokodni munosib kodga aylantiradi. O‘zgaruvchini qayta nomlash, katta funksiyani bo‘lish, test qo‘shish — har qanday yaxshilanish muhimdir.
// yomon kod — nusxa ko‘chirish, sehrli raqamlar, yomon nomlar
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;
}
// toza kod — aniq nomlar, DRY, konstantalar
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);
}
Keling Python dagi odatiy misolni ko‘rib chiqaylik. Funksiya buyurtmalarni qayta ishlaydi, ammo yomon: 80 qator, chuqur joylashish, sehrli raqamlar, takrorlanish. Refaktoring dan so‘ng kod o‘qiladigan, sinovdan o‘tkaziladigan va oson saqlanadigan bo‘ladi.
# yomon kod — bitta funksiya hamma narsani bajaradi
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
# toza kod — ajratilgan funksiyalar va konstantalar
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)
Yaxshi funksiya bitta ishni bajaradi va uni yaxshi bajaradi. Agar funksiya uch xil harakatni bajarsa — uni bo‘ling. Agar funksiya 20 qatordan ortiq bo‘lsa — uni bo‘lish mumkin. Agar funksiyada ikki darajadan ortiq joylashish bo‘lsa — refaktoring kerak.
Statik kod analizatorlari — gavnokodga qarshi birinchi himoya chizig‘i. ESLint (JavaScript), Pylint (Python), SonarQube (ko‘p tilli), Checkstyle (Java) avtomatik ravishda nusxa ko‘chirish, sehrli raqamlar, bo‘sh catch bloklari, juda uzun funksiyalar va yuzlab boshqa anti-naqshlarni aniqlaydi.
Code style va formatlovchilar — ikkinchi himoya darajasi. Prettier, Black, gofmt kodni avtomatik formatlaydi, bo‘shliqlar, joylashish va qavslar bilan bog‘liq muammolarni bartaraf qiladi. Jamoada yagona stil kodni kim yozganidan qat’i nazar o‘qiladigan qiladi. Formatlash bo‘yicha tortishuvlar avtomatlashtirilishi kerak.
Kod ko‘rib chiqish — uchinchi va eng muhim daraja. Hech bir analizator yechim arxitekturasi noto‘g‘ri ekanligini yoki dasturchi noto‘g‘ri yondashuv tanlaganini ko‘radigan odamni almashtira olmaydi. Samarali ko‘rib chiqish vaqt talab qiladi, ammo gavnokod miqdorini bir necha marta kamaytirish bilan o‘zini oqlaydi.
Tez-tez beriladigan savollar
Juda kamdan-kam. Prototiplash yoki hakatonlarda tezlik sifatdan muhimroq, ammo bunday kod vaqtinchalik deb belgilanishi va refaktoring siz ishlab chiqarishga tushmasligi kerak. Ishlab chiqarishda gavnokod uchun oqlanish yo‘q — hozirgi vaqtni tejash kelajakda ko‘p martalik yo‘qotishlarga aylanadi.
Yangi boshlovchining kodi — tajribasiz, ammo ko‘pincha samimiy kod bo‘lib, mahorat oshishi bilan yaxshilanadi. Gavnokod — bu sifatga ongli yoki loqayd e’tiborsizlikdir. Yangi boshlovchi optimal bo‘lmagan, ammo o‘qiladigan kod yozishi mumkin. Gavnokod esa printsipi jihatdan o‘qilmaydi — uning muallifi boshqalar uni tushunadimi yoki yo‘qmi, farqi yo‘q.
Qayta yozish — eng so‘nggi chora. Bosqichma-bosqich refaktoring xavfsizroq: modulni ajratasiz, testlar bilan qoplaysiz, qismma-qism qayta yozasiz. To‘liq qayta yozish xavfli — eski kodda to‘plangan biznes mantig‘ini, jumladan hech kim hujjatlashtirmagan chekka holatlarni yo‘qotishingiz mumkin.
Metrikalardan foydalaning: SonarQube texnik qarzni soatlarda ko‘rsatadi. Eski koddagi xatolarga qancha vaqt sarflanayotganini ko‘rsating. Loyihaning „toza” va „kir” qismlarida yangi funksiyalarni ishlab chiqish tezligini solishtiring. Biznes tiliga tarjima qiling: vaqt — pul, gavnokod esa pulga tushadi.
„Toza kod” Robert Martin (2008) — sifatli dasturlashning Injilidir. Unda nomlash, formatlash, xatolarni boshqarish va test qilish tamoyillari tasvirlangan. Qo‘shimcha: „Mukammal kod” Steve McConnell, „Refaktoring” Martin Fowler, „To‘rtlik guruhi” dizayn naqshlari haqida. Ushbu kitoblarni har bir dasturchi o‘qishi kerak.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.
Shuningdek o'qing