程序员不一定知道的10个技术冷知识

前言在编程的世界里,总有一些有趣但容易被忽视的知识点。这些”冷知识”可能不会直接影响你的代码,但了解它们能让你对编程有更深的理解(而且聊天的时候可以装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的吉祥物。

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

理解历史:了解技术术语的来源

加深理解:对编程概念有更深的认识

增加趣味:让编程变得更有趣

扩展知识:了解技术背后的故事

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

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