程序员不一定知道的10个技术冷知识
前言
在编程的世界里,总有一些有趣但容易被忽视的知识点。这些”冷知识”可能不会直接影响你的代码,但了解它们能让你对编程有更深的理解(而且聊天的时候可以装X 😎)。今天分享一些我觉得有趣的技术冷知识。
1. 为什么数组索引从0开始?
这是一个经典问题。数组索引从0开始的原因有多种说法:
历史原因
在C语言中,数组名实际上是指向数组第一个元素的指针。所以 arr[i] 实际上等价于 *(arr + i),即从数组起始地址偏移 i 个元素大小的位置。
如果从1开始,那么 arr[i] 就需要写成 *(arr + i - 1),多了一次减法运算。
数学原因
从数学角度看,索引从0开始更符合”偏移量”的概念:
- 第一个元素:偏移0个单位
- 第二个元素:偏移1个单位
- 第n个元素:偏移n-1个单位
实际影响
1 | // 从0开始:第i个元素的索引就是i |
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 | // 示例代码 |
4. 为什么HTTP状态码是三位数?
HTTP状态码使用三位数字,这是有原因的:
设计原因
第一位数字:表示响应类别
- 1xx:信息性响应
- 2xx:成功响应
- 3xx:重定向
- 4xx:客户端错误
- 5xx:服务器错误
后两位数字:表示具体的错误类型
扩展性
这种设计允许:
- 在现有类别中添加新的状态码(如201 Created)
- 自定义状态码(虽然不推荐)
- 客户端可以根据第一位数字快速判断响应类型
5. 为什么叫”Cookie”?
HTTP Cookie的名字来自”magic cookie”(魔法饼干),这是Unix系统中的一个概念,指的是一小段数据,程序可以读取它,但通常不能修改。
命名来源
Lou Montulli在1994年发明了HTTP Cookie。他选择这个名字是因为:
- Cookie是”magic cookie”的简称
- Cookie是”小甜点”,就像HTTP Cookie是”小数据片段”
- 名字简单易记
有趣的事实
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程序。他选择这个名字是因为:
- 声纳发出”ping”声来探测物体
- ping程序发送数据包来探测网络连接
- 两者都是”探测”的概念
技术含义
ping的工作原理:
- 发送ICMP Echo Request包
- 等待目标主机返回ICMP Echo Reply包
- 计算往返时间(RTT)
9. 为什么叫”Stack Overflow”?
Stack Overflow(栈溢出)是一个著名的编程问答网站。
技术含义
“Stack Overflow”是一个编程术语,指的是:
- 当程序调用栈超出可用内存时
- 会导致程序崩溃
- 是一个常见的编程错误
网站命名
网站创始人选择这个名字是因为:
- 这是一个程序员都熟悉的术语
- 暗示”问题太多,栈溢出了”
- 容易记忆和传播
10. 为什么叫”Git”?
Git是一个分布式版本控制系统。
命名来源
Linus Torvalds(Linux的创始人)在2005年创建了Git。他选择这个名字是因为:
- “Git”在英语俚语中是”愚蠢的人”的意思
- Linus自嘲地说:”I’m an egotistical bastard, and I name all my projects after myself. First ‘Linux’, now ‘Git’.”
- 但实际上,”Git”可能是”Global Information Tracker”的缩写
有趣的事实
Git的logo是一只章鱼猫(Octocat),这是GitHub的吉祥物。
总结
这些技术冷知识可能不会直接影响你的代码,但它们能让你:
- 理解历史:了解技术术语的来源
- 加深理解:对编程概念有更深的认识
- 增加趣味:让编程变得更有趣
- 扩展知识:了解技术背后的故事
写在最后
技术不仅仅是代码,还有背后的历史、文化和故事。了解这些”冷知识”,能让我们的技术之路更加丰富多彩(而且可以冷死朋友哈哈哈)。
如果你还知道其他有趣的技术冷知识,欢迎分享!毕竟学习路上,有趣一点总是好的 😊
