В чем разница между Middle и Senior

Ответ

Middle Developer умеет самостоятельно решать типовые задачи, знает стандартные библиотеки и фреймворки, но может испытывать трудности с нестандартными кейсами. Senior не только решает сложные задачи, но и проектирует архитектуру, обучает команду, принимает стратегические решения.

Пример:
Middle:

fun loadData() {
    viewModelScope.launch {
        val data = repository.getData()
        _uiState.value = UiState.Success(data)
    }
}

Senior предусмотрит ошибки, кэширование, отмену корутин:

fun loadData() {
    viewModelScope.launch {
        _uiState.value = UiState.Loading
        try {
            val data = repository.getCachedData() ?: repository.fetchData()
            _uiState.value = UiState.Success(data)
        } catch (e: Exception) {
            _uiState.value = UiState.Error(e)
        }
    }.also { job -> 
        onCleared { job.cancel() } 
    }
}

Senior также думает о масштабируемости и поддерживаемости кода.

Ответ 18+ 🔞

А, ну вот, классика жанра, ёпта! Сидишь такой, смотришь на код и думаешь: «Ну и кто тут у нас middle, а кто уже senior?» А разница-то, блядь, как между «сделал, чтоб работало» и «сделал, чтоб не разъебало всё через полгода».

Смотри, middle-разработчик — он как солдат срочной службы. Знает, где у автомата спусковой крючок, умеет копать от забора и до обеда. Задачи типовые? Без проблем, ядрёна вошь! Библиотеки стандартные? Да я их, как два пальца... Но как только задача выходит за рамки уставного шаблона — всё, начинается «ёклмн, а как это, блядь?». Архитектура? Ну, вроде бы патерн какой-то применил... А зачем? Хуй его знает, в интернете так писали.

А senior — это уже, блядь, офицер. Он не просто окоп роет, он карту местности изучает, где мины могут быть, где подкрепление подвести, а где хуй с горы скатится и всё похерит. Он не просто код пишет. Он систему проектирует. Он смотрит на задачу и сразу видит: «Так, тут овердохуища подводных камней, тут через полгода команда из пяти человек будет меня проклинать, а тут вообще пиздопроебибна получится, если не предусмотреть».

Вот смотри на примере, тут всё как на ладони.

Middle-чувак делает просто и прямолинейно. «Надо загрузить данные? Ёб твою мать, беру и загружаю!»

fun loadData() {
    viewModelScope.launch {
        val data = repository.getData()
        _uiState.value = UiState.Success(data)
    }
}

Вроде всё ок, работает же! А потом приложение вылетает, потому что сеть пропала, и пользователь видит белый экран. Или данные старые, а он каждый раз тянет их с сервера, трафик пользователя жрёт как не в себя. Или экран закрыли, а запрос всё ещё летит и пытается обновить уже несуществующий интерфейс. Доверия к такому коду — ноль ебать. Он как хитрая жопа — вроде есть, а толку от неё чуть.

А теперь Senior-подход. Этот чувак уже наступил на все грабли, поэтому у него в голове сразу красные лампочки загораются.

fun loadData() {
    viewModelScope.launch {
        _uiState.value = UiState.Loading // 1. Показали юзеру, что работаем, а не просто зависли.
        try {
            // 2. Сначала глянул в кэш — вдруг там свежее лежит? Экономия трафика, скорость, мать его.
            val data = repository.getCachedData() ?: repository.fetchData()
            _uiState.value = UiState.Success(data)
        } catch (e: Exception) {
            // 3. Сеть отвалилась? Сервер послал нахуй? Не паникуем, показываем ошибку красиво.
            _uiState.value = UiState.Error(e)
        }
    }.also { job -> 
        // 4. А это что за магия? А это, блядь, отмена корутины, когда вьюмодель чистится.
        // Чтоб утечек памяти не было и чтобы не пытался обновить труп экрана.
        onCleared { job.cancel() }
    }
}

Видишь разницу? Middle написал функцию. Senior спроектировал поведение. Он думает наперёд: масштабируемость (вдруг тут потом не просто данные, а ещё пять источников?), поддерживаемость (коллега через месяц должен будет это понять и допилить), надёжность (приложение не должно падать от любой ерунды).

Короче, middle знает как сделать. Senior понимает что, зачем и почему нужно сделать именно так, а ещё предвидит, что может пойти не так. И да, он ещё и остальных учит, потому что ему, блядь, терпения ноль — смотреть, как команда месяц изобретает кривой велосипед, который он уже десять раз ломал и чинил. Вот и вся философия, чувак.