第5章
第一场代码*attle------------------------------------------,苏念开始写可视化前端的代码。,搭配**tplotli*做数据图表。界面设计成暗色系,主色调是深灰和荧光蓝——这是她一贯的风格,干净、冷峻,像深夜的代码编辑器。:一个主窗口,三个子面板,分别用于显示系统状态、实时吞吐量曲线和调度日志。窗口的每个控件都加了tooltip,鼠标悬停时会弹出详细的参数说明。。变量名要用下划线分割,函数名要动词开头,注释要写清楚“为什么”而不是“做了什么”。她花在重构上的时间,有时比写代码的时间还长。,她打开顾言之发来的核心调度模块,准备对接测试。。“scheduler.py”,愣住了。,逻辑严密得像数学证明。每个函数都短小精悍,职责单一。异常处理覆盖了所有她能想到的边界情况,甚至包括她没想到的。。“i++ # 增加i”的废话文学,而是用简洁的英文写着设计决策的**和取舍。有一段注释写道:```# Using RR with time slice 2ms gives *etter fairness,# *ut SJF outperforms in throughput. We choose RR as default# *ecause the goal is to simulate real-world systems.# Users can toggle algorithm in UI.
```
这段话的意思是:在权衡了吞吐量和公平性之后,他选择默认使用RR算法,因为真实世界的系统更看重公平。但他留了接口,让用户可以在界面上切换算法。
苏念把这行注释读了两遍。她意识到一件事:顾言之写代码的方式,和她很像。
不是风格上的像——他们的风格完全不同,他的代码更克制,她的代码更大胆。而是在“思维方式”上像:他们都习惯在做选择之前列出所有可能性,然后给出一个有依据的决定。
她深吸一口气,开始对接。
第一轮测试,跑通了。可视化面板上,服务器的状态方块开始闪烁,吞吐量曲线如心电图般跳动。苏念盯着屏幕看了十秒钟,嘴角不自觉地翘了一下。
然后她发现了第一个*ug。
在调度日志面板上,她发现有一条日志的格式和其他不一样。不是乱码,而是时间戳的格式多了一位毫秒数。她的解析函数不认识这种格式,所以显示成了“NaN”。
苏念皱了皱眉。她把那条日志复制出来,仔细看了一遍,发现这不是随机错误——毫秒数多出的那一位不是零,而是有规律的数字:1, 1, 2, 3, 5, 8, 13……
斐波那契数列。
苏念盯着这串数字看了五秒钟,忽然明白了什么。
她打开顾言之的调度模块,找到日志生成的那段代码。在生成时间戳的函数里,她发现了这样一行:
```python
# adding a little easter egg for the curious
extra_ms = random.choice([1,1,2,3,5,8,13]) if os.getenv(DE*UG) else 0
```
只有处在调试模式时,才会在时间戳里塞进斐波那契数。
这行代码对程序的正常运行没有任何影响——解析函数会自动丢弃无法识别的部分。但苏念的解析函数写得不够健壮,所以它崩溃了。
苏念盯着这行注释,手指在键盘上敲了敲。
“easter egg for the curious”——给好奇的人准备的彩蛋。
这意味着什么?意味着顾言之在写这段代码的时候,已经在预料到她会看到?还是说这只是他一个人的自娱自乐,和她无关?
苏念不知道,但这让她产生了一个念头:她要“回敬”他。
她不打算用注释或文字回应。那太直白了,不符合她的风格。
苏念打开可视化模块的代码,在吞吐量曲线的渲染函数里,加了一段逻辑。具体的改动是:当系统检测到来自调度模块的日志时间戳包含斐波那契数时,曲线的颜色会从荧光蓝变成一种特别的紫色——矢车菊紫,代码里写成Cornflower*lue。
她顺手在注释里写了一句话:
```python
# easter egg for the easter egg giver
# Cornflower*lue is my f**orite
```
这不是什么高深的技巧,只是一种程序员之间的加密对话。
她相信顾言之会看到,也相信他能看懂。
剩下的半周,两人没再见面。苏念在宿舍写代码,顾言之发消息的频率也恰到好处——每天早上一条“进度更新”,晚上一条“今日提交”。没有多余的话,没有“在吗”和“晚安”。
但苏念注意到一个细节:每天晚上十点半,她提交代码之后,十点四十五分,顾言之的提交记录就会更新。
这意味着他在等她提交完,然后拉取她的代码,做集成测试。
他从来没和她说过这件事。
周五下午,项目计划书提交的截止时间。
苏念和顾言之约在机房碰面,一起过一遍计划书。苏念到的时候,顾言之已经在电脑前了,正在调试一个她没见过的小程序。
屏幕上是一个简单的命令行界面,输出是一串字符:
```
>>> Hello, S.N.
>>> Your UI looks good. *ut can it handle this?
```
下面是一段十六进制的字符串。
苏念侧过身子看了一眼,在脑子里把它转换成ASCII码。
十六进制转ASCII是程序员的基操。她用了不到十秒钟,解出来一行字:
```
if you can read this, you passed the first test.
```
苏念的嘴角抽了一下。
“你在测试我?”她问。
顾言之关掉那个窗口,表情无辜得像一张白纸:“只是热身。”
苏念没有说话,打开自己的笔记本,调出一个脚本,当着顾言之的面运行。
屏幕上跳出一个终端窗口,开始输出数字。不是十进制,也不是十六进制,而是三进制——0,1,2,10,11,12,20……
顾言之眯起眼睛看了一会儿,然后拿起笔,在纸上写了一串三进制数,逐个转换成十进制。
苏念看着他写,没说话。
顾言之写完最后一个数字,抬起头,和苏念对视。
纸上写的是:1 8 3 6 1 7 2 3 2 5 8 1 3 2 1。
“你的生日?”他问。
苏念没承认也没否认,只是说:“你不算慢。”
顾言之把那张纸折起来,放进兜里。
“热身结束。”他说,语气和平时没什么不同,但苏念注意到他的眼睛里有光了——不是那种客气的寒暄式的光,是遇到了对手、被打中了兴奋点的那种光。
“把计划书写完吧。”苏念说,“正事要紧。”
他们用了四十分钟写完计划书。过程中争论了三次,分别关于:数据集的采样方法、调度算法的默认参数、以及期末展示时要不要加一个炫酷的3D动画。
前两个争论,顾言之赢了。第三个,苏念赢了。
交完计划书,两人走出机房。天色已经暗了,教学楼走廊的声控灯在他们经过时一明一灭。
走到楼梯口,苏念停下来。
“顾言之。”她叫了他的全名。
他回过头。
“以后要测试我,直接说。”苏念的语气很平,“不用写十六进制。”
顾言之沉默了一秒,然后——
他笑了。
不是那种礼貌的微笑,是真实的、带点孩子气的、嘴角弯起来的笑。
苏念见过他面无表情的样子,见过他礼貌冷淡的样子,但没见过他笑的样子。
“好。”他说。
然后转身下了楼梯。
苏念站在原地,听见他的脚步声一层一层地下,声控灯一盏一盏地灭。
她的手心有点湿。
她在原地站了大概十秒钟,然后拿出手机,翻到和田心的聊天框,打了一行字:
“如果一个人对你笑了一下,你心跳加速,这是正常的生理反应吗?”
发出去之后她立刻后悔了,秒速撤回。
但田心已经看到了。
“???苏念你谈恋爱了???”
苏念没有回复。
她把手机揣回兜里,背着包往宿舍走。
秋天的晚风吹在脸上,凉凉的,但她觉得自己的脸是烫的。
```
这段话的意思是:在权衡了吞吐量和公平性之后,他选择默认使用RR算法,因为真实世界的系统更看重公平。但他留了接口,让用户可以在界面上切换算法。
苏念把这行注释读了两遍。她意识到一件事:顾言之写代码的方式,和她很像。
不是风格上的像——他们的风格完全不同,他的代码更克制,她的代码更大胆。而是在“思维方式”上像:他们都习惯在做选择之前列出所有可能性,然后给出一个有依据的决定。
她深吸一口气,开始对接。
第一轮测试,跑通了。可视化面板上,服务器的状态方块开始闪烁,吞吐量曲线如心电图般跳动。苏念盯着屏幕看了十秒钟,嘴角不自觉地翘了一下。
然后她发现了第一个*ug。
在调度日志面板上,她发现有一条日志的格式和其他不一样。不是乱码,而是时间戳的格式多了一位毫秒数。她的解析函数不认识这种格式,所以显示成了“NaN”。
苏念皱了皱眉。她把那条日志复制出来,仔细看了一遍,发现这不是随机错误——毫秒数多出的那一位不是零,而是有规律的数字:1, 1, 2, 3, 5, 8, 13……
斐波那契数列。
苏念盯着这串数字看了五秒钟,忽然明白了什么。
她打开顾言之的调度模块,找到日志生成的那段代码。在生成时间戳的函数里,她发现了这样一行:
```python
# adding a little easter egg for the curious
extra_ms = random.choice([1,1,2,3,5,8,13]) if os.getenv(DE*UG) else 0
```
只有处在调试模式时,才会在时间戳里塞进斐波那契数。
这行代码对程序的正常运行没有任何影响——解析函数会自动丢弃无法识别的部分。但苏念的解析函数写得不够健壮,所以它崩溃了。
苏念盯着这行注释,手指在键盘上敲了敲。
“easter egg for the curious”——给好奇的人准备的彩蛋。
这意味着什么?意味着顾言之在写这段代码的时候,已经在预料到她会看到?还是说这只是他一个人的自娱自乐,和她无关?
苏念不知道,但这让她产生了一个念头:她要“回敬”他。
她不打算用注释或文字回应。那太直白了,不符合她的风格。
苏念打开可视化模块的代码,在吞吐量曲线的渲染函数里,加了一段逻辑。具体的改动是:当系统检测到来自调度模块的日志时间戳包含斐波那契数时,曲线的颜色会从荧光蓝变成一种特别的紫色——矢车菊紫,代码里写成Cornflower*lue。
她顺手在注释里写了一句话:
```python
# easter egg for the easter egg giver
# Cornflower*lue is my f**orite
```
这不是什么高深的技巧,只是一种程序员之间的加密对话。
她相信顾言之会看到,也相信他能看懂。
剩下的半周,两人没再见面。苏念在宿舍写代码,顾言之发消息的频率也恰到好处——每天早上一条“进度更新”,晚上一条“今日提交”。没有多余的话,没有“在吗”和“晚安”。
但苏念注意到一个细节:每天晚上十点半,她提交代码之后,十点四十五分,顾言之的提交记录就会更新。
这意味着他在等她提交完,然后拉取她的代码,做集成测试。
他从来没和她说过这件事。
周五下午,项目计划书提交的截止时间。
苏念和顾言之约在机房碰面,一起过一遍计划书。苏念到的时候,顾言之已经在电脑前了,正在调试一个她没见过的小程序。
屏幕上是一个简单的命令行界面,输出是一串字符:
```
>>> Hello, S.N.
>>> Your UI looks good. *ut can it handle this?
```
下面是一段十六进制的字符串。
苏念侧过身子看了一眼,在脑子里把它转换成ASCII码。
十六进制转ASCII是程序员的基操。她用了不到十秒钟,解出来一行字:
```
if you can read this, you passed the first test.
```
苏念的嘴角抽了一下。
“你在测试我?”她问。
顾言之关掉那个窗口,表情无辜得像一张白纸:“只是热身。”
苏念没有说话,打开自己的笔记本,调出一个脚本,当着顾言之的面运行。
屏幕上跳出一个终端窗口,开始输出数字。不是十进制,也不是十六进制,而是三进制——0,1,2,10,11,12,20……
顾言之眯起眼睛看了一会儿,然后拿起笔,在纸上写了一串三进制数,逐个转换成十进制。
苏念看着他写,没说话。
顾言之写完最后一个数字,抬起头,和苏念对视。
纸上写的是:1 8 3 6 1 7 2 3 2 5 8 1 3 2 1。
“你的生日?”他问。
苏念没承认也没否认,只是说:“你不算慢。”
顾言之把那张纸折起来,放进兜里。
“热身结束。”他说,语气和平时没什么不同,但苏念注意到他的眼睛里有光了——不是那种客气的寒暄式的光,是遇到了对手、被打中了兴奋点的那种光。
“把计划书写完吧。”苏念说,“正事要紧。”
他们用了四十分钟写完计划书。过程中争论了三次,分别关于:数据集的采样方法、调度算法的默认参数、以及期末展示时要不要加一个炫酷的3D动画。
前两个争论,顾言之赢了。第三个,苏念赢了。
交完计划书,两人走出机房。天色已经暗了,教学楼走廊的声控灯在他们经过时一明一灭。
走到楼梯口,苏念停下来。
“顾言之。”她叫了他的全名。
他回过头。
“以后要测试我,直接说。”苏念的语气很平,“不用写十六进制。”
顾言之沉默了一秒,然后——
他笑了。
不是那种礼貌的微笑,是真实的、带点孩子气的、嘴角弯起来的笑。
苏念见过他面无表情的样子,见过他礼貌冷淡的样子,但没见过他笑的样子。
“好。”他说。
然后转身下了楼梯。
苏念站在原地,听见他的脚步声一层一层地下,声控灯一盏一盏地灭。
她的手心有点湿。
她在原地站了大概十秒钟,然后拿出手机,翻到和田心的聊天框,打了一行字:
“如果一个人对你笑了一下,你心跳加速,这是正常的生理反应吗?”
发出去之后她立刻后悔了,秒速撤回。
但田心已经看到了。
“???苏念你谈恋爱了???”
苏念没有回复。
她把手机揣回兜里,背着包往宿舍走。
秋天的晚风吹在脸上,凉凉的,但她觉得自己的脸是烫的。
阅读下一章(解锁全文)
点击即可畅读完整版全部内容
相关书籍
友情链接