「声明式」思维模型
Contents
最近我准备做一个小项目。一个很小的东西,本来就想验证一个我特别想要的核心功能。结果你猜我干了什么?我从登录做起,做鉴权,做 API,然后开始纠结后端用什么技术栈,数据库选 Postgres 还是别的,可观测性怎么搭,日志、监控、链路追踪一样都不能少。调研了许久,实现了许久,前前后后折腾了俩月。回头一看,壳子做得精美极了,登录界面漂亮,接口规整,监控面板一拉一个准——可我真正想验证的那个核心功能,一字未动。
写作说明
本文的想法、素材与观点均出自我本人,成文则由 Anthropic 的 Claude Opus 4.8 模型按我的语言风格整理润色而成。
提示词(我交给模型的原始素材)
我想写一篇文章,遵照我的写作风格。文档大意如下:
我最近准备做一个小项目,然后我就从登录、鉴权、API开始做,后端技术选型、数据库选型、可观测性等等等等,调研了许久,实现了许久,折腾了俩月,把壳子做的精美极了,可是自己真正想要实现的核心功能,还一字未动。
我意识到自己的思维模式不对。
我现在还是 imperative 的模式,是指令式的,让从 0 加到 100,就老老实实从 0 加到 100,不可谓不努力、不刻苦,但是,做个小员工可以,稍微责任重大一点的职缺儿,我就发现这种思维模式不行了。简单问题,别人还可以指挥你一二三四五,就解决了,这类问题往往本身就不具备什么难度价值。困难的问题,根本没有作业可以抄!每个困难的问题,无不是具体情境下的具体问题,你能找谁?谁愿意来管你这摊子?谁有那个耐心和好奇来帮你处理这摊子?如果恰逢有这个人、有这个好奇心来帮你处理这摊子,那么,最后升职加薪的为什么是你而不是人家?!
Rust 的学习经历告诉我,还有一种思维模式,叫做:declaritive,声明式。如何把大象装进冰箱?答三步。第一步把冰箱门打开,第二步把大象装进去,第三步把冰箱门关上。接着,再去一层层拆解,如何把冰箱门打开?如何把冰箱装进去?如何把冰箱门关上?
我过去做菜,特别苦恼于如何记住大师烧菜时的一二三四五步,我下了好的功夫去记忆,比如西红柿炒鸡蛋吧,“老饭骨"的一位师傅做的特别好,我一直试图靠背诵和记忆的方式去解决,结果,一到真开始做了,就开始对某处的处理细节含含糊糊了,吃不准,就又拿出视频再次学习。就这样,“学”了忘,忘了“学”,反反复复发。
我终于知道原因了。原因就在于我是在记步骤,而不是总结;我的脑袋在跟着视频的时间戳,从头到尾,而不是以终为始,从成品倒着推:最后一步是出锅,这时候西红柿炒鸡蛋的形态是什么样的?为了达成这个样子,上一步应该达成什么样的结果?哦,需要把备好的炒鸡蛋+淀粉水+滴几滴香油,这样,淀粉水就把西红柿汁儿等都裹在一起了……
从前往后,你会发现一步一步好难记,死板、离散,最终就学了个按部就班,还隔三差五的缺笔少画。
从后往前,用的是理解,用的是脑子,而不是记忆力。记忆力需要把重要的、不重要的都统一扁平化处理,看似公平了,其实是对大脑最大的不公平:记不住。脑子需要的是树状结构,需要达成提纲挈领、纲举目张的功效。换句话说,任何事物,能记的,就只有对这件事最为深刻的洞察,其他均为非重要的细节部分,无须记。
细节,是核心问题的延伸。只有核心站得住,那些细节才有依靠。比如造车吧,本质上确实是四个轱辘+四个沙发,后面需要雇佣大量的人去解决的一个又一个的问题,什么汽车传动的问题,设计的问题,等等等等,都是「四个轱辘+四个沙发」这个核心问题的延展,每一个问题,又会根据问题本身的特性,继续延展。这才是人间真实的演进、演化的过程,而不是机械的说只要按着某个步骤一二三四五,先设计外观,再去选沙发,再去搞传动,最终比亚迪汽车就造出来了。NO NO NO,真实世界的运转不是这样子的。真实的世界不是串糖葫芦,真实的世界,是演化。
倒着求解。不知道 declaritive 这种思维模式算不算是「逆向思维」。
我盯着那个精美的壳子看了半天,心里堵得慌。两个月啊,我不是不努力,我每天都在敲代码,每天都有进度,每天睡前都觉得"今天又往前推进了一点”。可推进的全是壳子。那个让我一开始心痒难耐、非做不可的核心功能,纹丝没动。
那天晚上我突然反应过来:不是我不够努力,是我的脑子,从一开始就用错了挡。
我还停在「指令式」这一挡
我现在的思维模式,说穿了,是 imperative 的,指令式的。
什么叫指令式?就是你给我下个命令:从 0 加到 100。我就老老实实,0、1、2、3……一个不落地加上去,加到 100 为止。不可谓不努力,不可谓不刻苦,每一步都踏踏实实,绝不偷懒。
这种思维,做个小员工,绰绰有余。领导把活儿掰开揉碎,告诉你一二三四五,你照着干,干得又快又好,是个好兵。
可问题是,凡是别人能指着你说"一二三四五"就解决的问题,这类问题本身往往就不具备什么难度价值。 它之所以能被拆成一二三四五喂到你嘴边,正是因为有人已经替你想明白了,那点难,早被人嚼烂了。
真正困难的问题,长什么样?
困难的问题,根本没有作业可以抄。 每一个困难的问题,无一例外,都是具体情境下的具体问题——是你这个项目、这个时间点、这堆人、这摊烂账,搅在一起独一份的难题。
你能找谁?翻遍全网也没有一篇教程是对着你这摊子写的。谁愿意来管你这摊子?谁有那个耐心、那个好奇心,钻进你的具体处境里,陪你一点点把它捋顺?
退一万步,就算真有这么个高人,恰好有这份好奇,愿意俯下身来替你把这摊子处理了——那我得问一句扎心的:最后升职加薪的,凭什么是你,而不是人家?!
你看,指令式这挡,挂到一定程度就空转了。它要求世界先有人替你把题拆好。可越往上走,越往责任重的位子上挪,就越没人替你拆题了。题,得你自己拆。
Rust 教我的另一挡:声明式
我是学 Rust 的时候,隐隐摸到了另一种挡位的存在。它叫 declarative,声明式。
声明式不关心你"怎么一步步爬过去",它先逼你说清楚:你最终到底想要个什么东西? 先把那个"终点的样子"声明出来,再回过头去想怎么够得着。
经典的笑话你肯定听过——如何把大象装进冰箱?
答:三步。第一步,把冰箱门打开;第二步,把大象装进去;第三步,把冰箱门关上。
这笑话好笑,是因为它"废话"。可你品品,这恰恰就是声明式思维的骨架:先不管细节,先把这件事最顶层的结构讲清楚——它就这三大块,不多不少。然后,再一层一层往下拆:怎么把冰箱门打开?怎么把大象塞进去?怎么把门关上?每一层,都是上一层那个目标的拆解。
这跟指令式正好拧着来。指令式是"从 0 往 100 爬",声明式是"先把 100 的样子定死,再倒推每一步该是什么"。
我那个项目,要是用声明式的脑子去想,第一句就该问自己:这玩意儿做出来,核心功能跑通了长什么样? 而不是埋头先去搭一个谁都会搭的登录鉴权。
可惜我没有。我挂着指令式的挡,把"造一个 App"自动翻译成了"先登录、再鉴权、再 API、再选型……"——按部就班,老老实实,从 0 加到 100。花了两个多月,壳子精美,内核空空。
我做菜,也栽在同一个坑里
这事儿其实早有预兆,只是我一直没串起来。
我从前学做菜,特别苦恼一件事:怎么记住大师的一二三四五步。就拿西红柿炒鸡蛋说吧——别笑,这道家常菜,真做好了不容易。“老饭骨"有位师傅做得特别地道,我就跟着学。
我用的是什么法子呢?背。 下死功夫去记:先炒好鸡蛋,再切西红柿,切成某某样子,再炝锅,炒西红柿,放盐、糖、胡椒粉……我把每一步都当成考点,一条一条往脑子里塞。
结果呢?一到真开火,手忙脚乱之间,就对某处的细节含含糊糊了:哎,这一步到底是先放鸡蛋还是先放西红柿来着?吃不准。只好关火,又把视频翻出来,从头再看一遍。
就这么"学"了忘,忘了"学”,反反复复,折腾了不知多少回,还是没把它焊进脑子里。
跟那个项目,是不是一个味儿?都是低着头,跟着别人给的步骤往前挪,一步都不敢漏,结果一步都没真懂。(这事我以前也念叨过,想要习得,不应该钻到描述系统里去——背步骤,就是一头扎进了描述系统。)
病根:我跟着时间戳走,没以终为始
后来我终于想明白病根在哪了。
我是在记步骤,而不是在总结。 我的脑袋,全程跟着视频的时间戳走,从 00:01 到 05:30,从头到尾捋一遍,谁先谁后老老实实背下来。这是顺着时间在记流水账。
正确的姿势,是 以终为始,从成品倒着往回推。
你得先盯着最后那一刻——出锅。出锅这一瞬间,一盘合格的西红柿炒鸡蛋,是个什么形态?汤汁红亮、浓稠挂芡,鸡蛋裹着西红柿的汁水,亮晶晶地抱成一团,而不是汤水分离、寡淡塌软。
好,定住这个终点,往回问一步:为了出锅是这个样子,上一步得先达成什么结果? 哦——得在出锅前,把备好的炒鸡蛋回锅,淋一点淀粉水,再滴几滴香油。为啥?因为那点淀粉水一勾,就把西红柿出的汁儿、把鸡蛋、把所有零碎全都裹到一块儿了,这才有了出锅时那个"抱成团、挂得住"的样子。
你看,一旦你知道终点要什么,那一步"为什么放淀粉水"就不用背了——它是被终点逼出来的,是你自己能推出来的。
顺着时间记,淀粉水只是第 N 步一个孤零零的动作,记不记得住全凭运气;倒着推,淀粉水是"我要那个挂芡效果"的必然结果,想忘都难。
从前往后是记忆,从后往前是理解
把这两个方向摊开比一比,差别就血淋淋地出来了:
从前往后——你会发现一步一步特别难记,死板、离散,彼此之间没勾连。最终你学了个什么呢?学了个"按部就班",而且隔三差五还缺笔少画,漏一步、错一步。
从后往前——你用的是理解,是脑子,而不是记忆力。
这里头有个我以前从没意识到的狠话:记忆力,其实是对大脑最大的不公平。
为啥这么说?因为记忆力干活的方式,是把重要的、不重要的,全都拍扁,统一对待,一视同仁地往脑子里塞。看上去多公平啊,雨露均沾。可结果是什么?是记不住。 大脑被一堆没有主次、没有结构的碎片塞满,它扛不住,转头就给你忘个精光。
脑子真正想要的,不是一摊扁平的碎屑,是 树状结构。 是提纲挈领、纲举目张——抓住那根主干,枝枝叶叶自然就挂上去了。
说到底,任何一件事,真正值得你去记的,就只有对这件事最为深刻的那个洞察。 别的,全是非重要的细节,无须记。西红柿炒鸡蛋那个洞察就是:“要让汤汁裹住一切”,抓住这一条,放不放糖、几成油温,都能顺着推出来。
细节是核心的延伸,世界不是串糖葫芦
为什么抓住核心,细节就能往外长?因为 细节,本就是核心问题的延伸。 只有核心站得稳,那些细节才有依靠,才知道自己该往哪儿摆。
拿造车说吧。一辆车,本质上是个什么?说白了,就是四个轱辘加四个沙发——能跑,能坐人。这就是核心。
那剩下那一海的活儿呢?传动怎么搞,外观怎么设计,悬挂怎么调,电池怎么排布……都是大批工程师围着"四个轱辘加四个沙发"这个核心,一个一个延展出来的问题。而每一个问题,又会根据它自己的脾性,继续往下延展,长出更细的问题。这才是人间真实的演进、演化的样子。
可指令式的脑子是怎么想的?它以为造车是这样的:第一步设计外观,第二步去选沙发,第三步搞定传动……一二三四五走完,比亚迪就下线了。
NO NO NO。真实世界的运转,根本不是这样。
真实世界不是串糖葫芦——不是把一颗颗工序,按固定顺序,啪啪啪串在一根竹签上,串完就齐活。真实世界,是 演化:先有一个站得住的核心,然后从这个核心上,一层层、一支支地生长、分叉、再生长。是树,不是签子。
我那个项目的悲剧,现在看得清清楚楚了:我拿着一根竹签,先串了"登录",再串"鉴权",再串"选型"……串得整整齐齐,唯独忘了——糖葫芦的山楂,也就是那个核心功能,我一颗都还没洗呢。
倒着求解
所以那个困扰我的问题:从 0 加到 100 是指令式,那么先把 100 定死、再倒推每一步,这种声明式,算不算"逆向思维"?
我现在觉得,叫不叫"逆向思维"不重要。重要的是那个动作本身——倒着求解。
先看清你要的那个终点长什么样,把它钉死,再从终点往回走,一步步逼问"上一步该是什么"。难题没有作业可抄,没人替你拆题,那就自己从终点往回拆。
做菜如此,造车如此,做项目如此,做人也如此。
别再埋着头从 0 往上加了。先抬头看一眼你要去的那个 100。
Author Linsto Hu
LastMod 2026-06-20