是否有人想过,“顺序”是代码非本质复杂性的根源。
“顺序”是双刃剑,代码量少时方便,一旦程序变大,就会变为“枷锁”,改动一点儿都可能崩塌,而需求变化却是常态。
真相是,不按照顺序,我们依然可以把逻辑正确描述出来。因为逻辑关系自带方向性,可以自动推导。真正适合顺序的地方是计算过程,而非逻辑。
打破“顺序枷锁”,才能从根本上提升代码的稳定性和可维护性,不再需要重构。因为“稳定性”,本就不该依赖于天生脆弱的顺序。
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)
1
w568w 13 小时 4 分钟前 前排提示:OP 是之前那个计算机民间科学家
历史战绩: 一种省时省力的编程方式 https://www.v2ex.com/t/1121454 人心中的成见是一座大山 https://www.v2ex.com/t/1122487 我认为促进手机电池 CPU GPU 等硬件发展的好方法是,开发更耗资源的游戏或软件比如微信 https://www.v2ex.com/t/1157448 |
2
Leviathann 13 小时 3 分钟前
何意味
|
4
chendy 13 小时 1 分钟前
字文的序顺不影响阅读是吧
道理我都懂,但是乱序执行不是编译器和运行时的事么 普通人类乱序写代码是想训练 AI 么 |
5
laminux29 13 小时 0 分钟前
|
6
adoal 12 小时 59 分钟前
并没有什么非得按顺序写代码。从上层来说,有纯函数式程序设计等范式。从底层来说,有 CPU 乱序执行。只是你不关注罢了。
|
7
Rickkkkkkk 12 小时 58 分钟前
这就好像你在 21 世纪,去重新研究 18 世纪前人就搞完的数学一样。
要不先上个大学? |
8
vfs 12 小时 53 分钟前
所以你的项目解决了什么问题? 我要如何使用你的项目?
|
9
dog82 12 小时 51 分钟前
可以,但是会影响编译速度
|
10
muchan92 OP 这是解决数学或乱序执行问题吗?请先搞清楚再说好吧。
|
11
Alias4ck 12 小时 44 分钟前
goto
|
12
muchan92 OP @vfs 使用声明式写法,用规则来描述业务逻辑。就像写方程式一样,业务逻辑直接映射为规则,不需要推导,它会自动按正确顺序执行。即使需求变更,也只是调整下规则的依赖关系而已,简单可靠,不会涉及到推翻脆弱的代码顺序。
|
13
villivateur 12 小时 40 分钟前
您是否在找:HDL
|
15
NewYear 12 小时 38 分钟前
我同意楼主的想法,且感同身受。
我会写程序,当我成为领导后,再也不关心所谓的顺序写代码。。。 我乱序的把指令丢给下属。。他会自动的把我的想法用代码描述。。。并自动放在指定的位置。 乱序编程法,并没有任何问题。 你只是需要一个中间件,哪怕这个中间件是“人”。 |
17
OneLiteCore 12 小时 32 分钟前
代码是给机器执行的没错问题是代码也要让人读让人来维护,搞乱顺序或者额外定义一套依赖关系并不会对生产力有任何提升,但是带来的维护问题却是无法忽视的。
本来大公司的代码就已经是一座屎山了各个年代的代码各种设计模式和写法都有,加上这套玩意不如直接在招聘简章里面要求必须剃光头了。 |
18
CodeCodeStudy 12 小时 26 分钟前
编译器会重排序的
|
19
muchan92 OP @villivateur 是 Hardware Description Language 吗?挺好玩,有意思。
|
20
deplives 12 小时 25 分钟前
请让我尊称您为计算机民间科学家
|
21
BestPix 12 小时 25 分钟前
你可以设计一个乱序输入的编辑器,不要顺序打字。
|
22
Gilfoyle26 12 小时 19 分钟前
|
23
muchan92 OP @OneLiteCore 为什么会错误的以为这会更难维护?实际上这更容易维护。你以为你需要弄懂所有的规则才能写代码、改代码?并非如此,你甚至不需要感知它之前是否有规则,你只需要描述你的规则就好了。就像类型约束一样,假设一个类型为 int64 的变量,它的取值范围从无规则时 64 位,到规则 1 约束 32 位,再到规则 2 约束 16 位。
|
24
Ketteiron 12 小时 1 分钟前
好奇看了下 demo 给我看晕了。
这要是真有人用在生产上,怕是一半时间都在 debug 。 声明式/响应式编程我承认有一定合理性和可行性,本质上是希望将 n²的组合复杂度缩小为 2n ,虽然其实并没有消除任何复杂度。 |
25
muchan92 OP @Ketteiron 思维惯性的阻力,你若看 prolog 的话会更晕。和上条回复一样,错觉以为这会导致更难 debug ,实际上你几乎不需要 debug 。因为,若定义一条规则把取值范围从 64 位收窄为 16 位,那么它一定会收窄为 16 位,这是确定的肯定不会出错。同理,假设有多条业务规则作用于一个变量上,那么它也是取值收窄的过程,并且每次都是确定的不会出错,由此推及整个程序也是确定的。所以,实际上很少需要 debug 。
|
26
liuchenx 11 小时 41 分钟前
1. 你这解决了什么问题?
2. 有什么优势? 就目前发的那个 demo 看不出来什么,连个业务相关的 demo 都没有, 一上来就各种付费,你觉得这里的人谁会上当? |
27
YUX PRO zig
|
28
lqs 11 小时 29 分钟前
您是否在找:Microsoft Excel
|
29
maigebaoer 11 小时 26 分钟前 via Android
Excel 满足你
|
30
muchan92 OP @liuchenx 有示例 https://github.com/rainforesters/imsure-demo ,按照惯性思维,你可能会觉得难看懂,但要实现相同功能,按传统方式来写代码肯定会复杂得多。你最好先忘掉规则,只把数据结构当做一个普通对象,读写任何属性都是正确的。然后再去看,规则是如何保证属性始终保持正确性的。
|
31
shyling 11 小时 11 分钟前
因为高级编程语言讲究的就是按人脑思维。
机器确实不那么 care 顺序,所以这是编译时运行时的优化点。 |
32
muchan92 OP |
33
afirefish 11 小时 7 分钟前
上层:依赖倒置,切片编程等都是系统性解决代码可维护性的东西,或许就是你说的非顺序执行?
下层:微处理器乱序执行(虽然我讲不出原理,但是我知道有这么个东西) |
35
forisra 11 小时 3 分钟前
这是特德·姜《你一生的故事》(也就是电影《降临》)里面的七肢桶来地球了?要用非线性语言来给我们使用线性语言的人类大脑升级一下。
|
36
pweng286 11 小时 3 分钟前
我怎么记得好像刷到过
|
38
henix 10 小时 14 分钟前
我很喜欢 Makefile ,以前也思考过能否将 Makefile 式的依赖计算引入到编程语言内部
一个看起来很接近的东西是 Vue 的 Computed Properties ,个人认为在某些场景下还是有用的,比如能自动缓存 但大多数情况下直接用变量赋值确实是最简单的 |
39
kome 9 小时 50 分钟前 via iPhone
处理器: 我不造啊,我要计算 a-b ,但是 ab 的数据还没送过来呀,c+d 的数据已经送过来了,反正闲着也是闲着,我就先计算 c+d 了。
|
40
340244120w 9 小时 42 分钟前
预告后续楼主总篇: 《如何让同事懵逼,让领导抓心:构建代码护城河完全指南》
|
41
muchan92 OP @340244120w 你认为这会抬高编程门槛?相反这其实会降低编程门槛。我们十几个项目都工作良好,稳定可靠。
传统思维会认为,在没有完全弄懂程序的所有细节之前是不可能正确修改代码的,因为每一行代码都堆叠在前面的代码之上,移动一点儿都可能崩塌。 但这种方式不会。你完全不必了解全部规则,也能放心大胆地修改代码,不会出错。为什么呢?举例说明,假设需求变了,要把程序改为 A = X + Z 。你有两个选择: 一、你开心时,可以找到 A = X + Y 的地方把 Y 换为 Z 就好了; 二、你不开心时,忘掉之前的 A = X + Y ,管那么多干啥,直接新写一个规则 A = X + Z 把之前所有关于 A 的覆盖掉就好了。 现在你不必了解全局也可以放心大胆地写代码了。 因为每一个规则,只关注依赖的变量,但不必关心被依赖的变量在哪儿、何时准备好,仅仅把自己计算正确就行了。当然,被依赖的变量也是如此计算的。 所以,从方法二可以看出,即使程序迭代了上百次,你也可以完全忽略已有规则,就当它们都不存在,所有变量都是新的,大不了就把新需求从头写一下而已。 |
42
Tink PRO 我看不懂你说的,有实际应用?发个大型一点的 demo 出来看看
|