Zhihao's Studio.

在中国远程为美企工作一年杂记(下)

Word count: 1,808 / Reading time: 6 min
2021/05/08 Share

High-level overview

下图是我们应用从整体上的一个架构图,基本上概括了各个模块之间的关系。

下面简要说一下各个模块,不涉及过多技术细节。

音视频直播

音视频直播这块,选用了Janus,这是WebRTC的流媒体服务器,是由meetecho公司开发&开源的,本身也处于变化之中,也有一些bug。为了解决这些bug,公司甚至聘请了meetecho公司的员工作为顾问来进行个性化定制,开发定制化的plugin插件,以及解决一些疑难杂症

Janus本身的步骤比较固定,但步骤挺多的(参考下图),大概有十几步,涉及的概念比较多,观众侧和主持人侧步骤也有差异,这篇展开技术的细节了。最初的实现,是参照官网的Javascript版本实现用Dart语言改写的,在第一个视频通话成功接通的那一刻,我兴奋到跳起来了,很久没有这种成就感满满的感受了。

文字聊天&&特定通知

视频使用video-plugin、音频使用audio-plugin,文字聊天功能也是一种特定的Janus Plugin(text-room plugin),借助这个插件,我们不仅实现了文字聊天功能,也实现了一些特定指令的广播和Interaction信息的交换。

举其中一个例子:主持人由于一些原因把camera关闭了,但是还是可以说话的,为了对粉丝观众造成困惑,就会发送一个通知给到粉丝手机,然后解析出来,展示一个toast告诉用户主持人还在线,只是把相机暂时关闭了。

Interactions

Interactions over live stream是我们应用的一大卖点,也是通过text-room plugin在主持人和粉丝直接进行交换信息的。信息很复杂,model文件中的属性就有很多项,关键的属性有:坐标、交互类型、是否隐藏、是否需要强调(用一个循环的水波纹动画表示)、附带的信息(商品地址、网站地址、电话号码、Email等…)、字体、颜色等。

这块几乎是由我完成的,其中遇到了很多坑,记忆比较深刻的有手势缩放在小屏幕上比较难操作的问题、点开某个购物网站需要二次登陆的问题。

购物这块接入的是Shopify,硬啃着英文说明文档把这块搞出来了,挺不易的。

Firebase

跟Shopify一样,Firebase是国外比较流行的强大工具,第一次知道它是在一次谷歌开发者大会上,在这个项目里,重度的使用了它的一些功能(remote config/performance tracker/Google analytics),也旁观其他人使用了CI/CD的功能,以及crashlytics来记录和分析出现的bug,详细记录了bug的报错、手机的版本号、用户所在的地区等,还真遇到个地区相关的问题,后面发现是由于在某个国家科学上网后,网速慢造成的。

用户认证模块

用户认证模块使用了Auth0,它方便的集成了各种第三方认证方式,比如Facebook/google/apple/twitter/微软 login,但也遇到了一个坑:apple login只有在第一次登陆的时候会提供first name,last name以及email,后面为了保护用户隐私,Email都是fake的,这个与我们的某个业务有所冲突,只得让后端写了api记录下了这些只有第一次才能获取到的信息。

工作流程

由于是远程工作,不能做一些面对面的交流、也不能在白板上画图阐述你的想法。对于某些问题或者feature,我会提前做好ppt的图片来告诉其他人要怎么做,也有人用手绘的方式。

左图我的一页PPT,右图是同事手绘

我们组使用Jira来管理任务,一般是有PM、设计师、QA人员来建立不同类型的ticket(新特性、bug、写文档、技术选型探讨等),系统会自动记录你从认领到完成这个任务所花的时间。

写代码

任务可以主动认领(一般是自己先前开发功能出了bug)或者由PM分配到人,按照指定的命名方式建立PR后,会自动更新Ticket的状态。

提PR的规范

PR提了之后,要在Slack channel里@一下其他人,让大家帮你review一下,如果得到了2/3以上的人的approve,代码就可合入主分支了;否则就要继续修改,直到修改到给你提Change Request的人approve后。

stand-up meeting

每天的站立会议,大家会首先汇报一下自己今天做了些什么,有没有被block住,然后说一下明天准备做什么。有时候也会对某个PR的Review代码的意见进行讨论,讨论是通常是这个会议最有价值的部分,权衡各种方案、选型的优缺点等。

唯一的缺点是,开会的时间点是我这边半夜,开完会都1-3点了,而且开完会比较兴奋,很难短时间内入睡。不知道是不是太投入了,老婆说我说梦话说的都是英语。

但是长期熬夜对身体也有一定损伤,直观的感受是睡不够、掉头发,特别是开始的几个月,对Flutter的使用不够熟练,外加之前未曾接触过的直播和firebase,shopify文档,特别焦虑,好在三个月后渐入佳境,运用的得心应手了。

CEO Demo 汇报

每两周的周三,要向CEO/CTO 等C级领导demo一下你所做的东西。领导们通常还是挺友好的,经常鼓励员工,说interesting,good job等… (CEO似乎是个网红,经常上电视节目)

后记

回想这一年,确实解决了蛮多的问题,也接触到了很多新事物(webRTC/流媒体/firebase/shopify),回头看总体还是学到了蛮多。前两篇都有提到的那个Engineer VS Coder的对话一直激励着我克服这些困难,因为我对于自己的定位是Engineer,Engineer天生就是解决问题的。

其实刚加入team的时候,Flutter方兴未艾,包括最早的Tech lead也没有太多实战经验(半年后加入的Tech lead经验颇丰),招人也不太好招,所以能够得到这份工作机会确实有很多幸运的成分在里面。后来面试过程中,遇到了很多原生开发者和前端开发者情况跟我们刚组建team的时候非常类似,候选者有一些iOS/安卓/web开发经验,但是Flutter的经验不是很充足。但由于随着组内成员的共同进步,大家都看不上这样的人了,虽然开始的时候,我们也都是这样的人。

总体来说,过去一年是挺特别的一段经历,感谢在做这个项目过程中遇到的每个人!

CATALOG
  1. 1. High-level overview
    1. 1.1. 音视频直播
    2. 1.2. 文字聊天&&特定通知
    3. 1.3. Interactions
    4. 1.4. Firebase
    5. 1.5. 用户认证模块
  2. 2. 工作流程
    1. 2.1. 写代码
    2. 2.2. stand-up meeting
    3. 2.3. CEO Demo 汇报
  3. 3. 后记