2020 年是我的本命年,这一年过得很顺利,也很有收获,抓到不少机遇,记录一下。
相较 2019 年平平凡凡的一年,最大事件就是为了能更好发挥自己的价值,进行了转岗;业余能力提升也仅仅来源于看书,那一年看了差不多十来本技术书,输入比较多,思考也有限。额外的机会就是收到日本 NHK 电视台工作人员关于 996 工作制新闻选题的采访邀请,关于这种热点我自然是不会去蹭的,自然拒绝。
2020 年初时疫情突发,回上海后难得能够拥有在家远程办公的机会,虽然只有两周。那时候海淘的健身环大冒险也到了,开启了健身之旅,每晚锻炼半小时度过了整个春天,历时三个月通关,身体明显更有精神。养了整整一年的乌龟也在这一年越狱找不着了。
2020 年也是我成长最快的一年,这一年我们团队请了业界优秀的咨询师 袁英杰 老师,拥有 20 年编码经验。我从他身上学到了很多思想,这些思想并不是空谈,而是真真实实能够实践的参与编码。
在大师参与我们项目之前,虽然是重构项目,整个项目仍然采用 同步 并发编程模式:直接操作线程,毫无规划随意起线程,进而锁扩散到代码各处。周边很多人却没意识到这有什么问题,因为只关注到更高层次的架构设计问题,而不是这些真真正正能够提高生产力的代码。这正是所有 难以复现 问题、 内存不安全 的根源。同样的一个程序猿写代码如果需要考虑锁这么低级的问题,需要考虑竞争问题,那么必然会干扰他真正所需要表达的事,将简单的事情复杂化。那么最简单、最容易推理的模式是什么呢?就是单线程程序,我们非常容易写出正确的单线程程序,同时也非常容易测试这些单线程程序:同步、无锁。
怎么处理并发编程呢?用同步模式写代码,往往会阻塞线程,资源得不到充分利用,同时也需要借助锁。如果采用无锁异步编程(异步没有阻塞线程,在收到响应之前可以干别的),又有那些选择呢?大师选择了 Actor 模型,Actor 之间 Shared Nothing(不共享可变状态),通过 消息 通信,理论上通过少数几个线程既能调度成千上万个 Actor。然而异步编程往往涉及大量回调,同一件事被割裂到各个回调代码中,我们讨论后引入了经典的 Promise/Future 抽象,借助 Monad 将异步代码同步化,这也是 JavaScript 异步编程典型的做法(ES7 引入了 async/await 语法糖更加简化,但在 C++20(coroutine)成熟之前这是妥协的做法)。虽然业界 C++ 有成熟的 Actor 框架,但那个太重量级了,大师选择实现一个轻量级的 Actor 框架。关于 Actor 我事先曾了解过,只不过我可能没能力 Hold 住这个模式,感谢大师助力。
更进一步能够做什么呢?通过给项目设计 EDSL,用更具体的语言表达更具体的领域。提供原子语义,这些语义能够容易 组合 成更复杂的结构、行为,同时又很容易扩展、复用这些语义。这正是函数式编程的一大精髓:行为组合;同样也是 C++ 类运用的精髓:结构组合。大师实现 EDSL 的时候采用 constexpr 手段,而我则采取了更为保守、传统的模板元编程,虽然 EDSL 使用起来一样,但是我的实现起来可读性远远不及 constexpr。同时 EDSL 是在编译时生成语法树,运行时只有少量的开销,零成本抽象运用到了极致。
大师运用了领域驱动设计,其中一个实践手段是 DCI 架构(这个架构提出者正好也是 MVC 架构作者,年轻时提出 MVC,年老提出 DCI),通过小类大对象方式来描述一个对象。对象 (Data) 是大的,其在不同上下文 (Context) 扮演不同的职责 (ROLE),这些职责是小的(单一职责),职责间通过交互(Interaction) 来完成这个场合。具体到代码中,就是将这些小类组合(多继承表达组合)成一个大类,大类实例化成最后对象,即小类大对象,以非常廉价方式避免了上帝类的存在,同时不需要写那么多无聊的工厂、依赖注入代码。
大师还有一个习惯,就是在不改变已有架构的情况下,代码级别封装更加容易使用的 表现层,让程序猿不再编写冗余、重复、无聊的代码。在这之前我也做过类似的事:曾经实现一个延迟计算的函数表模块,用户需要定义 TAG 和函数,每个函数与对应的 TAG 关联,用户得手动维护 TAG 与函数表(通过函数名关联),我重构后用户只需要直接写 TAG 和对应的 lambda 函数,不需要手动建表,也不需要为函数起个和 TAG 类似的名字。诶,只可惜周围人不买账,后来不得不改回去了🤣
在与大师共事的几个月里,我感受到了大师代码里处处充满 组合式思想,泛型、抽象运用的非常优雅,同时我自己也成功尝试用组合式思想实现 EDSL,由于我和少数几个人与大师对接,甚至让大师误以为我们是公司最强团队。在这段时间里,是我成长最快、吸收最多的时间,非常庆幸自己能有这么一个机会让我开阔眼界,同时自己也被破格提拔。大师参与下一个项目后,我面临的考验更严峻,如何将这些技术从原型项目充分运用到最终项目呢?如何在话语权比较低的情况下让周边更多的人理解并接受呢?毕竟大师曾常常自嘲:“我说的他们可能不会同意”,很快我就遇到了这些问题并来到了 2021 年。
2020 年,公司举办 ICT 大会,有幸与会吴咏炜老师的 C++ 性能优化心得、王博的重构经验,受益良多,会后与他们也交流过,他们经常活跃于中国 C++ 技术大会。这一年我也看过很多 CppCon 的讲座,姿势提高了不少,也在公司这个大平台分享数次技术演讲。只可惜因为其他原因未能参加 2020 年的 C++ 技术大会,没能与两位专家面基🤣
2021 年初,我又抓到了一个机会,同时也给自己定下了一个目标,算是我的一个个小小的梦想,希望能够坚持下来圆梦。 「见自己、见天地、见众生」–《一代宗师》