上个周末参加了由快手举办的WWDC技术沙龙,形式内容主要是技术讲座,由各大厂的技术开发人员分享他们在工作中的种种技术优化策略。个人而言挺喜欢这种“Free Talking”的内容的,但是不足之处是相互交流的讨论比较少(这也是对大部分开发者而言性格都比较内向是原因之一)。

地点在快手总部,就是西二旗地铁站再过去一条街的地方,沿途还会遇到百度大厦,旁边里似乎有联想的分部。

先把本次技术沙龙使用到的PPT文档放在这里

Building Software for iPhone101 - Paul Hudson

首先上来先放了一段约15分钟长的视频,主要是在谈论:

  • 我们要不要用Swift构建应用?(我们最好尽快使用Swift开发应用);
  • 我们怎么通过编程赚钱?(我们通过学习特定的技术来找到一份工作)。

Paul是Hacking With Swift系列书籍的作者,我没有完整的阅读过该书籍,但是曾经看过他们网站上的文章。讲的内容还是比较轻松的,主要是安利Swift这门语言,并且劝解开发者尽快迁移到Swift语言进行应用的开发作业。
不得不说他说的是非常正确的,其实作为iOS开发者,数年前就得具备基本的使用Swift开发一个完整的应用的能力。

然后是怎么通过编程赚钱,他稍微介绍了一下国外的求职路径,但是应用到国内市场不太合适。基本上他描述的内容就是和StackOverFlow侧边栏上的差不多,通过学习特定的技术(比如这里是使用Swift进行iOS应用的开发),然后符合某家公司的JD,然后入职走上人生巅峰。然而国内的路径一般是从毕业开始的,半路出家的开发人员占比似乎正在下降。

戴铭老师一直是业界里比较活跃的角色,他目前在快手做基础架构建设相关的内容。
这次演讲他把原来的一头黄毛染了回来...不过PPT内容还是那么桀骜不驯,充满了奇异风格的插画,深考。

我曾经订阅并学习完过戴铭老师的iOS开发高手课系列内容,他的风格还是比较易懂的,虽然偶尔也会接触比较难以理解的编译优化方面的内容(主要是没有很好的实践平台),但是普遍来讲一些其他优化也会说的很多。所以他在极客时间上的这门课程我也是非常推荐的,而且不贵。

回到正题,戴铭老师在本次WWDC技术沙龙,作为嘉宾主要讲解了SwiftUI相关的内容。

首先是大家最关心的版本兼容性,基本上不使用SwiftUI的首要理由就是仅iOS13.0以上才被支持,在当时那个时候(2019年6月)是非常合适的,但是现在(2021年6月)已经转眼间过去了2年,iOS15.0的正式版已经箭在弦上,并且很多应用以及不支持iOS10.0的系统版本了。按照历史的进程来说,接下来的两年将会是SwiftUI需要进行实际落地的两年。所以,作为开发者有是有必要学习SwiftUI的。

接下来是一些具体的使用,比如Modifier,Result Builder,Geometry,Shape等等。我曾经跟着官方教程(也是我非常推荐的SwiftUI入门教程)花了2个早上学习了SwiftUI的基本使用。作为声明式的UI(不得不重新提起我接触的第一个以及最好的声明式UI是WPF),SwiftUI还是简单易用的,但戴铭老师在这里说的具体内容还是需要参考官方文档。

使用XCode Cahce为构建打包提速 - 孔汉宁

这是一位来自滴滴的开发小哥进行的共享,主要围绕如何在打包这一工作流程中提速的一次讨论。
在我自己目前的工作工程项目中,做一次完整的打包构建约需要30分钟左右,挺耗时的,所以注重听了这部分内容。

讲的内容很多,但是方向其实还是很好懂的。简单来说,基本上我们都知道在Xcode进行打包构建的过程中会生成缓存,怎样把它们重用起来就是关键。

方案1

使用多个项目文件夹的形式在打包机上进行组织。

  • 一个项目文件夹对应一条分支,master,branch-a,branch-b;
  • 当打包任务开始时,自动去寻找对应的项目目录进行打包;
  • 因为各个分支上的commit都是往前进行推进的,这样就可以利用增量编译机制减少重编译底层的工作量。

这个方案的实现原理很简单,也比较好实践。只是对于同一分支上如果commit被回退导致的“减量”操作支持不好。

方案2

模仿XCache逻辑,启用Pod二进制缓存。

这部分内容的具体落地没有展现出来,不过原理应该是这样的:

  • Pod工程目录会被编译成二进制产物,保留拷贝;
  • 在进行重新编译时,通过脚本等工具搜寻上层源码需要引用的二进制产物;
  • 将其替换加入工程目录,这里需要修改工程目录的内容。

据这位小哥所说,这个方案似乎有很多坑,而且脚本识别的引用关系也没有编译器做的好,因此还处于试验阶段。

还有一句补充:以上所描述的都是通过xcodebuild的build命令进行的构建,而archive是需要全量编译的。

使用Global Machine Outliner缩减重复代码 - 宋旭陶

这部分内容是美团的研发组进行演讲的。
主要是如何在代码层面减少字符量,来间接减少包体积(?)以及编译速度。

内容涉及到很多编译器相关,并且是一个实验性质的项目。
主要是通过自定义Clang命令的执行,在编译之前进行预先处理工作。

内容流程太长,这里不展开了。

动态化研发模式ARK - 徐纪光

字节的这位研发小哥分享的内容其实可能从标题不太好理解,但是思想也很简略 —— 我们进行Cocoapods的pod install命令时需要从远程拉取repo,不管是Github还是公司内网托管的仓库,如何解决这个步骤过慢的问题。

而ARK描述的是一整套系统,包含了多个工具与链路。

 


 

具体策略:

  • 尽量把远端的组件打成二进制状态(组件二进制化);
  • 使用命令来切换源码与二进制文件库,
  • 在本地调试环境,使用动态库来加载库文件,加速调试,较少下载体积;
  • 使用脚本工具规范化头文件引用(使用<>替代"")。

这位小哥介绍的还是和我的理解较为符合的,虽然实现难度不大却很有用。

并且似乎已经在内部落地了,给出了具体数据形式:

 

最后

以上就是本次参加WWDC技术沙龙的一次小总结。
目前看来,WWDC技术沙龙主要是一些探索性的内容,还是在未来的性能优化上很有参考意义的。

希望下次也能参与这样的具有开源精神的活动~