工程师的词典:缺省值、鲁棒性,和那些名不副实的怪词

代码里有些词,第一次见都会愣一下:透明不透明,鲁棒不是棒,看门狗不咬人,语法糖没有糖。这都是啥啊。

一、名字骗你的词

透明。透明不是“看得见”,恰恰是“看不见”。一个模块对使用者透明,意思是它内部的活儿全替你干完了,你只管调接口,不用看见实现——像水,你只看见结果,看不见它怎么流动。你自己已经用过它:OLED 那套软件 I2C,对只调用显示函数的人就是透明的;printf 最终怎么把字节送出去,对调它的人也是透明的。做系统的人常说的“透明传输”,就是这个意思:中间设备只负责把数据原样递过去,不掺和内容。

语法糖。语法糖是 1964 年计算机科学家 Peter Landin 造的词:它指那些“写起来甜、编译出来并没多出新能力”的写法——比如用增强 for 遍历,编译器把它展开成普通循环。糖不会变出营养,只是让吃的人舒服。后来有人补了一句刻薄话:语法糖会导致“分号癌”——糖吃多了,代码里全是让你舒服、却并不必要的分号。糖和癌一起讲,这大概是程序员对自己最诚实的时候。

魔数。代码里一个来历不明的数字,比如 if (x > 42) 里的 42,叫魔法数字——它像魔法一样“就这么有效”,没人知道为什么。魔数还有另一个意思:文件开头的特征字节(PNG 的固定头部、可执行文件的魔数),系统靠它们“认出”文件类型,这个词来自 Unix file 命令背后的 magic 库。

缺省值。缺省就是 default。default 的本来意思是“违约、未履行”:没履行约定时,按预先写好的那个来。落到程序里就是“你没指定,就按这个默认值”——缺省值。发音上,它大概是中文术语里“直译又不直译”的典范。

鲁棒性。robust 来自拉丁语 robustus,意思是橡木做的、坚硬结实。中文译成“鲁棒”是音译,所以“鲁棒不是棒”——它说的是系统遇到异常输入、奇怪工况时还扛得住、不崩。顺带,它还有个意译名叫“健壮性”,听着就正经多了。

null 与十亿美元的错。null 表示“没有值”,可无数崩溃都从“把没有值当成有值用”开始。发明空引用的 Tony Hoare 后来公开道歉,说自己创造了“十亿美元的错误”——他估算这个设计让业界赔了那么多钱。null 笑话本质都是同一句话:它不是没有错,它是太容易“没有值还硬用”。

二、串起来与环起来的名字

菊花链。daisy chain 的字面意思是“雏菊花环”——把一朵朵雏菊串成环。电路里,多个设备像花环上的花一样一个接一个地串在同一条链上,前一个的“出”接后一个的“入”,数据一站站往下传:SPI 可以这样串多个从机,JTAG 调试也常把好几颗芯片串成一条菊花链。和它相对的是星型(每个设备单独拉一根线到主机)和总线(大家挂同一条线)。

握手与挥手。通信双方先互相对个暗号确认“你在我也在”,叫握手——TCP 建立连接的三次握手是最常被拿出来讲的那个例子;断开时的往来,被叫作挥手。名字把人间的礼仪搬进了字节流。

心跳。设备活着却长期不说话时,对方没法判断它是“正常沉默”还是“已经死了”。于是定期发一个“我还活着”的小包,叫心跳。人做心电图也是看心跳——机器的心跳断了一拍,就该报警了。

看门狗。它不咬人,但它会复位。看门狗是一只需要按时喂的狗:程序正常运行时会定期“喂”它一次;一旦程序跑飞、卡死,没人喂它,它就认为系统出了问题,一口把芯片复位。名字起得凶,是因为它干的事确实凶——在你看不见的时候,把死掉的车拉回起点。

三、坏了之后的世界

悬空指针与野指针。指针原本指着某块内存,那块内存被释放了,指针还留着原来的地址——它悬空了,指向的是一块已经不属于你的地方。野指针更野:从没被正确初始化,里面是什么值全看运气。两者共同点:你拿着它往前走,踩到的不是你要的地。

僵尸进程。一个进程结束了,它的父进程还没来“收尸”(读取退出状态),它就在进程表里躺成一具尸体,叫僵尸进程。名字准得可怕:它确实已经死了,只是还没被埋。

内存泄漏。申请了内存没归还,用一次漏一点,像水管一直在漏——系统内存被悄悄吃光,运行越久越卡。

烫烫烫与锟斤拷。这两个是程序员最著名的“坏字”。Windows 调试模式下,未初始化的内存会被填成 0xCC,按中文 GBK 编码读出来,正好是“烫”——所以越界或未初始化的栈里,满是“烫烫烫”。锟斤拷是另一种乱码:UTF-8 的替换字符(U+FFFD)只占 3 个字节(EF BF BD),要两个连在一起共 6 字节,按 GBK 两字节一字切开,才正好是“锟斤拷”——编码转错时,满屏都是它。

意大利面条代码。控制流绕来绕去、跳来跳去,没有结构可言——像一盘意大利面,扯不断、理还乱。反义词是“结构化”:一层层像盖楼,而不是缠一锅面。

橡皮鸭调试。代码出 bug,找不出原因,就找一只橡皮鸭,对着它一行行解释代码。讲着讲着,问题自己就暴露了——因为解释的过程逼你把每个假设说出口,说出口的瞬间才发现它站不住。鸭子不回答,但它是最好的听众。

海森堡 bug。你打开调试器准备抓它,它就不出现了;你关掉调试器,它又回来。像量子力学里“观测改变被观测对象”,所以借海森堡的名字,叫 heisenbug。这种 bug 最磨人:它不坏,只是害羞。

四、酒吧里的工程师

测试工程师与酒吧的故事有很多版本,每一行都是一个真实的测试用例:

一个测试工程师走进一家酒吧,要了一杯啤酒;
一个测试工程师走进一家酒吧,要了 -1 杯啤酒;—— 都懂
一个测试工程师走进一家酒吧,要了 2^32 杯啤酒;—— 无符号溢出,要完刚好回绕成 0
一个测试工程师走进一家酒吧,要了一杯洗脚水;要了一杯蜥蜴;要了一份 asdfQwer@24dg!&*(@;—— 非法输入、脏数据、注入尝试
一个测试工程师走进一家酒吧,什么也没要;—— 空输入
一个测试工程师走进一家酒吧,又走出去又从窗户进来又从后门出去从下水道钻进来;—— 状态来回跳、边界进进出出
一个测试工程师走进一;—— 输入被截断了
一个测试工程师走进一家酒吧,要了一杯烫烫烫的锟斤拷;—— 未初始化内存 + 编码错乱
一个测试工程师走进一家酒吧,要了 NaN 杯 Null;—— 不是数,又没有值,两样最不该当数的东西一起上了
一个测试工程师冲进一家酒吧,要了 500T 啤酒咖啡洗脚水野猫狼牙棒奶茶;—— 类型混装、超大请求
一个测试工程师把酒吧拆了;—— 压力测试把系统干崩
一个测试工程师化装成老板走进一家酒吧,要了 500 杯啤酒,并且不付钱;—— 权限绕过
一万个测试工程师在酒吧外呼啸而过;—— 并发压测
一个测试工程师走进一家酒吧,要了一杯啤酒'; DROP TABLE 酒吧;—— SQL 注入,把整张桌子删了
测试工程师们满意地离开了酒吧;
然后一名顾客点了一份炒饭,酒吧炸了。

整段子其实是一个完整测试报告:正常用例、边界、溢出、空、脏数据、注入、权限、并发、压力、未定义行为。你能说测试工程师不尽职吗?但是事故往往就是在意料之外出现的(毕竟意料之内的 bug 大部分都已经被修或者正在排期了)。

最后橘猫说

这些词名不副实,是因为它们被命名时都借了一个画面:透明是看不见,语法糖是吃着甜,菊花链是花环上的花,看门狗是会复位的狗,僵尸进程是没被埋的尸体,锟斤拷是编码世界翻车的声音。名字是工程师给抽象世界的文学创作——把说不清的概念,命成看得见的东西。缺省值不玄,鲁棒性不是棒,但每一个怪名字背后,都有一段值得记住的来历。

最后蜘蛛说

缺省值填坑靠套接字递句柄,鲁棒性看命,逻辑斯蒂只负责甩锅,重开算了

posted @ 2026-10-21 13:05  Zw-awa  阅读(115)  评论(0)    收藏  举报