Laisky's Notes
رفتن به کانال در Telegram
记录和分享有趣的信息。 Record and share interesting information. contact: telnotes@laisky.com
نمایش بیشتر3 261
مشترکین
+424 ساعت
+87 روز
+4630 روز
آرشیو پست ها
3 262
简单学习了一下 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 居然需要开发者手动来逐步执行 specify、plan、tasks、checklist、implement 这些步骤,而不是直接让 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。
最后,我个人对开发模式的看法是,短期内 AI 编程 Agents 仍然和资深开发者存在一些本质上的差距,但是这并不影响它能够极大的提高开发效率,并且独立完成大量的产品。我认为,短期内两种不同类型的人类开发者角色将会并存:
1. 一种是白盒开发,人类开发者掌控核心的细节,AI 扮演辅助角色,帮助人类开发者提高效率。
2. 另一种是黑盒开发,也就是所谓的 vibe coding,AI 扮演主导角色,人类开发者主要负责提出需求和验收结果。
这两种模式都有其适合的场景和生存空间,具体选用什么工具和开发流程,还是要取决于具体的项目需求。3 262
在计算机安全领域,我们将防御粗略分为三个领域:in-transit, at-rest, in-use。
HTTPS 可以保护 in-transit,AES 可以保护 at-rest,而 TEE 就是注重于保护 in-use 时的内存数据安全。理论上,一个妥善配置使用的 TEE,可以让用户放心地在不信任的环境中运行代码。
比如你作为一个版权所有方,可以要求对方提供可验证的 TEE 环境,然后你才会将重要的数据传输进对方的 TEE 加密环境中。即使这台机器完全在对方手中,TEE 硬件也会保障你数据的安全。
然而,这个安全神话最近被无情的打破了。研究者发现,SGX 的 CPU 和内存间的加密通信使用的是确定性的加密算法(deterministic)。那么通过运行一个自定义的 TEE 应用,然后再拦截内存总线上的加密数据流,就可以让 TEE 的内存加密芯片扮演一个 oracle 的角色,从而为攻击者提供充足包含时序信息的密文,从而推断出 TEE 签名 QE REPORT 所使用的 ECDSA 私钥。
拿到签名私钥后,就可以为任意伪造的 REPORT 签名。而 SGX 正是通过 REPORT 来证明当前程序运行在一个可信的 TEE 环境之中。那么攻击者就可以实际在非加密环境中运行程序,但是仍然提供一个可信的 REPORT,从而骗取数据提供方的信任。
很可惜 Intel 也不打算修复这个问题,那么 TEE 的安全性的基础(Trusted Computing Base, TCB)就得包含:
* TEE 硬件
* 可信的 host OS
* 可信的物理机器维护者
作为一个曾经的 TEE 开发者,说实话,前两者还可以通过软件手段来保障。但是最后一条,感觉完全扭曲了 TEE 的意义。如果你原因信任机器的提供方,那么实际上 TEE 的意义就完全成为了防内贼而不是外贼。
扩展阅读:
* 我以前写过一系列介绍 TEE 的文章
* https://wiretap.fail/
* Intel 的回应: More Information on Encrypted Memory Frameworks for Intel Confidential Computing
3 262
最近很迷莱姆(Stanislaw Lem)的科幻作品。但是他的书并不好读,除了个别外,很多书都没有跌宕起伏的剧情和宏大的背景设定,反倒是充斥大量颇为“艰深”的深层世界观阐述,需要经过一番费力的脑力搏斗才能理解那些看似随意的描述,从而获得最终的解题的快感。
我认为《真空》和《其主之声》这两部作品就能最好的解释莱姆自己的风格。路径曲折,但是却没有实际意义上的内核故事。读者不要期望会有一个具体的故事,只是在攀登的过程中去感受复杂性本身。
《星际旅行日记》中,通过对过去和未来的穿越,寥寥数语就阐述了未来宗教随着科学的发展而不断受到挑战并革新的进程,令人叹为观止。
有的作家靠一个点子就能写一本书。而莱姆则是用浩如烟海的点子堆出了一本本的书。 #book
3 262
学习了一下 Golang 1.25 的新特性,主要包括以下几点:
1. JSON v2。性能提升,支持自定义序列化反序列化。支持通过 options 参数控制序列化过程。
2.
synctest 可以自动跳过时钟等待的时间,加快测试
3. GOMAXPROCS 原生自适应 CGROUP
4. 实验性质的 Green TEA GC 新算法,通过以 SPAN 为粒度的聚合来提高缓存局部性
5. os.Root 可以设定文件系统容器,防止路径逃逸
6. hash.Hash 支持 Clone() 方法
> READ MORE3 262
读完这本著名的《Deep Learning》。此书专注于传统神经网络的数学解释,介绍了相关数学基础、感知器、深度网络、CNN、RNN,还有模型训练、评估等多方面的数学知识。
我不是算法研究员,只是一名工程人员,读的不是很细,也不追求理论上的完全掌握,只希望能对技术实现有高层次的理解,知道它们是什么,适用用来处理什么任务,就足够了。
阅读此书我还有个收获是,作者经常用寥寥数语就透彻地阐述了一些数学概念的实际意义。
比如我们如此执着于为矩阵计算特征值和特征向量的目的,就在于矩阵运算很复杂,而将向量投影到特征向量空间后,相对应的矩阵运算就成为了简单的特征值倍数的拉伸操作,极大简化了计算复杂度。
还有 CNN 里的卷积核,名字听上去很吓人,实际上就是用一个低维小张量(卷积核)取代一整层的权重参数,然后对着一层的每一组 input 重复使用这个核去求算下一层的输入。这种做法极大缩减了模型的总参数量,而且对于“计算相邻像素差值”之类的图像识别任务非常有效。
开卷有益,即使没读懂也能有所收获。 #book
3 262
读完了 Alvin Toffler 未来三部曲:
* 权力的转移(Power Shift)
* 未来的冲击(Future Shock)
* 第三次浪潮(The Third Wave)
《权力的转移》这本书让我更好的理解了《主权个人(The Sovereign Individual)》这本书中对国家暴力的阐述。权力的核心在于欲望,你能满足别人的欲望,你就掌握了对别人的权力。工业时代国家实现了对暴力的垄断,人们的一切争端都需要通过国家机器来解决。随着经济的增长,和自给自足被完全消灭,贪婪成为了权力的核心,国家通过对经济的控制来实现权力。
作者在《第三次浪潮》中还阐述了对人类社会影响最大的三次全球化变革:
1. 农业革命,代表村庄、城市的出现
2. 工业革命,彻底消灭自给自足,代表有国家机器、批量生产、工厂式教育。社会被区分为生产者和消费者。
3. 正在进行中的变革,随着信息技术和工业的发展,消费者再度取代了生产者的地位,变成产消合一者。
整个社会的趋势,似乎正在回归过去的小规模自治的村庄,只不过是通过更高的工业技术和信息技术实现的。 #book
3 262
读了两篇关于 prompt/context engineering 的文章:
* Manus 之外:实战笔记(1)薛定谔的缓存
* Context Engineering for AI Agents: Lessons from Building Manus
最重要的还是 KV-Cache,Manus 甚至称之为衡量 agent 框架的最重要的指标。因为 Transformer 的单向注意力机制 (Causal Attention Mask),每一个 input token 都只会使用它前面的全部 tokens 计算 KV。所以,保持 context prefix 稳定,可以极大提高 KV-Cache 的命中率,从而提高 LLM 输出效率和降低费用。
所以 Context Engineering 中的一个重要策略,就是在尽可能保持 context prefix 不变的前提下,实现各种功能需求:
1. 利用 LLM API 提供的 prefill 特性,利用 tool name 前缀来限定 tools 调用范围。而不是动态修改 context 中的 tools declaration。(OpenAI 不支持该功能,Claude 支持)
2. 使用 JSON schema 定义 tools 时,要注意使用确定性排序的序列化方法
除了提高 KV-Cache 命中率的各种工程方法外,Manus 还分享了一些其他的经验:
* 利用外部文件来提供无限上下文,并且保持 AI 对最初目标的关注
* 在 context 中保留犯错记录,避免重复犯错
* few-shots 需要添加噪音,预防 repetitive decision
很高兴地发现绝大部分内容和我自己的实践中总结出来的经验完全一致,甚至连用法也是一致的。不过 prefill 这个技巧我是第一次学到,过去过于关于 OpenAI 的 API,没想到实际上其他家,尤其是 Anthropic,已经有很长远的发展了。
3 262
+3
我过去一直不太喜欢莫言,以前读过他的《丰乳肥臀》和《檀香刑》,都没找到太多共鸣。但最近读了他的《生死疲劳》,感觉很棒。
书的主要内容很简明,通过一名被枪毙的地主在自己土地上的六次转世,描写了中国从建国至 2000 年期间的制度变迁与乡民的命运。尤其其中各个主要人物的性格刻画与境遇,可谓是精准地抓住了时代的刻印。
回想起来,我很喜欢这种时代大背景下对个体命运的洞察与刻画。深受我喜爱的,类似题材的作品还有:
* 《静静的顿河》(And Quiet Flows the Don):苏维埃成立初期,顿河流域哥萨克农民的命运变迁。
* 《白鹿原》:抗战和内战背景下,陕西关中地区的农民的命运。
* 《荆棘鸟》(The Thorn Birds):澳大利亚的乡民家庭的命运。
* 《百年孤独》(One Hundred Years of Solitude):拉丁美洲的家族历史与命运。 #book
3 262
https://github.com/shopspring/decimal?tab=readme-ov-file#faq
搜索 decimal 的库时看到这段 README 很有意思,介绍了为什么在金融应用中不能用有理数(Rational)来替代 decimal。
都知道浮点数只能表示近似值,一般不用于金融领域。而 Golang 中没有内建的 decimal 类型,有些人就提议说可以使用有理数 big.Rat 来代替。但是此文中举了一个通俗易懂的例子来反对这一观点,假设有三个等于 1/3 的有理数
a、b、c,使用 .FloatString(3) 将其转化为 float64 后的值为 0.333,可以看到它们相加后的总额中的 0.001 就消失了。
说到底就是有理数本身虽然没有精度损失,但是将其转换为 float 时会导致精度损失,毕竟你不可能直接给用户显示一个有理数。所以在金融应用中,最好不要使用有理数,而是直接使用整数。而 decimal 存储的实际上就是整数和小数点位置的偏移量。3 262
[ On | No ] syntactic support for error handling - The Go Programming Language
持续了数年之久的 Go Error Handling 之争,算是官方盖棺定论了,结论就是:摆烂。
自从放弃 Go2 方案后,兼容性就成了第一要务,非必要不修改语法。而 Error Handling 虽然长期以来都是社区最不满意的设计,但是关于具体的改进方案始终无法形成压倒性的共识,所以,官方决定,就这样吧,不改了。所有的历史讨论都到此为止,提案也逐步关闭。
并且对一些广受诟病的设计,做出了一些很牵强的解释:
* 语法啰嗦?反正你们有 AI 补全了
* 看起来碍眼?反正现代 IDE 都可以折叠。
* 没有 stack traces?打日志的时候多加一点参数嘛。
写 Go 的朋友喜欢怎么处理 error?我还在用古早的
github.com/pkg/errors 😂。3 262
「Here's how CockroachDB keeps your database from collapsing under load」
其实是一篇关于 Golang Goroutine Scheduler 的文章。众所周知,Go 的 Goroutines 并没有优先级,对于类似于数据库这样的应用,如何在高并发的情况下保证重要任务的执行就会面临挑战。这篇文章就是介绍了 CockroachDB 的做法,通过在原生的 Go Scheduler 外增加一层名为 Admission Control 的调度层,来实现了 Goroutines 的优先级调度。
核心思想就是不要再将大量的 Goroutines 直接交给 Go Scheduler 去排队。而是先在应用层的 Admission Control 内的优先级队列里排队,只将当前系统能够负载的高优先级任务交给 Go Scheduler 去执行,这样就可以保证在高负载下系统仍然能保证重要任务的可用性。
具体的优先级实现有很多很巧妙的设计。比如优先级系统区分为 Token Based 和 Slot Based。对于 CPU 型任务,采用令牌桶算法,根据可用资源的情况来生成令牌,并且分发给任务使用,如果有任务超额使用了令牌,则扣减总的令牌数。而对于 I/O 型任务,因为 I/O 操作会阻塞 Goroutine,所以采用了 Slot Based 的方式,根据当前系统的 I/O 负载情况来动态调整 slot 的数量。而且动态调整的时间间隔也是动态变化的,尽量减少 CPU 消耗。
还观察到,即使使用这个优先级系统提交任务,偶尔也还是会导致 Go Scheduler 过载。而优化方法是将调度下一个任务的逻辑放到 task 的执行逻辑中,这样就只有在 task 被 Go Scheduler 实际交给 P & M 运行时,才会进行调度下一个任务的逻辑,从而确保了 task 不会在 Go Scheduler 堆积。
Refs:
* Source Code: cockroach Admit
* Go scheduler: Ms, Ps & Gs
3 262
+1
前阵子爆火的(过气网红) Manus AI 带火了 machine-use agent 的概念。然而众所周知,如果让 LLM 直接操作本地机器,会产生巨大的安全风险,所以各种沙盒技术也应运而生。正好趁着 https://github.com/trycua/cua 开源的机会,学习一下实现的原理。
首先,LLM 需要具备 vision 和 function calling 的能力。
接下来做的事情就很传统了,启动一个虚拟机,这个虚拟机内会启动一个 websocket server,这个 server 可以还可以通过 pyautogui 对虚拟机执行截图、鼠标和键盘操作。客户端通过 websocket 和 server 进行交互,获取截图并下达指令。
整个操作的循环是这样的:启动虚拟机,固定屏幕尺寸,截图,然后画上网格辅助线,交给 vision llm 识别,交代下一步需求,然后 llm 返回在
(x,y) 执行某个鼠标或键盘操作,然后通过 ws 传输进虚拟机内的 server 执行,并返回执行后的截图,继续循环。
将对虚拟机的所有操作,抽象为一系列的如 left_click(x, y) 这样的接口,然后让 LLM 根据截图和指令,以 function calling 的方式调用这些接口。这样就实现了一个 machine-use agent。
这个虚拟机其实不仅仅可以跑在本地,而是可以运行在任何网络可以连通的供应商上,只要让客户端能够通过 ws 与其通信就行了。3 262
+1
读完《程序员修炼之道:通向务实的最高境界》,书如其名,这是一本面向务实的程序员的经验之书,介绍了务实的哲学、方法、工具和团队协作等方面的内容。读这本书时常让我想起《The Art of Readable Code》,如果你真心热爱编程,并且希望编写可维护的代码,那么非常推荐阅读此书。 #book
* 📖摘抄
3 262
+1
读完 Nadav Eyal 所著的《逆流年代》(Revolt)。此书写于特朗普第一个任期之时,从作者参与一个私人富豪酒会讲起,述说着那些从全球化中获利颇丰的富豪们,如何对以特朗普为代表的逆全球化威胁视而不见,以为这只是暂时的倒退。作者通过对全球化弊端和右翼运动的剖析,深刻地指出世界格局正在发生深层次的变化,全球化时代正面临着前所未有的挑战。
首先,“全球化”并非一个充满美好和进步的乌托邦。全球化的本质是资本的全球套利,其基础是不平等——正因为不平等才存在套利,而套利会进一步加剧不平等。全球化通过将代价转移给公众视线外的外国,带回大量利润,催生了新的一批富裕阶级。但是,加剧的不平等会积蓄社会矛盾,这种矛盾的表现形式就是反全球化的右翼运动。
然而,虽然右翼运动大多发源于经济不平等,其支持者也大多相对贫穷,但右翼的精神核心既不真正关心经济,也不着眼于内政。右翼运动真正的内核是“身份认同”,而全球化正是其身份认同的最大敌人,因此右翼运动必然会全面攻击全球化的国际关系。并且,左翼人士往往以为改善经济状况可以缓解右翼运动,这是一个误解。右翼思潮是一种富有攻击性的“思想病毒”,它和宗教的极端原教旨主义相似,是一种寻求身份认同的群体运动。他们常常对经济等现实问题视而不见,反而热衷于寻找“隐藏的敌人”并加以攻击。
全球化本身所蕴含的失衡已达到临界点,而其所面临的反全球化运动也正在蓬勃壮大。我们这一代人是能够顺利地将这套体制修修补补、勉力维持下去,还是不得不面临世界秩序的崩塌与重构,我们只能拭目以待。 #book
* 📖摘抄
3 262
+1
读完 Chris Miller 的《芯片战争》(Chip War)。看到这个书名时我第一个想到的就是 Eric M. Jackson 的《The Paypal Wars》,本来以为也会是一本围绕芯片的商战故事,结果没想到真的就是字面意义的“战争”,以地缘政治和军事对抗的角度,描述以美国为核心的芯片产业历史。
半导体产业的起源就是冷战时期美国意识到在传统军备上,美国和欧洲已经远远落后于苏联,于是马歇尔和佩里提出抵消战略(Offset Strategy),通过部署精确打击为主的高技术武器,来抵消苏联在传统武器数量上的优势,而高技术武器的技术基础,就是半导体。半导体作为人类工业的明珠,需要庞大的供应链来支撑。苏联虽然凭借强大的间谍网络,几乎获取了美国全部的半导体秘密和零部件,然而即使能够在政治为主的体制下实现技术复制,但却无法实现有利可图的大批量生产,这也标志着在大规模产业链的现代工业模式下,传统的“复制策略”已经失效。
五角大楼的军工订单催生了美国的半导体产业,但是仙童的罗伯特·诺伊斯(Robert Noyce)很有前瞻性地意识到,未来半导体真正的需求一定是民用计算机,而不是军方。所以他不同于那些安于享受高利润军队订单的公司,而是大刀阔斧的降价,让产品能够适用于民用市场,最终开启了蓬勃的民用半导体时代。因为不满足于仙童股东拒绝为员工发放股份的做法,诺伊斯和戈登·摩尔(Gordon Moore)最终离开仙童,成立了英特尔。
还有一段小插曲是,作为二战后扶持日本振兴的国家战略,美国积极扶持日本的半导体产业发展,在日本政府财政扩张的无限支持下,日本半导体迅速崛起,一度占据了全球 90% 的份额。索尼公司创始人盛田昭夫(Akio Morita)在 1989 年出版了《日本可以说“不”》,书中提到日本可以凭借半导体优势制衡美国,甚至可以通过为苏联提供技术支持来打破冷战的军事平衡,这也代表着日本的野心膨胀到了极致。可是随着日本经济崩溃,半导体产业也随之崩溃,大部分市场份额韩国抢走。
接下来的故事就是李国鼎倾尽台湾的政治和经济力量支持张忠谋成立台积电,在美国半导体行业耕耘多年的张忠谋决定发展一套独特的代工产业,台积电声称绝不自研芯片,以表明自己绝不会成为芯片设计公司的潜在竞争对手,专注于芯片代工生产,以低廉的劳动力价格和精湛的技艺,吸引了众多美国半导体公司的合作,并最终成为世界上最大的半导体生产公司,垄断最先进制程的生产工艺。
文章的最后篇幅介绍了华为,称华为的崛起路线和早年的三星很像,“以更低廉的价格,向全世界提供更优质的产品”,华为凭借其庞大的研发投入支撑起了产品的不断迭代,并且在很多领域取得了世界先进的水平。但是,随着美国以国家安全为由开始对中国的半导体产业展开全面遏制,就如同当初苏联失败的“复制策略”一样,中国想要实现完全独立自主的半导体产业链是不现实的,即使中国在十年后能够达到台积电目前最先进的水平,但是以台积电为代表的全球产业链本身也在不断更新迭代,耗资一万亿美元打造的国产半导体在市场上将完全没有市场竞争力,仅仅依靠行政手段的采购无法支撑起这么庞大的成本。如果中国真的要和美国全面对抗,那么中国只能寄希望于打造一个去美国化的全球产业链,但是在美国软件和设计的全面封锁下,一个第三方国家很难无视美国的制裁。 #book
* 📖摘抄
3 262
+1
读完 Camila Russo 的《点对万物》(The Infinite Machine)。以传记的形式,记录了 Vitalik 和 Ethereum 诞生与成长。此书的内容很通俗,不会包含技术细节,也不会包含金融 DEFI,而是只关注与 Ethereum 的成立背景与早期所面临的一系列挑战。
首先最主要的挑战就是,通过 ICO 售卖 Token 这一行为,很可能构成非法销售证券而引起美国证券交易委员会(SEC)的调查。以太坊初创团队花了很多时间和心思,通过将 Token 描述为用户用以支付去中心化应用的使用费(GAS),而不是作为看好核心团队工作的投资工具,让 ICO 被定义为消费而不是投资,从而避免了被 SEC 认定为证券的风险。这一举措也掀起了后来的 ICO 热潮,大量炒作项目通过 ICO 获取了巨额资金,然后跑路或消亡。
另一个挑战就是,因为以太坊提供了图灵完备的智能合约,在带来极大开发便利性的同时,也留下了无穷的安全隐患。2016 年发生的 the DAO Hack 事件分裂了以太坊社区的共识。以 Vitalik 为首的人通过硬分叉挽救了被盗的资金,而许多人认为这重蹈了
too big to fail 的覆辙,破坏了以太坊的去中心化精神,这些坚持 code is law 的人选择继续使用原链,形成了以太坊经典(Ethereum Classic)和以太坊(Ethereum)的彻底分裂。
虽然加密世界继续茁壮成长,但是除去洗钱、赌博、投机等无门槛金融衍生品外,仍然非常缺乏现实的应用场景和需求。Vitalik 也多次表达对 ETH 价格的担忧,认为加密货币创造的实际价值配不上其估值。区块链的未来究竟在哪,仍然是一个未知数。 #book
* 📒摘抄3 262
+1
读完 Eugene Rogan 写的《征服与革命中的阿拉伯人》(The Arabs: A History),此书从阿拉伯伊斯兰运动的兴起讲起,详细介绍了如今的阿拉伯国家的诞生历史。可以说整个阿拉伯的历史,就是一部不断被外来势力干涉和角逐的动态历史。奥斯曼帝国统一了整个阿拉伯的核心区,但是这个帝国比起阿拉伯,离欧洲的中心更近,阿拉伯地区只是奥斯曼下辖的遥远边区,时不时派遣军队来镇压一下壮大的地方势力。
第一次世界大战以后,奥斯曼帝国解体,广大的北非、阿拉伯地区沦为英法瓜分的殖民地,英法两国根据自己的利益,将这块广袤的土地切分为数个小国家,作为奖赏给在战争中支持他们的阿拉伯王子们。虽然这些国家名义上独立了,但是实际上仍然处于英法的控制之下。英法势力的中间,留下了一块作为缓冲的无主之地,也就是在日后留下无数动荡与冲突的巴勒斯坦地区。这种帝国主义式的干预,戳穿了威尔逊所谓的“民族自决”的谎言,粉碎了全世界处于压迫之中的人们对于西方世界的信任。
二战后,英国和法国国力遭受重创,逐步退出中东。中东作为地缘政治新前线,美国和苏联两大超级大国开始争夺这个地区的控制权。冷战时期,阿拉伯国家分裂为亲美和亲苏两大阵营。随着苏联解体,曾经投靠苏联的国家失去了庇荫,美国开始以反恐等名义,对这些国家展开围追堵截,包括阿富汗、伊拉克、叙利亚、伊朗等国。
不只是外部干涉,阿拉伯世界内部的信仰与制度冲突也日益严重。逊尼派与什叶派的冲突,世俗主义与宗教极端主义的冲突,民族主义与宗教主义的冲突,都是在外部势力的干预下愈演愈烈。曾经的极端原教旨主义瓦哈卜和伊本·沙特创建的沙特阿拉伯,因为石油贸易突然从一个贫穷的部落跃升为全世界最富裕的国家,沙特政府凭借雄厚的财力开始向全球输出原教旨主义,同样因石油而富裕起来的各个阿拉伯王子们也开始积极介入地方争端,培养自己的军阀势力。从此中东再无内战,有的只是无穷无尽的代言人战争,前有阿富汗圣战,后有叙利亚内战。约旦作为一个没有发现石油的阿拉伯国家,其政府就保持了理性,并且时常对原教旨主义的扩张和代理人军阀发表批评。
当我们作为看客,批判阿富汗人的困境时,不能肤浅地称之为“阿富汗人自己的选择”,在这个利益和武器全球化流通的时代,人民早就没有了选择的权力。 #book
* 📒摘抄
3 262
读完 Hanne Strager 的《达尔文传》(A Modest Genius),此书改名为“物种起源传”可能更贴切,详细介绍了达尔文构思和最终编写物种起源的前世今生。又了解到了很多有趣的历史小插曲。
达尔文出生于一个教士家庭,但是在游历太平洋的旅途中,因为阅读马尔萨斯的《人口论》和 Charles Lyell 的地质渐变学说,让他对物种的地质分布和渐变产生了兴趣和灵感,最终形成了“物竞天择”的理论。
但是达尔文并没有着急发表他的研究,而是将其束之高阁十年之久。直到出于历史的巧合,在婆罗洲进行调查工作的 Alfred Russel Wallace(华莱士)写信给达尔文,向他请教自己最近构思的“物竞天择”理论,他竟然取了个达尔文一模一样的名字“Nature Selection”。受到华莱士震撼的达尔文才开始紧急筹备发表自己的研究成果,最终在 1859 年出版了他称之为“论文摘要”的 500 页巨著。所以坊间流传的达尔文剽窃华莱士成果完全是无稽之谈,达尔文的研究比华莱士早二十年,而且达尔文和华莱士也互相尊重。话说回来,科学史上多人同时发现实际上也非常常见。
不过达尔文的研究只是针对“现象”而分析得来的相关关系,当时的人们完全不理解其内在的原因和规律。达尔文也因此受到了很多“聪明人”的猛烈攻击,这些人构思了各种千奇百怪的空想实验来试图论证达尔文理论的错误。
要等到 1900 年,人们重新发现 1865 年孟德尔发表的关于豌豆杂交试验的论文。以及 1950 年发现 DNA 后,人类才能最终理解达尔文理论的内在原理和规律。 #book
* 📒摘抄
3 262
在公园陪我儿子玩的时候翻完了结城浩的这本《图解密码学技术》,很通俗易读的实用手册,虽然都很浅显,但是对基本概念有比较全面的介绍。每一个程序员都应该读一读,至少要对密码学有基础的了解,不要等犯下不可挽回的错误后才后悔。 #book
和分布式算法一样,对密码学要时刻保持敬畏,要小心翼翼地遵守最佳实践,采用成熟的 SDK,绝对不要自己造轮子。
* 📒摘抄
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
