Как стать автором
Обновить
990.09

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

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

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

Переключение контекста — главный убийца продуктивности разработчика

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

Новый перевод от команды Spring АйО расскажет вам о том, почему так вредно отвлекать разработчиков от их работы и как избежать большого убытка для компании из-за прерывания рабочего процесса сотрудников.

Читать далее

Компактные структуры данных

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

Введение


Несколько месяцев назад в поисках идей по ускорению кода я изучал множество научных статей по computer science. Не буду притворяться, что хорошо их понимал, но меня не пугает непонятное, и я готов признать своё невежество1. Я обнаружил статью, написанную пятнадцать лет назад2, в которой было множество новых для меня концепций. Мне никак не удавалось в них разобраться.

Что же делать дальше? Можно искать другие статьи, чтобы они заполнили мои пробелы. Это рискованное предприятие, потому что они могут запутать ещё больше, но избежать этого нельзя. Я нашёл статью с нужной структурой данных, в которой упоминался исходный код с веб-сайта. Код был написан на C++, а я работаю на Rust, но решил, что всё равно стоит на него взглянуть. Однако зайдя на сайт, я не обнаружил там ресурс, поэтому я написал владельцу веб-сайта, который оказался преподавателем computer science.

Этот преподаватель (Гонсало Наварро) очень тепло меня принял и сразу же ответил мне3 4. И только в процессе общения с ним я осознал, что видел его фамилию на множестве статей в этой области. Оказалось, я познакомился с одним из специалистов мирового уровня в области компактных структур данных (succinct data structure). Невежество может завести очень далеко.

Что же такое компактные структуры данных? Если вы изучали в последние десятилетия computer science, то могли сталкиваться с ними, но мне не доводилось встречаться с ними в процессе работы программистом, а если и доводилось, то я сразу же о них забыл. Но я считаю, что эти структуры данных обладают потрясающими свойствами.

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

Я решил, что стоит немного о них рассказать.
Читать дальше →

Как malloc() и free() управляют памятью в C

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

Привет, Хабр!

Сегодня рассмотрим, почему free() не всегда освобождает память, как работает malloc(), когда glibc действительно возвращает память в ОС, и как избежать фрагментации хипа. А так же напишем кастомный аллокатор.

Читать далее

За что безопасники будут гореть в аду?

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

Для привлечения внимания расскажу историю. Уже много лет живу далеко за пределами нашей всеми любимой родины. И на днях, понадобилось мне войти в старую почту gmail... Логин и пароль надежно сохранены. Однако Google не торопится впускать нас в собственную почту.
— Нам кажется что это не вы, подтвердите что это вы. Введите номер телефона когда-то использовавшийся при регистрации.
Что ж, и это можно. Ввожу номер.
— Увы, мы не можем отправить СМС на этот номер. Хотите завести другой аккаунт?

И еще пара историй...

Пишем свой загрузчик операционной системы Linux

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


Меня давно интересовал вопрос, насколько сложно написать собственный загрузчик операционной системы. Я не говорю о простой программе, выводящей «Hello, World!», а о полноценном загрузчике, который передаёт управление от встроенного программного обеспечения компьютера ядру операционной системы. Современные загрузчики представляют собой сложные программы, способные загружать множество операционных систем различными способами, учитывая массу нюансов, связанных с программным и аппаратным обеспечением. Читая их исходный код, легко утонуть в деталях и потерять понимание сути и реализации.


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

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

Вам не нужна Чистая архитектура. Скорее всего

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

Сейчас среди Java/Kotlin команд распространено применение Чистой (ака Гексагональной, ака Луковой — Clean, Hexagonal, Onion) архитектуры для разработки бакэндов прикладных приложений (да и Android‑приложений тоже). Однако это семейство архитектур в контексте прикладной разработки зачастую не даёт никаких преимуществ, а только привносит лишние церемонии и тем самым замедляет её.

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

Но перед тем как перейти к Чистой архитектуре, сначала надо разобрать принцип инверсии зависимостей (Dependency Inversion Principle, DIP).

Читать далее

Ультимативные крестики-нолики и iPXE

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

Привет, Хабр! Меня зовут Вова, я разработчик в Selectel. На днях меня осенило: загрузка сервера по сети — это прекрасный инструмент, из которого можно сделать что-нибудь необычное. Например, игру. У нас есть минимальный набор: командный интерпретатор, возможность скачивать и выполнять произвольный код.

Ранее я уже использовал инструменты не по назначению, когда создавал Морской бой на SQL, тетрис в QR-коде, крестики-нолики в DNS и Gravity Defied на sed. С прошлой «серии» ненормального программирования прошло почти два года — время вновь попробовать силы и придумать что-нибудь новое.
Читать дальше →

Наш архитектурный подход к Python приложениям

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

Мы долгие годы писали сервисы исходя из каких-то своих внутренних ощущений правильности их написания. Но синхронизироваться по хорошим практикам в разных командах бывает довольно сложно и часто хорошие практики не выходили за рамки одной команды, а такого хотелось бы избежать. Поэтому мы решили объединить все хорошие по нашему мнению практики в единый справочник. Этот справочник получил название «Архитектурный гайд». Про него и поговорим в данной статье.

Читать далее

Алгоритмы манипуляций с битами

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

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

Читать далее

Искусство НЕпрохождения собесов в IT

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

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

И начнем. Почему тебе стоит начать проходить собеседования ПРЯМО сейчас?

1) Собеседования - это не просто навык. Это Random. Считайте что это roguelike где вы встречаете разных боссов. Боссы как правило встречаются на технических интервью. Сначала вам конечно нужно пройти "привратников" - HR. Их задача просто проверить что вы не долбоящер человек лёгкого поведения который просто хочет потратить чьё то время впустую или просто анализирует рынок. В самом страшном случае они могут ретранслировать вам пару простых вопрос от команд которые если вы не полный банан в этой теме — то пройдете.

Читать далее

ООП: худшее, что случалось с программированием

Уровень сложностиСложный
Время на прочтение20 мин
Количество просмотров106K

В этой статье попробуем разобраться, почему ООП — худшее, что было придумано в программировании, как оно стало таким популярным, почему опытные программисты Java (C#, C++ и т.п.) в принципе не могут считаться крутыми инженерами, а код на Java - хорошим.

Читать далее

«Чем ближе к вокзалу, тем хуже кебаб?»: «исследование»

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

Во французском сабреддите я наткнулся на пост с интересной гипотезой:

Чем ближе точка к вокзалу, тем хуже там кебаб.

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

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

Читать далее

Стиральная машина позволила мне иначе взглянуть на сроки разработки ПО

Уровень сложностиСредний
Время на прочтение5 мин
Количество просмотров32K
Моя недавняя эпопея со стиральной машиной напомнила мне, почему одна из самых страшных и ненавидимых задач в разработке ПО начинается с вопроса:

«Сколько времени вам на это потребуется?»

Привычность этого бытового прибора внушила мне ложное чувство безопасности
Читать дальше →

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

Код, который вы не поймете. Подборка вымерших языков программирования

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

Натыкаясь на очередную подборку в духе «Какой язык программирования учить в 2025 году», я вижу каждый раз плюс-минус одни и те же тезисы. Обычно они сводятся к рассуждениям о количестве открытых вакансий, зарплатной вилке или библиотеках и фреймворках, которые обещают изменить вообще все. Python, JavaScript или C++ живее всех живых, и в ближайшие годы им вряд ли что-то грозит. Но ведь не все языки программирования оказались столь успешными. В этой статье я предлагаю вспомнить те из них, которые либо не дожили до современности, либо остались в полузачаточном состоянии. Я постараюсь не просто перечислить мертвые языки, но и описать их идеи, ошибки и причины, по которым они исчезли из истории программирования через короткое время после рождения.
Читать дальше →

Парсер JSON в 500 строках Rust

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

За время прошлого семестра в универе я прошёл курс «Инструменты и компиляторы на основе синтаксиса». В рамках курса мы создавали сканер, парсер, компилятор и прочие инструменты для языка Plo. Писали мы их на Python, но тогда меня серьёзно заинтересовал Rust.

В итоге я решил заняться очередным хобби-проектом, и на сей раз создать парсер JSON на Rust. Мне хотелось проверить полученные на курсе навыки и, наконец-то, реализовать проект на этом языке, что я откладывал уже не один год.
Читать дальше →

Как я создал полностью автоматизированное онлайн радио с AI ведущими и музыкой

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

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

Это моя небольшая история, как я за месяц написал карманное медиа с полной автоматизацией, где роботы-ведущие заменили кожаных мешков и ведут подкасты, в которых шутят про AI

Читать далее

Очумелые ручки: как я превратил старый смартфон в игровую консоль с возможностью звонить

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

Осторожно: эта статья точно будет хабратортной, ведь в ней мы смоделируем, спроектируем и запрограммируем своё видение N-Gage 2! Я очень старался сделать статью интересной даже для тех читателей, кто не разбирается в теме 3D-печати и программирования микроконтроллеров :-)

Я очень люблю ретро-игры и игровые консоли. Иногда я люблю позалипать в какую-нибудь классику с NES, Sega Mega Drive или, например, PSP. Однако особое место в моём сердечке занимает игровой телефон Nokia N-Gage, который, к сожалению, не получил продолжения, как и его более современный собрат — Sony Ericsson Xperia Play. Недавно я пересматривал свою коллекцию девайсов и обнаружил на полочке Galaxy S4 Mini. И тут я подумал: а что если...

Читать далее

Нет, ваша генеративная модель меня не заменит

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

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

Как я нашёл эти проблемы? Можно назвать это необъяснимой, основанной на опыте интуицией, шестым чувством нёрда; у меня просто возникло ощущение, что с системой что-то не так. За свои двадцать с лишним лет опыта я видел множество приложений и знал, что где-то в этой системе есть узкое место.

Я создал тестовый сценарий, чтобы точно замерить пропускную способность системы от времени, запустил инстанс VisualVM и прошерстил десятки потоков, трассировок стеков, снэпшотов памяти и CPU. Я обнаружил проблемы, написал их исправления и запустил всё заново. Бум! Производительность возросла в десять с лишним раз. Мой начальник и коллеги были счастливы, а продуктивность повысилась. Меня похвалили, и я ощутил отдачу от выполненного долга.

Но стоит помнить, что, строго говоря, это не были баги. Успешно проходили все юнит-тесты и интеграционные тесты, тесты BDD, линтеры, статический анализ кода и было выполнено несколько раундов проверок кода. Проблемы заключались в двух невинных строках кода (спрятанных среди тысяч других), казалось бы, не вызывавших никаких трудностей. Слава Богу, проблемы были найдены на этапе разработки и не затронули ни одной системы в продакшене (мои коллеги теперь могли выполнять свои тесты быстрее, поэтому скорость разработки сильно возросла).

Читать далее

Отладка приложения, которое не хочет, чтобы его отлаживали

Уровень сложностиСредний
Время на прочтение17 мин
Количество просмотров7.8K
Недавно я столкнулся с приложением, которое:

  1. Блокирует прикрепление к нему отладчиков.
  2. Выполняет преждевременный выход при попытках инъецирования кода.
  3. Приводит к вылету телефона целиком, если запустить её со включённым джейлбрейком (!).

По последнему пункту: кто вообще так делает???

Всё, что мы делаем (например, выполняем моддинг TikTok, чтобы он показывал только видео с котиками, или устраняем торможения в чужих приложениях), требует возможности исследования работы приложения.

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

Похоже, это приложение стало на удивление интересной комбинацией всего перечисленного.

Намного более сложной, чем можно было бы ожидать от обычного старого виджет-приложения.
Читать дальше →

C++26 — встреча ISO в Хагенберге

Уровень сложностиСредний
Время на прочтение8 мин
Количество просмотров21K
В середине февраля в Хагенберге состоялась встреча международного комитета по стандартизации языка программирования C++.



В этот раз прорабатывались следующие большие темы:
  • std::hive
  • Constexpr, ещё больше constexpr
  • Безопасность, контракты, hardening, профили, UB и std::launder
  • Relocate
  • #embed

Об этом и других новинках расскажу в посте

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