

再见 2020,2021 你好
source link: https://netcan.github.io/2021/01/08/再见2020,2021你好/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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 年初,我又抓到了一个机会,同时也给自己定下了一个目标,算是我的一个个小小的梦想,希望能够坚持下来圆梦。 「见自己、见天地、见众生」–《一代宗师》
Recommend
-
57
-
53
这是融创万达世纪并购的终章,也是两位地产大佬的权杖交接。
-
47
易会满接任证监会主席一职
-
43
Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。由于出身名门,Go 在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经涌出了很多基于 Go 的应用。就在不多久之前,知乎也舍弃...
-
46
Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。由于出身名门,Go 在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经涌出了很多基于 Go 的应用。就在不多久之前,知乎也舍弃了 Python,转 用 Go 重构...
-
35
编者按:本文来自微信公众号鹿鸣财经,作者强家宏,创业邦经授权转载。 凯恩斯说,需求能创造出自己的供给。 很久很久以前,...
-
45
《权力的游戏》开启了电视制作的大成本时代,那么,谁又会是下一部爆款“权游”?
-
15
01 概述 2020 年的年初突如其来的新型冠状病毒肺炎,给全球带来了巨大的危害,中华民族最重要的传统节日 - 2020 年的农历春节也少了些许的节日气氛。 甚至很多在外工作的人,无法回家与亲人团聚。大家每天早...
-
9
再见2020,你好2021创作声明:内容包含虚构创作 今年是我在鹅厂的第一年, 想不到刚入职没几个月就赶上疫情在家里呆了好久, 第一次感受到作为一个中国人是多么的骄傲...
-
7
再见 2019 | 2020 你好 吗? 这一年结束得很黑色幽默。从2017年起,我都以为新的一年会比旧的一年更好,现实狠狠抽了我的脸三次。 毕业逾5年,我自认为在社会上还没有足够的立足之本。失败的经验还未完全转化为成功的砖,落下...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK