войти зарегистрироваться

Я умный whois

индекс
0,00

The Old New Thing, или папа окон

Бывают книги, осилив которые наполовину, чувствуешь себя героем. А очень редко случается, что на середине книги жалеешь, что осталось так мало. Книга The Old New Thing — это тот самый редкий случай. Чем ближе было к концу, тем больше хотелось читать. Поэтому бонусные главы, которых нет на бумаге, но есть на сайте, пришлись кстати.

Это уже становится традицией, что блоги проходят литературную обработку и издаются в виде книги. Так и тут. Raymond Chen — автор одноимённого блога The Old New Thing, расположенного на сайте MSDN Blogs. Судя по всему, блог должен быть очень популярным.

Про автора и книгу я узнал из статей Джоеля Спольского («Джоэл о программировании», «Лучшие примеры разработки ПО»). Как я понял, Raymond Chen — это «папа» Windows, он «вылепил» её. И вряд ли можно найти кого-либо, кто знает больше о внутренностях системы.

Бывают такие знания, которые ниоткуда больше не получишь, кроме как от других. В книге очень много сведений такого рода. Прочитав её, гораздо сильнее начинаешь ценить, как много невидимого труда вложено в Windows, как тяжело было сделать так, чтобы пользователям было удобно. И не надо кидать в меня тухлые помидоры: последний Windows, с которым я имел дело, был 95-й. С того времени я работаю исключительно под Linux. Но это не значит, что надо поливать грязью альтернативную операционную систему. Даже если в ней есть косяки.

Ибо косяки, на самом-то деле, часто являются историческим наследием, оставленным для обратной совместимости. Например, специальные файлы типа CON и PRN. Изначально, оказывается, они были очень полезным хаком. Есть даже убеждающие объяснения тому, что меня всегда бесило: интерпретация часов BIOS'а как локального времени, а не GMT; перезапись загрузочного сектора при установке Windows.

Помимо объяснений, откуда взялись те или иные фичи, есть много просто забавных историй. Меня особенно повеселило, как после втыкания шнурка, система сказала: «Обнаружено новое устройство: Boeing 747».

Всё это идёт вперемежку с глубокотехническими главами. В них тоже раскрываются тонкости работы привычных вещей, например, диалоговых окон или диспетчера сообщений. Полезное чтение для всех GUI-программистов, причём не только под Windows. Для меня это первая книга, отвечающая на вопрос «почему это работает так», а не просто описывающяя, как сделать что-либо.

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

Я много слышал о том, что указатель на функцию нельзя класть в int, но не мог придумать, почему. Благодаря обсуждению внутренностей Visual C++, я теперь знаю: указатель на функцию-член класса может быть очень хитрым, он в int не поместится.

Порадовало использование инструментов не по назначению. Например, как нарисовать закрашенный прямоугольник? Использовать функцию Rectangle? Или, может, FillRect? Так вот, оказывается, что самой удобной и эффективной является функция ExtTextOut.

В обсуждении вопросов производительности меня впечатлили разборки с памятью. Были рассмотрены традиционные подходы, которые используются, когда кешировать надо, а думать лениво. Оказалось, что в таких случаях память под кеш расходуется очень неэффективно. Эксперимент показал, что используемая часть кеша составляет только 2%, а остальное потеряно! А небольшое изменение в алгоритме резко всё поменяло, и кеш стал использоваться более чем на 98%, часто близко к 100%. Получается, что кеш с плохим алгоритмом — это просто другое имя для утечки памяти.

Кстати, об утечках. Как понять, где она происходит, не используя специальных инструментов? Оказывается, есть удивительно простой и очень успешный способ. Берём дюжину адресов и делаем дамп памяти. С вероятностью близкой к 100%, там есть утекшие объекты. Остаётся только взглянуть на распечатку и найти часто повторяющийся шаблон. Это и есть утечка. Физики-практики рулят.

В бонусных главах рассказывается, на какие ухищрения пришлось идти разработчикам Windows для того, чтобы заставить работать под своей системой некоторый софт. Эти истории украсили бы WTF. Так что в следующий раз, прежде чем кричать “Windows must die”, подумайте, чьи именно кривые руки накосячили, и постарайтесь прочесть The Old New Thing.

Ссылки

комментарии (18)

  • Спасибо за наводку :)
    • Всегда пожалуйста! У меня на полке ещё много книжек, дойдёт очередь и до них.
  • Как то даже непривычно, когда Windows называют альтернативной ОС ;-)
    • все относительно :)
      • Ага. Так сложилось, что в моём окружении именно так, основная ОС — Linux.
  • Отличная рецензия! Спасибо.
    Вообще, в Windows (как и в любую другую ОС) вложено столько труда, что кричать "must die", осознавая это, просто невозможно. Уважайте чужой труд - и люди будут уважать ваш.
    • Вы правы мы начинаем больше уважать другого человека, когда попробуем поделать его работу...
    • Я достаточно много времени посвятил копанию в некоторых частях тех архивов, что распространялись в инете под назаниями "исходники винды". Должен заметить, что некоторые модули там заслуживают криков "must die", например реализация общих диалогов. С другой стороны, встречается и реально первоклассный код.
      Так что не всё так однозначно — я не согласен с утверждением, что некий продукт нужно уважать просто из-за вложения в него гигантских сил.
      • Код, заслуживающий криков "must die", есть в практически в любом проекте. "Альтернативные" оси - не исключение. И уважать надо не продукт, а (как я сказал выше) труд других людей.
        Продукт же надо либо использовать, либо нет. А если человек испытывает какие-либо чувства неважно к какому софту, это мне кажется как минимум странным.
      • Согласен, особенно код CreateProcess(). Такой сложный код никак не может просто стартовать процесс, он должен управлять атомной электростанцией — не меньше.
  • Чен — молодец, и объясняет хорошо, и слог хорош. Только вот загвоздка — читая блог, я часто понимал, что мне не близки его "исторические причины". И многое можно было сделать лучше отказавшись от совместимости со старыми версиями.
  • > Я много слышал о том, что указатель на функцию нельзя класть в int, но не мог придумать, почему.

    В C этого тоже лучше не делать. Когда-то Ваш код будет скомпилирован на платформе, где sizeof(int) < sizeof(void *). И это отнюдь не далёкое будущее: например, сейчас на x86_64 sizeof(int) = 4, sizeof(void *) = 8.
    • Опаньки, а я думал, что это предания старины глубокой, когда ещё был 086. Спасибо, буду иметь в виду.
  • Очень интересно, обязательно почитаю книгу.

    Позвольте указать на одну опечатку в статье. Правильно будет не "Boing", а "Boeing".
    • Ой ё... Да, конечно. Исправил. Спасибо.
  • > Как я понял, Raymond Chen — это «папа» Windows, он «вылепил» её.

    Ну вы блин даёте. Трудно зайти посмотреть кто это такой? Чен конечно давно работает в MS, но говорить что он «папа Windows» — по меньшей мере смешно…

    http://en.wikipedia.org/wiki/Raymond_Chen
    • Ну, посмотрел. И что не так? Человек угрохал часть жизни на создание windows, в чём-то определял её развитие.
Только авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста.