101
ffffb 2023-11-23 18:25:59 +08:00
什么时候你不会想着重构你就成熟了
|
102
moon8sky 2023-11-23 19:06:27 +08:00 29
想了很久,还是回一个
我可能就是那个 mentor 吧,刚看到这个帖子的时候心里一震,毕竟你描述的代码和我刚 review 的新同事的代码,几乎一模一样(我们做前端, 写的 JS ),当然还是有一些出入: 1.他不是名校(非 985/211 ,某建筑大学,机械电子专业) 2.非应届生( 22 毕业,一年工作经验),当然,实际技术水平=0 基础应届生 3.我也不是大厂出来的 说实话,我很不愿意相信这是他发的,因为对他的培养,花了比想象中多得多的时间。 1.以一个 1 年经验的身份招进来,结果几乎是 0 基础,原来我给我领导的计划是 1 个月可以独立负责项目开发,现在这个时间需要延长到 3 个月,要重新写培训计划,大概率要被叼 2.面试的笔试大概率作弊,计算机网络和操作系统相关的题,他连端口和 HTTP 怎么工作都不知道,然而他考了满分;实际工作中写个 mqtt 服务器不工作原理,npm dev 不知道端口 3.试用期多次想直接辞退他,但是想着人是自己招进来的,应该负责到底,尽自己能力去带,当然,最后提高的怎么样,还是看自己 4.团队不大( 6 个人),他确实是个小透明,因为正式项目几乎帮不上什么忙,做一些简单开发任务,还需要别人花时间来帮他解决问题,对团队几乎没有贡献 5.让他工作时间不要用手机看了视频学习,别的同事看到了影响不好,可以用电脑看,他说公司电脑是 win11 ,win11 不支持蓝牙,没法用蓝牙耳机的时候,我真想抽自己两巴掌,自己怎么面试的 6.手把手教了 linux 上怎么部署前端项目,过两天来问,还是不知道 ls 、tar 命令是干啥的,只知道要这么操作,哎~ 最后,我只想说 1.非科班转码没问题,我也是转码的,但是请敬畏技术,你是软件工程师,不是码农 2.留着他,只是希望给他一个机会,现在市场行情不好,希望可以好好提高自己,并不是团队缺你不可 3.经典书籍要看,B 站的尚硅谷视频给不了你持续的能力提升,拉不开和别人的差距 加油吧,曾经我也以为自己很牛逼,所有需求我都能实现,但是自从和一个大专大三学生做开源项目,被嫌弃代码烂;以及给一个 P8 开源项目贡献代码,20 行代码被退回来 4 次。才知道自己的渺小 阻止自己进步的大概不是你的专业,公司,项目内容,而是自己的傲慢。 不要目空一切,我们永远也学不会我们不知道的知识,我想这大概也是之前他学习任务进度如此慢的原因 |
103
soupu626 2023-11-23 19:07:37 +08:00
更喜欢 mentor +1 ,减少缩进层级,减少 if 判断次数,功能分离,好看好读
另外代码看不懂直接 comment 有什么问题么,CR 不就是用来讨论的么 工程中不需要简洁代码,可读性要求更高,我现在看我当初写的 OI/ACM 代码完全读不下去。 |
104
chesha1 2023-11-23 19:31:33 +08:00
其实问题不是很大,如果你编译器优化开高一点,两种写法编译出来可能完全一样
就算需要多判断一下,CPU 跑得很快的,一般业务的瓶颈都不会在运算上,在网络上和在内存上可能性更大 |
105
0xLittleFi 2023-11-23 20:17:20 +08:00
首先 mentor 得代码好,
企业级的代码,逻辑清晰是第一点,毕竟是要长期维护 如果 op 觉得他不行,可以申请换 mentor ,mentor 不会觉得你菜,重要的是会学,不理解就刨根问底 |
106
dito 2023-11-23 20:23:10 +08:00 via Android
我只想说 special 的反义词不是 normal ,别给我们名校抹黑。
|
107
StephenHe 2023-11-23 20:23:29 +08:00
再好的代码,迭代 3-5 个版本就变成一坨屎了
|
108
hahadaxigua834 2023-11-23 20:36:42 +08:00
这种级别的东西编译器前端估计就能给你优化了,有没有编译器方向的大佬有空指点下。
风格问题的话跟着老员工写就完事了,纠结这种问题纯属工作量不饱和 |
109
nagisaushio 2023-11-23 20:52:29 +08:00 via Android
@moon8sky 看起来楼主是写 go 或有 go 背景的,可能有些差别
|
110
lguan 2023-11-23 21:03:55 +08:00 1
忘记自己是名校出来的,这一文不值,也忘记 mentor 之前在大厂做过,可能有经验,也未必是对的,但在一个团队,大家有共识很重要,特别是涉及到规范以后,这玩意儿又往往没有对错之分,碰到这种分歧的,如果你觉得你是对的,那么就尝试说服别人,如果做不到,那就按照团队定的来,PS ,例子里面,我自己会偏向用 mentor 的方式,但你上面的方式也有好处,对于将来维护的时候,如果需要特殊处理的要从最后一个改到中间的时候,你的代码改起来会方便一些,所以要是我如果一定要争论这点的话,我会看看这部分的代码将来是不是有修改的可能,如果没有,我自己是会才去下面的方法
|
111
bhy 2023-11-23 21:04:00 +08:00
mentor 的代码是不是不对? array 为空的时候会出错?
|
112
kkwa56188 2023-11-23 21:10:19 +08:00
mentor 的逻辑好一些:
现在只需要 特殊处理 数组里最后一个元素, 一个 for 循环里就有 1 个 if. 数组有十万个元素就 十万次 if. 如果要分别特殊处理数组里 最后 10 个元素, 一个 for 循环里就有 10 个 if. 数组十万个元素 就是 (十万乘以 10) 次 if. |
113
laminux29 2023-11-23 21:20:11 +08:00 3
你的 Mentor 还是欠点火候,任何写法都有优劣,你的 Mentor 没给你解释,这就是他水平不到位的原因。
你喜欢的 for in ,优点是简洁,效率高。缺点是可读性差、可调试性差。所以到底要用 for in 还是 for loop ,完全要看场景,看数据量,看工程规模,不能一概而论。 而且 你 Mentor 的 for loop 里 len(xxx) 的写法,如果 xxx 是个会动态改变长度的链表,那么 len( xxx )很有可能会被劣化为 get length 的计算,每次循环要算一次。 |
114
Features 2023-11-23 21:33:57 +08:00
厂里这么闲的吗? 效益不错吧
|
115
rxswift 2023-11-23 21:48:05 +08:00
go 语言?
|
116
zhdi 2023-11-23 22:40:27 +08:00
晚上玩回来写了个测试,c 写的,array 大小 409600 ,重复测试 100 次,if 写循环里时间是平均 2500us ,if 写外面是 1500us ,没有开-O 优化,因为懒得给里面填内容,不填东西开-O 会直接 ret
|
117
lesismal 2023-11-23 22:42:55 +08:00
目测:最近 v2 流行自爆🧐
|
119
netabare 2023-11-23 23:08:19 +08:00 via iPhone 1
你给的例子明显是你 mentor 的更好啊,最后一个要特殊对待,mentor 的一次改完,你的例子先修改一次再回过头改一次。
万一你的第一部分代码有什么特殊的逻辑呢?那么本不该被调用的事情就会发生。 |
120
LindsayZhou 2023-11-23 23:35:24 +08:00
赞同 #113 ,完全看场景。
刚写了一个简单的示例,翻了一下二进制代码。 简单的循环编译器优化的时候会把判断拿到循环外面去。不会像楼上一些人说的判断很多遍。 https://p.koi.moe/kash https://p.koi.moe/qhzX |
121
LindsayZhou 2023-11-23 23:47:32 +08:00
续 #120
em... 好像又看走眼了,判断还是在,两种循环的位置有点不一样。 只是从汇编的层面来看,貌似关系不那么大? |
122
magic3584 2023-11-24 00:25:56 +08:00
感谢大家,不知不觉又学到了一点知识。
能遇到这个 mentor 实属幸运,在刚工作的年纪。 转码这么多年,一直没觉得自己比科班差在哪,遇到的问题也基本都可以解决(当然是小厂小问题)。 但是最近在和大厂出来的聊天后,发现自己真的插不上话,一些底层编译优化统统不懂,深感无力。 了解的越多,越觉得要学的太多太多了。 只可惜,现在学的话有点来不及了,不过,我还是先从书架上拿出我尘封已久的 CSAPP 吧。 |
123
chendl111 2023-11-24 00:56:50 +08:00
听你 mentor 的
|
124
iintothewind 2023-11-24 04:01:23 +08:00
golang 就是一个 better c, 指令式范式编程, 就是怎么写都很丑啊, 不就是 if else for while 加花括号吗?
所以还得听你 mentor 的, 没必要纠结. 你能有机会用函数式风格比较友好的语言, 并且周围比较多那种追求简洁高效有质量代码的技术有追求的同事的时候, 你再好好发挥也不迟. |
125
wxm1997 2023-11-24 04:05:23 +08:00
@undeflife #7 哈哈,原谅我看到了这条回复真的笑出了声,golang 真的是满文件都是 if err != nil
|
126
opengg 2023-11-24 04:16:36 +08:00 via Android
明显是你导师写的好啊,你以为 if 越深越好?
|
127
y1y1 2023-11-24 04:21:28 +08:00 via iPhone
名校?什么水平的名校,cmu 吗
|
128
hongns 2023-11-24 06:12:27 +08:00
学校名字说一下呢
|
129
Viztor 2023-11-24 06:53:14 +08:00
实际上根本不是代码风格的问题,第二个效率写法更高。程序员当然没必要为了一点点性能提升去过于复杂化代码,但选择一个明显可读性更高的更高且性能更好的写法,应当是相当良好的习惯,只能说发帖的人压根没有好好思考两份代码的差异。
|
130
zhy0216 2023-11-24 07:37:47 +08:00 via Android
就你 append 的代码而言
我也更喜欢后者 一个 loop 做一件事情 |
131
zochdk 2023-11-24 07:54:19 +08:00 via Android
for 时间复杂度是 n ,在 for 里放 if 代表机器会走 n 次 if 语义,在你的业务范畴里:前 n-1 项 if 分支的执行毫无意义,每多一语义每多一 cpu 时间片,虽然阅读起来易于理解,但实际不是更佳实践。
实际来看更有经验的程序员会选择第二种方式,这是更佳实践。这一操作看似是经验,实际包含了对计算机知识理论的认知深度和应用实践结合,maybe 对现在的你来讲属于新领域。纸上谈兵非计算机之道,这与你是什么学校毕业和他在什么公司待过没有必然逻辑关系。单单针对这一段代码而言,你们的认知层次不同,所以映照到现实实践的行为不同,更好的程序员像 AI ,会训练自己。 |
132
xuanbg 2023-11-24 07:55:49 +08:00
第一个和第二个不等效啊。第一个方法最后一个处理了 2 次,第二个方法最后一个只特殊处理 1 次。然后,OP 的写法在我看来逻辑不是特别清晰。强行挽尊的不是你的 mentor 是你啊。
|
133
xuanbg 2023-11-24 07:58:31 +08:00
```
for i:=range array{ if i==len(array)-1{ // do sth special to array[len(array)-1] }else{ // do sth normal to array[i] } } ``` 这才和下面代码等效哦 ``` for i:=0;i<len(array-1);i++{ // do sth normal } // do sth special for array[len(array)-1] ``` |
134
cdswyda 2023-11-24 08:29:43 +08:00
我绝对绝对站你的 mentor 。
不过话说回来,看到这个,我突然想到,我花自己很长时间去给别人 review 的代码,别人会不会也在某个地方在吐槽我。 |
135
yzbythesea 2023-11-24 08:39:33 +08:00 via iPhone
感觉怎么很巨婴?简单和 mentor 沟通一下不就好了?
另外什么叫名校出来?中国 top 2 还是美国 top 20 ?(其余都是杂牌 |
136
izzy27 2023-11-24 08:53:43 +08:00
听你 mentor 的,别犟,犟下次不教你了
|
137
izzy27 2023-11-24 08:55:08 +08:00
“可能 mentor 觉得我菜吧,但我觉得我只是经验不足,好歹哥们也是名校出来的,开发工作难度也就那样,要是功能缺陷那让我改我没话说,但只是代码习惯不一样就被要求改就很烦”
说真的,你这个心态要吃大亏。。。 |
138
tracebundy 2023-11-24 09:48:30 +08:00
放平心态,也要放低姿态,很明显 mentor 的好
|
140
Sfilata 2023-11-24 09:50:37 +08:00
名校和写不写得好代码完全没有任何关系,充其量只是优秀的概率大一点。另外我看了下你贴出来的代码,我也是觉得你 mentor 的代码好一些。
除了这些具体的点,我想说 review 代码不明白就写 comment 是一种非常负责的行为,如果你觉得需要改的话你也继续写 comment 和他交流呗。 在开源项目中,因为代码风格或者实现细节,几行代码被 comment 十几次是很正常的事情。我不知道为啥你偏要把这个理解为不走心或者不舒服。工作真的没那么多戏,就是纯纯觉得改一下更好而已。遇到事情多交流,不要因为名校就看不起谁,这世界很大,你才刚刚开始。 |
141
karott7 2023-11-24 09:53:15 +08:00
mentor 的好
|
142
ivvei 2023-11-24 10:00:46 +08:00
自然是 Mentor 的好。这不是风格的问题。你的代码实实在在做了无用功。
不过话说回来,我当 mentor 的时候才不会管那么多。功能实现正确就行,管你用什么数据结构用什么算法内部写成什么样…… |
143
fyxtc 2023-11-24 10:17:37 +08:00 1
”好歹哥们也是名校出来的,开发工作难度也就那样“,这语气表达的对项目态度真的一言难尽
v2 怎么说也是卧虎藏龙,名校含金量相当高的一个论坛,基本没见到说谁把“名校出身”当做是一种证明,而是用于分享一些学校相关信息,你可能认为自己有点能力,而且想让别人证明你有这个能力,所以只能贴出这个证明,刚毕业,就喜欢质疑前辈真的不是好习惯。尤其你说的”代码习惯“可真不是”大括号要不要换行”这种习惯,你要认识到一点:有些你认为的习惯恰恰是重构后养成的习惯。不要认为自己代码被改了就受不了,对资深前辈的修改要有敬畏,不懂可以直接请教,也可以发帖请教,而不是发帖找认同。 |
144
admingyu 2023-11-24 10:36:24 +08:00
@Ainokiseki #18 不是可读性问题,既然最后一个特殊处理,那么你明知道最后一个元素是 array[len(array)-1],还非要在循环里从第一个开始每个元素都判断一次,消耗 cpu ,你要是说消耗不了多少,那这个话题就没必要讨论下去了
|
145
broken123 2023-11-24 10:44:27 +08:00
我同意 19 楼的看法。你只想处理最后一个元素为啥还要循环。一行代码就写完了。。。。 有时候写完代码之后 自己吧代码贴到 chat gpt 上 喊 ai 帮你优化下 你就晓得自己的进步了
|
146
zypy333 2023-11-24 11:19:58 +08:00
感觉这样公司真好,我待过的小公司从来没有互相 review 的,写代码全凭自觉,大多数能跑就行
|
147
SHF 2023-11-24 11:21:46 +08:00
@pkoukk #21 微服务有这优点我是没想到的,it does sound appealing ,但是代码分不开吧,总有一些公共的常量、函数、工具方法,要共享或者复用
|
149
Ainokiseki OP @williamscorn 有个小问题是,这个“处理”是以 array[i]为参照创造一个新结构体然后塞到 channel 里面,不想占用额外的内存所以就一个个来了
|
150
Ainokiseki OP @xuanbg 可能我没有写明白,最后那个 do sth special 实际上是要先把 normal 的事情做一遍的
|
151
GeekGao 2023-11-24 14:18:13 +08:00
在循环之前,可以将 len(array) 存储在一个变量中,以避免在每次迭代中重复计算数组的长度。这样可以提高性能并简化代码。因此结论:你闷头儿的代码更好一点。
|
152
Ainokiseki OP @moon8sky 不是,不过说实话我有点慌,你这么一说我害怕被 mentor 看到误会了,沉了沉了。我感觉 mentor 除了话少,高冷,以及有时候观念不一致之外其余都 ok 的,看评论感觉大家都觉得 mentor 写法好,那我自然是虚心接受了
|