вторник, 1 февраля 2011 г.

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

Это перевод Running old programs in a virtual machine doesn't necessarily create a good user experience. Автор: Реймонд Чен.

Многие люди предлагают решать проблемы с обратной совместимостью простым запуском старых программ в виртуальной машине. Но это решает только часть проблемы.

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

Поскольку виртуальная машина работает в своей собственной операционной системе, вы не можете легко обмениваться информацией через границы виртуальной машины. К примеру, предположим, что кто-то щёлкает по файлу .XYZ, а программа, отвественная за файлы .XYZ, должа работать в виртуальной машине.
  • Мы запускаем виртуальную машину.
  • Входим под учётной записью пользователя. Я только надеюсь, что она вообще будет на виртуальной машине. И, конечно же, пользователю придётся заново ввести его пароль.
  • Ждём пока система загрузится, как-то копируем в виртуальную машину файл, который открывает пользователь. Возможна ситуация, когда операция включает в себя несколько файлов и их всех нужно перенести, а зависимость от дополнительных файлом не всегда может быть очевидна (к примеру, ваш текстовый процессор может требовать ваш список исключений проверок грамматики).
  • Запускаем нужную программу, передавая ей имя скопированного файла в командной строке.
  • Программа появляется на панели задач виртуальной машины, а не главной панели задач. Alt+Tab превращается в полный хаос.
  • Когда пользователь закроет эту программу, файл нужно скопировать обратно на хост-систему. Удачи в разрешении конфликтов, если кто-то поменял файл в это время.
Возня с копированием файлов туда-сюда может быть исправлена подключением диска физической машины как сетевого в виртуальной машине. Но это будет работать только в сценарии с локальным файлом. Если пользователь щёлкает по файлу .XYZ на сетевом сервере, то вам нужно перемаппить этот сервер на виртуальную машину. Во всех случаях вам нужно беспокоиться о случае, когда буква диска или путь могут быть изменены из-за сопоставления.

И это только первая проблема. Пользователю естественно ожидать от приложения всех тех возможностей, которые он получает, запуская приложение на главной ОС. Вам нужно заставить работать перетаскивание (drag-and-drop) и копирование/вставку через границы виртуальной машины. Быть может, пользователь получил информацию по e-mail (и их e-mail программа запущена в главной ОС) и хочет вставить эту информацию в программу, работающую под виртуальной машиной. Настройки клавиатуры не синхронизированы; смена между английским и русским, нажатием Ctrl+Shift в главной ОС, не имеет эффекта на клавиатуру в виртуальной машине.

Изолирование приложения в виртуальной машине означает, что приложение не получает актуальной картины мира. Если программа создаёт иконку уведомления на панели задач, то эта иконка получается на панели задач виртуальной машины. Если программа пытается использовать DDE для взаимодействия с Internet Explorer - ей это не удасться, потому что Internet Explorer запущен под главной ОС. И горе программе, которая пытается сделать FindWindow + SendMessage для отправки сообщения окну в другой ОС.

Если программа использует OLE, чтобы работать с внедрённым в документ листом Excel, то вам нужно установить Excel на виртуальную машину, а когда вы активируете объект, то Excel запустится в виртуальной машине, а не в главной ОС. Что может быть очень запутанным, особенно если Excel запущен и в главной ОС - поскольку Excel допускает работу только одного экземпляра. Но у вас как-то получается два экземпляра - которые, к тому же, не могут говорить друг с другом. И запуск антивируса в виртуальной машине не сделает вашу главную машину безопасной.

Как уже заметили ранее, подход с виртуальной машиной не решает проблемы плагинов. Вы не можете запустить Internet Explorer в главной ОС и загрузить в него плагин, работающий в виртуальной машне. А поскольку есть бесчисленное множество способов, которыми программы на рабочем столе могут взаимодействовать друг с другом, вы можете думать о каждой программе просто как о плагине к Windows.

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

В Windows 95 мы даже пробовали подход с виртуальной машиной. Я и ещё один разработчик запустили Windows 3.1 в виртуальной машине поверх Windows 95. У нас был рабочий стол Windows 3.1 с менеджером программ (Program Manager), и там были все ваши старые программы (это не было полностью изолированной виртуальной машиной. Мы понаделали дырок в изоляции виртуальной машины, чтобы можно было проще обмениваться файлами). Менеджеры были заинтригованы этой возможностью, но в итоге полностью проголосовали против, потому что это приводило к ужасным впечатлениям пользователя (user experience). Ограничения были слишком серьёзными, а интеграция была далека от беспроблемной. Никому не нравилось работать с этим, а объяснить, как это работает, не техническому человеку было просто невозможно.

3 комментария:

  1. По ходу, в Windows 7 они всё-таки решили вернуться к решению с виртуальной машиной.

    ОтветитьУдалить
  2. It's all about compromises. В 64-х разрядной системе 16-ти разрядные приложение не работают в принципе. Слишком большая разница. Так что либо совсем ничего, либо хоть что-то.

    ОтветитьУдалить

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

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

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

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

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