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: Презентация — продайте идею, а не код
Жю