Сейчас в нашей последней версии Parallels Desktop 9 for Mac есть 75 новых функций. Из них 33 так или иначе связаны с интеграцией OS X и Windows. А в самых первых версиях продукта эти функции были попросту базовыми. Сегодня специально для Хабра пишем о том, что и как было придумано, чтобы Windows и Mac жили вместе долго и счастливо, зачем «внедрились» в «Проводник» и как обманули мышь.
Александр Гречишкин, руководитель Integration Team в Parallels
— С чего все началось?
А.Г.: Сначала нам нужно было воспользоваться теми технологиями, которые в то время уже были на рынке. Виртуализация и эмуляция существовали еще с 1990-ых годов, и даже были решения для работы с одними ОС на компьютерах под другими ОС. Поэтому задачи в первых версиях у нас были такие: во-первых, сделать технологии и базовые функции точно такими же, как в уже существующих решениях. Во-вторых, придумать что-то свое, оригинальное. «Своими» уникальными функциями стали режим Coherence (возможность видеть и работать с Windows-программами на Mac так, как будто это родные приложения OS X) и Shared applications (иконки программ Windows в панели приложений Dock).
Функция Coherence позволяет полностью скрыть сам Windows, оставив только само приложение. В простонародье этот режим называют «Не показывать десктоп Windows». Звучит очень просто, но чтобы реализовать эту возможность, нам потребовалась масса усилий. Это очень тяжелая технология, связанная со множеством программных проблем и необходимостью решать их нестандартными способами. Ее также сложно поддерживать. И, кстати, она до сих пор развивается.
Конечно, дальше — с каждой новой версией — нам приходилось придумывать и реализовывать все новые и новые вещи, аналогов которым не было. Но изначально половину базовой интеграции типа Mouse Synchronization, Shared folders, Copy-Paste, Drag&Drop, Time-синхронизации мы делали по аналогии с тем, что уже в каком-то виде было. Например, существовало достаточно много виртуализационных эмуляторов (под разные платформы) со своим набором функций. Выпускать новый продукт без этого набора было бы просто бессмысленно.
Конечно, мы могли бы создать эмулятор вообще без интеграции, что-то типа DOSbox (в котором интерграционных функций нет, зато он прекрасно запускает старые dosовские игрушки). Кстати, у нас до сих пор есть несколько пользователей, которые работают с Parallels Desktop по такому же принципу: запускают виртуальную машину, в ней работает Windows в окне, и больше им ничего не надо.
Но, понятное дело, путь развития подавляющего большинства программных продуктов – эволюционный: сначала надо сделать базовую функциональность, а потом ее постепенно расширять. Пользователя нужно замотивировать перейти на новую версию (особенно если она платная). И не только за счет увеличения скорости, поддержки новых технологий (например, нового Direct X), улучшенной стабильности и прочего, но и привлечь интересными и полезными фичами. В нашем случае такой кастомизацией — «тюнингом» продукта — очень часто выступает интеграция – сначала так было с Windows, а потом и с другими ОС.
— И на что ориентировались среди существовавших технологий?
А.Г.: Вообще идея была такая: реализовать виртуализационную технологию так, как это сделано у Apple. В 2005 году Стив Джобс заявил о планах Apple «прикончить» PowerPC на своих компьютерах и перейти на чипы Intel. В 2009 году появилась OS X 10.6 Snow Leopard, первая операционная система Apple, больше не поддерживающая PowerPC. Но, скорее всего, у них все началось еще десять с половиной лет назад, когда Apple начала составлять график модернизации своей Mac OS и план перехода на x86.
Им пришлось перейти с Mac OS 9, заточенной под старое железо, на Mac OS X, а для поддержки всех существующих программ написать свой эмулятор. Они сделали это достаточно эффективно, с высоким быстродействием, и, что важно, эта технология оказалась очень прозрачной и «незаметной» для пользователя. Пользователь кликает на программу, написанную под PowerPC, на своем компьютере, и открывается тот же Coherence, то же самое окно под эту программу. Единственное, что в ней уживаются не две разных операционных системы, а две Mac OS – старая и новая. В общем, очень похоже на нас.
К сожалению, в то время разработчики Parallels Desktop не знали о существовании в Mac OS X технологии Rosetta – динамического транслятора для запуска приложений под PowerPC на компьютерах с процессорами Intel. Мне пришлось даже принести им свой компьютер из дома, чтобы ее показать. Принес, показал – и разработчики признали в технологии наш Coherence, хотя и реализованный иначе: что-то между Wine и простым эмулятором. И в итоге у нас выкристаллизовалась идея сделать как у Apple в том отношении, чтобы пользователю не показывалось никаких загрузочных образов и виртуальных оболочек от Parallels Desktop. Например, чтобы сразу открывался Word, и при этом обычный пользователь даже не догадывался, что это приложение лежит не в папке Application, а где-то еще.
— Как разрабатывался Coherence?
А.Г.: Автором идеи был Сергей Белоусов (прим. — основатель компании Parallels), он тогда ходил по офису и рассказывал всем желающим, что есть гениальная идея — убрать десктоп, чтобы все виндовые окна выглядели бы точно так же, как маковские. Мы сразу же поняли, что эта идея очень хорошая и нужно над ней работать. «Вырезать окошко и убрать десктоп» мы смогли достаточно быстро и просто. А затем вся технология представления Coherence была написана одним-единственным человеком, который до сих пор у нас работает – Сергеем Концовым. На достижение того, чтобы пользователь практически не заметил отличий между приложениями Windows и Mac, ушли годы кропотливого труда.
Доказательством тому, что идея и правда была хорошей, стало то, что ее потом у нас все скопировали. Но в начале пути мы не были уверены в том, что технология станет революционной. И хотя Белоусов нас уверял, что все будут на ней работать, мы все-таки постеснялись поставить ее по умолчанию при загрузке виртуальной машины в первой же версии (прим. — слева — скриншот с версии 2.5). Но как только поняли, что это работает и пользуется популярностью, то сразу поставили по умолчанию (с версии 3.0). И этот режим до сих пор в лидерах, им в Parallels Desktop пользуется почти 80% юзеров.
Также реализовали простую инсталляцию Windows через Wizard, чтобы пользователь просто нажимал пару кнопок и получал свою вирутальную ОС. Эта технология была заимствована у OEM-установщиков, но впервые для конечных пользователей была реализована именно у нас в продукте.
Мы так долго работали с Coherence еще и потому, что это название из одного слова объединяет на самом деле много технологий. В частности, туда входит такая большая функция, как Shared Applications, которая заставляет пользователя видеть тот же Microsoft Word как нативное приложение в Маке. Вот это и есть самое сложное. Внешне функция выглядит просто, но «внутри» скрыто много логики, над которой мы до сих пор продолжаем работать.
В Coherence вложено 15 человеко-лет – целая карьера программиста. И этот код составляет около 8% всех исходников Parallels Desktop – настолько это большой и сложный продукт.
— Что еще было так же сложно сделать?
А.Г.: Сложность может быть разная. Программная сложность, алгоритимическая, сложность понять, как реализовать вещь или как она будет работать. Часто нам приходилось идти совершенно нетривиальным путем.
Например, расскажу про функцию, ради которой пришлось влезть во внутренности Windows. Есть у нас такая технология — SmartMount. Вот в чем ее суть: когда пользователь втыкает флешку в компьютер Mac, то она появляется только на маковском десктопе. Человек, работающий в режиме Coherence, хочет полной интеграции – то есть видеть содержимое своей флешки и в Windows. Но, чтобы она там появилась, ее нужно переконнектить в виртуальную машину, а ведь делать это каждый раз очень неудобно. Мы решили использовать Shared Folders. Поскольку эта функция представляет из себя драйвер сетевой файловой системы и показывается в Windows как сетевой носитель, то, когда флешка коннкетится в Мак, мы пробрасываем ее через Shared Folders в Windows. Тогда она автоматически попадает в Network location. Но пользователю непонятно, что свою флешку он должен найти именно в Network location: он привык, что это USB-девайс, который выглядит определенным образом и показывается именно там, где и все removable media. Стандартными способами невозможно сделать так, чтобы сетевая шара показывалась в списке устройств как подключаемый девайс и при этом еще и отражалась как USB. И вот наш разработчик Василий Жданов «внедрился» (назовем это так) в «Проводник», и доходчиво «объяснил» этой программе, что вот эту вещь надо показывать именно так. И теперь у нас SmartMount показывает USB-флешки как внешние накопители.
Вставили флешку
Увидели флешку
Или можно привести в пример оригинального способа решения задачи Smart Mouse – технологии, которая позволяет компьютерной мышке адаптироваться к тому приложению, с которым пользователь сейчас работает. Если это офисное приложение – она ведет себя одним образом, если игрушка – по-другому.
В Parallels Desktop есть два режима мышки – absolute pointing device, который позволяет курсору и в винде, и в маке двигаться одинаково – с одинаковой скоростью, перемещением. При этом используется только хостовая мышь. И есть режим relative mouse, при котором мышь работает внутри виртуальной машины со своей собственной скоростью. Последний режим используется в компьютерных играх, так как они совсем не заточены под absolute pointing device. Раньше курсор в играх начинал с бешеной скоростью передвигаться и играть было невозможно. Мы придумали способ, как обнаруживать нужный режим без каких-либо привязок к именам программ, библиотек или файлов. Все очень просто: если во время работы программы на ее экране визуально наблюдается курсор – то нужен absolute pointing device. В играх же стандартный курсор почти всегда выключается и игра его рисует сама, следовательно, в данном типе программы нужен relative mode. Выбор режима мыши по этому принципу, как в итоге оказалось, работает правильно в 95% случаев.
— Что за команда делает всю интеграцию?
А.Г.: Сейчас в команде Integration работает 6 человек, и это очень разные люди. Чем-то похожие, но не одинаковые. Практически всю команду я набирал сам. Единственный, кто уже работал, когда я пришел, – это уже упомянутый «отец Coherence» Сергей Концов. Так что я стал руководителем отдела из 1 человека, где сам выступал в качестве играющего тренера.
Вся интеграция в первой версии делалась силами этих двух человек – и Shared folders, и работа мышки, и копипаст, и drag&drop, и Coherence – практически вся базовая интеграция. Чуть позже появился Василий Жданов. Потом — Андрей Покровский, который сделал Shared applications для первой версии. Причем, что интересно, он сделал это очень быстро. Когда мы закончили продукт и уже захотели его продавать, то поняли, что без иконок в панели приложений Dock основная когеренция выглядит недоделанной. Пришел Коля (прим. — Николай Добровольский, вице-президент по виртуализации ПК) и спросил, можем ли мы это быстро реализовать. И Андрей сделал это за одни выходные, написав и отладив порядка 2000 строчек кода. Приложения показывались где надо, их можно было запускать из Dock. Вот это можно назвать по-настоящему продуктивной работой.
А вот, например, у Василия Жданова, о котором мы уже говорили, очень хорошо получается реверс-инжиниринг. Он быстро вникает во внутренности программ, что очень нужно для реализации интеграции, так как в этом процессе очень многое сделать стандартными способами просто нельзя. И Василий очень любит этим заниматься: просто приходит на работу и вкалывает, не отвлекаясь на голод и самочувствие. Вообще ничего не видит и не слышит. Часто даже не знает статус проекта, ему интересна лишь его конкретная задача в данный момент.
В общем, все они умеют разное, и производительность у них разная. Но они – КОМАНДА. Они абсолютно все умеют и хотят работать, у всех обширные и глубокие знания (которые за годы работы стали ОЧЕНЬ большими знаниями), и у них очень высокий уровень программирования. За семь лет их уровень настолько поднялся, что они могут сделать практически любую задачу, какую ни дай.
— То есть шестерых достаточно?
А.Г.: На данному этапе уже нет. У нас очень короткие циклы разработки, а, как я уже говорил, у нас примерно 30 интеграционных функций каждый год. Получается, что нужно делать примерно по 3 фичи в месяц. Тут надо отметить, что интеграционных фич много, но не все они делаются именно нашей командой.
В общем, мне сейчас требуется 3 человека в команду Integration. Это вакансии для тех, кто хочет программировать под все платформы и разбирается в Windows, Mac и Linux (ну, или хотя бы в одной из этих ОС). Основные языки – С++ и Objective C.
Так что те, кто хочет работать в Parallels в команде OS Integration, могут писать лично мне на адрес alexg@parallels.com. Одно точно могу пообещать – интересные нестандартные задачи гарантированы. Остальное обсудим на месте.
Автор: holymay