1 coderxy 2023-07-07 10:42:13 +08:00 我也渐渐失去了当年对代码优雅高效的追求了。 。。 |
2 NessajCN 2023-07-07 10:48:06 +08:00 ![]() 天哪你管这叫优雅吗.... 你知不知道,数字,或者叫 number, int 类型的变量,在计算机中本身就没有所谓的「进制」之分的? 如果一个变量是 int,你给他赋值 0x10, 或 16 或 0b10000, 都是完全等价的 只有打印的时候为了让你这个人类看懂才需要表示成 10 进制或 16 进制? |
3 eilisonLiang 2023-07-07 10:49:59 +08:00 优雅的时候,效率有时候就低了,如果只要效率,那就要放弃优雅 |
4 brader OP @NessajCN 这个工具类有具体实用场景的,做数字币的接触多了就知道了,不纠结具体业务了,我只是缅怀以前对代码的激情,当年水平有限,以现在的眼光去看,可能几年前刚入行写的代码,是有瑕疵的,但是当时我是用心去写的 |
5 brader OP @eilisonLiang 是啊,我现在的状态,对优雅的态度,总结起来就是:时间太赶算了、能跑就行算了 |
6 idealhs 2023-07-07 11:06:17 +08:00 没看出来这个进制转换在倒腾啥 |
![]() | 7 j3llypunk777 2023-07-07 11:09:16 +08:00 ![]() 优雅的代码有一个很重要的前提是“优雅的需求” |
![]() | 8 xinyewdz 2023-07-07 11:11:54 +08:00 哈哈,前两年还在写优雅代码,喷同事垃圾代码。去年开始,我就开始堆山了,能跑就行。 |
![]() | 9 pkoukk 2023-07-07 11:15:10 +08:00 copilot 出来之后我又重新开始写简洁干净清楚的代码了。因为我需要让 AI 看得懂,他看得懂,我需要写的东西就少 |
12 eilisonLiang 2023-07-07 11:22:05 +08:00 @brader 估计要看结果导向吧,有的领导要求能跑就行,有的是要求质量,不同情况写不同的代码,优雅的代码,bug 会少一些,就是要折腾一下 |
![]() | 13 itechify PRO 能看懂就是好代码 |
![]() | 14 nikola11 2023-07-07 11:30:01 +08:00 时间有限就顾不上优雅 |
15 zjj19950716 2023-07-07 11:30:41 +08:00 一头扎进了大染缸 |
![]() | 16 iSNN 2023-07-07 11:31:52 +08:00 @eilisonLiang 有的领导...有的领导...其实只有一种领导。开发快、质量高、可维护、BUG 少、稳定性好 |
17 Rache1 2023-07-07 11:42:53 +08:00 ![]() 如果要说你列出的代码是优雅的正例的话,还真有些问题。 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 么 |
18 QlanQ 2023-07-07 11:44:29 +08:00 我还没有,最近接手的代码,让我 无从下手 比起代码,数据库设计的烂才是最难受的 去年的项目用的 yii 1.1 + layerui ,还说是自研 借楼问下, @coderxy @NessajCN @eilisonLiang @brader @pkoukk 数据库关联表,冗余数据才是正常的吗? 最近看到好几个项目这样做,我都怀疑自己是不是错了? |
![]() | 19 azui999 2023-07-07 11:45:36 +08:00 能跑就行,很多东西,我也把握不了 |
![]() | 20 bybyte 2023-07-07 11:47:50 +08:00 能破就行永远在第一 |
![]() | 22 sslyxhz 2023-07-07 11:54:44 +08:00 via Android 罗永浩. jpg |
![]() | 23 ElvY 2023-07-07 11:57:44 +08:00 老鸟最应该做的是面向文档编程,代码写的和文档一样。 |
24 brader OP @Rache1 兄弟,有些代码,离开业务场景空想是想不明白的,这个代码我四五年前写的了,模糊记得一些,你疑问的点大概和你说下吧: 1 、1000000000000000000 和 0x 是业务需要,它是不会也不可能变化的,所以我写死了专用值,也不存在我需要添加除 0x 前缀外的场景,这个是专用于数字币计算的。 2 、我不知道你所说的 PHP 自带的的十进制和十六进制转化是否指的是 dechex 这个函数,如果是的话,这个函数是用不了的,数字币都是高精度计算,数字位数是 n + 18 位,用自带函数计算是超出上限的。 3 、我直接拼 0x 是因为我很确定我上一步的值是不存在 0x 的,无需重复调用兼容性的方法增加判断,当然,你要说非要调用比较优雅,也不是不行,这个见仁见智,我不反驳,我当年怎么想的,我也记不起来了。 4 、同 1 解释,因为只专注于+0x 5 、此工具函数比较简单,当时为什么没有单独提出来,我已经记不清了。 6 、是的,可能当时忘记了吧。 |
25 brader OP 适量的冗余是正常的,有时候是为了查询方便,而且对于没有要求前后数据变更强一致性的数据,也无需花精力去同步。 比如之前我做过一个客服聊天记录表,我就在里面冗余了用户昵称,方便查询,用户改昵称,我也不会同步过来的,已经问过产品,说无所谓 |
26 brader OP @Rache1 奥,对了,第 1 点 bcdiv 的 18 这个疑问忘记告诉你了,这个是因为数字币 eth 中, 单位 wei 转 eth ,存在小数,精度需要保存到小数点后 18 位 |
28 caixiangyu17 2023-07-07 12:52:20 +08:00 代码优雅不优雅不是程序员说了算。你在屎山里面,咋也写不出来好东西的。 想要好代码,需要团队的规范,大家都高要求,你自己反而就没什么负担。 git commit comment 格式不对,测试不过,coverage 不够,linting 不过,有 Vulnerabilities 等等,都会在各个环节卡住你的代码。要么不能 push ,要么不能 merge PR 。这样每个人写的代码都不得不这么做,质量就上来了。 |
29 TedS 2023-07-07 12:58:48 +08:00 优雅就是个伪命题,在保证质量前提下,让团队合作更轻松,才是好代码。 |
30 Rache1 2023-07-07 13:29:45 +08:00 @brader 对于魔法字符串、魔法数字这些,如果你做不到在小单元内使用,最好的方式就是提成常量,并加以注释。 实际上你这个 add0x 里面本就不应该包含 remove0x 的逻辑,你应该在外部就确定是否要 rmeove0x ,亦或者单独提一个方法 |
31 Leviathann 2023-07-07 13:39:43 +08:00 优雅是虚的,代数才是真的 |
![]() | 32 zhutai0201 2023-07-07 13:46:09 +08:00 ![]() 又不是不能用? |
![]() | 33 tcpdump 2023-07-07 13:48:25 +08:00 ![]() 老板:当年他们努力工作给我买的宝马 5 系,现在提了库里南,不过再也没有了当年的激情。 |
34 Seulgi 2023-07-07 14:00:47 +08:00 这两年疫情影响,一个是跳槽不会那么随意,一个是工资涨幅没有那么大之后,确实是不管是学习/代码/态度都有所躺平。 |
![]() | 35 locoz 2023-07-07 14:05:26 +08:00 via Android 再也没有了当年的激情,去写出代码,现在都是能让 AI 解决的绝对不自己动手… |
![]() | 36 Pastsong 2023-07-07 14:15:04 +08:00 你觉得优雅别人接手的人觉得是屎山 优雅就是件感动自己的事情,没什么卵用 |
![]() | 39 tool2d 2023-07-07 14:22:40 +08:00 记得早年 twitter 上一项活动,比谁删历史旧代码最多最快。 我倒是觉得,写代码不仅是为了优雅,而是为了便于以后维护和复用。 而好维护代码是准则之一,就是子模块越简单越好,代码量越少越好。 |
![]() | 40 locoz 2023-07-07 14:29:16 +08:00 @tool2d #38 不至于,在描述清晰且模型能力足够( GPT4 )的情况下,输出的代码基本都是可用的,极少出现 BUG 。最多也就是因为 Token 过多,导致 AI 忘记了某一条或某一些要求(根据长度而定),需要检查后重新要求补充。 |
![]() | 41 rb6221 2023-07-07 14:29:34 +08:00 优雅是自己的事。。。。一个人觉得优雅,别人接手的时候可能会觉得这写的什么玩意儿。还有三年前觉得优雅,三年后感觉一坨屎的情况。 最佳实践才是王道 如果做不到最佳实践,那就还是那句话,又不是不能用.jpg |
![]() | 43 veike 2023-07-07 14:40:19 +08:00 追求优雅是个误区,应该追求语义化、别人看得懂,简单的代码,追求容易维护扩展的系统设计。 代码写的再好,想挑毛病还能挑不出毛病?要挑毛病,linus 来了都要给我叫爹 |
44 QlanQ 2023-07-07 15:07:28 +08:00 |
![]() | 45 tool2d 2023-07-07 15:15:37 +08:00 @QlanQ 老旧代码没人想去维护,是 7 张表最主要的原因。 twitter 上老外有一定的时间可以给你整理旧代码,国内很少见,项目周期很紧张。大家都只加新代码,不删旧代码。 当项目换了几波人接手后,加一个新功能别说 7 张表,改动 10 张表我都不会觉得奇怪。 |
46 buffzty 2023-07-07 15:17:42 +08:00 第一行不是严格模式,没有类型,代码冗余 实现方式太 low 比如第一个直接一行就够 ltrim(ltrim('0x1234','0x'),'0X') 多次使用的魔数没有定义为常量 重复实现内置函数,dechex, hexdec 变量命名不符合语义,比如$value,跟写$a 没啥区别 差评 |
![]() | 47 locoz 2023-07-07 15:18:12 +08:00 @tool2d #42 事实上结果恰恰相反,让 AI 写前端很难,因为前端太抽象了,描述做不到那么准确,反而是写纯后端类的代码很好写。你这其实单纯是 GPT3.5 的问题而已,不仅可注意的 Token 数量少,本身逻辑能力也弱,换 GPT4 就解决了。 |
![]() | 48 Shosuke 2023-07-07 15:25:21 +08:00 渐渐对写代码失去兴趣,也慢慢不知道自己要做什么。 |
49 brader OP @buffzty 写的 low 不 low 就随你说了,但是不像你挑别人毛病,自己给出的方案还是 bug ,你用 dechex 把 1000000000000000000000 转化成十六进制给我看看 |
50 QlanQ 2023-07-07 15:45:18 +08:00 |
51 brader OP @QlanQ 不管新旧项目,都离不开发展历史问题,只能说你遇到的项目还不够多吧,有时候某个模块当初的开发者设计的挺好的,但是顶不住需求变更。比如常见的 用户表、用户信息扩展表、供应商用户表、地推员 等等等等,开始是挺独立的业务,但是后来某天产品要求做个列表,产品为了方便,这个列表的展示信息,居然横跨 7 个表,你能选择的无非就是上面讨论的两个方案,要么冗余出来,要么查多表 |
![]() | 52 dr1q65MfKFKHnJr6 2023-07-07 15:54:54 +08:00 每个人的优雅方式不一样, 当一个项目经过 N 个人的手之后, 你会发现跟荒地上的 杂草一样。 所以。。。能用 if else 解决的 就不要优雅的用设计模式。 |
![]() | 53 hikarugo 2023-07-07 15:58:14 +08:00 这个帖子,贴了代码之后就很容易跑偏,本来是随想贴,变成了指点贴 |
![]() | 55 pq2Q3XZidsTF906J 2023-07-07 16:02:15 +08:00 先把汉字打对再说,是“令你感到骄傲”。 另外有本书叫《重构》,有个工具叫 chatgpt |
56 QlanQ 2023-07-07 16:03:55 +08:00 @brader 项目也做了不少,接手的也很多,没见过,明知会改,还要用来冗余的,而且只是为了查询所以加了冗余的, 丝毫不考虑 修改的时候怎么处理么? 那么多数据冗余在一张表里面,查询效率也不会高吧, 两种方案,实在是看不出来 冗余的方案,有什么优势或者说好处 |
![]() | 57 flyqie 2023-07-07 16:04:06 +08:00 吃饭的项目不要想优雅,能跑就行。 自己业余兴趣搞的项目,最好还是追求下。 |
59 Rache1 2023-07-07 16:10:36 +08:00 @buffzty trim 系类函数的第二个参数是按照字符进行处理的,你这个还可以简化成 ltrim('0x1234', '0xX'),但是这样是会存在问题的。 比如 ltrim('0x0f', '0xX'),的输出结果将会是 f 而不是预期 0f |
![]() | 61 baijiahei 2023-07-07 16:19:47 +08:00 用 go 撸 就不用自己写这些了 |
62 brader OP ![]() @QlanQ 没有明知会改这回事,以后出什么需求谁都不知道。冗余数据到某种表,只是挑几个字段,不存在那么多数据问题,而且按你认知,单独冗余出某张表查询效率不高的话,连表查询效率只会更低下。 既然说到连表了,冗余的好处就是只查一张表,你连表的话,查询慢,特别是后台,基本上产品会要你很多字段可以检索,检索字段多的时候,连多表是个灾难,特别是存在模糊检索字段,无法用上索引的时候 |
64 Rache1 2023-07-07 16:25:46 +08:00 @Rache1 或者考虑使用正则或许更简单、直观些 preg_replace('/^0[xX]/', '', $hexNumber) |
66 Bazingal 2023-07-07 16:38:27 +08:00 别光 show 你的屎山代码啊,show 出你的优雅和兼容并存的代码让我们学习一下 |
67 brader OP @QlanQ 单独用 in 有检索查不了吧,举个例子,要查 abc 三个表,abc 三表都有检索条件,并且要分页和排序,怎么查? |
69 CodingNaux 2023-07-07 16:47:13 +08:00 到目前为止,我没写出任何骄傲的代码,都是一次性的,也没写出啥库给别人用过 |
![]() | 71 cvooc 2023-07-07 16:57:57 +08:00 《如何优雅的让一帮程序员免费帮自己代码挑毛病》 |
72 smirkcat 2023-07-07 16:59:35 +08:00 我从事区块链这么久,第一次看到用 java 写的,我基本都用 golang 和 js |
78 mxT52CRuqR6o5 2023-07-07 17:53:38 +08:00 没有激情就用 gpt/copilot 嘛 |
79 brader OP @QlanQ 所以说你还是绕回去了连表的问题啦,而且后台查询很灵活的,你预测不到使用者会用到哪些检索条件,你当然可以写一堆判断来动态组合缓解一些压力,但最终也避免不了有连表的情况,这个表设计模式,问题就在于这里 |
80 o562dsRcFqYl375i 2023-07-07 18:22:51 +08:00 你就说能不能用嘛 |
81 kaneg 2023-07-07 21:27:07 +08:00 via iPhone 代码是给机器执行的和给人看的,优雅不优雅机器不知道,但人知道。就像乔布斯说的,看不见的机箱内部也要做的好看。 |
![]() | 82 wupher 2023-07-08 00:13:47 +08:00 休息一下,或者尝试换个岗位,比如前端试下后端,后端去学下前端甚至 App 。 |
![]() | 83 soulomoon 2023-07-08 01:30:39 +08:00 换一门语言写吧,例如 haskell |
![]() | 84 SilencerL 2023-07-08 01:34:38 +08:00 当我曾经写出引以为豪的优雅代码,但是 Leader 说:「写清楚点,要不别人看不懂」后,我也妥协了,我也开始写: var foo = ""; if ( a == 1 ) { foo = "xx"; } if ( a == 2 ) { foo = "yy"; } 这样的大白话代码,写多了感觉也还行,至少傻子都能看得懂 |
86 bestcondition 2023-07-08 02:40:01 +08:00 via Android @SilencerL 写个 map 别人看不懂?{1:"xx", 2:"yy"} |
![]() | 87 SilencerL 2023-07-08 05:37:16 +08:00 @bestcondition #86 没得,只是举个大白话代码的例子 |
88 jumpsky 2023-07-08 09:46:12 +08:00 能跑不出 BUG 没有漏洞就行,就算冗余现在电脑硬件足够运行。 |
![]() | 90 justin2018 2023-07-08 10:46:45 +08:00 没激情了 看得懂 能跑 基本上没有 Bug 就行 |
![]() | 91 binge921 2023-07-08 13:50:30 +08:00 根本没激情了 我现在都是 自己乱写一通 然后让 ai 帮我优化下 拉倒了 |
![]() | 92 mango88 2023-07-08 14:04:28 +08:00 能跑就行 |
93 wxf666 2023-07-08 14:40:14 +08:00 via Android |
![]() | 94 locoz 2023-07-08 17:01:42 +08:00 @wxf666 #92 你需要能提供出具体的思路给 AI ,至少要包含完整的处理流程。目前即使是 GPT4 ,细化能力也还是不够,你让它自己思考,它会遗漏细节。所以单凭一句“跳过时不时插播的 澳 门 威 尼 斯 人 广告”这种描述,在具有一定复杂度且并非常见任务的情况下,是写不出可用代码的。 你需要先自己思考出处理流程,比如是先通过语音识别检测有没有提到澳门威尼斯人,还是通过图像识别检测是不是广告,或者是什么其他方式,然后想具体怎么做,是找找有没有现成的库/服务,还是说是自己训练一个图像分类模型等等;然后就是实现检测了之后又怎么跳过、要做到什么样的跳过效果,比如直接检测视频文件内是广告的片段,并直接得到准确的时间段在播放时自动进行跳过,那么视频文件怎么获取、检测过程应该怎么做等等。这些做法、思路层面的细节都是需要你自己思考后描述给 AI 的。 如果你有研究过一些让 AI 全自动写代码的项目的话,你会发现其实基本都涉及到一个 Q&A 环节,让 AI 通过提问的方式进一步细化需求,得到更准确的思路,为的就是避免一句话描述让 AI 做不出可用的东西。 而在不做 DEMO 级且非常见任务的情况下,就那么几步的 Q&A 是远远不够的,一个完整项目/模块的实现中涉及到的细节非常多,都需要具体设计。说白了本质上就是把产品经理/架构师之类职位干活的产出,用文字描述的形式告诉 AI ,AI 完成具体的代码编写。 |