О Windows из первых рук: «Жаворонки» и «совы»

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

Реймонд Чен

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

На все компьютеры была разработана и установлена соответствующая программа. При запуске она запрашивала у сервера свою долю работы. После завершения вычислений результаты возвращались на сервер. По сути команда изобрела что-то похожее на проект Folding@home или SETI@home, которые появились лишь многие годы спустя.

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

Общими усилиями

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

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

time = GetTimeOfDay(); if (time < StopTime || time >= StartTime) { CrunchTheNumbers(); }

Иначе говоря, вычисления запускались, если текущее время было раньше времени завершения и после времени начала вычислений.

Члены исследовательской команды определили в качестве времени остановки вычислений 09:00, или 9 часов утра, когда они обычно приходили на работу утром, а в качестве времени начала — 17:00, или 5 часов пополудни, когда уходили с работы домой.

Члены команды разработчиков продукта также задали в качестве времени остановки вычислений 09:00, но в качестве начала вычислений задали 01:00, или час ночи, потому что часто задерживались допоздна на работе и не хотели, чтобы вычисления мешали им.

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

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

Неудачное пакетное задание

Мне вспомнилась эта история, когда я недавно оказался в аналогичной ситуации. У меня был пакетный файл, который запускал несколько инструментов для анализа данных. Были отчеты, при попытке выполнения которых пакетный файл иногда прекращал работу и возвращал сообщение типа: «Внутренняя ошибка, свяжитесь со службой поддержки».

Если же обратиться к службе поддержки, они обычно отвечали: «Не удается воспроизвести ошибку. Мы включили диагностику на сервере. Попытайтесь снова, и мы изучим файлы журнала». Но при следующем прогоне пакетного файла все выполнялось нормально.

В конце концов, удалось установить причину ошибки: пакетный файл пытался создать имя файл журнала, которое содержало бы дату и время создания. Для этого я использовал переменные среды %TIME% и %DATE%. Если файл запускался до 10 часов утра, значение времени начиналось с пробела и это приводило к ошибке.

Так как сотрудники отдела поддержки не приходили на работу раньше 10 утра, то попытки воспроизвести ошибку происходили не раньше 10:30, но тогда ошибка уже не воспроизводилась. Из-за того, что члены команды поддержки тратили на свою утреннюю чашку кофе лишние пару минут, им не удавалось воспроизвести и устранить ошибку.

Raymond Chen

Раймонд Чен(Raymond Chen)— его веб-сайт и одноименная книга «Old New Thing», вышедшая в издательстве Addison-Wesley в 2007 году, рассказывает об истории Windows, программировании с использованием интерфейса Win32 и воровстве компьютерных мышек.