心理学复制危机:那些被证伪的著名认知科学研究

2025-09-17
心理学复制危机:那些被证伪的著名认知科学研究

2010年代心理学领域经历了“复制危机”,许多被广泛接受的研究结果未能被重复验证。本文总结列举了一些未能复制的著名认知科学研究,例如:自我消耗效应、力量姿势效应、社会启动效应(老年词效应)、金钱启动效应等。这些研究结果曾被广泛传播,但后续研究表明其结论存在问题,甚至完全被证伪。作者旨在通过这份清单,帮助读者甄别可靠的研究结论,避免被错误信息误导。

阅读更多
杂项 复制危机

LeetCode难题?约束求解器轻松搞定!

2025-09-12
LeetCode难题?约束求解器轻松搞定!

作者讲述了他在面试中因不会动态规划算法而未能解决硬币找零问题的故事。他指出,许多LeetCode难题实际上是可以用约束求解器(如MiniZinc、Z3或OR-Tools)轻松解决的约束问题。文章通过几个例子,包括股票买卖最大利润问题和直方图最大矩形面积问题,展示了如何用约束求解器简洁地表达和解决这些问题,并强调了约束求解器在处理复杂约束条件方面的优势。

阅读更多
开发

RSS如何战胜ICE:简单战胜复杂

2025-09-08
RSS如何战胜ICE:简单战胜复杂

本文讲述了RSS和ICE两种内容聚合协议的竞争故事。ICE由微软、Adobe等巨头支持,功能更强大,但过于复杂且封闭;RSS则起源于Netscape,简单易用,并因其开放性而受到广泛采用。最终,RSS凭借其简单性以及众多博主和开发者的贡献,战胜了功能强大的ICE,成为内容聚合的行业标准,这再次印证了“简单战胜复杂”的互联网法则。

阅读更多
科技 内容聚合

为什么我更喜欢reStructuredText而不是Markdown

2025-08-18
为什么我更喜欢reStructuredText而不是Markdown

作者在本文中阐述了为什么在撰写技术书籍时,他更倾向于使用reStructuredText (rST) 而不是Markdown。他指出,rST 作为一种抽象文档树的中等重量表示,具有比Markdown更强大的扩展性和可定制性。作者以创建图像和处理习题为例,详细解释了rST如何通过自定义指令和文档树转换来实现更复杂的文档结构和功能,这在Markdown中难以实现。虽然rST的语法可能不如Markdown简洁,但其强大的功能使其成为处理大型复杂文档的理想选择,尤其是在需要自定义扩展和文档转换的场景下,例如作者的书籍《程序员的逻辑》。

阅读更多

过去十年JavaScript运行时的爆炸式增长

2025-07-28
过去十年JavaScript运行时的爆炸式增长

过去十年,JavaScript运行时(以及引擎)呈爆炸式增长,使其能够在各种环境中运行,并针对特定任务进行精确调整。这使得JavaScript的应用范围扩展到了云端、边缘计算、智能电视、移动设备甚至微控制器。本文探讨了这种多样性的驱动力,以及为什么没有一个运行时或引擎能够满足所有需求。从边缘计算的兴起,到微控制器的低资源引擎,再到与其他语言的互操作,以及在原生应用开发中的广泛应用,JavaScript运行时展现了其惊人的适应性和发展活力。文章还详细介绍了各种运行时和引擎,包括Node.js、Deno、Cloudflare Workers、Bun、React Native、NativeScript等等,以及它们背后的技术和发展历程。

阅读更多
开发

缓存:抽象而非优化

2025-07-04
缓存:抽象而非优化

传统的观点认为缓存是为了提升软件速度,但作者认为这只是缓存功能的一部分。在处理对象存储、磁盘和内存之间的数据移动后,作者认为缓存更重要的作用是简化软件。文章探讨了预设缓存算法(LRU、LFU等)的局限性,并指出缓存更像是一种抽象层,它隐藏了底层存储的细节,使程序员无需关心数据存储在哪个层级。数据库和操作系统中的缓存机制就是这种抽象的体现。虽然缓存可能存在一些问题,例如操作系统页面缓存和fsync的误用,但这并不意味着要放弃缓存,而是要更好地理解和使用它。

阅读更多
开发

对抗孤独:走出家门,拥抱社区

2025-06-29
对抗孤独:走出家门,拥抱社区

作者探讨了现代社会普遍存在的孤独感,并提出走出家门是解决问题的关键。文章以自身养狗并参与社区活动为例,说明了如何在日常生活中建立联系,并指出城市步行道等基础设施对社区连接的重要性。作者批判了利用恐惧和便利性来加剧孤独的资本主义模式,鼓励读者积极参与社区生活,体验人与人之间的联系。

阅读更多
杂项

用SMT求解LinkedIn皇后难题:比SAT更容易!

2025-06-12
用SMT求解LinkedIn皇后难题:比SAT更容易!

博主在文章中介绍了使用SMT求解器Z3解决“LinkedIn皇后”问题的过程,这是一种比SAT求解器更高级的方法。“LinkedIn皇后”问题类似于国际象棋皇后问题,但增加了区域限制。作者通过使用SMT的整数变量和约束,更简洁地表达了问题,避免了SAT中复杂的布尔编码。虽然SMT求解速度可能不如SAT求解器快,但其更易于使用的特性使其在解决此类问题时更具优势,这解释了为什么业界更倾向于使用编译到SAT的工具而非直接使用SAT。文章还包含了完整的代码和一些用于验证模型正确性的辅助代码。

阅读更多
开发 SMT求解器

不可判定性:程序员的“潘多拉魔盒”

2025-05-28
不可判定性:程序员的“潘多拉魔盒”

本文深入浅出地解释了计算机科学中的“不可判定性”概念。作者以通俗易懂的语言,结合具体的例子(例如,判断一个数是否为两个素数之和),阐述了判定问题的概念以及图灵机在其中的作用。重点在于解释了“不可判定性”并非意味着无法判断程序是否停止,而是指不存在一个通用的算法能够对所有程序的停止性做出判断。这使得许多问题(例如,程序是否满足特定属性)成为需要付出大量精力甚至可能无法解决的难题,也反过来解释了形式化验证和程序分析等领域存在的必要性。

阅读更多
开发

属性测试胜过单元测试?边界条件的组合爆炸

2025-05-21
属性测试胜过单元测试?边界条件的组合爆炸

本文探讨了属性测试(PBT)与传统单元测试的优劣。作者认为,对于单一输入的函数,单元测试足以覆盖大部分情况,但随着输入参数的增加,边界条件的组合呈指数级增长,PBT通过随机生成输入,更有效地发现隐藏的边界错误。然而,PBT也存在门槛,需要掌握复杂的输入策略生成技巧,而大多数PBT示例过于简单,无法体现其在处理复杂输入空间时的优势。

阅读更多
开发

邮政局的电子邮件冒险:E-COM的兴衰

2025-05-14
邮政局的电子邮件冒险:E-COM的兴衰

面对电子邮件的冲击,美国邮政局在1982年推出了E-COM服务,尝试将电子邮件打印出来并通过邮递员投递。这项服务最初取得了一定的成功,但由于高昂的成本、繁琐的流程以及缺乏灵活性,最终在1985年以失败告终,累计亏损超过4000万美元。尽管如此,E-COM却意外地促进了“电子邮件”一词的普及,也反映了邮政局在面对科技变革时的积极尝试与无奈妥协。

阅读更多
科技

美国食品安全:一场与谎言和历史的较量

2025-04-30
美国食品安全:一场与谎言和历史的较量

本文采访了科学新闻记者Deborah Blum,探讨了美国食品安全现状及历史。Blum指出,在信息泛滥和政府放松管制的背景下,美国民众面临着食品安全风险,类似19世纪的食品造假问题死灰复燃。她以其著作《毒物小队》为例,讲述了1906年美国食品药品法案的诞生过程,以及当时的化学家Harvey Wiley如何通过“毒物实验”揭露食品安全问题。Blum呼吁民众关注食品安全,并批判了将食品安全问题归咎于个人选择的观点,强调政府有责任保障民众的基本权利。

阅读更多
科技 科学新闻

应对需求变更:形式化方法在软件演进中的作用

2025-04-28
应对需求变更:形式化方法在软件演进中的作用

本文探讨了在软件开发过程中,如何应对不断变化的需求。作者指出,虽然在需求频繁变化时,花费大量时间进行形式化建模可能得不偿失,但当系统达到一定规模或发生架构转变(“相变”)时,形式化方法能够确保在改进系统的同时,维护原有功能的正确性。通过形式化规范和验证,可以避免因系统升级而导致现有功能失效的情况,从而保证客户满意度。作者以同步更新改为异步更新为例,说明了如何利用形式化方法来验证新的系统是否满足旧的需求,并强调了软件维护的重要性。

阅读更多
开发 需求变更

用命题逻辑解决《蓝色王子》中的谜题

2025-04-21
用命题逻辑解决《蓝色王子》中的谜题

文章介绍了如何使用命题逻辑自动求解游戏《蓝色王子》中的一种基于逻辑推理的谜题。游戏中,玩家需要根据三个盒子(蓝色、白色、黑色)的陈述,以及“至少有一个盒子陈述全为真,至少有一个盒子陈述全为假,奖品只在一个盒子里”的规则,判断奖品所在位置。作者通过构建命题逻辑表达式,并使用暴力搜索算法找到所有满足条件的赋值,从而确定奖品的位置。文章还展示了如何用JavaScript代码实现这一过程,并讨论了代码优化策略。

阅读更多
游戏

谷歌AMP for Email:雄心勃勃的失败

2025-04-18
谷歌AMP for Email:雄心勃勃的失败

谷歌曾试图通过AMP(加速移动页面)技术革新邮件体验,使其具备交互性,例如直接在邮件中预订酒店或回复Google Docs评论。然而,这项技术最终失败了。文章分析了AMP for Email的失败原因,包括开发难度高、兼容性差、与邮件固有属性冲突等。开发者对谷歌的强制推广心存疑虑,最终导致AMP for Email被悄然放弃。虽然交互式邮件并非完全不可行,但它应该以兼容性和持久性为基础,而非牺牲邮件的简单性和稳定性。

阅读更多
科技 AMP Email

NP难题之外:一个更直观的复杂度问题

2025-04-17
NP难题之外:一个更直观的复杂度问题

本文作者质疑将停机问题作为NP难问题之上的典型例子,认为其不够直观且易于混淆。停机问题虽然不可判定,但验证“是”的答案却可以通过有限步骤运行程序来实现。作者提出了一个更易理解的例子:在一个无限网格上移动棋子,判断能否到达目标点。这个问题在低维度下是PSPACE完全的,维度增加后复杂度会迅速提升,最终达到ACKERMANN完全,直观地展示了远超NP问题的复杂性。

阅读更多

用Prolog优雅地解决一个逻辑谜题

2025-04-08
用Prolog优雅地解决一个逻辑谜题

作者用Prolog语言重写了其编程逻辑书籍中关于逻辑编程语言的章节,并以一个“Layton谜题”为例展示了Prolog的强大功能。该谜题需要根据前三个学生的成绩推断第四个学生的成绩。作者通过简洁的Prolog代码(仅15行),巧妙地利用了Prolog的模式匹配和双向性,优雅地解决了该问题,并找到了所有可能的答案键,最终得出第四个学生的成绩为6分。作者对比了其代码与他人代码的长度,并指出其代码更简洁高效。尽管作者认为谜题不适合用于教学,但他仍然以该例子展示了Prolog的实际应用潜力。

阅读更多
开发 谜题求解

是时候停止构建 KV 数据库了

2025-03-25
是时候停止构建 KV 数据库了

作者痛斥 Key-Value 数据库过于简单,缺乏表达能力,使用起来十分痛苦。虽然 KV 数据库在存储引擎供应商中很流行,但其本质只是一个构建合理数据模型的基石,使用者需要从头构建数据模型,且效果往往不佳。作者提倡一种介于关系型数据库和 KV 数据库之间的方案:具有类型化记录的嵌入式数据库,逻辑和物理模式分离,但查询针对物理模式编写,避免了复杂的查询规划器,并支持异步模式更改和布局切换。这种方案在兼顾数据独立性的同时,避免了关系型数据库的复杂性,更适合嵌入式场景。

阅读更多
开发

验证优先开发:超越测试驱动开发的新范式

2025-03-18
验证优先开发:超越测试驱动开发的新范式

本文探讨了“验证优先开发”(VFD)的概念,它强调在编写代码之前先建立验证机制,例如编写测试、定义类型不变式或添加契约等。VFD 与测试驱动开发(TDD)不同,TDD 是 VFD 的一种特例,更强调测试驱动代码设计。VFD 的优势在于降低跳过验证的可能性,尽早发现错误,并提高代码质量。但 VFD 也存在缺点,例如会减慢开发速度,妨碍探索式编程,以及验证方法可能影响代码设计。作者认为 VFD 作为一种技术,而非范式,更灵活且易于与其他方法结合使用。

阅读更多
开发 验证优先

五种非确定性:形式化方法的实用见解

2025-02-20
五种非确定性:形式化方法的实用见解

本文探讨了系统建模中五种非确定性的类型:真随机性、并发性、用户输入、外部因素和抽象。作者以通俗易懂的方式解释了每种类型的特点,并结合实际案例进行说明。例如,真随机性虽然可以使用伪随机数生成器模拟,但在建模时通常被视为非确定性选择;并发性是导致非确定性的主要来源之一,其状态空间爆炸问题需要特殊处理;用户输入和外部因素都可被视为非确定性的外部影响。最重要的是,抽象可以将复杂的确定性过程简化为非确定性选择,从而简化模型并提高其对潜在错误的敏感性。这篇文章为理解非确定性及其在软件开发中的应用提供了宝贵的参考。

阅读更多
开发

效率与横向扩展:鱼与熊掌能否兼得?

2025-02-12
效率与横向扩展:鱼与熊掌能否兼得?

本文探讨了软件效率和横向扩展之间的矛盾。作者指出,为扩展性优化的软件通常在单机环境下效率较低,反之亦然。这源于Amdahl定律、协调开销以及共享资源的限制。高效的算法往往依赖于对系统和问题的特定假设,而这些假设在横向扩展后可能不再成立。作者还探讨了文化因素和任务类型对选择的影响,并以Tigerbeetle数据库和CPython的GIL为例进行说明,最终指出,对问题和环境的深入理解是提升效率和扩展性的关键。

阅读更多
开发

正则表达式中`$`和`^`作为行锚点的历史渊源

2025-01-21
正则表达式中`$`和`^`作为行锚点的历史渊源

本文探讨了正则表达式中使用`$`和`^`作为行锚点的历史原因。追溯到QED文本编辑器,`$`最初在QED中表示缓冲区的末尾,Ken Thompson将其改编为正则表达式中的行尾锚点。而`^`的选择,则可能因为在当时常用的Teletype Model 35打字机上缺乏其他合适的符号,且`^`在ASCII-67中已存在。这一选择并非巧妙的设计,而是受限于当时的硬件和字符集的限制,最终成为正则表达式的约定俗成。

阅读更多
开发 QED

数学建模揭示:旋转陀螺游戏Dreidel有多糟糕

2024-12-18
数学建模揭示:旋转陀螺游戏Dreidel有多糟糕

博主去年使用PRISM概率建模语言对传统节日游戏Dreidel进行了建模,证明其缺乏乐趣。今年,他完善了模型,使其能够模拟直至游戏结束的全过程。新的模型修正了之前仅模拟首位玩家出局的缺陷,并改进了计算押注和玩家出局逻辑。通过模型模拟,博主发现,平均而言,一场四名玩家的游戏需要760次旋转才能结束,最长甚至可能超过6小时。这充分证明了Dreidel游戏冗长乏味,令人沮丧。

阅读更多

关于DuckDB疯狂语法特性的思考

2024-12-03
关于DuckDB疯狂语法特性的思考

本文探讨了DuckDB允许用户通过扩展在运行时修改SQL语法这一特性。作者认为,对于一次性分析查询而言,这种语法扩展能力非常有吸引力。文章进一步探讨了通过解析表达式语法(PEG)实现这一特性的可能性,并提出了一个更深层次的想法:将语言按功能分解,每个功能都包含其语法和语义解析。作者还实现了一个简单的原型,演示了如何动态添加数组字面量到语言中,并讨论了这种方法的优缺点以及未来研究方向。

阅读更多
未分类 语法扩展

我算是服了!来玩玩跳表吧

2024-12-01
我算是服了!来玩玩跳表吧

本文探讨了LSM树及其核心组件memtable的实现方式。作者认为无锁并发跳表是memtable的最佳选择,尽管其较为复杂。文章详细解释了memtable的需求:快速读写、并发读写支持、有序扫描以及内存限制。作者研究了跳表的并发写操作,比较了单写多读和多写多读的实现,并通过模拟实验探究了概率p和最大高度对跳表性能的影响。

阅读更多
未分类 LSM树 memtable

文档的缺失会导致迷信

2024-11-30
文档的缺失会导致迷信

作者分享了在使用OneNote的“墨迹转形状”功能时遇到的困惑。由于缺乏文档说明,作者只能通过反复尝试来理解该功能的运作方式,并对某些操作产生了类似“迷信”的想法,就像斯金纳的鸽子实验一样。作者呼吁软件开发者提供更完善的文档,避免用户因缺乏指导而产生不必要的猜测和误解。

阅读更多
未分类 OneNote 迷信

五个不寻常的Raku语言特性

2024-11-13
五个不寻常的Raku语言特性

本文介绍了Raku编程语言的五个独特之处:Junctions(用于布尔逻辑的复合值)、Whatevers(多功能占位符,可用于创建匿名函数)、正则表达式(改进的可组合性和语法)、Hyperoperators(用于并行列表操作的特殊运算符)以及Pair语法(用于简洁定义键值对的语法糖)。文章还简要提及了Slangs(语法扩展)和RakuAST(抽象语法树处理),并推荐了一些Raku相关的博客和资源。

阅读更多
未分类 语法特性

概率冒险之旅

2024-11-11
概率冒险之旅

作者反思了学生时代对统计学学习的遗憾,并分享了近期对概率和统计学的深入学习。文章重点介绍了指数分布在排队论、控制论和性能建模中的普遍性,并以CoDel算法为例,解释了如何模拟排队系统。作者通过模拟泊松点过程,阐述了指数分布的无记忆性以及如何利用该特性简化模拟过程。最后,作者反思了指数分布的教学方法,认为应该先介绍无记忆性的概念和优势,再引出指数分布这一唯一具备该特性的连续分布。

阅读更多
未分类 指数分布

将设计与工程分离

2024-10-31
将设计与工程分离

本文探讨了在小型工程团队中,如何在没有专职设计师的情况下交付美观、直观的软件。作者提倡将设计工作与工程工作分离,即先进行纯粹的设计,再进行工程实现。作者认为,工程师在编码时容易受限于现有代码和技术能力,导致设计缺乏创造性。而将设计与工程分离,可以让工程师跳出思维定式,设计出更优秀的产品。作者还分享了具体的实践方法,例如离开工作站、寻找新的环境、手绘设计稿等。

阅读更多
未分类

TLA+入门:从基本原理出发

2024-10-25
TLA+入门:从基本原理出发

本文介绍了TLA+的基础数学原理,以及如何用其进行系统建模。文章以银行账户转账为例,逐步讲解如何使用谓词逻辑、时间变量、状态转换等概念描述系统行为。并引入了时间逻辑、Stutter步骤、不变式等关键概念,最终用TLA+语言表达了转账模型和无透支属性。文章还讨论了如何简化模型以提高可验证性,并鼓励读者思考如何扩展模型以支持双向转账。

阅读更多
未分类 系统建模