The Linuxification of Webapps
If you read this, you certainly know I'm a big fan of web technologies, especially CSS3. Those
technologies are very easy to learn and to use, damn powerful and accessible
on almost all modern devices. Building apps with them sounds like a great
deal. Spoiler: it's not.
I've been waiting for so long the moment where web apps would be as mature
as native apps, hoping each browser release could be a game changer. This
moment hasn't come (yet) and I'm afraid it just won't come any soon. I see
today web apps just like Flash and Linux for end-users: next version will
finally bring all the awesomeness the world has been waiting for. But this
moment actually never comes. Let me try to explain.
Tools. There's nothing comparable to a framework such as
Cocoa on the web, period. Of course, we've seen a few initiatives here and
there (SproutCore, Cappuccino, Sencha, ...) and I have a huge respect for
that work but let's be honest: they're still definitely behind Cocoa.
Plus: if you're somehow sensitive to user experience and stuff like that,
you'll quickly notice the effects and animations those frameworks produce
are very different from the native ones they try to replicate and well,
far inferior too. The situation gets even worse with mobile web
development where you just have nothing to help you debugging your app
(Mobile Safari's console is a big joke). Yes, those tools will probably
evolve, but by this time you'll be able with Cocoa to send a fucking space
shuttle on Pluto.
Technology. Not suited for apps. Semantics in HTML5?
Bullshit. Be pragmatic and tell me just one reason to use a
nav element instead of a meaningless
we all like to write semantic code because it looks pretty but let's face
it: there is not a single use of those semantics in any product, assistive
technology or even browser (in theory, Mobile Safari could for example
gets all the links in your
nav element and automatically
display them in a typical iOS list view, but it doesn't and it probably
never will). Those elements are useless for developers. I mean, you don't
have access to a more suited API when you create a
instead of a
div. You can perform the exact same events on
both and style them the exact same way. That sucks. I could also write
like hundred lines explaining how buggy CSS animations can be (blinking
bugs, font aliasing issues, ...) but you have the idea.
Performance. It's super easy to produce a shiny demo
working well on any modern device with web technologies. I've been doing
quite a lot of experiments myself and they may look impressive at first
sight. But: a tiny demo doing just one thing is incomparable to a real,
complex app. You might think if it works with 100 lines of code it will
work with 10000 as well but it's just not true. Performance gets shitty
over time and even being aware of best practices in CSS animations and DOM
manipulation doesn't help much. I'm not even talking about games here
where, basically, web technologies are nowhere yet (try to create
something like Tiny Wings on the iPhone). Also:
mobile is probably the laggiest thing on Earth.
Device. You had a revolutionary idea for the next highly
successful camera app? Well, forget it. Sure, the W3C is working on the
standardisation of the device API but let's be honest: it's not like for
OS integration. VoiceOver. Notification Center. Address
Book. Upload from your Photos library. Forget them and thousand others.
Your app won't be able to use them.
The Crossplatform Myth. When you try to reach a decent
quality with your app on, let's say, iOS, you'll use a lot of proprietary
stuff. You'll move elements with
cool effects with
-webkit-box-reflect, add a home screen icon with the
appropriated link tag, and so on. Guess what: none of those
properties are available on a Windows Phone with a
prefix (and not even on the upcoming desktop IE actually). Making your
code compatible (not even great, just compatible) means way more than
adding a few alternative styles. It implies to rewrite from scratch
several features with a whole different logic. Browser innovation is
essential but "build once run everywhere" is a myth (at least if you want
to reach a decent quality).
I'm not even talking about the streamlined payment process the App Store
provides or the marketing boost Apple can give your app by featuring it, I
really try to keep the focus on development and user experience here. That
user experience is the most important thing about your app, and that user
experience is by design better with native apps.
Take the iPhone User Guide for example. It uses web technologies to
replicate a simple iOS-like navigation using a similar style. It's made by
Apple, they know their own platform better than anyone. Thus, you can expect
a perfect result for such a tiny app. Well, it's not. At all.
I'm not saying we should stop creating web apps. They're very useful in many
cases (I don't want to install an app for a one-time hotel room reservation)
and they'll certainly always be there. They're also less expensive if you
want to reach multiple platforms (and you probably want to). But for most of
the apps we use everyday, a "good enough" experience is not good enough
anymore. People expect quality, Apple has set new standards. Do your
customers a favour: stop experimenting, ship quality.