Наша команда уже три года занимается разработкой для Mac и развертыванием в Ubuntu на EC2, и у нее очень мало проблем. Несколько вещей помогли сделать этот процесс гладким:
Мы можем запустить весь стек приложений ** на Mac. Между macports, homebrew и сборкой из исходных текстов, когда это необходимо, нам удалось получить все технологии, которые мы используем в prod, работая на наших устройствах разработки. Способ, которым части конфигурируются и сочетаются друг с другом, различается локально (например, в prod мы автоматически обнаруживаем наш экземпляр memcached, тогда как локально он жестко запрограммирован), но каждую интеграцию можно проверить на Mac перед тем, как перейти к prod.
Наша система непрерывной сборки находится в той же настройке, что и наши коробки с продуктами. Это означает, что если вы включите какой-то код, который зависит от какой-то части магии, он обнаружится быстро.
Мы запускаем стэк (некоторые люди называют это промежуточным или целым) стеком, который настроен идентично производственному. Это иногда приводит к некоторым накладным расходам на разработку, но имеет столько преимуществ, что оно того стоит. Весь код проходит через этот стек, а затем передается в prod.
Эта установка работала достаточно хорошо, так что со временем мы позволили разойтись другим частям установки. Раньше мы выполняли пассажирские перевозки локально (как в prod), но теперь используем Pow. Мы регулярно экспериментируем с новыми версиями ruby в течение некоторого времени, прежде чем обновлять остальную часть стека.
Мне приходилось разрабатывать с использованием виртуализированной среды для других проектов (OSX + CentOS в VirtualBox), и я определенно счел это более болезненным, чем у всех нативных. Для одного это было похоже на управление двумя машинами вместо одной. Все также чувствовал sloooooowww.
Если есть часть стека, которая является болезненной для работы на Mac, я определенно предпочел бы принять удар либо: а) тратить время на то, чтобы он работал локально, либо б) абстрагировать этот кусок, чем платить налог на работу с виртуальной средой.
** Я включаю в это обсуждение только приложение Rails и прямые зависимости. Например, мы используем puppet для настройки нашего парка EC2, но не запускаем его на наших устройствах разработки.