Miguel put this post on his blog discussing the joint announcement of The .NET Foundation:
The .NET Foundation is an attempt to create cross platform language syntax for the features of the platforms where they operate similarly. This is similar to what Microsoft has done with Azure's Mobile Service's Identity. With Mobile Services Identity Microsoft realized that as a developer I don't care if I'm trying to authenticate against a Live account, Google, Twitter or Facebook. All I care about is what service the user is authenticated with and the token returned. The differences in syntax were not of interest to me, in fact as a developer they created a harmful knowledge barrier. So Microsoft takes care of the differences in syntax and I just write against one unified syntax.
The .NET Foundation is bringing us more of the same for mobile platforms. Do I care about the syntactical differences in Geolocation or the contact systems? No probably not, so we have Xamarin Mobile. Do we care about differences in how mail is sent out? No probably not, so we have MailKit and MimeKit. Ultimately anything that has common functionality between systems can be abstracted out behind a common language library to give common syntax. This is big, huge in fact, for cross platform development. The more knowledge barriers that can be removed between platforms, the less expensive and more maintainable native cross platforms solutions can be.
This got me thinking, what can't easily be abstracted out across platforms to a common syntax for a truly engaging and flexible native applications? Two things quickly come to mind:
- The user experience. Applications running on iOS that look like Android applications or Windows Phone apps do not create an engaging user experience and vice-versa. The users on those platforms expect things to look a act in certain ways. This isn't just the look and feel of the controls, it may be the general design of the screens themselves and the flow between screens, how menus operate, etc.
- Platform specific features and flow. It's important to know that you can pass reference types between controllers on iOS but not between activities in Android. Sometimes you need access to those properties, methods and events that exist on one platform and not the other. It is similarly important to understand the lifecycle differences between the platforms, the fact that JIT code won't work on iOS, etc. This type of platform specific knowledge will always be needed to write an application that looks, feels and acts like a native application and performs well on that platform.
If we look at these one at a time what do they mean? For the user experience what is important is that we can create difference views on each platform with different layouts and a different look and feel. What isn't as important is the syntactical differences in what the controls are. Most of the time when I want to display some text I don't care if what I need to create is called a TextView or a UILabel. I just want some control to display some text. Similarly when I'm laying out the view I know that I want controls to appear in a certain order and usually be responsive to changes in the size of the UI. Do I care if I'm using the XCode designer, some controls created and positioned in code or a LinearLayout for that? Probably not. So I can envision some sort of common designer with common syntax being created that will have a different look and feel (i.e. the correct native controls being used) when I'm in a Windows Phone project, an Android project or an iOS project. But that will only take you so far which brings me to platform specific features and flow.
The platforms are different. Whether it be fragments in Android or the TouchUpOutside event in iOS. Activities and iOS controllers behave differently. Those types of behavioral and feature differences will be hard to get away from and still create a native application that behaves and runs well on the individual platforms. To the extent that they may be able to make a common syntax name for a button that actually creates the correct button on the native platform, that's great. To the extent that they can use a common layout scheme like XAML that creates the appropriate native specific controls and layout, that's even better. A single designer that works the same but looks differently on Andoird, iOS, Windows Phone and WinRT, that would be better still. But at the end of the day we are still likely to need some sort of platform specific extensions to get at the control features and layout capabilities that are unique to one platform or the other.
I don't even know if common control syntax or designer while preserving native look, feel and flow is truly feasible. Even then, we will likely still be creating multiple versions of the views that look/behave correctly on each platform even if the syntax is mostly the same. It will be fun and interesting to see how this plays out; what things can have standardized language syntax while still preserving the platform specific look, feel, features and flow and what things can't. I'd love to see that single UX designer that is emitting the correct native platform code. Sure I still may be creating platform specific layouts but my tool and syntactic knowledge will be similar; that is, the platform specific knowledge barriers will be lowered.
We will still need to know about how the individual platforms work, I don't think we will be able to move away from that and make native applications that look, feel and operate like native applications. The .NET Foundation is clearly moving in the right direction to lower many of those barriers. In the final analysis this clearly strengthens the value proposition of Xamarin and C#/.NET in cross platform development, which is kind of interesting in that it was one of the original thought processes behind .NET. It just took us a while (and some people with vision and perseverance) to make it happen.