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

什么样的代码一看就知道是新手?

  •  
  •   yidinghe · 2018-09-16 00:44:18 +08:00 via Android · 18436 次点击
    这是一个创建于 2020 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有的代码一看就是新手写的,写这样的代码的程序员,基本上只能留在初级程序员的岗位上。这样的代码有哪些特点呢?

    1、没有格式,混乱不堪。比如缩进对不齐、语句从不换行、空格和制表符混搭等等。

    这表明作者缺乏阅读代码,包括自己代码的经验。只有长期经常阅读代码的人才会有意识的对自己的代码做格式化。

    而缺乏阅读代码经验的人必然也缺乏维护代码的经验。这种人可能经常跳槽,连自己的代码都从来不看第二遍,留下一堆的坑让别人来填。

    而缺乏维护代码经验的人也必然缺乏解决故障的经验和重构代码的经验,而这两个对程序员的工作效率来说是至关重要的。很多时候老油条看一眼就知道问题出在哪里,而新手要调试一整天。别让薪水花冤枉了。

    你可能说我太吹毛求疵,不就是排版乱一点,哪那么多道道?但实际情况真的就是这样子。

    2、不会命名,或老写错字。简单的单词都能拼错就不说了,我另外举个例子,纸张的正面不是 front 嘛,他一查字典,结果选了 positive,“积极正面”的正面,那好吧,反面你就用 negative 吧,我不,他又查字典,结果起个名字叫 reverse,这搞得完全看不懂了。

    让这种人加到项目里面来,你就恨不得手把手的帮他把代码写了(也恨不得薪水都帮他领了),一不留神就各种奇葩名字。其实 Java 早就支持 Unicode,实在不行用中文名字算了。

    3、语法高亮。这个从代码本身看不出,但可以瞄一眼作者的 IDE 是啥样。IDE 现在都可以自定义语法高亮,但是默认的情况下都只有三个颜色:关键字一个颜色,字符串一个颜色,剩下的一个颜色。

    而实际上经验丰富的开发者都会尽可能多的用颜色,来区分类、成员、方法和参数等等,这样可以提高阅读效率。比如 color-themes.com 就有很多现成的风格。

    看得舒服是次要的,最终目的是要提高阅读效率。当然除了颜色外,好的字体也很重要,这里就不多说了。总之,只有老油条才会关注这些东西,不当回事的多半是初学者。

    说了这么多,其实一句话:当新手开发效率到了一个极限想要继续提升,就必须在代码的格式、命名、视觉效果上下功夫。这是新手必须要迈过的坎。

    123 条回复    2018-10-05 10:43:05 +08:00
    1  2  
    lolcat
        1
    lolcat  
       2018-09-16 00:53:58 +08:00
    反面不应该用 back 吗?
    Leammin
        2
    Leammin  
       2018-09-16 01:01:04 +08:00 via Android   ❤️ 9
    命名是一生之敌 orz
    megachweng
        3
    megachweng  
       2018-09-16 01:08:17 +08:00 via iPhone
    https://i.loli.net/2018/09/16/5b9d3bc60322d.png

    https://i.loli.net/2018/09/16/5b9d3bd314f4b.png

    https://i.loli.net/2018/09/16/5b9d3bd9d2444.png

    感受一下?就让帮忙写几个单元测试,IDE 都给你波浪浪了一行了,也不知道改一下,头皮发麻
    coffeSlider
        4
    coffeSlider  
       2018-09-16 01:09:57 +08:00 via Android   ❤️ 50
    你这鄙视链属于初学水平。
    kaedea
        5
    kaedea  
       2018-09-16 01:15:29 +08:00 via Android
    该加空格没加,不该加空格随便加,对代码排版没有美观要求的人。
    Kahnn
        6
    Kahnn  
       2018-09-16 01:19:52 +08:00
    不喜欢颜色太多,IDEA 默认的配色就挺好的啊
    reus
        7
    reus  
       2018-09-16 01:23:16 +08:00   ❤️ 1
    有些人例如 Rob Pike 是不用高亮的,虽然我也不理解,但是我知道他不是新手,他是老一辈的人。
    ETiV
        8
    ETiV  
       2018-09-16 01:31:18 +08:00   ❤️ 1
    1、用 IDE 格式化代码功能能解决,一个快捷键的事儿
    2、英语水平问题也是一个考量因素…我见过把“已购买”写成 buyed 的(同时“已售出”写成了 selled )
    3、也可能因人而异,万一有新手喜欢用配色更丰富的主题呢~

    我见过的新手代码:

    - 能用循环写的代码,复制 N 多行然后一行一行的改
    - 能用 K-V 处理的逻辑,把值 push_back 进数组,然后循环数组去找到对应的 value
    yanaraika
        9
    yanaraika  
       2018-09-16 01:32:28 +08:00   ❤️ 5
    新手喜欢把问题搞复杂,老手会把问题化简单
    Hardrain
        10
    Hardrain  
       2018-09-16 01:34:42 +08:00
    箭头形代码
    从不用 elif 那种
    kslr
        11
    kslr  
       2018-09-16 01:38:09 +08:00
    唉,有时候一个单词要琢磨半天才能精准描述含义
    3dwelcome
        12
    3dwelcome  
       2018-09-16 01:43:54 +08:00 via Android
    懒代码和经验没什么必然关系,和态度有关。我发现有些人很聪明,但就是没想把代码写好,就只想快点交差干自己的事情去。
    congeec
        13
    congeec  
       2018-09-16 01:44:12 +08:00 via iPhone   ❤️ 1
    @reus 他是特例。我写代码经常写错字,这时候关键字如果不是彩色就能发现错误
    inhzus
        14
    inhzus  
       2018-09-16 01:44:57 +08:00 via Android
    前几天一起写项目,看了同组的代码简直崩溃。
    正常情况下这么写:
    func(){
    a();
    b();
    c();
    }
    a b c 功能没有包含关系。
    他们写的:
    func(){
    a();
    }
    a(){
    ...
    b();
    }
    b(){
    ...
    c();
    }
    帮他们 debug 了一次,idea 显示的波浪线看得我想死
    innoink
        15
    innoink  
       2018-09-16 01:47:00 +08:00 via Android   ❤️ 1
    这样的文我一天能写 10 个
    hengo
        16
    hengo  
       2018-09-16 01:52:16 +08:00 via iPhone
    @megachweng cancel authority watch 不会写,可以查啊,看的强迫症难受
    wuhhhh
        17
    wuhhhh  
       2018-09-16 01:57:33 +08:00 via iPhone   ❤️ 1
    在开始写的时候,就已经把《阿里开发手册》看了一遍,基本上语法类的问题不大,自己也是新手,最快能看出新手的代码,看结构,看项目名,小写大写字母规定格式
    hengo
        18
    hengo  
       2018-09-16 01:57:46 +08:00 via iPhone
    @megachweng authenticate
    broadliyn
        19
    broadliyn  
       2018-09-16 02:51:29 +08:00 via iPhone   ❤️ 2
    lz 写了这么一大段没什么卵用的话肯定是工作上有谁惹你不快了于是上来发泄一通。
    1010011010
        20
    1010011010  
       2018-09-16 02:58:07 +08:00
    宝宝宝宝宝宝树
    Phariel
        21
    Phariel  
       2018-09-16 03:46:54 +08:00 via iPhone
    if (a == b) {
    return true;
    } else {
    return false;
    }

    我想揍人
    d18
        22
    d18  
       2018-09-16 03:57:00 +08:00
    新手比较喜欢炫技吧,简单的问题,恨不得把自己会的东西都用上去。
    d18
        23
    d18  
       2018-09-16 03:57:51 +08:00
    所谓的“给你一把锤子,看什么都是钉子”。
    FrankHB
        24
    FrankHB  
       2018-09-16 06:04:07 +08:00
    反对 3。我撸了个语言,装了 Syntax Highlighting Pack 然后往里面加了自己的 tmLanguage 实现,但是 VS 就是不按我的意思识别 magic 来高亮(单独扩展名是正常的),我有啥办法。(看了下插件源码还是懵逼的,解释 tmLanguage/plist 不是插件而是 VS 自己搞定的,然而 cmake 这种直接整个 txt 名字都行,我用.txt+firstLineMatch 就不行……)
    zxq2233
        25
    zxq2233  
       2018-09-16 06:53:46 +08:00
    php 是世界上最好的语言
    daigouspy
        26
    daigouspy  
       2018-09-16 07:11:02 +08:00 via Android   ❤️ 1
    这不跟看字迹识人品一样吗?毫无意义的。
    loading
        27
    loading  
       2018-09-16 07:20:02 +08:00 via iPhone
    color-themes. com
    这个站是哪里的?
    Android2MCU
        28
    Android2MCU  
       2018-09-16 07:30:15 +08:00 via iPhone
    原来我们用记事本写代码的在楼主眼里应该是新的不能再新的新手了
    zek
        29
    zek  
       2018-09-16 07:35:07 +08:00 via Android
    专注于业务逻辑吧,别整没用的,idea 配色啥的浪费时间
    loading
        30
    loading  
       2018-09-16 07:42:50 +08:00 via iPhone   ❤️ 2
    楼主你的 github 能不能贴一下,我想学编程,想学习一下。
    lardud
        31
    lardud  
       2018-09-16 08:22:13 +08:00 via Android
    一堆颜色一看就是新手
    zjsxwc
        32
    zjsxwc  
       2018-09-16 08:27:42 +08:00 via Android   ❤️ 2
    变量名,here, there2, a, here3......





















    但这些变量名是大佬雷军先生写的!你敢说他是新手? 233333333333
    xillwill
        33
    xillwill  
       2018-09-16 08:57:07 +08:00 via iPad
    谁不是新手过来的 你是在嘲讽自己的过去吗
    经验通过积累而来 经验不同于技能 这种东西是学不来的
    easylee
        34
    easylee  
       2018-09-16 08:57:36 +08:00 via Android   ❤️ 1
    对配色没多大要求。
    tvallday
        35
    tvallday  
       2018-09-16 09:06:56 +08:00
    @zjsxwc 二十几年前没有这么多软件工程上的要求,更讲究的是怎么合理利用硬盘和内存空间,现在时代不一样了。
    shiguiyou
        36
    shiguiyou  
       2018-09-16 09:14:22 +08:00
    颜色太多太亮不觉得眼花缭乱吗?
    greatghoul
        37
    greatghoul  
       2018-09-16 09:25:13 +08:00   ❤️ 2
    配色是个人喜好,连这也要和新不新手关联,只能说有些吹毛求疵了。
    alwayshere
        38
    alwayshere  
       2018-09-16 09:48:02 +08:00   ❤️ 1
    if($a==true){}
    lastpass
        39
    lastpass  
       2018-09-16 09:59:17 +08:00 via Android   ❤️ 1
    新手和老手的主要区别在于
    老手:我的队友都是猪,我不这样写那群猪又看不懂,要瞎改,我解释都要解释半天,严重浪费我时间。
    新手:队友是啥?维护又是啥?好吃吗?
    lastpass
        40
    lastpass  
       2018-09-16 10:01:11 +08:00 via Android
    简单点说;
    你将你的队友当猪来看,你就是老手。
    你将你的队友当神仙来看,你就是新手。
    ICKelin
        41
    ICKelin  
       2018-09-16 10:13:40 +08:00
    我感觉楼主说的这三点没什么好吐槽的,每个人都是从新手过来的,态度好的话很快就能修正了,再过段时间,可能就能超过楼主了。不就比别人多混多学几年嘛,给人时间就能超过你。
    Bibilli
        42
    Bibilli  
       2018-09-16 10:40:49 +08:00
    新手与老手的最大却别我认为在于整个代码的架构上来看
    inframe
        43
    inframe  
       2018-09-16 10:46:07 +08:00 via Android
    就看新手能多久跨过这个坎了
    quinoa42
        44
    quinoa42  
       2018-09-16 10:50:58 +08:00
    这三点取决于个人风格,除了瞎取变量名我觉得还算可以接受
    要我说大量 duplicate code,一个 function 写 100 多行,chaining method call 这样的才算看着都头疼
    jsthon
        45
    jsthon  
       2018-09-16 11:10:20 +08:00
    以 my 开头命名,如 myCode
    hlwjia
        46
    hlwjia  
       2018-09-16 11:12:55 +08:00   ❤️ 1
    @lolcat 他的意思是,如果“正面”已经用了 positive 了,那反面就应该用 "negative"。

    这样可以保持一致性,如果你说要全改了,那当然是 front and back 了
    wolfie
        47
    wolfie  
       2018-09-16 11:15:53 +08:00   ❤️ 1
    不久前自己写的代码,都要理解半天。
    dyy1997
        48
    dyy1997  
       2018-09-16 11:24:00 +08:00
    switch(a)
    case 1:
    a=1;
    ...
    break
    case 2:
    a=2;
    ...
    break
    case 3:
    a=3;
    ...
    break
    icylogic
        49
    icylogic  
       2018-09-16 11:25:55 +08:00
    多线程里出现 volatile …… (指 c/c++
    ooToo
        50
    ooToo  
       2018-09-16 12:22:05 +08:00   ❤️ 1
    @zjsxwc Are you OK?
    Raisu
        51
    Raisu  
       2018-09-16 13:07:12 +08:00 via Android
    哈哈哈,想想半年前我连 debug 都不会用被同事吐槽惨了。。。
    iwtbauh
        52
    iwtbauh  
       2018-09-16 13:13:04 +08:00 via Android
    我认为一个局部变量起名叫 tmp 是没问题的
    因为我鼓励小函数,能很容易看出来这一个函数是干什么的
    loading
        53
    loading  
       2018-09-16 13:14:44 +08:00 via iPhone
    《问什么样的问题一看就是新手》
    bestkayle
        54
    bestkayle  
       2018-09-16 13:31:33 +08:00 via iPhone
    我认为不会解决问题的就是新手
    mr3x
        55
    mr3x  
       2018-09-16 13:42:45 +08:00
    @dyy1997 这个可以有
    zhzer
        56
    zhzer  
       2018-09-16 13:58:31 +08:00 via Android
    写很多没用的 ifelse,并且看不出来为什么没用
    vivoapex
        57
    vivoapex  
       2018-09-16 15:19:51 +08:00
    @ETiV 已购买不用 buyed 那用啥? hasBuyed??
    Tyanboot
        58
    Tyanboot  
       2018-09-16 15:37:33 +08:00   ❤️ 2
    @vivoapex bought 了解下? purchased 了解下?
    huclengyue
        59
    huclengyue  
       2018-09-16 16:02:02 +08:00 via Android
    缩进混乱?难道是 IDE 不支持格式化吗?
    ETiV
        60
    ETiV  
       2018-09-16 16:07:41 +08:00 via iPhone
    @vivoapex bought 和 sold …
    cyrbuzz
        61
    cyrbuzz  
       2018-09-16 16:10:24 +08:00
    我觉得可以告诉他查字典找那些带 n. 的词,什么 v. adj. 统统不行。
    alcarl
        62
    alcarl  
       2018-09-16 16:26:35 +08:00 via Android   ❤️ 1
    能靠楼主这些看新手的都是强迫症吧。。。。。。时间长了的老油条看代码只关注解决实际问题,格式什么的只要代码逻辑不乱,有分段,不是一坨一坨的,不是一行老长的,不玩语言小技巧的业务代码,都是好代码。
    在公司没有代码规范的情况下,自我要求过严会影响效率,更不敢要求别人。
    根据业务规模,在适当的时候适度拆分就好。我现在这就有一个项目,就是读个 excel 到数据库然后加工输出一下,是变量名特别英文,结构特别规范拆分特别细,定义了一堆对象,在方法里跳啊跳啊跳的我都快神经了,小需求,简单实现反而看起来更容易。我是不赞成什么都要照框架那样弄的。。。。。。
    BingoXuan
        63
    BingoXuan  
       2018-09-16 16:49:06 +08:00
    1.滥用语言特性,总会带来坑
    2.简单问题复杂解决,写的人感觉高大上,调试起来一堆 bug
    3.爆炸头式代码(一般而言是意大利面式),完全搞不清要干嘛
    4.不合理的命名,非常让人迷惑
    pabupa
        64
    pabupa  
       2018-09-16 17:59:24 +08:00   ❤️ 1
    block+1
    bullettrain1433
        65
    bullettrain1433  
       2018-09-16 21:06:18 +08:00
    class a class aa class test。。。。,哎,说多了真的累
    hanxiaomeng
        66
    hanxiaomeng  
       2018-09-16 21:13:15 +08:00
    分支语句使用先判断模式....
    ghhardy
        67
    ghhardy  
       2018-09-16 21:42:12 +08:00 via Android
    @coffeSlider 我也是觉得,会关注这种问题的人一般是新手居多,就像刚学了点功夫就像找人打架试验自己什么水平似的
    ghhardy
        68
    ghhardy  
       2018-09-16 21:44:59 +08:00 via Android
    @ETiV 你这说把循环分成单独语句的,那不算新手,那叫外行吧?
    testcgd
        69
    testcgd  
       2018-09-16 21:51:39 +08:00
    团队有搞 CR 和静态扫描应该就可以避免了吧,都是从新手过来的
    vivoapex
        70
    vivoapex  
       2018-09-16 22:27:35 +08:00
    @ETiV fuck..
    madaosan
        71
    madaosan  
       2018-09-16 23:52:19 +08:00 via Android   ❤️ 1
    自己以前写的代码。。。。
    sampeng
        72
    sampeng  
       2018-09-17 00:13:05 +08:00 via iPhone
    一个函数一起就 5-6 行。我就临时从数组取个值出来,我就要用 a 啊 b 的。因为我实在想不出用个特别牛逼的单词放这。是,我是可以放下面写一行… debug 很麻烦不说,又臭又长的一句话我宁愿有个 a,b,c
    ETiV
        73
    ETiV  
       2018-09-17 02:08:00 +08:00 via iPhone
    @vivoapex

    三点水加个来(涞)念什么
    三点水加个去又念什么…… :doge
    flowfire
        74
    flowfire  
       2018-09-17 02:40:32 +08:00 via iPhone
    @ETiV #8 buyed 和 selled 我有时候也会这么写,原因是一大片 xxxed 变量里忽然出现一个 bought 就会觉得很难受浑身不舒服
    mingl0280
        75
    mingl0280  
       2018-09-17 04:30:59 +08:00
    反对 3,太花哨的主题反而很难读好吧
    viator42
        76
    viator42  
       2018-09-17 06:40:32 +08:00 via iPhone
    有经验的上来就能考虑并发可扩展性避免输入错误这样的情况,新手只是完成业务逻辑了事
    CodeMan27
        77
    CodeMan27  
       2018-09-17 06:58:04 +08:00 via iPad
    现在 jetbrains 全家桶的高亮已经做得很好了,不用自己改
    lusheldon
        78
    lusheldon  
       2018-09-17 08:13:23 +08:00 via Android
    其实这是一个推广贴吗?
    xxgirl2
        79
    xxgirl2  
       2018-09-17 08:23:00 +08:00
    小组织没有统一风格很正常,何况有的时候老大也直接啪啪一串空格敲下去
    有的人接过来还知道 astyle 一下,有的也就那样直接上了

    当然对我来说 windows 上用 vs 必然配得五颜六色的,漂亮又省事
    linux 上 eclipse-cdt 也能五颜六色的,最近打算试试 vscode,还没调教
    Allianzcortex
        80
    Allianzcortex  
       2018-09-17 08:46:45 +08:00
    @Phariel 用 return a==b 这样的一行语句么?我觉得这个写法粗糙了点但也很直观啊
    z54749412
        81
    z54749412  
       2018-09-17 08:49:44 +08:00
    来一波 github 看看大佬是怎么样的老手。。。。
    Pythoner666666
        82
    Pythoner666666  
       2018-09-17 08:57:06 +08:00
    其实不用这么多,看一眼变量名就知道了
    zaqmjuop
        83
    zaqmjuop  
       2018-09-17 09:09:44 +08:00
    funcA(funcB(funcC(funcD(funcE()))))
    FakeLeung
        84
    FakeLeung  
       2018-09-17 09:10:24 +08:00
    变量有点不同意。

    请大佬们帮我想个好一点的变量名吧。要求一眼就知道干啥的:
    商品砼管理
    限额领料
    质量安全整改通知单
    itskingname
        85
    itskingname  
       2018-09-17 09:46:13 +08:00
    Python 代码:

    ```python
    a = []
    a.append('aaa')
    a.append('bbb')
    a.append('ccc')

    for i in range(len(a)):
    print(a[i])
    ```
    chenyu8674
        86
    chenyu8674  
       2018-09-17 10:16:28 +08:00
    if (isReady== true) {
    ……
    } else if (!isReady) {
    ……
    } else {
    ……
    }
    YzSama
        87
    YzSama  
       2018-09-17 10:35:23 +08:00
    User user = userMapper.selectById(1);

    if(user==null){
    user.setXXX();
    }

    以上亲身经历,帮同事调试一段总出错的代码... 我一度怀疑他写的代码是怎么跑的.
    enenaaa
        88
    enenaaa  
       2018-09-17 10:52:20 +08:00
    @itskingname #85, 一看就是写惯 C++的。
    zhaogaz
        89
    zhaogaz  
       2018-09-17 11:03:33 +08:00
    讲道理,我觉得看不出来。

    新手一般都写不出代码。

    干了五六年的人还有楼主说的毛病的人大有人在。
    bp0
        90
    bp0  
       2018-09-17 11:17:34 +08:00
    反对 2,写了好些年代码了,还是纠结变量命名。
    jswh
        91
    jswh  
       2018-09-17 11:19:46 +08:00
    所有逻辑写在一个函数,不会进行拆分的代码
    storypanda
        92
    storypanda  
       2018-09-17 11:23:38 +08:00 via Android
    @Phariel 你指的没有缩进?
    storypanda
        93
    storypanda  
       2018-09-17 11:25:12 +08:00 via Android
    @zjsxwc 大佬说什么都对,其实不应该这样。
    就和知乎普通人写一大段没几个赞,牛逼人物几个字几千赞一样。
    DnC
        94
    DnC  
       2018-09-17 11:40:19 +08:00
    见过一个 2 货的代码,给他指出问题,还嘴硬不承认。
    parents->father->brother->son->sister->m_friend->school->m_class->teacher->name->first_name = "SUN";
    类似这样的;吓得我一机灵。
    DnC
        95
    DnC  
       2018-09-17 11:42:55 +08:00
    还见过一个,是用 VS debug 之后修改的代码:
    前提是有个 enum{ONE, TWO, THREE,....} 这样的,
    后来有人在中间插入了一个值,变成了 enum{ONE, TWO, HELLO, THREE,...} 了,于是 bug 产生了;
    他 debug 后发现了 bug,并修改为:
    my_value = 3;
    也是吓得一机灵;然后赶紧不点名群发邮件警告。
    Mrbird
        96
    Mrbird  
       2018-09-17 11:43:06 +08:00
    代码高亮这块不敢苟同
    ihavecat
        97
    ihavecat  
       2018-09-17 11:50:39 +08:00
    你说命名用中文名让我想起了上次那个用表情包给 js 还是啥的命名变量的,底下全部看懵逼了
    pkoukk
        98
    pkoukk  
       2018-09-17 12:01:24 +08:00
    呃...我用过的 IDE 似乎都会自动帮你解决 1、3 问题。
    至于 2..和菜不菜关系不大,即使英语水平正常,很多贼长的业务术语,也难免大家的写法不一样
    closedevice
        99
    closedevice  
       2018-09-17 12:31:16 +08:00
    并不敢苟同,没到本质上.代码时写给人看,其次才是交给机器运行的.良好的代码前提是具有清晰的逻辑体系,就这个样子.
    lumnag
        100
    lumnag  
       2018-09-17 13:07:38 +08:00
    这么一说都感觉我自己是老鸟了
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2712 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 38ms · UTC 15:44 · PVG 23:44 · LAX 08:44 · JFK 11:44
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.