谈谈移动技术
2015-08-02
移动互联网
手机改变了人们的通讯方式,手机上网则改变了人们的生活方式。随时随地接入网络的可能性,催生了无数的新鲜事物。如果要找一个移动互联网真正进入人们生活的标志,我觉得应该是 2007年第一代iPhone的发布。那时起,手机上网才真正有了大部分人乐于使用的体验。2007年到现在已逾8年,我们来看看这8年我们有些什么更美好的改变。
正在发生
-2014年中国整体网民增速下降到5%,但是移动网民增速持续维持在10%,达5.6亿,约占中国总人口的43%,未来依旧有很大的发展空间。
-2015年第一季度,微信的月活跃用户已经达到5.49亿。
-2015年春天,Apple发布了Apple Watch,在持续热卖2个多月(你需要预订并等待几个礼拜才能拿到货)之后,终于在暑假之季Apple“解决”了产能问题,顾客可以实体店买到这款时尚科技产品了。
-2015年WWDC,Apple宣布Swift并会在将来某个稳定版本开源。据信可能会是在 2016年。这意味着,这门语言不仅仅只是一门 Apple 的面向客户端开发专用语言,可能会演化为更通用的语言。
-2014年底,我们获知Go可能成为Android的原生开发语言。Google的部分工程师和部分独立开发人员提出了几份不同的提案,旨在让Go语言支持开发原生的Android应用。据悉,这项工作会存在一些困难。即使无法让Go语言编写的应用使用Android NDK的全部接口,但有可能使用其中一个子集。现在看来,Google在Android发布时没有选择Go而选择Java作为开发语言可能是个有利有弊的决定,当然弊端是长期发展后才体现出来的。现在看来,Java对于Android来说已经有历史包袱的意味了。
回顾一下历史
早期智能操作系统
除了功能手机基于Linux的操作系统之外,称得上智能操作系统的有:Windows Mobile,Symbian,Blackberry。但在iPhone出现之后,这些系统的手机都相形见绌。
跨平台解决方案的努力:J2ME
J2ME应该是移动设备上唯一一个获得了一定程度成功的跨平台解决方案。在功能手机的时代,操作系统控制在各个生成厂商手中,市场中没有拥有绝对话语权的厂商,除了Symbian,没有值得开发者为其定制开发的操作系统了。那么这样的跨平台解决方案几乎是手机唯一选择。为了能在各种性能受限的功能机上运行,J2ME在设计上就做了很多折衷。在功能机时代这可能是个合理的选择,但当iPhone出现时,所有的东西都显得那么陈旧和落伍。
iPhone 重新定义了智能手机
就像其它Apple产品一样,iPhone不仅仅只是一个通讯工具,还是一个时尚符号。iPhone抛弃了实体键盘,引领了大屏幕,全触摸屏的发展趋势。iOS全新的人机交互设计,使得手机朝着更自然的人机交互体验发展。App Store创造了一个全新的生态模式,使得开发者可以方便地分发应用,获取收入。而iPhone用户则可以下载到各种各样的应用。
Android 普及了智能手机
Android在产品和设计上并没有突破iPhone的窠臼。但由于Google为Android所选择的独特的商业模式(Android可以被其他手机制造商所使用),使得Android成了很多手机制造商的唯一选择,因为有能力开发智能手机操作系统的厂商并不多。顿时进入市场的门票便宜了低了很多,三星,HTC,以及很多中国手机制造商借此进入了市场,占据了部分市场份额。大量厂商的进入,整体上拉低了Android手机的售价,促进了智能手机的普及。
现在的格局
iOS 和 Android 双雄并立
在移动市场份额上看,Android以80%占据了绝对优势。iOS以15%的份额其次。Windows Phone,BlackBerry,Bada等其他系统共享剩下不到5%的市场份额,可以认为它们基本已经退出了市场的竞争。移动设备市场基本已经是Apple和Google之间的游戏了。
虽然,iOS的市场份额远远低于Android。但在移动市场上,Apple却拥有着巨大的影响力。Android阵营却没有获得和市场份额相匹配的市场影响力。
一方面,Apple基本占据了高端市场,从而获取了整个智能手机市场50%以上的利润; 另一方面,Apple控制了iPhone手机制造和iOS系统的开发,从而可以提供了整体一致的用户体验。使得Apple在产品层面上一直处于领先地位,引领着移动市场的发展。在平板,可穿戴设备领域,Android的表现乏善可陈,没有令人印象深刻的产品;iOS却成功推出了iPad,和Apple Watch。
在Android方面,一方面,Google仅仅控制了Android系统,却不从事大规模的设备生产(在收购摩托罗拉之后又将其卖给了联想)。所以,无法提供软硬件无缝的整体体验。这使得Android设备在使用体验上一直处于劣势。 另一方面,三星,华为、联想和其子公司摩托罗拉、LG电子、小米和中兴等手机制造商分享了Android设备的庞大的出货量。分散的硬件制造商使得厂家没有力量推动战略性的产品。更麻烦的是,这些厂商相互之间还存在着竞争关系。Android系统的分裂状况也缘于此。
iOS 和 Android 相互融合
虽然互为竞争对手,但iOS和Android却越来越相似。相对于Windows Phone,iOS和Android有着更近似的设计语言。不知道是因为未来已没有悬念,还是因为双方都缺乏想象力,看起来他们在对未来发展方向的判断上是趋同的:iPad对Android平板,Apple Pay对Google Wallet,Apple Watch对Android Wear,CarPlay对Android Auto,在平板设备,移动支付,可穿戴设备和汽车系统领域,Android和iOS都完成了对标。
手机之后,手表还是汽车?
在可穿戴设备领域,Google做了很多尝试,他们最先推出了Google Glass,而后推出了Android Wear。但无论是眼镜还是手表,Google都没有推出令人眼前一亮的产品。反而是Apple在2015年春天推出的Apple Watch,以时尚外观,和流畅的使用体验获得了消费者的追捧。
在2015年6月的WWDC,Apple宣布将发布Watch OS 2。新的WatchOS 2看上去更像是一个独立的操作系统了,它拥有独立的WatchKit,可以开发原生Watch Apps,无需依赖iPhone来运行应用。Apple有意将WatchOS和OS X,以及iOS并列,使得手表成为Apple产品线中的更重要的一环。由于Apple Watch的成功,Apple在可穿戴设备上取得了领先。
Google在汽车系统方面则占据了更有利的位置。由于在地图,导航,无人驾驶技术方面的储备,使得将Android系统延伸到汽车上变得更容易。Apple发布的CarPlay将在一些新生产的汽车上搭载,但这个系统只是使得在驾驶汽车时使用手机上的应用变得更为容易,还并不是一个真正的汽车操作系统。
Google的无人驾驶技术则令人影响深刻,这是一个可以真正改变汽车的技术。如果,无人驾驶技术得以实用,对人们出行方式的改变将是空前巨大的。
移动开发
作为一名移动领域工程师,这应该是最好的时代。市场竞争激烈,时时刻刻都有新的产品涌现。产业环境发展迅速,时时刻刻都有新技术出现。变化与发展,对每个人来说都意味着机会。如果,能够理解社会,产业,技术的发展方向。提前储备,甚至催生变革的发生,都能带来成功。
相对于传统互联网后端和前端技术几十年的积累,移动端的各项技术还显得很年轻。一方面移动技术领域仍然有很多亟待发展的地方,但是另一方面移动技术发展的速度也是异常迅速的。对于开发者而言,一方面需要面对很多挑战,但另一方面也意味着大有可为。
设备多样,平台分裂
我们现在要面对的设备:
- 各个尺寸的iPhone手机
- 两个尺寸的iPad平板
- Apple Watch
- 纷繁复杂的 Android 手机或者平板
- Android Wear
我们现在需要面对系统平台:
- iOS
- Android
- Android 各种衍生(Amazon,小米,华为,魅族等)
- Windows Phone
技术挑战重重
技术发展迅速
不同于桌面操作系统基本已由微软一家控制,Google和Apple之间仍然存在激烈的竞争,这促使双方都在以极快的速度推出新功能,完善自身产品,在新领域布局。所以,移动技术领域的发展也非常快。
Apple和Google都有更新其主要开发语言的动作,Apple已经将大部分精力从Objective-C转移到Swift上,Go语言也许可以成为Android的开发语言。
腾讯基于微信创造了全新的移动互联网生态圈,国内很多开发者需要面临在微信中开发应用的挑战。
仍然没有统一的解决方案
任何时候,开发都在寻求一个大一统的解决方案。移动开发者会羡慕,Web开发者只需要面对浏览器这一事实。即使有不同厂商的浏览器,它们确实在细节实现上有些许不同,但仍然大体遵守着一个相同的标准,可以运行相同的语言:HMTL,CSS,JavaScript。这在现在的移动领域还不存在。
和传统互联网以Web为主的形态不同,由于早期手机浏览器性能限制,和已经形成的App形式的分发渠道,移动互联网是以App为主的。Apple和Google都有自己独立的技术生态系统。大部分App虽然有着相同的界面,但是都需要在iOS上和Android上各开发一遍。这无疑是一种浪费。Web技术在开发UI这件事情上已经积累了十多年,HTML,CSS,JavaScript的组合仅在开发人机界面这件事情上应该比任何原生语言都要优秀。而恰巧移动开发的大部分工作就是在开发人机交互界面。所以,在移动领域使用Web技术的尝试一直没有停止。
但直到现在,Web技术和Native技术之间的选择仍然会是一个两难选择。在比较长的一段时间,Web和Native会是共同存在的解决方案。我们不得不面临在一个项目中使用混合技术的情况。在某些场景下使用Web技术,在某些场景下使用Native技术。
这是因为虽然Web技术有着不少优势,但是仍然存在:
- Web仍然无法解决所有问题,一些场景仍然需要借助Native。
- 一些Android设备对浏览器的支持仍然不足,Web界面的使用体验仍然比较糟糕。
- 现有分发渠道的限制。现有Apple和Android分发渠道都要求软件是一个App,即使是一个大部分代码使用Web技术编写应用,如果要发布,仍然需要一个原生代码的浏览器外壳,以伪装成一个App。
缺乏最佳实践
移动端开发中,无论是选择Native还是Web,我们并没有发现业内公认的优秀框架。一些大一些的公司做了一些尝试,比如,Facebook推出了React Native,但是还没有获得广泛的认同。
在PC时代,无论Server端还是前端我们都会先选择一个框架来帮助我们完成一些繁琐的底层工作。这些工作在每个项目中可能都是重复的。开发者使用一个相同的框架,有助于缩减代码量,防止重复劳动。
在Server端,如果选择了Java,框架可能就是Seamless;如果选择了Python,可能是Flask;如果选择了Ruby,可能就是Rails。前端则会是jQuery。
但这样的事情,在移动端开发中还没有出现。在稍大一些项目的发展过程中,开发者们会逐渐抽出一些公共的代码,慢慢形成一个项目的底层库。但这些底层库大部分都是和特定项目绑定的,很少有可以给大部分开发者使用的框架。
这里有一个例外是手机游戏的开发。在进行手机游戏开发之时,一般会选择一个框架,Unity或者Cocoa2D是相对常见的选择。这与手机游戏开发的人机交互界面基本不会使用系统提供的界面有关系。
开发环境改善
随着时间的发展移动开发领域的技术积累也日趋丰厚。对比2008年iPhone刚刚问世时的移动开发者所面临的问题,现在的开发者是相当幸福的。现在的开发环境已经日趋完善,几乎绝大部分共同问题,都可以在github上找到已有的库。
当然,和 PC 端的数十年积累相比,移动端的开发环境还有些稚嫩,但是,不可否认是,进步每天都在发生。移动开发者在面对快速发展的移动技术时,挑战更大的同事,工作也越来越便利了。
第三方库日渐丰富
虽然框架级别的解决方案不多,但是细分领域的解决方案却越来越丰富。仅以iOS为例,举一些例子:
- 网络访问:AFNetworking
- 数据层:Mantle
- 图像处理:GPUImage
- 图片缓存:SDWebImage
- 数据库封装:FMDB
几乎大部分领域都已经存在了较好的解决方案,这大大降低了移动开发的难度。
开发流程支持日渐完善
随着时间的发展,为开发的各个阶段服务的工具都相应出现了:
- 项目依赖管理:Cocoapods(iOS);Gradle(Android)
- 单元测试:Kiwi(iOS);JUnit(Android)
- beta测试:TestFlight(被Apple收购)
- bug监控:Crashlytics(被Twitter收购)
- 数据统计:Flurry Analytics;友盟
- 性能监控:OneAPM
这些工具构筑开发高质量大型的App的基础。使得整个移动开发的生态环境越来越好。
开发者的黄金时代
这应该是一个美好的时代。新创造层出不穷,时刻都会出现能改善我们生活的创新。如果,能抓住发展中所涌现出来机会,就意味着成功。对于开发者来言,适应这个时代最好的态度就是拥抱变化:
- 好奇开放:充满好奇心,以开放心态了解世界正在发生的事情;
- 热爱学习:充满热情地学习新事物,新技术;
- 捕捉趋势:大胆想象未来,如果有实力,就去催生更美好的未来的产生。