2016总结
一直提醒自己要养成写博客的习惯,结果还是因为种种理由鸽掉了;所谓年终总结,其实就是把一年来堆积着的、没有记录下来的碎碎念,赶在最后时间补出一篇流水账,一不留神还拖到了第二年。去年写年终总结是在过春节之前,而现在身在日本过西历新年,因此该给 2016 划上句号了。
2016 经历了挺多事,但仍然是摸鱼和怠惰的一年;完成了一件心愿,也留下了一些遗憾。
再谈 flv.js
早在高中时,我就有过在 HTML5 上用 JavaScript 实时做 FLV 到 MP4 的封装转换来播 FLV 视频的想法;直到 2015 年 12 月我才看到 Media Source Extensions (MSE),开始研究该做法的可行性。随后发现了开源项目 hls.js,开始尝试魔改,在其中增加一个 FLVDemuxer;到 2015 年 12 月 31 日,魔改后的 hls.js 顺利通过了数十个不同参数的 FLV 文件测试,至此做出了在 HTML5 上播 FLV 视频的第一个 demo。
验证完项目可行性后便开始琢磨怎么开工。hls.js 是下载完一个 ts 切片才开始解析的,而播放 FLV 视频或直播需要渐进式处理,下载多少解析多少。用 hls.js 改出来的 demo 需要下载完整个 FLV 视频,才开始封装转换,跑起来的效果就是加载非常慢,最后 CPU 跑满一会才会出画面。因此 hls.js 的架构不能直接拿来用。2016 年 1 月,我调研了各个浏览器的流式 IO 支持情况,简单了解了 JavaScript 基础和 ES6,开始设计 flv.js 的架构、构思细节逻辑。2 月正式开始写代码,春节过后给产品部写了 HTML5 播放器的立项建议邮件,之后主站 HTML5 播放器才正式立项开工。
开发过程说不上艰苦,但也费了不少劲。初次接触 JavaScript,基本上是一边 Google 一边写代码;B 站的 FLV 视频因无二压和历史原因,有各种奇葩的特征或 bug,需要做一定的容错;Media Source Extensions 没有文档和教程,需要反复啃标准文档 / 参考开源项目用法来理解模型,甚至去读了 chromium/media 中的实现代码;各个浏览器的 MSE 实现都有 bug 或不符标准的地方(包括 Chrome 在内),写了一堆 workaround 去适配各种浏览器,给 bugzilla 提 issue 和老外撕逼。最后一定要吐槽苹果,Safari 9 的 MSE 完全是坏的,Safari 10 的 MSE 勉强能用但仍有 bug 需要 workaround,至于 iOS 似乎苹果没打算提供 MSE 支持。
由于我是一个写代码非常磨蹭、又有各种强迫症的人,flv.js 到 6 月才达到基本稳定可用的状态。随后为了解决 Range 头遇到跳转死跨域的问题,给视频 cdn 写了 nginx 模块来处理参数 Seek。之后做了些啥已经不记得了,直到 8 月底服务端调整完毕,flv.js 修完最后一波 bug 才最终上线。上线前为了搞明白一个不易重现的 bug,迫不得已只能给 chromium 代码加入 logcat 自行编译,改一行代码 MSVC 就要重新 link 三分钟,链接器暴涨到 12GB 内存;最后解决完 bug 清理硬盘上几十 GB 编译产物时感觉 SSD 被磨掉了一层皮。
flv.js 是自我学编程以来写过的规模最大的项目,作为 C++ 爱好者,代码量最大的项目却是 JavaScript 真是略有遗憾。开发时我对自己的要求是代码力求工整,而到最后我对整个工程的代码质量并不太满意,其中仍有一些丑陋的代码实现,也懒得再改了;GitHub 上的 Star 数最多能体现出这个项目短期内很火,并不代表这个项目的代码质量有多好、技术含量有多高。flv.js 只是一个实用性较强的工程,短期上解决了 Flash 时代视频格式与 HTML5 不兼容的问题,长远来看,我更希望看到 Media Source Extensions 能被更广泛地了解和使用,希望 HTML5 流媒体能在国内普及地更快些。
关于 B 站
在 B 站的 1 年 8 个月,是我高中毕业后的第一份工作;离开的时候说不上恋恋不舍,但也是五味杂陈。15 年 3 月,在朋友的内推之下进入 B 站,当时 B 站还只有 12 楼一层,而我的工号是两百多。记忆中当时还很欢乐,许多同事都是电波相近的人,沟通起来很是畅快。颇有印象的是审核部和编辑部,那一片总是 12 楼最热闹的地方。入职时在移动组做 Android 开发,在老司机的带领下点了不少奇怪的技能点,也加深了对多媒体解码知识的了解;而后我对琐碎的工作内容感到反感,提出希望转岗时,带我的领导表示理解并同意了我的请求。
转岗后在新部门里做的事都是自我驱动的。16 年初我决定要做 flv.js 时,公司还没有做 HTML5 播放器的强烈动力,现在想来当时的立项邮件真是为后续一步步工作打下了基础。之后数个月我便独自沉迷于写代码,而在此期间,领导似乎觉得我的项目无足轻重,并不在意我的进展;而当我一次次拿出能初步稳定运行的 demo 时,领导也并不在意我的成果。我自认为 flv.js 意义不小,因此哪怕没有帮助,也坚持把它持续推进了下去。6 月时 flv.js 初步完成达到基本稳定可用的状态,等待视频服务器配置跨域;而当我得知上半年绩效结果仍然为 C 时,我一脸黑人问号。打分的领导解释说,你上半年做的 flv.js 没有上线,就不能算完成。我继续指出评判规则的不正确,之后就没有回应了。直到现在我仍然拒绝接受这样的绩效评判规则:
“有两个员工,一个负责写大量相对简单的业务,有持续的输出;另一个员工,独立开发核心库,难度高、工程量较大,开发周期长,最后因外部原因 block 导致不能按时上线。最后第一个员工获得了较高的绩效评级,第二个员工获得了极低的分数,这公正么?”
当我明白这家业务主导的公司并不尊重技术向员工的研究成果时,我想我恐怕无法在这里长久地呆下去了,哪怕赴日计划失败,我也不该继续留在这里。而我希望将 flv.js 开源的初衷,仅仅是不想让这份耗费心血的代码就这么烂在公司里:这里鲜有人尊重我的劳动成果,这里恐怕也难有合适的人接手这份代码。到 16 年底,公司经过一年多的快速扩张,规模已达千人,而回顾最后在公司的半年时间却记不起有什么欢乐的事情了。想到自己工作期间成长有限,自己又还有好多需要补习的基础、想造的轮子,因此决心在推进完 HTML5 播放内核相关的开发计划后离职。
其实回顾在 B 站的这段时间,在这里也认识了许多相处愉快的同事。内推我进 B 站的老司机,在移动组时带着我做了不少事情;在主站技术部时认识了几位小伙伴,有学生气的宅男,也有 PL 出身又转 ML 的大佬;在编辑部又认识了两位写代码的菊苣,这破站我就服你们;做播放器时我与视频服务端有过密切的交流与合作,在那边同事的全力协助之下,HTML5 播放所需的各种服务端调整才得以完成,还在菊苣的指导下学会了写 nginx 模块,等等。作为一个高中毕业的弱渣,是因为在 B 站认识的你们,我才得以告别工作前中度抑郁的自己。能认识你们真是太好了!
我仍然很感谢这一段对我非常重要的经历,如果不是因为有到 B 站工作的机会,我无法想象现在会在哪个阴暗的角落苟且偷生着。能给自己喜欢的网站做事,能在这里完成自己的心愿项目,在最后得到了开源许可,感谢 B 站。最后还是祝愿 B 站能不忘初心,继续前行,尽管是一句略显幼稚的话吧。
碎碎念和未来
这一年大多数时间我仍处于十分低效和怠惰的状态之中。幻电的冬天比夏天还热,白天公司内又热又吵,无法投入深度思考;每天晚七点下班整个人都是虚脱状态,到家只想瘫床上睡过去;看书和学日语的计划因时间精力不足、再加上自己的懒惰而一再拖延,导致刚来日本这几天我全程是懵逼状态。记得刚来上海工作时给自己定下了详细的业余学习计划,而工作没多久就把那些计划抛至脑后了。一来自己太懒,二来工作后大概真的很难再有大块的时间和精力去学习完整的东西吧。因此我决定离开工作岗位、重新考大学,争取更充足的时间去把计算机科学基础打扎实,去写自己想写的代码。
然后,我要感谢这一年在网络上、在三次元陪伴或帮助过我的好友们。一直觉得自己过得很孤独,但如果不是有技术圈中朋友的帮助和鼓励,有写播放器的大牛提供指点,flv.js 的完成大概不会那么顺利,我在技术上的成长也无法达到目前的程度。抵达日本后,在几位朋友的全力帮助之下,我才得以办理好各种手续,谢谢你们。
最后,2017 年要准备参加日本留考 (EJU),日语要从头开始学,数理化还得回炉重造。希望自己静心、努力。
2017.01.04 完稿于东京