Telegram Channel
记录和分享有趣的信息。

Record and share interesting information.

contact: [email protected]
https://www.notion.so/laisky/Cloudflare-outage-on-November-18-2025-2bcba4011a8681e79964ff8933d3c5b2

CloudFlare 对于 2025-11-18 的故障报告。边缘服务设定了严格的内存限制,其中bot modules 限制了能够处理的规则行数。当接收到超过限制的规则文件后导致 panic。而新的 FL2 系统在 bot modules panic 时,没能仅降级 bot 服务,而是全链路 panic,导致全站 5xx。旧版的 FL 系统就很好的仅降级了 bot score 服务,没有对用户业务造成中断。

我个人认为的经验教训就是:

1. bot modules panic 不是问题,有助于尽早暴露错误,但是必须被隔离。
2. FL2 在 bot modules panic 后,应该进行告警和服务降级,而不是整体 panic(Blast Radius)
3. chaos engineering 应该对各种交互都进行测试,比如文件过大、格式错误等等。任何关键服务都不应该信任外部输入,即使这个外部输入来自友方。 Cloudflare outage on November 18, 2025 | Notion
https://laisky.notion.site/Time-Zone-Handling-for-Software-Engineers-A-Comprehensive-Technical-Handbook-2b3ba4011a8680f2b895f51f19b62dad?source=copy_link

让 DeepResearch 帮忙总结了一篇关于时区的报告。最近都不怎么喜欢搜索文章了,想到什么问题就扔给 DeepResearch 让它给我写一篇报告。

因为中国只有一个时区,很多开发人员都会忽略时区问题,我加入很多团队都帮忙处理过时区相关的问题(另一个经常被忽略的是编码问题)。

首先,在用户看不见的后端使用 UTC 时间是一个很好的习惯,但是 UTC 并不是银弹,并不能取代时区。

时区并不仅仅只是相对于 UTC 的一个固定偏移量,而是代表某一地区时间变化的历史和规则。比如某地可能在某一个时刻,决定让时钟拨快或拨慢一小时,这些规则的处理都必须依赖准确的当地时区数据,而不是 UTC 能够解决的。同理,不同的时区也不能随意的互相替换,即使在当前时刻它们的 UTC 偏移量相同。

比如关于冬令时/夏令时的调整,就会导致当地的某一时刻在两个不同时区出现两次,而另一个时刻则根本不存在。

关于时间的存储,UTC 仅能满足对于时刻的存储需求。只要涉及到当地事件、时间的相对计算、日程安排(牵涉星期、月份日期、节假日)等,都必须结合使用当地时区信息进行计算。而且由于用户可能会进行跨时区迁移,最好能够让用户自行选择自己的时区信息(比如 Google Calendar 的做法)。

重点:

* 如果你只需要时刻信息(Instant),使用 UTC 存储和传输是一个好习惯。
* 但是如果你需要任何基于当地时间的计算,必须携带时区信息。

BTW,时区的英文缩写存在重名,在沟通中不要使用简写。比如 CST 既可以是 China Standard Time 也可以是 Central Standard Time。 我以前和美国的团队协作时就遇到过歧义。 🤖Time Zone Handling for Software Engineers: A Comprehensive Technical Handbook | Notion
《Optimize generative AI applications with pgvector indexing: A deep dive into IVFFlat and HNSW techniques》,由 aws 撰写的一片关于 pgvector 索引的文章。

在 LLM RAG 领域,为了处理较长的输入,通常会将文本拆分成较小的 chunks,然后在一些预处理后,将这些 chunks 通过 embeddings 模型生成 vector,存储于向量数据库中。当用户发起查询时,系统会将查询文本同样通过 embeddings 模型生成 vector,然后在向量数据库中进行相似度搜索,找到最相关的 chunks 作为上下文补充。

postgres 搭配 pgvector 插件,是一种常见的向量数据库实现方式。在向量数据库中进行查询,其实就是寻找和目标向量“最相似”的一组向量,“相似”的度量手段有三种:

* L2 距离(Euclidean Distance):计算两个向量之间的欧氏距离。
* Cosine 相似度(Cosine Similarity):计算两个向量之间的夹角余弦值。
* 内积(Inner Product):计算两个向量的点积。可以衡量向量的相似性。

默认情况下,也就是不建立索引时,pgvector 会进行遍历搜索。为了提高搜索性能,提供了两种索引索引:

* IVFFlat 索引(Inverted File with Flat quantization):IVFFlat 是一种基于有监督聚类的近似最近邻搜索算法。它通过将向量空间划分为多个 regions。搜索时,首先仅需要搜索各个 regions 的中心点,找出相关 region 后,再搜索 region 内的向量。
* HNSW 索引(Hierarchical Navigable Small World graphs):HNSW 是一种基于图结构的近似最近邻搜索算法。可以理解为 skiplist,先从最上层(节点最少的层)开始搜索,找到最近点后,作为下一层的起始点继续搜索,逐层往下,直到最底层。

这两种索引都可以显著减少搜索时需要比较的向量数量,从而提升查询速度。而且,为了避免局部最优解,可以设定以多个起始点的方式进行搜索。

文中对 58.6 K 个,总大小为 364 MB 的向量集进行了测试(pgvector 0.6):

* 不使用索引,搜索耗时 650 ms
* 使用 IVFFlat 索引,建立索引 15.5 s,搜索耗时 2.4 ms
* 使用 HNSW 索引,建立索引 30 s,搜索耗时 1.58 ms

可以看出,使用索引对搜索性能提升是很大的。

👆 prev
https://tee.fail/ wiretap 的团队继续发力,TEE 加密芯片对内存加密使用了确定性算法,同样的明文会生成同样的密文,导致可以通过内存分析破译私钥。继上次破解 SGX 老款芯片后,这次把最新款的 TDX 和 SEV-SNP 也攻破了,可以说 TEE 全军覆灭。

AMD 和 Intel 都表示不会修复,内存监听和改写不属于 TEE 的防御范畴。

看来,TEE 确实只能用来防内鬼,并不能构成一个可以放心地托管给别人的飞地。

* prev
继续学习 Context Engineering 相关的文章,主要看了这两篇:

- 来自 Augment 的 《How we made code search 40% faster for 100M+ line codebases using quantized vector search》
- 来自 Anthropic 的 《Contextual Retrieval in AI Systems》

📒 关于 query 的性能:

1. 利用 ANN 大幅减少 embeddings vectors 数量,提高检索速度。
我理解类似于对向量进行聚类,然后只对聚类中心进行搜索,最后再在聚类内进行精确搜索。
但是不确定 Augment 是自己手写了一个 ANN 的聚合层,还是直接使用了类似 pg_vector 的 IVF 等功能。
2. 对 ANN 方案的优化,对 embeddings index 做 SNAPSHOT。只有搜索的 chunk 在 SNAPSHOT 中时才触发 ANN 加速,否则走传统的线性扫描。
这样就可以适应无时不刻都在动态更新的代码库。

📒 关于 query 的准确率和召回率:

1. embeddings vectors 擅长 semantic search,但对精确匹配不友好。结合 BM25 来提高精确匹配的能力。
2. 在 embeddings 以前,先为 chunk 添加上下文信息
有一个优化技巧是,先利用 prompt cache 缓存全文,然后再使用这个 cache 为每一个 chunk 生成上下文。
3. 玄学参数,每次 RAG 提供 20 个 context chunks 的效果最好。Anthropic 的做法是,用混合搜索检索出 400 个 chunks,然后使用 cohere rerank 选出 top20。
4. rerank 会带来额外的延迟,所以 chunks 数量和延迟是一个 trade-off。

👇 next
读了一本很有趣的书,《漫步华尔街》。本书的核心思想可以概括为:市场是有效的,历史上的交易策略往往只是偶然成功,长期来看最有效的投资策略就是“买入并持有”,而最有价值的买入对象就是广泛分散的指数基金。(本书的出版时间早于指数基金的兴起)

本书的内容,就是以学者的审慎态度,对各种流行的投资策略进行了分析,破除那些以讹传讹的投资神话,以及各种泡沫和金融造假的案例,来论证上述观点。其中一个很有趣的例子是,作者还提到了广为流传的“市场与女士的裙摆高度有关”的分析方法,证明历史上牛市与否实际上与裙摆高度并无关系。 #book

- 摘抄
简单学习了一下 https://github.com/github/spec-kit,确实是一个很有趣的项目。

作为一个资深的开发者,在我看来,spec-kit 就是试图在扮演我每天都在做的事情,试图以标准化的方式完成从需求到产品的过程:

1. 模拟场景,撰写 user story。
2. 根据 user story,编写需求文档(相当于 /speckit.specify)。
3. 根据需求,撰写技术文档,进行可行性分析和系统设计(相当于 /speckit.plan)。
4. 根据技术文档,拆分开发任务。如果选择 TDD 的开发模式,则可以同步编写测试用例(相当于 /speckit.tasks/speckit.checklist)。
5. 各个开发人员和测试人员,认领任务,进行开发和测试(相当于 /speckit.implement)。

在我的实际上和 AI 协作 coding 的经验看来,实际上还少了一个很关键的步骤,应该可以视为 /speckit.clarify 的补充,就是收集相关 工具、SDK、API 的详细使用文档,以便于 AI 能够理解和正确地使用这些工具。

我之前使用 Augment Code 时,发现它对每一个项目,都会维护一个全局的 memory,从而让 Agents 能够在一个统一的上下文中工作。这个 memory 里面,包含了项目的概要,需要关注的重要功能点,相关规范等等,类似于一个专注于当前项目的 Agents.md 文件。这个文件,在 spec-kit 中被称为 constitution。

我可以理解,对于那些对标准开发流程比较陌生的初级开发者而言,或者对于那些纯粹 vibe coding 的人而言,spec-kit 无疑是一个巨大的进步,显著提高了开发结果的确定性。不过,有一个地方让我觉得有点奇怪,spec-kit 居然需要开发者手动来逐步执行 specifyplantaskschecklistimplement 这些步骤,而不是直接让 AI 来直接完成这些步骤,对于 vibe coder 而言可能过于繁琐。

从我个人来说,我不会考虑实际使用 spec-kit,有如下原因:

1. 作为一名资深开发者,我已经熟悉了标准的产品研发流程,不需要 spec-kit 用如此笨拙的方式来引导我,它的工作流在我看来过于粗糙。
2. 正如官方的视频介绍中所说,“spec-kit 让你只需要关心 What 和 Why,而不需要关心 How”。但是我认为,目前的模型能力还不足以让我完全不关心 How。
3. 为了降低成本,我倾向于尽可能减少和 AI 对话的次数,而 spec-kit 显然会大幅增加我和 AI 交互的频次。

综上,我认为 spec-kit 是一个很好的试图对 vibe coding 标准化的尝试。它就像一幅重型铠甲,如果你武艺平平,那么它会显著提高你的战斗力。但是对于那些武艺高强的武士而言,它反而会拖累你的身手,让你无法发挥出真正的实力。所以是否要采用它,取决于当前项目对于开发流程的 vibe 程度有多高。

我认为,spec-kit 的价值体现在:

1. 对于 vibe coder,作为一种提高标准化和确定性的工具,提高产品质量。
2. 对于和 AI 协作的开发者,提供了一个参考,可以用来优化开发流程和 prompt 设计。
3. 对于 agents 的设计者,提供了一个完整的和用户交互的流程,可以用来设计能够完成用户需求的 agents。

Ps. 我更倾向于认为,spec-kit 所提供的辅助,很快(或者已经)被强化学习或 fine-tuning 内化为模型本身的能力,而不需要外部的工具来辅助。

最后,我个人对开发模式的看法是,短期内 AI 编程 Agents 仍然和资深开发者存在一些本质上的差距,但是这并不影响它能够极大的提高开发效率,并且独立完成大量的产品。我认为,短期内两种不同类型的人类开发者角色将会并存:

1. 一种是白盒开发,人类开发者掌控核心的细节,AI 扮演辅助角色,帮助人类开发者提高效率。
2. 另一种是黑盒开发,也就是所谓的 vibe coding,AI 扮演主导角色,人类开发者主要负责提出需求和验收结果。

这两种模式都有其适合的场景和生存空间,具体选用什么工具和开发流程,还是要取决于具体的项目需求。 GitHub - github/spec-kit: 💫 Toolkit to help you get started with Spec-Driven Development
Back to Top Telegram Channel