1
coderxy 2023-07-07 10:42:13 +08:00
我也渐渐失去了当年对代码优雅高效的追求了。 。。
|
2
NessajCN 2023-07-07 10:48:06 +08:00 8
天哪你管这叫优雅吗....
你知不知道,数字,或者叫 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 3
优雅的代码有一个很重要的前提是“优雅的需求”
|
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
oneisall8955 2023-07-07 11:29:19 +08:00 via Android
能看懂就是好代码
|
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 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 么 |
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 1
又不是不能用?
|
33
tcpdump 2023-07-07 13:48:25 +08:00 1
老板:当年他们努力工作给我买的宝马 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
janus77 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
cedoo22 2023-07-07 15:54:54 +08:00
每个人的优雅方式不一样, 当一个项目经过 N 个人的手之后, 你会发现跟荒地上的 杂草一样。
所以。。。能用 if else 解决的 就不要优雅的用设计模式。 |
53
fyxtc 2023-07-07 15:58:14 +08:00
这个帖子,贴了代码之后就很容易跑偏,本来是随想贴,变成了指点贴
|
55
yhm2046 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
retrocode 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 完成具体的代码编写。 |