为什么非得按顺序写代码?顺序重要吗?

2025 年 11 月 10 日
 muchan92

是否有人想过,“顺序”是代码非本质复杂性的根源。

“顺序”是双刃剑,代码量少时方便,一旦程序变大,就会变为“枷锁”,改动一点儿都可能崩塌,而需求变化却是常态。

真相是,不按照顺序,我们依然可以把逻辑正确描述出来。因为逻辑关系自带方向性,可以自动推导。真正适合顺序的地方是计算过程,而非逻辑。

打破“顺序枷锁”,才能从根本上提升代码的稳定性和可维护性,不再需要重构。因为“稳定性”,本就不该依赖于天生脆弱的顺序。

https://github.com/rainforesters/imsure

github.com/rainforesters/imsure
// [编译期间]
// 定义规则,描述依赖关系,与顺序无关
A = X + Y  ✅
Y = D - E  ✅
X = B * C  ✅
// [运行期间]
// 可以在任何位置、任何时间进行赋值
E = 1 // wait 1s
C = 2 // wait 1s
B = 3 // wait 1s
D = 4 // wait 1s
(A: 9, Y: 3, X: 6)
8727 次点击
所在节点    程序员
102 条回复
BestPix
2025 年 11 月 10 日
你可以设计一个乱序输入的编辑器,不要顺序打字。
Gilfoyle26
2025 年 11 月 10 日
闭关三年,一日练成,横空出世,整体木瓶,独步天下,拿到江湖一看,是个垃圾。
muchan92
2025 年 11 月 10 日
@OneLiteCore 为什么会错误的以为这会更难维护?实际上这更容易维护。你以为你需要弄懂所有的规则才能写代码、改代码?并非如此,你甚至不需要感知它之前是否有规则,你只需要描述你的规则就好了。就像类型约束一样,假设一个类型为 int64 的变量,它的取值范围从无规则时 64 位,到规则 1 约束 32 位,再到规则 2 约束 16 位。
Ketteiron
2025 年 11 月 10 日
好奇看了下 demo 给我看晕了。
这要是真有人用在生产上,怕是一半时间都在 debug 。
声明式/响应式编程我承认有一定合理性和可行性,本质上是希望将 n²的组合复杂度缩小为 2n ,虽然其实并没有消除任何复杂度。
muchan92
2025 年 11 月 10 日
@Ketteiron 思维惯性的阻力,你若看 prolog 的话会更晕。和上条回复一样,错觉以为这会导致更难 debug ,实际上你几乎不需要 debug 。因为,若定义一条规则把取值范围从 64 位收窄为 16 位,那么它一定会收窄为 16 位,这是确定的肯定不会出错。同理,假设有多条业务规则作用于一个变量上,那么它也是取值收窄的过程,并且每次都是确定的不会出错,由此推及整个程序也是确定的。所以,实际上很少需要 debug 。
liuchenx
2025 年 11 月 10 日
1. 你这解决了什么问题?
2. 有什么优势?
就目前发的那个 demo 看不出来什么,连个业务相关的 demo 都没有, 一上来就各种付费,你觉得这里的人谁会上当?
YUX
2025 年 11 月 10 日
zig
lqs
2025 年 11 月 10 日
您是否在找:Microsoft Excel
maigebaoer
2025 年 11 月 10 日
Excel 满足你
muchan92
2025 年 11 月 10 日
@liuchenx 有示例 https://github.com/rainforesters/imsure-demo ,按照惯性思维,你可能会觉得难看懂,但要实现相同功能,按传统方式来写代码肯定会复杂得多。你最好先忘掉规则,只把数据结构当做一个普通对象,读写任何属性都是正确的。然后再去看,规则是如何保证属性始终保持正确性的。
shyling
2025 年 11 月 10 日
因为高级编程语言讲究的就是按人脑思维。

机器确实不那么 care 顺序,所以这是编译时运行时的优化点。
muchan92
2025 年 11 月 10 日
@lqs
@maigebaoer
对啦,终于有人看懂了。它很像 Excel ,但可以用作通用编程,简单、可靠、稳定。
afirefish
2025 年 11 月 10 日
上层:依赖倒置,切片编程等都是系统性解决代码可维护性的东西,或许就是你说的非顺序执行?
下层:微处理器乱序执行(虽然我讲不出原理,但是我知道有这么个东西)
muchan92
2025 年 11 月 10 日
@shyling 有没有可能我们是被“命令式的机器执行思维”限制了原本更人性化的“方程式思维“。
forisra
2025 年 11 月 10 日
这是特德·姜《你一生的故事》(也就是电影《降临》)里面的七肢桶来地球了?要用非线性语言来给我们使用线性语言的人类大脑升级一下。
pweng286
2025 年 11 月 10 日
我怎么记得好像刷到过
muchan92
2025 年 11 月 10 日
@forisra 请问你解决数学问题时是用“算术方法”还是“方程方法”?难道命令式编程不是把业务需求改写为算术过程吗?
henix
2025 年 11 月 10 日
我很喜欢 Makefile ,以前也思考过能否将 Makefile 式的依赖计算引入到编程语言内部
一个看起来很接近的东西是 Vue 的 Computed Properties ,个人认为在某些场景下还是有用的,比如能自动缓存
但大多数情况下直接用变量赋值确实是最简单的
kome
2025 年 11 月 10 日
处理器: 我不造啊,我要计算 a-b ,但是 ab 的数据还没送过来呀,c+d 的数据已经送过来了,反正闲着也是闲着,我就先计算 c+d 了。
340244120w
2025 年 11 月 10 日
预告后续楼主总篇: 《如何让同事懵逼,让领导抓心:构建代码护城河完全指南》

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/1171776

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX