Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+717новых вакансий за сутки·52 588вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 748
РезюмеAIПодготовкаСтатьи
ТарифыТарифы
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 391 кандидат открыт к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python5 437
  • Облачные технологии4 076
  • QA вакансии1 588
  • Android1 093
  • Инженер данных805
  • Продакт-менеджер368

Разработка

  • iOS1 047
  • Backend вакансии996
  • Fullstack вакансии441
  • Frontend вакансии355
  • AI вакансии354
  • Mobile вакансии27

По стеку

  • Go2 987
  • Java1 810
  • Kotlin868
  • Node.js675
  • Rust436
  • .NET434
  • PHP248
  • C++204
  • C#190

DevOps и инфраструктура

  • Kubernetes2 308
  • Linux-инфраструктура1 890
  • DevOps вакансии1 678
  • Terraform / IaC1 406
  • CI/CD842
  • Мониторинг и Observability645
  • SRE226
  • Кибербезопасность84

Аналитика и данные

  • Аналитик данных483
  • Data Scientist469
  • Бизнес-аналитик349
  • Системный аналитик48

Другие направления

  • Проджект-менеджер139
  • UI/UX дизайн71
  • Ручное тестирование14

По регионам

  • Вакансии в США24 791
  • Вакансии в Европе9 439
  • Работа в России2 924
  • Вакансии в Канаде2 178

По формату

  • Удалённые вакансии43 505
  • Релокация в США24 791
  • Гибридная работа3 370
  • Офисная работа2 525

По уровню

  • Senior вакансии20 898
  • Middle вакансии12 438
  • Junior вакансии3 864

Сейчас нанимают

Все компании
  • Rakuten188 вакансий
  • ASML163 вакансии
  • Grab134 вакансии
  • Wise71 вакансия
  • Infobip28 вакансий
  • Darktrace17 вакансий
  • Spotify14 вакансий
  • Celonis11 вакансий
  • Razorpay9 вакансий
  • Adyen8 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К подготовке по вакансии←К теме KotlinВсе вопросы
KotlinSeniorОпыт

Как понять, что команда использует Kotlin идиоматично, а не переносит привычки из другого языка?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Идиоматичный Kotlin виден в коде: extension functions вместо utility-классов, sealed/data classes вместо if-instanceof, корутины с правильным scope, отсутствие !! в production-коде.

1. API-дизайн с extension functions

Команда не создаёт XxxUtils и XxxHelper классы — вместо этого расширяет существующие типы:

// Не идиоматично: Utils-класс
object DateUtils {
    fun formatForDisplay(date: LocalDate): String = date.format(DateTimeFormatter.ISO_LOCAL_DATE)
}

// Идиоматично: extension function на типе
fun LocalDate.toDisplayString(): String = format(DateTimeFormatter.ISO_LOCAL_DATE)
fun LocalDate.isWeekend(): Boolean = dayOfWeek in setOf(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY)

Сигналы идиоматичного Kotlin

2. Sealed classes вместо enum + when-else

// Не идиоматично: String/enum с magic values
enum class Status { LOADING, SUCCESS, ERROR }
var errorMessage: String? = null  // отдельное поле, связь неявная

// Идиоматично: sealed class несёт данные
sealed class UiState {
    object Loading : UiState()
    data class Success(val jobs: List<Job>) : UiState()
    data class Error(val message: String, val retryable: Boolean) : UiState()
}

// Компилятор проверяет exhaustiveness:
when (state) {
    is UiState.Loading -> showSpinner()
    is UiState.Success -> showJobs(state.jobs)
    is UiState.Error -> showError(state.message)
}

3. Scope functions по назначению

// Не идиоматично: цепочка временных переменных
val builder = AlertDialog.Builder(context)
builder.setTitle("Confirm")
builder.setMessage("Delete?")
builder.show()

// Идиоматично: apply для конфигурации с side effect
AlertDialog.Builder(context).apply {
    setTitle("Confirm")
    setMessage("Delete?")
}.show()

// let — для nullable pipeline
user?.email?.let { sendNotification(it) }

// run — для вычисления значения в блоке
val greeting = run {
    val hour = LocalTime.now().hour
    if (hour < 12) "Good morning" else "Good afternoon"
}

4. Корутины с правильным scope и cancellation

// Не идиоматично: GlobalScope, игнорирование отмены
GlobalScope.launch { loadData() }

// Идиоматично: scope привязан к lifecycle, отмена автоматическая
class JobViewModel : ViewModel() {
    private val _jobs = MutableStateFlow<UiState>(UiState.Loading)
    val jobs: StateFlow<UiState> = _jobs.asStateFlow()

    init {
        viewModelScope.launch {
            repository.getJobs()
                .catch { e -> _jobs.value = UiState.Error(e.message ?: "Unknown", true) }
                .collect { _jobs.value = UiState.Success(it) }
        }
    }
}

5. Отсутствие !! в production-коде

Grep по !! в production-коде — быстрый аудит. Исключение: тесты, где NPE — корректный сигнал о провале.

6. Иммутабельные data classes с copy()

// Не идиоматично: mutable state
class Job {
    var title: String = ""
    var salary: Int = 0
}

// Идиоматично: val + copy для изменений
data class Job(val title: String, val salary: Int)
val updated = job.copy(salary = job.salary + 1000)

Подводные камни при аудите команды

  • Наличие run { ... } как замена if-блока без явной причины — overengineering, признак неопытности.
  • Везде apply вместо also/let — команда не различает receiver-based и argument-based scope functions.
  • Data class с var полями — нарушение immutability, часто перенесено из Java.
  • Отсутствие flowOn в репозитории и явный withContext в ViewModel — нарушение разделения ответственности.
  • Companion object с тяжёлой логикой вместо top-level функций — Java-static мышление.
  • when с else -> throw для sealed class — компилятор уже проверяет exhaustiveness, else избыточен.
  • Использование @JvmStatic и @JvmField там, где нет Java-interop — признак Java-to-Kotlin механического перевода.
  • Лямбды с многострочным телом вместо вынесенной именованной функции снижают читаемость — идиоматичный Kotlin не боится named functions.

Что портит ответ

  • Сразу обвинять Kotlin, не проверив соседние слои системы
  • Чинить симптом без минимального воспроизведения и evidence
  • Не учитывать версии, конфигурацию, окружение и recent changes

Что слушает интервьюер

  • Умеет локализовать проблему вокруг Kotlin
  • Двигается от симптома к гипотезам и проверкам
  • Отличает баг инструмента от ошибки использования или окружения

Как вы знаете этот вопрос?

Проверить себя по теме Kotlin →
←Предыдущий вопросКакие особенности runtime, type system или memory model Kotlin реально влияют на архитектуру приложения?Следующий вопрос→Какие ошибки делают разработчики, переходящие на Kotlin с другого языка или стека?

Связанные темы

KotlinDebuggingtechnical-communicationtechnology-selectiontrade-off-analysis

Частые вопросы на собеседовании

  • Что такое structured concurrency в Kotlin?
  • Для каких задач Kotlin является сильным выбором, а где лучше честно выбрать другой язык?
  • В чём разница между val и var в Kotlin?
  • В чём разница между List и MutableList в Kotlin?