HackerURLs

一次又一次被重新发现的经典。

同一个链接,相隔一年以上,一次又一次被人重新发现、再次冲上 Hacker News 首页。能经受住这种时间检验的,大多是值得一读再读的文章。每篇附中文标题,讨论最热的那些再加上中文导读和高赞评论翻译。

从名人堂开始
  • 4,700+篇经过时间检验的经典

Hall of fame

名人堂

在经典库里看全部精选

上首页次数最多、而且有中文导读的 30 篇。时间轴上每个黑点是一次上首页,空心点是一次没冲上去的投稿。

  1. 正在载入经典…

Archive

经典库

按第一次上首页的年份分布,点柱子筛选。

排序

    About

    这些经典是怎么挑出来的

    1. 01

      合并同一个链接

      读取 Hacker News 自 2006 年以来的全部链接投稿,把 http/https、www、跟踪参数等写法不同的同一篇文章合并成一条。

    2. 02

      只留经得起时间的

      同一链接至少两次拿到 50 分以上(约等于上首页),而且两次相隔一年以上;再由 AI 剔除状态页、产品首页和新闻事件。

    3. 03

      写导读、译评论

      上首页次数最多的 2,000 篇配上中文导读、"为什么经久不衰",并精选翻译 HN 高赞评论。导读由 AI 生成,可能有误。

    编程与软件工程cs.utexas.edu编辑精选

    为什么编号应从零开始(1982)

    Why numbering should start at zero (1982)

    3次上首页
    5年跨度
    493累计得分
    617条评论

    2015 — 2020,它一次次回到首页

    黑点是上首页(≥ 50 分)的那次投稿,空心点是没冲上去的投稿,点越大分数越高。

    导读

    这是 Dijkstra 1982 年的手写备忘录 EWD831,论证序列编号应从 0 开始:用半开区间 [a,b) 表示范围可以避免差一错误,并让空序列和子序列的表示更自然。这篇短文至今仍是关于 0 起始索引最常被引用的经典论述。

    为什么经久不衰:它把一个看似琐碎的约定问题讲成了关于表达清晰性的经典论证,每次编程语言设计争论索引起点时都会被重新翻出来。

    关键词 Dijkstra零起始索引差一错误编程语言设计

    HN 评论精选

    Python 采纳了半开区间约定,但为递减序列补了 reversed() 作为补救。

    Python 遵循了 Dijkstra 推荐的约定,总体效果不错,唯独递减序列的情况晦涩易错,所以我们加了 reversed() 来翻转迭代方向。不必再写 range(n-1, -1, -1),可以写 reversed(range(n))。

    raymondh查看英文原文

    Python follows convention the first convention, just as Dijkstra recommends. Mostly this worked-out well except for the case of descending sequences. With half-open intervals, that case proved to be cryptic and error-prone, so we added reversed() to flip the direction of iteration. That allowed people to easily bridge from the comfortable and common case of looping forwards. Instead of range(n-1, -1, -1) we can write reversed(range(n)).

    0 起始索引与模运算天然契合,在需要索引算术的场景下代码更简洁。

    很多人对此有强烈观点:一派认为 0 起始索引是唯一合逻辑的方式,另一派觉得没什么大不了、偏好符合日常数数习惯的 1。我猜第一类人做过需要在索引上做算术的底层编程。比如把 "abc" 重复填充到长度 10,0 起始时写 b[i]=a[i%3] 即可,1 起始则要写 b[i]=a[(i-1)%3+1],索引要平移两次。因为模运算需要 0 才能构成环,所以在索引起点真正造成差异的场合,0 起始通常让代码更简洁。

    0-_-0查看英文原文

    Lots of people have a strong opinion on this: Ones that say that 0-based indexing is the only logical way of things, and ones that don't see what the fuss is about and prefer 1 because that's how we count objects. I suspect the people in the first category did some low level programming that needed to do arithmetic on indices. For example, let's say you want to take a string "abc" and repeat it until the length is 10, getting "abcabcabca". Assuming some Python-like language you would start with: a = "abc" b = [" "]*10 With 0-based indexing you would do: for i in range(0,10): b[i]=a[i%3] In a 1-based language that becomes: for i in range(1,11): b[i]=a[(i-1)%3+1] So you need to shift the index twice. This is because modulo arithmetic needs 0 to form a ring. As a result, in situations where the difference between 0 and 1 based indexing makes a difference it's ususally 0-based indexing that leads to simpler code.

    提供多种区间写法反而制造差一错误;顺带吐槽 Pascal 不允许编译期算术。

    取决于你是在度量还是在计数。文章提到 Mesa 的区间语法,给了程序员所有可能的选项:[1..100]、(0..101)、[1..101) 等都表示同一个区间。这是个坏主意,是制造差一错误的绝佳方式。那个年代的另一个坏主意是 Wirth 坚持 Pascal 不允许编译期算术,比如定义了 tabsize=100 后,不能写 array [0..tabsize-1],必须为 tabsize-1 单独定义一个具名常量。

    Animats查看英文原文

    Depends on whether you're measuring or counting. The article mentions Mesa's interval syntax, which gave programmers all the possible options: [1..100] (0 .. 101) [1 .. 101) [1 .. 101) were all the same interval, 1 to 100 inclusive. Bad idea. Great way to get off-by-one errors. Another bad idea from that era - Wirth's insistence that you shouldn't be allowed compile-time arithmetic in Pascal. Like. const tabsize = 100; var tab: array [0..tabsize-1] of integer; { NOT ALLOWED } No, you had to have a separate named constant for "tabsize-1", and it couldn't be initialized as "tabsize-1", either.

    认同结论但批评 Dijkstra 的傲慢文风;认为取模才是最强论据,而 L[2] 指第三个元素确实反直觉。

    Dijkstra 固然才华横溢,我也知道他很多语气是半开玩笑的,但有时他的文字实在刻薄、自负到令人恼火:在陈述了一系列他个人觉得"好"或"自然"的观点后,就宣称存在一种"最合理"的方式,其他人都在犯傻。我同意从 0 编号,但他没提到与取模运算配合得多么好,我认为那才是最有说服力的理由。而让 L[2] 表示数组第三个元素确实极其反直觉,会带来无数错误——CS 学生起初都不喜欢它,是被吓人的红色报错和讲师经年累月地驯化后才接受的。

    wfo查看英文原文

    Dijkstra is of course brilliant and I recognize much of his tone is tongue in cheek and irreverant but sometimes I find his writing so nasty, pompous and arrogant that it becomes irritating; claiming, after a series of opinions about what he personally finds "nice" or "natural" that there is a "most sensible" way of doing things and that everyone else is being ridiculous. A tamer one of his offenses but still unpleasant. I agree on the numbering but many people don't. He doesn't mention how nicely it works with the modulo operator, which is I think the most compelling reason. But having L[2] be the third index in an array is horribly counterintuitive and leads to countless mistakes. CS students when they begin do not like it, it is not natural. It is beaten into them by scary red error messages and instructors over months and years until they finally accept it.

    历次讨论

    同类还值得读

    1. 开源应用架构

      The Architecture of Open Source Applications

      《开源软件架构》(AOSA)是一本在线免费书,邀请知名开源项目的作者亲自剖析其内部设计,涵盖 SQLAlchemy、LLVM、Audacity、Apache、Bash 等系统。

      编程与软件工程上首页 9 次 · 2011–2024aosabook.org编辑精选
    2. 编程语言简史:简短、不完整且多半错误

      A Brief, Incomplete, and Mostly Wrong History of Programming Languages

      一篇以戏谑、故意不准确的方式回顾编程语言史的博客文章,用夸张轶事和讽刺定义串起 Lisp、C、C++、Java、JavaScript、PHP 等语言。

      编程与软件工程上首页 8 次 · 2009–2021james-iry.blogspot.com
    3. SQLite 是如何测试的

      How SQLite is tested

      SQLite 官方文档页,系统介绍 SQLite 的测试体系:多种测试方法(TCL 测试、模糊测试、回归测试、静态分析等)和海量测试用例,展示了这个小型开源项目如何靠极致测试获得…

      编程与软件工程上首页 8 次 · 2009–2025sqlite.org编辑精选
    4. 高级编程语言(2009)

      Advanced programming languages (2009)

      Matt Might 的经典文章,按用途推荐“高级编程语言”:如果追求就业就选主流语言,如果追求表达力、学术研究或创业,则推荐 Haskell、OCaml、Scala 等函数式语…

      编程与软件工程上首页 8 次 · 2009–2022matt.might.net
    5. 我的 Forth 与栈机器经历

      Yosefk - My history with Forth & stack machines

      作者以亲身经历回顾了使用 Forth 语言和栈式机器的历程:既赞叹其简洁优雅、代码量小、可自举的优点,也坦率指出栈操作在实际编程中的痛苦,以及 Forth 社区文化中的问题。

      编程与软件工程上首页 8 次 · 2010–2024yosefk.com编辑精选

    打赏支持

    打赏二维码

    觉得有用,请作者喝杯咖啡。

    WeChat

    关注向阳乔木

    微信公众号「向阳乔木推荐看」

    微信公众号「向阳乔木推荐看」二维码

    微信扫一扫;在微信里打开本页时,长按二维码识别。