Обновить
1024K+

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

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

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

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

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

Пять месяцев назад я начал делать игровой движок Neotolis Engine на C17. Хотел глубже погрузиться в рендер и собрать для себя движок, с которым мне было бы легко и приятно работать. Сейчас в нём уже достаточно фич, чтобы делать игру. Я делаю 3D-инкременталку про проблему вагонетки Not a Trolley Problem.

В статье рассказываю, какие принципы я заложил в движок, как использую Claude и Codex и почему важно делать игры, а не только движок.

Читать далее

Одно лишнее if — и объект уезжает в кучу: как C2 решает, каким аллокациям не быть

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

Пара new в горячем методе может вообще не попасть в кучу — а после безобидного if внезапно вернуть аллокации обратно. Разбираемся, как C2 принимает такие решения, где ломается скалярная замена и как проверить всё это через JMH и диагностические флаги JVM.

Разобраться в JVM

Математики до сих пор не уверены, как быстрее всего перемножать числа

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

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

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

Чтобы понять суть этого «узкого места», обратите внимание на то, как «школьный» алгоритм справляется с увеличением размера чисел. При умножении двух двузначных чисел выполняется четыре однозначных умножения. Если перейти к паре трёхзначных чисел, то потребуется девять однозначных умножений. Нагрузка растёт пропорционально квадрату количества разрядов (n², где n — количество разрядов в умножаемых числах). При анализе подобного алгоритма компьютерные учёные не измеряют скорость в секундах, поскольку она зависит от аппаратного обеспечения. Вместо этого они подсчитывают количество вычислительных шагов. Они также игнорируют второстепенные детали, такие как время, необходимое для переноса единицы при умножении. Когда числа становятся достаточно большими, эти низкоуровневые операции перестают иметь значение, поскольку их полностью затмевают более ресурсоёмкие операции. Информатики обозначают количество шагов с помощью так называемой нотации «большого O»: например, алгоритм, который учат в начальной школе, требует O(n²) шагов, что читается как «порядка n в квадрате». В общих чертах, если числа в два раза длиннее, для выполнения алгоритма требуется в четыре раза больше вычислительной работы. Если числа в тысячу раз длиннее, требуется в миллион (1 000 в квадрате) раз больше работы.

Читать далее

Психанул: как я за полтора месяца сделал формат конфигов и парсеры для семи языков

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

Cлучилось то, что я обычно советую не делать: я не выбрал из существующих 14 форматов, а сделал 15-й.

Читать далее

Война машин за валяющиеся трусы: как работа с грязным бельем вдруг стала главной задачей для ИИ-роботов

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

Figure AI, Sunday Robotics, Weave Robotics и другие компании вкладывают огромные деньги в создание домашних гуманоидов, которые должны однажды превратиться в настоящих роботов-дворецких.

Но прежде чем дройд в стиле C-3PO из "Звездных войн" начнет готовить вам ужин и мыть полы, ему придется разобраться с кучей грязного белья.

Читать далее

Найти человека по голосу среди 134 тысяч записей

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

В последний вечер дататона у нас оставалось три попытки отправить решение. К этому моменту мы уже перебрали несколько моделей, собрали тяжёлый ансамбль и упёрлись в 0.6605. Новые энкодеры добавляли по одной-две тысячных, а fine-tuning показывал отличные цифры локально и проваливался на лидерборде.

Добавлять ещё одну модель смысла почти не было. Мы решили изменить сам поиск соседей: попробовать K-reciprocal re-ranking, а затем ещё раз применить AS-Norm. От этого варианта ждали примерно 0.67–0.69.

Получилось 0.7042 и 10-е место из 93. Почти весь день мы пытались выжать из моделей тысячные, а перерасчёт соседей добавил больше четырёх сотых без дополнительного обучения.

Читать далее

SAX-парсинг больших XML в Free Pascal: разбираем OpenCorpora без переполнения памяти

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

Разбор XML казался тривиальной задачей — пока я не попытался загрузить словарь OpenCorpora объёмом свыше 400 МБ через стандартный DOM-парсер. Дерево документа строилось бесконечно долго, потребление памяти росло без остановки, а до обработки данных дело так и не доходило.
Решением оказался SAX-парсинг, давно присутствующий в стандартной библиотеке Free Pascal, но почти не встречающийся в актуальных примерах и туториалах. В статье разбираю, как устроена событийная модель разбора XML, почему она принципиально экономичнее DOM для больших файлов, и как на её основе был построен парсер словаря OpenCorpora для экспериментальной библиотеки.

Читать далее

Rust в высоконагруженной видеоаналитике: кейс «Фалькон Тех»

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

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

Именно поэтому всё больше команд, разрабатывающих высоконагруженные системы видеоаналитики, рассматривают Rust как альтернативу языкам с ручным управлением памятью (C/C++) — как минимум для критических компонентов, где важны предсказуемое время отклика и исключение ошибок работы с памятью.

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

При подготовке статьи комментариями поделился Антон Половихин, руководитель команды разработки сервисов локального комплекса в «Фалькон Тех». Он ответил на вопросы по работе с Rust в высоконагруженных бэкенд-системах и помог уточнить технические детали.

Читать далее

NVMe выдаёт 600 000 записей в секунду, а база коммитит 180

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

NVMe показывает сотни тысяч IOPS, а база упирается в пару сотен коммитов в секунду — знакомая ситуация, если ориентироваться на обычные тесты записи.

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

Читать разбор

Как Omit {T, K} растворил типы, или что такое дистрибутивность типов в TypeScript

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

Представьте ситуацию: вы выкатываете новую фичу, а бэкендер спрашивает вас: «Слушай, а почему вместо событий — пустой объект?». Вы в шоке: «Как так — пустой объект? У меня же TypeScript, всё типизировано, такого не могло быть!». Спойлер — могло. 

Меня зовут Денис Платонов, я старший разработчик интерфейсов в Телемосте и я отвечаю за on-premise развёртывание веб-клиента Телемоста в инфраструктуре заказчика. В этой статье я расскажу о том, как безобидный на первый взгляд Omit превратил наш аккуратный тип событий в пустой объект. Заодно разберём, как работает дистрибутивность типов в TypeScript и поделимся, чему нас научил этот кейс.

Читать далее

Безопасность, инструменты разработчика и проекты с ИИ — популярные решения в Базе знаний Инфостарт

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

В новой подборке - пять практических материалов для разработчиков и специалистов по 1С. Разбираем безопасность хранения паролей СУБД, исправление проблем с DPI в конфигураторе, инструменты для точной вёрстки печатных форм и удобной работы со скриншотами.

А ещё - история создания pet-проекта «Домашний помощник»: от идеи, предложенной ИИ, до готовой подсистемы на 1С:Предприятие 8.5. Если интересны практические решения, небольшие инструменты и опыт их создания - выбирайте материал по теме и читайте.

Читать далее

Второй фактор, который жил в чужой странице: как я выбросил WebAuthn из своего сервиса ключей

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

Мы храним зашифрованные данные, и рядом с ними лежат ключи, которые к этим данным не подходят. Выглядит как расстройство для взломщика.

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

Читать далее

Три месяца с Claude: хороший ассистент, плохой программист

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

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

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

Узнать подробнее

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

Семантического поиска оказалось мало. Как я научил Obsidian находить похожие заметки

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

В прошлой статье я рассказывал, как добавил в Obsidian локальный семантический индекс. Сам проект развивается открыто, код лежит здесь:

GitHub: https://github.com/zinverno/obsidian-ai-hub

С тех пор semantic-слой заметно вырос. Появились автоматическая синхронизация индекса, Similar Notes и поиск потенциальных дублей. В какой-то момент стало понятно, что сам по себе семантический поиск решает только половину задачи.

Базовая схема у меня была такой:

Читать далее

Ни строчки руками: как я вайбкодил AI-мастера D&D и что показали два месяца открытой беты

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

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

Мне есть, что сказать...

Как совмещать работу и учёбу: кейс студентки онлайн-магистратуры ИТМО в партнёрстве с Яндексом

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

Привет, меня зовут Кристина Меликова, я учусь в онлайн-магистратуре ИТМО в партнёрстве с Яндексом на программе «Фронтенд и бэкенд-разработка» и работаю бэкенд-разработчиком в компании YADRO. До того, как пойти в сферу IT, я уже успела получить другое высшее образование, но решила переквалифицироваться. В статье расскажу, как проходит обучение в онлайн-магистратуре и как я совмещаю его с работой по специальности.

Читать далее

Деградация безопасности при итеративной генерации кода с помощью ИИ (краткое изложение исследования)

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

Что будет, если навайбкодить всякое, а потом внимательно посмотреть, что это мы натворили и насколько оно ужасно? Пора ли увольнять мясных программистов, или пора отменять подписку и нанимать мясных, чтобы они все исправили, пока не поздно?

Краткое изложение исследования с конференции IEEE-ISTAS 2025 о том, как LLMки пишут уязвимый код. Возможно вы замечали, что ИИ очень бодро начинает любой проект, быстро делает какой-то MVP, и даже код получается хороший, аккуратный, безопасный. Но через сколько-то шагов начинается кошмар. Вот внимательный разбор этого кошмара.

Открыть врата ужаса

Конфигурация в Python: эволюция подходов

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

Привет, я Николай Видов, тимлид команды чат-ботов в Т-Банке, восемь лет пишу на Python. 

Казалось бы, конфигурация — это просто .env и settings.py. Но стоит приложению вырасти — и начинается: секреты утекают в логи, port внезапно приходит строкой abc, настройки дублируются между окружениями. Я прошел путь от хардкода до типизированных схем и понял: конфигурация — это не мусорный код на скорую руку, а часть инфраструктуры, которую нужно проектировать так же тщательно, как бизнес-логику.

В статье — эволюция подходов к конфигурации в Python: откуда мы пришли, куда идем и какие грабли встречаем на пути. Разберу, как в Python-проектах обычно подходят к управлению конфигурацией. Сравнения конкретных библиотек не будет — сосредоточусь на самих подходах и границах их применимости.

Читать далее

Проверка субъекта на входе как часть AML

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

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

Читать далее

Утверждение «Код — это не самое сложное» оскорбляет всех программистов

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

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

В последнее время я часто слышу утверждения, которые сводятся к двум основным идеям: «LLM могут хорошо писать код, но программная часть никогда не являлась самой сложной» и «Программировать легко — сложно понять, что именно требуется напрограммировать».

Как по мне, так это явное оскорбление для всех программистов.

Читать далее