起名字太难了,直接写日期算了。
本文写的啥?就是常规流水账一下,免得过的太稀里糊涂。
工作体验
从年初到现在干了啥?
最开写搞 C++ 搞共享内存 IPC,在 Envoy 里瞎搞,最后在相对 low level 的连接层面上做了集成,无痛支持了上层各种 filter,挺有意思;后面支持各种 golang 框架,也还挺顺利。收获是更了解了 Envoy 和相关框架的结构设计,顺便再次入门 C++(并收获大量 coredump 调试体验=_=)。
C++ 确实是个令人难受的语言。内存安全全靠开发者的共识,设计稍有不清晰或者理解不够深,就会导致生命周期异常,然后就 core 了;即便是老司机,也可能会在某些 corner case 上翻船。
以前我一直认为,C++ 的难度来自于开发者的认知不够;但现在我更倾向于认为这是来自于语言缺陷。作为高级语言,它不应当仅仅是 C with Class:更多隐式的东西,应当被尽可能显式地表达出来,就比如变量生命周期;安全与不安全的边界也应当明确清晰,这样才好划分职责和提供保证。
于是开了个新坑:Rust 版 Service Mesh Proxy,最初版本的计划是直接在 Linkerd2-proxy 上改。糊改了一通,测了一下 HTTP 场景性能提升了 10%:没太大实质性的性能提升,但是开发体验确实更好了。然而仅仅是这一点提升,不足以推动整个内部版本的切换。
由于很多 CPU 花在拷贝和 syscall 上,如果能基于一个 thread per core 模型 + iouring 的 runtime,性能应该会有更大的提升:测试发现裸 iouring 性能提升确实可以。社区有一个 Glommio 是 thread per core 模型,支持 iouring;然而测试了一下,性能还不如 tokio。分析下来是内部做了太多乱七八糟的无用逻辑(iouring 的初始化参数含义都搞错了),且为了兼容 tokio 的 io 接口做了额外拷贝,那就没意思了嘛。
自己做了一个 Runtime,thread per core + iouring,初版实现即相比 Tokio 提升了 35% 吞吐,还是挺开心的。后面就是自研 Proxy 开始卷啦(坑变大了),落地后应该会有很大性能提升吧(顺便还研究了一下 eBPF,不过似乎用不上)。
除了 Mesh 相关的工作,最近几个月也从零造了好多 Rust 版内部基础轮子和 RPC 框架,RPC 框架的经验最后沉淀为一个半成品教程对外发布,收获了外部的一些认可。
有一说一 Rust 确实舒服,满足了我对优秀 PL 的绝大多数要求。搞事情还是要搞自己认同的东西,和自己作对不但难受,还没啥积极性。良药苦口利于病,但在选择工作上,一开始觉得苦口的东西大概率一直会苦下去,即便它是世人公认的良药。
一些想法
最近发生了好多奇奇怪怪的事情,包括公司内部和社会上;近的和远的。我越来越觉得信息的公开和自由流动是社会公平的必要条件。如何构建一个高效且公平的系统?
基于个体自利趋势构建的系统从机制上就不能做到足够高效透明。这个体系下的公平度和透明度以及信息自由度是成正比的,因为只有每个人的信息和话语权都比较平均时才能起到互相制衡的作用。
- 从话语权和资源的角度上讲这是不可能的,就像光滑的跷跷板,平衡状态是脆弱的,轻微的扰动即可将系统置于一个极端状态,越有话语权的个体越容易加强自己的优势。
- 从另一个角度讲,当不公平度到了某种极端时,社会底层的人民就会揭竿而起。历朝历代人类社会都没能摆脱这种循环:勇者终会成为恶龙。
和平的年代社会状态会处于上述 1 和 2 之间,允许一定程度的事实不公,由于信息的不对等,显然事实不公和公众认知中的不公程度是不同的。认知不公的阈值取决于信息自由和社会共识,不幸的是,这些都可以被操纵。
作为这种状态的得利者显然是当权者,而真正提升生产效率的是科学家研究者,真正创造价值的是最底层的工人农民。我不认为存在即合理,这不是一种公平的分配,这套机制 works but not efficient nor good。
我希望能够构建一套新的体系:基于新技术让每个人能够公平地获得信息。为了确保这套系统本身的正确运行,其应当基于智能算法而不是人,有种 Psycho-Pass 的感觉了。算法受每个个体监督,决策过程对所有个体公开,并保持最小化。其实和目前的机制区别不大,只是将法律、法院和行政机构替换为公开算法,以排除人的个体自利。
除了更公平的分配,排除了互相制衡带来的人为限制(作为系统运行的成本这个代价并不低),个体更能够得到更充分的信息,发挥个人能力并保持自由。这是我对社会这个系统的理想状态。
— UPDATE-2021-12-04 —
最近经历了一些糟心事(非技术的);另外也读了一点点书。
糟心事主要关于职业发展和公司内外的机会。对我这种纯技术岗,非技术因素的影响甚至大于技术上的,我觉得这是大组织的通病,严重到一定程度可以视作组织效率量变引起质变的开端。
细细想一下在职级和管理层次上的 trade-off:扁平化管理看似完美,减少了 proxy 层数来保证政策的更忠实原味执行,也一定程度上节约了企业开销。但 proxy 层数的减少意味着每层 proxy 的负荷增加,受限于个人精力,必然又会产生一些隐形的 proxy。
这些隐形的 proxy 地位没有得到正式承认,所以更容易被画饼,也会更激进地做出一些能够有效巩固地位的事情,更加“对上负责”。所以扁平化管理说到底还是纸面上的东西,中看不中用,没有实际地解决组织上的问题,甚至会导致一些“吃相难看”的事情发生。
最近读的书有一本是《中国国家治理的制度逻辑》。这本书探讨中央权威和地方政府的关系,其中很多问题和解法也挺适合类似企业的组织。
这本书里提出的一些概念:逐级分权、向直接上级负责制;基层政府的“共谋现象”、行政关系人缘化、非正式谈判博弈、出于私利的政策曲解;运动型治理机制常规化等,在我时间并不长的社畜生涯中都有较好的映射。
这套机制并不会带来最高效的组织,但在这个体量下它能勉强 work。感觉目前字节的状态和一鸣同学的理想结构渐行渐远,可能大组织的未来必然是失败吧。