Zenny Chen访谈: iOS开发者应该关注Metal
CocoaChina: 请问您是如何与iOS开发结缘的?
Zenny Chen: 我是在09年注册的CocoaChina,当时感觉这家论坛对于OS X以及iOS开发相关主题都做得很专业,于是也兴高采烈地加入于此,与大家共同探讨OS X与iOS开发相关话题。我之前从事过嵌入式设备的驱动开发以及功能机的应用开发,所以对底层硬件部分也是比较熟悉的。2011年11月正式开始进入移动互联网产业。
与iOS的结缘说来也很离奇,我2008年的时候打算做游戏,甚至有想做游戏进行创业的念头。可是没有很明确的目标,到底为哪个平台开发游戏呢?我了解过了Sony、任天堂等,授权金相当吓人,小微企业根本就无法承受,而且审核也比较严格,入门门槛相当高。后来无意之中就发现了App Store,对其做了很多相关了解之后,在2009年5月买了我人生中第一台Mac——Mac Mini,当时花费了4988元人民币,然后就开始走上了iOS开发的道路。
CocoaChina: 您曾经举办过Swift的讲座,如何看待这门语言?需要现在开始学习吗?
Zenny Chen: Swift语言感觉出得有些仓促,从Beta1出来到现在改了很多东西,比如一开始数组类型是type[],现在则是[type]。当然,这 无法掩盖其先进性。Swift是我目前所见过的为数不多的支持元组(tuple)以及closure等诸多动态特性的编译型编程语言。Swift中的 closure与C++的Lambda、LLVM Clang C扩展的Blocks、Java的Lambda表达式不同,它的表达方式更精简,而且就是函数式的,非常地expressive!所以你在用Swift的 时候就感觉既像是在用类似于Python这样的脚本,又像是在用Scheme这种函数式编程语言,同时又含有面向对象特性(当然,这个在Python、 JavaScript等脚本语言里都有)。
Swift是一个很庞杂的编程语言,其复杂度仅次于C++,远高于C与 Objective-C。不过,正由于它可以采用多种编程范式,所以程序员的入门门槛其实比较低,我将在10月中旬举办的关于Swift编程语言的公开讲座也将会邀请一些没有什么编程经验的产品经理、策划、甚至美术等。而且结合Xcode自带的Playground,学习起来也绘声绘色,饶有情趣。而你要精通它,知道它所有坑,那也需要花费不少时间精力,并且自己也要正式用它做过几个项目才行。
我觉得使用Swift进行开发会成为普遍的趋势。正如我之前所描述的,现在不少公司仍然以iOS平台为主打,所以美术人员往往会以 iPhone/iPad屏幕为基础进行设计。如果它们能直接把图切好,放在storyboard里,然后用swift编程来看实际运行效果,那应用开发者的压力你想想,不就减轻很多了嘛。而且在以前,美术人员把图切好后,还要自己量坐标,再告诉开发人员,在沟通上也存在一些额外成本,如果美术人员自己把基础界面整好,其实对于他们而言,并不会增加太多工作压力,反而会感觉更有趣,更有成就感。
所以我认为今后iOS开发的场景将是,iOS职业开发者可以结合Swift与Objective-C为美术、产品人员做好最简单的接口,然后它们在应用里 直接调用这些封装好的库函数就能马上看到界面效果,这样整体的工作效率都会得以提升,尤其结合playground,真正做到了所见即所得~
CocoaChina: iOS 8开放了很多新特性,推出了许多API,您最关注的是它的哪些特性?这些特性有哪些特别之处?
Zenny Chen: 让我感到比较有趣的是App Extensions与Handoff。关于App Extension,现在App Store里已经有备受大家欢迎的搜狗输入法还有百度输入法。这个应该说是iOS一个非常具有革命性的特性,也打破了Apple之前一直非常保守的态度。 而Handoff也是很有趣的特性,它可以让你在一台设备上使用应用时,在另一台设备也无缝地呈现出当前的活动,这个感觉很有意思。
而比较实用的新特性有PhotoKit、HealthKit、HomeKit以及CloudKit。HealthKit结合Apple Watch能搞出不少好玩的名堂出来。而HomeKit对于智能家居领域会有所帮助;CloudKit是一个好东东,用于在线同步数据。CloudKit 尤其对于一些小微企业来说是个很好的工具,有些偏向单机的应用直接使用CloudKit就能进行数据存储与传输,不需要自己来搭建服务器。
当然,对于像我这种底层狂热分子,最让我激动的还是Metal,呵呵。
CocoaChina: 你之前是否开发过游戏应用,对SceneKit、SpriteKit是否做过了解?如果有的话能否分析一下苹果为什么会推出它们?
Zenny Chen: 我之前业余时间搞过些小游戏,也做过一些简单的游戏引擎。SpriteKit之前用过,就目前而言,功能上跟Cocos2D-X比起来还是要弱不少,当然其优势是能直接用Objective-C和Swift进行开发,另外也有自己的粒子编辑器,使用起来也比较方便,但是性能上似乎还有不少改进空间。SpriteKit在iOS7.0开始就有了。而SceneKit是8.0新增的。SceneKit主要提供了描述3D场景的上层接口,并提供了一些3D模型的导入、材质、光照、物理碰撞、粒子效果等。不过我现在还没开始尝试使用,所以对其运行时性能等表现还不得而知。
我觉得Apple之所以推它们,还是为了吸引开发者为App Store注入新鲜血液。你想,Android提供的工具十分有限,所以很多应用或游戏开发起来就相对困难,这也导致了不少公司仍然把iOS作为首要开发目标平台,而Android则是作为备胎。
CocoaChina: 新的iOS图形处理框架Metal,和OpenGL ES有何区别,能否对其造成威胁?
Zenny Chen: Metal提供了一套比OpenGL更底层的图形接口,而且现在就针对Apple A7或更新处理器的GPU。因为从PowerVR 6系列开始,GPU真正拥有通用计算能力,使得Metal在这版上就引入了Compute Shader,这点是相当不错的。而在OpenGL ES上要在3.1版本上才引入Compute Shader。正是由于对Apple A系列处理器的GPU量身定做的,因此Metal会比通用的OpenGL ES执行得更快,而且库容量也更小,即库的代码更轻便。
这次在Metal特性的介绍中我们也看到了,Metal对Draw操作功能的优化效果非常显著。 Metal的API更类似于OpenCL,尽管是用 Objective-C封装的,不过即便是用纯C语言来(满足LLVM Clang扩展的GNU11,包括对Blocks语法的支持)封装也将十分方便。而且整套API用下来,我感觉逻辑很清爽,没啥冗余,就是整条渲染流水线 的操作步骤,呵呵。而且只要你懂点 OpenGL还是很快就能上手的。
至于对OpenGL ES的威胁,Apple毕竟不是微软,因此对于开放标准还是会给予大力支持的。我认为今后在iOS上,Metal将会与OpenGL ES共存。而Apple将不太可能在iOS上引入OpenCL了。大家如果想在iOS上借助GPU做高密集通用目的计算,那么可以直接使用Metal的 Compute Shader。所以,我个人认为,Metal的引入其实也是开辟了通向GPU通用计算领域的新道路。
我用过 DirectX(9~11)、OpenGL(2.1~4.1)、OpenGL ES(1.1~3.0)以及Metal,目前感觉Metal最好用。不过就API封装层面上而言,Objective-C确实将简洁与强大融为一体,这或 许也是我感觉好用的原因之一罢~当然,如果大家不习惯用Shader写顶点计算与像素计算,那么仍然可以使用OpenGL ES1.1。Metal是不提供类似OpenGL ES1.1里的固定流水线的功能的。所以就这一点而言,我也认为Apple不会废除OpenGL ES。
CocoaChina: 你在开发的过程中使用过哪些开源项目?使用过程中遇到过哪些问题?
Zenny Chen: 我现在开发过程中用到的开源项目比较少。比较大的是FFmpeg,这个用于处理音视频的,在Mac上使用。而在iOS项目中我就用过minizip用于文件压缩解压,以及Cocos2D-X游戏引擎。其实使用第三方开源软件主要问题就是众所周知,iOS更新速度比较快,而不少开源项目维护了2、3年可能就不维护下去了,然后iOS一升级就是各种bug,各种崩溃。所以只有自己掌握的代码才是最有保障的。我对于我的下属的要求很简单,尽量避免使用第三方的东西,如果用了,也必须了解里面每一行代码都在做什么,便于后期维护。当然,像Cocos2D-X这种有大公司不断维护的项目, 我们倒是可以放心地使用。
CocoaChina: 学习CPU、GPU等底层技术对iOS应用的调优有何帮助?从提高性能方面,iOS应用有哪些优化的技巧?
Zenny Chen: 其实对于普通的应用而言,针对CPU、GPU底层技术的性能调优没啥太大帮助。正如我在讲Metal的时候提到的, CPU、GPU的底层技术的性能调优主要是针对高密集计算,比如大规模矩阵乘法(像1024x1024),还有图像处理(滤镜、边缘检测、平滑等)、机器 视觉领域、视频编解码(比如MPEG-4、H264、H265、VP8等),除此之外就是一些科学计算,如我们现在炒得比较火的DNN,还有生物科学上的 DNA解析,还有分子动力学等。
而对于一些游戏之类的而言,大多依靠游戏引擎,所以优化的余地也不大。对于大部分应用的优化,目前主要手段还是通过多核多线程的并行来提升计算性能。另外像网络通信这块可以放到用户线程而避免用于处理UI的主线程受太多干扰。
CocoaChina: iOS开发者应该如何规划自己的职业发展路线?除了iOS之外,是否需要学习其他方面的技术?
Zenny Chen: 这个问题问得很好。我工作快有10年了。而iOS职业开发也就刚做满3年,呵呵。其实我觉得如果大家想往技术方向发展,那么首先要做的还是把基础打好。把基础打好之后,能应付各种新的编程语言,各种处理器、各种操作系统平台。所以我建议大家在业余时间里把传统的大学里所学的科目再巩固好,比如操作系统、数据结构、数理逻辑、计算机体系结构、汇编语言、C语言、网络通信、数据库。此外,大家也可以再熟悉一下HTML5相关技术,毕竟iOS所涉及的大多数都是移动互联网领域,所以有点HTML5知识的话会更好些。如果自己感觉C语言学得还不咋样可以再巩固它。C语言就是计算机编程领域里的数学,是所有类C编程语言的鼻祖语言,而且从TIOBE排名上大家也能看到,它目前一直处于第一位。另外,Objective-C完美无缝地兼容C语言,就从这点上来说,C语言仍然是十分重要的。
C、Objective-C与Swift的关系是:Swift是对Objective-C的封装,尽管这封装得改动很大,以至于你确实看不出它仍然是类C 语言;而Objective-C则是对C语言的封装,在C语言的基础上又添加了面向对象以及反射动态特性。所以,学好了C对于iOS开发来说非常有帮助。
上述主要是讲iOS职业技术开发者如何能进一步提升技术能力。其实归根结底,就是把基础打好,然后可以尝试去专某一更专业的领域,比如通信领域、3D图形领域、图像识别领域等。因为大凡做iOS的基本都是在应用层上捣鼓,应用层老实说做个一年两年能基本掌握,再继续下去对技术提升不大。
有些iOS开发者想要提升自己在公司的地位,我觉得很大程度上取决于自己对所在公司的核心业务的了解情况。对于中小企业,产品设计人员以及策划不可能把产品描述得很细,有不少地方需要开发者对设计意图做思维扩展。如果你对自己公司的企业文化、工作流程、核心业务逻辑都能很好把握的话,就能够做出超出期望的产品,再加上好好处理人际关系,要提升地位也不会是很困难的事情。
当然,我碰到比较多的还是很多年轻的开发者对未来感到迷茫,不知道今后的路该怎么走。所以,我认为对于那些开发者自己先把心沉静下来,然后把基础打好,然后思考自己今后的技术走向。毕竟,iOS开发在很长一段时间以内都将是热门的技术岗位。