Hackathon на Kotlin: как выиграть и не выгореть

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Kotlin на хакатоне: ваш билет в призовую тройку

Хакатоны — это адреналин, бессонные ночи, тонны кофе и магия, когда сырой код превращается в рабочий прототип за 48 часов. Но если вы всё ещё тащите на хакатон Python или Java, вы теряете козырь. Kotlin — это язык, который даёт вам суперсилу: писать меньше, делать больше и не сойти с ума от багов под утро.

Почему Kotlin идеален для хакатона? Он лаконичен, безопасен по null, поддерживает корутины (асинхронность без боли) и работает везде: от Android до бэкенда на Ktor. В этой статье я поделюсь реальными советами, как подготовиться к хакатону на Kotlin, и покажу примеры проектов с кодом, которые можно адаптировать под свою идею. Поехали!

Фаза 1: Подготовка — 80% успеха

Хакатон начинается не в момент объявления темы, а за неделю до него. Вот что нужно сделать, чтобы не писать код с нуля.

1. Соберите «джентльменский набор» библиотек

Не тратьте время на выбор инструментов. Заранее определите стек для MVP:

  • Backend: Ktor (лёгкий, быстрый, асинхронный) + Exposed (ORM для БД) + H2 или PostgreSQL.
  • Фронтенд (если нужно): Kotlin/JS или Compose Multiplatform — один язык для всех экранов.
  • Асинхронность: Kotlin Coroutines + Flow.
  • Сериализация: kotlinx.serialization — JSON без боли.
  • Тестирование: Встроенный kotlin.test — достаточно для быстрой проверки.

2. Подготовьте шаблон проекта

Создайте репозиторий с базовой структурой: настройка Ktor, подключение к БД, простой CRUD. Это сэкономит 2-3 часа в первый день хакатона. Пример стартового файла Application.kt:

import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.routing.*
import io.ktor.server.response.*
import io.ktor.server.request.*
import io.ktor.http.*

fun main() {
    embeddedServer(Netty, port = 8080) {
        routing {
            get("/") {
                call.respondText("Hello, Hackathon!", ContentType.Text.Plain)
            }
            get("/api/health") {
                call.respond(mapOf("status" to "ok"))
            }
        }
    }.start(wait = true)
}

Фаза 2: Выбор идеи — не усложняйте

На хакатоне побеждают не самые сложные проекты, а те, которые работают и решают конкретную боль. Забудьте про нейросети и блокчейн, если у вас нет готовой модели. Лучше сделать простой, но законченный продукт.

Пример 1: Telegram-бот для сбора фидбека на Kotlin

Используем Kotlin + TelegramBots (библиотека для ботов). Бот собирает анонимные отзывы от сотрудников и отправляет их в Google Sheets.

Ключевые возможности: приём сообщений, валидация, запись в таблицу.

import org.telegram.telegrambots.bots.TelegramLongPollingBot
import org.telegram.telegrambots.meta.api.methods.send.SendMessage
import org.telegram.telegrambots.meta.api.objects.Update

class FeedbackBot(token: String) : TelegramLongPollingBot(token) {

    override fun onUpdateReceived(update: Update) {
        val message = update.message.text
        val chatId = update.message.chatId.toString()

        if (message.startsWith("/feedback")) {
            val feedbackText = message.removePrefix("/feedback ").trim()
            if (feedbackText.isNotEmpty()) {
                // Сохраняем в БД или отправляем в Google Sheets
                saveFeedback(feedbackText)
                sendMessage(chatId, "Спасибо! Ваш отзыв принят.")
            } else {
                sendMessage(chatId, "Пожалуйста, напишите текст после /feedback")
            }
        }
    }

    private fun sendMessage(chatId: String, text: String) {
        val msg = SendMessage().apply {
            setChatId(chatId)
            setText(text)
        }
        execute(msg)
    }

    private fun saveFeedback(text: String) {
        // Реализация записи — например, через Exposed
        println("Feedback saved: $text")
    }
}

Пример 2: API для трекера привычек на Ktor + Exposed

MVP-версия: пользователь создаёт привычку, отмечает выполнение, получает статистику. База данных — H2 (встроенная), чтобы не настраивать PostgreSQL в условиях хакатона.

Модель данных:

import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq

object Habits : Table() {
    val id = integer("id").autoIncrement()
    val name = varchar("name", 100)
    val userId = integer("user_id")
    val completed = bool("completed").default(false)

    override val primaryKey = PrimaryKey(id)
}

fun initDatabase() {
    Database.connect("jdbc:h2:mem:test;DB_CLOSE_DELAY=-1", driver = "org.h2.Driver")
    transaction {
        SchemaUtils.create(Habits)
        // Пример вставки
        Habits.insert {
            it[name] = "Утренняя зарядка"
            it[userId] = 1
        }
    }
}

Endpoint для отметки выполнения:

post("/api/habits/{id}/complete") {
    val habitId = call.parameters["id"]?.toIntOrNull()
    if (habitId == null) {
        call.respond(HttpStatusCode.BadRequest, "Invalid id")
        return@post
    }
    transaction {
        Habits.update({ Habits.id eq habitId }) {
            it[completed] = true
        }
    }
    call.respond(HttpStatusCode.OK, "Habit marked as completed")
}

Фаза 3: Код-ревью на лету и деплой

На хакатоне нет времени на идеальный код. Но есть несколько правил, которые спасут вас от катастрофы:

  • Не используйте сложные паттерны. Функции длиной в 50 строк — ок. Главное, чтобы работало.
  • Пишите тесты только для критических мест. Например, для парсера данных или авторизации.
  • Деплойте сразу. Используйте Heroku, Railway или Fly.io — они поддерживают Kotlin/Ktor. Настройте CI/CD через GitHub Actions, чтобы пушить код и сразу видеть результат.

Пример простого Dockerfile для деплоя:

FROM openjdk:17-jdk-slim
COPY build/libs/hackathon-app.jar /app/app.jar
CMD ["java", "-jar", "/app/app.jar"]

Фаза 4: Презентация — продайте идею, а не код

Жю

Блоги

Рекомендаций по книгам