← 返回 我的博客

代码只活在当下这一行

程序员眼中的人心 · 月光沙滩上的代码脚印

代码只活在当下这一行,人为什么总想运行昨天?——我遛狗时冒出一个念头:编译器从来没催过我"你还在改昨天那行吗"。
本系列第 1/5 篇:程序员眼中的人心。

编译器不提供"昨天"

写了二十多年代码,我今天才意识到:我用的这门语言没有"昨天"。
C 语言里,赋值是等号,判断是 if、else,多路分支是 case,退出是 exit。类、继承、框架拆到底都是这些的组合。这我早就知道。
但我以前没想过另一面:这套原语里没有任何词指向时间之外。 没有昨天,没有明天,没有"当时本来可以"。代码只有当前这一行,和往前的下一个动作。
编译器于是成了最冷静的同事。你上周写的烂逻辑,它照单全收。
而我,每天早上走进办公室,脑子里跟着一堆"昨天没做对"。

面向对象也是从原语长出来的

基类就是"盒子":长宽高,顶多一个材质。箱子继承长宽高,多根拉杆。房子也是从盒子延伸的,多房间,少拉杆。一层层拆下去,几乎所有东西都能放进这套体系。
人认识世界本来就这么干的:先看见简单的,再一层层加差异。
这套体系里同样没有昨天。 对象不记得自己昨天是什么形状,改了就是改了,不留痕迹。

自动化就是替人扛因果

那编程到底在干什么?就是把真实世界里那些有先后关系的因果,用原语组织起来交给机器。自动输入,自动输出,自动维持内部逻辑。
一个混乱的流程,只要写成有先后顺序的代码,机器就能替你日夜不停地跑,不情绪,不疲倦,不在半夜三点想三年前那件事。它扛的是因果链,那是它唯一会的。
那么问题来了。 机器替我扛住了先后顺序,我为什么扛不住自己的?
机器能扛住,是因为它不需要昨天。它的因果是单向的,从这一行指向下一行,走了不回头。我的因果是双向的,一边往前走一边往回看,看见昨天就想回去改一行。
那行代码不存在。编译器不提供 yesterday(),也不提供 rollback()。

我这个操作系统有个 bug

它总想运行昨天的那行代码。
发现 bug 那天,我立刻想的是"我当时要是……"。这句话一出口,整个系统就卡住了。它停在一个不存在的地址上空转,不报错,不崩溃,只是从此不再往前推进。
这种 bug 没有 traceback,没有告警。你只会觉得今天效率有点低,然后带着它跑一天,跑一周,跑一年。
所以第一篇我想说的就一句:

代码只活在当下这一行,人却总想运行昨天和明天。

今天可以试的一件事

今天你一定会遇到一件让你冒出"我当时要是……"的事。会议里,项目里,跟人聊天时都会。
它来的时候,先别改。在纸上写两行:
重来一遍:这件事如果重来,我会怎么做 ← 这是回滚
下一行:下一次遇到同类情况,第一件事做什么 ← 这是下一行
只准写第二行。
第一行可以写,但不许照着它改已经发生的事,那行代码不存在。它唯一的用途是让你认出下次同类情况的形状,写进第二行。
写完第二行,关掉纸,去跑今天那一行。
(下一篇先说件更热闹的:当所有人都能写代码之后,我这个二十年的老程序员还剩下什么。)

本系列第 1 篇 · 下一篇:《会说话就能写代码》

← 上一篇过去只能读,不能回滚

评论0

暂无评论 · 来做第一个说点什么的人
评论经邮件直达博主,博主整理后公开显示。参考 sive.rs 的静态评论理念。
💬评论