We use Xamarin almost exclusively for development of native mobile applications, even when single platform. The development hardware that we use are MacBook Pros with 16GB RAM and min 500GB SSDs. We run Windows 10 in a Boot Camp partition and virtualized using parallels. We have Xcode installed on the iOS partition and Visual Studio 2017 installed on both Windows and Mac partitions, along with Android SDK and NDK.
We use Xamarin.Android and Xamarin.iOS for apps with a complex UI, and use Xamarin.Forms where applicable.
It has significantly reduced the skill barrier for development and testers. Our company is mostly a Microsoft stack house, so most developers either use, or are familiar with, C# and .NET. Removing the need to become proficient in two other languages, makes adoption easier. Though it should be noted that developers still have to become familiar/proficient with the iOS and Android SDKs and the lifecycles of the native apps.
The ability to reuse significant amounts of code between platforms, have a single code repository, and a single development team for all platforms has massive advantages. It significantly reduces development and test costs, and ensures that there is synergy between the platforms on product features and user experience. However, the most important impact is the reduction in product lifecycle costs.
It allows the development of truly native applications in C# using the power of .NET framework and Visual Studio.
Xamarin allows the same development and build environment to be used for all platforms and code to be controlled in a single code repository. Shared logic, such as business logic and models, can be shared between the platforms, which significantly reduces development, test, and maintenance efforts. Typically, this leads to around 75-80% code reuse between the platforms. If Xamarin.Forms can be used, then this reuse typically rises to around 95%.
Xamarin also leverages the full power of the .NET Framework, including things like lambdas, LINQ, properties, bindings, commands, etc. Lastly, it uses the Visual Studio IDE, by far the most powerful and complete IDE available, making development and maintenance much easier.
The Xamarin SDK provides C# bindings to all native iOS and Android SDK APIs, as well as access to the .NET framework and builds to a native package. The Xamarin Mono run time runs a .NET CSR alongside the native run time with a bridge between them, and handles memory management and garbage collection.
App behavior is completely native and performance is near native (depending on the app architecture, but can be even faster than native if the business logic is computationally intensive). App size and memory footprint is slightly larger than native, due to the need for the inclusion of the .NET and Xamarin libraries. In a debug build, this can be significant. However, in release mode, the build process uses a rigorous linking process which removed most of the unused classes and methods from the managed DLLs. As a result, the average app size increases in a release build by only 5 to 6MB.
The most common issues involved are with the IDE and build process. The worst build issue concerns are the caching process MSBuild uses to reduce the build time. It is unnecessarily complex (internally) and will sometimes leave cached files which should have been removed, even when a full solution clean is performed. The work around involves closing the solution and deleting some project folders. Occasionally, IntelliSense loses sync with the code and provides visual error indicators when no error exists.
Xamarin.Forms does have some short comings, especially surrounding performance. Launch time on Android is a particular issue because Xamarin.Forms loads all the external assemblies during initialization. Support for lazy loading or merging of assembles would significantly reduce this, but Microsoft is still committed to a solution. Support of platform specific behavior could also still be improved. However, I believe strongly that Xamarin.Forms is the future of cross-platform native mobile development.
More than five years.
I have been using Xamarin for about seven years, since before it was Xamarin (it used to be MonoTouch and MonoDroid).