Thursday, February 4, 2016

Xamarin vs Ionic: A Mobile, Cross Platform, Shootout

Ever faced with choosing among competing frameworks; needing to make a decision you/your customer won't regret?  If those frameworks are for building cross-platform mobile apps and are Xamarin and Ionic, hopefully this article will help.

The background is I had the somewhat rare pleasure of working on these competing frameworks on back-to-back projects recently.  Project #1 used Xamarin (and Xamarin Forms more specifically), the C# based framework for building fully native, cross platform apps.

Project #2 used Ionic, the Angular.js, Cordova/PhoneGap, HTML, and JavaScript based framework for building apps that look and act native, but are technically running in an embedded browser.

And what if I had to recommend one?  I'd probably want to think about a customer's budget, desired end product, and timeline.  I'd consider development speed, ramp up time, and maintainability.  Basically I'd evaluate based on the following six criteria:

1. Price: Ionic++


The single most obvious framework differentiator is price. Ionic's free price tag may seem like a no brainer.  However, $1,000 per developer per year for Xamarin is quite doable for most companies, especially if there is a compelling enough reason. Two very compelling reasons are:

  • We only have .Net developers; and
  • Our architecture is already exclusively .Net

If these bullets apply to you, then the price is likely justified, and the Xamarin choice obvious. However, if you have a mix of talent and technologies, then free is hard to beat.

2. End Product: Xamarin++


Your customers won't be able to pinpoint exactly why they prefer your competitor's fully native app, but you're more likely to lose in the end

Surprise: an HTML-based app, however well styled, will never look, feel, and perform like a native app.

How different is the Ionic look and feel? If you stick to the default controls and don't overly customize, I guarantee your users won't notice. However, faced with a choice your customers won't be able to pinpoint exactly why they prefer your competitor's fully native app, but you're more likely to lose in the end.

We were lucky enough to have a full-time design professional provide assistance on the Ionic project, and several of his (fairly time consuming) suggestions would not have been an issue if we'd gone with Xamarin.  Furthermore, the UI always felt a little laggy, even with theoretically GPU accelerated CSS3 transitions.

Simply put if you want the best, fastest, most authentic experience for your users, Xamarin is the clear winner.

3. Development Speed: Ionic++


If you need to get an app out the door yesterday, Ionic is your friend.

Development speed differs between the frameworks in two main aspects.  First is the amount of time from writing a line of code to seeing results. For Xamarin, pushing out code to an iOS device required several seconds of compilation plus 10 to 15 seconds of deploy time.  Ouch.

By comparison Ionic with a ripple emulator provided zero-compilation, sub-second feedback times. This feature alone significantly increased development speed.  Perhaps more importantly the fast feedback cycles actually made coding more fun.

The second development speed difference was in UI debugging.  Ripple plus Chrome tools makes debugging the UI in Ionic amazingly easy.  With Xamarin you have a very limited ability to figure out why an element is rendered exactly where it is at runtime, let alone tweak its attributes. In short Ripple + Chrome Tools makes UI work significantly easier in Ionic.

Overall, Ionic was a significantly better development experience.  If you need to get an app out the door yesterday, Ionic is your friend.

4. Maintainability: Xamarin++


This where I rag on JavaScript, right?  Well, before I start, I have to admit I made three architectural decisions off the bat that made working with a JavaScript app more palatable to someone with my background and um, well biases, frankly.

TypeScript


As much as I appreciate JavaScript, I value refactoring, a great IDE experience, and the free unit tests that a compiler provides. TypeScript gave us all that goodness back, and with it the possibility of working with a large codebase and/or a larger, more diverse team. Without TypeScript I personally could not recommend Ionic for anything beyond fairly simple or a single developer mobile app.

Visual Studio + ReSharper


You thought Visual Studio and Resharper were just for .Net apps? Wrong, they helped us immensely with things like Bower and NPM package management, code navigation, refactorings, and great static analysis, plus a full-on fantastic debugging experience like you'd expect from a .Net app. Microsoft thoroughly surprised (dare I say delighted) us by providing a fantastic IDE for a historically non-Microsoft tech stack.

Wallaby.js


Our app had a fairly complicated core engine and with it a lot of unit tests. Wallaby allowed us to run our unit tests continuously, as we typed, before we saved even. Everyone on the team knew instantly if they had broken a test, and it kept code coverage at the fore-front of everyone's mind. Karma would have been ok I guess, but Wallaby made working exclusively in JavaScript/TypeScript enjoyable.

Overall Maintainability


While these three decisions made our JavaScript application more maintainable, refactorable, and less prone to incurring technical debt; Xamarin continues to feel more maintainable.  There's no way around that Angular is extremely heavy on magic strings.  My co-workers and I simply felt less scared of creating obscure bugs while modifying each other's code or refactoring existing code when we had a real compiler double checking 95% of our work.

5. Unit Testing Experience: Conflicted


A good framework needs a great unit testing experience if you're going to bake quality into your app.  Unfortunately, as great as Wallaby is, even with Karma, I could not figure out how to breakpoint debug and inspect variables from within a unit test.  With Xamarin, on the other hand, unit testing is a first class citizen.  It's easy and powerful and with nCrunch, feedback is nearly as fast as with Wallaby.

Why conflicted?  Because I love this:

// describe + it blocks offers a hard to match level of expressiveness
describe('when you calculate dimension effects for a question', () => {
  // notice this generic helper function relevant to most/all of the tests
  var makeDimensionEffects = () => { ... };

  // nested describe -> I LOVE THIS
  describe('with a transformation', () => {
    // this 2nd helper is relevant to only nested tests
    var makeQuestionWithTransformation =  = () => { ... };

    it('should error gracefully if blah blah blah', () => {
      expect('actual').toBe('expected');
    });
  });
});

Even with SpecFlow, of which I am a huge fan, .Net fails to offer the same power, flexibility, and expressiveness.

6. Ramp Up Time: Xamarin++


The amount of ramp-up time obviously depends on your background.  However, with Xamarin it was just a little easier to fall into the pit of success.  Architecturally speaking, we made a wide variety of mistakes in Ionic that made things very messy for us later (notice how I switch to the third person when it's something bad that happened, sneaky, huh?).  Those mistakes mostly manifested themselves as poor memory management, although we screwed up our ngCache data structures too resulting in poor performance under load.

Now one might argue it's easy to mess up memory management with any new framework.  In Angular, however, upon which Ionic is based, it seems to be especially easy to create leaks.  By the time we finished our Minimum Viable Product and realized all of the anti-patterns we'd implemented we had a real mess to recover from.

Conversely, we had only one major memory issue with our Xamarin MVP, and we cleaned it up without issue.  Obviously if you have anyone on your team with prior Angular experience that mitigates this concern, but if not and you're choosing Ionic, consider yourself forewarned.

Summary


So what if I had to recommend a framework today?  Obviously the safe (and correct) answer is: it depends.  It depends on the team, the existing architecture, who's maintaining the app, the budget and timeline, and a host of other concerns.

However, just to be provocative I'll avoid the safe answer.

For me: I value quality over speed.  Just because you can build something with free tooling (#1), do it faster and have more fun doing it (#3); that's no substitute for building an authentic, top notch, responsive mobile UI (#2) on a clean, refactorable code base (#4) that will be ready for market when it hits first release (#6).

But perhaps time to market is more important for you.  Every circumstance is different.  Hopefully this has helped shed some light on what decision will be right in your case.


Saturday, November 28, 2015

Garmin vs Microsoft Band 2: Lifechanging? Maybe.

While the Garmin Forerunner leveled up my running, I can honestly say the Garmin Vivofit (a Fitbit competitor) changed my life.

So shouldn't a Microsoft Band 2, with well over twice the number of sensors of both Garmin devices combined be twice as disruptive?  One can dream.

Sensor
ForeRunner
Vivofit
Microsoft Band 2
Heart Rate Monitor
With Strap
Yes
3-Axis Accelerometer
With foot pod
Yes
Yes
Gyrometer
Yes
Yes
GPS
Yes
Yes
Microphone
Yes
Ambient light sensor
Yes
Galvanic skin response sensors
Yes
UV Sensor
Yes
Skin temperature sensor
Yes
Capacitive sensor
Yes
Barometer
Yes

Seriously Bro, Life Changing?

Prior to the Vivofit I would exercise once, maybe twice a week.  Often as not I'd skip entirely.  After a 40-50 minute run I'd feel good, but hit a wall well before day's end.  24-48 hours later I'd be in pain.  It was just infrequent enough to risk injury, which occurred to me several times a year.

The Vivofit changed all that.  Inspired (or perhaps compelled) to reach that magic 10,000 steps a day number that's supposed to be so beneficial I was forced to run for 20 minutes nearly every weekday (in addition to climbing more stairs, taking a lunchtime walks, etc).  Forced, because without the daily run there is simply no other way for someone who's job and primary hobby has them sitting for 12 hours a day to make 10,000.


The difference between short, daily exercise and infrequent, intense exercise is dramatic.  My body started waking up early with ease, in anticipation of its daily run.  I felt more alert and quick at work.  I needed less sleep, presumably due to higher quality sleep.  And despite running more, I rarely got sore.  These benefits persist to today, and I haven't suffered an injury in over a year.

I've also lost weight (a good thing).  Below are my weights for the last year.  They may not appear dramatic, but keep in mind I got the Vivofit in January and I didn't change my diet.  I wasn't trying to lose weight.  The loss came naturally as my competitiveness and type A personality combined with the data I was getting from that little device.

Date
Weight
Fat %
10/16/2014
185.6
22.8
10/30/2014
186.0
23.3
11/20/2014
185.8
23.6
1/2/2015
187.2
22.3
1/13/2015
186.4
22.7
1/30/2015
184.2
22.5
2/12/2015
185.2
22.2
2/27/2015
183.4
21.1
3/7/2015
184.8
22.7
3/19/2015
182.4
21.2
3/26/2015
182.2
21.7
4/10/2015
183.0
22.5
4/16/2015
181.2
21.7
4/23/2015
179.8
21.5
5/15/2015
180.2
20.6
5/28/2015
179.8
19.9
8/20/2015
181.0
20.9
9/19/2015
182.2
22.2
9/30/2015
181.2
21.3
10/8/2015
181.8
21.7
10/15/2015
182.0
21.5
10/23/2015
180.8
21.4
10/29/2015
179.6
20.5

p.s. my doctor says I should be in the low 170's.  I'll get around to trying to lose weight at some point.  Tomorrow sounds good.

If you're questioning the life-changing potential of a pedometer, you're absolutely right to.  My wife, whose personality is roughly the opposite of mine, got a Vivofit at about the same time and a year later she rarely wears hers.  But if you you're a programmer like me or just love data, you may find similar inspiration.

Pedomo-Fail

If a silly little $70 device can make such a big difference, imagine what $250 band with sensors out the wazoo can do.


Unfortunately, my primary experience with the Band can be summed up as follows:

In economics and decision theory, loss aversion refers to people's tendency to strongly prefer avoiding losses than acquiring gains. Most studies suggest that losses are twice as powerful, psychologically, as gains.

Loss, what loss?  It turns out the Microsoft Band is a miserable pedometer.  Every single day it steals an average of 3,533 steps from me.  I know this because I wore both the Vivofit and Band for over a week.

Day
VivoFit
Band 2
Loss
% Loss
Runs
11/14/2015
19,834
     12,626
7,208
36%
1
11/15/2015
12,941
     13,230
-289*
-2%
0
11/16/2015
12,877
        9,494
3,383
26%
1
11/17/2015
13,099
        9,376
3,723
28%
1
11/18/2015
12,077
        6,716
5,361
44%
1
11/19/2015
10,032
        7,326
2,706
27%
0
11/20/2015
14,055
     11,016
3,039
22%
1
11/21/2015
7,468
        3,846
3,622
49%
0
11/22/2015
12,419
        9,374
3,045
25%
0

* The 15th I mowed the lawn. The Band wouldn't track at all.  I put it in my pocket as suggested on the Microsoft Band forums, but then it seemed to double-count steps.  Sigh.

Chart showing Band losing steps

So why do I judge the Band inaccurate instead of the Vivofit?

Because I've watched as the Band fails to count steps while I'm not swinging my arms fully, or perhaps walking too slowly.  For instance if I'm carrying a coffee, looking at my phone, or slowly walking the sniffing dog while holding a morning paper (I know, what's that?), then it under counts.  It succeeds when my hands are in my pockets, but on numerous occasions I've seen it just zone out.  It certainly fails miserably when mowing the lawn.  There's even an extensive thread on missing steps on the Microsoft Band forums.

And how do I know that the Vivofit isn't over-counting?  Perhaps it does a little.  I have seen it give up a few steps while doing mundane things like washing my hands, but in general it grants nothing for driving, random arm movements, or trying to cheat (not that I'd do that).

Why does a little under counting even matter?  Because I am no longer consistently getting 10,000 steps with my 10,000+ steps worth of effort.  It means the same competitive part of my brain that was motivated to run daily feels it's being cheated.  It's stupid, I know, because I'm getting just as much exercise and being just as healthy.  But I simply don't feel as healthy if I fail to hit 10,000.  I've lost something: meaningless though it may be.  And it will take a substantial amount of of bells, whistles, and fancy sensors to compensate for my feeling of loss.  Fortunately, the band is excellent in about every other area.  I suppose it's enough to make up for my loss aversion.

Running with Garmin Stinks

While the Band isn't a great replacement for the Vivofit, it's an excellent replacement for the ForeRunner 405CX.  It tracks both outdoor, GPS-based runs, and indoor accelerometer-based treadmill runs accurately.  And if you're outdoors you don't even need to bring your phone, unlike certain Apple fitness products.

Nov 16 Treadmill Run
Stat
ForeRunner
Band
Pace
9:01
9:12
Calories
251
313
Distance
2.22
2.17
Avg HR
166
159
Max HR
175
180
Nov 14 Outdoor Run
Stat
ForeRunner
Band
Pace
8:38
8:32
Calories
661
448
Distance
4.54
4.61
Avg HR
167
170
Max HR
188
183
UV Exposure
16m

What makes me love the Band as a running device more than anything else is the Garmin's heart rate monitor stinks.  Literally.



I love heart rate data.  It lets me know that I'm working too hard at the beginning of a run, or not hard enough in the middle.  But that strap.  It feels akward, it looks like a bra strap through a damp shirt, and no amount of washing seems to remove that stank.  Granted some of the newer ForeRunner's are strapless, but throwing away the ForeRunner 405 for the Band was an absolute pleasure thanks to the Band's in-watch optical heart rate monitor.

Everything Else

I've spilled too many words already.  Let me quickly cover everything else:

Alarm Clock
Love it.  Having an alarm clock that watches your heart rate and wakes you up to 30 minutes early based on your natural sleep cycles is very nice.  Even if you turn off the smart alarm, having a quiet alarm that doesn't wake your partner is an awesome feature.

Stopwatch / timer
Love it.  Having a timer that quietly vibrates when it time runs out is wonderful in general.  It's a particularly nice way to end meditation, or notify that your coffee's ready no matter where you are in the house.

Clasp
Love it.  I like the looks of the Band, but the clasp is particularly well designed.  The Vivofit would pop off my wrist about once a week.  The Band easily tightens or loosens with one hand, feels solid, and looks nice.

Step goal buzzer
Like.  The ability to set my own step goal (which you can't do with Vivofit) helps compensate for under-counting steps.  I just set my goal for 7,000 steps and pretend it's 10,000.  The watch vibrates when I hit my goal.  I feel a bit like pavlov's dog, but it's motivational nonetheless.

Stairs counter
Like.  Watching that number go up as you ascend stairs when you could have taken the elevator is kinda nice, particularly since walking up is harder but grants no additional steps.

Sleep monitor
Like.  Seeing the quality of my sleep immediately when I wake up helps me to link my actions during the day (caffeine intake) to sleep efficiency.

Workouts
Like.  Vibration alerts when it's time to switch from sprinting to jogging and back again during a pre-programmed interval workouts is nice.

Phone/e-mail integration
Like.  Seems like a gimmick until you catch an important call or e-mail that you might have missed while you were heads down coding up a storm with headphones on.  Fortunately, you can make it buzz for only a short VIP list.

Open Data
Like.  While Garmin makes it hard to access your data, Microsoft makes it easy.  Band allows you to sync to all three of the most popular mobile phones OS's and to easily share to a variety of popular sites like RunKeeper and to easily export all your data to CSV.

Microsoft Health App
Dislike.  The phone app works, but it barely show any data.  You have to view the Microsoft Health web site for that, and it isn't mobile friendly.  Fortunately the site is great if you aren't mobile.  It makes the mass of data easy to comprehend and navigate, unlike Garmin's.

Battery life
Sucks.  I knew going in that battery life would be miserable compared to the Vivofit's 1 year battery life.  The Band 2 can go 48 hours without a charge.  That's actually great for the form factor and capabilities, but I would be much happier if Microsoft could break the laws of physics and make it last a weekend.  Buy an extra charger for the office, you'll need it.

UV Sensor
Gimmick.  I'll apply sunscreen before going to the beach, thanks.

Starbucks app
Gimmick.  Saves no time over the phone, and often doesn't read well.

Summary

Is the Band the device for you?  Honestly I almost returned mine.  Pedomofail bothered me that much.  But I'm over it.  It's fairly consistent at least.  And unlike an Apple Watch, for instance, the Band has all the sensors it will ever need.  Theoretically it's only one firmware update away from being perfect.  As you read this, perhaps it already is.

But $350 isn't cheap.  If you don't know whether step data will motivate you: get a cheap Fitbit or Vivofit.  As for me, I'm actually growing to love the device, despite its shortcomings.  I think I'll keep it.

12/11/2015 Firmware Update

Version 2.3.11209.0 was just released.  It adds music controls and activity reminders.  Nice features, but sadly the step counter is still wrong.  Today I logged 12,672 steps on the VivoFit and 10,010 on the Band.  That's a 21% loss.  An improvement, perhaps, but still seriously lacking.