十年一顾,iOS 与 Android 这样改变了我们

我从之前对智能设备一无所知的小白,到体验过无数智能设备的过来人;从只知 Hello World 的学生到解决无数 Android 开发问题的工程师;从 naive 到 sometimes naive。从一开始因为对 Android 基础知识的不甚理解,做了很多愚蠢的实现,踩了很多坑;到后面入了 Android 相机这一大坑,兼容性问题导致始终无法达到想要的最佳体验,仍然没有看到尽头……

当前,我正在进行图像、视频相关应用的开发,不仅仅关注普通应用层的开发技能,对图像视频领域的内容也有了更多的关注。最近从零学习移动端的 OpenGL ES 相关知识,基于相机模块的动效、滤镜有了更多的理解。同时,也在关心并学习人工智能、机器学习相关的知识,希望能够跟上节奏,掌握一些基础知识,并尝试在项目上进行落地实践。

至于将要到哪里去,我也不知道,同样有很多困惑,不知道坚持的是否要继续坚持,也不知道该放弃的是否早该放弃。2011年6月毕业找工作之前,目标很明确,我要加入移动浪潮,从事 Android 应用开发。面对实习机会、面临 Offer 的选择时都很容易做出判断并为之兴奋。而作为应届生在加入 HTC 时,虽然薪水很低却很有冲劲,为自己在最好的 Android 手机厂商工作感到高兴。但是在快满两年时萌生去意,一心只想去一线互联网公司,很幸运在2013年加入鹅厂,头半年感觉写了超过前两年的代码,头两年又感觉不知疲倦地在提升自己的编码技能,写了很多代码,也写了很多 Bug,修复了很多 Bug,写了很多技术文章,做了很多分享,认识了很多圈内有趣有才华并超努力的小伙伴。最近两年相比之下低调了许多,有故避锋芒的原因,也有自己遇到瓶颈后调整心态,适应团队的需要,不再只关注自己的成长,多了对产品、团队的正向积极思考。

有人说:人生不可能一直是一条上升的曲线,会有高潮也会有低谷。在有些阶段很容易直接看到显著的成绩,但是同样在很多看似非直接增长的阶段,重复训练,非抱怨坚持,专注团队贡献,收获的则是更加成熟的心态。如今已是我在鹅厂的第五个年头了,吐露自己的真实工作感想,勉励自己继续前行,也希望对同行有所帮助!

从业至今,我从一个职业程序员转变为一个独立开发者;从高效率解决命题的程序员思维,转变为创造性满足需求的开发者思维;从一个只对技术感兴趣的极客,转变为探索世界发展规律的思考者。

在移动行业摸爬滚打多年,犯过的最大一个错误就是 —— Mobile First。“移动”本质上只是一种形态,一条路径,一个解决方案,而不是趋势的内在本质。如果被 Mobile First 绑架了思维,则很可能在快速变化的发展中迷失方向。当我彻底摆脱了这一思维束缚后,才认识到过去十年的“Mobile”本质上是在充分发挥手眼协调的交互形态下,对信息接收和响应效率的一个优化实践。从这个认知出发,未来我们还可以进一步调动和挖掘更多交互形态对上述效率的补充和再平衡。

当前,我正在重新思考信息社会的基本生产关系,试图从深层次理解“付费”、“盗版”和“共享”交织下信息时代的价值根基。技术上,关注和研究去中心化和社会工程学在互联网环境的实践。

也希望能够做一个跟随自己内心疑问的思考者,把积累多年的开发技能和运作经验运用于实践自己的思考。同时,想分享给其他立志成为独立开发者的同学,除了掌握人机沟通的计算机语言之外,建议选修经济学和心理学。前者让你理解驱动这个世界的运行规律,后者让你通晓左右这个世界的复杂人心,掌握它们,你就拥有了守护麻瓜世界的魔法。

我毕业于2012年,也正是在这个时间前后,Android 手机井喷式发展,国内外各大厂商都投入了大量的资源来研发手机。在国内,Android 市场需求越来越大,这也导致了各大公司对程序员的需求越来越大。在那个时候,Android 程序员比较稀少,物以稀为贵,薪资也水涨船高。

在2012年下半年,我正式成为了一名 Android 程序员,接触 Android 的一刹那,我觉得喜欢它。可能是由于我比较喜欢做有界面的东西,而 Android 开发刚好契合了这一点。我花了一个月时间入门,然后就开始在公司里写代码了。

后来,我来到了北京,开始了自己的 Android 学习的旅程,我疯狂地学习、在 CSDN 写博客,短时间内,我的 Android 开发水平有了一定提高。再后来,我做了一些开源,还写了一本书《Android 开发艺术探索》。

而在学习技术的过程中,大家都是从新手一步步来的,最开始我也犯了一些错误。虽然现在回想起来非常好笑,但是当时的确是不会啊!其中,有两个问题印象比较深刻,一个是 View 的滑动冲突,早期时学习资料比较匮乏,也找不到很好的学习途径,所以我从网上下了一个侧滑菜单的 Demo。但是这个 Demo 有问题,如果在内容区域放一个 ListView,就会有滑动冲突,Demo 的作者解决不了这个问题,我自己查了很多书和资料也解决不了,那个时候这个问题真的很难,后来经过仔细钻研才解决了这个问题。

另一件事情就比较搞笑了,我在刚接触 Android 时,认为 Runnable 等同于线程,所以 View.post(runnable) 这个 API,我就以为这个 Runnable 会跑在子线程中。后来我才知道其实这个 Runnable 是运行在主线程度的。

到如今,我已经做了5年的 Android,应用开发和架构等也都接触过了,现在的计划除了继续 Android 开发之外,还需要多了解其他东西,毕竟广度也是很重要的。

其实深度和广度从来都不是互斥的,一个比较好的状态是:精通1-2个领域,其他领域都懂一点。但在优先级上,深度比广度更重要,深度决定专业程度,而广度决定着你的技术视野。大家做技术,当深度达到一定程度后,就需要加深广度了。或者说你觉着自己广度还行,那可能就需要补补深度了。

十年前,我还在读高中,当时用的手机是波导,作为学生最常用的通讯手段是飞信+短信,至今我还备份着当时的短信记录。后来读了大学,有了第一部智能手机 E71。工作之后开始使用 Android 和 iPhone。至今还能记住 Symbian 以及后来的 Android 和 iOS 初见时给我的惊艳,同时也感谢这些划时代的操作系统,我现在才能有一份不错的工作。

回首自己的移动之路,印象最深的是实习时刚接触 C++,用 iterator 遍历 list 的时候没有判断end,那个时候 NDK 开发调试极其麻烦,基本全靠日志定位问题,导师帮我排查到凌晨3点找到原因后才回家。

记忆犹新主要有两点原因——有些 Bug 往往是很低级的错误导致,以及很感激我导师的耐心和 nice。

当前,我正在进行移动终端的跨平台开发,而下一步,希望自己能够继续深造现有技术,同时也不断地去了解前沿技术。尽管编程语言可能会慢慢不流行,现有技术未来可能也会过时,但不论世界怎么改变,不变的是编程思想,保值的是技术思维。

所以,接触一个技术领域一定要触及这个领域的本质,取其精华。在不断深挖现有技术的前提下,也要不断了解前沿技术,防止被时代抛弃。

我从小菜鸟变成了拿着保温杯的老菜鸟,从不认为自己是别人所说的大神。求知若渴,大智若愚,始终对技术怀有敬畏的心态。但进入行业至今,忽略了很多技术之外的东西。有时间做开源项目,却没有多给家里打几个电话;有时间看书,却没时间和朋友多聚一聚;有时间写博客,却没时间和同事锻炼身体。

最近的我,正在 Android 技术边界上补充自己,比如 Groovy、Python、Java 语言实现原理等。而关注比较多的,还有 AR 应用开发相关的技术,比如 OpenGL、Unity 等等,因为我相信基于 AR 图像处理技术未来将会越来越普遍。

除了技术之外,还在考虑在其他方面提高自己的能力,比如演讲能力、沟通及管理能力等,作为一个程序员这也是必须要趟的坑。

我从不盲目地追逐最新的技术,而是关注计算平台的发展,比如,PC 到现在的移动开发平台再到之后的 AR 平台。

其实在刚进入这个行业一两年时,是真正困惑技术人员的阶段,到底要不要坚持现有的技术?要不要学习新技术?在我看来 BAT 对各个评级的要求是非常具有参考性的,也就是在哪个阶段我们应该达到什么样的目标和能力。比如,阿里 P7 就要求在某个领域要有专家级水平、五年工作经验及跨团队的协作能力,P8 就要求管理过20人以上的团队,及引领行业发展的技术能力,也就是说,如果没有在一个领域有专家级水平和跨团队的管理经验是不可能到 P8 评级。

所以,我建议,做一项技术最好就要做到专家水平,对比 P7。然后再考虑往其他相近技术领域扩展,也方便提升跨领域团队的管理能力。

差不多十年前,Android 开始公测,出于对 Google 的喜爱,我在第一时间开始学习,并参与了随后 Google 举办的 Android 开发全球挑战赛(ADC),那时,离第一台搭载 Android 系统的手机 G1 发布还有一年多。

虽然比赛没拿到奖金,但这份经历让我机缘巧合地走进了移动互联网的大门,顺理成章地开始做移动开发、研究移动技术、写技术书籍、做 App Store、做各种各样的移动 App。就像站在了一个新世界的门口,感受着移动时代一步步迎面而来。感谢 iOS 开启了移动时代的大门,感谢 Android 让这个时代极速成长,亲历这一切,是个有趣的经历。

十年前,大家对移动互联网的面貌充满疑惑,还在激烈地争论 Android 是否可以战胜 Symbian,一个 Java 做成的系统怎么可能在手机上跑流畅;开发中,需要花大量的时间来优化网络性能,因为大部分手机都还停留在 2G 时代;设计上,需要研究各种外设下的移动应用交互,因为除了触屏,硬键盘、轨迹球都还是主流;手机上每一个字节的内存都极为珍稀,即便是那时最好的手机,内存也只能论 M 来计数。

后来在豌豆荚,我们花很多时间去研究如何让 PC 可以更稳定地和手机连接,因为 PC 还是用户主要上网、获取移动应用的场所;然后,我们开始在手机上做下载库,为了最大化地节约流量,做预取、增量包;我们还会自己做网络库、推送服务、插件方案,花了很多精力做这些现在看上去是造轮子的事情,当时,还都只能靠自己。

这些技术积累,在当年都值得津津乐道,而时至今日,却是鲜有用武之地。很多技术完全不需要了,很多实现方式可以被更好的移动系统、开源库所取代。如果说,在移动互联网时代有什么最印象深刻,应该是这个时代的软硬件技术的进步都实在太快,永远别想躺在温床上吃老本。

如今,十年已矣,我依然还在从事移动互联网开发,创办了一家新的公司叫作“轻芒”,来探寻高品质内容在移动互联网时代如何更有效地分发。并且,选择了微信小程序作为发布产品的第一选择,而不再是 iOS 或 Android。十岁的 iOS 和 Android 虽然越来越强大,但奔跑的节奏已不像年轻时的模样,新的产品机会、新的技术变革、新的可能性,也许,会出现在新的平台上。

十年中,我在 Windows、Symbian、Android、iOS 都做过开发,可以想见,在将来,还会不断有新的平台出现,等待我们去探寻。

从技术趋势来看,新平台开发的硬技能门槛越来越低,以前你不懂寄存器,不懂文件系统,没有扎实的数学功底,都没法从事开发。而今,编程语言越来越接近自然语言,三五行代码就能落地一个漂亮的交互,一个小程序就能跑个复杂的机器学习。对于开发者而言,更有价值的地方源自于软技能的不断积累,乐于学习和了解新的技术趋势,可以持续地去新的平台上构建产品,研究新技术的各种可能性;善于去了解产品的全貌,以便设计更符合未来需求变更的技术框架;能够把代码表述得清晰准确,让维护的成本不断减少,有更多的精力去尝试新的机会,诸如此类。

这个行业最有趣也最有挑战的事情,就是每天去面对新的事物,保持专注,保持好奇,也许是最好面对下一个移动时代的最佳态度。

十年时间是一个很长的跨度了。十年前我才大二,和老婆虽是同班,但也不过点头之交,而现如今都已经拖家带口了。十年前满大街都是诺基亚,我也完全没有想过自己以后会进入到移动开发的领域。而随后到来的移动和智能手机大潮,给这个世界带来的改变远远快于以前。能够进入引领这个时代的行业,可以说是十分幸运的事情。这十年来的经历,对我来说,不管是观察世界的眼界,还是对待人生的态度,都有了升华,也明白了很多担当。虽然我也只是一个普普通通的开发者,但是我始终相信通过自己的努力,可以让这个世界变得更好,哪怕只有那么一点点。

而说到刻骨铭心的坑,在移动应用的世界里,其实很难犯什么大错,顶多可能就是程序崩溃需要强制更新,不会存在什么删库跑路的情况。不过要说起来的话,那就是早期有些时候会有些自负。一方面是年轻,恃才气傲,觉得自己已经很了不起;另一方面是怎么看周围的同伴或同事都觉得不够给力。其实明明自己做的事情并没什么技术含量,偶然的成功大多也是团队努力的成果,自己的力量真的十分有限。而好在最近在审视过去的时候有主动意识到这点,这可能会对我之后的人生产生很大影响。

现在的我,正埋头专心踏实工作,另外也在业余时间纯粹由于兴趣在看一些机器学习的东西。专业之外就是在带娃这场漫长的战役中打好辅助位的角色,负责“买鸡买眼”。 移动开发虽然余波犹在,但显然资本最狂热的时期已经过去。于个人而言希望继续专注技术,虽然不一定是移动领域,但可能还是会进行相关的工作。之前有一段时间很多朋友会问,除了 iOS 之外还需要学些什么?可以看出很多朋友会对此有忧虑,所以我想给出的答案是:还需要学会学习。没有什么是一成不变的,特别是技术方面,日新月异,用不了几年就会改天换地。但是持续一生不断地学习,以及坚持不懈的人生态度,将帮助你永远站在时代的前头。

在做移动开发之前,我是一个服务器端 Java 工程师。从来没有想过一台智能手机能够引起整个互联网行业产生巨大的变化。现在,移动互联网已经深入每一个人生活中的方方面面,我也成为了移动开发者中的一员。

回首过往,我曾经一度认为 HTML5 技术可以取代原生的开发方案。但是就像 Facebook 的 CEO Mark Zuckberg 说的那样,这是 Facebook 曾经犯下的最大错误。一个技术方案的成熟需要时间,或许未来 HTML5 可以统领移动开发领域,但是至少过去不是,最近几年也不是。

在移动互联网的影响下,教育也是一个被改变得翻天覆地的行业,我现在在猿辅导公司负责小猿搜题的产品技术,我们希望用技术改变中国的教育行业,让学生的学习效率更高,并且打破教育资源在地域上的不平衡。

未来无论多么美好,都是当下努力的结果。移动互联网经历了最好的一个十年,未来的下一个十年,它会更加成熟,好的机会同样会有,但是不会像刚开始的十年那样满地都是。于自己而言,我希望能够在教育这个方面做到足够好,打造一家成功的上市公司。

很荣幸在移动浪潮刚到来时就进入了 iOS 领域,移动开发改变了我对很多技术的看法。Apple 每年都会为了推动许多新的技术标准而在 App Store 审核上提出“霸道”的条款,但是回过头来看,确实推动了新技术标准的落地,为技术发展铺平了道路。Apple 时常在技术发展中扮演着“革新者”的角色,无论是全链路 HTTPS、IPv6 支持、64-bit 支持、ECN 扩展协议等,这也在改变着我对这些技术的理解。

另一方面,每年 WWDC 都会有新的技术出现,几乎每年都必须强制适配 App,包括 SDK 接口、Swift 语法等。这种看似“不平滑”的升级策略,也透露着 Apple 对技术发展大刀阔斧的革新气魄。同时也要求开发者及时更新自己的知识体系,也正因如此,强化了我学习新技术的意识。

回首我的移动开发之路,印象颇为深刻的,是有一次遇到一个问题,紧急修复后发版本,之后又在另外的地方出现了类似的错误。在上一次修复时,只是遇到问题处理问题,没有做到相似问题排查,也没有思考如果规避类似问题的长效机制。听说日本有的软件公司,如果修复 Bug,必须同时找出类似的错误才允许合并代码,这就是保证软件质量很有效的方式。

当前,我正在做些 iOS 领域的基础服务,希望能够为更多开发者提供更简单的方式,来提高开发效率,提升 App 的性能、质量,提供更多的最佳实践。

对于我们所有的应用开发者,技术不能只学皮毛,不能抱着“够用、会用就行”的态度。Little knowledge is dangerous!追求卓越,对技术细节做到刨根问底。

毕业之后一开始从事的是 Java 后台开发,适逢移动开发如日中天及公司业务需要,遂转入 iOS 开发。算起来已有5年,也可算一个老司机了。

iOS 开发最大的一个感受是宽度大于深度,得紧跟苹果的步伐,不断去吸收新的东西,研究每个 iOS 版本的变化。从 MRC 到 ARC,从 Autoresizing 到 Autolayout,从顶部状态栏放开到 iPhone X 的“刘海”,从指纹识别到面部验证,从摇一摇、语音识别到增强现实、机器学习,无一不要快速学习,迅速吸收,融入到具体的功能开发中去。

印象中踩过最大的坑莫过于 Block 回调中野指针的问题,估计这也是当前众多 iOS App 崩溃的主要原因之一。虽然这个问题对于一众老司机来说很容易跳过去,但是新手上路者能不跌进去的很少。

我在58同城进行开发已经三年多了,主要负责主 App 开发。期间经历了 iOS 开发主流框架的演变,从最开始的 Hybrid 框架为主要模式到现在的纯 Native 开发的主要模式,并且最近两年融合了 React Native 的相关技术。在框架的演变过程中,一方面是技术的影响,另一方面是各业务线并行开发的需要。目前主要负责的内容一个是 React Native 在 iOS 端的接入及相关底层技术支持;另一方面致力于形成一个松散耦合的架构,以更好地支持业务线的并行研发。

移动开发的本质在于前端,是与用户接触得最近的开发,所以开发出用户体验最好的 App 一直是我的目标。但与此同时,随着硬件设备的沉浮与大前端开发的兴起,也倒推着我不断去接触大前端领域的各项技术,在技术的变革潮流中不掉队,不落伍。这也是我向同行一起共勉的一个目标。

我是2008年开始进入移动开发行业的,到现在也差不多十年了。有幸见证并参与了移动行业的兴“衰”,让我有机会不断地学习和折腾各种前沿技术。但感触最大的是:在智能手机盛行以后出生的那一代人已经把手机变成生活的一部分,遇到想看的动物就说在手机上 Google 一下,看到任何屏幕都想点击,拖拉和缩放。

做开发要折腾各种新技术,每天都或多或少地掉进一些坑,但踩过的坑都很快地通过 Google 和 Stack Overflow 解决了(Stack Overflow oriented programming)。如果连官方文档都解决不了的问题也通过问题的拆解和分离等步骤慢慢迎刃而解。

目前,我主要在学习和应用 Kotlin,并把它应用到公司的 Android App 里,慢慢地用 Kotlin 来替换原有的 Java 代码。和三年前把原有的 iOS App 从 Objective-C 转换到 Swift 一样,也遇到不少坑,但过程很具挑战性。

谈到规划,我目前还是专注于移动开发,主要是 Swift 和 Kotlin 在原生 App 上的应用。我的兴趣点是如何通过设计来驱动开发,快速地开发出具有良好用户体验的 App,这也是我之前开发 IBAnimatable 开源项目的原因。同时也在学习和折腾各种技术,包括 React Native、VR、AR、AI、区块链等等,为下一个计算平台做准备。公司里的同事问我有什么经验可以分享,我一般都说“Get yourself ready, wait for opportunities”。假如工作上不做 AI,而我对这方面感兴趣,那就去 Coursera 把相关的课程学习一下,找相关的项目或工作机会,随时为下一波计算浪潮准备。当然,现在 AI 已经进入应用阶段,不是下一波了。

之前一直做 C++ 和 Windows 底层的开发工作,后来由于一次工作需要有了第一次接触 iOS 和 Objective-C,记得彼时还是 iOS 4+ 黑苹果的时代,一直到现在的 iOS 11,可以说实现了从最初的一名 Windows C++ 开发者到移动平台开发者的转变。

而进入移动应用开发行业,我先后开发过 iOS、Android、BB10、Windows Phone 项目,记得以前有一个大型 iOS 项目要求上层 Objective-C 编写、中间层使用 Objective-C++ 编写,底层 C++ 编写跨平台库。当时负责中间层和底层库的开发,国内 iOS 项目的资料还非常少,大部分都是英文的,于是,编写底层 time 库和线程库一点点地啃着英文。

现在的我,正在 iOS 框架架构、核心公共库、性能分析优化等方面前行着。而将来,一方面希望接触新鲜技术和思想,把它们变成有价值的代码真正跑起来,同时也希望可以多贡献分享出一些优秀的开源库。