Wait a second… Who am *I* to give the “state of” an entire industry? Well, I’m nobody – but I am pretty familiar (at the coding level) for all of the relevant technologies, and I have come to an extremely consistent and definite opinion on all of it. So, in my professional opinion, with what I know today – this is my take, for whatever it’s worth!
I find myself saying this all of the time:
“When it comes to technology and learning, the age of scarcity is over.” –Robert Seder
What I mean is – for computers, for very little money you can have an extremely capable computing environment. Sure, there will always be MacBooks and SurfaceBooks which are super-expensive, but even just buying a used $40 laptop on eBay, maxing out the RAM and putting in an SSD can still, even by todays standards be an excellent computing device. Need a server? A couple months ago, I bought two x dual-hexacore 1U servers with 4 hotswap bays, and 32GB of RAM each… for $150. The computing hardware market is saturated. You can now pretty much have all the compute-power you can imagine, for not that much money.
Similarly, before a couple of years ago, it was expensive AND difficult to become educated on a topic. I mean, since the dawn of man, up until a couple of years ago. Now, you can buy $10, 40-hour courses on Udemy, StackSocial, and countless other sites. Or, you can buy extremely reasonably-priced subscriptions to sites like PluralSight, PacktPub, and Safari. Nevermind the endless, free blog posts and YouTube videos too!
For the first time in the history of humans, it’s now cheap AND easy to get educated on virtually any topic. The only thing you need to do, is carve out time.
In my case, between my employer and me – we spent about $1,500 on my 2016 training, and that bought me about 600 hours of training. That would be like going to 15 solid weeks of 8 hrs x 5 dys instructor-led training (ILT) – for $1,500 total. The age of scarcity is over! ONE 5-day ILT class is typically $2,000 all by itself, never mind the commute and potentially rental car and lodging. It’s truly ridiculous.
I also find myself quoting this too:
“In the information age, ignorance is a choice.” –Donny Miller
Meaning, people in previous generations didn’t have a choice to not-be educated, they didn’t have access to information. Now, we humans have nearly unlimited access to information, so it’s literally a choice of whether we spend time out of our lives to actually take in that education.
With all of that said, I binge-watched and was neck-deep in coding for a good chunk of this past 4-day, holiday weekend. I was really able to fill in some of the cracks of my understanding of a few different technologies. So, as I said – I continue to come to a conclusion about it all, and am even more convinced now! Below, is my analysis.
What platforms should I support?
You can get statistics from all sorts of places, but looking at IDC: https://www.idc.com/prodserv/smartphone-os-market-share.jsp there are really only 3 relevant technologies when it comes to phones and tablets:
This, in my opinion is a little misleading – because this is worldwide. In non-U.S. countries, because of cost, Android is extremely prevalent. Also, there are far fewer apps in iOS App Store, but those developers make WAY more money. Plus, the Windows element can’t be ignored with how Microsoft is positioning Windows 10, including the Windows 10 phone and Continuum.
So, here’s another view of Smartphone market share, just in the U.S.: https://www.comscore.com/Insights/Market-Rankings/comScore-Reports-May-2015-US-Smartphone-Subscriber-Market-Share
This seems more realistic to me – about half the people I know have an iPhone, half the people have an Android and I know like 2 people who have a Windows Phone.
But generally though – if you are going to write an app or game, most people agree that you want to at LEAST support Android and iOS, and then I personally would also support Windows, because it’s a pretty fun platform which I’m also already familiar with.
If you want to support these 3 platforms, what does that mean for development?
- iOS – This is Mac-only and you need a developer who knows the Swift programming language.
- Android – you can use Windows, Mac, or Linux, and a developer who knows the Java programming language.
- Windows 10 – This is Windows-only and you need a developer who knows .NET
If YOU are the developer, this sucks. Each one of these platforms is deep and nuanced. To support common Smartphones, you now need to commit to learning two ADDITIONAL ecosystems, and potentially buying a Mac.
Worse than that is you are really talking about writing your app 3 COMPLETE times, because none of the code is reusable between platforms.
This is the stupid browser wars of the 1990’s, all over again – people writing multiple versions of their application because the vendors couldn’t or wouldn’t come together. I’ve lived through that, writing a Netscape version of the website, and an IE version of the website – what a colossal waste of time and I will never do that again. There’s GOT to be a better way, right?
Native vs. Hybrid:
Now wait a second, the above is true if you are talking about writing a “native” application. That is, using that ecosystems programming language, and operating system API’s to write an app that natively works on that platform. But what about this “hybrid” approach? This is classic snake-oil “write once, run anywhere” promise.
Worst case, these all support the idea of being able to load and run a generically-theme app in the different app stores. Best case, some of these support the idea that you create platform-agnostic controls, like a “toggle” switch for example – and depending on the platform it is running on, it will render correctly. For example, on Android it would render like this:
on iOS, it would render like this:
and on Windows, it would render like this:
Well, there are exactly three alternative technologies which I’ll acknowledge that let you accomplish releasing to multiple platforms with (more-or-less), one codebase:
- Xamarin – this is a product that lets Microsoft .NET developers write C# code, and using Xamarin Forms, lets you layout the UI once – and it will take care of packaging the app for each supported store, and will make the app look native.
OK – so we can either learn or hire a developer to write for each platform, or these are 3 alternative ways where I could “write the code once” and deploy to many platforms. That Unicorn promise has been made by so many vendors, and few have delivered. Remember www.kony.com? Yes, Kony is technically another option – but it’s so terrible, I’m not even giving it an honorable mention!
Anyhow – so what do we do?
Xamarin is terrible. There, I said it.
I know this is an extremely unpopular viewpoint – but I’m just going to be honest.
Xamarin exists for a few reasons:
- .NET devs coming from decades of WinForms development don’t know web, and this allows them to create mobile apps, pretty much using what they know.
- There is the ever-so-enticing promise of “write once, run anywhere”
- Microsoft officially backs them – which gives them legitimacy.
Why then, do I say it’s terrible? First, let me say, I bought a Xamarin subscription – which just expired a few weeks ago. So, I’ve dabbled with Xamarin for 12+ months. Here’s why I am
violently very opposed to everything coming out of that company:
- The business model. The industry has a model: you give away your stuff for free to hobbyists and startups, and you gouge the big megacorps. Instead, Xamarin really sticks it to the little guy. Their cheapest subscription model (which you pretty much need to be productive), is $25/month. Then, if you need to write on more than on platform (like Windows AND Mac), you’ll need a SECOND license! So, a hobbyist is to pay $50/month for the privilege of using Xamarin and to be able to release an iOS app! It makes me so mad even writing that – because it’s so wrong! This model makes it so hobbyist and startups HATE the company, so that later on – those same developers will never use the product, even if they can afford it later on. I am a good example of that: I tell everyone I know what a rip-off Xamarin is, and I’m even communicating that on this blog post, because I so strongly-dislike the ethics of their business model. It’s a proven failure where everyone loses. Xamarin loses potential and actual customers, and those burgeoning developers couldn’t use a useful product. But I think Xamarin will fail even sooner than that, because it’s bad for other reasons too!
- The complexity. If you want to deploy to Google Play and the App Store, you’ll need: a Mac (for the iOS part) including XCode and Xamarin on the Mac. Then you need the Android SDK (which already has a lot of complexity), then you’ll need Visual Studio – which is currently like a 17 hour install! Then, you install Xamarin and expect this all to just work? In my experience in the past year, things only built successfully maybe 30% of the time. The Android emulator (notoriously) is extremely slow, and while debugging, Visual Studio, the emulator, or some combination either crashed or hung. It’s not the exception, it’s the rule. It was hands-down the most complex configuration I’ve ever set up in my 20+ year career for anything computer-related, in any context. Once it was setup, it was very unreliable and failed most of the time (because of environmental problems).
- There are far better options. If this were the only option – and it was for a while, then you’d suck it up and just use it. But not only is it not the best option, in my opinion, it’s the worst of all worlds. You will be far less frustrated just learning Swift or Java, than you would be using Xamarin. More on that below… Even better, and my preferred approach is the Cordova + Ionic frameworks – that combination is, to me, the “perfect storm”; the sweet spot. When you compare that, to the complexity and cost of Xamarin – Xamarin isn’t even a legitimate option, to me.
I know, some won’t agree – but I’ve just had it with this company. There is no upside; they are terrible. It’s expensive, extremely complex, and it’s not even close to being the easiest or best option! Ok, onward and upward.
The Swift language, for the .NET developer:
Let’s explore the idea for a minute. What WOULD it take for a .NET developer to just learn Swift. How bad could it be? For me, I went through this course in Udemy – which was excellent – and by writing actual, complete apps, it gets you completely up to speed in about 30-40 hours.
There are some technologies or languages you can just “play with”, but I would recommend actually finding a class on this if you can. There are many, many conventions that you wouldn’t otherwise know. There are several things – like CTRL+drag that would not otherwise be obvious unless you saw it somewhere. Again, the age of scarcity is gone for education – go find a good class. Another good one is likely this one – I say that, sight-unseen because Rob Percival is an excellent instructor – but that class (as of this writing) is $199. It was one of the ones that was on sale for $10 last week though – so look out for future sales!
To create iOS apps, you need a Mac. You can buy some really expensive MacBook, or you can always find a pretty good Mac Mini on eBay for around $300. Make SURE to get an Intel-based one. Any Mac Mini 2009 or 2010 and later will be totally fine, in my opinion. Max out the RAM (8 or 16GB, by going to www.crucial.com and looking up the model number, so that you find compatible RAM) and go buy a new Solid State Drive (SSD) so it will be plenty fast. So, the Mac Mini = $300, SSD = $100, RAM = $50 – you’re probably looking at $450 total to get a “very good”, fast MacOS X development environment going. Next, you go into the App Store and you install “XCode” – it’s free.
Within XCode, you can use Objective-C, the old-school language for creating apps, or Swift the new, flagship, managed language. For a .NET developer, Swift is exactly right in the middle of the C# and F# languages in .NET. The syntax is extremely similar to either of those. Variable and value declarations, and “no semicolons” is very much like F#, the rest of the syntax is very much like C#. Once you get a hang of the conventions like @IBOutlet and @IBActions, and then the Objective-C holdovers of the NeXTSTEP (NS) API’s, it’s surprisingly easy to jump into.
The one thing that is very unusual is that 100% of the UI layout is, and wiring up the code-behind, is done in the designer by using the mouse and doing a CTRL+drag. To manipulate anything about the UI elements (location, scaling, stacking, etc) – that is all done via the designer-only.
My final thought though is that it is quite reasonable that if you took a 40 hour class and if you were already familiar with MVC and MVVM, you could easily be doing iOS development immediately after. It’s not that big of a stretch. If you are also not familiar with MacOS X, there might be a little learning curve there too – but it’s not unreasonable at all.
So – if you JUST want to release something to App Store, that’s a totally doable-thing. Xcode is a pretty mature platform at this point and there is tons of supports on the internet. However, if you also want to target Android, then this becomes far less desirable because NONE of your code is portable. Your Android code will be a second copy, a second version of the app, written in a second programming language! That is a big waste of time.
Android development, for the .NET developer:
Let’s explore this idea for a minute. What WOULD it take for a .NET developer to just learn Android development? For me, I went through this course in Udemy – which was excellent. Similarly, it taught by writing complete apps from start to finish.
One of the biggest issues here is the emulator. There still is not a great Android emulator for Windows. So, honestly, if you ended up buying a Mac, you’d be better served to just do your Android development over there too. You’re already all set up for it, and you’ve probably learned how to use Git from the Mac command-line, etc.
Well isn’t that a weird thought – you’d be doing MOST of your development on a Mac? Maybe that’s why you see hipster programmers using Mac’s? Because yeah, for non-Microsoft development, it is actually pretty nice! If you wanted to code for Android and iOS – using a Mac is not only OK, it’s actually ideal.
To create an Android application, you need to install the Java JDK, and then Android Studio. For these, these all run on Windows, MacOS X, and Linux (well, Ubuntu). You might optionally want to find a better Android emulator too if you are on Windows – google it for many options.
The common things that a .NET developer will find comforting in Android development are two things:
- Android apps are written in Java, and Java is extremely similar to C#. So, the language syntax is near identical.
- The layout of the UI is done with XAML – except it’s namespaced to Android instead of Microsoft. So, if you’ve ever worked in WPF, Windows Phone, or WIndows Store apps – you’ll be right at home.
Android Studio is very nice too – it’s very modern, full-featured, mature, and easy to use.
Again – if you want to release something to JUST Google Play, it would not be a huge leap at all for a .NET dev to become proficient in Android. The Android Studio IDE is very nice, there is tons of documentation and support – so it’s pretty easy to get up to speed. But again, if your intention is to write an app for iOS and Android, this is not-great. Then you are talking about writing the application TWICE, because virtually none of this code is going to be portable to iOS or Windows.
What is Cordova and Ionic?
I’ve looked at Cordova and PhoneGap a few times over the last couple of years, and knowing just what I know about the problems above – I would’ve been happy if all Cordova did, was host a mini-website and launched it like a native application. I was completely ready to just use AngularJS, Bootstrap, jQuery and make a pretty “website”, that was loaded like a native app – but didn’t LOOK or ACT like a native app. If that’s all Cordova did, I was perfectly fine with that – and was expecting that. Even that alone, was still the best option…
But then I learned about Ionic. In fact, I’m most of the way through this course on Udemy – and it too, is excellent! This changed everything for me. Here’s how I understand the relationship between these technologies:
Cordova does two things:
- Is the skeleton of your “app”, and it knows how to look like an app to devices and to app stores. To you, it’s a full-screen web browser, and it’s going to load your “website”, which is nothing more than files, which are also bundled with your “app”. So, your “app” is really a standalone, mini website, which is wrapped in an app container. Cordova doesn’t care what it looks like – it just takes care of getting your HTML loaded as an app, on the device.
If all you did was build a traditional website with Bootstrap, AngularJS, jQuery, etc – that would be find, and you could call it a day.
But what Ionic then offers is a layer – built on AngularJS, which gives you native phone look and feel. For example, it knows how to render lists, buttons, textboxes, navigation controls, etc – in the platform-specific way! All you need to do is fill in the most minimal of information. It also supports “phone” type things like “pull to refresh”, or “swipe reveal”.
I am nothing short of blown away at this framework – they have it dialed-in!
It’s very little code, very little ceremony. After seeing Ionic in action, it’s excruciatingly-clear that this is the ideal way to go, on every front. It’s got the best features, it works on all platforms, it’s the least amount of code, it’s free, and it’s ridiculously simple to use.
What I strongly believe the future will be, and where I’m investing heavily:
A big part of my answer on this is my belief in what the future of application architecture is going to be. And that is:
Having web services which offer all of the application data, protected by (as of this writing) OAuth.
Why do I believe that? Because it solves ALL of the problems. If you have an API for your app, that gives you:
- Authentication, authorization, and data for a website.
- Authentication, authorization, and data for your mobile apps.
- A secure, programmatic way for your customers and business partners to interact with your business data.
- Need a desktop WPF app – again, you already have the security and data endpoints to create ANY kind of UI on any platform.
This solves security and data access for all platforms and all technologies. This is because everyone supports OAuth, and everyone can understand JSON.
Now, you could write your own backend server – or there exists Backend-as-a-Service (Baas) providers now. I wrote a blog post comparing/contrasting build vs buy. Since writing that blog post, I’ve learned of a couple more: www.appback.com and www.parse.com – in addition to www.backand.com and Azure Mobile Services. New ones are sprouting up every day!
So, if you have a backend which already knows how to do authentication, authorization, and gives you RESTful endpoints for all of your data:
What does that mean for web development?
Wow – that is very different from modern day: ASP.NET over IIS, or Java or PHP over Apache. In those configurations, there was a lot of complexity and burden on the web server. With a thin web server, you can handle far more traffic with fewer resources and it’s simpler to lock down – because it’s a simpler configuration.
With this new approach, your UI is very clean using Angular, etc. The hosting environment is simple to the point of being silly. You could almost run it on a Raspberry Pi – and that puts all of the burden on your BaaS. Which, if that’s what they do for a living, they (hopefully) have a bullet-proof, secure backend. This is not only a great step forward – but this is even ideal!
What does that mean for mobile app development?
Similarly, if you aren’t dealing with platform-specific schemes to authenticate a user or dealing with ORM data access, AND if you are using something like Cordova+Ionic, then that means your “app” is nothing more than an AngularJS website. In fact, you could literally copy/paste your code from the actual internet website to create your mobile app. Boom! Now you have a website AND a mobile app from where your users can connect!
Think about this for a second: if your “app” is nothing more than an AngularJS client – it could just as easily be a website available on the internet, as it is made available as a device-specific “app” in an app store. It could be almost the same – or even exactly the same code for all. What a HUGE departure that is from the status quo right now.
If you were to listen to Microsoft, Apple, Google, and Amazon – they continue to tell you to write code for their silos, duplicating effort all over the place and nothing works with the other vendors. Instead, if you had exactly ONE backend (via some/any BaaS provider), then your AngularJS-based website and/or Ionic-based app would be quite simple to write – and you really can, realistically run it anywhere.
This just seems to be the glaring, obvious answer to this state of transition we’ve all been in. Web and mobile technologies have flared-up and then died-down, with developers being caught in the frustrating place of trying to keep up with it all.
Meanwhile, if you didn’t do native mobile app development, then things like Xamarin or Kony were you’re only option, which is a very bad place to be.
Now, all the pieces are coming into place. BaaS providers are popping up left and right, AngularJS is the de-facto standard to write compelling databound HTML applications, and frameworks like Cordova and Ionic are mature and have their niche dialed-in nicely.
This combination makes for a very compelling, COMPLETE solution to all of it: a web site, an iOS app, an Android app, a universal Windows app, etc. In fact, Cordova supports: Android, iOS, Windows, Blackberry, Ubuntu, Firefox OS, and Amazon FireOS. So, with no additional code, you could release to all of these app stores simply because Cordova supports it.
And that, above, is my opinion about the state of mobile app development. For me, it means using a BaaS provider, and using Cordova + Ionic to publish hybrid mobile apps. Therefore, in the coming months, you’ll see more posts on this. My two main focuses for 2016 are mobile/web/BaaS–based development, and the security/hacker/pentesting/forensics skillset that I’m continuing to build up.
What do you think about this? Agree? Disagree? Leave a comment below.