V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
brader
V2EX  ›  程序员

再也没有了当年的激情,去写出优雅和兼容并存的代码

  •  
  •   brader · 325 天前 · 7874 次点击
    这是一个创建于 325 天前的主题,其中的信息可能已经有所发展或是发生改变。
    你还记得那些年你写的另你感到骄傲的代码吗?

    94 条回复    2023-07-08 17:01:42 +08:00
    coderxy
        1
    coderxy  
       325 天前
    我也渐渐失去了当年对代码优雅高效的追求了。 。。
    NessajCN
        2
    NessajCN  
       325 天前   ❤️ 8
    天哪你管这叫优雅吗....
    你知不知道,数字,或者叫 number, int 类型的变量,在计算机中本身就没有所谓的「进制」之分的?
    如果一个变量是 int,你给他赋值 0x10, 或 16 或 0b10000, 都是完全等价的
    只有打印的时候为了让你这个人类看懂才需要表示成 10 进制或 16 进制?
    eilisonLiang
        3
    eilisonLiang  
       325 天前
    优雅的时候,效率有时候就低了,如果只要效率,那就要放弃优雅
    brader
        4
    brader  
    OP
       325 天前
    @NessajCN 这个工具类有具体实用场景的,做数字币的接触多了就知道了,不纠结具体业务了,我只是缅怀以前对代码的激情,当年水平有限,以现在的眼光去看,可能几年前刚入行写的代码,是有瑕疵的,但是当时我是用心去写的
    brader
        5
    brader  
    OP
       325 天前
    @eilisonLiang 是啊,我现在的状态,对优雅的态度,总结起来就是:时间太赶算了、能跑就行算了
    idealhs
        6
    idealhs  
       325 天前
    没看出来这个进制转换在倒腾啥
    j3llypunk777
        7
    j3llypunk777  
       325 天前   ❤️ 3
    优雅的代码有一个很重要的前提是“优雅的需求”
    xinyewdz
        8
    xinyewdz  
       325 天前
    哈哈,前两年还在写优雅代码,喷同事垃圾代码。去年开始,我就开始堆山了,能跑就行。
    pkoukk
        9
    pkoukk  
       325 天前
    copilot 出来之后我又重新开始写简洁干净清楚的代码了。因为我需要让 AI 看得懂,他看得懂,我需要写的东西就少
    brader
        10
    brader  
    OP
       325 天前
    @idealhs 抛开业务场景的话,肯定很难想象啦,这种业务代码要结合业务看才好理解
    brader
        11
    brader  
    OP
       325 天前
    @xinyewdz 我已经摆烂好多年了
    eilisonLiang
        12
    eilisonLiang  
       325 天前
    @brader 估计要看结果导向吧,有的领导要求能跑就行,有的是要求质量,不同情况写不同的代码,优雅的代码,bug 会少一些,就是要折腾一下
    oneisall8955
        13
    oneisall8955  
       325 天前 via Android
    能看懂就是好代码
    nikola11
        14
    nikola11  
       325 天前
    时间有限,就顾不上优雅
    zjj19950716
        15
    zjj19950716  
       325 天前
    一头扎进了大染缸
    iSNN
        16
    iSNN  
       325 天前
    @eilisonLiang 有的领导...有的领导...其实只有一种领导。开发快、质量高、可维护、BUG 少、稳定性好
    Rache1
        17
    Rache1  
       325 天前   ❤️ 3
    如果要说你列出的代码是优雅的正例的话,还真有些问题。

    1 、魔法字符串,这里的 1000000...、还有 bcdiv 的那个 18 、0x
    2 、dexToHex 和 hexToDec 这俩方法 php 都自带了的,我不太确定你这个实现跟自带的有什么区别。
    3 、你的 remove0x 和 add0x ,在这里就是个摆设吗,71 行、48 行、这些明显就应该用你这个函数了吧。
    4 、再说回你这个 add0x 和 remove0x ,如果是我的话,我会改成 withPrefix 和 trimPrefix
    5 、你这里面判断以 0x 开头的,也至少存在 2 处调用了,那就应该也单独提成函数。
    6 、你这 48 行的 decToHex 前面拼接的 0x ,不是可以直接传给 dexToHex 的 mark 么
    QlanQ
        18
    QlanQ  
       325 天前
    我还没有,最近接手的代码,让我 无从下手

    比起代码,数据库设计的烂才是最难受的

    去年的项目用的 yii 1.1 + layerui ,还说是自研


    借楼问下,
    @coderxy
    @NessajCN
    @eilisonLiang
    @brader
    @pkoukk

    数据库关联表,冗余数据才是正常的吗?
    最近看到好几个项目这样做,我都怀疑自己是不是错了?
    azui999
        19
    azui999  
       325 天前
    能跑就行,很多东西,我也把握不了
    bybyte
        20
    bybyte  
       325 天前
    能破就行永远在第一
    coderxy
        21
    coderxy  
       325 天前
    @QlanQ 冗余数据是合理的,你学过三范式,肯定也学过反范式吧? 在很多场景下三范式的写法是个灾难。
    sslyxhz
        22
    sslyxhz  
       325 天前 via Android
    罗永浩. jpg
    ElvY
        23
    ElvY  
       325 天前
    老鸟最应该做的是面向文档编程,代码写的和文档一样。
    brader
        24
    brader  
    OP
       325 天前
    @Rache1 兄弟,有些代码,离开业务场景空想是想不明白的,这个代码我四五年前写的了,模糊记得一些,你疑问的点大概和你说下吧:
    1 、1000000000000000000 和 0x 是业务需要,它是不会也不可能变化的,所以我写死了专用值,也不存在我需要添加除 0x 前缀外的场景,这个是专用于数字币计算的。
    2 、我不知道你所说的 PHP 自带的的十进制和十六进制转化是否指的是 dechex 这个函数,如果是的话,这个函数是用不了的,数字币都是高精度计算,数字位数是 n + 18 位,用自带函数计算是超出上限的。
    3 、我直接拼 0x 是因为我很确定我上一步的值是不存在 0x 的,无需重复调用兼容性的方法增加判断,当然,你要说非要调用比较优雅,也不是不行,这个见仁见智,我不反驳,我当年怎么想的,我也记不起来了。
    4 、同 1 解释,因为只专注于+0x
    5 、此工具函数比较简单,当时为什么没有单独提出来,我已经记不清了。
    6 、是的,可能当时忘记了吧。
    brader
        25
    brader  
    OP
       325 天前
    适量的冗余是正常的,有时候是为了查询方便,而且对于没有要求前后数据变更强一致性的数据,也无需花精力去同步。
    比如之前我做过一个客服聊天记录表,我就在里面冗余了用户昵称,方便查询,用户改昵称,我也不会同步过来的,已经问过产品,说无所谓
    brader
        26
    brader  
    OP
       325 天前
    @Rache1 奥,对了,第 1 点 bcdiv 的 18 这个疑问忘记告诉你了,这个是因为数字币 eth 中, 单位 wei 转 eth ,存在小数,精度需要保存到小数点后 18 位
    brader
        27
    brader  
    OP
       325 天前
    @ElvY 我现在是代码随意,因为是我自己维护的。文档我倒是挺认真写的,因为我不想坑前端同事
    caixiangyu17
        28
    caixiangyu17  
       325 天前
    代码优雅不优雅不是程序员说了算。你在屎山里面,咋也写不出来好东西的。
    想要好代码,需要团队的规范,大家都高要求,你自己反而就没什么负担。
    git commit comment 格式不对,测试不过,coverage 不够,linting 不过,有 Vulnerabilities 等等,都会在各个环节卡住你的代码。要么不能 push ,要么不能 merge PR 。这样每个人写的代码都不得不这么做,质量就上来了。
    TedS
        29
    TedS  
       325 天前
    优雅就是个伪命题,在保证质量前提下,让团队合作更轻松,才是好代码。
    Rache1
        30
    Rache1  
       325 天前
    @brader 对于魔法字符串、魔法数字这些,如果你做不到在小单元内使用,最好的方式就是提成常量,并加以注释。

    实际上你这个 add0x 里面本就不应该包含 remove0x 的逻辑,你应该在外部就确定是否要 rmeove0x ,亦或者单独提一个方法
    Leviathann
        31
    Leviathann  
       325 天前
    优雅是虚的,代数才是真的
    zhutai0201
        32
    zhutai0201  
       325 天前   ❤️ 1
    又不是不能用?
    tcpdump
        33
    tcpdump  
       325 天前   ❤️ 1
    老板:当年他们努力工作给我买的宝马 5 系,现在提了库里南,不过再也没有了当年的激情。
    Seulgi
        34
    Seulgi  
       325 天前
    这两年疫情影响,一个是跳槽不会那么随意,一个是工资涨幅没有那么大之后,确实是不管是学习/代码/态度都有所躺平。
    locoz
        35
    locoz  
       325 天前 via Android
    再也没有了当年的激情,去写出代码,现在都是能让 AI 解决的绝对不自己动手…
    Pastsong
        36
    Pastsong  
       325 天前
    你觉得优雅别人接手的人觉得是屎山

    优雅就是件感动自己的事情,没什么卵用
    nikola11
        37
    nikola11  
       325 天前
    @QlanQ 大多数场景 冗余都能满足需求,sql 应该尽可能的简单,不冗余 sql 太复杂了,不利于维护
    tool2d
        38
    tool2d  
       325 天前
    @locoz 当年产品经理巴拉巴拉聊一天,程序员埋头写代码。
    现在程序员巴拉巴拉聊一天,AI 埋头写代码,附赠一堆 BUG 。
    tool2d
        39
    tool2d  
       325 天前
    记得早年 twitter 上一项活动,比谁删历史旧代码最多最快。

    我倒是觉得,写代码不仅是为了优雅,而是为了便于以后维护和复用。

    而好维护代码是准则之一,就是子模块越简单越好,代码量越少越好。
    locoz
        40
    locoz  
       325 天前
    @tool2d #38 不至于,在描述清晰且模型能力足够( GPT4 )的情况下,输出的代码基本都是可用的,极少出现 BUG 。最多也就是因为 Token 过多,导致 AI 忘记了某一条或某一些要求(根据长度而定),需要检查后重新要求补充。
    janus77
        41
    janus77  
       325 天前
    优雅是自己的事。。。。一个人觉得优雅,别人接手的时候可能会觉得这写的什么玩意儿。还有三年前觉得优雅,三年后感觉一坨屎的情况。
    最佳实践才是王道
    如果做不到最佳实践,那就还是那句话,又不是不能用.jpg
    tool2d
        42
    tool2d  
       325 天前
    @locoz 可能是领域关系,我让 GPT3.5 写比较复杂的后端代码,会出现不少问题。如果是前端,应该没问题。
    veike
        43
    veike  
       325 天前
    追求优雅是个误区,应该追求语义化、别人看得懂,简单的代码,追求容易维护扩展的系统设计。
    代码写的再好,想挑毛病还能挑不出毛病?要挑毛病,linus 来了都要给我叫爹
    QlanQ
        44
    QlanQ  
       325 天前
    @nikola11
    @tool2d 冗余的意思是,例如把用户的昵称带上了,
    问前面设计的人说,昵称不能改
    现在产品说要加改的功能,改个昵称,至少要改 7 张表,这也算是正常场景?

    冗余数据去解决查询问题,我认为不合理,冗余 在我看来就没有优点
    tool2d
        45
    tool2d  
       325 天前
    @QlanQ 老旧代码没人想去维护,是 7 张表最主要的原因。

    twitter 上老外有一定的时间可以给你整理旧代码,国内很少见,项目周期很紧张。大家都只加新代码,不删旧代码。

    当项目换了几波人接手后,加一个新功能别说 7 张表,改动 10 张表我都不会觉得奇怪。
    buffzty
        46
    buffzty  
       325 天前
    第一行不是严格模式,没有类型,代码冗余 实现方式太 low
    比如第一个直接一行就够 ltrim(ltrim('0x1234','0x'),'0X')
    多次使用的魔数没有定义为常量
    重复实现内置函数,dechex, hexdec
    变量命名不符合语义,比如$value,跟写$a 没啥区别
    差评
    locoz
        47
    locoz  
       325 天前
    @tool2d #42 事实上结果恰恰相反,让 AI 写前端很难,因为前端太抽象了,描述做不到那么准确,反而是写纯后端类的代码很好写。你这其实单纯是 GPT3.5 的问题而已,不仅可注意的 Token 数量少,本身逻辑能力也弱,换 GPT4 就解决了。
    Shosuke
        48
    Shosuke  
       325 天前
    渐渐对写代码失去兴趣,也慢慢不知道自己要做什么。
    brader
        49
    brader  
    OP
       325 天前
    @buffzty 写的 low 不 low 就随你说了,但是不像你挑别人毛病,自己给出的方案还是 bug ,你用 dechex 把 1000000000000000000000 转化成十六进制给我看看
    QlanQ
        50
    QlanQ  
       325 天前
    @tool2d 去年新开的坑,我觉得这样设计,实在是有问题
    如果说以前 通过冗余是为了避免过度链表
    但是一个新项目还这样设计,我觉得就是设计上的问题
    brader
        51
    brader  
    OP
       325 天前
    @QlanQ 不管新旧项目,都离不开发展历史问题,只能说你遇到的项目还不够多吧,有时候某个模块当初的开发者设计的挺好的,但是顶不住需求变更。比如常见的 用户表、用户信息扩展表、供应商用户表、地推员 等等等等,开始是挺独立的业务,但是后来某天产品要求做个列表,产品为了方便,这个列表的展示信息,居然横跨 7 个表,你能选择的无非就是上面讨论的两个方案,要么冗余出来,要么查多表
    cedoo22
        52
    cedoo22  
       325 天前
    每个人的优雅方式不一样, 当一个项目经过 N 个人的手之后, 你会发现跟荒地上的 杂草一样。
    所以。。。能用 if else 解决的 就不要优雅的用设计模式。
    fyxtc
        53
    fyxtc  
       325 天前
    这个帖子,贴了代码之后就很容易跑偏,本来是随想贴,变成了指点贴
    brader
        54
    brader  
    OP
       325 天前
    @fyxtc 我也很无奈,现在的我,也不是想贴段代码比个高低,争个第一了,没有意义了啊,哎
    yhm2046
        55
    yhm2046  
       325 天前
    先把汉字打对再说,是“令你感到骄傲”。
    另外有本书叫《重构》,有个工具叫 chatgpt
    QlanQ
        56
    QlanQ  
       325 天前
    @brader 项目也做了不少,接手的也很多,没见过,明知会改,还要用来冗余的,而且只是为了查询所以加了冗余的,
    丝毫不考虑 修改的时候怎么处理么?

    那么多数据冗余在一张表里面,查询效率也不会高吧,

    两种方案,实在是看不出来 冗余的方案,有什么优势或者说好处
    flyqie
        57
    flyqie  
       325 天前
    吃饭的项目不要想优雅,能跑就行。

    自己业余兴趣搞的项目,最好还是追求下。
    onehao28
        58
    onehao28  
       325 天前
    Rache1
        59
    Rache1  
       325 天前
    @buffzty trim 系类函数的第二个参数是按照字符进行处理的,你这个还可以简化成 ltrim('0x1234', '0xX'),但是这样是会存在问题的。

    比如 ltrim('0x0f', '0xX'),的输出结果将会是 f 而不是预期 0f
    Rache1
        60
    Rache1  
       325 天前
    @buffzty 不过可以改为:ltrim(ltrim('0x0f','0'),'xX')
    baijiahei
        61
    baijiahei  
       325 天前
    用 go 撸 就不用自己写这些了
    brader
        62
    brader  
    OP
       325 天前   ❤️ 1
    @QlanQ 没有明知会改这回事,以后出什么需求谁都不知道。冗余数据到某种表,只是挑几个字段,不存在那么多数据问题,而且按你认知,单独冗余出某张表查询效率不高的话,连表查询效率只会更低下。
    既然说到连表了,冗余的好处就是只查一张表,你连表的话,查询慢,特别是后台,基本上产品会要你很多字段可以检索,检索字段多的时候,连多表是个灾难,特别是存在模糊检索字段,无法用上索引的时候
    brader
        63
    brader  
    OP
       325 天前
    @baijiahei 抄官方的是吧
    Rache1
        64
    Rache1  
       325 天前
    @Rache1 或者考虑使用正则或许更简单、直观些 preg_replace('/^0[xX]/', '', $hexNumber)
    QlanQ
        65
    QlanQ  
       325 天前
    @brader 名称这类不固定的,肯定会有修改的需求呀
    不一定要链表呀,不都是 单独 用 in 么,然后组合数据
    Bazingal
        66
    Bazingal  
       325 天前
    别光 show 你的屎山代码啊,show 出你的优雅和兼容并存的代码让我们学习一下
    brader
        67
    brader  
    OP
       325 天前
    @QlanQ 单独用 in 有检索查不了吧,举个例子,要查 abc 三个表,abc 三表都有检索条件,并且要分页和排序,怎么查?
    brader
        68
    brader  
    OP
       325 天前
    @Bazingal 不需要给你学习,你比我厉害
    CodingNaux
        69
    CodingNaux  
       325 天前
    到目前为止,我没写出任何骄傲的代码,都是一次性的,也没写出啥库给别人用过
    veike
        70
    veike  
       325 天前
    @QlanQ 一般 log 类的数据都需要一些冗余字段
    retrocode
        71
    retrocode  
       325 天前
    《如何优雅的让一帮程序员免费帮自己代码挑毛病》
    smirkcat
        72
    smirkcat  
       325 天前
    我从事区块链这么久,第一次看到用 java 写的,我基本都用 golang 和 js
    smirkcat
        73
    smirkcat  
       325 天前
    @smirkcat 说错了 看到 php 写的
    brader
        74
    brader  
    OP
       325 天前
    @smirkcat 嗯,写链的话,是 go java c c++比较多,区块链里 php 的话一般是处理业务层的东西
    QlanQ
        75
    QlanQ  
       325 天前
    @brader 再有搜索条件的时候,会使用到链表查询,但是只查询主表的数据,然后在组合 其他表的数据
    QlanQ
        76
    QlanQ  
       325 天前
    @veike 是的,也就是 log 里面,比如操作日志,防止后续改名,会稍微冗余一下
    baijiahei
        77
    baijiahei  
       325 天前
    @brader 现成的 直接用 用不到抄
    mxT52CRuqR6o5
        78
    mxT52CRuqR6o5  
       325 天前
    没有激情就用 gpt/copilot 嘛
    brader
        79
    brader  
    OP
       325 天前
    @QlanQ 所以说你还是绕回去了连表的问题啦,而且后台查询很灵活的,你预测不到使用者会用到哪些检索条件,你当然可以写一堆判断来动态组合缓解一些压力,但最终也避免不了有连表的情况,这个表设计模式,问题就在于这里
    huangzongzhuan
        80
    huangzongzhuan  
       325 天前
    你就说能不能用嘛
    kaneg
        81
    kaneg  
       325 天前 via iPhone
    代码是给机器执行的和给人看的,优雅不优雅机器不知道,但人知道。就像乔布斯说的,看不见的机箱内部也要做的好看。
    wupher
        82
    wupher  
       325 天前
    休息一下,或者尝试换个岗位,比如前端试下后端,后端去学下前端甚至 App 。
    soulomoon
        83
    soulomoon  
       325 天前
    换一门语言写吧,例如 haskell
    SilencerL
        84
    SilencerL  
       325 天前
    当我曾经写出引以为豪的优雅代码,但是 Leader 说:「写清楚点,要不别人看不懂」后,我也妥协了,我也开始写:

    var foo = "";
    if ( a == 1 ) {
    foo = "xx";
    }
    if ( a == 2 ) {
    foo = "yy";
    }

    这样的大白话代码,写多了感觉也还行,至少傻子都能看得懂
    wxf666
        85
    wxf666  
       325 天前
    @locoz #47 能让 AI 帮写一个,能识别视频站的 澳 门 威 尼 斯 人 广告,并自动跳过的代码吗?
    bestcondition
        86
    bestcondition  
       325 天前 via Android
    @SilencerL 写个 map 别人看不懂?{1:"xx", 2:"yy"}
    SilencerL
        87
    SilencerL  
       324 天前
    @bestcondition #86
    没得,只是举个大白话代码的例子
    jumpsky
        88
    jumpsky  
       324 天前
    能跑不出 BUG 没有漏洞就行,就算冗余现在电脑硬件足够运行。
    locoz
        89
    locoz  
       324 天前
    @wxf666 #84 能,只要你思路清晰地告诉它要怎么做就行。
    justin2018
        90
    justin2018  
       324 天前
    没激情了

    看得懂 能跑 基本上没有 Bug 就行
    binge921
        91
    binge921  
       324 天前
    根本没激情了 我现在都是 自己乱写一通 然后让 ai 帮我优化下 拉倒了
    mango88
        92
    mango88  
       324 天前
    能跑就行
    wxf666
        93
    wxf666  
       324 天前 via Android
    @locoz 我的朴素思路就是想跳过时不时插播的 澳 门 威 尼 斯 人 广告。

    你能演示一下,如何让这个思路演变成,足以让它写出完美达到目的的代码?
    locoz
        94
    locoz  
       324 天前
    @wxf666 #92 你需要能提供出具体的思路给 AI ,至少要包含完整的处理流程。目前即使是 GPT4 ,细化能力也还是不够,你让它自己思考,它会遗漏细节。所以单凭一句“跳过时不时插播的 澳 门 威 尼 斯 人 广告”这种描述,在具有一定复杂度且并非常见任务的情况下,是写不出可用代码的。

    你需要先自己思考出处理流程,比如是先通过语音识别检测有没有提到澳门威尼斯人,还是通过图像识别检测是不是广告,或者是什么其他方式,然后想具体怎么做,是找找有没有现成的库/服务,还是说是自己训练一个图像分类模型等等;然后就是实现检测了之后又怎么跳过、要做到什么样的跳过效果,比如直接检测视频文件内是广告的片段,并直接得到准确的时间段在播放时自动进行跳过,那么视频文件怎么获取、检测过程应该怎么做等等。这些做法、思路层面的细节都是需要你自己思考后描述给 AI 的。

    如果你有研究过一些让 AI 全自动写代码的项目的话,你会发现其实基本都涉及到一个 Q&A 环节,让 AI 通过提问的方式进一步细化需求,得到更准确的思路,为的就是避免一句话描述让 AI 做不出可用的东西。

    而在不做 DEMO 级且非常见任务的情况下,就那么几步的 Q&A 是远远不够的,一个完整项目/模块的实现中涉及到的细节非常多,都需要具体设计。说白了本质上就是把产品经理/架构师之类职位干活的产出,用文字描述的形式告诉 AI ,AI 完成具体的代码编写。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1008 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 19:41 · PVG 03:41 · LAX 12:41 · JFK 15:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.