V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
muchan92
V2EX  ›  程序员

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

  •  
  •   muchan92 · 13 小时 7 分钟前 · 2191 次点击

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

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

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

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

    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)
    
    42 条回复    2025-11-11 01:01:44 +08:00
    w568w
        1
    w568w  
       13 小时 4 分钟前   ❤️ 25
    前排提示:OP 是之前那个计算机民间科学家

    历史战绩:

    一种省时省力的编程方式 https://www.v2ex.com/t/1121454
    人心中的成见是一座大山 https://www.v2ex.com/t/1122487
    我认为促进手机电池 CPU GPU 等硬件发展的好方法是,开发更耗资源的游戏或软件比如微信 https://www.v2ex.com/t/1157448
    Leviathann
        2
    Leviathann  
       13 小时 3 分钟前
    何意味
    muchan92
        3
    muchan92  
    OP
       13 小时 3 分钟前
    @w568w 呵呵
    chendy
        4
    chendy  
       13 小时 1 分钟前
    字文的序顺不影响阅读是吧

    道理我都懂,但是乱序执行不是编译器和运行时的事么
    普通人类乱序写代码是想训练 AI 么
    laminux29
        5
    laminux29  
       13 小时 0 分钟前
    adoal
        6
    adoal  
       12 小时 59 分钟前
    并没有什么非得按顺序写代码。从上层来说,有纯函数式程序设计等范式。从底层来说,有 CPU 乱序执行。只是你不关注罢了。
    Rickkkkkkk
        7
    Rickkkkkkk  
       12 小时 58 分钟前
    这就好像你在 21 世纪,去重新研究 18 世纪前人就搞完的数学一样。

    要不先上个大学?
    vfs
        8
    vfs  
       12 小时 53 分钟前
    所以你的项目解决了什么问题? 我要如何使用你的项目?
    dog82
        9
    dog82  
       12 小时 51 分钟前
    可以,但是会影响编译速度
    muchan92
        10
    muchan92  
    OP
       12 小时 49 分钟前
    这是解决数学或乱序执行问题吗?请先搞清楚再说好吧。
    Alias4ck
        11
    Alias4ck  
       12 小时 44 分钟前
    goto
    muchan92
        12
    muchan92  
    OP
       12 小时 42 分钟前
    @vfs 使用声明式写法,用规则来描述业务逻辑。就像写方程式一样,业务逻辑直接映射为规则,不需要推导,它会自动按正确顺序执行。即使需求变更,也只是调整下规则的依赖关系而已,简单可靠,不会涉及到推翻脆弱的代码顺序。
    villivateur
        13
    villivateur  
       12 小时 40 分钟前
    您是否在找:HDL
    moudy
        14
    moudy  
       12 小时 39 分钟前
    @muchan92 建议去读一下 prolog 语言,然后再读一下 xslt
    NewYear
        15
    NewYear  
       12 小时 38 分钟前
    我同意楼主的想法,且感同身受。

    我会写程序,当我成为领导后,再也不关心所谓的顺序写代码。。。
    我乱序的把指令丢给下属。。他会自动的把我的想法用代码描述。。。并自动放在指定的位置。

    乱序编程法,并没有任何问题。
    你只是需要一个中间件,哪怕这个中间件是“人”。
    muchan92
        16
    muchan92  
    OP
       12 小时 37 分钟前
    @moudy 我学过,但它们解决的问题并不一样。
    OneLiteCore
        17
    OneLiteCore  
       12 小时 32 分钟前
    代码是给机器执行的没错问题是代码也要让人读让人来维护,搞乱顺序或者额外定义一套依赖关系并不会对生产力有任何提升,但是带来的维护问题却是无法忽视的。

    本来大公司的代码就已经是一座屎山了各个年代的代码各种设计模式和写法都有,加上这套玩意不如直接在招聘简章里面要求必须剃光头了。
    CodeCodeStudy
        18
    CodeCodeStudy  
       12 小时 26 分钟前
    编译器会重排序的
    muchan92
        19
    muchan92  
    OP
       12 小时 26 分钟前
    @villivateur 是 Hardware Description Language 吗?挺好玩,有意思。
    deplives
        20
    deplives  
       12 小时 25 分钟前
    请让我尊称您为计算机民间科学家
    BestPix
        21
    BestPix  
       12 小时 25 分钟前
    你可以设计一个乱序输入的编辑器,不要顺序打字。
    Gilfoyle26
        22
    Gilfoyle26  
       12 小时 19 分钟前
    闭关三年,一日练成,横空出世,整体木瓶,独步天下,拿到江湖一看,是个垃圾。
    muchan92
        23
    muchan92  
    OP
       12 小时 18 分钟前
    @OneLiteCore 为什么会错误的以为这会更难维护?实际上这更容易维护。你以为你需要弄懂所有的规则才能写代码、改代码?并非如此,你甚至不需要感知它之前是否有规则,你只需要描述你的规则就好了。就像类型约束一样,假设一个类型为 int64 的变量,它的取值范围从无规则时 64 位,到规则 1 约束 32 位,再到规则 2 约束 16 位。
    Ketteiron
        24
    Ketteiron  
       12 小时 1 分钟前
    好奇看了下 demo 给我看晕了。
    这要是真有人用在生产上,怕是一半时间都在 debug 。
    声明式/响应式编程我承认有一定合理性和可行性,本质上是希望将 n²的组合复杂度缩小为 2n ,虽然其实并没有消除任何复杂度。
    muchan92
        25
    muchan92  
    OP
       11 小时 46 分钟前
    @Ketteiron 思维惯性的阻力,你若看 prolog 的话会更晕。和上条回复一样,错觉以为这会导致更难 debug ,实际上你几乎不需要 debug 。因为,若定义一条规则把取值范围从 64 位收窄为 16 位,那么它一定会收窄为 16 位,这是确定的肯定不会出错。同理,假设有多条业务规则作用于一个变量上,那么它也是取值收窄的过程,并且每次都是确定的不会出错,由此推及整个程序也是确定的。所以,实际上很少需要 debug 。
    liuchenx
        26
    liuchenx  
       11 小时 41 分钟前
    1. 你这解决了什么问题?
    2. 有什么优势?
    就目前发的那个 demo 看不出来什么,连个业务相关的 demo 都没有, 一上来就各种付费,你觉得这里的人谁会上当?
    YUX
        27
    YUX  
    PRO
       11 小时 38 分钟前
    zig
    lqs
        28
    lqs  
       11 小时 29 分钟前
    您是否在找:Microsoft Excel
    maigebaoer
        29
    maigebaoer  
       11 小时 26 分钟前 via Android
    Excel 满足你
    muchan92
        30
    muchan92  
    OP
       11 小时 11 分钟前
    @liuchenx 有示例 https://github.com/rainforesters/imsure-demo ,按照惯性思维,你可能会觉得难看懂,但要实现相同功能,按传统方式来写代码肯定会复杂得多。你最好先忘掉规则,只把数据结构当做一个普通对象,读写任何属性都是正确的。然后再去看,规则是如何保证属性始终保持正确性的。
    shyling
        31
    shyling  
       11 小时 11 分钟前
    因为高级编程语言讲究的就是按人脑思维。

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

    传统思维会认为,在没有完全弄懂程序的所有细节之前是不可能正确修改代码的,因为每一行代码都堆叠在前面的代码之上,移动一点儿都可能崩塌。

    但这种方式不会。你完全不必了解全部规则,也能放心大胆地修改代码,不会出错。为什么呢?举例说明,假设需求变了,要把程序改为 A = X + Z 。你有两个选择:
    一、你开心时,可以找到 A = X + Y 的地方把 Y 换为 Z 就好了;
    二、你不开心时,忘掉之前的 A = X + Y ,管那么多干啥,直接新写一个规则 A = X + Z 把之前所有关于 A 的覆盖掉就好了。

    现在你不必了解全局也可以放心大胆地写代码了。
    因为每一个规则,只关注依赖的变量,但不必关心被依赖的变量在哪儿、何时准备好,仅仅把自己计算正确就行了。当然,被依赖的变量也是如此计算的。

    所以,从方法二可以看出,即使程序迭代了上百次,你也可以完全忽略已有规则,就当它们都不存在,所有变量都是新的,大不了就把新需求从头写一下而已。
    Tink
        42
    Tink  
    PRO
       4 小时 57 分钟前
    我看不懂你说的,有实际应用?发个大型一点的 demo 出来看看
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   934 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 21:59 · PVG 05:59 · LAX 13:59 · JFK 16:59
    ♥ Do have faith in what you're doing.