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

和 mentor 代码习惯不一样,好头痛

  •  
  •   Ainokiseki · 2023-11-23 11:00:07 +08:00 · 15643 次点击
    这是一个创建于 365 天前的主题,其中的信息可能已经有所发展或是发生改变。
    校招生一枚,入职半年了,和 mentor 一起负责项目的某个模块,代码自然是两个人互相 review 。
    mentor 之前在某大厂,看起来是比较资深的那种,再加上前期对项目不熟,小透明基本上是 mentor 说啥是啥。
    review 的时候 mentor 的代码只要功能 ok 那就好,但是 mentor review 我的时候就有点不走心,有些地方没看懂就写 comment ,还有些地方我的设计本来 ok 的,他又要按他自己的习惯来改。
    我理解这项目最开始是 mentor 写的,可能看着自己创造的东西被别人改来改去总会不舒服?至少我是无数次幻想着哪天 mentor 不在了我要把现在的代码按我的风格从头到尾重构一下 hhhh
    可能 mentor 觉得我菜吧,但我觉得我只是经验不足,好歹哥们也是名校出来的,开发工作难度也就那样,要是功能缺陷那让我改我没话说,但只是代码习惯不一样就被要求改就很烦
    第 1 条附言  ·  2023-11-23 11:53:08 +08:00
    关于例子:之前的写法可能误导大家,我重新 append 一下
    注意不是只处理最后一个,不是只处理最后一个,不是只处理最后一个

    ```
    for i:=range array{
    // do sth normal to array[i]
    if i==len(array)-1{
    // do sth special to array[len(array)-1]
    }
    }
    ```
    mentor 要我改成:
    ```
    for i:=0;i<len(array-1);i++{
    // do sth normal
    }
    // do sth special for array[len(array)-1]

    ```
    1  2  
    ffffb
        101
    ffffb  
       2023-11-23 18:25:59 +08:00
    什么时候你不会想着重构你就成熟了
    moon8sky
        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 次。才知道自己的渺小

    阻止自己进步的大概不是你的专业,公司,项目内容,而是自己的傲慢。

    不要目空一切,我们永远也学不会我们不知道的知识,我想这大概也是之前他学习任务进度如此慢的原因
    soupu626
        103
    soupu626  
       2023-11-23 19:07:37 +08:00
    更喜欢 mentor +1 ,减少缩进层级,减少 if 判断次数,功能分离,好看好读

    另外代码看不懂直接 comment 有什么问题么,CR 不就是用来讨论的么

    工程中不需要简洁代码,可读性要求更高,我现在看我当初写的 OI/ACM 代码完全读不下去。
    chesha1
        104
    chesha1  
       2023-11-23 19:31:33 +08:00
    其实问题不是很大,如果你编译器优化开高一点,两种写法编译出来可能完全一样

    就算需要多判断一下,CPU 跑得很快的,一般业务的瓶颈都不会在运算上,在网络上和在内存上可能性更大
    0xLittleFi
        105
    0xLittleFi  
       2023-11-23 20:17:20 +08:00
    首先 mentor 得代码好,
    企业级的代码,逻辑清晰是第一点,毕竟是要长期维护
    如果 op 觉得他不行,可以申请换 mentor ,mentor 不会觉得你菜,重要的是会学,不理解就刨根问底
    dito
        106
    dito  
       2023-11-23 20:23:10 +08:00 via Android
    我只想说 special 的反义词不是 normal ,别给我们名校抹黑。
    StephenHe
        107
    StephenHe  
       2023-11-23 20:23:29 +08:00
    再好的代码,迭代 3-5 个版本就变成一坨屎了
    hahadaxigua834
        108
    hahadaxigua834  
       2023-11-23 20:36:42 +08:00
    这种级别的东西编译器前端估计就能给你优化了,有没有编译器方向的大佬有空指点下。

    风格问题的话跟着老员工写就完事了,纠结这种问题纯属工作量不饱和
    nagisaushio
        109
    nagisaushio  
       2023-11-23 20:52:29 +08:00 via Android
    @moon8sky 看起来楼主是写 go 或有 go 背景的,可能有些差别
    lguan
        110
    lguan  
       2023-11-23 21:03:55 +08:00   ❤️ 1
    忘记自己是名校出来的,这一文不值,也忘记 mentor 之前在大厂做过,可能有经验,也未必是对的,但在一个团队,大家有共识很重要,特别是涉及到规范以后,这玩意儿又往往没有对错之分,碰到这种分歧的,如果你觉得你是对的,那么就尝试说服别人,如果做不到,那就按照团队定的来,PS ,例子里面,我自己会偏向用 mentor 的方式,但你上面的方式也有好处,对于将来维护的时候,如果需要特殊处理的要从最后一个改到中间的时候,你的代码改起来会方便一些,所以要是我如果一定要争论这点的话,我会看看这部分的代码将来是不是有修改的可能,如果没有,我自己是会才去下面的方法
    bhy
        111
    bhy  
       2023-11-23 21:04:00 +08:00
    mentor 的代码是不是不对? array 为空的时候会出错?
    kkwa56188
        112
    kkwa56188  
       2023-11-23 21:10:19 +08:00
    mentor 的逻辑好一些:
    现在只需要 特殊处理 数组里最后一个元素, 一个 for 循环里就有 1 个 if. 数组有十万个元素就 十万次 if.
    如果要分别特殊处理数组里 最后 10 个元素, 一个 for 循环里就有 10 个 if. 数组十万个元素 就是 (十万乘以 10) 次 if.
    laminux29
        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 的计算,每次循环要算一次。
    Features
        114
    Features  
       2023-11-23 21:33:57 +08:00
    厂里这么闲的吗? 效益不错吧
    rxswift
        115
    rxswift  
       2023-11-23 21:48:05 +08:00
    go 语言?
    zhdi
        116
    zhdi  
       2023-11-23 22:40:27 +08:00
    晚上玩回来写了个测试,c 写的,array 大小 409600 ,重复测试 100 次,if 写循环里时间是平均 2500us ,if 写外面是 1500us ,没有开-O 优化,因为懒得给里面填内容,不填东西开-O 会直接 ret
    lesismal
        117
    lesismal  
       2023-11-23 22:42:55 +08:00
    目测:最近 v2 流行自爆🧐
    adskhf
        118
    adskhf  
       2023-11-23 22:57:11 +08:00
    @undeflife 笑死我啦,golang 确实是不管怎么写都是丑的😂
    netabare
        119
    netabare  
       2023-11-23 23:08:19 +08:00 via iPhone   ❤️ 1
    你给的例子明显是你 mentor 的更好啊,最后一个要特殊对待,mentor 的一次改完,你的例子先修改一次再回过头改一次。

    万一你的第一部分代码有什么特殊的逻辑呢?那么本不该被调用的事情就会发生。
    LindsayZhou
        120
    LindsayZhou  
       2023-11-23 23:35:24 +08:00
    赞同 #113 ,完全看场景。
    刚写了一个简单的示例,翻了一下二进制代码。

    简单的循环编译器优化的时候会把判断拿到循环外面去。不会像楼上一些人说的判断很多遍。

    https://p.koi.moe/kash
    https://p.koi.moe/qhzX
    LindsayZhou
        121
    LindsayZhou  
       2023-11-23 23:47:32 +08:00
    续 #120
    em... 好像又看走眼了,判断还是在,两种循环的位置有点不一样。
    只是从汇编的层面来看,貌似关系不那么大?
    magic3584
        122
    magic3584  
       2023-11-24 00:25:56 +08:00
    感谢大家,不知不觉又学到了一点知识。

    能遇到这个 mentor 实属幸运,在刚工作的年纪。

    转码这么多年,一直没觉得自己比科班差在哪,遇到的问题也基本都可以解决(当然是小厂小问题)。
    但是最近在和大厂出来的聊天后,发现自己真的插不上话,一些底层编译优化统统不懂,深感无力。
    了解的越多,越觉得要学的太多太多了。

    只可惜,现在学的话有点来不及了,不过,我还是先从书架上拿出我尘封已久的 CSAPP 吧。
    chendl111
        123
    chendl111  
       2023-11-24 00:56:50 +08:00
    听你 mentor 的
    iintothewind
        124
    iintothewind  
       364 天前
    golang 就是一个 better c, 指令式范式编程, 就是怎么写都很丑啊, 不就是 if else for while 加花括号吗?
    所以还得听你 mentor 的, 没必要纠结.

    你能有机会用函数式风格比较友好的语言, 并且周围比较多那种追求简洁高效有质量代码的技术有追求的同事的时候, 你再好好发挥也不迟.
    wxm1997
        125
    wxm1997  
       364 天前
    @undeflife #7 哈哈,原谅我看到了这条回复真的笑出了声,golang 真的是满文件都是 if err != nil
    opengg
        126
    opengg  
       364 天前 via Android
    明显是你导师写的好啊,你以为 if 越深越好?
    y1y1
        127
    y1y1  
       364 天前 via iPhone
    名校?什么水平的名校,cmu 吗
    hongns
        128
    hongns  
       364 天前
    学校名字说一下呢
    Viztor
        129
    Viztor  
       364 天前
    实际上根本不是代码风格的问题,第二个效率写法更高。程序员当然没必要为了一点点性能提升去过于复杂化代码,但选择一个明显可读性更高的更高且性能更好的写法,应当是相当良好的习惯,只能说发帖的人压根没有好好思考两份代码的差异。
    zhy0216
        130
    zhy0216  
       364 天前 via Android
    就你 append 的代码而言
    我也更喜欢后者
    一个 loop 做一件事情
    zochdk
        131
    zochdk  
       364 天前 via Android
    for 时间复杂度是 n ,在 for 里放 if 代表机器会走 n 次 if 语义,在你的业务范畴里:前 n-1 项 if 分支的执行毫无意义,每多一语义每多一 cpu 时间片,虽然阅读起来易于理解,但实际不是更佳实践。

    实际来看更有经验的程序员会选择第二种方式,这是更佳实践。这一操作看似是经验,实际包含了对计算机知识理论的认知深度和应用实践结合,maybe 对现在的你来讲属于新领域。纸上谈兵非计算机之道,这与你是什么学校毕业和他在什么公司待过没有必然逻辑关系。单单针对这一段代码而言,你们的认知层次不同,所以映照到现实实践的行为不同,更好的程序员像 AI ,会训练自己。
    xuanbg
        132
    xuanbg  
       364 天前
    第一个和第二个不等效啊。第一个方法最后一个处理了 2 次,第二个方法最后一个只特殊处理 1 次。然后,OP 的写法在我看来逻辑不是特别清晰。强行挽尊的不是你的 mentor 是你啊。
    xuanbg
        133
    xuanbg  
       364 天前
    ```
    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]

    ```
    cdswyda
        134
    cdswyda  
       364 天前
    我绝对绝对站你的 mentor 。

    不过话说回来,看到这个,我突然想到,我花自己很长时间去给别人 review 的代码,别人会不会也在某个地方在吐槽我。
    yzbythesea
        135
    yzbythesea  
       364 天前 via iPhone
    感觉怎么很巨婴?简单和 mentor 沟通一下不就好了?
    另外什么叫名校出来?中国 top 2 还是美国 top 20 ?(其余都是杂牌
    izzy27
        136
    izzy27  
       364 天前
    听你 mentor 的,别犟,犟下次不教你了
    izzy27
        137
    izzy27  
       364 天前
    “可能 mentor 觉得我菜吧,但我觉得我只是经验不足,好歹哥们也是名校出来的,开发工作难度也就那样,要是功能缺陷那让我改我没话说,但只是代码习惯不一样就被要求改就很烦”

    说真的,你这个心态要吃大亏。。。
    tracebundy
        138
    tracebundy  
       364 天前
    放平心态,也要放低姿态,很明显 mentor 的好
    sxfscool
        139
    sxfscool  
       364 天前
    @moon8sky 这种该辞就辞,不能给自己挖坑埋雷
    Sfilata
        140
    Sfilata  
       364 天前
    名校和写不写得好代码完全没有任何关系,充其量只是优秀的概率大一点。另外我看了下你贴出来的代码,我也是觉得你 mentor 的代码好一些。

    除了这些具体的点,我想说 review 代码不明白就写 comment 是一种非常负责的行为,如果你觉得需要改的话你也继续写 comment 和他交流呗。

    在开源项目中,因为代码风格或者实现细节,几行代码被 comment 十几次是很正常的事情。我不知道为啥你偏要把这个理解为不走心或者不舒服。工作真的没那么多戏,就是纯纯觉得改一下更好而已。遇到事情多交流,不要因为名校就看不起谁,这世界很大,你才刚刚开始。
    karott7
        141
    karott7  
       364 天前
    mentor 的好
    ivvei
        142
    ivvei  
       364 天前
    自然是 Mentor 的好。这不是风格的问题。你的代码实实在在做了无用功。

    不过话说回来,我当 mentor 的时候才不会管那么多。功能实现正确就行,管你用什么数据结构用什么算法内部写成什么样……
    fyxtc
        143
    fyxtc  
       364 天前   ❤️ 1
    ”好歹哥们也是名校出来的,开发工作难度也就那样“,这语气表达的对项目态度真的一言难尽

    v2 怎么说也是卧虎藏龙,名校含金量相当高的一个论坛,基本没见到说谁把“名校出身”当做是一种证明,而是用于分享一些学校相关信息,你可能认为自己有点能力,而且想让别人证明你有这个能力,所以只能贴出这个证明,刚毕业,就喜欢质疑前辈真的不是好习惯。尤其你说的”代码习惯“可真不是”大括号要不要换行”这种习惯,你要认识到一点:有些你认为的习惯恰恰是重构后养成的习惯。不要认为自己代码被改了就受不了,对资深前辈的修改要有敬畏,不懂可以直接请教,也可以发帖请教,而不是发帖找认同。
    admingyu
        144
    admingyu  
       364 天前
    @Ainokiseki #18 不是可读性问题,既然最后一个特殊处理,那么你明知道最后一个元素是 array[len(array)-1],还非要在循环里从第一个开始每个元素都判断一次,消耗 cpu ,你要是说消耗不了多少,那这个话题就没必要讨论下去了
    broken123
        145
    broken123  
       364 天前
    我同意 19 楼的看法。你只想处理最后一个元素为啥还要循环。一行代码就写完了。。。。 有时候写完代码之后 自己吧代码贴到 chat gpt 上 喊 ai 帮你优化下 你就晓得自己的进步了
    zypy333
        146
    zypy333  
       364 天前
    感觉这样公司真好,我待过的小公司从来没有互相 review 的,写代码全凭自觉,大多数能跑就行
    SHF
        147
    SHF  
       364 天前
    @pkoukk #21 微服务有这优点我是没想到的,it does sound appealing ,但是代码分不开吧,总有一些公共的常量、函数、工具方法,要共享或者复用
    pkoukk
        148
    pkoukk  
       364 天前
    @SHF #147 因为是 go ,所以引入公用代码很方便,设置一下 GOPRIVATE ,从仓库里直接拉就行了。
    Ainokiseki
        149
    Ainokiseki  
    OP
       364 天前
    @williamscorn 有个小问题是,这个“处理”是以 array[i]为参照创造一个新结构体然后塞到 channel 里面,不想占用额外的内存所以就一个个来了
    Ainokiseki
        150
    Ainokiseki  
    OP
       364 天前
    @xuanbg 可能我没有写明白,最后那个 do sth special 实际上是要先把 normal 的事情做一遍的
    GeekGao
        151
    GeekGao  
       364 天前
    在循环之前,可以将 len(array) 存储在一个变量中,以避免在每次迭代中重复计算数组的长度。这样可以提高性能并简化代码。因此结论:你闷头儿的代码更好一点。
    Ainokiseki
        152
    Ainokiseki  
    OP
       364 天前
    @moon8sky 不是,不过说实话我有点慌,你这么一说我害怕被 mentor 看到误会了,沉了沉了。我感觉 mentor 除了话少,高冷,以及有时候观念不一致之外其余都 ok 的,看评论感觉大家都觉得 mentor 写法好,那我自然是虚心接受了
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1021 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:40 · PVG 03:40 · LAX 11:40 · JFK 14:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.