Gównokód — ez az alacsony minőségű forráskód szleng elnevezése: olvashatatlan, rosszul strukturált és nehezen karbantartható. A Stripe (2022) jelentése szerint a fejlesztők munkaidejük akár 40%-át is a rosszul megírt kód olvasásával és megértésével töltik. Az orosz nyelvű közösségben a kifejezés annyira elterjedt, hogy létezik egy govnokod.ru nevű specializált weboldal, ahol a fejlesztők különösen kirívó esetek példáit teszik közzé.
Lényeg
Gównokód — a kód szubjektív, de általánosan elfogadott jellemzője, amely nem felel meg a minimális minőségi szabványoknak. Robert Martin „Tiszta kód” (2008) című könyvében a rossz kódot olyan kódként határozza meg, amely „megakadályozza annak megértését, hogy mit csinál”. A gównokód lehet szintaktikailag helyes és működhet is, de karbantartása rémálommá válik a csapat számára.
A gównokód kifejezés az orosz nyelvű közösségben elterjedt. Az angolban formálisabb kifejezéseket használnak: spaghetti code, dirty code, technical debt code. A „gównokód” érzelmi töltete azonban pontosabban adja át a fejlesztők hozzáállását az ilyen kódhoz — az irritáltság, undor és szakmai felháborodás keverékét.
A McKinsey (2023) kutatása szerint a magas technikai adóssággal rendelkező vállalatok — és a gównokód ennek fő összetevője — 20–40%-kal több erőforrást költenek új funkciók fejlesztésére. A kódminőség közvetlenül befolyásolja az üzleti mutatókat, és ez nem metafora, hanem megerősített tény.
Objektív mérőszámok nem léteznek, de vannak gyakorlati kritériumok: ha egy fejlesztő több mint 5 percet tölt egy 20 soros függvény megértésével — ez gównokód. Ha egy sor módosítása három nem kapcsolódó modult tör el — ez gównokód. Ha a kód nem fedhető le tesztekkel teljes átírás nélkül — ez gównokód.
Copy-paste (copy-paste programozás) — az egyik legszembetűnőbb és könnyen észlelhető jel. Amikor ugyanaz a kódblokk több helyen ismétlődik minimális változtatásokkal, ez nem csak gównokód, hanem a jövőbeli hibák forrása is. Javítás az egyik helyen és kihagyás a másikon — tipikus helyzet.
Értelmetlen változónevek — klasszikus. Az `a`, `b`, `x`, `data`, `temp`, `tmp`, `result`, `list`, `obj` nevű változók nem hordoznak semmilyen információt a céljukról. A kód olvasójának az egész függvényt elemeznie kell, hogy megértse, mi van a változóban tárolva. Robert Martin ezt „hazugságnak a névben” nevezi — a név ígéri az információt, de nem adja.
Mély beágyazás — amikor a feltételek, ciklusok és hibakezelés 5+ behúzási szintű konstrukciót hoz létre. Az ilyen kód olvashatatlan oldalirányú görgetés vagy az összes szint mentális követése nélkül. Ez egyenes út a hibákhoz: a logikai operátorok könnyen összetéveszthetők, a záró zárójelek átsiklása pedig könnyen előfordul.
| Jel | Gównokód példa | Tiszta kód |
|---|---|---|
| Copy-paste | Egy blokk 5-ször másolva | Függvénybe kiemelve |
| Nevek | `var a = getData()` | `var userList = getData()` |
| Beágyazás | 6 szint if/for | 2–3 szint return early-vel |
| Függvények | 300 soros függvény | 3–5 módszerre bontva |
| Megjegyzések | `i++ // increment i` | Érthető kód megjegyzések nélkül |
Dead code — függvények, változók, osztályok, amelyeket sehol sem használnak. Ez növeli a kód terjedelmét, eltereli a fejlesztő figyelmét és hamis képet kelt a rendszer képességeiről. Magic numbers — számok kontextus nélkül. God-osztályok — osztályok, amelyek mindent egyszerre csinálnak, megsértve az egységes felelősség elvét (SOLID: S).
Időhiány — a leggyakoribb ok. Amikor a határidők szorítanak, a fejlesztők a minőséget áldozzák fel a sebesség oltárán. Taktikailag ez indokolható, de stratégiailag — ez a technikai adósság felhalmozása. A probléma az, hogy az „ideiglenes” gównokódot ritkán térnek vissza javítani.
A kódellenőrzés hiánya — a második legfontosabb ok. Amikor a kódot egyedül írják kollégák általi ellenőrzés nélkül, a rossz minták megerősödnek és elszaporodnak. A code review nem csak minőségellenőrzés, hanem tudásmegosztás is a csapaton belül. Az áttekintés nélküli projektek elkerülhetetlenül gównokóddá válnak.
Alacsony fejlesztői képesítés vagy mentorálás hiánya. A felügyelet nélkül hagyott junior fejlesztők természetesen gównokódot írnak — ez a tanulási folyamat része. A probléma akkor jelentkezik, amikor ez a kód áttekintés és refaktorálás nélkül éles célba kerül.
Azokban a csapatokban, ahol a „működik — és ez elég” a mottó, a gównokód virágzik. A kódolási szabványok, tesztelési követelmények és áttekintési folyamatok hiánya olyan környezetet teremt, ahol a kódminőség senkit sem érdekel. Az ilyen projektek gyorsan „legacy” válnak — kóddá, amelyhez félnek hozzányúlni.
A gównokód fő következménye a fejlesztés lelassulása. A rossz kód paradoxona, hogy lehetővé teszi az első verzió gyors megírását, de minden későbbi módosítás egyre több időt vesz igénybe. A fejlesztési sebesség és a kódminőség közötti összefüggés grafikonja exponenciális — egy bizonyos küszöb után az új funkciók hozzáadása gyakorlatilag lehetetlenné válik.
Fluktuáció — közvetett, de súlyos következmény. A fejlesztők, különösen a tapasztaltak, nem akarnak gównokóddal dolgozni. A Stack Overflow Developer Survey 2024 szerint a fejlesztők 47%-a a kódbázis minőségét nevezi meg a munkahelyválasztás egyik kulcstényezőjeként. A rossz kódú projektek elveszítik legjobb munkatársaikat.
Biztonság — a gównokód másik áldozata. A rosszul megírt kód több sebezhetőséget tartalmaz: kezeletlen kivételek, SQL-injection, XSS, memóriaszivárgás. A minőségi kód unit tesztekkel és code review-val észleli a legtöbb ilyen problémát éles célba kerülés előtt.
A SonarQube és hasonló eszközők képesek a technikai adósságot emberórákban vagy napokban becsülni. Például 500 figyelmeztetés a copy-paste-ről, 200 a varázsszámokról és 50 a mély beágyazásról 30 nap technikai adósságot jelez. Ezeket a számokat meg lehet és kell mutatni a vezetésnek a refaktorálás indokolására.
A DRY (Don't Repeat Yourself) elv — az első, amit be kell vezetni. A logika minden részének egy példányban kell léteznie. Copy-paste helyett — emelje ki az ismétlődő kódot egy külön függvénybe, osztályba vagy modulba. Varázsszámok helyett — nevesített konstansek. Hosszú függvények helyett — több kicsi.
A KISS (Keep It Simple, Stupid) elv véd a túlzott bonyolultságtól. Ha egy feladat 10 sorban megoldható — ne írjon 50-et. Ha egy ciklus egyszerűbb, mint egy stream — használja a ciklust. Ha egy egyszerű függvény érthetőbb, mint egy dekorátor — írjon függvényt. Az egyszerűség a könnyen karbantartható kód fő jellemzője.
A Boy Scout Rule elv — „hagyd a kódot jobban, mint ahogy találtad”. Még a kis javítások is minden változtatásnál idővel a gównokódot tisztességes kóddá alakítják. Változó átnevezése, nagy függvény felosztása, teszt hozzáadása — minden javítás számít.
// rossz kód — copy-paste, varázsszámok, rossz nevek
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;
}
// tiszta kód — világos nevek, DRY, konstansek
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);
}
Vizsgáljunk meg egy tipikus példát Pythonban. A függvény megrendeléseket dolgoz fel, de rosszul: 80 sor, mély beágyazás, varázsszámok, duplikálódás. A refaktorálás után a kód olvashatóvá, tesztelhetővé és könnyen karbantarthatóvá válik.
# rossz kód — egyetlen függvény mindent csinál
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
# tiszta kód — kiemelt függvények és konstansek
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)
Egy jó függvény egy dolgot csinál és azt jól csinálja. Ha egy függvény három különböző műveletet végez — bontsa fel. Ha egy függvény több mint 20 sort tartalmaz — valószínűleg felosztható. Ha egy függvényben több mint két behúzási szint van — refaktorálás szükséges.
Statikus kódelemzők — az első védelmi vonal a gównokód ellen. Az ESLint (JavaScript), Pylint (Python), SonarQube (többnyelvű), Checkstyle (Java) automatikusan észleli a copy-paste-t, varázsszámokat, üres catch blokkokat, túl hosszú függvényeket és más száz antimintát.
Code style és formázók — a második védelmi szint. A Prettier, Black, gofmt automatikusan formázza a kódot, kiküszöbölve a szóközökkel, behúzásokkal és zárójelekkel kapcsolatos problémákat. Egységes stílus a csapatban olvashatóvá teszi a kódot, függetlenül attól, ki írta. A formázással kapcsolatos vitákat automatizálni kell.
Code review — a harmadik és legfontosabb szint. Egyetlen elemző sem helyettesíthet egy embert, aki észreveszi, hogy a megoldás architektúrája hibás, vagy hogy a fejlesztő rossz megközelítést választott. A hatékony áttekintés időt igényel, de megtérül a gównokód mennyiségének többszörös csökkenésével.
Gyakran Ismételt Kérdések
Rendkívül ritkán. Prototípus készítésnél vagy hackathonokon a sebesség fontosabb, mint a minőség, de az ilyen kódot ideiglenesként kell megjelölni és nem kerülhet éles célba refaktorálás nélkül. Éles célban nincs mentség a gównokódra — minden időmegtakarítás most többszörös veszteséggé válik a jövőben.
A kezdő kódja tapasztalatlan, de gyakran őszinte kód, amely a készségek növekedésével javul. A gównokód a minőség tudatos vagy közömbös elhanyagolása. Egy kezdő írhat nem optimális, de olvasható kódot. A gównokód viszont elvileg olvashatatlan — íróját nem érdekli, hogy mások megértik-e.
Átírás — végső intézkedés. A lépcsőzetes refaktorálás biztonságosabb: elkülöníti a modult, lefedi tesztekkel, részenként átírja. A teljes átírás kockázatos — elveszítheti a régi kódban felhalmozódott üzleti logikát, beleértve a határesetek kezelését, amelyeket senki sem dokumentált.
Használjon metrikákat: a SonarQube megmutatja a technikai adósságot órákban. Mutassa meg, mennyi időt töltenek a régi kód hibáival. Hasonlítsa ösßze új funkciók fejlesztési sebességét a projekt „tiszta” és „piszkos” részeiben. Fordítsa le üzleti nyelvre: az idő pénz, és a gównokód pénzbe kerül.
„Tiszta kód” Robert Martin (2008) — a minőségi programozás bibliája. Leírja a névadás, formázás, hibakezelés és tesztelés elveit. Ezenkívül: „Tökéletes kód” Steve McConnelltől, „Refaktorálás” Martin Fowlertől, „Négyek bandája” a tervezési mintákról. Ezeket a könyveket minden fejlesztőnek el kell olvasnia.
Összefoglaló
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is