KISS (Keep It Simple, Stupid) — fejlesztési elv, amely a rendszer maximális egyszerűségét írja elő. A bonyolultságot csak akkor szabad hozzáadni, ha feltétlenül szükséges, nem előre. Az IEEE Transactions on Software Engineering (2020) kutatása szerint a kód bonyolultsága korrelál a hibasűrűséggel: a magas ciklomatikus komplexitású modulok 3,6-szor több hibát tartalmaznak ezer soronként. KISS — nem primitívség, hanem a legegyszerűbb működő megoldás tudatos választása.
Főbb pontok
KISS (Keep It Simple, Stupid) — tervezési elv, amely a rendszer bonyolultságának minimalizálását követeli meg. Az amerikai haditengerészetben fogalmazta meg Kelly Johnson mérnök (Lockheed SR-71 Blackbird) az 1960-as években. Johnson megkövetelte, hogy a repülőgépet egy szerelő terepi körülmények között, speciális szerszámok nélkül meg tudja javítani — ez a KISS lényege.
A szoftverfejlesztésben a KISS azt jelenti: a megoldás a lehető legegyszerűbb legyen, de ne egyszerűbb (a mondat második részét Albert Einsteinnek tulajdonítják). Egyszerűség — nem szinonimája a primitívségnek; az egyszerű megoldás minimális redundanciával végzi el a feladatot.
A Google Research (2022) kutatása kimutatta: egy új fejlesztő átlagos projektbe belépési ideje 3 hét a KISS-t betartó projektekben, szemben a túlzott architektúrájú projektek 10 hetével. Egyszerű kód — befektetés az új csapattagok alkalmazkodási sebességébe.
Alkalmazza a KISS-t szűrőként: mielőtt új absztrakciót ad hozzá, kérdezze meg magától „ez a ma felmerült problémát oldja meg, vagy egy olyan problémát, amely egy év múlva merülhet fel?” Ha a második — ne tegye.
Occam borotvája (XIV. század) — filozófiai elv: „a létezőket nem szabad szükségtelenül megsokszorozni”. A programozásban ez azt jelenti: két, a követelményeket egyformán kielégítő megoldás közül válassza azt, amelyik kevesebb létezőt (osztályt, modult, függőséget) tartalmaz. KISS — Occam borotvájának gyakorlati megvalósítása a kódban.
A különbség az, hogy Occam borotvája általános megismerési elv, míg a KISS egy konkrét mérnöki gyakorlat mérhető eredménnyel: a ciklomatikus komplexitás csökkentése, a kódsorok számának csökkentése, a code review idő rövidülése. Metrikák lehetővé teszik a KISS betartásának objektív értékelését.
Kövesse a metrikát: a kód „elég egyszerű”, ha egy új fejlesztő egy perc alatt, kommentárok nélkül megérti a részletet. Ha több kell — egyszerűsítse.
Mobilfejlesztés három olyan jellemzővel bír, amelyek a KISS-t különösen fontossá teszik: korlátozott eszközerőforrások (memória, processzor), gyakori platformfrissítések (iOS évente, Android — negyedévente) és a funkciók CI/CD-n keresztüli gyors szállításának szükségessége. A bonyolult kód nem bírja ezt a tempót.
Az Apple WWDC 2023: „Embrace Swift Generics” elemzése kimutatta: egy átlagos iOS-projekt 40–60% „holt kódot” tartalmaz — a jövőre írt absztrakciókat, amelyek soha nem használódnak. Ez a kód nemcsak a bináris méretet növeli, hanem lassítja a fordítást és megnehezíti a navigációt. KISS megakadályozza ezt: csak azt írja, ami most kell.
Az Android Developer Relations Report (2024) szerint az alacsony kód-teszt arányú (1:0.8 alatti) projektekben 67%-kal több éles hibája van. A bonyolult kódot nehezebb tesztelni — ez közvetlen minőségi fenyegetés. Egyszerűség — a magas tesztlefedettség szükséges feltétele.
Mérje a kód bonyolultságát metrikákkal: ciklomatikus komplexitás (Cyclomatic Complexity) — tartsa az egyes metódusokat 10 alatt, ideálisan 5-ig. Használja a Detekt (Android) vagy SwiftLint (iOS) eszközt automatikus ellenőrzéshez.
Tipikus overengineering — absztrakt gyár repository-khoz létrehozása egy adatforrással rendelkező projektben. Egyszerű Repository osztály helyett a fejlesztő láncot épít: RepositoryFactory → IRepository → BaseRepository → RepositoryImpl — egy hipotetikus API-váltásra GraphQL-re.
A JetBrains Developer Survey (2023) felmérése szerint az Android-fejlesztők 43%-a elismerte, hogy legalább egyszer kidobott egy architektúra-réteget refaktoráláskor, mert nem használták. KISS azt mondja: hozzon létre absztrakciót, amikor megjelenik a második implementáció, nem előre.
Kezdje konkrét implementációval interfész nélkül. Amikor megjelenik a második adatforrás — emelje ki az interfészt refaktorálással (az IDE automatikusan megteszi). Ez gyorsabb, mint előre megírni az interfészt.
DI-keretrendszerek (Dagger, Hilt, Swinject) — hatékony eszközök, de gyakran bonyolításra csábítanak. A fejlesztők külön modult hoznak létre minden entitáshoz, még akkor is, ha egy helyen használják. KISS alternatíva: kézi injektálás konstruktoron keresztül egyszerű esetekben.
// Overengineering: modul egy repository-hoz
@Module
object UserModule {
@Provides
fun provideUserRepo(): UserRepository = UserRepositoryImpl()
}
// KISS: kézi injektálás, ha egy repository van
class UserViewModel(
private val repo: UserRepository = UserRepositoryImpl()
) { /* ... */ }
A konstruktorban történő kézi injektálás — a legegyszerűbb DI-minta. Nem igényel kódgenerálást, annotációkat vagy modulokat. Váltson DI-keretrendszerre csak akkor, amikor a projekt eléri az 5+ képernyőt és a kézi injektálás nehezen karbantarthatóvá válik.
Android ViewModel — gyakori forrása a túlzott bonyolultságnak. A fejlesztők StateFlow-t, combine-t, flatMapLatest-et és transzformációs láncokat adnak hozzá ott, ahol egy egyszerű MutableLiveData postValue-val elegendő. KISS azt ajánlja: kezdje a legegyszerűbb megoldással (LiveData), csak konkrét feladatra bonyolítsa (állapot-visszaállítás, debounce).
// KISS: egyszerű ViewModel reaktív láncok nélkül
class ProfileViewModel : ViewModel() {
private val _name = MutableLiveData<String>()
val name: LiveData<String> = _name
fun loadUser(id: String) {
viewModelScope.launch {
_name.postValue(repo.getUser(id).name)
}
}
}
Ebben a példában a ViewModel coroutine-t használ az aszinkron kéréshez, LiveData-t az eredmény közzétételéhez. Nincs StateFlow, nincs combine — csak ami valóban kell. Adjon hozzá StateFlow-t, ha egyirányú adatfolyamra (UDF) van szükség explicit állapottal.
iOS-ben a KISS elv a struktúrák (struct) előnyben részesítésében nyilvánul meg az osztályokkal (class) szemben az adatmodelleknél. A struktúrák értéktípusok, nem igényelnek memóriakezelést ARC-n keresztül, alapértelmezés szerint megváltoztathatatlanok. Az osztályok csak akkor indokoltak, ha azonosságra (két hivatkozás ugyanarra az objektumra) vagy öröklődésre van szükség.
// KISS: struct class helyett a modellhez
struct User: Codable {
let id: Int
let name: String
let email: String
}
// Overengineering: class kézi init és deinit segítségével
class UserClass: NSObject {
let id: Int
init(id: Int) { self.id = id }
}
A User struktúra automatikusan megkapja a memberwise init-et, az Equatable és Hashable támogatást (minden mezőre), a megváltoztathatatlanságot és a biztonságot több szálas környezetben. Az osztály kézi init-et, NSObject implementációt igényel, és hajlamos a versenyhelyzetekre (race conditions) a megosztott állapoton keresztül.
Hálózati réteg — egy másik terület, ahol a KISS gyakran sérül. A fejlesztők 5+ elemű Interceptor láncot, absztrakt gyárakon keresztüli szerializációt és mapper-t adnak hozzá minden végponthoz. KISS megoldás: egy URLSession konfigurációval és egy dekódolás Codable/JSON segítségével.
Az Apple: URLSession Programming Guide (2023) ajánlásai szerint az URLSession-en és Codable-en alapuló egyszerű hálózati réteg a mobilalkalmazási forgatókönyvek 95%-át lefedi. Az összetett Interceptor láncok csak specifikus esetekhez kellenek: token frissítés, naplózás, titkosítás.
Kezdje egyszerű hálózati réteggel URLSession + Codable alapokon. Az Interceptort a tényleges szükséglet alapján adja hozzá, nem előre. Ez 2–3-szor lerövidíti a hálózati réteg kódját.
Egyszerűség — nem ugyanaz, mint a primitívség. Az egyszerű megoldás tömör, érthető és feleslegesség nélkül oldja meg a feladatot. A primitív — figyelmen kívül hagyja a bevált gyakorlatokat és az egészséges architektúrát. A különbség az, hogy az egyszerű megoldást könnyű bővíteni, a primitívet — nem.
Példa: az Activity használata egyetlen entitásként minden képernyőhöz — ez primitívség, nem egyszerűség. Egyszerűség — a Navigation Component használata különböző Fragment-ekkel a különböző képernyőkhöz, de felesleges absztrakciók nélkül. KISS nem igazolja a rossz architektúrát.
Ellenőrizze magát: megváltozhat a kódja egy új funkció hozzáadásakor? Ha igen — az egyszerűség helyes. Ha minden funkcióhoz mindent újra kell írni — ez primitívség, sürgősen refaktoráljon.
Minták (MVVM, MVI, Coordinator) — nem bonyolítás, hanem strukturálás. A KISS nem tiltja a bevált architektúra minták használatát. Túlzott használatuk tilos: három minta ott, ahol egy is elegendő lenne. Arany középút — egy architektúra minta projektenként és legfeljebb 2–3 kiegészítő (DI, Navigation).
A State of Mobile Architecture Report (2024) szerint azok a projektek, amelyek pontosan egy architektúra mintát használnak, 34%-kal kevesebb hibával rendelkeznek az első fejlesztési évben, mint a 3+ minta kombinációjával rendelkező „frankenstein” projektek. Válassza az MVVM vagy MVI-t a mobil projekthez — és tartsa be minden képernyőn.
Ne keverje az MVVM-et és az MVI-t egy projekten belül. Ha a csapat az MVVM-et választotta — az egész projektnek MVVM-et kell követnie. Kivétel — külön funkciómodulok saját architektúra megoldással, de ennek tudatos választásnak kell lennie.
Gyakran ismételt kérdések
KISS (Keep It Simple, Stupid) — elv, amely megköveteli, hogy a kód a lehető legegyszerűbb legyen. Ha a feladat megoldható felesleges osztályok, minták és absztrakciók nélkül — oldja meg nélkülük. Az egyszerű megoldást könnyebb megérteni, tesztelni és módosítani.
DRY tiltja a kód ismétlését, KISS — a túlzott bonyolultságot. Néha ütköznek: az ismétlés megszüntetésére tett kísérlet (DRY) bonyolult absztrakcióhoz (KISS megsértése) vezethet. A Három Szabálya (Rule of Three) segít egyensúlyozni: csak a harmadik ismétlés után abstraháljon.
KISS megsérthető, ha pontosan ismeri a jövőbeli követelményt: például második platform támogatása KMM-en keresztül vagy migráció új architektúrára a következő negyedévben. Feltétel: a jövőbeli követelménynek dokumentáltnak kell lennie, nem hipotetikus feltételezésnek.
Használjon objektív metrikákat: ciklomatikus komplexitás (metódusonként 10-ig), sorok száma metódusonként (20-ig), beágyazási szint (3-ig). Androidhoz — Detekt plugin, iOS-hez — SwiftLint. Szubjektív metrika: egy új fejlesztőnek egy percen belül meg kell értenie a kódot.
Igen, KISS és SOLID kompatibilis. A SOLID a helyes architektúráról szól, a KISS — a minimális bonyolultságról. A KISS megsértése a SOLID túlzott alkalmazásából ered: tucatnyi osztály létrehozása ott, ahol három is elég lenne. Aranyszabály: SOLID az ésszerű határig, KISS szűrőként minden lépésnél.
Ö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