Our team has been developing on Mac computers and has been running Ubuntu on EC2 for three years now, with very few problems. Several things helped make this a smooth process:
We can run the entire application stack ** on a Mac. Between macports, homebrew, and source creation, when necessary, we managed to get every piece of technology that we run in prod while working on our dev blocks. The way the parts are arranged and their match is different locally (in prod, for example, we automatically detect our memcached instance, whereas locally it is hardcoded), but each integration can be tested on Mac computers first before going to prod.
Our continuous assembly system is on the same installation as our crates. This means that if you check some kind of code that depends on some part of the local magic, it is quickly detected.
We run a soak (some people call this stack or integrated) stack, which is configured identically to production. This sometimes leads to some development overhead, but has so many advantages that it is worth it. All code goes through this stack before being pushed to prod.
This setting works well enough that over time we have allowed the spread of parts of the system. Previously, we traveled by passenger transport (for example, in prod), but now we use Pow. We regularly experiment with new versions of ruby ββin development for some time before updating the rest of the stack.
I had to develop using a virtualized environment for other projects (OSX + CentOS in VirtualBox), and definitely found it more painful than the native one. Firstly, it was like driving two cars instead of one. Everyone also felt stupid.
If there is a piece of the stack that is painful to run on a Mac, I would definitely prefer to use the hit: a) spend time trying to get it to work locally or b) abstract this part, rather than pay tax on the virtual environment.
** In this discussion, I include only the Rails application and direct dependencies. For example, we use a puppet to configure our EC2 fleet, but we do not launch it in our dev blocks.
source share