Это перевод Automate Your Coding Standard. Автор: Filip van Laenen.
Из "97-ми вещей, которые должен знать каждый программист".
Наверняка это случалось и с вами. В начале проекта, у каждого есть много хороших намерений - называйте их "решения нового проекта". Зачастую, многие из этих решений записаны в документах. Те, которые говорят о коде, в конечном итоге фиксируются в стандарте кодирования проекта (оформление кода, но не только). На первой встрече ведущий разработчик озвучивает документ, и, в лучшем случае, все соглашаются, что они будут пытаться следовать ему. Однако, как только проект начинает разрабатываться, эти благие намерения отваливаются один за другим. Когда проект, наконец, готов, то итоговый код выглядит просто хаотически, и никто не знает, как же так получилось.
...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
суббота, 31 июля 2010 г.
пятница, 30 июля 2010 г.
Остановите это безумие: подпапки в Моих документах
Это перевод Stop the madness: Subdirectories of My Documents. Автор: Реймонд Чен.
Как дополнение к посту В чём разница между папками Мои документы и Application Data?, я хотел бы пожаловаться на все эти подпапки в Моих документах, который создают программы, потому что они думают, что это же так круто.
Как дополнение к посту В чём разница между папками Мои документы и Application Data?, я хотел бы пожаловаться на все эти подпапки в Моих документах, который создают программы, потому что они думают, что это же так круто.
четверг, 29 июля 2010 г.
В чём разница между папками Мои документы и Application Data?
Это перевод What's the difference between My Documents and Application Data? Автор: Реймонд Чен. Входит в книгу The Old New Thing.
Самое важное отличие между папками Мои документы и Application Data в том, что в Моих документах хранят файлы пользователи, а в Application Data хранят данные программы.
Самое важное отличие между папками Мои документы и Application Data в том, что в Моих документах хранят файлы пользователи, а в Application Data хранят данные программы.
среда, 28 июля 2010 г.
Я надеюсь, что вы не использовали эти недокументированные поля критических секций
Это перевод I hope you weren't using those undocumented critical section fields. Автор: Реймонд Чен.
Я надеюсь, что вы не использовали эти недокументированные поля в записях критических секций, потому что в пакете обновления Service Pack 1 для Windows Server 2003 они изменились.
Я надеюсь, что вы не использовали эти недокументированные поля в записях критических секций, потому что в пакете обновления Service Pack 1 для Windows Server 2003 они изменились.
вторник, 27 июля 2010 г.
Зарезервированные поля
Это перевод Reserved fields. Автор: Mike Dodd.
Я набрёл на старый пост Реймонда Чена, почему вы не должны использовать зарезервированные поля во внутренних структурах Windows.
Я набрёл на старый пост Реймонда Чена, почему вы не должны использовать зарезервированные поля во внутренних структурах Windows.
понедельник, 26 июля 2010 г.
Отладка телепатией: понимание инициализации DDE
Это перевод Psychic debugging: Understanding DDE initiation. Автор: Реймонд Чен.
Вы тоже можете использовать свои телепатические способности, чтобы найти решение этой проблемы:
Вы тоже можете использовать свои телепатические способности, чтобы найти решение этой проблемы:
У нас есть проблема с открытием документов в нашем приложении по двойному щелчку в Проводнике. При этом мы видим странную вещь: если мы подключим отладчик к Проводнику и установим точку останова на kernel32!CreateProcessW, то, подождав чуток после завершения CreateProcess, и нажимая возобновление процесса - тогда документ открывается нормально. Но если мы не будем ждать, то документ не открывается. Вместо этого появляется сообщение об ошибке "Windows не может найти файл 'abc.lit'. Убедитесь, что вы набрали его имя правильно и попробуйте ещё раз". Вот команда, которую мы использовали, когда встретились с этой проблемой:Если вы внимательно читали объяснение как работает открытие документов через DDE, то вы уже знаете, в чём проблема.
"F:\Program Files\LitSoft\LitWare\LitWare.exe" /ddeЧто не так?
воскресенье, 25 июля 2010 г.
Пожалуйста, не стесняйтесь отказаться от использования DDE
Это перевод Please feel free to stop using DDE. Автор: Реймонд Чен.
Комментатор спросил: "как программист приложений Windows, могу ли я игнорировать DDE, если мне нужно будет общаться с Проводником/оболочкой?".
Ответ: "Да, умоляю вас, сделайте это!".
Комментатор спросил: "как программист приложений Windows, могу ли я игнорировать DDE, если мне нужно будет общаться с Проводником/оболочкой?".
Ответ: "Да, умоляю вас, сделайте это!".
суббота, 24 июля 2010 г.
А разве DDE у нас не асинхронно?
Это перевод Isn't DDE all asynchronous anyway? Автор: Реймонд Чен.
"А разве DDE не асинхронно?" спросил комментатор KaiArnold к этому посту.
Да, в основном асинхронно, но не полностью.
"А разве DDE не асинхронно?" спросил комментатор KaiArnold к этому посту.
Да, в основном асинхронно, но не полностью.
пятница, 23 июля 2010 г.
Почему установщик Windows не представляет собой просто распаковку образа диска и дампа реестра?
Это перевод Why isn't Windows Setup just a disk reimage plus a registry dump? Автор: Реймонд Чен.
Почему все ключи реестра, требуемые для Windows Setup, не могут быть предвычислены заранее и обработаны за один заход?
Почему все ключи реестра, требуемые для Windows Setup, не могут быть предвычислены заранее и обработаны за один заход?
четверг, 22 июля 2010 г.
Почему Microsoft в примерах кода использует ZeroMemory вместо { 0 }?
Это перевод Why do Microsoft code samples tend to use ZeroMemory instead of { 0 }? Автор: Реймонд Чен.
Если вы когда-либо читали MSDN, то вы могли заметить, что примеры кода в MSDN используют явный вызов функции ZeroMemory, вместо объявления переменной как занулённой, используя синтаксис "= { 0 }". Почему?
Если вы когда-либо читали MSDN, то вы могли заметить, что примеры кода в MSDN используют явный вызов функции ZeroMemory, вместо объявления переменной как занулённой, используя синтаксис "= { 0 }". Почему?
среда, 21 июля 2010 г.
Почему в Windows есть широковещательная рассылка?
Это перевод Why are there broadcast-based mechanisms in Windows? Автор: Реймонд Чен.
Многие механизмы получения информации в Windows основаны на широковещательной рассылке сообщений, среди них: DDE, WM_FONTCHANGE и смена настроек. Почему эти механизмы используют широковещательную рассылку, если мы знаем, что она может привести к заморозке системы из-за того, что какое-то окно не обрабатывает сообщения?
Многие механизмы получения информации в Windows основаны на широковещательной рассылке сообщений, среди них: DDE, WM_FONTCHANGE и смена настроек. Почему эти механизмы используют широковещательную рассылку, если мы знаем, что она может привести к заморозке системы из-за того, что какое-то окно не обрабатывает сообщения?
вторник, 20 июля 2010 г.
Почему я не могу получить пиксели окна, которое не видимо на экране?
Это перевод Why can't I get the pixels of a window that isn't visible on screen? Автор: Реймонд Чен.
Если окно не показано на экране, то эти пиксели просто не существуют.
Если окно не показано на экране, то эти пиксели просто не существуют.
понедельник, 19 июля 2010 г.
Почему функция CreateProcess делает автоисправление командной строки?
Это перевод Why does the CreateProcess function do autocorrection? Автор: Реймонд Чен.
Программы, которые не были созданы для обработки длинных имён файлов, могли делать ошибки в их обработке, типа взятия пути к исполняемому файлу и записи его в реестр, не думая что в нём могут быть пробелы, и что он нуждается в кавычках (пробелы, хотя технически совершенно легальны, были очень редки в коротких именах файлов). Функции CreateProcess нужно было решить, либо она делает автоисправление для этих кривых программ, либо эти программы перестают работать.
Программы, которые не были созданы для обработки длинных имён файлов, могли делать ошибки в их обработке, типа взятия пути к исполняемому файлу и записи его в реестр, не думая что в нём могут быть пробелы, и что он нуждается в кавычках (пробелы, хотя технически совершенно легальны, были очень редки в коротких именах файлов). Функции CreateProcess нужно было решить, либо она делает автоисправление для этих кривых программ, либо эти программы перестают работать.
воскресенье, 18 июля 2010 г.
Почему диалог Пуск/Выполнить исправляет введённую команду, а ключ реестра Run - нет?
Это перевод Why does the Run dialog autocorrect but not the Run key? Автор: Реймонд Чен.
В своём комментарии, Aswin Gunawan спросил, почему диалог Пуск/Выполнить выполняет автоисправление команды, а ключ реестра Run - нет? (перевод поста)
В своём комментарии, Aswin Gunawan спросил, почему диалог Пуск/Выполнить выполняет автоисправление команды, а ключ реестра Run - нет? (перевод поста)
суббота, 17 июля 2010 г.
Апплет Дата/Время не является календарём
Это перевод The Date/Time control panel is not a calendar. Автор: Реймонд Чен.
Хотя многие люди используют апплет Дата/Время Панели управления как календарик, перелистывая страницы с месяцами - это не то, для чего он предназначается. Фактически, если вы когда-либо использовали его подобным образом, вы могли создать хаос на своей машине!
Хотя многие люди используют апплет Дата/Время Панели управления как календарик, перелистывая страницы с месяцами - это не то, для чего он предназначается. Фактически, если вы когда-либо использовали его подобным образом, вы могли создать хаос на своей машине!
пятница, 16 июля 2010 г.
В чём разница между автозаполнением и историей в раскрывающемся списке?
Это перевод What's the difference between autocomplete and dropdown history? Автор: Реймонд Чен.
Первая показывает вещи, которые возможны, вторая показывает вещи, которые здесь были. Обе они пытаются помочь вам с вводом, но работают они по-разному (хотя выглядят смущающе одинаково).
Первая показывает вещи, которые возможны, вторая показывает вещи, которые здесь были. Обе они пытаются помочь вам с вводом, но работают они по-разному (хотя выглядят смущающе одинаково).
четверг, 15 июля 2010 г.
Почему NTFS и Проводник не придут к единому мнению по поводу сортировки имён файлов?
Это перевод Why do NTFS and Explorer disagree on filename sorting? Автор: Реймонд Чен.
Некоторые люди заметили, что NTFS автоматически сортирует имена файлов, но делает это способом, отличным от используемого Проводником. Почему?
Некоторые люди заметили, что NTFS автоматически сортирует имена файлов, но делает это способом, отличным от используемого Проводником. Почему?
среда, 14 июля 2010 г.
How [case-]insensitive (извиняюсь перед Френком Синатра)
Это перевод How [case-]insensitive (apologies to Frank Sinatra). Автор: Майкл Каплан.
В одном из моих предыдущих постов про регистр (Отстаньте от моего [нижнего] регистра! (или: регистр, часть первая) и [Верхний] регистр турецкой İ (или: регистр, часть вторая)) Tor Lillqvist заметил, что я сделал несколько подсказок к таблице регистра и NTFS. Он спросил:
В одном из моих предыдущих постов про регистр (Отстаньте от моего [нижнего] регистра! (или: регистр, часть первая) и [Верхний] регистр турецкой İ (или: регистр, часть вторая)) Tor Lillqvist заметил, что я сделал несколько подсказок к таблице регистра и NTFS. Он спросил:
Пост "Отстаньте от моего [нижнего] регистра" упоминает немного эту проблему, но с другой стороны, остаётся впечатление, что регистронезависимость NTFS обрабатывается кодом в ядре Windows.
Если я всё понял правильно, то, на самом деле, на каждом NTFS диске существует скрытый файл, называемый $UpCase. Этот файл содержит uppercase-маппинг для символов из BMP в их варианты верхнего регистра в *один символ* (поэтому немецкая ess-zet в имени файла не станет SS, и т.д.).
Этот файл создаётся, когда том форматируется и, я полагаю, никогда не модифицируется в дальнейшем, даже когда на диск ставится новая версия Windows? Было бы интересно узнать, как же формируется содержание этого файла, и как оно менялось в разных версиях системы, зависит ли маппинг от локали пользователя (или локали машины) во время форматирования и т.д. Я пробовал задавать этот вопрос на microsoft.public.win2000.file_system, но не получил ответа...
вторник, 13 июля 2010 г.
Что означает "лингвистическое изменение регистра"?
Это перевод What does "linguistic casing" mean? Автор: Майкл Каплан.
Функция LCMapString - центральная функция в Win32 API для изменения регистра символов в строке. Все прочие функции в USER32 (типа CharUpper, CharLower, CharUpperBuff и CharLowerBuff) являются просто оболочками, которые вызывают LCMapString с флагами LCMAP_UPPERCASE или LCMAP_LOWERCASE. Все они делают простой маппинг вроде a -> A -> a, å -> Å -> å и так далее.
Функция LCMapString - центральная функция в Win32 API для изменения регистра символов в строке. Все прочие функции в USER32 (типа CharUpper, CharLower, CharUpperBuff и CharLowerBuff) являются просто оболочками, которые вызывают LCMapString с флагами LCMAP_UPPERCASE или LCMAP_LOWERCASE. Все они делают простой маппинг вроде a -> A -> a, å -> Å -> å и так далее.
понедельник, 12 июля 2010 г.
Что там у нас с сортировкой чисел?
Это перевод What is up with number sorting? Автор: Майкл Каплан.
Сегодня утром Peter Ibbotson спросил меня:
Сегодня утром Peter Ibbotson спросил меня:
Возможно, вы сможете объяснить мне кое-что (я понимаю, что вы можете быть не подходящим человеком для этого вопроса, но вы кажетесь экспертом в сортировке). Когда ещё XP была в стадии бэты, я отправил отчёт о баге сортировке в Проводнике в такой папке:На этот вопрос я могу ответить :-)
C:\sorttest>dir /on /b X12.TXT X13.TXT X1A.TXT X1B.TXT XAB.TXTПроводник показывает эти же файлы в таком порядке (при сортировке по имени):
X1A.TXT X1B.TXT X12.TXT X13.TXT XAB.TXTЯ никогда не понимал, почему так происходит (и иногда это меня просто бесит). Ах да, я живу в UK, если это имеет значение.
воскресенье, 11 июля 2010 г.
Как работают ключи для сортировки?
Это перевод How do sort keys work? Автор: Майкл Каплан.
Ключ сортировки - это, фактически, массив байт. Его назначение - быстрое сравнение строк: если вы сравниваете значения двух ключей от строк - это будет всё равно как если бы вы сравнивали две строки. Ключи сортировки абстрагируют все данные, не относящиеся к делу (например, если вы указывали флаг NORM_IGNORECASE или CompareOptions.IgnoreCase), так что двоичные ключи для строк "AAAA", "AaAa" и "aaaa" будут одинаковыми. В общем, ключи сортировки являются отличной основой для индекса строк, вроде того, который используется в базах данных.
Но как они устроены, чтобы это работало?
Ключ сортировки - это, фактически, массив байт. Его назначение - быстрое сравнение строк: если вы сравниваете значения двух ключей от строк - это будет всё равно как если бы вы сравнивали две строки. Ключи сортировки абстрагируют все данные, не относящиеся к делу (например, если вы указывали флаг NORM_IGNORECASE или CompareOptions.IgnoreCase), так что двоичные ключи для строк "AAAA", "AaAa" и "aaaa" будут одинаковыми. В общем, ключи сортировки являются отличной основой для индекса строк, вроде того, который используется в базах данных.
Но как они устроены, чтобы это работало?
суббота, 10 июля 2010 г.
Путаница в сравнениях: INVARIANT против ORDINAL
Это перевод Comparison confusion: INVARIANT vs. ORDINAL. Автор: Майкл Каплан.
Существует большая путаница между значением этих двух различных вещей в .NET Framework (и когда что использовать). Если вы страдали, страдаете или вы думаете, что будете страдать от этого в будущем - то читайте дальше!
(В противном случае я думаю, что вы можете уйти и вернуться в другое время)
Существует большая путаница между значением этих двух различных вещей в .NET Framework (и когда что использовать). Если вы страдали, страдаете или вы думаете, что будете страдать от этого в будущем - то читайте дальше!
(В противном случае я думаю, что вы можете уйти и вернуться в другое время)
пятница, 9 июля 2010 г.
Where is the locale? "Its Invariant." In where?
Это перевод Where is the locale? "Its Invariant." In where? Автор: Майкл Каплан.
Старая шутка, адаптированная для Windows XP (прим. пер.: как и заголовок, я решил оставить без перевода, ибо при переводе полностью теряется смысл):
Q -- Where is the locale?
A -- Its invariant.
Q -- Where is variant?
A -- Its ten miles south of communicado, and five miles east of Cognito.
Старая шутка, адаптированная для Windows XP (прим. пер.: как и заголовок, я решил оставить без перевода, ибо при переводе полностью теряется смысл):
Q -- Where is the locale?
A -- Its invariant.
Q -- Where is variant?
A -- Its ten miles south of communicado, and five miles east of Cognito.
четверг, 8 июля 2010 г.
Простая задачка на безопасность и синхронизацию
Это перевод A quick puzzle about security and synchronization. Автор: Реймонд Чен.
Эта головоломка всплыла в одной из наших внутренних групп обсуждения.
Эта головоломка всплыла в одной из наших внутренних групп обсуждения.
среда, 7 июля 2010 г.
Хак №5: Доступ к private-полям
Это перевод Hack #5: Access to private fields. Автор: Hallvard Vassbotn.
Как вам говорила ваша мама, вам нужно защищать ваши личные данные и не трогать личные данные других людей. Это же применимо и в программировании. Инкапсуляция и скрытие информации - это два главных столпа в ООП, так что нам лучше бы не вмешиваться в это, точно? Точно. Но однажды при полной луне у меня возникла неодолимая жажда достучаться до private-полей другого класса (объявленного в другом модуле).
Как вам говорила ваша мама, вам нужно защищать ваши личные данные и не трогать личные данные других людей. Это же применимо и в программировании. Инкапсуляция и скрытие информации - это два главных столпа в ООП, так что нам лучше бы не вмешиваться в это, точно? Точно. Но однажды при полной луне у меня возникла неодолимая жажда достучаться до private-полей другого класса (объявленного в другом модуле).
вторник, 6 июля 2010 г.
Что такое хак? (и почему его не стоит использовать)
Это перевод What is a hack? Автор: Hallvard Vassbotn.
Прежде чем мы перейдём к рассмотрению ещё более грязных и опасных хаков, давайте сначала определим, что же такое "хак". IMO, программистский хак должен удовлетворять следующему критерию:
Прежде чем мы перейдём к рассмотрению ещё более грязных и опасных хаков, давайте сначала определим, что же такое "хак". IMO, программистский хак должен удовлетворять следующему критерию:
понедельник, 5 июля 2010 г.
Хак №4: Доступ к protected методам
Это перевод Hack #4: Access to protected methods. Автор: Hallvard Vassbotn.
Как мы видели ранее, возможно получить доступ для записи для свойства только для чтения, вернее, к его полю данных. Также вы можете повысить видимость protected-свойств до public или published, чтобы получить к ним доступ, но у нас нет соответствующего синтаксиса, чтобы сделать это для полей или методов. Часто вам бывает просто необходимо вызвать protected-метод какого-то класса - часто это метод в VCL-компоненте или сторонней библиотеке кода или компонентов. Часто это является признаком плохого (недостаточно гибкого) дизайна класса. Автор кода не подумал, что коду уровня приложения может потребоваться доступ к этому методу. Т.е. грубо говоря, у нас есть такой код:
Как мы видели ранее, возможно получить доступ для записи для свойства только для чтения, вернее, к его полю данных. Также вы можете повысить видимость protected-свойств до public или published, чтобы получить к ним доступ, но у нас нет соответствующего синтаксиса, чтобы сделать это для полей или методов. Часто вам бывает просто необходимо вызвать protected-метод какого-то класса - часто это метод в VCL-компоненте или сторонней библиотеке кода или компонентов. Часто это является признаком плохого (недостаточно гибкого) дизайна класса. Автор кода не подумал, что коду уровня приложения может потребоваться доступ к этому методу. Т.е. грубо говоря, у нас есть такой код:
unit Utility;
interface
type
TUtility = class
protected
procedure Useful;
public
constructor Create;
procedure Boring;
end;Мы хотим вызвать protected-метод Useful, но всё, к чему мы имеем доступ, - это public-метод Boring. Типичная ситуация, да? ;) воскресенье, 4 июля 2010 г.
Хак №2: Исправление номеров строк в System.pas после обновления D7.1
Это перевод Hack #2: Fixing System.pas line numbers after D7.1 update. Автор: Hallvard Vassbotn.
В newsgroups было обсуждение, что после установки обновления Delphi 7.1 возникает несоответствие между исправленным System.dcu и оригинальным исходником System.pas.
Проблема возникает, когда вы пытаетесь войти (step into) в код RTL из модуля System. К примеру, создайте новый консольный проект (File/New/Other/Console Application) и добавьте следующий высоко-технологичный код:
В newsgroups было обсуждение, что после установки обновления Delphi 7.1 возникает несоответствие между исправленным System.dcu и оригинальным исходником System.pas.
Проблема возникает, когда вы пытаетесь войти (step into) в код RTL из модуля System. К примеру, создайте новый консольный проект (File/New/Other/Console Application) и добавьте следующий высоко-технологичный код:
program Project1;
{$APPTYPE CONSOLE}
begin
Writeln('Look - no hands, ma!');
end.Теперь подключите модули RTL/VCL с отладочной информацией - включением Project/Options/Compiler/Use Debug DCUs. Установите курсор на строчку с Writeln и нажмите F4 для прогона программы до курсора (предполагая, что вы имеете стандартные настройки клавиатуры). Затем нажмите F7 для step into в код. Если у вас установлено обновление D7.1, то вы окажетесь в конце процедуры _LStrOfChar внутри System.pas. Другими словами, вы потерялись.суббота, 3 июля 2010 г.
Хак №1: запись в свойство только для чтения
Это перевод Hack #1: Write access to a read-only property. Автор: Hallvard Vassbotn.
Днём ранее у меня возникла задача сделать поведение нашего главного приложения лучше на различных системах с разным экранным разрешением (вернее, плотностью пикселей - пикселей на дюйм/pixels per inch). Это классическая "проблема больших шрифтов" и правильного масштабирования форм и диалогов для показа читабельного текста на любых конфигурациях. Вам нужно иметь ввиду несколько вещей, некоторые из которых описаны тут, но их гораздо больше, например, MDI-окна, наследование форм и т.п.
Чтобы упростить тестирование (и, возможно, дать конечному пользователю возможность поменять умалчиваемое поведение масштабирования) я решил позволить текущей плотности экрана (определяется Screen.PixelsPerInch) контролироваться из реестра. Встроенное в Delphi масштабирование форм работает достаточно хорошо и основывается на факте, что значение PixelsPerInch формы в режиме проектирования отлично от значения Screen.PixelsPerInch во время работы программы. Но свойство PixelsPerInch является свойством только для чтения, публичным свойством синглтона класса TScreen. Оно инициализируется в конструкторе TScreen числом пикселей на дюйм по вертикали:
Днём ранее у меня возникла задача сделать поведение нашего главного приложения лучше на различных системах с разным экранным разрешением (вернее, плотностью пикселей - пикселей на дюйм/pixels per inch). Это классическая "проблема больших шрифтов" и правильного масштабирования форм и диалогов для показа читабельного текста на любых конфигурациях. Вам нужно иметь ввиду несколько вещей, некоторые из которых описаны тут, но их гораздо больше, например, MDI-окна, наследование форм и т.п.
Чтобы упростить тестирование (и, возможно, дать конечному пользователю возможность поменять умалчиваемое поведение масштабирования) я решил позволить текущей плотности экрана (определяется Screen.PixelsPerInch) контролироваться из реестра. Встроенное в Delphi масштабирование форм работает достаточно хорошо и основывается на факте, что значение PixelsPerInch формы в режиме проектирования отлично от значения Screen.PixelsPerInch во время работы программы. Но свойство PixelsPerInch является свойством только для чтения, публичным свойством синглтона класса TScreen. Оно инициализируется в конструкторе TScreen числом пикселей на дюйм по вертикали:
DC := GetDC(0); FPixelsPerInch := GetDeviceCaps(DC, LOGPIXELSY);Поэтому, для моих целей тестирования я хотел бы устанавливать значение свойства PixelsPerInch без замут с настройками системы, но чтобы это сделать, мне нужно как-то изменить значение свойства только для чтения. Невозможно, да?
пятница, 2 июля 2010 г.
3/97: Спросите "А что бы сделал пользователь?" (подсказка: вы - не пользователь)
Это перевод Ask "What Would the User Do?" (You Are not the User). Автор: Giles Colborne.
Из "97-ми вещей, которые должен знать каждый программист".
Все мы склонны предполагать, что другие люди думают примерно как и мы сами. Но, на самом деле, это не так. Психологи называют это эффектом ложного консенсуса. Когда люди думают или действуют не так, как мы, то мы будем (подсознательно) думать о них как о дефектных в каком-либо смысле.
Из "97-ми вещей, которые должен знать каждый программист".
Все мы склонны предполагать, что другие люди думают примерно как и мы сами. Но, на самом деле, это не так. Психологи называют это эффектом ложного консенсуса. Когда люди думают или действуют не так, как мы, то мы будем (подсознательно) думать о них как о дефектных в каком-либо смысле.
четверг, 1 июля 2010 г.
В чём разница между "Изъять из меню Пуск" и "Удалить из этого списка"?
Это перевод What is the difference between "Unpin from Start menu" and "Remove from this list"?. Автор: Реймонд Чен.
Щёлкнув правой кнопкой по программе в списке программ меню Пуск, вы можете увидеть два пункта: "Изъять из меню Пуск" и "Удалить из этого списка". В чём их различие?
Щёлкнув правой кнопкой по программе в списке программ меню Пуск, вы можете увидеть два пункта: "Изъять из меню Пуск" и "Удалить из этого списка". В чём их различие?
Подписаться на:
Сообщения (Atom)