Все потоки
Поиск
Написать публикацию
Обновить
1086.46

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

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

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

5 вопросов тестировщика на собеседовании, или Красные флаги работодателя

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

Вы когда-нибудь оказывались в неловком положении на собеседовании, когда вас спрашивают: «Может, у вас есть к нам вопросы?» Это момент, которому не учат в университетах или на курсах по тестированию, но он может стать критическим развилкой на вашем профессиональном пути. Если вы только пробиваете себе дорогу в мире IT и это ваше второе или третье собеседование, то умение задать правильные вопросы может стать вашим личным компасом в определении, находитесь ли вы на пороге мечты или очередной галеры? На просторах Хабра можно найти множество статей на подобные темы, большая их часть сосредоточена на обсуждении таких аспектов, как зарплаты, отпуска, бонусы и так далее.

Меня зовут Влад я работаю в VK на позиции QA Engineer. Хочу поделиться своим топом вопросов для собеседования на позицию тестировщика, которые я собрал благодаря прохождению не одного десятка собеседований. Они помогут вам понять, с какой компанией вам предстоит иметь дело.

Читать далее

Калькулятор? Да его напишет кто угодно

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

[Прим. пер.: на Хабре уже был перевод этой статьи, но незавершённый примерно на четверть.]

Неправда.

Калькулятор должен показывать результат введённого математического выражения. А это намно-о-ого сложнее, чем кажется.

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

На изображении выше показан калькулятор из iOS.

Заметили что-нибудь?

Он посчитал неправильно.

(10100) + 1 − (10100) равно 1, а не 0.

Android считает правильно. А причина, по которой он это делает, абсолютно безумна.

Читать далее

Game++. run, thread, run…

Уровень сложностиПростой
Время на прочтение33 мин
Количество просмотров6.6K

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

В обычном программировании с блокировками, когда возникает необходимость пошарить данные, приходится использовать механизмы сериализации доступа к таким данным, чтобы операции, выполняющие работу с такими данными, были ограничены от одновременного вмешательства со стороны других потоков и возможности их поломать. В прямом смысле поломать. Даже такая простая операция, как ++count, где count имеет тип integer, требует блокировки, поскольку операция инкремента в общем случае представляет собой трехшаговую операцию (чтение, модификация, запись), которая не является атомарной. Про что-то более сложное и длительное я уже и не говорю.

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

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

Читать далее

Контрабанда данных внутри эмодзи

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

Меня заинтриговал комментарий GuB-42 на Hacker News:

При помощи последовательностей ZWJ (Zero Width Joiner) теоретически можно закодировать в один эмодзи неограниченный объём данных.

Действительно ли можно закодировать в один эмодзи произвольные данные?

tl;dr: да, однако я нашёл решение и без ZWJ. На самом деле, можно закодировать данные в любой символ Unicode. Например, в этом предложении есть скрытое послание: This sentence has a hidden message󠅟󠅘󠄐󠅝󠅩󠄜󠄐󠅩󠅟󠅥󠄐󠅖󠅟󠅥󠅞󠅔󠄐󠅤󠅘󠅕󠄐󠅘󠅙󠅔󠅔󠅕󠅞󠄐󠅝󠅕󠅣󠅣󠅑󠅗󠅕󠄐󠅙󠅞󠄐󠅤󠅘󠅕󠄐󠅤󠅕󠅨󠅤󠄑. (Попробуйте вставить его в декодер.)

Читать далее

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

Уровень сложностиСредний
Время на прочтение19 мин
Количество просмотров36K

В ноябре 2023 года, когда OpenAI добавила в ChatGPT возможность генерации изображений DALL-E 3 через веб-интерфейс ChatGPT, на короткое время возник мем: пользователи отправляли LLM базовое изображение и несколько раз просили «сделать его более X», где X могло быть чем угодно.
Примеры
Обычный парень становится всё более «бро».

Санта становится всё более «серьёзным».

Тренд быстро сошёл на нет, потому что все эти изображения были очень похожими и скучными; к тому же они необъяснимым образом все сводились к чему-то космическому, вне зависимости от исходного изображения и промта. Тем не менее, этот тренд достаточно любопытен с научной точки зрения тем, что столь бессмысленный и нечёткий промт каким-то образом влияет на конечное изображение, и что это изменение очевидно для пользователя.

А что будет, если я попробую похожий способ с кодом? Сгенерированный LLM код вряд ли будет мусорным (хоть это и возможно), поскольку он следует строгим правилам, и в отличие, например, от изображений, его качество можно измерить объективнее.

Если код в самом деле можно улучшить, просто при помощи интерактивного промтинга, попросив LLM «написать код получше» (хоть это и очень глупо), то это приведёт к огромному росту продуктивности. А если это так, то что произойдёт, если таких итераций с кодом будет слишком много? Каким станет эквивалент «космического» кода? Есть только один способ это выяснить!
Читать дальше →

Неубиваемый PHP: почему в 2025 году этот язык все еще остается одним из самых востребованных

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

Привет! На связи ITQuick — международная IT-компания, специализирующаяся на High-End разработке для среднего и крупного бизнеса. Мы создаем сложные архитектурные решения силами более 120 разработчиков уровня Senior и Senior+.

Сегодня мы поговорим с Альбертом Степанцевым @AlexLeonov — нашим тимлидом и партнером, опытным разработчиком с 20-летним стажем работы на PHP. За его плечами десятки успешных проектов: от небольших сайтов до масштабных корпоративных систем.

— Альберт, давай начнем с того, что уже более 20 лет в IT-сообществе ходит фраза «PHP скоро умрет». Как ты считаешь, почему этого до сих пор не произошло?

— Я помню, как еще в начале 2000-х мои коллеги уверяли, что PHP не переживет появление новых технологий. Тогда язык действительно был довольно примитивным. Но посмотри на цифры: по данным W3Techs на декабрь 2024 года, около 75% всех сайтов в мире работают на PHP. И это не случайно — я на собственном опыте убедился, почему ни Node.js, ни другие технологии не смогли занять его место.

— А с какими предубеждениями против PHP ты сталкиваешься чаще всего?

— Самые распространенные претензии: «Он слишком простой», «Подходит только для новичков» и «Нет серьезных проектов».

Читать далее

Сгенерировать 100 млн случайных строк менее чем за минуту

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

Зачастую в программисткой практике необходимо нагенерировать множество случайных строк. Либо для тестового примера, либо как источник обезличивания, либо просто, чтобы наполнить разработческую БД. Задача, в принципе, понятная и легкая для любого уровня программиста. Но если это нужно сделать быстро, например, если набор случайных строк нужен здесь и сейчас, то можно использовать предлагаемое решение. Строки получаются разной длины, со 100%-ной хаотичностью (полностью несортированные). Выглядят эти строки вот так (спойлер):

Читать далее

Не только Python и JavaScript: пять крутых языков программирования для изучения в 2025 году

Время на прочтение6 мин
Количество просмотров19K

Привет всем! Это Саша Пиманов, разработчик из МТС Диджитал. Сегодня хочу напомнить, что разработка — это не только Python, JavaScript, C++ или Java, и поговорить о не самых распространенных языках программирования. Некоторые из них предназначены для специфических задач, другие можно назвать улучшенной версией популярных языков программирования, а третьи созданы just for fun. Так что если вы как раз хотите изучить что-нибудь новое, забирайте пост в закладки. Поехали!

Читать далее

Смогу ли я уложить оптимизирующий компилятор в тысячу строк питона? Прогон первый: mem2reg

Уровень сложностиСредний
Время на прочтение22 мин
Количество просмотров4.5K

Год назад мне пришлось взять на себя курс лекций по теории компиляторов. Вы встречались некомпетентными преподавателями? Это я, здравствуйте! Прежде чем учить других, я всё-таки решил заглянуть в учебник сам, и это вылилось в серию статей "компилятор за выходные" (да, я помню, что за мной должок с описанием лексера/парсера). В итоге я уложил компилятор со мной придуманного си-подобного языка на GNU ассемблер в шестьсот строк кода, причём без внешних зависимостей, включая парсинг.

Всё бы хорошо, вроде работает, но кажется, самое веселье осталось за бортом. Мой компилятор, по факту, это простой pretty print вокруг синтаксического дерева, подумаешь. А как работают оптимизирующие компиляторы? И поставил я себе задачу попробовать уложить игрушечный, но всё же рабочий оптимизирующий компилятор в тысячу строк кода. Как думаете, получится?

Итак, тема сегодняшнего разговора - вынос переменных из памяти в регистры, оно же оптимизационный проход mem2reg, см. кпдв.

Читать далее

Пишем простой драйвер на Rust

Время на прочтение9 мин
Количество просмотров17K

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

В своей повседневной работе я по-прежнему придерживаюсь C++, так как основная её часть связана с низкоуровневым программированием систем и ядра, а из этого языка легко задействовать написанный на С Windows API и COM API.

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

Короче говоря, я решил попробовать написать простой и полезный драйвер WDM. Это будет Rust-версия драйвера «Booster», о котором я пишу в своей книге (Windows Kernel Programming), позволяющего изменять приоритет любого потока на любое значение.
Читать дальше →

Valhalla — эпичный рефакторинг Java. Часть 2: проблемы проекта и их решения

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

Команда Spring АйО перевела и адаптировала доклад Брайана Гоетца «Valhalla — эпичный рефакторинг Java», и сегодня мы публикуем вторую часть из трех. В первой части серии было рассказано об истории и причинах появления проекта Valhalla. Во второй части подробно разбирается вопрос о том, с какими фундаментальными сложности команда столкнулась на пути к решению поставленных задач.

Читать далее

Tuna — от аналога ngrok, к собственной платформе

Уровень сложностиПростой
Время на прочтение8 мин
Количество просмотров5.6K

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

Читать далее

PAL видеоадаптер на FPGA с буфером кадра

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

Наверное, каждый второй разработчик на ПЛИС в начале своего пути пытался визуализировать работу своих схем. Кто-то подключал TFT-дисплей, кто-то — VGA монитор. А у меня под рукой оказался только телевизор с композитным входом. Ну что ж, работаем с тем, что есть!

Читать далее

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

Избавляемся от UB в memcpy

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

Неопределённое поведение (undefined behavior, UB) в языке программирования C — постоянный источник жарких споров между программистами. С одной стороны, UB может быть важным для оптимизаций компилятора. С другой стороны, оно упрощает появление багов, которые приводят к проблемам безопасности.

Хорошая новость: N3322 был принят для C2y, что позволит устранить неопределённое поведение из этого конкретного участка языка C и сделать всё показанное ниже чётко определённым:

memcpy(NULL, NULL, 0);
memcmp(NULL, NULL, 0);
(int *)NULL + 0;
(int *)NULL - 0;
(int *)NULL - (int *)NULL;

Читать далее

Ни одна реализация элементарных функций не соответствует стандарту IEEE 754

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

Введённый в 1985 году стандарт IEEE-754 для чисел с плавающей запятой был предназначен для решения проблемы разнородности реализаций чисел с плавающей запятой, мешавших портируемости кода, а также для повышения стабильности между платформами.

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

Моя работа в течение последнего года заключалась в анализе погрешности различных математических функций, накопления этой погрешности и способов её уменьшения при помощи различных программных паттернов. Одной из исследованных мной тем были базовые математические функции, используемые в функциях активации нейронных сетей, а также способы их аппроксимации для повышения производительности. В процессе работы нам пришлось столкнуться с противодействием со стороны людей, активно стремящихся к корректной реализации математических функций и к соответствию их стандартам, в частности, к соблюдению обеспечения корректности одной наименее значимой единицы измерения (unit in last place, ULP) для элементарных функций.

Я был заинтересован в дальнейшей работе по аппроксимации этих функций, поэтому приступил к исследованию того, каким образом они гарантируют корректность, и если они корректны только на 1 ULP, то где располагаются ошибки в области определения функции.

В процессе изучения я обнаружил, что ни одна из популярных математических библиотек, используемых во множестве сфер вычислений, на самом деле не выполняет корректное округление в соответствии с требованиями любой версии IEEE 754 после первой редакции 1985 года.
Читать дальше →

Embox дает (RISC)-пять на платформе VOSTOK

Время на прочтение7 мин
Количество просмотров4.9K

Всем привет.

В данной статье, мы, как и обещали, расскажем о работе свободной ОС РВ Embox на микроконтроллере К1921ВГ015. Это микроконтроллер от компании АО «НИИЭТ», входящей в Группу компаний «Элемент».

К1921ВГ015 основан на архитектуре RISC‑V и имеет приличные ресурсы (1 Мб flash и 256 + 64 кБ RAM, развитую периферию). Это позволяет реализовывать на его основе богатую функциональность, необходимую для построения различного рода современных цифровых устройств.

Читать далее

Интерактивный тур по Go 1.24

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

Релиз Go 1.24 принесёт ряд важных обновлений, которые сделают разработку удобнее и эффективнее. В этом обзоре мы разберём ключевые изменения: поддержку слабых указателей, улучшенные финализаторы, новый механизм управления доступом к файловой системе, а также значительные оптимизации map, включая переход на Swiss Tables. Кроме того, появилось больше инструментов для тестирования и бенчмаркинга, новые криптографические возможности и усовершенствования работы с JSON.

Читать далее

Видишь суслика? А он есть! Как главная страница Яндекса переезжала на Go

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

Переезд большого сервиса с Perl на Golang едва ли кому-то покажется простой задачей. А теперь представьте, что это главная страница Яндекса, на которую ежедневно заходят миллионы пользователей. И что продукт постоянно дорабатывается, а значит, нельзя взять и остановить разработку на пару лет переезда. Представили? Сложно? А вот, оказывается, всё возможно. 

Привет, Хабр! Меня зовут Вячеслав Круглов. Я руковожу одной из команд разработки бэкенда главной страницы Яндекса. Расскажу, как мы переписывали бэкенд с Perl на Go, поделюсь интересными подробностями переезда, а также сравню компоненты и продуктовые блоки.

Читать далее

Msgspec vs DataClasses: битва инструментов в мире Python-сериализации

Время на прочтение6 мин
Количество просмотров3.2K

Хабрчане, привет! Это Леша Жиряков из МТС Диджитал. Недавно я писал про FastAPI vs Litestar и Polars vs Pandas, а сегодня разберем два популярных инструмента — Msgspec и DataClasses. Оба помогают структурировать данные, добавить энтерпрайзности в проект, но подходы у них разные. Какой из них быстрее и удобнее, где их лучше применять? Давайте разбираться.

Читать далее

Глубокое погружение в процедуру запуска JVM

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

Новый перевод от команды Spring АйО расскажет вам, что происходит при запуске самого простого приложения на Java, какие шаги выполняет JVM, сколько классов ей необходимо загрузить, чтобы просто написать «Hello World!» и как все это выглядит на уровне byte code.

Читать далее

Вклад авторов