这是西瓜视频与字节关系团队合作进行的系列活动之一,目的在于提升西瓜视频于在校大学生中的技术影响力,普及客户端知识,并同时为团队提前物色优秀的实习生或校招生。这种事情团队能够想起我还是十分欣慰的,虽然自己之前确实有过产出不少教程类或相关的技术内容,但去年几乎没有产出过什么额外的东西,但就入门和激起广大高校学生群体对客户端产生兴趣,这件事对于我来说,再适合不过啦!

大纲

大家好,我是西瓜视频的 iOS 客户端工程师——翁培钧,想必大家通过上周的马舒骏同学的分享中对客户端工程师的工作日常、技能要求等等背景都有了一定的了解,本次分享我主要与各位同学一同探讨以下几个内容,首先跟大家介绍下我的个人背景,互相多一些了解,如果说得不完善的地方,望大家多多指出,共同进步;第二个环节主要是与大家分享下从大一开始到现在的独立开发者经历,也会与大家分享什么是独立开发者,如何成为一名独立开发者,独立开发者是如何看待这个世界的方式;第三个环节进入到今天的主题,使用 Swift 和 SwiftUI 在 iPad Playground 上编写一个关灯小游戏,最终代码精简完应该在 52 行左右;第四个环节呢是布置下本次课程的课后作业,个人觉得挺有趣的;最后进入到本次分享的 QA 环节,大家有任何工作、学习、生活上的问题都可以沟通交流。

个人介绍

好,现在我们来到第一个环节,先与大家分享下我的个人背景。我是北京信息科技大学软件工程 19 届毕业生,在毕业之际通过拿到 Apple WWDC19 学生奖学金的方式开启了一段加州的毕业之旅,右边的这张照片就是 19 年在旧金山的双子峰上拍的,不过因为全球疫情的原因,奖学金这种全包方式去参加一趟 WWDC 的方式现在已经改为了 Swift Student Challenge,iOS 开发入门系列的第三讲同学徐正科是 20 年的获得者,如果不是因为疫情原因的话,他也会去到加州。

Vary app 我不确定有没有同学使用过,Vary 是我的 18 年加入开发组,说是开发者包括我在内就两个人,在不停的打磨下,我们在去年的榜单中最高冲向了 App Store 效率榜的第 10 名,到目前为止我在 app store 上未达成成就仅剩首页推荐了。在学校时我的主要黄金实习时间都留在了滴滴,呆了一年半,当时也拿到了转正 offer,但也是从加州回来后,我想了很久很久,还是决定让自己多出去看看,最终加入了字节。在字节先后负责后头条和西瓜的客户端开发工作,目前在西瓜负责视频编辑器,大家感兴趣可以尝试使用一发,就在西瓜 app 中间 tab 的“发视频”,点进去上传几个视频后,进入的视频编辑器就是我目前正在做的事情。

独立开发者历程

现在进入到下一个环节,和大家稍微的拓展下我在独立开发者这个角色中所做的一些事情。我不确定大家知不知道什么叫独立开发者啊,但听说是肯定听说过,独立开发者用我的话来说,浓缩成几个词:一、无商业目的;二、跟随本心;三、精益求精。如果你所做的事情符合这三点,我们就可以大胆放心的说自己就是一名独立开发者,独立开发者无非就是做的事情与商业无关,或者说是不以盈利为目的,你内心真正想要做的那个东西是什么就去做什么,不管遇到多大的困难都要想办法去解决,是技术造成的无法实现就提升自己的技术能力,是美术资源造成的无法实现或者效果不佳那就请求别人帮助或者购买版权资源,总之遇到问题不是绕过去妥协实现,而是直面困难一定要实现,不管花费多少时间或者人力成本。

说实话这三点与目前的商业产品逻辑是全都违背的,商业产品其实包括字节在内的绝大部分产品都是以盈利为目的的,大家也不要有说独立开发者做的东西就是高大上,公司做的商业产品就是没有理想没有情怀,这其实是两码事。刚开始我对这三个概念其实都不明确,我也不知道什么叫“跟随本心”,我做一件事难道不是因为我想做才去做的吗?怎么就要“跟随本心”了呢?这一切都要从 15 年我刚入学那会开始说起。

刚入学的时候我与大家一样,用尽全身的资本购买了第一台 mac,当时花光了自己所有的积蓄,已经没有再有富于的零花钱来购买任何的电子设备了,后来入学正式参与社团学习活动,开始做一些小 app,刚开始新手期做的一些东西用模拟器完全没问题,但后来逐步深入学习后,想要吊起相机拍个照,在当时模拟器根本不可能,相当于这意思是我的想法被开发工具限制了!这是我最不能接受的一点,我无法接受自己是因为工具的原因无法完成自己想做事情,如果说自己是因为能力的原因受限这个我没问题。我就想啊想啊,有没有什么办法可以筹到 1599 元,这样我就购买一台乞丐版的 iPod Touch 6 了!开始算计这个月的生活费和下个月的生活费,排除必须的生活开支后,发现还缺一半左右的费用,但自己真的就是很想买一台 iPod Touch,也不愿低头向父母拿钱,就开始把自己在新手期学习阶段中的做的一些小 app 截图打印出来,配点文字,尝试去规划一个宏伟的愿景,向室友向高中同学借钱,每个人借 100,这样我很快就凑够了 1600 元。那时候我根本就不知道甲方乙方是什么意思,经常乱签,这几天我又重新拿出这些当初我瞎写的合同去看,其实有好多同学是欠我的钱。

随着我对 iOS 开发技能的深入学习,开始有能力去做更大的产品,实现更有趣的想法,跟目前绝大部分同学的方式是一样的,开始海投比赛,但凡跟移动应用开发挂上钩的比赛,我全都报名参加,很多比赛细则都没有细看,这些众多比赛过程中,也慢慢发现了确实苹果爸爸十分大气,三等奖就给发一台 iPad Pro,这是我的第一台 iPad,我也在这个 iPad 上做了众多的小 app,不过当时的 iPad 纯粹就是 iOS app 的放大实现,做着做着我也就失去了兴趣,根本不像现在 iPadOS 这样有这么多好玩的 feature。

时间再往后一点,这应该是我的第一个独立开发者之作,当时是我在上课的时候在知乎刷到了一篇产品宣传文章,我确实上课经常刷知乎刷微博关注的博主,不好好上课,讲的日本的一家企业做了一套文具,这套文具配合他们的 app 可以实现文档扫描的功能,app 可以识别红色和蓝色荧光笔勾画区域的内容,并自动保存。这个东西我当时看到后两眼放光,这太有趣了!之前我高中上课的时候确实就是不同颜色的荧光笔画来画去,突出重点,每次早读都得一个个去翻不同荧光笔画出来的重点是什么,如果有一个 app 能够处理掉用户用荧光笔画出来的内容,那复习或者早读的时候直接看这些重点不就好了?!

说干就干,我开始去了解摄像头捕捉拍摄内容,如何识别内容,如何裁切出关键区域等等问题,后来发现这些问题绝大部分都可以通过 OpenCV 来解决,如果大家有上过《计算机图形学》的课,对 OpenCV 是再熟悉不过了。当时我知道 OpenCV 可以完成我想做的事情后,每天真的就像是打鸡血一般不知道哪来的精力,用了一个兴趣的时间把 OpenCV3 那本书给看完了,同时也把自己想实现的功能给做出来了,整个流程体验下来我觉得非常可以,完善下 UI 后就可以上架了,但是当时因为我已经开始实习了所以事情还是比较多的,上架也就抛掷脑后了,但这个产品已经开源了,就在我的 github 主页上,当时开源后我的这个 repo 冲上了 github reading repo OC 榜的全球第一,在前 10 呆了好几天。当时是大二的暑期实习我刚结束,偶然看见的这个日本产品宣传文章,从开始开发到发布给开源社区,差不多一个月的时间。

PFollow app 这个产品是我真正开始“跟随本心”的作品。当时是 18 年去了一趟青海湖,那是我第一次去到祖国的大西北地区,真的太美了!当时还是七八月份油菜花盛开的季节去的,我整个人被眼前这一幕幕绝美的景色陶醉了,我很像有一个什么样的东西可以去记录下来此时此刻此景此景的所有感受,比如天气、风速、油菜花的味道、牦牛的叫声、青海湖湖水扑向岸边的浪声等等,我就想按一个按钮,把这些所有东西都捕获下来,年老之后自己再回忆起这些自己年少时去过的地方,可以再按一次这个按钮,重现青海湖畔边油菜花的味道,牦牛的叫声以及扑向岸边的浪声。但是受限于整个行业的技术水平,我无法做到收集气味,要不然 PFollow 这个产品真的是绝了,还真的实现了用户在一个地方仅需按钮屏幕底部的这个指南针按钮,就可以自动获取到此刻的所有相关数据,并在地图上展示出来这些捕获点。可以说 PFollow app 是我的巅峰之作,可能技术不是最复杂的那一个,但却是我在尽自己一切可能完成,毫不妥协的独立开发作品。这个 app 也开源了,关于它背后的故事大家如果感兴趣的话可以去我的 github 或者博客里找到。

到了下一个阶段,参与 Vary app 的开发工作,是我彻底成为一名独立开发者的关键节点。之前也跟大家分享了独立开发者第一条原则就是“无商业目的”,Vary app 在前几年的时间里确实是免费的,但后来几波媒体宣传后,每天的流量太大了,我们根本撑不住,靠爱发电的话会掏空我们自己的家产,所以最后我和另外一个小伙伴反复琢磨,最终定价 6 元,稍微改善了一些。这个作品因为我没有参与最开始的设计和开发,我其实也是被 Vary app 的作者所表达出来对目前信息流产品的不满意和厌倦、对好产品孜孜不倦的研究精神所感染才加入的开发组,如果大家对 Vary app 感兴趣的话,可以在 app store 搜一下这个 app,通过开发者网站链接到他的博客中看看,这个人确实很强,博客中说自己只上过一周学,后面就成为了一名 HomeSchooler,我很佩服他家人的魄力,总之大家感兴趣就去看看,在此就不多做展开了。

最后是 WWDC19 奖学金项目,确定要参加这个比赛之前我是很胆怯的,我不确定大家之前有没有了解过 WWDC 奖学金项目的难度,要从全球选出 350 名学生开发者全包费用横跨大洋去参加 WWDC,凭什么是你对吧?但我当时想的就是反正都要毕业了,为何不浪一把?闯过去了我就喜提毕业旅行,没闯过去也算是给自己一个本科学习生活画上句号。这个作品我的构思是做一个讲述黎族织锦的故事,给世界介绍我的家乡海南,介绍海南的宝贝黎族织锦,很漂亮,也充满了很多神话色彩,我个人非常的喜欢,就想着借此机会为家乡做点微小的贡献。这个作品本质上是一个拼图游戏,在这 10 天过程中,我大量运用了开发之前作品养成的思维习惯,快速拆解出核心问题,关键亮点等等问题,一个个解决,最终在第九天的时间中完成了所有内容,提交。在提交完成后我长长的睡了一个觉,真的太累了,如果不是之前大量的产品设计和开发实现过程留下的经验,这 10 天想要做出来一个与全球学生开发者同台竞技的作品,我心底里是完全没底的。

现在因为工作两年多了,业余时间也不多,我已经开了 N 个产品,又关掉 N 个产品,主要是发现自己不能再用之前学生思维下的方式去思考产品与人的关系,以为很多东西不是说为什么没有,而是应该问问为什么还没有。产生这种改观最大的是在我决定开源 PFollow app 时,当初 PFollow 我是真的打算上架的,顶住了所有压力,尽可能的考虑了所有细节,但最终当我得知 ins 的前身就是地点签到的产品,我心都凉了,说明这个赛道已经有前人证明过是失败概率很大的,所以我的最终决定还是不上架了,开源贡献给社区Ⅷ。

OK,我们来点个题。听完我的故事,想必大家也多多少少明白这些广大的独立开发者们都在做些什么,思考什么,如何解决在日常生活中遇到的问题等等,如果要我给大家一个独立开发者的成长方案,千言万语汇成一句话:“你内心真正想做的事情是什么,真正感兴趣的东西是什么,放手去做”。我把自己的座右铭分享给大家,可能比较俗,但确实激励了我很多次:

优秀的人遵守规则,顶尖的人创造规则。

iPad Playground

好了,说了这么多独立开发者的历程,我们开始进入到今天 live code 环节,与大家一同分享使用 iPad Playground 写一个有趣的小游戏。这个游戏呢是我之前去中国科学技术馆里发现的游戏,机子上做了一堆的按钮,让小朋友们节约用电,想办法把房间里亮着的灯都关掉。我当时玩得不亦乐乎,玩了差不多十几分钟,非常有趣。回到学校后我简单的抽离了核心逻辑做了一个,我们现在一起来用 SwiftUI 来实现一遍,因为绝大部分同学都是 iOS 开发入门的新生,所以 live code 环节涉及的代码都很简单,大家不要有什么压力,语法也很简单。

先来给大家介绍一下 iPad Playground 是什么,iPad Playground 我推荐大家配合 iPadOS 15.2 及以后的版本使用,因为在 Playground 4.0 的版本以后内置了可以允许在 Playground 上发布至 AppStore,而且整体编码环境有了本质上的提升。同时 iPad Playground 我认为是最适合做 SwiftUI 代码测试的平台,如果大家后面在 mac Xcode 上使用 SwiftUI preview 预览模式去对照着学习,intel 版本 mac 几乎没有什么体验,经常性预览失败,如果是 apple silicon 版本比如 M1 mac 效果会好很多,但最佳的 SwiftUI 代码运行和测试平台就是 iPad,真正发挥出了 SwiftUI 所见即所得的效果。

我之前用 Playground 都是做一些 demo 测试,曾经有想着做一套基于 iPad Playground 的 iOS 开发系列教程,但做到地图相关的环节时发现 Playground 对隐私授权相关的权限部分管理太差了,没有办法很好的还原出正常的 app 开发流程,也就放弃了。但 iPad Playground 4 出来后完全就不一样了,它有着完备的隐私授权管理入口,一个正常 app 所需要的所有的隐私相关的授权发起,它都可以做到。这个教程如何还有机会的话,我会重新捡起来。好,我们现在进入到 live code 环节,与大家一起完成这个小游戏。

live code

此处在进行 live code……

课后作业

此处在进行课后作业说明……

祝大家未来可期

至此本次分享的主要环节都完成了,做个总结。先是与大家分享了我的独立开发的几款产品背后的故事,我与这个社会这个世界产生接触的关键节点是怎样的,我如何对待自己脑海中冒出有趣好玩的想法,并把他们付诸实践做成一个个产品。我对这个世界有很多自己独特的看法,也认为人间值得,也希望在今天的本次分享中能够给到大家一些不一样对这个世界的看法,我跟大家一样也非常喜欢出去耍,也非常喜欢遇见更多的人和事,希望大家可以在未来的学习生活中能够多多发现生活中的美好,做一个独立思考、自我探索、终身学习的人,祝大家未来可期!

QA

此处在进行 QA……