写代码最大的痛苦, 在于理解别人的代码 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
ybw
V2EX    程序员

写代码最大的痛苦, 在于理解别人的代码

  •  2
     
  •   ybw 2020-05-10 16:15:34 +08:00 10042 次点击
    这是一个创建于 2044 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码, 是把人的思维传递给计算机的工具, 所有的编程语言, 在设计时, 从没认真考虑过如何把一个人的思维传递给另一个人或者 2 个月后的编写者本人。

    我们程序员不得不用一个工具, 强行去解决该工具设计时从没考虑到的问题, 这就是痛苦的根源。

    编程是管理复杂度的工作, 复杂度分为问题本身需要的和工具本身带来的, 95%的编程工作, 后者的复杂度远远超过甚至碾压前者。

    64 条回复    2020-05-11 16:46:28 +08:00
    zcbenz
        1
    zcbenz  
       2020-05-10 16:20:21 +08:00   6
    我觉得更痛苦的是,别人乱改自己的代码
    ruby0906
        2
    ruby0906  
       2020-05-10 16:44:00 +08:00   3
    所以,文档就显得越发重要。 但并没有引起人们的足够重视。
    xiaket
        3
    xiaket  
       2020-05-10 16:46:33 +08:00
    所以选一个好懂的编程语言很重要.
    viator42
        4
    viator42  
       2020-05-10 16:51:22 +08:00   32
    看到烂代码就骂哪个傻叉写的,最后一查是自己写的
    jdgui
        5
    jdgui  
       2020-05-10 16:52:36 +08:00
    安卓程序员的优越性,基本上代码都是我一个人写的。
    然后 3 月那段时间 996 写出来的代码,我现在都不忍直视,骂又没地方可以骂。哈哈
    hoyixi
        6
    hoyixi  
       2020-05-10 16:54:25 +08:00
    所以要有文档和流程方法论,不过我们不需要,因为勤劳吃苦奋斗的中国人可以加班
    xuanwu
        7
    xuanwu  
       2020-05-10 16:55:17 +08:00
    试试用中文命名:
    t/656566
    t/615420
    loading
        8
    loading  
       2020-05-10 16:58:35 +08:00 via Android   3
    写代码更大的痛苦, 在于理解自己以前的代码。
    MajestySolor
        9
    MajestySolor  
       2020-05-10 17:09:51 +08:00
    不说让别人理解了,光自己看都够呛
    最好的方法就是自己每隔半年就重构一次
    whisky221
        10
    whisky221  
       2020-05-10 17:18:49 +08:00
    确实,读代码很累,但是理解了会有提升。
    自己写很爽,但是提升细微(打字速度)
    turi
        11
    turi  
       2020-05-10 17:19:17 +08:00
    我写代码喜欢 短小、紧凑的片段组合。

    我同事,你为什么不写一个函数里面,也就一个功能,也不可能复用的,然后最后一句:几千行还好吧。
    hyy1995
        12
    hyy1995  
       2020-05-10 17:23:33 +08:00
    如果业务复杂的话,自己的代码过了一段时间都看不懂了
    Nich0la5
        13
    Nich0la5  
       2020-05-10 18:25:05 +08:00 via Android
    写注释啊老铁们
    zhuawadao
        14
    zhuawadao  
       2020-05-10 18:51:42 +08:00   1
    程序员看代码--自己刚刚写的代码,啧啧啧,真是精妙;
    别人的代码--这是什么垃圾代码;
    看三个月之前自己写的代码--这是我写的吗,肯定谁改了,要不不可能这么垃圾。
    Xbluer
        15
    Xbluer  
       2020-05-10 19:00:35 +08:00
    痛苦的根源就是楼主的第一句话。

    如果大家把代码当作给另一个程序员传递思想的工具,那么就不会有这个烦扰了。

    有句话:代码是给人看的,顺便能在计算机上运行而已。
    kaiki
        16
    kaiki  
       2020-05-10 19:02:32 +08:00   2
    写代码不加注释的都是耍流氓。
    我自己写的代码不加注释第二天我都看不懂,所以我能注释都注释。
    jay0726
        17
    jay0726  
       2020-05-10 19:23:34 +08:00
    刚看的微博热搜,北京同仁医院眼科主任魏文斌:质检合格的电子产品都已过滤有害的短波蓝光。日常生活中,使用正规厂家生产的电子产品,没必要加装防蓝光的设备。
    jay0726
        18
    jay0726  
       2020-05-10 19:24:04 +08:00
    抱歉发错了
    weizhiyao008
        19
    weizhiyao008  
       2020-05-10 19:31:54 +08:00
    更痛苦的是别人乱改自己的代码后出了 BUG 还要自己查
    justin2018
        20
    justin2018  
       2020-05-10 19:33:13 +08:00   2
    修改别人的代码 : 谁写的代码 太稀烂了

    别人修改自己的代码:谁写的代码 太稀烂了

    JerryCha
        21
    JerryCha  
       2020-05-10 20:08:59 +08:00
    说得好
    让我再写一千行三目运算套三目运算套++a++再说
    charlieputon
        22
    charlieputon  
       2020-05-10 20:14:17 +08:00 via Android
    @jdgui 在一个几十个安卓开发的团队待过,你肯定想象不到那种感觉。。
    dwzfuck
        23
    dwzfuck  
       2020-05-10 20:20:39 +08:00
    @xuanwu 刚准备 @ /狗头
    fortunezhang
        24
    fortunezhang  
       2020-05-10 20:57:37 +08:00
    以前觉得自己写的还 ok,自从接了一个维护项目以后,就开始写备注了。jetbrains 软件生成的 params 还是挺好看的。
    maomaomao001
        25
    maomaomao001  
       2020-05-10 21:20:44 +08:00
    @ruby0906 我实际体验过程中发现的一个问题,文档确实挺好, 但是在项目实际快速迭代过程中 , 文档 和最版本代码一致性比较难以做到,你有没有方法优化这一类问题 ?
    kop1989
        26
    kop1989  
       2020-05-10 21:29:30 +08:00
    @maomaomao001 api 可以实现自动生成文档,但是逻辑和业务的备忘就无能为力了,要么自觉直接写注释,要么纪律上要求。比如 check in 的时候备注必须描述自己新增、修改的逻辑,或者必须附带文档一起 check in 。

    也希望大佬共通赐教。
    dioxide
        27
    dioxide  
       2020-05-10 22:12:07 +08:00
    所以才有了代码规范、范式、“军规”..
    blless
        28
    blless  
       2020-05-10 22:13:28 +08:00 via Android
    go 程序员扬眉吐气
    liliumss
        29
    liliumss  
       2020-05-10 22:26:52 +08:00
    所以代码 review 非常重要,如果每个程序员写的代码都遵循 《 clean code 》,那代码读起来就不会那么费劲了
    feelcodex
        30
    feelcodex  
       2020-05-11 01:21:43 +08:00 via iPhone
    最惨的是:别人写的代码出了 BUG,然后让你去修。。。
    dayeye2006199
        31
    dayeye2006199  
       2020-05-11 02:22:48 +08:00   1
    我觉得更痛苦的,是三个月之后看自己的代码。。这 TM 什么玩意儿。。
    ijrou
        32
    ijrou  
       2020-05-11 02:48:16 +08:00
    我觉得最痛苦的莫过于别人挖坑挖到自己的家里来了。。。。。
    icylogic
        33
    icylogic  
       2020-05-11 03:11:32 +08:00   1
    30 楼了居然都没有提到测试二字,保证一定覆盖率的有意义的测试才是理解代码,快速接手 legacy code (包括自己写的)的最佳方式。

    从时效性看,文档(包括自动生成的)很难保持和代码的同步,注释稍微好一点,但也极度依赖于每个人自觉,只有能通过的测试才是永不过时的。所以文档适合描述比较稳定的公开接口。测试有和代码同步的时效性,而且粒度可以远比文档细,又不像注释那样难以规范和保证覆盖。

    注释,代码风格 /规范,命名,review,linter,这些都是有效的辅助手段,但是我认为对于 maintainability 来说,最重要的就是测试。

    有本书叫 working effectively with legacy code 可以看看。
    PlanZ
        34
    PlanZ  
       2020-05-11 05:10:15 +08:00
    持续优化自己的代码,就不会忘了,还能发掘潜能。
    kinghly
        35
    kinghly  
       2020-05-11 08:23:15 +08:00 via Android
    代码可以阅读性很重要
    qloog
        36
    qloog  
       2020-05-11 09:04:24 +08:00
    所以 代码风格 /规范,命名,review,linter 对于一团队很重要,再加上单元测试就基本可以保证功能的稳定性。
    fancy111
        37
    fancy111  
       2020-05-11 09:07:25 +08:00
    你搞错了吧,任何人写的代码包括你自己,过段时间去看也是难看懂的。
    但是只要你精通这门语言,花点时间就看懂了,这并不是什么障碍。
    如果你还觉得困难,那是你技术水平还不够。
    ultimate
        38
    ultimate  
       2020-05-11 09:14:46 +08:00
    写代码最大的痛苦之一,命名
    michaelso
        39
    michaelso  
       2020-05-11 09:26:11 +08:00
    @Xbluer 不能同意更多了
    22yune
        40
    22yune  
       2020-05-11 09:26:21 +08:00
    @zcbenz 我觉得更痛苦的是,别人乱改自己的设计。为抢功改一些他以为‘’没关系’的点,然后他还是领导,要你按他的设计实现。
    Techzero
        41
    Techzero  
       2020-05-11 09:35:26 +08:00 via Android
    命名不规范+没注释。。
    jinliming2
        42
    jinliming2  
       2020-05-11 09:38:18 +08:00 via iPhone
    所以,你为什么不写注释 doc ?
    aaronhua
        43
    aaronhua  
       2020-05-11 09:42:10 +08:00
    注释+文档很重要,毕竟你看的代码很多都是自己以前的代码
    sagaxu
        44
    sagaxu  
       2020-05-11 09:46:27 +08:00 via Android
    最近半年我在把几万行反编译出来的代码移植到别的平台,因为是专业软件,功能都不懂,要从反编译代码倒推出功能,再正向重写出来。翻译了几千行之后,我已经很习惯读到处 goto 的代码了。
    a1562619919
        45
    a1562619919  
       2020-05-11 09:54:39 +08:00 via Android
    写代码要看别人代码是指项目交接的情况吗?
    如果原作者不是大佬,我一般在搞定难点重点后全部重写一遍。可能效率偏低但是开发心情好多了
    Tonni
        46
    Tonni  
       2020-05-11 09:59:23 +08:00
    注释 + 文档,详细记录内部逻辑细节,这样以后维护起来会方便很多。
    sdushn
        47
    sdushn  
       2020-05-11 10:20:49 +08:00
    前几天重构自己刚入行时写的代码,恶心了好几天
    no1xsyzy
        48
    no1xsyzy  
       2020-05-11 10:50:34 +08:00
    @xuanwu #7 命名并不能解决问题,英文母语使用者拿英文也不能缓解的问题,指望中文母语使用者用中文有任何程度的缓解都是妄想。
    paoqi2048
        49
    paoqi2048  
       2020-05-11 10:59:40 +08:00
    “好的代码不需要注释”,这句话不全对,注释和文档还是不能偷懒不写
    maomaomao001
        50
    maomaomao001  
       2020-05-11 11:10:54 +08:00
    @kop1989 额,api 文档是前后端沟通性文档 这个太容易同步, 因为只要不同步,前端接的时候出问题会找相关人员同步 ,
    我主要面临的是,单纯的 前端程序的文档 , 或者后端系统本身的文档 , 怎么和自身的代码同步好呢 , 我暂时也没有找到好的办法
    MaxTan
        51
    MaxTan  
       2020-05-11 11:17:50 +08:00
    其实读别人的代码挺有意思的啊
    好的代码: "卧槽,流批啊。 还可以这样"
    烂的代码: "哈哈,这傻"
    lzihua
        52
    lzihua  
       2020-05-11 11:27:43 +08:00
    从业者平均水平高低问题。一个尖子班 老师讲题 很多就直接跳过了 略过了
    zshneedmoney
        53
    zshneedmoney  
       2020-05-11 11:36:52 +08:00
    我感觉业务更苦难一些。代码难道比业务还复杂吗
    liveoppo
        54
    liveoppo  
       2020-05-11 12:00:18 +08:00
    在写代码的时候,清晰易懂应该是重要考虑项,而不仅仅是各种精妙
    cabing
        55
    cabing  
       2020-05-11 13:09:39 +08:00
    这个问题,ruby 之父考虑过,所以有了 ruby
    ConradG
        56
    ConradG  
       2020-05-11 13:40:10 +08:00
    @cabing 读别人的 Ruby 还不一定有读汇编来得轻松(逃
    peachpeach
        57
    peachpeach  
       2020-05-11 13:43:40 +08:00
    是的,尤其是 shit 一样的代码,可读性非常的烂。
    每次解 bug 读到这样的代码,都让人觉得很烦躁。
    尤其是代码风格很烂的,写的时候完全不在意后面是不是有人会读。
    C 语言。
    fkdog
        58
    fkdog  
       2020-05-11 13:53:57 +08:00
    听过一个词吗?
    文人相轻。
    写代码同理,你认为别人写的烂,别人一样认为你写的烂。
    jones2000
        59
    jones2000  
       2020-05-11 14:45:40 +08:00
    读代码也是程序员的一个基本技能, 任何一个已经上线运行 1-2 年的程序的代码都有它存在的意义,就算你重写也需要看懂老代码, 重点就是看他踩过的坑,解决这些坑的代码可能就是代码里面最烂的一部分。
    yuxing1171
        60
    yuxing1171  
       2020-05-11 15:26:16 +08:00
    来,互相伤害。
    siteshen
        61
    siteshen  
       2020-05-11 15:27:48 +08:00
    理解别人的代码确实很困难,因为这不止取决于看代码的人,还取决于写代码的人。

    但要做到以后能理解自己的代码还是能做到的:
    1. 尽量用最高的标准要求自己的代码;
    2. 不那么明显的工具函数会有简单的测试;
    3. 不得不 HACK 的代码会用注释写明原因。

    不夸张的说,我现在还能较容易地看懂我三年前写的代码。
    la2la
        62
    la2la  
       2020-05-11 16:25:11 +08:00
    同感,接手一个业务比较复杂的 python 代码,也没啥高级的语法,但是上来给来了 6 个全局变量,真的吐了。还是多线程的程序,根本不知道什么时候填充,什么时候修改,只能一行行 DEBUG,多线程环境下面 DEBUG 简直吐了
    Orenoid
        63
    Orenoid  
       2020-05-11 16:32:07 +08:00
    有时候适当读点别人的代码,有助于意识到自己的代码烂在哪。。
    NoKey
        64
    NoKey  
       2020-05-11 16:46:28 +08:00
    是不是你们提交 git 的时候,都不好好写 commit 的?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1118 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 344ms UTC 17:09 PVG 01:09 LAX 09:09 JFK 12:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86