KISS (Keep It Simple, Stupid) — принцип разработки, предписывающий максимальную простоту системы. Сложность должна добавляться только тогда, когда она абсолютно необходима, а не впрок. По данным исследования IEEE Transactions on Software Engineering (2020), сложность кода коррелирует с плотностью дефектов: модули с высокой цикломатической сложностью содержат в 3,6 раза больше багов на тысячу строк. KISS — не примитивность, а осознанный выбор самого простого решения из работающих.
Главное
KISS (Keep It Simple, Stupid) — принцип проектирования, требующий минимизации сложности системы. Сформулирован в ВМС США в 1960-х годах инженером Келли Джонсоном (Lockheed SR-71 Blackbird). Джонсон требовал, чтобы самолёт мог ремонтироваться механиком в полевых условиях без специальных инструментов — это и есть суть KISS.
В разработке программного обеспечения KISS означает: решение должно быть настолько простым, насколько это возможно, но не проще (вторая часть фразы, приписываемая Альберту Эйнштейну). Простота — не синоним примитивности; простое решение выполняет задачу с минимальной избыточностью.
Исследование Google Research (2022) показало: среднее время входа в проект для нового разработчика составляет 3 недели в проектах с соблюдением KISS против 10 недель в проектах с избыточной архитектурой. Простой код — инвестиция в скорость адаптации новых членов команды.
Применяйте KISS как фильтр: перед добавлением новой абстракции спросите себя «решает ли это проблему, которая возникла сегодня, или проблему, которая может возникнуть через год?» Если второе — не делайте.
Бритва Оккама (XIV век) — философский принцип: «не следует умножать сущности без необходимости». В программировании это означает: из двух решений, одинаково удовлетворяющих требованиям, выбирайте то, в котором меньше сущностей (классов, модулей, зависимостей). KISS — практическая реализация бритвы Оккама в коде.
Разница в том, что бритва Оккама — общий принцип познания, а KISS — конкретная инженерная практика с измеримым результатом: снижение цикломатической сложности, уменьшение количества строк кода, сокращение времени code review. Метрики позволяют объективно оценить соблюдение KISS.
Следуйте метрике: код считается «достаточно простым», если новый разработчик понимает фрагмент за одну минуту без комментариев. Если нужно больше — упрощайте.
Мобильная разработка имеет три особенности, делающих KISS особенно важным: ограниченные ресурсы устройства (память, процессор), частые обновления платформ (iOS ежегодно, Android — ежеквартально) и необходимость быстрой доставки фич через CI/CD. Сложный код не выдерживает этого темпа.
Анализ Apple WWDC 2023: «Embrace Swift Generics» показал: средний iOS-проект содержит 40–60% «мёртвого кода» — абстракций, написанных «на будущее», которые никогда не используются. Этот код не только увеличивает размер бинарника, но и замедляет компиляцию и усложняет навигацию. KISS предотвращает это: пишите только то, что нужно сейчас.
По данным Android Developer Relations Report (2024), проекты с высоким соотношением кода к тестам (менее 1:0.8) имеют на 67% больше production-багов. Сложный код сложнее тестировать — это прямая угроза качеству. Простота — необходимое условие для высокой тестовой покрытости.
Измеряйте сложность вашего кода через метрики: цикломатическая сложность (Cyclomatic Complexity) — держите каждый метод ниже 10, идеально до 5. Используйте Detekt (Android) или SwiftLint (iOS) для автоматической проверки.
Типичный overengineering — создание абстрактной фабрики репозиториев в проекте с одним источником данных. Вместо простого Repository class разработчик строит цепочку: RepositoryFactory →IRepository → BaseRepository → RepositoryImpl — ради гипотетической смены API на GraphQL.
По данным опроса JetBrains Developer Survey (2023), 43% Android-разработчиков признались, что хотя бы раз выбрасывали архитектурный слой при рефакторинге, потому что он не использовался. KISS говорит: создавайте абстракцию, когда появляется второй вариант реализации, а не в предвкушении.
Начните с конкретной реализации без интерфейса. Когда появится второй источник данных — выделите интерфейс через рефакторинг (IDE сделает это автоматически). Это быстрее, чем писать интерфейс заранее.
DI-фреймворки (Dagger, Hilt, Swinject) — мощные инструменты, но они часто провоцируют усложнение. Разработчики создают отдельный модуль для каждой сущности, даже если она используется в одном месте. KISS-альтернатива: ручное внедрение через конструктор для простых случаев.
// Overengineering: модуль для одного репозитория
@Module
object UserModule {
@Provides
fun provideUserRepo(): UserRepository = UserRepositoryImpl()
}
// KISS: ручное внедрение, если репозиторий один
class UserViewModel(
private val repo: UserRepository = UserRepositoryImpl()
) { /* ... */ }
Ручное внедрение в конструкторе — простейший паттерн DI. Он не требует генерации кода, аннотаций и модулей. Переключайтесь на DI-фреймворк только когда проект достигает 5+ экранов и ручное внедрение становится трудно поддерживать.
Android ViewModel — частый источник избыточной сложности. Разработчики добавляют StateFlow, combine, flatMapLatest и цепочки трансформаций туда, где достаточно простого MutableLiveData с postValue. KISS рекомендует: начинайте с простейшего решения (LiveData), усложняйте только под конкретную задачу (сброс состояния, debounce).
// KISS: простой ViewModel без реактивных цепочек
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)
}
}
}
В этом примере ViewModel использует корутину для асинхронного запроса, LiveData для публикации результата. Нет StateFlow, нет combine — только то, что реально нужно. Добавляйте StateFlow, когда требуется однонаправленный поток данных (UDF) с явным состоянием.
В iOS принцип KISS проявляется через предпочтение структур (struct) классам (class) для моделей данных. Структуры — value type, не требуют управления памятью через ARC, иммутабельны по умолчанию. Классы оправданы только при необходимости идентичности (две ссылки на один объект) или наследования.
// KISS: struct вместо class для модели
struct User: Codable {
let id: Int
let name: String
let email: String
}
// Overengineering: class с manual init и deinit
class UserClass: NSObject {
let id: Int
init(id: Int) { self.id = id }
}
Структура User автоматически получает memberwise init, поддержку Equatable и Hashable (по всем полям), иммутабельность и безопасность в многопоточной среде. Класс требует ручного init, реализации NSObject и подвержен race conditions через разделяемое состояние.
Сетевой слой — ещё одна зона, где KISS часто нарушается. Разработчики добавляют Interceptor chain из 5+ элементов, сериализацию через абстрактные фабрики и мапперы для каждого эндпоинта. KISS-решение: один URLSession с конфигурацией и один декодинг через Codable/JSON.
По рекомендациям Apple: URLSession Programming Guide (2023), простой сетевой слой на URLSession с Codable покрывает 95% сценариев мобильного приложения. Сложные цепочки Interceptor нужны только для специфических кейсов: рефреш токенов, логирование, шифрование.
Начните с простого сетевого слоя на URLSession + Codable. Добавляйте Interceptor по мере реальной необходимости, а не «на будущее». Это сокращает код сетевого слоя в 2–3 раза.
Простота — не то же самое, что примитивность. Простое решение — это лаконичное, понятное решение, решающее задачу без избыточности. Примитивное — игнорирующее best practices и здравую архитектуру. Разница в том, что простое решение легко расширять, а примитивное — нет.
Пример: использование Activity как единственной сущности для всех экранов — это примитивность, а не простота. Простота — использование Navigation Component с разными Fragment для разных экранов, но без лишних абстракций. KISS не оправдывает плохую архитектуру.
Проверяйте себя: может ли ваш код измениться при добавлении новой фичи? Если да — простота правильная. Если для любой фичи придётся переписывать всё — это примитивность, срочно рефакторите.
Паттерны (MVVM, MVI, Coordinator) — это не усложнение, а структурирование. KISS не запрещает использовать проверенные архитектурные паттерны. Запрещается их избыточное применение: три паттерна там, где хватило бы одного. Золотая середина — один архитектурный паттерн на проект и не более 2–3 вспомогательных (DI, Navigation).
Согласно State of Mobile Architecture Report (2024), проекты, использующие ровно один архитектурный паттерн, имеют на 34% меньше багов в первый год разработки, чем проекты-«франкенштейны» с комбинацией из 3+ паттернов. Выберите MVVM или MVI для мобильного проекта — и придерживайтесь его на всех экранах.
Не смешивайте MVVM и MVI в одном проекте. Если команда выбрала MVVM — весь проект должен следовать MVVM. Исключение — отдельные фичи-модули с собственным архитектурным решением, но это должно быть осознанным выбором.
Часто задаваемые вопросы
KISS (Keep It Simple, Stupid) — принцип, требующий делать код максимально простым. Если задачу можно решить без лишних классов, паттернов и абстракций — решайте без них. Простое решение легче понять, протестировать и изменить.
DRY запрещает дублирование кода, KISS — избыточную сложность. Иногда они конфликтуют: попытка устранить дублирование (DRY) может привести к сложной абстракции (нарушение KISS). Rule of Three помогает балансировать: абстрагируйте только после третьего повторения.
KISS можно нарушить, когда вы точно знаете будущее требование: например, поддержка второй платформы через KMM или миграция на новую архитектуру в следующем квартале. Условие: будущее требование должно быть документально подтверждено, а не гипотетическим предположением.
Используйте объективные метрики: цикломатическая сложность (до 10 на метод), количество строк на метод (до 20), уровень вложенности (до 3). Для Android — плагин Detekt, для iOS — SwiftLint. Субъективная метрика: новый разработчик должен понимать код за одну минуту.
Да, KISS и SOLID совместимы. SOLID — о правильной архитектуре, KISS — о минимальной сложности. Нарушение KISS возникает при избыточном применении SOLID: создании десятка классов там, где хватило бы трёх. Золотое правило: SOLID до разумного предела, KISS как фильтр на каждом шаге.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также