如果你以为Hello World只能写在终端里,那你太小看它了

5小时前

文/一个在计算器上折腾过Hello World的闲人

上个月收拾书房,翻出来一台十几年前的古董计算器,就是那种中学时代人手一个的函数计算器,CASIO fx-82ES。按理说这种计算器只能做数学运算,写不了程序。但我记得当年网上有人研究过它的”异常模式”,通过输入一堆奇怪的符号组合,能让它显示乱码,甚至能弹出一些隐藏字符。

我鬼使神差地充上电,按着记忆中的步骤操作了一通。屏幕上居然真的出现了几个英文字母,歪歪扭扭地拼成了”Hello”。那一瞬间的感觉,比我在服务器上部署完一个微服务还要兴奋。

也就是那天晚上我忽然意识到:Hello World这东西,从来就不只是属于终端和IDE的。它可以在任何能接收输入并产生输出的地方安家。

浏览器里那个被你忽略的控制台

如果你是一个前端开发,你肯定写过无数次console.log(“Hello, World!”)。但你可能不知道,浏览器控制台能干的事情远不止打印文本。

你可以这样写:

javascript
console.log(“%c Hello, World! “, “background: #222; color: #bada55; font-size: 20px; padding: 10px;”);
于是”Hello, World!”就变成了一行带背景色、文字颜色、字号和内边距的花哨横幅,跟海报似的。

你还可以用console.table把一个对象打印成表格,或者用console.group把输出折叠成层级结构。有人甚至用控制台输出了动态的字符动画,让Hello World在终端里来回弹跳。

为什么大家愿意在这上面花时间?因为浏览器控制台是每个前端开发者最熟悉、启动速度最快、没有任何环境配置成本的”游乐场”。你按一下F12,它就在那儿等着你。在这个游乐场里写一个Hello World,就像在自家后院翻了个跟头——简单、直接、想怎么玩就怎么玩。

用SQL向数据库说”你好”

很多人觉得数据库就是存数据的地方,跟Hello World扯不上关系。但只要你打开任何一个数据库的查询工具,输入:

sql
SELECT ‘Hello, World!’;
回车,那行字就出来了。

这其实是一个特别有意义的”软件”示例。因为它告诉你:数据库不仅可以存储,还可以计算。很多数据库支持复杂的内置函数、字符串处理、数学运算,而这条最简单的SELECT语句,就是你对数据库”计算能力”的第一次调用。

我在一个数据团队待过,新人入职的第一课就是用SQL查出”Hello, World!”。别小看这个动作,它能让新人立刻感受到数据库的响应速度、查询工具的交互方式,以及”结果集”这个概念。比任何文档都管用。

在灯泡上闪烁的莫尔斯码

如果你玩过Arduino或者树莓派,你一定写过这样的代码:

cpp
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
}
void loop() {
digitalWrite(LED_BUILTIN, HIGH);
delay(1000);
digitalWrite(LED_BUILTIN, LOW);
delay(1000);
}
这其实就是嵌入式领域的Hello World——让板载的LED灯以一秒间隔闪烁,表示”程序在运行”。

但有人把这个玩出了花。我见过一个国外极客,他用莫尔斯码编码了”Hello, World!”,然后写了一段程序控制LED灯,让它用长短不一的亮灭把这句话”闪”出来。你对着灯光看,如果懂莫尔斯码,就能读出来。不懂也没关系,他用光敏传感器接在另一块板子上,解码后再用串口输出文字。

这个实验的精妙之处在于,它把Hello World从”显示”变成了”通信”。你不再是被动的观看者,而是一个解码者。软件的定义在那一刻被拓宽了——它可以是光信号,可以是频率,可以是任何能被编码的信息。

区块链上那句永远删不掉的问候

Solidity是以太坊智能合约的语言。一个最简单的Hello World合约长这样:

solidity
pragma solidity ^0.8.0;
contract HelloWorld {
string public greeting = “Hello, World!”;
}
部署到链上之后,任何人都可以调用greeting()函数读到这句话。最神奇的地方在于,一旦上链,这句”Hello, World!”就永远存在于分布式账本中了。没有人能修改它,没有人能删除它。它成了一个不可篡改的公共信息。

我第一次部署这个合约的时候,付了十几美元的Gas费,就为了把一行字写到链上。朋友说我疯,但我觉得值。你想啊,几十年前柯林汉在贝尔实验室的内网里写的那句”hello, world”,随着那台机器的退役可能早就消失了。但今天你写在以太坊上的Hello World,只要以太坊网络还在,它就在那里,五十年、一百年后依然可以被任何人读取。

这大概是Hello World最”硬核”的一种存在形式了。

Excel里那个你没想到的Hello World

Excel可能是世界上用户量最大的”软件”之一,但很少有人把它当作编程环境。事实上,你可以在单元格里输入=”Hello, World!”,回车,它就显示了。你还可以用VBA写一个宏:

vba
Sub Hello()
MsgBox “Hello, World!”
End Sub
运行一下,弹出一个对话框。这难道不是一个完整的Hello World程序吗?

更厉害的是,Excel里还可以用LAMBDA函数定义自定义函数,甚至可以用Power Query做复杂的数据转换。每一个熟练的Excel用户,其实都是在用自己的方式”编程”,只不过他们用的不是文本编辑器,而是单元格和公式栏。

我认识一个财务总监,他完全不懂Python,但用Excel搭建了一套自动化报表系统,每天自动抓取数据、清洗、汇总、发送邮件。对他来说,那个系统就是他的”软件”,而第一个实现自动计算的公式,就是他的”Hello World”。

所以Hello World到底是什么

写了这么多,你可能会问:这些东西五花八门,有的用灯泡,有的用数据库,有的用区块链,它们有什么共同点?

共同点就是:它们都是某个技术领域里最简可运行的最小单元。

在嵌入式里,最小单元是让一个引脚输出高电平;在数据库里,最小单元是执行一条查询并返回结果;在区块链里,最小单元是部署一个只读的合约;在Excel里,最小单元是写一个公式并看到计算结果。

每个领域都有它自己的”环境配置”和”运行方式”,而Hello World就是用最少的代码、最短的路径,去验证你对这个环境的理解是否正确。

你每学一个新东西,其实都在寻找它的”Hello World”。学Docker,你写的第一个Dockerfile就是输出”Hello”的Nginx镜像;学Kubernetes,你部署的第一个Pod就是跑echo “Hello”的容器;学微信小程序,你创建的第一个页面就是显示”Hello”的文本。

寻找那个最小单元的过程,本身就是学习中最有价值的部分。因为一旦你找到了它,你就打通了从零到一的那个关口。剩下的,就是从一到N的堆叠和组合了。

最后说一句

我那台老计算器的屏幕已经暗淡了,但我还留着它。每次看到它,我就想起那天晚上屏幕上歪歪扭扭的”Hello”。

那行字没有任何实际用途。它不能帮我算账,不能帮我画图,甚至连正确的拼写都没显示全。但它告诉我一件事:只要有输出的可能,人类就想让那个输出变成一句问候。

这是天性。我们来到一个陌生的环境,无论是物理世界还是数字世界,第一件事就是想确认自己”在”这里。而Hello World,就是我们在代码世界里留下的那个脚印——形状各异,深浅不一,但每一个都确凿地证明着:

我来过,我试过,我成功了。