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

+1 541новая вакансия за сутки·60 864вакансии открыты сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python13 614
  • Облачные технологии9 925
  • QA вакансии3 157
  • Android1 675
  • Инженер данных1 071
  • Продакт-менеджер317

Разработка

  • iOS1 558
  • Backend вакансии1 462
  • AI вакансии743
  • Fullstack вакансии576
  • Frontend вакансии495
  • Mobile вакансии28

По стеку

  • Go7 718
  • Java4 674
  • Node.js1 474
  • Kotlin1 310
  • Rust1 275
  • .NET1 098
  • PHP474
  • C++314
  • C#210

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

  • Kubernetes5 760
  • Linux-инфраструктура4 462
  • DevOps вакансии3 927
  • Terraform / IaC3 213
  • Мониторинг и Observability1 531
  • CI/CD932
  • SRE416
  • Кибербезопасность29

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

  • Аналитик данных611
  • Бизнес-аналитик534
  • Data Scientist444
  • Системный аналитик80

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

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

По регионам

  • Вакансии в США31 393
  • Вакансии в Европе11 635
  • Работа в России3 672
  • Вакансии в Канаде2 524

По формату

  • Удалённые вакансии47 029
  • Релокация в США31 393
  • Гибридная работа8 379
  • Офисная работа5 670

По уровню

  • Senior вакансии25 431
  • Middle вакансии11 844
  • Junior вакансии4 210

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

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

Вакансии из 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?