Хорошо забытое старое

Это перевод книги The Old New Thing: Practical Development Throughout the Evolution of Windows Реймонда Чена.

Хвала The Old New Thing

«Реймонд Чен - оригинальный рассказчик о Windows».
— Скотт Хансельман, ComputerZen.com

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

«Очень интересно читать. Реймонд рассказывает о том, почему Windows такая, какая она есть».
- Эрик Ганнерсон, программный менеджер, корпорация Microsoft.

«Абсолютно необходимое чтение для понимания истории Windows, её сложностей и причуд, а также причин их возникновения».
- Мэтт Питрек, обозреватель «Под капотом» в журнале MSDN.

«Реймонд Чен стал чем-то вроде легенды в индустрии программного обеспечения, и в этой книге вы узнаете почему. The Old New Thing - это увлекательная коллекция анекдотов, от его воспоминаний о дизайне кнопки «Пуск» до обсуждений GlobalAlloc, которые могут понравиться только вашему внутреннему гику. Она поможет вам по-настоящему оценить сложность, присущую проектированию и написанию качественного программного обеспечения».
- Стефан Туб, технический редактор, журнал MSDN.

Содержание

  • Предисловие
  • Благодарности
  • Об авторе
  • Глава первая. Сначала - вторжение в пользовательский интерфейс
    Если вы спросите десять человек об их мыслях по дизайну пользовательского интерфейса - вы получите десять самопровозглашенных экспертных мнений. Разработка интерфейса для одного единственного пользователя даёт вам возможность просто спросить своего клиента, чего он хочет, и сделать именно это, но разработка интерфейса для большой аудитории вынуждает вас принимать трудные решения. Вот несколько историй на тему дизайна пользовательского интерфейса, начиная с, вероятно, наиболее часто задаваемого вопроса о пользовательском интерфейсе Windows 95.
  • Глава вторая. Избранные воспоминания о Windows 95
    Windows 95 была, пожалуй, самым ожидаемым программным обеспечением своей эпохи. На вечеринке по случаю десятой годовщины Windows 95 я случайно натолкнулся на одного из ведущих специалистов по маркетингу Windows 95, и мы вспомнили, как люди часами выстраивались в магазинах программного обеспечения, чтобы купить их копию в полночь. Когда Джей Лено (настоящая знаменитость!) организовал у себя мероприятие по случаю запуска, операционные системы превратились из скучного программного обеспечения, которое понимали только гики, в что-то массовое (что понимали только гики). И он завершил наш краткий разговор, сказав: «И мы никогда больше не увидим ничего подобного». Хотя вы, мой дорогой читатель, не смогли присоединиться к нам в нашей маленькой ностальгической беседе, вот несколько историй, которые вы можете использовать, чтобы притвориться, что вы там были.
  • Глава третья. Тайная жизнь GetWindowText
    Функция GetWindowText сложнее, чем вы думаете. Документация пытается объяснить её сложность краткими словами, что замечательно, если вы не понимаете длинные слова, но это также означает, что история целиком становится неясной. Вот попытка дать полную историю.
    • How windows manage their text
    • Enter GetWindowText
    • What if I don’t like these rules?
    • Can you give an example where this makes a difference?
    • Why are the rules for GetWindowText so weird?
  • Глава четвертая. Панель задач и область уведомлений
    Если наиболее заметным элементом пользовательского интерфейса Windows 95 является меню «Пуск», то вторым наиболее заметным элементом пользовательского интерфейса Windows 95, вероятно, является панель задач (taskbar). Чтобы добиться её простого и интуитивного дизайна, потребовалось немало усилий и экспериментов. После краткого обсуждения номенклатуры панели задач мы рассмотрим некоторые решения и логические обоснования, лежащие в основе её дизайна.
    • Why do some people call the taskbar the “tray”?
    • Why does the taskbar default to the bottom of the screen?
    • Why doesn’t the clock in the taskbar display seconds?
    • Why doesn’t the taskbar show an analog clock?
    • When I dock my taskbar vertically, why does the word “Start” disappear?
    • Why don’t notification icons get a message when the user clicks the “X” button?
  • Глава пятая. Загадки интерфейса
    Вот некоторые короткие ответы на простые вопросы о пользовательском интерфейсе Windows. За многими простыми вопросами лежат уроки для разработчиков программного обеспечения, потому что ситуации, которые приводят к этим вопросам, часто вызываются ошибками программирования или неоптимальным дизайном программы.
    • What are those little overlay icons?
    • Why are these unwanted files/folders opening when I log on?
    • What do the text label colors mean for files?
    • Why does my advanced options dialog say ON and OFF after every option?
    • What determines the order in which icons appear in the Alt+Tab list?
    • Why is the read-only property for folders so strange?
    • What’s with those blank taskbar buttons that go away when I click on them?
    • What is the difference between Minimize All and Show Desktop?
    • What does boldface on a menu mean?
    • Where do those customized Web site icons come from?
    • Where did my task manager tabs and buttons go?
    • Will dragging a file result in a move or a copy?
    • Why does the Links folder keep re-creating itself?
    • Why are documents printed out of order when you multiselect and choose Print?
    • Raymond spends the day doing product support
    • Blow the dust out of the connector
    • How much is that gigabyte in the window?
    • Why can’t I remove the “For test/evaluation purposes only” tag?
  • Глава шестая. История функции GlobalAlloc
    Функция GlobalAlloc когда-то была центральной для распределения памяти в Windows. Вся память приходила из GlobalAlloc, будь то код или данные, частные данные приложения или данные общего буфера обмена. В этой главе мы проследим историю этой функции (а также её близкого друга GlobalLock), начиная с того дня, когда она была королём кучи (heap), и заканчивая текущей позицией её увядшей славы в Win32. И, как вы увидите, многие странные требования, касающиеся использования памяти, выделенной в глобальной куче, относятся к тем дням, когда глобальная куча вела себя совершенно иначе, чем сегодня.
    • The early years
    • Selectors
    • Transitioning to Win32
    • A peek at the implementation
  • Глава седьмая. Краткие темы по программированию в Windows
    • The scratch program
    • Getting a custom right-click menu for the caption icon
    • What’s the difference between CreateMenu and CreatePopupMenu?
    • When does the window manager destroy menus automatically?
    • Painting only when your window is visible onscreen
    • Determining whether your window is covered
    • Using bitmap brushes for tiling effects
    • What is the DC brush good for?
    • Using ExtTextOut to draw solid rectangles
    • Using StretchBlt to draw solid rectangles
    • Displaying a string without those ugly boxes
    • Semaphores don’t have owners
    • An auto-reset event is just a stupid semaphore
  • Глава 8. Управление окнами
    • Why do I get spurious WM_MOUSEMOVE messages?
    • Why is there no WM_MOUSEENTER message?
    • The white flash
    • What is the hollow brush for?
    • What’s so special about the desktop window?
    • The correct order for disabling and enabling windows
    • A subtlety in restoring the previous window position
    • UI-modality versus code-modality
    • The WM_QUIT message and modality
    • The importance of setting the correct owner for modal UI
    • Interacting with a program that has gone modal
    • A timed MessageBox, the cheap version
    • The scratch window
    • The bonus window bytes at GWLP_USERDATA
    • A timed MessageBox, the better version
    • A timed context menu
    • Why does my window receive messages after it has been destroyed?
  • Глава девятая. Воспоминания об аппаратном обеспечении
      Hardware backward compatibility
    • The ghost CD-ROM drives
    • The Microsoft corporate network: 1.7 times worse than hell
    • When vendors insult themselves
    • Defrauding the WHQL driver certification process
    • A twenty-foot-long computer
    • The USB cart of death
    • New device detected: Boeing 747
    • There’s an awful lot of overclocking out there
  • Глава десятая. Внутренняя работа диспетчера диалогов
    • On the dialog procedure
    • The evolution of dialog templates
    • Why dialog templates, anyway?
    • How dialogs are created
    • The modal dialog loop
    • Nested dialogs and DS_CONTROL
    • Why do we need a dialog loop, anyway?
    • Why do dialog editors start assigning control IDs with 100?
    • What happens inside DefDlgProc?
    • Never leave focus on a disabled control
    • What happens inside IsDialogMessage?
    • Why is the X button disabled on my message box?
  • Глава одиннадцатая. Общие вопросы программного обеспечения
    • Why daylight saving time is nonintuitive
    • Why do timestamps change when I copy files to a floppy?
    • Don’t trust the return address
    • Writing a sort comparison function
    • You can read a contract from the other side
    • The battle between pragmatism and purity
    • Optimization is often counterintuitive
    • On a server, paging = death
    • Don’t save anything you can recalculate
    • Performance gains at the cost of other components
    • Performances consequences of polling
    • The poor man’s way of identifying memory leaks
    • A cache with a bad policy is another name for a memory leak
  • Глава двенадцатая. Копаемся в компиляторе Visual C++
    • Do you know when your destructors run?
    • The layout of a COM object
    • Adjustor thunks
    • Pointers to member functions are very strange animals
    • What is __purecall?
  • Глава тринадцатая. Обратная совместимость
    • Sometimes an app just wants to crash
    • When programs grovel into undocumented structures
    • Why not just block the applications that rely on undocumented behavior?
    • Why 16-bit DOS and Windows are still with us
    • What’s the deal with those reserved filenames such as NUL and CON?
    • Why is a drive letter permitted in front of UNC paths (sometimes)?
    • Do not underestimate the power of the game Deer Hunter
    • Sometimes the bug isn’t apparent until late in the game
    • The long and sad story of the Shell Folders key
    • The importance of error code backward compatibility
    • Sure, we do that
    • When programs patch the operating system and mess up
    • The compatibility constraints of even your internal bookkeeping
    • Why does Windows keep your BIOS clock on local time?
    • Bad version number checks
    • The ways people mess up IUnknown::QueryInterface
    • When programs assume that the system will never change, Episode 1
    • When programs assume that the system will never change, Episode 2
    • The decoy Display Control Panel
    • The decoy visual style
  • Глава четырнадцатая. Этимология и история
    • What do the letters W and L stand for in WPARAM and LPARAM?
    • Why was nine the maximum number of monitors in Windows 98?
    • Why is a registry file called a hive?
    • The management of memory for resources in 16-bit Windows
    • What is the difference between HINSTANCE and HMODULE?
    • What was the purpose of the hPrevInstance parameter to WinMain?
    • Why is the GlobalWire function called GlobalWire?
    • What was the difference between LocalAlloc and GlobalAlloc?
    • What was the point of the GMEM_SHARE flag?
    • Why do I sometimes see redundant casts before casting to LPARAM?
    • Why do the names of the registry functions randomly end in Ex?
    • What’s the difference between SHGetMalloc, SHAlloc, CoGetMalloc, and CoTaskMemAlloc?
    • Why is Windows Error Reporting nicknamed Dr. Watson?
    • What happened to DirectX 4?
    • Why are HANDLE return values so inconsistent?
    • Why do text files end in Ctrl+Z?
    • Why is the line terminator CR+LF?
    • TEXT vs. _TEXT vs. _T, and UNICODE vs. _UNICODE
    • Why are dialog boxes initially created hidden?
    • When you change the insides, nobody notices
    • If FlushInstructionCache doesn’t do anything, why do you have to call it?
    • If InitCommonControls doesn’t do anything, why do you have to call it?
    • Why did InterlockedIncrement/Decrement only return the sign of the result?
    • Why does the function WSASetLastError exist?
    • Why are there broadcast-based mechanisms in Windows?
    • Where did windows minimize to before the taskbar was invented?
    • Why didn’t the desktop window shrink to exclude the taskbar?
    • Why does the caret stop blinking when I tap the Alt key?
    • What is the deal with the ES_OEMCONVERT flag?
    • The story behind file system tunneling
    • Why do NTFS and Explorer disagree on filename sorting?
    • The Date/Time Control Panel is not a calendar
    • How did Windows 95 rebase DLLs?
    • What are SYSTEM_FONT and DEFAULT_GUI_FONT?
    • Why do up-down controls have the arrows backward?
    • A ticket to the Windows 95 launch
  • Глава пятнадцатая. Как доставляются и извлекаются оконные сообщения
    • Sent and posted messages
    • The life of a sent message
    • The life of a posted message
    • Generated posted messages
    • When does SendMessageCallback call you back?
    • What happens in SendMessageTimeout when a message times out?
    • Applying what you’ve learned to some message processing myths
    • How can you tell who sent or posted you a message?
    • You can’t simulate keyboard input with PostMessage
  • Глава шестнадцатая. Программирование для международного уровня
    • Case mapping on Unicode is hard
    • An anecdote about improper case mapping
    • Why you can’t rotate text
    • What are these directories called 0409 and 1033?
    • Keep your eye on the code page
    • Why is the default 8-bit codepage called “ANSI”?
    • Why is the default console codepage called “OEM”?
    • Why is the OEM code page often called ANSI?
    • Logical but perhaps surprising consequences of converting between Unicode and ANSI
  • Глава семнадцатая. Безопасность
    • World-writable files
    • Hiding files from Explorer
    • Stealing passwords
    • Silent install of uncertified drivers
    • Your debugging code can be a security hole
    • Why shared sections are a security hole
    • Internet Explorer’s Enhanced Security Configuration doesn’t trust the intranet
  • Глава восемнадцатая. Windows 2000 и Windows XP
    • Why doesn’t the new Start menu use Intellimenus in the All Programs list?
    • Why is there no programmatic access to the Start menu pin list?
    • Why does Windows XP Service Pack 2 sometimes forget my CD autoplay settings?
    • The unsafe device removal dialog
    • Two brief reminiscences on the Windows XP Comments? button
    • Why does Explorer eject the CD after you finish burning it?
    • Why does Windows setup lay down a new boot sector?
    • Psychic debugging: Why your expensive four-processor machine is ignoring three of its processors
    • Psychic debugging: Why your CPU usage is hovering at 50%
    • What’s the deal with the DS_SHELLFONT flag?
    • Why does DS_SHELLFONT = DS_FIXEDSYS | DS_SETFONT?
    • What other effects does DS_SHELLFONT have on property sheet pages?
  • Глава девятнадцатая. Вопросы дизайна Win32
    • Why does Win32 fail a module load if an import could not be resolved?
    • Why are structure sizes checked strictly?
    • Why do I have to return this goofy value for WM_DEVICECHANGE?
    • The arms race between programs and users
    • Why can’t you trap TerminateProcess?
    • Why do some processes stay in Task Manager after they’ve been killed?
    • Understanding the consequences of WAIT_ABANDONED
    • Why can’t I put hyperlinks in notification icon balloon tips?
    • Why can’t I use the same tree item multiple times?
    • The kooky STRRET structure
    • Why can’t you set UTF-8 as your ANSI code page?
    • When should you use a sunken client area?
    • Why is there no all-encompassing superset version of Windows?
    • Why is it even possible to disable the desktop, anyway?
    • What are the window and menu nesting limits?
    • What’s the difference between HWND_TOP and HWND_TOPMOST?
  • Глава двадцатая. Налоги
    Управление питанием попадает в категорию, которую некоторые команды разработчиков называют "налогами". Это что-то такое, что вы делаете не потому, что это принесёт выгоду конкретно вам, а потому что это принесёт выгоду чему-то большему: общей экосистеме приложений.
  • Глава двадцать первая. Забавные глупости
    Жизнь, конечно, не вся состоит из серьёзных вещей. Вот некоторые из произошедших забавных глупостей.
  • Приложение A. Истории обратной совместимости
    Эти истории, подобные тем, что приведены в главе 13, не пытаются вас ничему научить. Это просто интересные маленькие истории. Часто рассказывать эти маленькие виньетки за обеденным столом было нашим последней хваткой за здравомыслие.
  • Приложение B. Как убедиться, что ваша программа не запустится на Windows 95

Предисловие

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

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

Писателя и комментатора Дэвида Седариса часто спрашивают, правдивы ли его рассказы. Он отвечает, что они «достаточно правдивы». Как и рассказы Дэвида Седариса, материал в этой книге также «достаточно правдив». Основное внимание уделяется общей картине, а не мелочам; обсуждение одной идеи, не отвлекаясь на занудные детали. Ключевые детали выделены, но несущественные из них оставлены в стороне, и потенциально интересные отступления могут быть опущены, если они не соответствуют теме.

Основная аудитория - опытные читатели, интересующиеся историей Windows. Около половины эссе не требуют знания программирования. Большинство оставшихся тем предполагают базовые знания в области проектирования и разработки программного обеспечения, хотя ничего особенно продвинутого там нет. Темы, связанные с программированием Windows, предполагают, что читатель знаком с программированием пользовательского интерфейса Win32 и COM.

Что вы получите из этой книги? Как отмечалось ранее, основная цель - донести философию и логическое обоснование того, что на первый взгляд может показаться иррациональным замыслом. Вы также поймете, что когда что-то не может быть сделано в Windows, на это есть уважительная причина; и вы получите представление о том, на какие экстремальные меры идёт Windows, чтобы сохранить обратную совместимость (и почему это важно). В конце концов, вы сможете рассказать забавные истории об истории Windows на коктейльных вечеринках (эмм... то есть на вечеринках, организованных другими гиками).

Большая часть материала в виде коротких эссе уже появилась в той или иной форме на веб-сайте автора: блоге The Old New Thing (http://blogs.msdn.com/oldnewthing/), но существенно дополнена новым материалом, чтобы лучше подходить для книжного формата.

Благодарности

Я хочу начать с благодарности Джоан Мюррей из Эддисон-Уэсли за веру в столь необычную книгу. Без её поддержки этот проект никогда бы не состоялся. Также оказали большую помощь и другие сотрудники Аддисон-Уэсли, в том числе Тиррелл Олбо, Пэтти Бойд, Кит Клайн, Курт Джонсон и Крис Зан. Бен Райан заслуживает похвалы за то, что в конце 1990-х годов он предложил мне написать книгу о Win32 (извините, что это заняло так много времени), и я обвиняю Брэда Абрамса в том, что он настойчиво велел мне запустить блог в 2003 году.

Дополнительное спасибо Бетси Аоки, Джеффу Дэвису, Генри Габриэльски, Джеффри Галиновский, Майклу Гриеру, Майк Гандерлой, Эрик Ганнерсон, Крис Гузак, Джонсон М. Харт, Фрэнсис Хогл, Алеш Холесек, Майкл Каплан, К.С. Лемсон, Шелли МакКинли, Рико Мариани, Джозеф Адриану Онею, Ларри Остерману, Мэтту Пиетреку, Джеффри Рихтеру, Майку Шмидту, Яну Шанахану, Джоэлю Спольски, Стивену Таубу и Эду Уоссу за их помощь на различных уровнях в течение всего этого проекта (умышленного или невольного). Наконец, я должен поблагодарить всех людей, которые посещают мой блог, который служит как названием, так и источником вдохновения для этой книги. Именно они убедили меня попробовать написать эту книгу.

Об авторе

Реймонд Чен (Raymond Chen) - программист в подразделении Windows в Microsoft. Его веб-сайт The Old New Thing посвящен истории Windows и программированию на Win32. Он также пишет колонку Windows Confidential для журнала TechNet.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку.

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

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