

模拟一台不可能的游戏机:长达16年的探索这份文本概述了**电子游戏仿真领域的最新进展和项目**。其中详细介绍了**历时16年成功模拟先锋 LaserActive 游戏机**的艰辛过程,这项成就被誉为**“可能尚未被模拟的最后一台重要的老式家用游戏机”**。此外,文章还提到了**《星际牛仔》PS2 游戏的英语翻译补丁发布**,以及**《剑与魔法》和《灵能杀手太郎丸》等其他游戏的翻译工作**。最后,文本还讨论了**各种模拟器和 FPGA 核心的更新**,这些更新旨在**提高兼容性、性能和对特定游戏机功能的支持**,例如 bsnes 与 SameBoy 的同步、86Box 模拟器的 5.0 版本发布,以及 MiSTer 对 TurboGrafx-CD 和 Commodore 64 核心的改进。
嵌入式检索的理论局限嵌入式检索的理论局限
万次重生:Roguelike的魅力该文本**探讨了 Roguelike 视频游戏类型**的演变和特点,作者分享了**从童年到成年**与这些游戏的个人经历。文章**详细介绍了不同的 Roguelike 游戏**,例如《Angband》、《NetHack》、《ADOM》、《Crawl》和《Brogue》,**比较了它们的机制、设计理念**以及**对玩家体验的影响**。核心主题包括**永久死亡、随机生成、游戏可玩性**以及**这些游戏如何塑造作者对视频游戏的看法**。
人工智能面临的“那堵墙”这篇名为“大语言模型面临的困境”的论文**探讨了大型语言模型(LLM)能力的根本限制**。作者认为,**决定LLM性能的缩放定律严重制约了它们提高预测不确定性的能力**,从而使得达到科学探究所需的可靠性标准变得难以实现。论文进一步提出,**LLM生成非高斯输出分布的能力可能是导致错误累积、信息灾难和人工智能退化行为的根源**。尽管存在这种退化的可能性,**作者也讨论了避免这种情况的方法**,强调需要更深入地理解所研究问题的结构特征。
那些“粗制滥造”的软件在哪?文章主要**质疑人工智能编码工具对开发者生产力的显著提升**。作者是一位经验丰富的软件开发者,他指出尽管AI编码工具厂商及其支持者声称能带来巨大的效率提升(例如“生产力提高10倍”),但**他自己的实验和对公开数据的分析并未支持这些说法**。他通过**对比AI辅助编码与传统编码方式的耗时**,发现AI并未显著加速开发过程,反而可能略微减慢。最核心的论点是,如果AI编码工具真如宣传般有效,那么**全球软件发布量理应出现爆发式增长,即“垃圾软件泛滥”现象**,然而图表数据显示各领域的软件发布量依然平稳,并未出现激增。因此,作者**建议开发者相信自己的直觉**,如果AI工具感觉效率低下,那并非是个人问题,而是工具本身的局限性。
现金的悖论:我们为何仍在使用银行卡这份来自“Rubenerd: 不用现金支付”的摘录**探讨了作者对使用现金和银行卡的复杂看法**。作者注意到,尽管很多人——尤其是年轻人——重新开始使用现金,并且自己也试图减少对智能手机的依赖,但他们**仍然倾向于使用银行卡**。文章**承认了现金的诸多优点**,包括匿名性、没有隐藏费用、不受技术故障影响,以及对无法获得银行服务的人群的包容性。然而,作者**强调了银行卡在便利性和预算管理方面的显著优势**,认为这些益处值得承担潜在的附加费用。最终,文章还**提到了现金在卫生方面的问题**以及其作为一种社会建构的本质,从而解释了尽管深知现金的益处,但个人选择使用银行卡的复杂原因。
谷歌反垄断案的灾难性后果Cory Doctorow 的“Pluralistic”博客的摘录,主要讨论了 Google 最近一起反垄断案的结果。作者对判决结果表达了强烈不满,认为法官未能有效拆分 Google 或阻止其继续垄断行为。文章批评了法官的“补救措施”,即强制 Google 与竞争对手分享用户数据,认为这不仅无法促进竞争,反而会导致大规模的隐私侵犯。此外,文章还提及了即将出版的图书、近期和未来的公共活动,以及其他与科技、政治和版权相关的链接。
“苦涩的教训”被误解了批判了对“痛苦的教训”的普遍误解,该教训长期以来被视为计算能力是人工智能进步的终极驱动力。作者提出,真正的瓶颈不是计算,而是高质量的数据。尽管传统的理解强调通过利用大规模计算的通用方法来扩展模型,但缩放定律揭示了计算能力与数据量之间更深层次的关系,表明计算预算与数据集大小呈二次方关系。由于互联网上的高质量数据已所剩无几,未来的进步将取决于架构师通过改进模型结构来更有效地利用现有数据,或炼金术士通过生成新数据来克服稀缺性。因此,文章总结说,人工智能领域的成功将取决于能够有效应对数据稀缺性的团队,而非仅仅追求更多的计算资源。
鳗鱼之谜:难倒亚里士多德与弗洛伊德探讨了鳗鱼的神秘生命周期,指出它们虽然被归类为鱼类,却有着异常奇怪的习性。文章追溯了人类对鳗鱼起源的长期困惑,从亚里士多德的推测到19世纪末科学家们的失败尝试,其中西格蒙德·弗洛伊德寻找鳗鱼性腺的经历被幽默地提及。最终,通讯解释了鳗鱼从幼体到成体的多次变态过程,以及它们在神秘的马尾藻海出生并在淡水河流中成熟,最终返回海洋繁殖并死亡的独特迁徙模式,强调了它们与鲑鱼生命轨迹的镜像对比。
人工智能真的在抢你的饭碗吗?探讨了人工智能对年轻劳动力市场的影响,揭示了关于AI是否正在取代入门级工作的持续争论。文章回顾了此前关于AI影响的相互矛盾的观点,从“可能”到“肯定不是”再到“也许是”,并重点介绍了一项新的斯坦福研究。这项研究利用ADP的工资数据,表明高度暴露于AI的年轻工人,如软件开发人员和客户服务代理,就业率显著下降。研究进一步区分了AI的自动化和增强作用,发现自动化任务的职业对年轻工人的就业产生了更大的负面影响。
你可以尝试喜欢一些东西这期节目的核心主题是**《你可以尝试喜欢一些东西》,探讨了一种独特的个人“爱好”:。这不仅限于食物或音乐,也包括人,甚至是你所处的整体环境。作者推荐这个爱好,不仅仅因为它能带来更多的享受,更重要的是将其视为探究人性的工具**。 节目中分享了通过这种尝试获得的几个关键“教训”或观点: • 1. 自我概念对喜好的影响:我们有时不喜欢某些东西,仅仅是因为我们对自身持有一种“不喜欢它们”的观念。通过改变这种自我叙事,比如设想一个不同的情境,可以改变对事物的感知。作者通过这种方法,成功地让自己喜欢(或不再那么讨厌)白葡萄酒、迪斯科、瑜伽、Ezra Klein、不辣的食物、珍珠果酱乐队和吉卜力工作室的电影。童年被强迫吃菠菜的经历,让作者将菠菜与“意志的残酷战斗”联系起来,而非其本身的味道。 • 2. 潜意识层次的差异:潜意识的某些层面比其他层面更难改变。例如,作者未能喜欢乡村音乐,即使他欣赏其艺术性并渴望成为一个“文化杂食者”,但发现自己只是“想想要喜欢”乡村音乐,而不是真正喜欢,这可能是因为“文化编程”根深蒂固。 • 3. 错误的自我认知:你可能对自己的喜好存在错误的认知。比如,作者曾坚持自己喜欢葡萄干,但从未真正想吃它们。同样,他曾以为听Oasis能带来慰藉,但实际听起来却觉得“没那么好”。 • 4. 某些事物难以改变:有些不喜欢的东西,比如作者对大多数电视节目的势利态度,很难改变。这可能是因为大多数电视确实质量不高,或者不符合个人口味,也可能因为难以像对待异国蔬菜那样“讲故事”来重新构建其吸引力。 • 5. 体验的力量:在飞机上,机长邀请乘客“坐下来享受旅程”。作者认为这传达了一个重要信息:虽然你无法总是控制所处情境,但你对如何体验这种情境拥有巨大的力量。你可能会觉得拥挤的飞行是一种折磨,但这种折磨发生在你的脑海中,其他人可能喜欢你的处境,你或许也能喜欢。 除了这篇主文章,源材料还提及了其他文章或主题,可能作为节目的补充内容或推荐阅读: • 纸张及其使用 • 为什么建议不起作用? • 显而易见的旅行建议 • 关于籽油的思考 • 你被邀请进行结肠镜检查! • 平庸之家 • 我与人类互动的启发法 • 拖延症的分类 • 购买更多副本 • 关于被管理的建议 • 感恩能增加幸福感吗? • 358场解谜风暴 • 没有人优化幸福感 • 关于土豆饮食的思考 • 你正在做却不想做的事情 • 服用他汀类药物能延长多少寿命? • 有效的自私 • 如何在没有烦人痛苦的情况下跑步
如何做好一次有价值的演讲在本期节目中,我们将深入探讨 Michael Greenberg 教授在SIGPLAN博客上分享的见解——“如何做好一次好的演讲”。在计算机科学领域,大会是学术关注的焦点,也是与全球计算机社区建立联系的绝佳机会。然而,在众多会议活动和演讲中,如何脱颖而出并吸引听众的注意力呢?您正在竞争听众的注意力。Greenberg教授提出了一个**“价值框架”**,旨在帮助演讲者创造一个能够真正触动听众、使他们重视您的工作的演讲。 Michael Greenberg曾于PLMW 2025就此主题发表演讲,而本播客节目将基于他博客文章中的核心思想,为您提供一个全新的视角。他指出,一次好的演讲必须是“有价值的”,它应该让听众相信您的工作有价值,并让他们关心您的工作。事实上,我们所做的所有工作都应以“价值”为核心,包括研究、论文、软件和演讲。因为人们通常并不关心一件事,除非你能让他们关心。学术研究的产出不仅仅是发表论文,更重要的是说服人们这些论文的内容很重要。 加入我们,了解如何使您的演讲变得有价值,不仅能有效地传达您的工作,还能教育和娱乐您的听众,让他们带着有价值的新知识和新见解离开。 -------------------------------------------------------------------------------- 本期要点: • 演讲的价值框架 ◦ 在会议中,您在争夺听众的注意力,因为除了听演讲,还有很多其他事情可以做。 ◦ 一次好的演讲必须是有价值的,它应能让听众相信您的工作有价值,并让他们关心您的工作。 ◦ 所有的工作都应以“价值”为核心,包括我们所做的研究、撰写的论文、开发的软件以及发表的演讲。 ◦ 一个核心的真理是,人们普遍不关心一件事,除非你能让他们关心。学术研究的产出不仅是发表论文,更是要说服人们这些论文的内容很重要。 • 有价值演讲的三个核心要素 1. 告知 (Inform):您做了什么,以及为什么它有价值? ▪ 大会演讲是对数万字论文的浓缩和删节,您需要省略大量细节,因为听众一开始并不关心细节。 ▪ 演讲必须以动机开场:工作的利害关系是什么?它如何解决效率、正确性和表达性等PL核心问题?您的工作能带来什么好处?。 ▪ 常见的“问题/解决方案”价值主张框架: • 解决看似不可能的问题: 展示如何做到以前无法阐明的事情。 • 改进困难或低效的方法: 找到更好的方法,将事情从可能变为可行。 • 检测或避免错误: 解决易出错的问题(例如类型系统)。 • 清晰解释复杂概念: 将复杂且理解不清的事物解释清楚。 • 揭示看似正确但实则错误之处: 识别微妙的错误。 ▪ PL社区有共享的价值观,如效率、正确性和表达性,这有助于听众理解和重视您的工作。 2. 教育 (Educate):听众能从您的演讲中带走什么? ▪ 一次好的编程语言(PL)演讲应能教给听众一些东西:一个新见解、一项新技术或一个新模型。 ▪ 您所教授的内容必须是可移植的 (portable),即听众可以从您的工作中吸取并运用到自己的领域。 ▪ 可移植的见解不一定是您工作的核心技术成果,可能是那些最有用、受众最广的精选洞察。 3. 娱乐 (Entertain):什么能吸引听众的注意力? ▪ 演讲是一种表演,表演理应具有娱乐性。 ▪ 娱乐不等于轻浮,而是为了保持听众的注意力。 ▪ 娱乐的方式有很多:幽默、真诚、精心的结构和时机、魅力、强度等。找到适合您的表演方式并加以练习。 ▪ 一个好的演讲能让人们更关注并更好地记住您的工作。
跨越GenAI鸿沟:为什么95%的GenAI投资未能带来回报,而成功者做对了什么?本集概要: 欢迎收听“人工智能商业洞察”!本期节目将深入探讨MIT NANDA团队发布的《2025年企业AI现状报告》中的一项惊人发现:尽管企业对生成式AI (GenAI) 的投入高达300-400亿美元,但95%的组织并未从中获得任何回报。我们称之为“GenAI鸿沟”。本集将揭示为什么大多数组织停留在鸿沟的“错误一边”,以及那些成功跨越鸿沟的5%的“买家”和“建设者”是如何实现数百万美元价值的。 本集亮点: • GenAI鸿沟的定义与现状 ◦ 仅有 5%的AI集成试点项目带来了数百万美元的价值,而绝大多数项目未能产生可衡量的盈亏影响。 ◦ 这种鸿沟的驱动因素并非模型质量或监管,而是采用方法。 ◦ 通用工具如ChatGPT和Copilot的采用率很高(超过80%的组织已探索或试点,近40%已部署),但它们主要提升个人生产力,而非盈亏表现。 ◦ 企业级定制或厂商销售的GenAI系统却遭到冷遇,60%的组织评估过此类工具,但只有20%进入试点阶段,仅有5%达到生产阶段。 ◦ 七个主要行业中的大多数(7/9)显示出大量试点活动,但鲜有结构性变革,这直接体现了GenAI鸿沟的规模化存在。 • 试点停滞不前的原因:学习能力差距 ◦ GenAI鸿沟的核心障碍不是基础设施、监管或人才,而是学习能力。 ◦ 大多数GenAI系统不保留反馈、不适应上下文,也无法随时间改进。 ◦ 尽管用户对ChatGPT等通用LLM界面表现出偏好,但在任务关键型工作中,90%的用户仍然更倾向于人工操作,因为GenAI工具缺乏记忆和适应性。 ◦ 企业用户普遍认为定制或厂商提供的AI工具“脆弱”、“过度工程化”或与实际工作流程不符。 • “影子AI经济”:员工正在跨越鸿沟 ◦ 一个令人惊讶的现象是“影子AI经济”的蓬勃发展:超过90%的受访公司员工报告定期使用个人AI工具(如ChatGPT、Claude)完成工作任务,远超官方LLM订阅的40%。 ◦ 这表明,当提供灵活、响应迅速的工具时,个人可以成功跨越GenAI鸿沟。 • 投资偏见:资源错配 ◦ 约50%的GenAI预算流向销售和市场营销职能,但后台自动化(如减少BPO开支)往往能带来更高的投资回报率。 ◦ 这种偏见反映了更容易衡量指标而非实际价值的倾向。 • 如何跨越GenAI鸿沟:成功买家的策略 ◦ 成功跨越鸿沟的组织将AI采购视为BPO服务,而非SaaS购买。 ◦ 他们要求深度定制化以适应内部流程和数据。 ◦ 他们依据业务成果而非软件基准评估工具。 ◦ 外部合作关系比内部自行构建的成功率高出两倍(67% 对 33%)。 ◦ 从一线经理而非中央实验室发起AI计划,并利用“专业消费者”(prosumers)的经验。 ◦ 寻找那些能够随着时间推移而学习和改进的系统。 • 如何跨越GenAI鸿沟:成功建设者的策略 ◦ 构建自适应、嵌入式并能从反馈中学习的系统。 ◦ 专注于狭窄但高价值的用例,并深入整合到工作流程中。 ◦ 通过持续学习而非广泛的功能集来实现规模化。 ◦ 利用推荐网络和现有合作伙伴关系来克服信任障碍。 ◦ Agentic AI(代理式AI) 是关键,它通过嵌入持久记忆和迭代学习来解决GenAI鸿沟中的学习能力差距。 • 未来的方向:代理式网络 (Agentic Web) ◦ 超越单个AI代理,未来的发展方向是代理式网络,即自主系统能够在整个互联网基础设施中发现、协商和协调。 ◦ MCP、A2A和NANDA等协议正在为代理互操作性和自主网络导航构建基础。 • 劳动力影响:精细化而非普遍裁员 ◦ GenAI对劳动力的影响主要体现在选择性地取代外包职能和限制招聘,而非大规模裁员。 ◦ AI素养正成为基本的能力要求。 • 结论:跨越鸿沟刻不容缓 ◦ 成功跨越GenAI鸿沟的组织:选择购买而非自建,赋能一线经理而非中央实验室,并选择能深度整合且随时间适应的工具。 ◦ 那些投资于能从数据、工作流程和反馈中学习的AI系统的组织,正在建立月度复合增长的转换成本。 ◦ 跨越GenAI鸿沟的窗口正在迅速缩小。 相关资源: • 《v0.1_State_of_AI_in_Business_2025_Report.pdf》 • Project NANDA (Networked Agents And Decentralized Architecture) • Model Context Protocol (MCP) • Agent-to-Agent (A2A) 收听建议: 如果您是企业领导者、AI策略师或关注人工智能对商业影响的专业人士,本集将为您提供宝贵的见解,助您避开陷阱,抓住GenAI带来的真正价值!
做可能最简单的事情节目简介: 欢迎收听本期节目,我们将深入探讨 Sean Goedecke 在软件设计领域提出的核心哲学——“做可能最简单的事情”。这不仅是解决 bug、维护现有系统的方法,更是一种构建新系统架构的指导原则。我们将挑战传统上对“理想”系统的追求,并发现为什么真正的精通往往意味着减少而非增加复杂性。 本期节目要点: • “做可能最简单的事情”的核心原则: ◦ 在设计软件系统时,建议始终选择可能最简单的解决方案。 ◦ 这一原则适用于修复 bug、维护现有系统,以及架构新系统。 ◦ 作者认为,许多工程师倾向于设计“理想”系统(例如,结构良好、几乎无限伸缩、优雅分布式),但他认为这是一种错误的方法。相反,我们应该花时间深入理解当前系统,然后选择最简单的方案。 • 简单为何常被低估: ◦ 系统设计涉及多种工具(应用服务器、代理、数据库等),初级工程师在使用这些工具构建复杂系统时会感到乐趣和满足。 ◦ 然而,真正的精通往往体现在“少做”而非“多做”。 ◦ 伟大的软件设计常常显得“平淡无奇”。当看到这种设计时,你可能会觉得“这个问题原来这么简单”或“哦,根本不需要做任何困难的事情”。 ◦ Unicorn 就是一个极佳的例子,它通过利用 Unix 原语提供 Web 服务器的关键保障(请求隔离、水平伸缩、崩溃恢复)。行业标准的 Rails REST API 也是如此,它以最“无聊”的方式提供了 CRUD 应用所需的一切。这些系统本身可能不“令人印象深刻”,但它们是设计上的壮举,因为它们做了可能最简单的事情。 • 实践案例:限速功能设计: ◦ 假设你需要为一个 Golang 应用添加限速功能。你可能首先想到引入像 Redis 这样的持久化存储来跟踪用户请求。 ◦ 但作者建议先问:“可能最简单的事情是什么?” ▪ 能否在内存中保留每用户的请求计数?即使应用重启会丢失数据,这真的重要吗? ▪ 你的边缘代理是否已经支持限速?或许只需在配置文件中添加几行代码即可,根本无需实现该功能。 ◦ 只有当这些更简单的方案确实无法满足需求(例如,因为服务器实例过多导致内存限速不精确,或数据丢失不可接受)时,才应考虑引入更复杂的持久化存储。 • 如何以此方式构建完整应用: ◦ 从绝对最简单的事情开始,只有在新需求强制要求时才进行扩展。 ◦ 将 YAGNI (You Ain't Gonna Need It) 原则作为最高设计原则,甚至超越单一职责、选择最佳工具或“良好设计”。 • 对“做可能最简单的事情”的常见反驳及回应: ◦ 1. “会导致系统成为大泥球(Big Ball of Mud)?” ▪ 一些工程师认为,这听起来像是让他们停止真正的工程,而仅仅进行“临时凑合(quick kludge)”。 ▪ 作者反驳道,临时凑合并不简单;它通过引入需要额外记忆的复杂性,反而增加了代码库的复杂性。 ▪ 寻找最简单的解决方案需要考虑多种方法,这本身就是一项困难的工程工作,但通常真正的修复方案反而比临时凑合简单得多。 ◦ 2. “什么是简单?” ▪ 工程师对“简单代码”的定义常常存在分歧。 ▪ 作者提供了一个直观的定义: • 活动部件更少:当处理系统时,需要考虑的东西更少。 • 内部连接更少:系统由具有清晰、直接接口的组件组成。 • 例如,Unix 进程比线程更简单,因为它们不共享内存,内部连接更少。 ▪ 当不确定哪个更“简单”时,可以使用一个决胜标准:简单系统是稳定的。如果两个系统状态中,一个在需求不变的情况下需要更多的持续维护工作,那么另一个就更简单。例如,内存限速就比 Redis 更简单,因为它不需要部署、维护、监控一个单独的服务。 ◦ 3. “系统无法伸缩?” ▪ 持这种观点的工程师会质疑内存限速无法伸缩。做可能最简单的事情,确实无法提供“web 级”的系统,但它能提供在当前规模下运行良好的系统。 ▪ 作者认为,对“伸缩性”的痴迷是大型科技 SaaS 工程的主要罪过。 ▪ 预测瓶颈几乎不可能:对于非琐碎的代码库,你无法提前预测在流量增加几个数量级后所有瓶颈在哪里。最多只能为 2 倍或 5 倍的流量做好准备,然后随时解决问题。 ▪ 导致代码库不灵活:为了所谓的伸缩性而解耦服务,反而可能让某些功能实现起来异常困难,因为需要跨线协调,甚至涉及复杂的事务处理。大多数情况下,这些复杂性都是不必要的。 • 作者的最终思考: ◦ 作者认为,随着在技术领域工作的时间越长,对预测系统未来走向的能力越不乐观。 ◦ 理解系统当前状态的难度已经足够大,而大多数设计都缺乏这种理解,因此设计质量不佳。 ◦ 软件开发有两种主要方式:一是预测未来需求并为此设计系统;二是根据当前需求设计最佳系统,即做可能最简单的事情。 • 评论区亮点: ◦ 有评论认为架构简单性在大规模下不重要,但作者不同意,指出功能交互越复杂,简单架构越重要。 ◦ 作者向 Ward Cunningham 和 Kent Beck 致谢,指出是他们创造了“do the simplest thing that could possibly work”这一表达。 关键收获: • 拥抱核心简单性:刻意寻找最简单、最直接的解决方案,即使它看起来不那么“炫酷”或“高大上”。 • 专注于当前需求:避免为未经证实或遥远的未来需求进行过度设计,而是根据系统当前的真实需求进行设计。 • 重新审视“简单”:衡量简单性时,关注更少的活动部件、更少的内部连接,并将系统的长期稳定性作为重要的判断标准。 • 警惕过度工程:认识到对无限伸缩性的盲目追求,可能导致不必要的复杂性、僵化,并阻碍系统的快速迭代和适应。
认知负荷很重要本集简介: 本集播客深入探讨软件开发中的一个核心但常被忽视的概念——认知负荷。我们将揭示为何许多流行的“最佳实践”反而增加了开发人员的思维负担,导致效率低下、错误频发,并阻碍新成员快速融入项目。我们将讨论如何识别并减少代码中不必要的外在认知负荷,从而构建出更易于理解、维护和扩展的软件系统。 ---------------------------------------------------------------- 本集要点: • 什么是认知负荷? ◦ 认知负荷指的是开发人员完成一项任务所需的思考量。 ◦ 它不是一个抽象概念,而是人类基本的认知局限。 ◦ 人类平均工作记忆只能容纳大约四个“信息块”;一旦超过这个阈值,理解事物就会变得非常困难,导致认知过载(🤯)。 ◦ 我们花费更多时间阅读和理解代码,而非编写代码,因此持续关注代码中的认知负荷至关重要。 • 两种认知负荷类型: ◦ 内在认知负荷 (Intrinsic Cognitive Load): 由任务固有的难度引起,无法减少,是软件开发的核心。 ◦ 外在认知负荷 (Extraneous Cognitive Load): 由信息呈现方式造成,与任务本身不直接相关。这种认知负荷可以大大减少,也是本播客的重点。 • 高认知负荷的常见陷阱及应对策略: ◦ 复杂的条件语句: 过度链式的 && 和 || 语句会导致认知过载。解决方案: 引入有意义的中间变量来简化逻辑,降低理解成本。 ◦ 嵌套的 if 语句: 深层嵌套的 if 语句迫使开发者记住所有前置条件。解决方案: 采用早期返回 (Early Returns) 模式,使开发者可以专注于“正常路径”。 ◦ “继承噩梦”: 过于复杂的继承层次结构会使理解功能变得困难,需要在多个父类之间跳转才能掌握完整逻辑。解决方案: 提倡优先选择组合而非继承 (Prefer Composition Over Inheritance)。 ◦ 过多的小方法、类或模块: 遵循“方法应短于15行”等信条常导致“浅层模块”(接口复杂而功能简单)。这会增加理解项目各模块之间交互的难度。解决方案: 设计深层模块 (Deep Modules),即提供强大功能但接口简单的组件,将复杂性隐藏在内部(例如 UNIX I/O 接口)。 ◦ 对 DRY 原则和单一职责原则的误解: ▪ “模块应只负责一件事”常被误解,导致创建过多“浅层模块”,其名称和接口比实现本身更耗费心力。 ▪ 更准确的理解: 一个模块应该对一个且只有一个用户或利益相关者负责,这与业务影响相关,而非功能数量。 ▪ 滥用 DRY (Do Not Repeat Yourself): 过度消除重复可能在不相关的组件之间造成紧密耦合,导致牵一发而动全身。“少量复制胜过少量依赖” (A little copying is better than a little dependency)。 ◦ 过多的浅层微服务: 即使在微服务架构中,过多细碎的“浅层微服务”也会导致“分布式巨石”,极大地增加调试和维护的认知负荷(例如一个五人团队维护17个微服务的案例)。解决方案: 优先选择设计精良、模块真正隔离的单体应用,仅当开发团队规模扩大或需要独立部署时,再考虑引入网络层分离模块。 ◦ 功能丰富的编程语言: 编程语言中过多的新特性,尤其是非正交的特性,会增加学习和理解成本,迫使开发者不仅要理解代码,还要理解为何选择该特性来解决问题。C++ 的历史演进就是一个例子。 ◦ 业务逻辑与 HTTP 状态码: 将业务细节(如 JWT 过期、权限不足)映射到自定义 HTTP 状态码(如 401, 403, 418),会给前端和 QA 工程师带来额外的认知负荷。解决方案: 优先在响应体中直接返回自描述的字符串代码(例如 {"code": "jwt_has_expired"}),以保持各方思维清晰。 ◦ 与框架的紧密耦合: 框架中的“魔法”要求新开发者投入数月学习。过度依赖框架可能在新需求出现时成为阻碍。解决方案: 尽可能以框架无关的方式编写核心业务逻辑,将框架作为库使用,而非将业务逻辑置于框架内部。 ◦ 分层架构的代价: 诸如 Hexagonal/Onion 架构等分层设计,虽然初看合理,但常常引入不必要的间接性(“胶水代码”)和认知负荷,尤其是在需求频繁变化的场景下。它也并不能保证数据库等底层组件的快速替换。解决方案: 遵循更基本的原则,如依赖反转原则 (Dependency Inversion Principle),仅在有明确、实际的扩展点需求时才添加抽象层。 ◦ 领域驱动设计 (DDD) 的误区: DDD 常被误解为专注于解决方案空间(如文件夹结构),而非问题空间(如通用语言、有界上下文)。这种主观解释可能导致不必要的认知负荷和争议。建议: Team Topologies 提供了一个更易于理解的框架,有助于跨团队分担认知负荷。 • 熟悉项目中的认知负荷: ◦ 熟悉不等于简单。开发者对自己熟悉的代码往往难以发现其复杂性。 ◦ “新来的小孩”视角: 鼓励新加入项目的开发者批评代码,他们的“新鲜”视角能帮助发现那些让团队成员习以为常的认知负荷点。 ◦ 衡量困惑: 通过结对编程等方式观察新成员的困惑程度,如果连续困惑超过约40分钟,则说明代码有改进空间。 ◦ 目标: 保持低认知负荷,让新成员在加入公司后的几小时内就能开始贡献价值。 • 核心思想与总结: ◦ 减少所有超出工作固有复杂性的认知负荷。 ◦ 如 Rob Pike、Andrej Karpathy、Elon Musk 和 Addy Osmani 等业内专家所强调,最佳的代码不是最优雅或最复杂的,而是未来的开发者(包括你自己在内)能够快速理解的代码。 -------------------------------------------------------------------------------- 引用与资源: • 原始资料: GitHub - zakirullin/cognitive-load • 推荐书籍: 《软件设计哲学 (A Philosophy of Software Design)》by John K. Ousterhout • 相关文章: ◦ Parnas 的论文 “On the Criteria To Be Used in Decomposing Systems into Modules” ◦ “A Philosophy of Software Design vs Clean Code” ◦ “It's probably time to stop recommending Clean Code” ◦ “Small Functions considered Harmful” ◦ “Why I Hate Frameworks” • 概念/原则: 依赖反转原则、Team Topologies。