移动开发精华iOS学习笔记iOS Developer

Uber 和 Swift重写项目的故事

2017-06-05  本文已影响259人  豆志昂扬

Uber的工程师在(Swift Summit)会议中分享了其公司花了一年的时间用Swift 重写了整个iOS 应用的经历,下面摘录了项目过程中的故事和心得,希望对大家有所借鉴。

由来

2012年,Uber的三个工程师开发了第一版的iOS应用的基础架构,并使用至今,但随着工程师团队人数的急剧增加,我们遇到了一些急需解决的问题:

简单来说就是两部分: 已有架构问题和界面交互要重新设计。这些导致了我们放弃在已有基础上打补丁,从零开始做一个全新的项目。

目标

选择Swift

更安全,Swift作为一种类型安全语言虽然没有公司在产品中验证如何安全,但Swift社区一再声明如此,毕竟安全的大旗无往不利。
为了将来。可以预见Swift在未来的时间里是是苹果在iOS平台上唯一主推的语言。再见,Objective-C!

项目周期

整个重写项目持续了将近一年的时间,年初的五个月里,架构团队和框架团队全身心地构造基础相关的架构和框架等相关基础,我们团队里有一些工程师在前家公司经历过重写项目的经历,这次不能重蹈覆辙。

6月份的时候,当基础架构框架准备完毕的时候,我们邀请核心流程团队来验证框架是否如预期满足需求,这时团队成员多了20人。尝试过程中的确发现了一些原先遗漏的问题,如当工程师做场景切换的时候,整个视图的操作变得出乎意料的复杂,我们不得不调整已有框架来满足需求。经过2个月合作,我们认为整个平台已经可以对所有开放,其他业务线团队可以放心迁移到全新的平台中。

我们计划发布的时间是11月份,在Uber公司内部每个项目团队之间非常独立,我们没有统一要求所有团队什么时候开始集成到新的平台,但11月是截止日期,最终有的团队用了整整3个月迁移项目并升级,而有的团队在发布1周前才开始集成,幸运的是我们如计划一样在11月成功发布了新一版应用。

架构

在设计应用架构的时候,团队参考了眼下比较流行的框架 MVC,MVVM 和 VIPER,为了确保足够模块化和代码测试覆盖率,最终选择在VIPER架构的基础上进行定制。其中每个模块都暴露相应协议接口,这样确保每个模块粒度够小和充分测试。
在切割模块化的时候,Uber选择了基于业务逻辑,而不是基于视图,这样每个独立的业务模块可以任意的本地化和定制化。

以上述架构中signup模块为例,signup模块不知道其父节点,该模块在需要的时候会被注入进来,且其父节点会提供所需要的数据,子模块不用关心自己所在的位置,只需完成自己的职责即可,这样保证了子节点的独立性和自主性。

再以应用启动为例,‘App’组件只关心是否已经获取会话令牌,可以用观察者模式监听会话令牌的状态,如果发现没有会话令牌,这是路径切换到‘Welcome’组件,否则将销毁‘Welcome’组件跳转到‘Bootstrap’组件。而上图中右半部分是在用户登录后的状态下运行,每个组件只需使用父节点注入的会话令牌,不用关心用户是否已经退出。‘App’组件会注视这一切的变化,当发现会话令牌过期则会销毁‘Bootstrap’组件群,且回到‘Welcome’组件。

上述架构可以保证多个子团队同时工作在各自的项目中,并不需要太多依赖,且每个子团队在已知模块依赖的前提下做出适合子团队的选择。

代码量

重构以后,新项目有5000多个文件,Swift代码量多达50万行, 不过项目依然保留Objective-C的代码组件。

Swift的苦与乐

正面: Swift的确是一个比Objective-C更好的语言:

负面:从错误中汲取教训,请多留意这一部分。

you can relink everything back into your binary and that's what we did. So we built all these frameworks and then we have a post-build step that takes all the symbols out of these frameworks and links them together in your static binary and that's how we get away with the startup speed that we had.

工具DTrace可以帮助在启动时检测链接库的顺序。

失望

干货

有兴趣的可以看看英文的文字记录

更多

请关注豆志昂扬微信公众号获取更多内容:

上一篇 下一篇

猜你喜欢

热点阅读