禁忌被打破的那一刻 <p class="ql-block">那天下午,窗外易北河中白桦树林的倒影,仿佛一幅印象派的水上作品。会议室外传来一阵急促的脚步声,像是在提醒人注意某个即将到来的转折。温克勒和比巴斯推门进来时,表情比往常沉得多。温克勒把文件夹放在桌角,顺手按住一份卷着边的会议记录。比巴斯合上笔记本,却没有坐下。他们仿佛在等待空气自行沉淀,而不是用语言打破沉默。</p><p class="ql-block">就在这时,远处的变电站传来一声金属般的巨响。我听得出,那是 110 千伏开关的动作。隔着几百米,整栋楼仿佛轻轻震了一下——像是在提醒我们它的存在。</p><p class="ql-block">“在德国,有一条不成文的规定。”</p><p class="ql-block">温克勒开口时,语气像是在重复一条经过多年沉淀的戒律:“电网的操作命令,必须由运行人员确认后才能下达。”他顿了一下,像是要让这句话先落稳,“但这一次,我们希望贵公司尝试一件从未有人做过的事——让控制系统自动切除故障,并恢复供电。”</p><p class="ql-block">我抬起头,本想用一句玩笑化解紧张,却脱口而出:“电网自愈?”</p><p class="ql-block">“是的。”温克勒点头。</p><p class="ql-block">比巴斯接过话,声音平静,却像把权力与风险一同推到桌上:“我们相信你们。”</p><p class="ql-block">这项请求被摆在桌面上后,会议室短暂地安静下来。</p><p class="ql-block">萨克森州的配电网是德国十大配电网之一。当地人以节俭著称,被戏称为“东部的施瓦本人”。近百年来,这张电网在旧结构上不断添砖加瓦,就像在不同年代的纸上反复覆写——随便画一张接线图,都能看到前现代的笔迹。比巴斯曾半开玩笑地说:“我们这里没有一条线路是按规矩长大的。”他说这话时,竟带着一种难以分辨的骄傲。</p><p class="ql-block">也正因为如此,这里成了德国最难驯服的配电网之一。为了维持可靠性,它也是德国首家全面启用多命令操作程序的公司——自动倒母线、变压器切换、二次配电站的多级联动……这些功能当初只是为了解决具体问题而生,如今回头看,却像一块块隐形的地基,为尚未命名的未来提前搭好了框架。</p><p class="ql-block">我意识到,这件事对任何一家控制系统公司来说,都可能是机遇,同时也是风险。而承担这项任务的人,将落到“她”头上。</p><p class="ql-block">想到这里,我胸口微微一紧,分不清那究竟是预感,还是某种无声的牵引。</p><p class="ql-block">“没问题,您们放心。”</p><p class="ql-block">我听见自己这样回答。声音平稳得近乎陌生,仿佛替另一个人作出了承诺。</p><p class="ql-block">中午我从办公楼走出时,易北河中的倒影仿佛打乱了水景的时辰。明明正值正午,却在水中化作夕阳西下,一缕夏日的斜光穿过树林,已经带上了秋意。</p><p class="ql-block">我当时并不知道,这一刻会在后来被反复回想。</p> 任务降临——“系统的重量” <p class="ql-block">她的皮肤在国内女士眼中,大概会被视为一种幸运的象征——白皙,带着一点淡红,毫无雀斑。逆光下几近透明,光线在表面停顿片刻,便轻轻滑落。她让我想起雷诺阿画中的人物,轮廓柔软,像是被光慢慢包住。</p><p class="ql-block">每天傍晚,当日光在楼房之间拉出斜折的影子时,她会匆匆关掉计算机,从一种近似 996 的节奏里抽身出来,去接小女儿。回到家,她一边洗菜煮饭,一边听大女儿讲学校里的见闻。“数学老师真不错,让你们轮流上去讲定理的证明。数学其实也是一种语言,不仅要在脑中完成推导,还必须能够清楚地表达出来。”她说着,又顺手往小女儿嘴里塞了一块生胡萝卜。她在不同身份之间切换时几乎没有过渡,像在演奏一首节奏稳定的钢琴曲,每个音符都准确地落在应有的拍点上。</p><p class="ql-block">我们电网控制系统的高级功能组原本有六七名软件工程师。随着市场不断扩大,人员陆续被调往其他部门,岗位空了下来,责任却没有减少。典型的“能者多劳”,多到最后往往以辞职收场。最终,只剩她一个人承担全部开发工作。我到新公司后才意识到,别处的同类部门往往有几十号软件工程师,仅拓扑功能就能分出四五位同事。当其他公司用一个团队分摊工作时,她在原公司几乎独自承担了相同的范围。</p><p class="ql-block">大多数开发人员的系统里,总有一串永远清不完的错误记录,而她的统计却长期保持为零。偶尔收到一份错误申报,她反倒会露出一种少见的兴奋,仿佛终于遇到一个值得较劲的难题。但问题往往被迅速定位、立刻解决,连“成就感”生成的时间都不够,甚至还带着一点小小的遗憾。这种持续的稳定,让她的上司既放心,又难免生出几分说不清的惊讶——怎么就从不出错呢?逻辑严密得近乎无懈可击,又从不请病假,连开发工作的“双保险”都显得多余。</p><p class="ql-block">在路上,我把公司刚接到的任务告诉她——一个业内普遍认为难度极高的功能。她的眉头轻轻皱起:“做不出来怎么办?你自己去做!”</p><p class="ql-block">“客户很信任我们。”我赶紧补充。</p><p class="ql-block">萨克森州大部分配电网仍为架空线,停电时间常年排名末尾,需要支付罚金。为了止住亏损,新上任的董事长很快看清症结,并直接下达死令:务必在年内实现电网自愈。</p><p class="ql-block">萨克森的小接地系统在雷雨天气出现接地故障的概率极高,而测量保护装置常常无法判断方向。为弥补硬件瓶颈,配电网公司特邀一家德国本土的隐形冠军负责开发新硬件。至于自愈软件这块硬骨头,他们选择交给我们。我便把这些情况仔细地跟她解释了一遍。</p> <p class="ql-block">傍晚我们路过湖边散步时,看见树木在水中的倒影。叶子落光后,枝干格外清晰,在微风中被轻轻牵动,线条弯折、分叉,像一幅逐渐显露的拓扑图。乍看像梯田,但看得久了,又更像一座迷宫——路径繁复,方向难辨。</p><p class="ql-block">我当时并不知道,我们即将走入其中。</p> 第一次低谷——“边界逼近极限” <p class="ql-block">几个月飞逝而去,项目几乎停滞。</p><p class="ql-block">有一天,她对我说:“实在太难了,我做不下去了。”</p><p class="ql-block">我有些急,但仍让语气保持平稳:“越难,价值越高。”</p><p class="ql-block">没有开发过网络拓扑算法的人,很难真正理解那种思维方式。没有模型语言,人们就无法自如地思考复杂的模型问题。我想起当初受隆珀教授“网络语言”的启发,才建立起网络拓扑设置语言的框架。后来同事又发明了内部的拓扑语言编程,打通了连接内外两个世界的大门。从那以后,我们顺着这条语言一路推进,与需求不断对话,几乎一路顺风。没想到如今却遇见了一座真正的山,过去所有的亮处,竟在一瞬间全部隐去。</p><p class="ql-block">她近来频繁回到最基本的拆解方法,把规则一条条摊开,反复推敲,试图找到那个再也不能继续分解的最小构件。</p><p class="ql-block">德国电网的操作语言里有一个词——“开关操作区域”。当我们围绕几个死结般的场景反复讨论时,这个词忽然像一道被忽略的提示浮现出来。就在那一刻,我们意识到:太阳似乎又从乌云后透出几束光。那并不是答案,而是一条仍可继续向前的路径。</p><p class="ql-block">然而,沿着这条路径走下去,意味着要全盘推翻并改写软件架构。她松开了紧皱的眉头,说:“好在我们有拓扑语言。重写,也就是换一种说法而已。”</p><p class="ql-block">我们轻松地到湖边散步。我拍下了一张水景,树木的倒影在水中舞动。</p><p class="ql-block">“风,时而,使树林起舞;泼墨追寻自由之形,印象捕捉色彩之韵。”我一时得意起来。</p><p class="ql-block">“别高兴得太早。”她不喜欢看到我得意的样子。</p> 突破——“发明的瞬间” <p class="ql-block">她是个极其专注的人,忙起来通宵达旦也在所不辞。但每天下午去健身房跳舞,却始终雷打不动。女儿常说,妈妈比许多年轻人跳得还好,甚至是拉丁舞班里最出色的之一。我笑着回应,说她在大学时就已经酷爱跳舞了。</p><p class="ql-block">然而有一天,这个规律却悄然断裂。下班时,她依旧坐在座位上,盯着屏幕,一动不动。走廊里,我遇见急匆匆赶来的马克。他气喘吁吁,眼睛亮得像刚被擦拭过:“所有测试都通过了,我刚见证了一个历史时刻!”</p><p class="ql-block">回家的路上,她靠在座位上,像是在回味什么。“我们的拓扑语言设计得真不错,”她轻声说,“所有场景的自然语言都能被翻译成这种机器语言。试错的时候,大脑好像自己找到了路。”</p><p class="ql-block">“我们一开始走的是专家系统的路。”我说,“后来整个行业发现,专家不懂程序,程序员也无法真正理解专家的想法,那条路就走不下去了。”</p><p class="ql-block">红灯亮起,我们停在路口。</p><p class="ql-block">“你既是专家,又扩展了这套语言,就没有这个问题。”</p><p class="ql-block">她似乎需要休息。</p><p class="ql-block">“也许未来的人工智能,不仅能翻译各种语言,还能总结出显式的语法规则。”我赶紧结束了话题。</p><p class="ql-block">绿灯亮了,我踩下油门。</p><p class="ql-block">她没有再说话。</p><p class="ql-block">回家的路上迎着夕阳,我把遮光镜压得很低。她却没有像往常那样放下自己的。金色的光线落在她的脸上。</p><p class="ql-block">那一刻,仿佛是我拍下的一张水景。湖水中树木的倒影,像光线透过教堂的彩绘玻璃,洒落在她的脸上。</p> <p class="ql-block">在厨房里,我接着说:“其实也应该感谢克里斯蒂安,他是我们拓扑语言的发明者。”</p><p class="ql-block">十几年前,老板兴奋地跑到我办公室,说招到一个“软件天才”。克里斯蒂安是柏林工大应用数学系的最高分毕业生,大二就开始代课教授 C++ 编程语言。入职后,他发明了我们的拓扑语言。</p><p class="ql-block">“克里斯蒂安这种软件天才,大概不需要拓扑这种专业语言,也能得心应手地用各种编程语言进行抽象思维。拓扑语言,更多是他为我们设计的。”</p><p class="ql-block">她慢慢点头。</p><p class="ql-block">啤酒丸子出锅了,还有星期天剩下的蟹肉包子。我以为可以吃饭了。</p><p class="ql-block">“怎么没有蔬菜?这是绝对不行的。”她立刻反对。</p> 验收——“人与机器的对决” <p class="ql-block">萨克森州配电网的调度中心共有三十六名调度员,其中有几位已经在岗位上处理事故三十多年。他们对新上任的董事长本就心存不满,认为他过于轻信“机器可以取代人类经验”。在项目进入验收阶段之前,他们几乎是憋着一股劲等在那里,准备让这套系统“知难而退”。</p><p class="ql-block">事实上,调度员们在反复试错中,不知不觉地将自己的经验一点点拱手于机器。起初,机器确实会出错;后来,错误越来越少;最后,机器不再出错了。可那三十六名调度员依旧信心十足。他们准备了四个场景,让她去“看看他们发现的错误”,仿佛只要把这些摆在桌上,“经验”就已经赢了一半。</p> <p class="ql-block">2016年10月25日是验收的日期。</p> <p class="ql-block">当我们走进调度备用中心时,无影灯比以往似乎更加刺眼,亮到每个人都显得有些无处躲藏。马克悄悄告诉我,屏幕上显示的系统局部图,并不是事先商定的那个区域。</p><p class="ql-block">验收开始了。</p><p class="ql-block">他们提出第一个场景。</p><p class="ql-block">第二个。</p><p class="ql-block">第三个。</p><p class="ql-block">一共四个。</p><p class="ql-block">她一一看完,却没有立刻回应。</p><p class="ql-block">那几秒钟异常漫长。</p><p class="ql-block">屏幕上,拓扑图像静止的截图。空气中,<span style="font-size:18px;">电离子的压力</span>仿佛在缓慢积聚。我忽然意识到:这一刻,并不只是系统在接受检验——她的判断,也将第一次与三十多个人的经验正面相撞。</p><p class="ql-block">“这里,”她终于开口,声音很轻,“好像还有一条路径。”</p><p class="ql-block">大厅里出现了一阵几乎难以察觉的骚动。</p><p class="ql-block">一位高个子的调度员立刻站直了身体:“那条线路中间是断开的。”</p><p class="ql-block">他的语气并不激烈,却带着一种不容置疑的熟悉感——那是多年值班经验沉淀出的判断。</p><p class="ql-block">她没有回应,而是习惯性地皱起眉头。</p><p class="ql-block">只有在等待中,人们才会意识到时间。</p><p class="ql-block">她调出了开关动作的拓扑语言记录,头突然下意识地向上一扬:“那是个可以执行命令的有载隔离开关。”</p><p class="ql-block">对方愣住了。</p><p class="ql-block">“啊,我的同事忘了在图中标注!”高个子几乎叫出声来。</p><p class="ql-block">她接着用拓扑语言记录解释了另外三个场景。每一个,都比前一个更复杂。</p><p class="ql-block">我们所有人都意识到,人脑也有不够用的时候。</p><p class="ql-block">现场一时安静下来。</p><p class="ql-block">那位有三十多年经验的老调度员始终盯着屏幕。他的眉头慢慢松开,像是某种长期依赖的直觉,第一次找不到继续站立的支点。</p><p class="ql-block">他似乎忽然意识到了什么。</p><p class="ql-block">“我们休会一下。”他说。</p><p class="ql-block">这并不是否定,而是一种郑重。</p><p class="ql-block">第二天,温克勒和比巴斯来电话,说三十六位调度员一致同意接受我们的产品,并将在进一步测试后,于年底正式投入运行。</p><p class="ql-block">圣诞节前,他们再次来电话。那一刻,系统在实网中发出了第一条成功的操作命令。</p><p class="ql-block">没有欢呼。</p><p class="ql-block">没有庆祝。</p><p class="ql-block">只是在验收报告里,多了一项签字。</p><p class="ql-block">像一个时代,轻轻向另一个时代点了点头。</p> 尾声 <p class="ql-block">几年就这样悄然过去。那天,马克忽然转来一份萨克森州配电网调度中心的事故统计。文件上密密麻麻的动作记录铺满几十页,像某种静默的见证——这些年,电网到底经历过多少风暴,多少黑暗中的搏动。</p><p class="ql-block">我翻着翻着,鼠标忽然停住了。</p><p class="ql-block">在一段看似普通的时间戳里,我发现了一次极其罕见的双重小接地故障。那天恰逢雷雨大作。第一道闪电击中一条架空线,电网自愈逻辑随即启动,在多个可能的拓扑选项中快速扫描恢复路径。</p><p class="ql-block">就在系统即将执行恢复操作的一刻,第二道闪电又击中了另一条线路,另一相的小接地故障几乎在同一瞬间出现,保护立即跳闸。</p><p class="ql-block">而自愈算法却像在暴雨中睁开了第二双眼。</p><p class="ql-block">带方向的故障识别器捕捉到异常,系统在极短时间内修正判断,确认这是双重故障,并立即改写恢复策略。一连串操作命令在后台悄然落下,像一场无声的指令雨。几秒钟后,供电恢复——仿佛什么都未曾发生,只在统计表上留下几行不起眼的数字。</p><p class="ql-block">我把这件事告诉她:“你知道吗?每年平均都有一百多次故障。你的自愈功能已经几百次成功恢复供电,一次误动都没有。这是你一生都值得骄傲的工作。”</p><p class="ql-block">她听着,却连头都没有轻轻点一下。她始终是那种平常心的样子,不像我此刻这样,被一种无法抑制的激动悄悄淹没。</p><p class="ql-block">忽然,我又想起自己拍过的一张水景照片——《生命之火》。</p><p class="ql-block">西班牙建筑师高迪曾说过:“直线属于人类,曲线属于上帝。”曲线,尤其是闭合的曲线,总与生命相连。它们不像直线那样僵硬,而是充满流动与节律。风像大自然的“上帝”,在瞬间赋予平静的水面以形与意,让原本无生命的倒影,突然拥有跳动的节拍。</p><p class="ql-block">那一刻,我再次意识到:水景总是在微风下最为精彩,而生命,却常在风暴中被洗炼。</p> 后记 <p class="ql-block">转眼八年过去了。她正在使用克里斯蒂安后来开发的一套电网模型分析工具。他早已换了赛道,开始处理高比例新能源系统中更为复杂的有源状态估计问题。</p><p class="ql-block">模型的维度再次提升,原本用于描述结构的拓扑语言,也被自然地扩展为能够表达完整运行场景的语言。她一边使用,一边意识到:这套工具已经不再只是“给专家用的”,而是允许使用者自己去创造新的功能。</p><p class="ql-block">后来有人告诉我,欧洲一家大型能源咨询公司认为,这正是它超越美国同行的原因。</p><p class="ql-block">为了推广这款新产品,我给温克勒先生打了电话。他的声音一出现,他的形象便立刻浮现在眼前:戴着眼镜,尖下巴,说话严厉时瞳孔会缩成针尖大小,而偶尔和蔼时,又会明显放大。</p><p class="ql-block">“您们对我们的电网自愈是否满意?”我找了个不算生硬的切入口。</p><p class="ql-block">“有一次我们以为上千次成功动作的记录要被终结了。”他顿了一下,“结果不过是一个方向识别器的误动。”</p><p class="ql-block">电话那头轻轻笑了一下。随后,他补了一句:</p><p class="ql-block">“我的同事都非常佩服她。”</p><p class="ql-block">我听得出,那不是客套,而是一句发自内心的评价。</p> <p class="ql-block">图文皆为原创</p>