Hackathon на PHP: как победить с нуля и удивить жюри

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

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

Начать курс

Hackathon на PHP: как не прогореть и сделать крутой проект за 24 часа

Хакатоны — это адреналин, бессонные ночи и магия кода. Когда ты сидишь с командой в коворкинге, вокруг шум, пицца стынет, а дедлайн неумолимо приближается, хочется иметь в рукаве козырь. И этот козырь — PHP.

Многие скептически фыркают: «PHP? Для хакатона? Это же прошлый век!». Но на самом деле, современный PHP (7.4+, 8.x) — это ракета. Быстрый старт, куча готовых библиотек, минимум шаманства с сервером. Пока команда на Python будет настраивать виртуальное окружение, ты уже напишешь первый эндпоинт. В этой статье я расскажу, как использовать PHP на хакатоне, чтобы не просто доползти до финиша, а реально удивить жюри.

Почему PHP — идеальный язык для хакатона?

Давайте честно: на хакатоне время — единственная валюта. У тебя нет недели на рефакторинг и выбор идеального паттерна. Тебе нужно работающее демо. PHP в этом плане — король:

  • Zero configuration. Поставил XAMPP / OpenServer / Docker — и погнал. Не нужно компилировать, ждать билда.
  • Огромный Composer. Нужен парсер Excel? phpoffice/phpspreadsheet. Нужен API? slim/slim или laravel/lumen. Всё уже написано до тебя.
  • Простота хостинга. Выкатил на любой shared-хостинг за 5 минут. Жюри не нужно ставить Node.js или Python — PHP есть везде.
  • Быстрый прототип БД. PDO и MySQL — стандарт. Нет ORM-монстров, если не хочешь.

Но есть и подводные камни. PHP легко скатиться в «говнокод». На хакатоне это простительно, но если ты хочешь победить, нужно держать баланс между скоростью и читаемостью. Давайте разберем стратегию.

Фаза 1: Выбор идеи и стека (первые 30 минут)

Самая частая ошибка новичков — начать кодить сразу, как только услышали тему. Не делай так. Первые полчаса — это мозговой штурм и выбор инструментов.

Какую идею выбрать?

  • Решайте реальную проблему. Жюри устало от «очередного TODO-листа». Сделайте сервис для поиска потерянных вещей в университете или телеграм-бота для записи к врачу.
  • MVP — это не весь проект. Вы должны показать одну killer-фичу, но идеально. Лучше работающий чат на 2 пользователя, чем неработающий мессенджер с 10 функциями.
  • Используйте данные. Если есть открытое API (погода, биржи, университетское расписание) — берите его. Парсинг + визуализация выглядят солидно.

Стек для быстрого старта

Забудьте про Laravel для хакатона — он слишком тяжелый и требует много конфигурации. Идеальный выбор:

  • Микрофреймворк Slim 4 — легкий, быстрый, идеален для REST API.
  • Шаблонизатор Twig — если нужен фронт (но лучше отдавать JSON + Vue/React на фронте).
  • SQLite — не надо поднимать MySQL. Одна файловая база — и всё работает.
  • Tailwind CSS — для минимального фронта, чтобы не писать CSS вручную.

Фаза 2: Архитектура за 15 минут (не пропускай!)

Бери лист бумаги (или доску) и нарисуй 3 блока:

  1. Как пользователь вводит данные?
  2. Что происходит на сервере?
  3. Что видит пользователь?

Пример для сервиса опросов в реальном времени:

  • Пользователь создает опрос → POST запрос в /api/poll.
  • Другие голосуют → GET /api/poll/{id} с результатами.
  • Обновление через WebSocket (или тупой poll через JS setInterval).

На этом этапе вы уже понимаете, какие маршруты (routes) вам нужны. В Slim это выглядит так:

<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;

require __DIR__ . '/../vendor/autoload.php';

$app = AppFactory::create();

// Маршрут для создания опроса
$app->post('/api/poll', function (Request $request, Response $response) {
    $data = $request->getParsedBody();
    // Валидация и запись в БД
    $response->getBody()->write(json_encode(['status' => 'ok']));
    return $response->withHeader('Content-Type', 'application/json');
});

// Маршрут для получения результатов
$app->get('/api/poll/{id}', function (Request $request, Response $response, $args) {
    $pollId = $args['id'];
    // Достаем из БД
    $response->getBody()->write(json_encode(['id' => $pollId, 'votes' => 42]));
    return $response->withHeader('Content-Type', 'application/json');
});

$app->run();

Видите? 20 строк — и у вас уже два работающих эндпоинта. Никаких контроллеров, сервисов и DI-контейнеров — только хардкор. На хакатоне это нормально.

Фаза 3: Работа с базой данных без боли

Не пишите сырые SQL-запросы в каждом обработчике — это ад. Используйте PDO с простым классом-оберткой. Вот пример, который спасет вам часы:

<?php
class Database {
    private static ?PDO $instance = null;

    public static function getInstance(): PDO {
        if (self::$instance === null) {
            self::$instance = new PDO('sqlite:' . __DIR__ . '/../data/hack.db');
            self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            self::$instance->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
        }
        return self::$instance;
    }

    public static function init(): void {
        $db = self::getInstance();
        $db->exec("CREATE TABLE IF NOT EXISTS polls (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            question TEXT NOT NULL,
            created_at DATETIME DEFAULT CURRENT_TIMESTAMP
        )");
        $db->exec("CREATE TABLE IF NOT EXISTS votes (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            poll_id INTEGER NOT NULL,
            option TEXT NOT NULL,
            FOREIGN KEY (poll_id) REFERENCES polls(id)
        )");
    }
}

// Инициализация при старте приложения
Database                

Блоги

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