# 3

1. 每日一句分享：

   Objects are data with functions. Closures are functions with data.
2. 快餐文分享：

   Solid.js feels like what I always wanted React to be

   <https://typeofnan.dev/solid-js-feels-like-what-i-always-wanted-react-to-be/>

   一篇介绍 Solid.js 的软文。

   作者直击 React 开发时的复杂度：React 并不是 Reactive 的，Runtime 的概念会让 代码不好维护、造成性能影响，说的都非常有道理。后面引出了 Solid.js，一个真正形式上的 Reactive 框架，没有 runtime，没有显示标记依赖等。
3. 快餐文分享：

   Early peek at C# 11 features

   <https://devblogs.microsoft.com/dotnet/early-peek-at-csharp-11-features/>

   宇宙第一甜的语言 C# 近期发布了 11 版本，文章梳理了其中的一些语法特性。

   1. 字符串内计算能力增强
   2. 列表模式匹配，不但支持数据还支持切片，看起来非常的甜
   3. 非空参数断言，感觉不如设置关键词来代替，符号太多 阅读代码时会解析困难。
4. 分享一个有学习价值的库，可以快速用来熟悉语言。

   A Lodash-style Go library based on Go 1.18+ Generics

   <https://github.com/samber/lo>

   再补充另一个 质量很高的 sdk 扩展

   <https://github.com/bradenaw/juniper>
5. 快餐文分享：

   It's always been you, Canvas2D

   <https://developer.chrome.com/blog/canvas2d/>

   文章从多个方面介绍了 Canvas 的新特性与现有能力，其中值得一提的是 文字绘制能力基本追平了 CSS.
6. 每日一句分析：

   要么是用户控制程序，要么是程序控制用户。
7. 好文分享：

   Why Static Languages Suffer From Complexity

   <https://hirrolot.github.io/posts/why-static-languages-suffer-from-complexity>

   一篇介绍 设计静态语言时复杂度不可控的论述文。

   文章篇幅比较长，章节较多，整体一直是围绕着 静态语言的不足展开。静态语言中最重要的就是类型系统，类型系统虽然可以让语言表现的更有张力，为程序赋予了编译时的检查能力，但如果过度重视会语言的不完整性，造成了运行时的二义性。作者引用了很多例子说明这一点，就不展开了。

   程序的复杂度除了来源于问题的本身领域，更多由 追求完整性的表现造成的，摘录：

   Combining statics and dynamics in a single working solution is also complicated since you cannot invoke dynamics in a static context.

   Programming languages ought to be rethought.
8. 项目分享：

   <https://github.com/neurocollective/go_chainable>

   With generics, allowing chainable .Map(func(...)).Reduce(func(...)) syntax in go

   一个实现通用方法 链式调用的库。

   库源码很简单，定义了两个接收泛型的复合类型 wrapper，实现都是样板代码。仔细读下来 库中存在明显的问题，链式方法不支持类型转换，这其实反映了语言类型系统的缺失。
9. 每日一句分享：

   战争之后，所有的相机都到别的战场去了。
10. 快餐文分享：

    巨亏 55 亿，你的「三连」救不了 B 站

    <https://mp.weixin.qq.com/s/oYx2Y_85hmhGvolzhOwyBQ>

    一篇围绕 B站 21年报 对内容消费产品商业模式的分析文章。

    从文中可以看出，B 站目前的窘态，对于内容消费的产品来说，营收是产品商业模式重要的外在表现，它与用户增长其实是相辅相承的，用户增长带来流量，不可避免的会带来营收，而营收也会反哺这个闭环，从而做更多的用户增长。

    为什么 B 站月日活 4 亿，存在一定流量还是亏损呢？我猜测原因有二，一是产品变现出了问题二是用户价值不高。

    文中对于 B 站变现的动作说了很多，总结来说是 没有投入正确的方向。用户价值不高指的是用户与变现的动作不 match，就比如我看 B 站经常刷到一些乱七八糟的作者商单，自然没有消费心理，而这些商单理应是根据用户画像准确推送的。
11. 快餐文分享：

    Introduction to GPUs with OpenGL

    <https://engineering.monstar-lab.com/en/post/2022/03/01/Introduction-To-GPUs-With-OpenGL/>

    一篇介绍 OpenGL 与 GLSL 基础概念的文章。

    文中用一个画矩形的过程，引出了 OpenGL 中相关概念，其中涉及了很多 GLSL 上的对 drawing 的建模思想，整体而言很偏领域性。
12. 每日一句分享：

    These walls are funny.First you hate them,then you get used to them;Enough time passes,gets so you depend on them.That’s institutionalized.
13. 好文分享：

    低代码平台边界探索：多技术栈支持及高低代码混合开发

    <https://mp.weixin.qq.com/s/5h2K8ektFD1ZNilCxrRbXA>

    一篇从多个维度介绍 Low Code 平台的好文。

    文章虽然面向的是华为内部场景，但有很多思想都是搭建领域的通用方案，这种文章可以帮助我们很快建立起特定领域的思维框架。

    我下面随文章脉络，简单梳理下各个部分。

    1. 文章开始引出低代码的定义，指出其缺点，这里是有所偏失的，引用自 Gartner 的定义：“...以牺牲跨平台的可移植性、应用开放性为代价来提高生产效率。”。我并不认同 Gartner 的第一点定义，对于 Low Code 的本质来说，跨平台的差异其实在于物料层，并不在于搭建本身，搭建可以由专门的领域去承载 如 Web，不同平台的物料可以提供 Web 化的形态，所以 Low Code 与跨平台不是同一维度；而第二点作者的解读，我也不认可，作者在文中指的应用开放性是 应用级别的，而应用级别是更加广泛的开放，其实 Gartner 这里指的是物料开放，显然 Low Code 中使用的物料存在或多或少的约束，但我们可以借助中间层 或者 规范收口层 让其物料产物可对接更多的场景。
    2. 文中探讨了一个我非常有同感的话题，Low Code 与 20 年前流行的 Delphi、WinForm 有什么差异，作者说的三个 LowCode 意义价值中，个人认为只有第一个站得住脚，Low Code 面向非研发人员，那么问题延伸到 非研发人员为什么要搭建应用呢？因为一直存在的数字化转型的场景；而至于作者提到的另外两个价值，其实算是 Low Code 领域下出现的新问题..
    3. 文章提到了 Low Code 解决方案，该方案比较常见了，(这里作者使用“区块”封装了 组件的概念，自建名词)，其实这里也算是 LowCode 的价值之一，降本增效。
    4. 作者从技术视角提到了如何在不同前端技术栈中复用组件，作者给出了 web-components 的方案，这里推荐感兴趣的同学了解 微前端，Low Code 领域 与 微前端领域 所面临的问题存在明显的交集，如 技术栈打通、沙盒运行，可执行文件加载运行等。
    5. 文章提到了 Low Code 中非常值得讨论的一个话题，搭建后的产物是如何生成的？常见的有两种方式：运行时渲染、生成源码。作者分别梳理了这两种方式的优劣势，不过整体比较发散，简单来说 运行时渲染的方式 利于平台的扩展性、用户预览的体验，生成源码的方式利于 产物的性能、二次开放的场景。
    6. 关于平台的架构设计，可以看出由上往下 扩展得大而全，有很多抽象的二次封装大一统，算是大厂基建的通病了，不管用户使用体验如何，具体问题是否解决，先把事情搞大..
14. CJS 如何在代码层面快速迁移到 ESM&#x20;

    ![image-20220401192336417](/files/Nvu9s6bTxHdrfNXaPLhS)
15. 快餐文分享：

    Inspecting Web Views in macOS

    <https://blog.jim-nielsen.com/2022/inspecting-web-views-in-macos/>

    事实证明 因为天然的动态性与强大的跨平台能力，Hybrid 形态的应用无处不在。

    作者在打开 Webview 调试开关后发现，iCloud Native 应用有很多页面已被 Web 技术栈渗透。
16. 最新 TC39 提案:

    ECMAScript proposal: Types as Comments

    <https://github.com/giltayar/proposal-types-as-comments>

    背景：减少 TypeScript 侵入性，摆脱二次编译，使用注释方式声明类型信息。 提案中的类型标注 严格属于 TypeScript 中的子集，只是移除了部分非 JavaScript 标准的语法。

    提案中的愿景在我看来并不适用于 C 端，就像软件与硬件的发展，高速发展与稳定迭代之间是一直存在 Gap 的，必然会使用某些技术手段抹平，并且方案中提到 类型标注是在 运行时移除，这对文件体积是会有不利影响的。

    方案最后有很多 QA，其中涉及了 TC39 与 TypeScript 之间的发展关系、类型系统未来的演变方向等。
17. 分享一个小巧 REST Client 请求库：

    <https://github.com/johannschopplich/uncreate>

    源码很精炼，只有 60 行代码。主要工作是 通过 Proxy 实现声明式的路径请求，如： `await api.users(userId).get<UserResponse>();`
18. 快餐文分享：

    H.264 is Magic

    <https://sidbala.com/h-264-is-magic/>

    文章介绍了 H 264 编码中压缩的主要思路。

    分为三个措施：信息熵量化、色彩信息精简、运动补偿机制。 前两个措施是 空间维度上的优化，运动补偿是时间维度上的优化，我简单介绍下这三个措施：

    信息熵量化：是将一帧的数据转换为某种分布规律的数据形式，这个过程属于无损的编码转换，而转换之后的数据可以进一步地做信息密度的量化，从而压缩一帧的图片体积。文章抛硬币的例子很通俗异同，在现实生活中无损编码的例子也比比皆是，如进制的转换。

    色彩信息精简：指的是优化掉人眼无需要的色彩信息。

    运动补偿机制：算是比较经典的视频压缩算法，通俗来说是根据之前帧与当前帧的块级信息的位置差异，来弥补当前帧，从而去掉序列冗余。

    与之前提到的流媒体 VP9 算法，动态补偿机制应该是同一原理。
19. 快餐文分享：

    Browser In The Browser (BITB) Attack

    <https://mrd0x.com/browser-in-the-browser-phishing-attack/> <https://github.com/mrd0x/BITB>

    一个脑洞很大的攻击方式。

    使用前端技术栈模拟 弹窗登录，这种方式类似于常见的钓鱼网站，不过 mock 的目标变成了组件，这种方式不仅成本低，并且用户容易忽视。
20. 快餐文分享：

    理解 Language Server Protocol 的工作原理

    <https://juejin.cn/post/7051453384645148680>

    一篇介绍 LSP 基本概念的文章。

    LSP 重点在于其架构设计，通过引入规范协议将编辑器中的语言服务抽离出来，隔离了具体语言框架与编辑器，算是一个很典型的沙漏模型案例。
21. 快餐文分享：

    Delightful React File/Directory Structure

    <https://www.joshwcomeau.com/react/file-structure/>

    一篇关于前端项目中 工程结构最佳实践的文章。

    文章针对不同内容场景 输出了一些观点，个人感觉很收益，简单总结下：

    1. 不要存在过多的 index 文件，index 文件应只用于管理 export，实际的逻辑由同名文件承载。该实践最大的好处是 可以加速检索文件的时间。
    2. helpers 不等于 utils，前者应与项目场景相关，后者是通用的逻辑。
    3. 维护 constants 文件，这里我展开一下，如果项目中常量定义过多，建议使用 文件(\*\*.const.js) 或者 复合结构(更推荐) 区分。
    4. 推荐根据文件的定位 而不是 具体逻辑 分类。
22. 项目分享：

    sysend.js - <https://github.com/jcubic/sysend.js>

    一个具有学习价值的库，通过 localStorage / BroadcastChannel 实现跨 tab 之间的同域通信。

    虽然项目文件很精简，但整体完整性很高，感兴趣的同学可以看下。
23. 快餐文分享：

    Dependency Injection in Node.js

    <https://blog.risingstack.com/dependency-injection-in-node-js/>

    一篇介绍依赖注入基础概念的文章。

    曾几何时，我非常讨厌依赖注入、设计模式这些“故弄玄虚”的概念，认为其只是常见的编程技巧，没有造词的必要。

    但最近有了一些更深的理解，在开发中，经常会对所在域的不同实体进行抽象建模，而不同实体之间 因为责任范围或多或少的存在逻辑交集，逻辑子集，想要垮范围使用其他实体能力，必然涉及到模型之间的组合，这是依赖注入的意义之一，这一点很像函数式中的组合子，将不同的逻辑融合来增强函数。

    依赖注入的另外意义是 管控 实体的输入，这一点很像函数式的偏函数，隔离了不同依赖的出现时机。

    所以综合来看，依赖注入、设计模式在特定的场景下是可以解决问题的。这些模式在我看来更像是某些编程技巧、函数式理论 在 OOP 这个域上的延伸。

    关于 IOC 最佳实践，推荐一个功能全面的库：

    <https://github.com/jeffijoe/awilix>
24. ![image-20220401192439333](/files/gZIyt4RJXcUkP8cKXDjO)

    CSS properties and their initial step in the pixel pipeline

    图片来源： <https://www.freecodecamp.org/news/web-animation-performance-fundamentals/>
25. 快餐文分享：

    Give me a browser, I’ll give you a Shell

    <https://systemweakness.com/give-me-a-browser-ill-give-you-a-shell-de19811defa0>

    如何通过浏览器获取当前环境的 shell，一段有趣的实践。
26. 分享一个检测网页产生碳排放的工具：

    Are my third parties green?

    <https://aremythirdpartiesgreen.com>

    以下内容摘要自工具：

    It's estimated that global information and communication technology (ICT) accounts for around 4% of global CO2 emissions. That is about equivalent to Germany's national emissions (the world's 7th largest polluter), and is more polluting than the civil aviation sector.
27. 每日一句分享：

    A broken watch gives the time correctly twice a day – Unknown
28. 快餐文分享：

    Hooks Considered Harmful

    <https://labs.factorialhr.com/posts/hooks-considered-harmful>

    一篇讨论 React Hooks 设计不合理性的文章。

    内容整体比较发散，引起共鸣的点有二，一是 state 管理依赖的方式过于原始，二是 hooks 运行的时机，运行的次数很难把控。

    除了文中提到的观点，hooks 对开发者的心智成本、项目中 state 的管控都有很大影响。本质上 React 是个由 state 驱动的 runtime，如果没有一个很好处理 state 的机制，则开发者就不得不面对带来的复杂度。
29. 项目分享：

    dum - An npm scripts runner written in Rust.

    <https://github.com/egoist/dum>

    dum 是知名开发者 egoist 的个人作品之一，项目中使用 rust 降低了执行 npm 命令的时间。

    从压测数据中可看出，使用 rust 开启进程 执行 node 脚本，会提升 npm 命令数倍性能，可以看出 npm 命令主要的性能瓶颈在于 node 桥接层。

    项目整体比较精简，是个很好的学习案例。
30. 快餐文分享：

    Please put units in names

    <https://ruudvanasseldonk.com/2022/03/20/please-put-units-in-names>

    一篇介绍代码最佳实践的文章。

    文章的关注点聚焦于魔法数字，文中梳理了 一些使魔法数字具有可读性的方案。

    第一种方案可以称为 parameter hint，像一些编程语言在 语法层面存在该特性，如python、kotlin ，现代的 IDE 一般也都具有该功能。

    第二种方案类似于类型别名，该方案就极度依赖语言特性了，并且在运行时 语义大概率会被抹出。

    我经常实践的方案是数字计算，定义一个基本的单位产量，如 Second = 1000，然后魔法数字 foo = n \* Second 这些。这种方式的好处是 可以方便的升级计算公式，且具有很强的语义。
31. 惊讶系列分享：

    A regular expression to check for prime numbers

    <https://www.noulakaz.net/2007/03/18/a-regular-expression-to-check-for-prime-numbers/>

    使用正则表达式 判定素数证明 - `/^1?$|^(11+?)\1+$/`

    文中针对原理介绍很详细，感兴趣的同学可以看下。

    延伸来看 正则引擎可以匹配出所有非负的数字公式，这些公式使用正则去描述，两种不同领域之间的表达映射，实在是妙…
32. 好文分享：

    Lisp的永恒之道

    <https://www.cnblogs.com/weidagang2046/archive/2012/06/03/tao_of_lisp.html>

    一篇论证编程语义的好文。

    文章从多个角度介绍了编程语言中 语义的重要性，以 lisp 为主导论证了语义的强大之处。

    从语义的角度出发，业界中常见的编程语言 本质上是基于底层（操作系统、网络模型、持久化这些域）提供的 DSL，或多或少都不太纯洁，比如在 C 系列语言中，用户需要关心 语言的内存管理，在 非 ML 系语言中用户需要留意 递归爆栈..

    用户使用这些编程语言往往解决特定场景下的问题。这些问题是场景所赋与的，比如做电商平台，不同的商品模型是需要不同的建模策略。 理论上，在这些业务域上 使用常见的编程语言去抽象建模是不自然的，创造的思想会被编程语言所限 且 思想的表达会被语言的细枝末节所淹没。

    解决问题的方案会明显，针对业务域的问题 创造专属的 DSL，扩展思想表达的能力，然后 研发编译器去将 业务域的思想 翻译到 底层。 很明显该逻辑已经被反复验证了 (上述的问题换成计算 DSL 换成 编程语言)。

    那么问题是 DSL 表达能力如此强，为什么业界没有广泛应用呢？我猜测原因有两点：一是 人(需要强有力的技术专家推动)，二是 问题量级。

    延伸阅读：

    王垠 - DSL 的误区 - <https://www.yinwang.org/blog-cn/2017/05/25/dsl>

    从文中可看出 垠神对 DSL 持反对态度，其实不难理解 文中提到的 DSL 算是 常见编程语言的能力 子集..

    我认为 DSL 所在的意义可看之前的一条分享。
33. 每日一句分享：

    We talk a lot about “passive income,” but not as much about “passive social capital” or “passive knowledge gaining” — that’s what you gain if you build an asset that grows over time without intensive constant effort to sustain it. A few examples include starting a company, an angel portfolio, a newsletter, or a podcast.

    摘录自： Build Personal Moats

    <https://eriktorenberg.substack.com/p/build-personal-moats>

    文章介绍了 个人护城河的重要性，以及如何找到自己的护城河。
34. 快餐文分享：

    Tao of Node - Design, Architecture & Best Practices

    <https://alexkondov.com/tao-of-node/>

    一篇探讨 Node 服务最佳实践的文章。

    文章整体篇幅很长，涉及的方面比较广，主要分为项目结构，应用结构，请求处理，错误处理等等方面，感兴趣的同学可以刷一下。

    对于文中大部分的最佳实践，社区内常见的 Express Koa 框架，因为设计的机制 是需要开发者投入人力的，这里我推荐 一个大而全的成熟解决方案 NestJS。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://thinking.simonaking.com/archives/2022/3.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
