• 请不要在回答技术问题时复制粘贴 AI 生成的内容
brader
V2EX  ›  程序员

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

  •  
  •   brader · Jul 7, 2023 · 9529 views
    This topic created in 1224 days ago, the information mentioned may be changed or developed.
    你还记得那些年你写的另你感到骄傲的代码吗?

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

    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
    QlanQ
    Jul 7, 2023
    18
    我还没有,最近接手的代码,让我 无从下手

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    而在不做 DEMO 级且非常见任务的情况下,就那么几步的 Q&A 是远远不够的,一个完整项目/模块的实现中涉及到的细节非常多,都需要具体设计。说白了本质上就是把产品经理/架构师之类职位干活的产出,用文字描述的形式告诉 AI ,AI 完成具体的代码编写。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1504 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 97ms · UTC 16:40 · PVG 00:40 · LAX 08:40 · JFK 11:40
    ♥ Do have faith in what you're doing.