Evan Hahn

RSS: https://evanhahn.com/blog/index.xml
Evan Hahn,程序员。

来自 2026 年 9 月的笔记

Evan Hahn 九月月度随笔:主要回顾上一篇《程序员不喜欢 reduce》获得的大量反馈,感叹行业正远离代码细节、而他自己喜欢细节;随后分享几条有趣链接(关于 GC 没有程序员接口的短文、Small File Media Festival、对 Linux 常是"委员会式设计"问题的播客观点、以及"lunarpunk"实践第一篇节选)。 整体是个人的轻快月报加信息分享,无实质技术论证。
评论点赞收藏13 小时前

据个人观察:程序员普遍不喜欢 reduce

<p><em>简而言之:根据我的经验,人们喜欢<code>map</code>以及<code>filter</code>,但又不是<code>reduce</code>.</em></p><p>我用的函数是这样的<code>map</code>以及<code>filter</code>一直都是这样。当我把代码提交审核时,同行们很少抱怨。我收到了很多关于其他决策的反馈,但很少有人针对我使用<code>map</code>以及<code>filter</code>.</p><p>我不能对<code>reduce</code>.通常,当我提交补丁时,会有<code>reduce</code>里面有人评论说:“这部分很难读。”我看到了<code>reduce</code>远远低于<code>map</code>,<code>filter</code>,<code>some</code>,依此类推。</p><p>据我个人经验,我开始认为程序员不喜欢<code>reduce</code>差不多。</p><p>我不知道为什么,但我有几个理论:</p><ul> <li><code>reduce</code>更难读懂。</li> <li><code>reduce</code>不太熟悉。</li> <li><code>reduce</code> <em>可以</em>性能比其他选项差。</li> <li><code>reduce</code> <em>是</em>在我使用的语言中,比如JavaScript、Python和Swift,就不那么优雅了。在我作为Clojure开发者的幸福时光里,我确实做到了<em>不是</em>收到这些反馈。</li> <li>我错了,我看到的是一个不真实的趋势。</li> </ul><p>我通常只是换衣服<code>reduce</code>换成别的东西,然后继续前进。虽然我更喜欢,但我通常不太在意。不过这是我观察到的一个小社会现象,我想记录下来。</p><p>我最近也注意到这种情况减少了,可能是因为现在的代码审查不那么彻底了。</p><p>你注意到了吗?你喜欢吗<code>reduce</code>?拜托.</p>
评论点赞收藏17 天前

2026年8月笔记:Ghost 新功能、SQLite 的编程哲学、AI 写作的影响

Evan Hahn 八月工作笔记,Ghost 平台新增自动化邮件序列分析功能,背后实现比想象中复杂。发现 Vim 有一个叫 UserGettingBored 的玩笑触发器。 SQLite 创建者公开反对"代码注释和测试代码应占 20%"的惯例,让他改变了看法。AI 写作泛滥正在让新人模仿那种 bland 风格,他自己在写作中也注意到了这一点。
评论点赞收藏30 天前

Vim 里那个"用户感到无聊"的玩笑命令

<p><em>简而言之:Vim 有一个叫 autocmd 的笑话<code>UserGettingBored</code>那根本没用。</em></p><p>Vim 的自动命令功能,通常简称为“autocmd”,可以在各种事件发生时运行代码。例如,你可以通过绑定<code>TextChanged</code>事件<code>:w</code>指挥部。</p><p>Vim 有 100 多个事件,从“缓冲区已创建”到“文件已保存”。但其中有一个让我印象深刻:<code>UserGettingBored</code>.以下是相关文件:</p><blockquote> <code>UserGettingBored</code>:当用户按同一个键42次时。开玩笑的!:-)</blockquote><p>看到这个时,我正忙着做别的事,结果完全被打乱了。“我必须知道更多,”我心想。</p><p>以下是我发现的情况:</p><ul> <li>可惜,它什么都没用。它只存在于文档(以及部分测试中)。如果你尝试用它来配合类似的东西<code>autocmd UserGettingBored ...</code>你会收到“无此类组或事件”的错误。</li> <li>它存在于,, 和.</li> <li>它最初由布拉姆·穆勒纳尔添加于,比Vim 6.0发布早了一年多。最初的描述是:“当用户按下CTRL-C时,开玩笑的!”而且当时也没什么用,所以我觉得它没什么用<em>从未</em>真是太过分了。</li> <li>2001年8月,他.接着写道:“当用户按下CTRL-C时,开玩笑的!:-)”</li> <li>十二年后,2013年,到当前版本:“当用户按同一个键42次时。开玩笑的!:-)”</li> </ul><p>2022年,开发者迈克·史密斯</p>
评论点赞收藏39 天前

2026年7月的笔记

<p>七月!多么精彩的月份!</p><h2>我今年七月做的事情</h2><ul> <li>做了一场演讲,为了ClimateAction.tech的“负责任的人工智能系列”,.“负责任的人工智能”有时听起来有些矛盾,但我希望我分享了一些有用的东西。</li> <li>参与了.我第一次玩电子游戏(<em>塞尔达传说:四季神谕</em>)直播中!</li> <li>发布了新版本,我的 Node 安全头包。最显著的是,它加快了<code>Content-Security-Policy</code>在常见情况下,代码的提升大约是7%。</li> <li>推广了一个被低估的SQLite功能:.</li> <li>写道.32岁的智慧<em>塞尔达</em>专家们对新游戏做出准确预测?我们拭目以待。</li> <li>我已经完成了大部分仓库从 GitHub 迁移到.还有一些落单的——还有一些镜子——但它们是我需要更多协调的大项目。</li> </ul><h2>我找到的链接</h2><ul> <li>我本月最喜欢的读物:其中包含了(真正)古老的历史。</li> <li>“在不久的将来,人工智能驱动的监控系统将能够追踪我们在公共场合的所有行为,以及我们私下的大部分行为。如果我们做错事——偷窃、乱扔垃圾、乱穿马路,随你能想到的——系统会发现、保留、与你的官方政府记录绑定,向你传达这一事实,并向相关部门提供实时警报......也许还会对公众开放。”来自.</li> <li> 由前NPR《Planet Money》主持的…</li></ul>
评论点赞收藏61 天前

在 SQLite 中推荐使用 STRICT 表

SQLite 的 STRICT 表特性被低估。开启后能强制类型检查,防止将文本存入数字列等数据混乱问题。对于追求数据一致性的开发者,这是比依赖应用层校验更可靠的底层保障。
评论点赞收藏81 天前

2026年6月技术笔记:AI伦理与开源生态观察

Evan Hahn 6月笔记,涵盖 Ghost 自动化项目上线、Taper 杂志可视化作品及大量 AI 伦理与技术链接。重点包括 Ladybird 浏览器因 AI 停止社区补丁、开源维护者权益倡导、硬件认证争议及 DO_NOT_TRACK 提案。 适合关注开源生态、AI 社会影响及技术人文思考的读者。
评论点赞收藏92 天前

2026年5月笔记

独立开发者 Evan Hahn 的五月个人月度笔记,博客已满16周年。作者本月发布了4款实用小工具:ZIP 压缩优化网页工具、基于本地模型的离线命令行翻译工具、Firefox 无加载打开链接扩展、PNG 像素对比命令行工具;并为开源项目 Helmet 发布新版本。 核心看点是作者精选的一批链接与个人锐评:美国最大技术工人工会成立以遏制 AI 和裁员潮;一篇反思 AI 时代人们更愿为 LLM 而非人类做无障碍/文档工作的「反乌托邦」现象的文章;加州隐私法被科技公司大规模无视的调查报道;「Your AI Slop Bores Me」人类驱动反 AI 项目;以及执法部门将反科技活动视为「极端主义」的隐忧。 文章个人立场鲜明,反 AI 套话、亲隐私、亲开源的态度贯穿始终,适合关注技术伦理、独立开发和网络文化的读者。
评论点赞收藏123 天前

Notes from April 2026

After a busy March, April was a little quieter. But don’t worry, I still have a bunch of little links for you to click on. Things I published • GitHub’s uptime hasn’t been great recently. Even thoug...
评论点赞收藏153 天前

为GitHub的糟糕可用性辩护

In short: GitHub’s downtime is bad, but uptime numbers can be misleading. It’s not as bad as it looks; more like a D than an F. “Zero nines uptime”? 99.99% uptime, or “four nines”, is a common indus...
评论点赞收藏173 天前

所有测试通过:一个短篇故事

One night, I wrote a simple tool to pick a random programming language. After shuffling a few times, I landed on Arturo. I decided to try it for fun. What’s Arturo? Best I understand, Arturo is a st...
评论点赞收藏192 天前

一个随机选择编程语言的小网页应用

I wrote a web app to choose a random programming language. It’s very simple; I hestitate to even call it an “app”! The interesting part was scraping all the languages on Rosetta Code, and even that w...
评论点赞收藏192 天前

两种错误类型:预期与意外

这篇文章深入探讨了软件编程中的错误分类和处理策略。作者将错误分为两类:预期错误和意外错误。预期错误发生在正常操作过程中,例如用户输入无效数据或网络故障,这些错误不是开发者的责任,应通过返回错误结果、记录警告信息等方式处理。 相反,意外错误通常是由于程序员的失误导致的,如断言错误或逻辑错误,这类错误应导致程序崩溃,因为它们指示了严重的bug。文章还讨论了在不同编程语言和不同应用场景下如何划分预期与意外的界限,并强调了错误处理对软件可靠性的重要性。 作者的观点基于多年的Web和应用开发经验,旨在帮助开发者更好地理解和处理编程中的错误。
评论点赞收藏212 天前

一个比最先进模型傻7500倍的LLM

本文对比了参数规模差异极大的两个大语言模型:Kimi K2.5(万亿参数)和SmolLM2:135M(1.35亿参数)。作者通过提问测试发现,小模型产生了大量荒谬但有趣的回答,如人类住在金星、虚构的“Kanchenji”山等。 文章展示了这些错误答案背后的幽默感,并探讨了这类小模型的潜在价值,尽管它们远不如主流模型智能,却能提供独特的娱乐性和思考空间。
评论点赞收藏245 天前

我设置了全部 376 个 Vim 选项,但我仍然是个新手

本文是一位资深 Vim 用户分享了自己尝试设置所有 376 个配置选项的完整经历。作者详细描述了从初次接触 Vim 时的震撼,到多年练习后仍感到笨拙的挫败感,再到通过深入研究每个选项并逐一设置的过程。 文章不仅展示了作者在 Vim 使用技巧上的提升,还揭示了许多鲜为人知的功能和细节,例如外部命令的使用、文档复杂性、文件写入机制等。 最终,尽管配置文件长达近 2900 行,作者依然承认自己尚未真正掌握 Vim,意识到精通是一个持续学习的过程。
评论点赞收藏256 天前

我在Pyodide中实现了相对导入

本文作者在使用Pyodide(WebAssembly Python运行时)时,遇到了相对导入的问题。通过JavaScript加载器获取文件并保存到Pyodide的虚拟文件系统,实现了模块导入功能。 虽然这种方法有效,但作者认为这不是最佳解决方案,并希望找到更简洁的方法。文章详细描述了实现步骤和代码示例,适合对Pyodide开发感兴趣的技术读者。
评论点赞收藏293 天前

我做了一个简单的音频速度计算器

作者分享了自己开发的音频播放速度计算器工具,旨在帮助用户计算在不同播放速度下听有声书所节省的时间。文章详细描述了从使用LLM快速生成原型到手动修正和优化代码的过程,强调了个人在软件开发中的乐趣和对细节的关注。 此外,作者反思了自己在专业开发中放松完美主义与追求完美之间的平衡。
评论点赞收藏300 天前

阻止坏人使用我的开源项目(需要反馈)

这篇文章的作者维护着一个在 npm 下载量超过 2.26 亿次的开源项目,但意识到大型公司和恶意用户可能会滥用其软件。作者探讨了开源被剥削的现象,引用了多个相关研究和观点,并提出了如何防止不良行为者使用开源软件的疑问。 文章呼吁社区讨论如何通过改变许可证、提高关注度或集体行动来应对这一问题,旨在推动开源生态向更负责任的方向发展。
评论点赞收藏304 天前

systemd-inhibit:Linux 内置替代 macOS “caffeinate” 命令的工具

本文介绍了一个适用于 Linux 系统的内置命令 systemd-inhibit,它可以防止系统进入睡眠或关机状态,类似于 macOS 的 caffeinate 命令。 这对于需要长时间运行任务的用户非常实用,无需额外安装软件。文章提供了基本用法示例,并指出了与 caffeinate 的一些差异。
评论点赞收藏313 天前

实验:让 TypeScript 默认不可变

本文作者尝试仅通过 TypeScript 的类型系统,让 TypeScript 的值默认不可变。实验成功实现了数组和 Record 类型的默认不可变性,但未能实现普通对象的默认不可变性。 文章详细描述了如何通过自定义库替换内置类型、定义不可变数组和可变数组的类型,以及使用 TypeScript 的 Record 工具类型创建不可变键值对。 尽管在普通对象上遇到挑战,但作者希望读者能继续探索这一可能性。
评论点赞收藏316 天前

不用条件语句或布尔值的 Fizz Buzz

本文介绍了一种不使用条件语句或布尔值的 Fizz Buzz 问题解决方案。作者通过 Python 的 itertools.cycle 创建循环序列,巧妙地组合字符串和数字,避免了传统条件判断。 文章还分享了其他人的改进方案,以及一个使用余弦函数的奇特解法。代码展示了如何用列表索引替代条件逻辑,并讨论了不同方法的优缺点。
评论点赞收藏321 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。