前言在编程的世界里,总有一些有趣但容易被忽视的知识点。这些”冷知识”可能不会直接影响你的代码,但了解它们能让你对编程有更深的理解(而且聊天的时候可以装X 😎)。今天分享一些我觉得有趣的技术冷知识。
1. 为什么数组索引从0开始?这是一个经典问题。数组索引从0开始的原因有多种说法:
历史原因在C语言中,数组名实际上是指向数组第一个元素的指针。所以 arr[i] 实际上等价于 *(arr + i),即从数组起始地址偏移 i 个元素大小的位置。
如果从1开始,那么 arr[i] 就需要写成 *(arr + i - 1),多了一次减法运算。
数学原因从数学角度看,索引从0开始更符合”偏移量”的概念:
第一个元素:偏移0个单位
第二个元素:偏移1个单位
第n个元素:偏移n-1个单位
实际影响123456789// 从0开始:第i个元素的索引就是ifor (int i = 0; i < arr.length; i++) { arr[i] = i; // 简洁}// 如果从1开始:第i个元素的索引是i-1for (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”的缩写。
使用习惯这些名字已经成为编程中的”占位符”,表示”这里应该有一个有意义的变量名,但为了示例简洁,我们用一个无意义的名称”。
123456// 示例代码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。他选择这个名字是因为:
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的吉祥物。
总结这些技术冷知识可能不会直接影响你的代码,但它们能让你:
理解历史:了解技术术语的来源
加深理解:对编程概念有更深的认识
增加趣味:让编程变得更有趣
扩展知识:了解技术背后的故事
写在最后技术不仅仅是代码,还有背后的历史、文化和故事。了解这些”冷知识”,能让我们的技术之路更加丰富多彩(而且可以冷死朋友哈哈哈)。
如果你还知道其他有趣的技术冷知识,欢迎分享!毕竟学习路上,有趣一点总是好的 😊