Показаны сообщения с ярлыком дизайн/проектирование. Показать все сообщения
Показаны сообщения с ярлыком дизайн/проектирование. Показать все сообщения

суббота, 23 мая 2020 г.

Отладка зависания: все потоки встали на WinHttpGetProxyForUrl

Это перевод Diagnosing a hang: Everybody stuck in WinHttpGetProxyForUrl. Автор: Реймонд Чен.

Клиент сообщил, что их программа рано или поздно полностью встаёт, а все её потоки (750 штук) зависают при вызове WinHttpGetProxyForUrl со следующим стеком вызова:
ntdll!ZwWaitForSingleObject+0x14
KERNELBASE!WaitForSingleObjectEx+0x8f
winhttp!OutProcGetProxyForUrl+0x160
winhttp!WinHttpGetProxyForUrl+0x349
contoso!submit_web_request+0x232
ntdll!TppWorkpExecuteCallback+0x35e
ntdll!TppWorkerThread+0x474
kernel32!BaseThreadInitThunk+0x14
ntdll!RtlUserThreadStart+0x21
(я упростил стек вызова для простоты объяснения)

воскресенье, 7 апреля 2019 г.

Почему деинсталятор моей программы пропадает из меню "Пуск"?

Это перевод Why does my app’s uninstaller disappear from the Start menu? Автор: Реймонд Чен.

Клиент сообщил, что его программа установки создает ярлык в меню "Пуск" с названием "Удалить Contoso Deluxe", но через несколько секунд после завершения установки значок "Удалить Contoso Deluxe" исчезает из меню "Пуск". Основной ярлык Contoso Deluxe всё ещё там. В чём дело?

пятница, 14 октября 2016 г.

Проблема танцующих кроликов

Это перевод Beware of the dancing bunnies. Автор: Ларри Остерман.

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

Я, конечно, извиняюсь, но это утверждение не умнее "Да, пожалуй, в мире найдётся спрос на целых 10 компьютеров", или "ни одной правильно написанной программе не потребуется больше 128 Кб оперативной памяти", или "ни один правильно спроектированный компьютер не нуждается в вентиляторе охлаждения".

Я объясню свою позицию в этом посте. Причина - в так называемой проблеме "танцующих кроликов".

четверг, 13 октября 2016 г.

Почему файлы программ размещаются в каталоге Program Files?

Это перевод Why do program files go into the Program Files directory? Автор: Реймонд Чен.

Некоторые из программ сертификации ПО от Microsoft (например, Windows Logo) требуют, чтобы приложения устанавливались бы в каталог Program Files по умолчанию. Зачем нужно это требование?

В Windows папка приложения - это его пакет

Это перевод In Windows, the directory is the application bundle. Автор: Реймонд Чен.

Комментатор Aaargh! спрашивает, почему бы Windows не "украсть" идею пакетов приложений (application bundle) у Apple и не распространять каждое приложение вместе со всеми библиотеками и необходимыми файлами.

четверг, 21 марта 2013 г.

Почему Проводник показывает сокращение KB вместо KiB?

Это перевод Why does Explorer use the term KB instead of KiB? Автор: Реймонд Чен.

Хотя International Electronic Commission (международная электротехническая комиссия) установила термин "kibibyte" ("кибибайт") для обозначения 1024 байт - с аббревиатурой KiB (КиБ), Проводник Windows продолжает использовать аббревиатуру KB (КБ). Почему Проводник не следует стандарту?

понедельник, 10 сентября 2012 г.

Как безопасно отправить SIGINT в главный поток?

Это перевод How can SIGINT be safely delivered on the main thread? Автор: Реймонд Чен.

Комментатор AnotherMatt интересуется, почему консольные программы Win32 получают уведомления в фоновом потоке. Почему бы не отправлять их в главный поток?

воскресенье, 3 июля 2011 г.

Решения, которые ничего не решают

Это перевод Solutions that don't actually solve anything. Автор: Реймонд Чен.

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

суббота, 2 июля 2011 г.

Тонкие способы, которыми ваша невинная программа может стать Интернет-ориентированной

Это перевод Subtle ways your innocent program can be Internet-facing. Автор: Реймонд Чен.

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

пятница, 1 июля 2011 г.

воскресенье, 5 июня 2011 г.

Опасайтесь всплывающих подсказок

Это перевод Beware the Balloon. Автор: Реймонд Чен.

Иногда лучше всего не кидаться за первой же возможностью. Нужно иметь терпение.

воскресенье, 29 мая 2011 г.

Основные негласные правила программирования: параметры функций

Это перевод Basic ground rules for programming - function parameters and how they are used. Автор: Реймонд Чен.

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

четверг, 12 мая 2011 г.

Изобретательность раздражающих людей

Это перевод The Resourcefulness of Annoying People. Автор: Реймонд Чен.

Сейчас Windows не так открыта, как была когда-то. В ранние, простые дни Windows была спроектирована в более доверительной манере. Были документированы внутренние форматы данных, а программы могли влиять на систему самым широким образом. Предполагалось, что разработчики программ будут использовать эту силу со всей ответственностью и для блага пользователя. В конце концов, если программа злоупотребляла доверием пользователя, то, как тогда считалось, компания бы быстро потеряла всех своих клиентов. У разработчиков, следовательно, был стимул относиться к пользоватю с уважением. Тогда было тогда.

Программное обеспечение значительно изменилось со временем. Теперь в Windows есть части пользовательского интерфейса, которые не могут управляться программно - даже с помощью политик. Это печально, но это так. И это тот урок, что достался нам тяжёлым путём.

суббота, 30 октября 2010 г.

19/97: Удобство - это не -илити

Это перевод Convenience Is not an -ility. Автор: Gregor Hohpe.

Из "97-ми вещей, которые должен знать каждый программист".

(прим.пер.: видимо, в заголовке имеются ввиду слова типа "юзабилити" и т.п.)

Много всего было сказано о важности и проблемах проектирования хорошего API. Сложно сделать всё верно с первого раза и ещё более сложно потом его изменить. Чем-то это похоже на воспитание детей. Большинство программистов выучили, что хороший API соответствует уровням абстракции, демонстрирует логичность и симметрию, а также формирует словарь выразительного языка. Увы, одно знание лишь о принципах не приводит к желаемому результату. К сладкому привыкать вредно.

понедельник, 13 сентября 2010 г.

12/97: Код - это дизайн

Это перевод Code Is Design. Автор: Ryan Brush.

Из "97-ми вещей, которые должен знать каждый программист".

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

воскресенье, 5 сентября 2010 г.

Должен ли я проверять параметры своих функций?

Это перевод Should I check the parameters to my function? Автор: Ларри Остерман.

У меня только что был интересный разговор с одним из тестеров в моей группе.

Он только что закончил отчёт о серии багов в наших компонентах, потому что они не проверяли, не передают ли им мусорные указатели. Вместо этого они просто возбуждали исключение $C0000005, и приложение вылетало (*).

Эти функции возвращали ошибку E_POINTER, если им передавали nil.

Но он считал, что они должны также проверять не-nil указатели на допустимость и также возвращать E_POINTER, если эти указатели не указывают на допустимую память.

суббота, 21 августа 2010 г.

11/97: Кодируйте на языке предметной области

Это перевод Code in the Language of the Domain. Автор: Dan North.

Из "97-ми вещей, которые должен знать каждый программист".

Представьте себе два исходных кода. В первом вы видите что-то подобное:
if (portfolioIdsByTraderId.get(trader.getId())
  .containsKey(portfolio.getId())) {...}
Вы чешете затылок, пытаясь догадаться, что может делать этот код. Выглядит как взятие ID из объекта trader и использование его для получения другого ID, после чего – поиск еще одного ID из объекта portfolio... Почесывание затылка почему-то не помогает. Вы ищете определение portfolioIdsByTraderId и находите следующее:
Map<int, Map<int, int>> portfolioIdsByTraderId;
Постепенно вы выясняете, что этот код делает что-то похожее на выяснение того, имеет ли трейдер доступ к портфелю акций. И конечно же, этот (или похожий на него) фрагмент кода будет повторяться везде, где будет требоваться выяснить, есть ли у трейдера доступ к портфелю.

А в другом исходном коде вы находите вот такую строчку:
if (trader.canView(portfolio)) {...}
И никакого почесывания затылка не требуется. Вам не нужно знать подробности, что у этой функции внутри. Вероятнее всего, там будет подобное приведенному выше фрагменту, но это уже дело trader, а не ваше.

А теперь скажите, с каким кодом вы бы предпочли работать?

вторник, 17 августа 2010 г.

7/97: Опасайтесь повторного использования кода

Это перевод Beware the Share. Автор: Udi Dahan.

Из "97-ми вещей, которые должен знать каждый программист".

Это было моим первым проектом в компании. Я только что закончил своё обучение и жаждал проявить себя, оставаясь поздно ночью, чтобы копаться в коде. Когда я работал с первой порученной мне возможностью, я уделил много внимания всему, что я научился: комментирование, логгинг, повторное использование кода и т.д. Проверки кода (code review), к которым я чувствовал себя так готовым, пришли как горькое разочарование - они ругались на моё повторное использование кода!

Как же так? В колледже повторное использование постоянно считалось воплощением качества разработки программного обеспечения. Все статьи, что я читал, учебники, опытные специалисты, которые учили меня. Они все ошибались?

Оказалось, что я упустил из виду критически важный компонент.

воскресенье, 1 августа 2010 г.

5/97: Красота заключается в простоте

Это перевод Beauty Is in Simplicity. Автор: Jørn Ølmheim.

Из "97-ми вещей, которые должен знать каждый программист".

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

воскресенье, 18 июля 2010 г.