不知不觉春节假期就过完了,本来计划节前把 weekly 写完的,结果拖到了现在(´・_・`)
春节期间,家人从外面回来,可能感染了一些细菌或病毒,会让人呕吐。
其他家人也是陆续被感染,我也中招了,在床上躺了两天,躺久了也是很累。
节前的时候用 aider 写了个需求,回顾下来,估计有 70% 左右的代码都是 aider 写的。
需求里有很多 dialog,form,table,这些其实挺适合用 LLM 去写,比较枯燥也不复杂。
新的一年,祝你健康快乐啦 ヾ(´∀ ˋ)ノ
News | Article
Why do bees die when they sting you?

蜜蜂的毒针布满了倒刺,当它们扎进去后就很难再拔出来,毒针会拉扯它们的内脏一起出来,所以蜜蜂扎了之后很快就会死去。
而毒针连带的肌肉还能继续运作,直到把毒液全部注射完成。

正如理查德-费曼(Richard Feynman)所指出的,科学中的每一个 “为什么” 问题都需要谨慎对待。
这是因为回答一个 “为什么” 的问题总是有几个不同的层次,这取决于你在寻找什么样的答案。
这就引出了生物学中的选择层次。
在个体层面上,利他主义毫无意义;你免费提供食物,却得不到任何回报。
但在群体层面上,利他主义者的存在实际上是件好事,因为它(理论上)可以提高每个人的生存能力,从而提高整个群体的繁殖能力。
那么,为什么蜜蜂蜇你会死呢?这要看你问的是哪位生物学家了。
也许是因为它们是通过多层次选择进化而来的更大的超级有机体中的一次性部件。
也许是因为它们乐于为它们的姊妹生产工厂–蜂后–而死,这是由亲缘选择和膜翅目的单倍体遗传学推动的。
因为我们没有时间机器来追踪蜜蜂的进化过程,所以一切都不确定。
生物学家们当然还在争论不休,亲缘选择和群体选择都没有达成一致的共识。
Deepseek R1 可能找到了超越人类的办法
文笔不错的文章,内容通俗易懂。讲述了从 AlphaGo 到 Deepseek R1 之间的一些标志性 AI 的发展。
这是另一个 AlphaZero 时刻,在 R1-Zero 的训练过程,完全不依赖人类的智商、经验和偏好,仅靠 RL 去学习那些客观、可测量的人类真理,最终让推理能力远强于所有非 Reasoning 模型。
写代码是否仍然有意义?我不知道。
今早看到 GitHub 上热门项目 llama.cpp,一个代码共享者提交了 PR,表示他通过对 SIMD 指令加速,将 WASM 运行速度提升 2 倍,而其中 99% 的代码由 DeepSeek R1 完成,这肯定不是初级工程师级别的代码了,我无法再说 AI 只能取代初级程序员。
Read the Code, Not the Profile
作者发现一个性能问题,然后生成 profile 去定位,找到那些性能占比最高的函数分析。
优化了这些函数,带来了一定的改善,但问题却没有完全修复。
最终还是因为作者了解 profile 的那些函数的逻辑,通过看代码分析出了问题。
打开故事堆栈,最突出的问题是运行时间只缩短了 80%。
巨大的百分比给人的感觉是惊人的改进,但这是因为人类大脑的设计并不适合构建软件。
在现实世界中,巨大的百分比是不可思议的。而在软件中,它们只是线性改进。
我的努力将运行时间从 45 秒缩短到了 9 秒。这感觉很棒,但真正的问题是,这个程序根本就是以秒为单位的。
优化之前可能是 O(10n) 优化之后是 O(2n),看起来似乎变快了,但是依然是 O(n) 的时间复杂度,当数据量很大的时候,系数的影响其实不大。
教训?不要看简介 (profile)。读代码。利用简介来集中注意力。
Introducing AX: Why Agent Experience Matters
作者提出了 AX 的概念,即 Agent Experience,代理体验。
他认为在将来,会越来越多人用 agent,它们能自主地使用产品,省去人类用户的许多繁琐工作。
那么对于 agent 而言,产品是否便于 agent 进行交互?
例如有没有清晰地 API;能否方便获得对应权限;产品是否准备好 agent 需要的上下文等。
或许以后会有一些 AX 规范/最佳实践之类的,指导人们如何改进/设计 AX 友好的产品吧。
随着人工智能代理开始变得有用和普遍,我们将大致看到两种让代理与我们依赖的软件进行交互的方法:
封闭式垂直方法,即公司将自己的代理紧密集成到自己的软件中。
开放式方法,企业将重点放在使外部代理可以访问自己的软件上。
Once You're Laid Off, You'll Never Be the Same Again
作者被裁员了,尽管他在公司中不断超越,贡献了许多,但是公司需要裁员的时候,他也不算什么,没人在乎他的去留。
在国内看来就是一个有些卷的优秀员工,以为自己为公司提供了价值,公司不会裁他,但他天真了。
这打击了作者的工作积极性,让他不想再卷了,努力干完 40 小时,不再多付出什么。
当我回顾自己在公司的时光和所取得的成就时,我很惊讶自己会受到裁员的影响。
这并不是因为我认为自己比别人强,而是因为我相信自己所做的已经超出了别人对我的期望。
然而,在裁员期间,你是谁和你做了什么似乎并不重要。
在大多数情况下,做出决定的人甚至都不认识你。
…
在我宣布被解雇的那天,我收到了许多同事的留言,甚至是那些没有直接共事过的同事,他们告诉我,我激励和鼓舞了他们。
虽然这些信息令人感动,但它们并没有改变现实:对于公司来说,我只是 Excel 表中的一行。
对于像我这样经历过裁员的人来说,工作就变成了工作。
你做的是分配给你的工作,如果你的公司浪费了你的潜力,或者强迫你在不必要的项目上浪费时间,你就不会再关心了。
月底领工资,仅此而已。这就是新的现代工作方式:再也不用努力争取每年进步 40%了。
作者还总结了一些建议:
- 遵守合同规定的工作时间。 如果合同规定工作 40 小时,那就工作 40 小时,不能多也不能少。保护你的个人时间和福利。
- 避免主动超越。 许多公司鼓励通过有影响力的工作来获得晋升,但与其追逐内部晋升,不如专注于转换公司,实现职业生涯的下一步。
- 始终坚持面试。 我见过的最大错误之一就是在开始一份新工作后停止面试,对公司失去信心。相反,要不断探索机会,这样即使裁员,你也已经有了其他选择。
- 利用外部提供的薪酬增长机会。 公司通常不给现有员工大幅加薪,但却为新员工支付高薪。定期去其他地方面试,如果你得到了加薪 20% 或更高的工作机会,就考虑接受它。很多人通过这种方式,在短短几年内,薪酬就翻了三番或四番。
- 不要对简历想得太多。 为简历上的短暂经历而烦恼是不值得的。您可以随时调整您的简历–省略短暂的工作经历,或将短期工作合并为自由职业经历。归根结底,您的简历只是一个起点;您的技能将在面试过程中得到评估。
Build for the Web, Build on the Web, Build with the Web
如果我只能给任何公司一个建议:在一个缓慢发展的平台上快速迭代。
为了让一个原本静态的网站拥有流畅、柔和的导航而发送数百千字节的 JavaScript 完全是毫无意义的。
网络平台发展缓慢,我知道这可能会让希望创新的开发人员感到沮丧,但十多年的咨询经验让我一次又一次地认识到,从长远来看,另一种选择的局限性要大得多。
与已经经受过时间考验的产品相比,今天的新产品更快地显现出老态。
浏览器中的每一层抽象都会让你离平台更远,让你进一步被框架锁定,让你离快速更远。
我仍然深信,典型的开发人员对业务分析了解不够,而典型的业务分析人员对开发了解不够,因此无法完全调和硬币的两面。
双方需要进行更深入、更平衡、更长期的讨论,因为锁定(及其持续成本)是非常现实的,今天的光鲜很快就会成为明天的磨刀石。
锁定指被框架锁定。
例如网站是使用 Vue2 构建的,当 Vue 更新到 Vue3 的时候,网站迭代往往比较困难,升级技术栈需要不少成本。
而很多相关生态也会慢慢转换到 Vue3,Vue2 的生态渐渐没人维护,如果想使用一些新的生态,就不得不花时间去升级。
过了几年,也许 Vue3 又被淘汰了,同样的事情又得再经历一次。
如果您打算采用框架或 SPA,请认真考虑其长期性,并确保您做得非常非常好。
诺兰-劳森(Nolan Lawson)说得最好,他说最好的 SPA 比最好的 MPA 好;一般的 SPA 比一般的 MPA 差。
Tutorial | Resource
So, you want to push a web platform feature?
作者鼓励参与网络平台的建设,如为 Chromium 开发功能,并给出了一些如何参与的建议。
Chromium 和 WebKit(我使用过的引擎)都是庞大的代码库,很容易让人迷失方向。
解决这个问题的方法之一是找到感兴趣的最小范围。
如果我想改变一个功能,我就会找到实现这个功能的类,然后只尝试理解这个特定的类,如果这个类很大,就理解它的一小部分。
从根本上说,我只需了解最基本的内容,就能实现我需要完成的更改。
然后,随着时间的推移,我试图扩大我的 “理解范围”,更好地理解周围的数据流和代码。
与此同时,我还尝试从外向内开展工作–对更广泛的架构和流程进行一些高层次的了解。
Code Related
Build systems and bundlers #24
一篇解释构建系统和捆绑程序的文章,解释了构建系统的一些共同概念,比较了几种捆绑工具。
由此,我们可以识别出一些常见的概念:
- 任务(Task)
- 一个任务。实际逻辑由任务描述符定义,例如 Makefile 和 Excel 公式。
- 输入(Input)
- 任务的输入。
- 输出(Output)
- 任务的输出。任务的输出可能是下一个任务的输入。
- 信息(Info)
- 构建信息,即跨构建的信息,可用于下一次构建。例如,在 Make 中,文件的修改时间就是其信息,可以理解为打包工具中的缓存。
- 存储(Store)
- 存储。它是任务输入、输出和信息的存储位置。例如,在 Make 中,文件系统就是其存储。
- 构建(Build)
- 构建。基于上述概念,我们可以将构建理解为:根据定义的任务和现有的存储,输入新的输入以生成新的存储。
这些概念非常通用,在各种构建系统中的实现也相对相似。
它们并不是不同构建系统之间差异的主要原因。
不同构建系统之间的差异实际上是由以下两点的不同策略引起的:
- 任务是否重新执行。
- 任务的执行顺序。
这两点分别对应两个相对重要的概念:重建器(Rebuilder)和调度器(Scheduler)。
不同的构建系统可以看作是不同重建器和不同调度器的组合。
Complexity Has to Live Somewhere
复杂性必须存在于某个地方,但不一定要无处不在。
对抗复杂性是软件开发中一个反复出现的主题,我看到它一次又一次地重复出现。
我在各个层面都看到过对这个问题的争论:函数和方法中应该有多少注释?理想的抽象程度是多少?一个框架何时开始 "魔力过剩"?一个组织中何时会有太多的语言?
我们试图摆脱复杂,控制复杂,追求简单。我认为这种想法是错误的。复杂性总得有个栖身之地。
…
当我们采用微服务之类的东西时,我们会努力使每个服务都各自简单。
但是,除非这种简单性限制了您的实际应用程序,使其不得不继承这种简单性,否则这种简单性仍然必须去到某个地方。
如果它不在单个微服务中,那它又在哪里呢?复杂性总得有个栖身之地。
如果你幸运的话,复杂性会存在于定义明确的地方。在代码中,在支持代码的文档中,在工程师的培训课程中。
你要给它一个位置,而不是试图把它全部隐藏起来。你创造了管理复杂性的方法。当你需要时,你知道去哪里找它。
如果你运气不好,只是试图假装复杂性可以完全避免,那么它在这个世界上就无处可去了。但它依然不会停止存在。
由于无处可去,它只能在你的系统中四处游荡,既在你的代码中,也在人们的头脑中。
随着人们的流动和离开,我们对它的了解也会逐渐减少。
JavaScript Temporal is coming
JavaScript Temporal 已经在一些浏览器的实验版本中发布了。
它是更好的日期实现,解决了 Date 的一些现有问题,如对于时区的支持;解析不可靠;跨夏令时计算等问题。
Temporal 可完全替代 Date 对象,使日期和时间管理变得可靠和可预测。
Cool Bit
Dynamicland
Dynamicland 是一个独特的计算空间/场所,让人们能够面对面在一起,接触真实的物件,去创造东西,交流想法。
它的三个基本理念是:
- A communal computer.
- 在一个社会环境,一个公共空间中,人们真正的在一起,面对面交流,完成创造。
- Agency, not apps.
- 它的设计目的是让人们自己动手制作,而不是使用预制的东西。
- Thinking like a whole human.
- 可以利用作为人的各种能力,而不只是对着屏幕点点点。
很有未来感的理念,感兴趣的话可以看看这个视频进一步了解。
随着 LLM 的发展,结合 LLM 感觉可以让视频中的编程更简单,毕竟 LLM 擅长处理不同的语言和语义的转换。
Making "this" less annoying
作者主要写 Web Components,所以代码里很多 this 关键字,太多 this 看起来比较干扰,作者就想办法减少它的干扰。
一种方法是自定义 this 的颜色,降低它的颜色;
另一种办法是将 this 换成了一个图标,还挺好玩的。
Tool | Library
Docling
文档转换工具,可以把 PDF、DOCX、PPTX、XLSX、图像、HTML、AsciiDoc 和 Markdown 等文件转换成 HTML、Markdown 和 JSON 等。
Text to ASCII: The best ASCII Art Generator & Maker
将文字/图片转换成 ASCII 表示。
$$\ $$\ $$\ $$\ $$\ $$ | $$ |\__| \__| $$ | $$$$$$\ $$$$$$\ $$\ $$\ $$$$$$\ $$$$$$$ |$$\ $$\ $$\ $$$$$$\$$$$\ $$\ $$$$$$$\ $$ | $$\ \_$$ _| \____$$\ \$$\ $$ |$$ __$$\ $$ __$$ |$$ |$$ | $$ |$$ _$$ _$$\ $$ |$$ __$$\ $$ | $$ | $$ | $$$$$$$ | \$$$$ / $$ / $$ |$$ / $$ |$$ |$$ | $$ |$$ / $$ / $$ | $$ |$$ | $$ |$$$$$$ / $$ |$$\ $$ __$$ | $$ $$< $$ | $$ |$$ | $$ |$$ |$$ | $$ |$$ | $$ | $$ | $$ |$$ | $$ |$$ _$$< \$$$$ |\$$$$$$$ |$$ /\$$\ \$$$$$$ |\$$$$$$$ |$$ |\$$$$$$ |$$ | $$ | $$ |$$\ $$ |$$ | $$ |$$ | \$$\ \____/ \_______|\__/ \__| \______/ \_______|\__| \______/ \__| \__| \__|\__|\__|\__| \__|\__| \__| ##### ## # # #### ##### # # # # # # # # # # # # # # # # # # # # # # ## ## # ## # # # # # # ## # # # # # # # # ## # # # # # #### # ###### ## # # # # # # # # # ### # # # # # # # # # # # # # # # # # # # # ### # # ## # # # # # # # #### ##### # #### # # ### # # # # #
tufte-css
Tufte CSS 利用 Edward Tufte 的书籍和讲义所展示的理念,为网页文章提供样式设计工具。
Tufte 的风格以简洁、大量使用侧注、图形与文本紧密结合以及精心选择的排版而著称。
Emacs
Emacs: organise your init file (outline-minor-mode or Org literate config) (24:52)
Prot 介绍了两种配置
init.el
的方法,一种是使用注释;;; outline
并结合outline-minor-mode
; 一种是通过 org 文件配置,可以给配置添加大量的描述说明。Emacs: ediff basics (15:48)
ediff 可以用来比较 2 ~ 3 个文件之间的差异,Prot 的这个视频介绍了 ediff 的基本使用。
Creating a small local elisp rainbow-mode solution
作者写了一些 elisp 创建一个简单的 rainbow-mode,用于给十六进制颜色添加背景色,便于识别颜色。
-
作者整理了一些 org-mode table 的使用例子,可以快速了解某个功能如何使用。
Write, code and publish with Emacs Org Mode
这篇文章用了大部份的 org-mode 标记,可以了解 org-mode 用于写文章可以写成什么样。
-
作者在 Emacs 中绘制了一个时钟,挺有趣的。
一些话
Masters of Allusion: The Art of Poetic Reference
一些东西的理解,可能需要一些经历才能明白。
“纸上得来终觉浅,绝知此事要躬行”。
以下是我听过的关于如何开始读诗的最棒、最实用的建议:
“一首诗最好结合其他所有诗歌来读。我们读了 A,才能更好地读 B(我们必须从某个地方开始;我们可能从 A 中收获甚少)。
我们读了 B,才能更好地读 C;读了 C,才能更好地读 D;读了 D,才能更好地回头从 A 中获得更多东西”。
这些诗句出自 Robert Frost 的短文《先决条件》(The Prerequisites),写的是他第一次遇到爱默生的一首诗,但没有理解–没有完全理解。
大约 50 年后,“这首诗又出现了,除了其中的两行之外,其他都更有意义了”。
我们一生所做的工作和思考使我们具备了条件,但即使在生命的最后阶段,我们也不可能完全具备条件,所以我们不妨对部分理解感到满意。
多媒体
- 2024 华语必补现场?陈婧霏新专打歌丨HOPICO (17:23)
- 虽然没有婚礼,但我带她去看了一场日出 (16:32)
2024|80 张照片形成个人风格的一年 (01:16)
油画风格的照片,蛮好看的
Richard Feynman. Why. (07:32)
有人问 Feynman 为什么磁铁之间会互斥,他说答案取决于你想知道的层次是什么。 有点像是小孩子,当他们好奇一个问题的时候,会不断地追问为什么,一些看似习以为常的东西,细究的话获取其实也是不明白的。 人还是要保持谦卑,在自己不熟悉的领域,不要自以为是的认为自己懂。探究问题也应该更深一步。
【球村】如果不是这个视频,这辈子恐怕都不知道!燃气灶保护机构! (03:18)
明白了为什么燃气灶的开关点火的时候需要按下去保持一段时间。
“哪有小人物会甘愿窝囊一辈子啊” (10:43)
李昂星的《有谱》,歌曲和舞台都不错。
Music
Music For Programming
咋一听可能会觉得有些“诡异”,因为里面有的音乐是失谐的,听起来不像歌曲那样讨人喜欢。
但正是这些失谐的声音,增加了认知负荷,反而可能让你更专注。
假期期间看文章,不知道听什么,就打开这个网站播着,相比其他歌曲,确实能让我专注一些。
有的片段其实也挺好听的。
通过多年的反复试验,跳过广播流、随机播放整个音乐集或反复播放某些曲目。
我们发现,最能吸引人持续集中注意力的音乐往往包含以下类型的混合曲目:
- 噪音
- 无人机
- 琶音
- 大气
- 实地录音
- 节律纹理
- 模糊(催眠术)
- 微音/失谐
- 细节/饰品/图案
- 令人敬畏/令人生畏/不祥
- 广阔/超凡/ 冥想
具备上述特质的音乐可以提供恰到好处的认知负荷,让你的大脑中那些本来可以自由游荡、导致分心的部分参与进来。
本系列的目标不是将音乐作为可有可无的背景噪音来展示,而是完全相反⸺其目标是展示能让听众沉醉其中的音乐,精心挑选的作品,尽管有时只得到外围的关注,但仍能得到充分的欣赏(或许甚至是提升)。
在全身心投入自己的创作或逻辑挑战的同时,又能完全融入他人音乐理念的情感轨迹,这种体验与冥想并无二致⸺但你不是专注于虚无的简单性,同时将内省的白日梦一扫而空,而是被足够的复杂性所吞没,使内省的白日梦在再次进入时燃烧殆尽。
您的体验可能不同,您的里程数也可能不同。