从容不迫地告别2020 | 掘金年度征文

1,050 阅读12分钟

2020对大多数人来说都是难忘的一年,虽然难忘的点不尽相同。对我来说,这一年的关键词应该是“可视化”和“家”,一月前让我找一个形容词,那应该是兵荒马乱,被各种计划之外又接踵而至的变化裹挟着前进。但是不解、忧虑和疲惫终于在年末得到了释放,现在再回顾这段时光只觉得平静和坦然。

可视化

今年的工作和学习都集中在可视化主题上,具体来说应该是地理可视化。

可以用三个词来总结:

  1. 持续学习:继续保持在3D图形渲染领域的持续学习,去年作为一名小白实现了WebGL的入门,今年不仅进行了更深入的理论学习和实践,更重要的是开阔了眼界,了解业内前沿技术方案和未来发展方向。
  2. 开放共建:业务的蛰伏期过后迎来一段快速发展时期,应用场景和需求无法得到快速全面覆盖,于是转而尝试开放共建的研发模式,除了在团队内部实现合作,我也提出了与外部合作伙伴共建能力的方案,同时还参与到了公司内部的开源共建项目中。在各种合作模式下探索边界和方式。
  3. 自省:我是一直从事可视化API的开发工作,与应用开发相比较其实一直是处于后方的,偏向于将复杂需求抽象化和通用化,而今年参与了两次应用项目实战历练,在复杂的一线更加切实地了解了产品落地的痛难点,转换思维方式,反推产品的优化改进。

持续学习

作为技术工程师,尤其是前端工程师,在快速发展不断迭代的大环境下要想不掉队,持续学习的热情和习惯是必不可少的。学习的内容主要来源三个方面,一是工作积累,这是最实际的,二是夯实基础,三是前沿观察。对我来说,今年的学习积累中工作所需占70%,主要围绕WebGL进行进一步学习和实践;夯实基础占20%,针对图形学和OpenGL的基础知识开始了比较系统性的学习和巩固;前沿观察占10%,主要是关注公众号和博客,了解前沿发展方向。

工作积累

JSAPI 和 Seiya 在今年上半年先后发布了正式版,也意味着基础功能已经基本完善了,今年下半年的目标主要在提升视觉效果上,要求对渲染有更深入的理解,为此也做了很多调研和尝试。

  • 光影效果:基于Blinn-Phong光照模型实现了多光源系统,并应用了Gamma校正、HDR、阴影投射等技术优化光照效果,在这个过程中掌握了局部光照模型中的部分经验模型

  • 泛光:基于WebGL2多目标渲染实现泛光效果,将WebGL1切换到了WebGL2,掌握了多目标渲染的实现方法以及高斯模糊的实现方式

  • 立体区域高亮:基于模板测试实现了区域高亮效果,掌握了模板测试的使用

这几部分是对WebGL基础知识的组合应用,巩固了对帧缓冲、深度测试、模板测试、面剔除等基础概念的理解和使用,但很多技术方案还停留在简单易用的阶段,需要进行进一步优化。

基础夯实

越深入钻研某一个领域,越发现基础的重要性,根扎得越深才能长得越高。感受比较深的一点是,我虽然有一些几何代数基础,在学习Blinn-Phong局部光照模型的时候还能游刃有余,但当进一步了解到PBR,接触到微平面模型、双向反射分布函数的时候就相当吃力了。另外,之前主要是做矢量图形渲染,只需要掌握基础的三角剖分、坐标转换即可,而现在要进一步实现真实感渲染以及酷炫的视觉效果,就需要更深入地理解图形学和图像处理技术。

利用业余时间,我基于LearnOpenGL CN对OpenGL进阶概念和技术方案进行了系统性地学习,这个网站强烈安利给想要入门OpenGL的同学,不管你是web开发还是客户端开发,都是适用的。另外,在我先生的推荐下,我接触到了GAMES系列课程,我们一起学习了GAMES101的课程,闫老师的图形学入门课讲得浅显易懂又细致入微,同样安利给基础入门的同学。

给接下来的2021立个flag,完成GAMES102的学习,也就是刘利刚老师的几何建模课程,正是我的薄弱环节。另一个目标就是深入学习和理解PBR以及全局光照模型,如果大家有推荐的书籍或课程欢迎在下方评论分享,我自己找了一本在线的书,《Physically Based Rendering》,不过是全英文的,估计啃下来会比较困难。

前沿观察

今年实行了一段时间的晨读计划,早上30分钟阅读公众号推文,主要关注前沿领域的发展方向和实践经验。主要关注的主题是WebAssembly、TypeScript,WebGPU也接触了一点。不过一是因为晨读习惯没有保持得很长久,二是没有付诸实践,所以都没有很深入,这是来年需要改进优化的地方。

个人感觉WebAssembly在3D图形渲染的领域是有巨大价值的,如果能在多端保持一套C++渲染引擎,或者数据加载解析引擎,那提效和性能优化的效果应该是值得期待的。而WebGPU作为下一代的Web端图形引擎,也是未来的发展趋势,而它与WebGL的具体区别和优化点还有待实践调研。

顺便吐槽一句现在很多公众号总是聚焦在培训推广、面试题解等捞钱吸粉主题上,真正做原创高品质文章的太少了。

开放共建

公司内部正在推开源,我们的项目也越来越注重代码规范,为开源做准备。我没有参与过开源项目,在项目共建上几乎没有什么经验,今年也在慢慢摸索。我们的主要产品起初只有两个研发,经过了一年多时间的打磨正式上线,正式版发布后各方需求接踵而至,虽然逐渐投入了更多的研发人力,但仍有一些问题。

一是自身的业务规划与用户需求之间的权衡,两方都要保障人力和相对独立的开发节奏,于是就产生了“分家”。研发人力分开到两个团队后,如何有序有效地进行项目共建就成了一个重要命题。前期出现了很多问题,比如需求划分不清晰、人力分配不均、工作边界不明确等,一方面是双方沟通较少,另一方面是都没有经验都在摸索。经过几次探讨,初步达成双方共识,进入试行期。有几个核心点:

  • 建立一致的开发规范:包括接口设计规范、Git提交规范、代码规范及测试规范,这不仅是合作共建的基石,在多人开发的项目中也是非常必要的
  • 代码逐步解耦:为了尽量减少双方研发工作的依赖,降低代码改动的风险,以及控制打包文件大小,需要将项目代码逐步解耦,一方面新功能尽量脱离基础库,以附加库的形式独立开发和打包,另一方面基础库需要按功能拆分出几个核心模块,模块间弱耦合,模块功能尽量独立且单一。
  • 加强Code Review:主要针对核心模块进行code review,保证双方都能评估对方的改动所带来的影响和风险,可以采用线上线下结合的方式提高CR效率

二是造轮子的问题,基础的地图引擎针对特定的数据和数据组织方式有很多定制化的部分,我们是采用自研的方式基于原生WebGL实现的,但在面对业内标准数据格式时很多工作就变成了造轮子,而且成本非常高,比如3DTiles等模型数据的加载。于是在自研成本和项目交付的双重压力下,开放融合成了唯一的途径。

我们的自研引擎在设计之初就预留了外部插件接口,可用于在正向渲染流程中插入自定义渲染过程,也基于此我们实现了基于luma.gl的Seiya,现在想来能做到这么有“先见之明”还真是感谢做API的过程中不断培养的对可扩展性的重视和设计能力。不过luma只是对原生WebGL的封装,并没有自己的渲染管线,这次我们扩展到了具有完整渲染管线的渲染引擎,需要深入理解另一套引擎的原理,保证上下文状态的独立和融合,虽然难度增加了不少,但也让我们快速补齐了多个垂直方向的能力,同时也能让有图形渲染开发能力的合作伙伴与我们共建能力和生态。

自省

今年参与了两次应用项目的开发和交付,对于一名API开发者来说就是置换到了用户的身份来使用自己开发的产品。这两次开发经验让我记忆深刻,深感自己对于我厂“一切以用户价值为依归”的理解是多么浅薄,唯有不断以用户视角来进行自我审视,才能避免偏航,才能把产品做得更好。

  1. 结合应用场景去理解需求:如果不了解用户需求背后的应用场景,就很难理解用户的真正意图,有的用户对API并不专业,提的需求并不一定到位,而我们也自以为是,按自己的理解去开放接口,很容易出现交付后无法满足用户场景搭建的问题。所以需要多站在用户角度,结合他们的应用场景去理解需求,并适当给予引导,才能得到合适的解决方案。

  2. 丰富组件能力:面对各行各业的开发者,我们开放的接口往往都是原子级的,就像是积木,让用户能够更加灵活地搭建自己定制化的应用,但是开发者的水平是参差不齐的,这样的开放方式设置了很高的门槛,有的开发者不会用,或者用的方式非常复杂,应用体验较差。其实我们能总结出很多通用的场景组件,比如我们之前已经开放的InfoWindow,组件的定制化比较差,但能满足很多初级开发者拿来即用的需求。另外还可以结合主流框架封装组件,提供更加多元化的接入方式,简化接入成本。

  3. 性能优化道阻且长:我们在研发和测试的时候页面功能是相对简单的,而用户的应用场景往往非常复杂,特别是ToG的项目中,大量而多元的数据加载和切换,以及复杂的交互,都会对性能带来巨大挑战。这种情况下,可以针对一两个大型项目积累性能优化经验,将经验转为内部优化方向,同时利用官网、公众号等渠道发布性能优化通用方案。

今年做了很多重大的决定,大多与家有关。

  • 搬家,从合租换到了一居整租,真正建立了我和先生的小家。有了更多的空间,我们一起运动、打游戏、追剧、做饭、聚会,还把白糖从乡下接了过来,生活品质大大提升。

  • 买房,对我来说还蛮突然的,在朋友圈看到一处限竞房的信息,跟先生一起去售楼处了解了一下,当天晚上11点就赶着去交了订金,因为真的太合适了,离公司非常近,也挨着地铁站,房价比周围的低了2-4w,小三居带仓储和车位,真真是捡漏了。非常感谢父母的支持,单靠我们俩是没办法这么早上车的,交了首付后就靠我俩还贷,同时还背着房租,也促使我们更加关注理财,注重资产的积累。

  • 结婚,备婚的过程非常复杂,而且战线很长,今年我们经历了提亲、订婚、备婚、领证,不过并不像别人说的那样,在备婚中我们从没有因为各种小事而发生争吵,也不像我预想的那样“一切从简”...这一生一次的仪式,每个环节我们都想要独一无二的完美的回忆,在传统和现代中把握平衡,也自己动手完成了很多设计。

今年多了两个家,是回家最多的一年,也是与家人沟通最多的一年。共同目标和沟通拉近了我和家人的距离,和朋友的距离,我感受到自己的心变得更柔软了,感受到了更多的爱的流动。就像我先生说的,我们真的非常幸运,从小到大没有受过什么挫折,有长辈的爱护和支持,有朋友的理解和陪伴,更幸运的是遇到了彼此,也因为彼此变得更好。

今年的唠叨到此为止,明年的flag已经高高立起,冲吧~

掘金年度征文 | 2020 与我的技术之路 征文活动正在进行中......