Обновить

Бэкенд

Сначала показывать
Порог рейтинга
Уровень сложности

Как я php фреймворк писал

Время на прочтение19 мин
Охват и читатели7.8K

В качестве вступления небольшой дисклеймер. Ниже длиннопост про самописный PHP-фреймворк, с примерами кода и его описанием. Автор не интерпрайз-разработчик, по образованию я юрист, а программирование для меня просто хобби, то, что меня занимает. Повествование идет о том, как я собирал свою систему исходя из своего представления о прекрасном и к чему в итоге пришел.

Большинству писать свой фреймворк не нужно от слова совсем. Берете Symfony, Laravel, Spiral, [ваш любимый фреймворк], нужный набор библиотек и решаете продуктовую задачу. Это разумный путь.

Зачем тогда этим занялся я? Если кратко, то потому что могу и хочу, если не очень кратко, то мне было интересно написать свой PSR-совместимый фреймворк. Все началось еще в середине десятых. На тот момент недавно вышел PHP 5.6, приняли PSR-7, позже появился PSR-15, и сборка своего велосипеда на этих новомодных абстракциях, с middleware-пайплайном, показалась мне весьма полезным и увлекательным предприятием.

За основу было решено взять nyholm/psr7, PHP-DI, для отправки ответа прикрутил laminas/httphandlerrunner, конфигурация была написана с оглядкой на тот же laminas, а middleware-пайплайн, фабрика для них, мапшрутизация, app-интеграция, провайдер аутентификации, экспорт конфигурации (в том числе экспорт замыканий) и skeleton-пакет были написаны с нуля. На это ушло примерно два или три года, и где-то к 2020 была собрана первая рабочая версия.

Потом я то забрасывал проект, то возвращался к нему вновь, то переписывал куски полностью. В 2025 году решил в очередной раз переделать все. Реализовать это устремление сильно помогло развитие кодинг-агентов. Сначала Claude Code, позже Codex. Большой объем кодовой базы был переписан или написан полностью с нуля.
Если после прочтения последнего предложения ты, дорогой читатель, почувствовал как свербит седалищный нерв, то не торопись писать свое фи или закрывать статью. Текст ниже не о вайб-кодинге и не о том, как можно легко и круто вкатиться в разработку не хуже интерпрайз-уровня, не имея никакой экспертизы в вопросе.
Кодинг-агенты хорошо решают задачу по написанию бойлерплейта, хотя, будем честны, многие другие задачи они тоже решают на достойном уровне.
В моем случае я занимался проектированием интерфейсов, архитектурой, написанием промптов, ревью и вычиткой README, а машина писала код, README, тесты, наводила на нужные мысли, предлагала, где можно посмотреть решения.

Читать далее

Как я спасал Magento 2 с 1 млн товаров и 10 млн CMS страниц от 504 ошибок

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.3K

Как мы спасали Magento 2 с 1 млн товаров и 10 млн CMS страниц от 504 ошибок.

Разбор реального кейса оптимизации Magento 2-магазина с более чем 1 миллионом товаров и 10 миллионами CMS-страниц. Покажу, почему возникали ошибки 504 Gateway Timeout, какие узкие места были обнаружены в архитектуре, и как использование Redis, Varnish, MariaDB и OpenSearch позволило добиться стабильной работы системы под высокой нагрузкой.

Читать далее

Код — больше не первая стадия: эксперимент с агентами

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели7.7K

Самый частый сценарий в моей практике: бизнес дает полстраницы требований, а через день спрашивает «ну что, готово?». Между ними — зона ответственности разработчика: уточнить, формализовать, согласовать. И только потом писать код. За последние пару лет этот процесс изменился сильнее, чем технологии.

Читать далее

Как сделать MCP-сервер из Spring-сервиса за один вечер. И что потом не даст спать спокойно

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели7.6K

AI‑агенту не нужен прямой доступ к базе, чтобы отвечать на вопросы оператора или вызывать действия в системе. Достаточно дать ему набор управляемых инструментов через MCP.

В статье разбираем, как это выглядит в Spring Boot, где заканчивается простая демка и почему перед продакшеном придётся думать не о магии LLM, а о правах, логах, таймаутах и человеке в контуре.

Разобрать MCP

Как я смог запустить суперапп и что это на самом деле

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели7.7K

Разработка супераппа в одиночку. Рассказываю, как за 8 месяцев я создал платформу на связке Django и Vanilla JS, какие критические уязвимости контроля доступа (IDOR) обнаружил в WebSockets и как решил их на уровне асинхронного бэкенда.

Читать далее

Как мы перестали проксировать картинки через бэкенд и подружили PWA c S3 через presigned URL

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели6.9K

Когда в нашем PWA‑приложении возникла задача добавить загрузку изображений, первое, что пришло в голову — классическая схема: клиент → бэкенд → S3. Но стоило копнуть глубже и учесть особенности PWA (офлайн, кэширование), несколько типов файлов с разными правами доступа и требования масштабирования, как наивное решение рассыпалось. В итоге мы пришли к архитектуре с presigned URL, разгрузили бэкенд и получили гибкую систему модерации. Делюсь этим опытом и ключевыми шишками, которые набил.

Читать далее

Почему умение говорить нет — один из самых важных скилов в разработке

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7.5K

Всем привет, меня зовут Михаил, я работаю главным экспертом (Java/Kotlin) в ОТП Банке.

Сегодня я хочу обсудить тему, которая на первый взгляд не кажется очевидной для разработчика, но именно она показывает зрелость и профессионализм.

Умение говорить "нет" - один из самых важных скилов в разработке. Ни знание фреймворков, ни владение языками программирования не сравнится с этим навыком.

Сказать "нет" бывает тяжело. Особенно в начале пути, когда ты еще молод и боишься. Боишься, что после этого к тебе начнут относиться хуже. Или не дай бог уволят.

Так давайте же посмотрим, почему этот скилл так важен и как обладание им меняет жизнь в разработке!

Читать далее

Crashprobe: как я заделал критическую уязвимость в версии 0.4.1

Уровень сложностиПростой
Время на прочтение1 мин
Охват и читатели7.1K

Привет, Хабр! Недавно я опубликовал статью про свою библиотеку - crashprobe, которая перехватывает ошибки в синхронном коде Python и потоках, а затем генерирует о них красивый HTML или TXT отчёт.

Статья получила хорошие результаты, а читатели помогли сделать библиотеку лучше и безопаснее. Так внимательный читатель @vldmrmlkv обратил внимание на критическую уязвимость в безопасности версии 0.4.0.

Читать далее

Как мы приручили vGPU до режима авто без проблем

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели6.8K

Привет, Хабр! На связи снова команда виртуализации платформы Astra Cloud. Решили рассказать, как мы укрощали тяжелую графику — от первых экспериментов до полноценного релиза.

Запрос от заказчиков звучал железобетонно: «Хотим тяжелую графику в виртуализации, как на рабочей станции, но чтобы управлялось централизованно». Мы ответили: «Сделаем». Как будто были другие варианты, ха!

Читать далее

graphlens: превращаем репозиторий в типизированный граф — Python, TypeScript, Go и Rust в одной модели

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели13K

Любой инструмент для «понимания кода», которым я пользовался, рано или поздно упирался в одну из двух стен.

Первая — цикл «grep → открыть → прочитать → перейти по импорту → снова grep». Работает, но медленно, и у него нет ни малейшего представления о том, что process_order, найденный в services.py — это тот самый process_order, который вызывается из api.py, а не однофамилец из tests/. Когда этим занимается LLM-агент, он ещё и сжигает на этом тонну токенов.

Вторая стена — моноязычность. Инструмент прекрасно понимает Python, но слепнет в ту секунду, когда фронтенд на TypeScript дёргает ручку FastAPI на Python. Реальные системы полиглотны. Инструменты вокруг них — обычно нет.

graphlens — это open-source фреймворк (MIT), который спроектирован так, чтобы обойти обе стены. Он парсит исходный проект, нормализует его структуру в общий граф-IR и отдаёт этот граф вам — делайте с ним что хотите: анализ зависимостей, навигацию, поиск мёртвого кода или подачу точных ответов LLM-агенту вместо вываливания файлов в контекст.

Читать далее

Аудит алгоритмов: как реализация Boyer-Moore с 190K звёзд на GitHub оказалась brute-force

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели29K

Проверил реализацию Boyer-Moore в TheAlgorithms/Python (190K+ звёзд). Оказалось, что сдвиг bad character записывается в переменную for-цикла, что в Python не имеет эффекта. Алгоритм выдаёт правильные результаты, но работает как brute-force O(nm) вместо O(n/m). Плюс ещё две находки: бесконечный цикл в типичных реализациях full BM и ошибка в оригинальной статье 1977 года, которую исправили только в 1980-м.

Читать далее

Как на самом деле работает .await: пишем свой async-рантайм на Rust с нуля

Уровень сложностиСредний
Время на прочтение17 мин
Охват и читатели12K

Каждый раз, когда вы пишете .await, происходит не магия, а вполне конкретный механизм: Future, Waker и опрос состояния. Чтобы увидеть это своими глазами, я написал собственный async-рантайм на Rust с нуля - с executor, reactor на epoll и рабочим TCP-эхо-сервером. По пути разобрался, как именно tokio будит ваши задачи, и нашёл баг, который тихо висел у меня в проде. Внутри - весь код целиком и объяснение без отсылок к чёрным ящикам.

Читать далее

Инвертируем зависимости одного FastAPI-эндпоинта

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели11K

Давайте ещё раз поговорим о SOLID. Если ваша работа хоть как-то связана с разработкой программного обеспечения или вы просто интересуетесь программированием, вы наверняка слышали этот печально известный акроним. Ему уже посвящены бесчисленные статьи, публикации в блогах и обучающие видео. Возможно, это одна из самых обсуждаемых аббревиатур в мире разработки. Но в этой статье я хочу подробнее остановиться на последней по порядку, но не по значимости букве – D, которая обозначает принцип инверсии зависимостей (Dependency Inversion PrincipleDIP).

Почему этот принцип важен для написания поддерживаемого кода? Важен ли он вообще? Зачем всё это нужно? Для ответа на эти вопросы давайте попробуем инвертировать зависимости в одном эндпоинтe FastAPI.

Читать далее

Ближайшие события

Mythos 5: что известно и как с этим жить

Время на прочтение9 мин
Охват и читатели9.7K

12 июня компания Anthropic сообщила, что правительство США временно запретило доступ к моделям Fable 5 и Mythos 5 пользователям из других стран как за пределами США, так и внутри страны, включая иностранных сотрудников самой Anthropic.

Компания утверждает, что доступ к остальным моделям Anthropic это решение не касается. Однако сам факт принудительного отключения доступа к двум передовым моделям снова поднял главный вопрос последних месяцев: насколько быстро развиваются ИИ-системы и готовы ли бизнес, регуляторы и разработчики к рискам, которые появляются вместе с такими возможностями.

Особенно много внимания привлекла Mythos 5 — модель, вокруг которой ещё до этого шли дискуссии из-за её потенциального влияния на кибербезопасность. Разбираемся, что известно о Mythos, почему власти США вмешались в доступ к модели и что эта история значит для российского рынка.

Читать далее

Бэкпорты теперь делают боты: как Valkey пустил ИИ-агентов в мейнтенанс — и удержал контроль

Время на прочтение2 мин
Охват и читатели9.3K

Valkey (форк Redis под крылом Linux Foundation) в релизном цикле 9.1 отдал ИИ-агентам рутину мейнтенанса: бэкпорт-агент сам раскатывает фиксы по веткам 7.2/8.0/8.1/9.0, отдельный агент сканирует provenance кода на конфликт с нынешней лицензией Redis (чтобы в форк случайно не затёк несовместимый код родителя), а агентский поиск багов наткнулся на ещё закрытую CVE. Разбираю не «ИИ заменяет мейнтейнеров», а как это сделали по уму: по словам Мэделин Олсон из AWS, агентов посадили на ограниченный, проверяемый слой (CI + ревью + человек на мерже) — «using AI agents without losing control». Главный вывод для своих проектов: сажать агентов на toil, а не на дизайн.

Читать дальше →

Записная книжка, которой не было, или Почему простота — истинная добродетель

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели14K

Я изучил записные книжки шести писателей-классиков и обнаружил, что ни один из них не вёл "систему управления знаниями". Их тетради были хаотичны, а сам подход не навязывал структуру. В результате исследования я сделал свою полноценную "тетрадь писателя" на Go в 3253 строки с нулём фреймворков и минимумом зависимостей.

Под катом — пространное эссе о том, почему "удобно" и "просто" — разные вещи.

Читать далее

Тёмная сторона Go: разбор живых уязвимостей с продакшена и инструменты против них

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели12K

Тёмная сторона есть, наверное, у каждого языка. У Go она выражена слабее: язык структурный, понятный, неплохо защищён по умолчанию. Но это не индульгенция. Разберём, что такое уязвимость и откуда она берётся, пройдёмся по типичным классам проблем на живых примерах с продакшена, посмотрим на инструменты локального анализа кода и обсудим, как выстроить продуктивные отношения с командой безопасности.

Читать далее

Все тесты зелёные, а байты разные: как я проверяю порты бинарных форматов

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9.4K

У меня было полторы сотни кросс-языковых фикстур, все тесты зелёные, и я был уверен, что мой Go-порт Yjs байт-в-байт совместим с оригиналом. Потом сравнил байты напрямую с канонической реализацией, и они разъехались: семантика сходится идеально, а на проводе документ толще.

Юнит-тесты, roundtrip и даже конвергенц-тесты систематически пропускают баги совместимости, когда портируешь чужой бинарный формат на другой язык. Рабочий метод один: генерировать фикстуры из канона и требовать в CI побайтового совпадения в обе стороны.

Разбираю конвейер и три реальных бага из трёх своих портов (Yjs, Loro, Willow): документ в 12 раз толще канона, big-endian остров, который молча портил бы все float’ы при обмене, и дыра, через которую 9-байтный апдейт заказывал make() на 67 ТБ. Метод обобщается на любой «порт формата X на язык Y», CRDT тут просто материал.

Читать далее

Разработка в 2026 году: что изменилось на рынке и на что сейчас смотрят работодатели

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели15K

Хабр, привет! Меня зовут Илья Благородов, я занимаюсь разработкой уже 30 лет, в том числе — выступаю экспертом в онлайн-магистратуре «Фронтенд и бэкенд-разработка» ИТМО в партнёрстве с Яндекс Практикумом. В этой статье я хочу поделиться своим взглядом на то, что происходит с профессией в 2026 году, что действительно изменилось, а что осталось прежним, и как сегодня новичку войти в профессию.

Читать далее

Django-согласия и cookies под 152-ФЗ: версии документов, аудит и экспорт вместо одного чекбокса

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели9.1K

Согласие на обработку персональных данных в Django-проекте часто начинается с одного BooleanField. Но затем оказывается, что недостаточно помнить только факт нажатия на чекбокс: пользователь мог видеть другую редакцию документа, отозвать согласие, выбрать лишь часть категорий файлов cookie, а администратору может понадобиться журнал действий и выгрузка в CSV.

Я сделал для этого два полностью независимых Django-пакета с открытым исходным кодом: django-consent-152fz для юридически значимых согласий и django-cookies-152fz для политики файлов cookie, категорий, подключённых сервисов и окна выбора. В статье покажу реальную модель данных, минимальное подключение и то, как устроены редакции, журнал событий и выгрузка данных.

Читать далее