Обновить
1024K+

Программирование *

Искусство создания компьютерных программ

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

5 слоев кэширования в веб-приложениях: Полное руководство для Python-разработчиков

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

Содержание

Кэширование — ключевой механизм оптимизации производительности веб-приложений, позволяющий снизить задержки и уменьшить нагрузку на серверы. В этой подробной статье рассмотрим пять основных уровней кэширования, применимых в современных веб-системах. Ты узнаешь о внутреннем и внешнем кэше, кэшировании на уровне reverse proxy, браузера и фронтенда. 

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

Читать далее

Предотвращение лишних реактивных вычислений

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

Иногда значение меняется на эквивалентное. И здесь существуют разные подходы к отсечению вырожденных вычислений…

Глубоко погрузиться в тему

Claude Code в 54 раза дешевле. Я все протестил

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

В этой статье я расскажу, как попробовал дешевую альтернативу Claude, создал рабочую программу для macOS и вместо 13$ - потратил 0.25$

Читать далее

Почему ваши моки не ловят реальные баги?

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

Вы можете замокать aiohttp.ClientSession._request и получить зелёный CI. Но этот тест всё ещё не доказывает, что у вас работает timeout. И не доказывает, что клиент переживёт обрезанный JSON. И не доказывает, что retry реально делает три HTTP-запроса через сокет.

В этой статье я прогоняю один и тот же сценарий через пять уровней тестирования внешнего API — от DI-заглушки до настоящего HTTP-сервера — и показываю, где каждый уровень врёт.

Читать далее

Ваша модель показывает 95% accuracy и при этом бесполезна: метрики для несбалансированных классов

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

Модель может показывать 95–99% accuracy и при этом не решать задачу: особенно если редкий класс важнее всего для бизнеса. В статье разбираем, почему accuracy ломается на несбалансированных данных, как читать precision, recall и F1, зачем смотреть PR‑кривую и confusion matrix, а также как подбирать порог классификации с учетом стоимости ошибок.

Понять ошибки

Непослушный using

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

В прошлой статье я разобрал, как работает квалифицированный поиск и как using namespace участвует в нём только в качестве запасного варианта, когда собственных объявлений в указанной области нет. Компилятор сначала смотрит, что объявлено непосредственно в текущем контексте, и только при неудаче переходит к именам, подмешанным через директиву using. Казалось бы, схема прозрачная и предсказуемая: есть область поиска, есть приоритет явных объявлений, есть «правило N-объявлений» как страховка.

Но как только мы переходим от переменных и функций к более общим механизмам в коде, эта прозрачность сразу начинает ломаться, причём в самом обыденном коде, который пишет каждый разработчик с первых дней обучения. По правилам языка мы можем разместить директиву using namespace где угодно, но если в области, указанной в квалификаторе, что-то объявлено явно, квалифицированный поиск найдёт именно это объявление, и лишь если явно объявленного имени нет, компилятор начинает учитывать имена, ставшие видимыми через using namespace, и так далее по цепочке.

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

ох уж этот using

Память дала AI-агенту прошлое. Solo Kanban даёт ему настоящее

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

AI стал писать код быстрее, чем я успевал удерживать контекст работы. Код вроде написан, diff вроде разумный — но почему именно так, какие варианты отбросили, что обещали не трогать, куда делись follow-ups? Всё это жило в чате, а репозиторий видел только финальный diff.

Это третья статья серии про память AI-агентов. В первых двух — https://habr.com/ru/articles/1006756/ и https://habr.com/ru/articles/1033388/ — разбирал устройство Memory MCP Server: зачем агенту постоянная память, semantic search, грабли по дороге. Память помогла, но довольно быстро выяснилось, что «помнить» и «вести задачу до конца» — разные навыки.

В этой статье — про следующий слой: Solo Kanban, git-native delivery loop для одного разработчика и AI-агентов. Planning files, task workspace, risk-based gates, обязательный verify перед closure. Это не «новый Scrum для одного человека», а набор safety rails: минимальные файлы и gate’ы, которые не дают агенту потерять scope, пропустить проверку или оставить follow-up только в чате.

Внутри: pipeline с risk-based выбором tier’а, мини-пример сквозной задачи, связка с Memory MCP, антипаттерны из реальных кейсов (включая reviewer-LLM, который approveнул нулевую реализацию). Метод вынесен в отдельный фреймворк: https://github.com/ipiton/solo-kanban-framework (MIT, v1.0.0).

Читать далее

AI-агенты в разработке: как Cursor, Claude Code и агентный подход меняют работу программиста

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

AI-агенты — одна из самых спорных тем в разработке. Одни видят в них следующий шаг после Copilot и способ быстрее закрывать рутину. Другие — источник технического долга, проблем с безопасностью и ещё одну волну завышенных ожиданий вокруг AI.

В этой статье разберём как устроен агентный подход, как работают популярные инструменты Cursor и Claude Code и что важно знать для работы с агентами.

Что использовать в 2026 году →

GLM-5.1 придумал для меня новый алгоритм

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

Друзья, знаю, что интернет переполнен воспеванием AI, что вызывает у многих людей (особенно специалистов) фрустрацию, особенно когда речь заходит о написании кода на C/C++. Я не AI-проповедник – просто активный и ответственный программист, который пользуется AI-инструментами. Недавно я предложил AI (если быть точнее, opencode + GLM-5.1) придумать алгоритм для одной из задач, над которой я работаю, и он справился очень хорошо. Это не прорывной алгоритм, на котором я разбогатею, но он интересный: составленный из известных компонентов, но всё же новый. В статье расскажу:

Как решать задачу “дана битовая строка, нужно найти все позиции в ней, что количество единиц минус количество нулей до этой позиции равно заданному числу”

Что мне придумал AI для этой задачи

Что я использую для того, чтобы AI писал что-то адекватное на C++

Если вам интересны алгоритмы и структуры данных, то описанная задача используется в контексте RMQ/LCA.

Читать далее

Как управлять эволюционным поиском? На примере конечных автоматов

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

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

А люди для решения такого рода задач придумали эволюционные алгоритмы. С помощью них можно генерировать разные варианты, тестировать их в одинаковых условиях и оставлять те, что становятся лучше по выбранным критериям.

Один из способов понять как возникает сложность — это попробовать создать ее самому. 

Поэтому мы поговорим об эволюционных алгоритмах на примере созданной модели GUCA (Graph Unfolding Cellular Automata). Ее можно запустить на компьютере, чтобы проверять гипотезы и находить закономерности: какие изменения приводят к прогрессу, какие — к стагнации, а какие — к эффектным, но бессмысленным решениям.

Мы расскажем про процесс экспериментов с эволюционными алгоритмами: как формулировать цель через оценку и как использовать найденные трюки, чтобы научить компьютер решать подобные задачи быстрее.

Читать далее

Эпоха иллюзорной продуктивности

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

Закон Паркинсона гласит, что работа растягивается на всё отведённое под неё время. А в современную эпоху ИИ у людей вообще появился инструмент, способный масштабировать результаты их работы до той степени, до которой они смогут нагенерировать целевой контент, то есть почти безгранично.

То, что я наблюдаю в своём профессиональном поле на протяжении двух последних лет, сложно описать. Первый явный звоночек я заметил чуть меньше, чем полтора года назад. Тогда я обратил внимание, что коллега отвечает мне в переписке с помощью ИИ. Его выдала пунктуация — длинные тире там, где их никто не использует; ритмическая структура текста и уверенное рассуждение на тему технологий, в которых он заведомо не разбирался.

Я задумался над этой ситуацией, пытаясь понять, стоит ли спорить с человеком, который явно просто копирует ответы модели. Канал был публичным, и мне приходилось тратить уйму времени на исправление элементарных вещей. В конечном итоге я сдался — какого-то осмысленного диалога со встречной стороны всё равно не было.

Генеративный ИИ способен создавать, казалось бы, экспертную работу, сам при этом экспертом не являясь. Как результат, здесь возникает два вида проблем. Во-первых, новичок может быстрыми темпами воспроизводить работу, по содержанию близкую к работе старших специалистов, не имея достаточного опыта для оценки её качества. Во-вторых, люди могут получать при генерации галлюцинации или артефакты в тех областях, в которых они не разбираются. С виду это похожие проблемы, но между ними есть разница. Первую удалось хорошо измерить с помощью исследований. Но не вторую, и по своему опыту могу сказать, что она самая опасная.

Читать далее

Как я за последний год стал программировать по-новому. А как вы?

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

Довольно интересное наблюдение: я перестал пользоваться автокомплитом в IDE, который предлагает LLM.

Сначала для меня это была одна из ключевых функций. Это казалось жутко удобным: ты начинаешь писать функцию в своём коде, а LLM дописывает её на основе здравого смысла или контекста из открытых табов.

Читать далее

Как работают lambda-функции в Python: замыкания, позднее связывание и антипаттерны

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

Вы всё ещё используете map и filter с лямбдами в 2026 году? Подготовил большой гайд по анонимным функциям в Python: от самого первого lambda x для новичков до разбора байт-кода, замыканий и жестких антипаттернов, за которые бьют по рукам на код-ревью.

Читать далее

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

Нейросеть — не второй программист. Как правильно разделить работу. Помощь для начинающих

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

Когда разработчик впервые применяет языковую модель, ошибка часто возникает ещё до первого ответа. Он переносит на модель собственный способ работы и ожидает, что она будет действовать как человек: запоминать информацию «в голове», уставать, понимать интерфейс и спорить. Это некорректный перенос.

Языковая модель — не человек. Это инструмент, порождающий код на основе статистических связей. Данная статья родилась как небольшая помощь моим юным коллегам, позволяющая получить набор эргономичных правил для взаимодействия с нейросетевой моделью и организации труда с целью получить максимальную выгоду для себя и не навредить проекту.

Читать далее

manage.py migrate в пятницу в 17:30 на проде с 3K RPS и таблицей 200М строк

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

Всем привет! Меня зовут Макс, я Lead Backend и автор YouTube‑канала PyLounge

Это третья часть мини‑серии о Django‑миграциях. В первой части мы готовились к миграциям и разбирались с конфликтами, во второй чинили типичные подводные камни. Если их не читали, то рекомендую начать именно с них, а затем вернуться сюда.

В этом же материале поговорим о самом интересном: что происходит, когда python manage.py migrate запускается в 17:30 в пятницу на проде, под 3k RPS и таблицей в 200 миллионов строк. 

Расскажу какие блокировки в PostgreSQL берёт каждая операция Django, что внутри atomic = False, как пишется правильный паттерн expand‑migrate‑contract, зачемнужны AddIndexConcurrentlyAddConstraintNotValidSeparateDatabaseAndState и как обновлять данные на больших таблицах.

P. S. примеры намеренно упрощены, чтобы влезли в статью и не задушили. В реальной жизни всё ещё хуже — но шаги те же.

P. S.S. При подготовки этого материала ни одна продовая база данных не пострадала. 

Читать далее

Harness вокруг LLM: что я понял за год ежедневной работы

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

Полтора года в Claude Code, несколько релизов моделей, десятки экспериментов с командой в Kaiten. Всё это время я ждал, что главным рычагом качества будет очередной релиз модели. Оказалось, ровно наоборот: смена модели даёт заметный, но ограниченный прирост, а каждый новый слой обвязки вокруг неё — кратный.

Англоязычные инженеры называют эту обвязку harness. Это контур, в котором живёт модель: системный промпт, инструменты, контекст, скиллы, хуки, разрешения и память. Без него даже флагманский Claude или Codex работает как экскаватор без рычагов — мощность есть, использовать нечем. У русского аналога одного короткого слова пока нет, поэтому ниже — harness и обвязка вперемешку.

Читать далее

Как запихнуть килограмм LLM в телеграм-бота и не сойти с ума

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

Все началось с прикола, я сидел с друзьями и подумал, а вот было бы прикольно запихать разные модели нейросетей в один чат и заставить их думать, что они реальные люди и работают в корпорации. Весь смысл был в том, чтобы это были действительно разные модели и пользователь мог просто между ними переключаться по запросу. Для начала мне нужно было найти зоопарк апи ключей с бесплатными лимитами. Я прошерстил весь интернет и в итоге нашел относительно норм варианты: Groq для LLama, Google AI Studio для Gemma и Gemini. В целом в это время код был простой, правда все время происходил забавный баг, когда пользователь переключался между моделями, одна модель не хотела отдавать очередь другой и просто притворялась ею, но я в целом без трудностей поправил это через системный промт. Однако до конца у меня исправить это так и не получилось, видимо, мои модели слишком тупые.

Читать далее

Я заставил LLM писать Rust полгода. Вот что они стабильно ломают

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

Полгода использовал Claude, GPT и Cursor как полноценного второго разработчика на Rust в проде. Собрал семь категорий ошибок, которые модели стабильно делают и которые проходят cargo build, cargo test, иногда cargo clippy и при этом являются UB или скрытыми архитектурными ловушками. Lifetime laundering, std::sync::Mutex через .await, Drop у транзакций, unaligned read, async cancellation, orphan rule и массивы на стеке. Разбираю, почему именно Rust ломает LLM и что с этим делать.

Читать далее

Почему программисты не сходят с ума(и почему иногда всё же сходят)

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

Программирование — это редко про «написать кнопку». Чаще это попытка перевести хаос бизнес-процессов, привычек пользователей и странных требований в систему, которая должна работать стабильно. В статье — реальные истории из легаси, enterprise и автоматизации: DOS-мышление в вебе, Excel как основа бизнеса, реверс-инжиниринг без документации и почему иногда лучший аналитик — оператор с цифровым блоком клавиатуры.

Читать далее

Обработка исключений, возникших при обработке исключений

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

Исключения рождаются не только в основном коде, но и в обработчиках этих самых исключений. Зачастую вопросу не уделяется должного внимания. Действительно, что может пойти не так в блоке catch? Там ведь код тривиальный! Но это только на первый взгляд.

Например, безобидный LOG.warn("...") выливается в десяток вызовов нижележащих методов. И чем больше «наслоений» в библиотеке логгирования, тем выше вероятность сбоя. Всё бы ничего, если бы не одна особенность языка Java…

Читать далее