前言

在编程的世界里,总有一些有趣但容易被忽视的知识点。这些”冷知识”可能不会直接影响你的代码,但了解它们能让你对编程有更深的理解(而且聊天的时候可以装X 😎)。今天分享一些我觉得有趣的技术冷知识。

1. 为什么数组索引从0开始?

这是一个经典问题。数组索引从0开始的原因有多种说法:

历史原因

在C语言中,数组名实际上是指向数组第一个元素的指针。所以 arr[i] 实际上等价于 *(arr + i),即从数组起始地址偏移 i 个元素大小的位置。

如果从1开始,那么 arr[i] 就需要写成 *(arr + i - 1),多了一次减法运算。

数学原因

从数学角度看,索引从0开始更符合”偏移量”的概念:

  • 第一个元素:偏移0个单位
  • 第二个元素:偏移1个单位
  • 第n个元素:偏移n-1个单位

实际影响

1
2
3
4
5
6
7
8
9
// 从0开始:第i个元素的索引就是i
for (int i = 0; i < arr.length; i++) {
arr[i] = i; // 简洁
}

// 如果从1开始:第i个元素的索引是i-1
for (int i = 1; i <= arr.length; i++) {
arr[i-1] = i; // 需要减1
}

2. 为什么叫”Bug”?

1947年,哈佛大学的Mark II计算机出现故障。工程师Grace Hopper在继电器中发现了一只飞蛾,她将这只飞蛾用胶带贴在了日志本上,并标注”First actual case of bug being found”(发现bug的第一个实际案例)。

从此,”bug”就成了程序错误的代名词。

有趣的是,在Grace Hopper之前,Thomas Edison就已经用”bug”来形容技术问题了。他在1878年的一封信中写道:”It has been just so in all of my inventions. The first step is an intuition, and comes with a burst, then difficulties arise—this thing gives out and [it is] then that ‘Bugs’—as such little faults and difficulties are called—show themselves…”

3. 为什么叫”Foo”和”Bar”?

在编程示例中,我们经常看到 foo、bar、baz 这样的变量名。这些名字来自哪里?

历史来源

“Foo”可能来自二战时期的军事俚语”FUBAR”(Fucked Up Beyond All Recognition),意思是”完全搞砸了”。

“Bar”可能是”foo”的押韵词,或者是”beyond all recognition”的缩写。

使用习惯

这些名字已经成为编程中的”占位符”,表示”这里应该有一个有意义的变量名,但为了示例简洁,我们用一个无意义的名称”。

1
2
3
4
5
6
// 示例代码
public void processFoo(Foo foo) {
Bar bar = foo.getBar();
Baz baz = bar.getBaz();
// ...
}

4. 为什么HTTP状态码是三位数?

HTTP状态码使用三位数字,这是有原因的:

设计原因

  • 第一位数字:表示响应类别

    • 1xx:信息性响应
    • 2xx:成功响应
    • 3xx:重定向
    • 4xx:客户端错误
    • 5xx:服务器错误
  • 后两位数字:表示具体的错误类型

扩展性

这种设计允许:

  • 在现有类别中添加新的状态码(如201 Created)
  • 自定义状态码(虽然不推荐)
  • 客户端可以根据第一位数字快速判断响应类型

5. 为什么叫”Cookie”?

HTTP Cookie的名字来自”magic cookie”(魔法饼干),这是Unix系统中的一个概念,指的是一小段数据,程序可以读取它,但通常不能修改。

命名来源

Lou Montulli在1994年发明了HTTP Cookie。他选择这个名字是因为:

  1. Cookie是”magic cookie”的简称
  2. Cookie是”小甜点”,就像HTTP Cookie是”小数据片段”
  3. 名字简单易记

有趣的事实

Cookie的正式名称是”HTTP State Management Mechanism”(HTTP状态管理机制),但”Cookie”这个名字更流行。

6. 为什么叫”Spam”(垃圾邮件)?

“Spam”这个词来自Monty Python的喜剧小品,其中Spam(午餐肉罐头)在菜单上反复出现,让人厌烦。

后来,这个词被用来形容:

  • 垃圾邮件(Email Spam)
  • 垃圾评论(Comment Spam)
  • 垃圾信息(Message Spam)

技术含义

在编程中,”spam”通常指:

  • 重复发送大量无意义的消息
  • 恶意刷屏
  • 自动化攻击

7. 为什么叫”Daemon”(守护进程)?

在Unix/Linux系统中,后台运行的进程叫”daemon”(守护进程)。

命名来源

“Daemon”来自希腊神话中的”δαίμων”(daimon),指的是介于神和人之间的超自然存在,它们默默工作,不被人注意。

技术含义

守护进程的特点:

  • 在后台运行
  • 没有控制终端
  • 通常以root权限运行
  • 为系统提供服务

例如:httpd(Web服务器)、mysqld(数据库服务器)、sshd(SSH服务器)。

8. 为什么叫”Ping”?

ping 命令的名字来自声纳的”ping”声。

命名来源

Mike Muuss在1983年编写了ping程序。他选择这个名字是因为:

  1. 声纳发出”ping”声来探测物体
  2. ping程序发送数据包来探测网络连接
  3. 两者都是”探测”的概念

技术含义

ping的工作原理:

  1. 发送ICMP Echo Request包
  2. 等待目标主机返回ICMP Echo Reply包
  3. 计算往返时间(RTT)

9. 为什么叫”Stack Overflow”?

Stack Overflow(栈溢出)是一个著名的编程问答网站。

技术含义

“Stack Overflow”是一个编程术语,指的是:

  • 当程序调用栈超出可用内存时
  • 会导致程序崩溃
  • 是一个常见的编程错误

网站命名

网站创始人选择这个名字是因为:

  1. 这是一个程序员都熟悉的术语
  2. 暗示”问题太多,栈溢出了”
  3. 容易记忆和传播

10. 为什么叫”Git”?

Git是一个分布式版本控制系统。

命名来源

Linus Torvalds(Linux的创始人)在2005年创建了Git。他选择这个名字是因为:

  1. “Git”在英语俚语中是”愚蠢的人”的意思
  2. Linus自嘲地说:”I’m an egotistical bastard, and I name all my projects after myself. First ‘Linux’, now ‘Git’.”
  3. 但实际上,”Git”可能是”Global Information Tracker”的缩写

有趣的事实

Git的logo是一只章鱼猫(Octocat),这是GitHub的吉祥物。

总结

这些技术冷知识可能不会直接影响你的代码,但它们能让你:

  1. 理解历史:了解技术术语的来源
  2. 加深理解:对编程概念有更深的认识
  3. 增加趣味:让编程变得更有趣
  4. 扩展知识:了解技术背后的故事

写在最后

技术不仅仅是代码,还有背后的历史、文化和故事。了解这些”冷知识”,能让我们的技术之路更加丰富多彩(而且可以冷死朋友哈哈哈)。

如果你还知道其他有趣的技术冷知识,欢迎分享!毕竟学习路上,有趣一点总是好的 😊