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

实在忍不住了,接手的代码太 shi 了

  •  1
     
  •   zycpp · 2019-03-15 15:56:27 +08:00 via iPhone · 8896 次点击
    这是一个创建于 2077 天前的主题,其中的信息可能已经有所发展或是发生改变。
    语言 C++

    0、变量命名随意,驼峰、下划线混用。
    1、函数、变量没注释,意思全靠猜
    2、单个函数极长,四五百行的函数随处可见。
    3、c style 和 c++ style 混用
    4、源文件编码混乱,有 u8,u8+bom,gbk 都有
    5、代码冗余,一样功能的函数重复实现好几次,只是换了个名字…
    6、不明意义的数字满天飞,你猜我这里的 128 跟那边的 128 是不是同一个意思?

    溜了溜了
    60 条回复    2019-03-18 08:39:26 +08:00
    hellowmykami
        1
    hellowmykami  
       2019-03-15 16:46:27 +08:00
    打扰了告辞
    mokain
        2
    mokain  
       2019-03-15 17:18:51 +08:00
    花一个月跟头儿说重构代码吧!
    zycpp
        3
    zycpp  
    OP
       2019-03-15 17:22:08 +08:00 via iPhone   ❤️ 8
    @mokain 有一部分就是头儿写的😩
    ifxo
        4
    ifxo  
       2019-03-15 17:24:45 +08:00
    只要结果,不管过程
    yoke123
        5
    yoke123  
       2019-03-15 17:25:02 +08:00
    爽啊
    javaWeber
        6
    javaWeber  
       2019-03-15 17:25:49 +08:00
    我刚进某公司,唉。。
    变量名有拼音,拼音首字母缩写。
    方法名有的大写,甚至还有下划线。
    有的函数居然长达 400 行。
    虽然代码很不规范,但是我没有其他更好的公司选择。
    我之前接触的都是小项目。现在做的项目大了点,有十多个服务模块。
    有点担心需求没法及时完成 。
    learnshare
        7
    learnshare  
       2019-03-15 17:27:14 +08:00
    正常的,而且领导通常不让你优化
    archxm
        8
    archxm  
       2019-03-15 17:27:30 +08:00
    你行的
    finab
        9
    finab  
       2019-03-15 17:28:09 +08:00   ❤️ 1
    不知道为什么,感觉你说的这些问题还不算太 shi ,我完全扛得住
    cookbook
        10
    cookbook  
       2019-03-15 17:29:54 +08:00
    处理这种代码是我的强项,梳理的过程很爽
    TingHaiJamiE
        11
    TingHaiJamiE  
       2019-03-15 17:32:46 +08:00   ❤️ 5
    “能跑的线上代码不要动”
    Kirscheis
        12
    Kirscheis  
       2019-03-15 17:41:38 +08:00 via Android
    小问题。。去年刚参与了某行业一个著名软件的开发,里面上千行的函数随处可见,还有各种早期 C,Fortran 代码的残留。。照样可以硬着头皮写下去。。。
    ily433664
        13
    ily433664  
       2019-03-15 17:42:10 +08:00
    应该是很多人接手过
    983081882
        14
    983081882  
       2019-03-15 17:42:15 +08:00
    我也差不多 把老代码 Java 和 C++都有 翻译成 Java 还不能随心所欲 老代码日志随便打 111 222 333 随处可见 魔法值没注释 简直头大 最可气的看着老代码有的的地有逻辑问题 这是翻译还是不翻译 好挣扎
    uTOmOuk3L6sb4MSI
        15
    uTOmOuk3L6sb4MSI  
       2019-03-15 17:42:27 +08:00 via iPhone
    @zycpp #3 妙哉妙哉
    tcdh
        16
    tcdh  
       2019-03-15 17:44:45 +08:00 via Android   ❤️ 2
    曾经接受过一个内核模块,两千多个全局变量,一个函数最长 3000 行。花了 6 个月才改完。
    across
        17
    across  
       2019-03-15 17:56:20 +08:00
    不是封装太差我就扛得住,上面几个大部分都是风格问题。
    算法或者 MagicNumber,如果没有点注释说明倒是读起来比较累····
    jmc891205
        18
    jmc891205  
       2019-03-15 18:18:40 +08:00
    是 c++的项目的话可以理解
    应该有一段不短的历史了
    说不定还是由一段古老的纯 c 代码发展而来
    Leigg
        19
    Leigg  
       2019-03-15 18:32:21 +08:00 via iPhone
    别乱动,出问题了跑不脱
    dinjufen
        20
    dinjufen  
       2019-03-15 18:50:36 +08:00
    可能是很多人接手过的,都不想改罢了
    l00t
        21
    l00t  
       2019-03-15 18:53:40 +08:00
    能用就行。接手这种状态的代码也是正常情况,用不着惊讶。
    Justin13
        22
    Justin13  
       2019-03-15 18:57:13 +08:00 via Android
    见过 1500 行的类,也见过 1800 行函数(数据引擎)
    iceheart
        23
    iceheart  
       2019-03-15 19:08:18 +08:00 via Android
    这都小问题,到处是全局变量静态变量的才是真的有问题,头文件里静态变量声明才是问题
    w01230
        24
    w01230  
       2019-03-15 19:32:43 +08:00
    换个角度想想,有不少公司代码规范也是不同情况下命名规则不同。
    anyele
        25
    anyele  
       2019-03-15 19:37:12 +08:00 via Android
    这种代码不是正常操作?
    guokeke
        26
    guokeke  
       2019-03-15 19:41:19 +08:00 via Android
    如果向老大吐槽,只会让老大觉得你不够专业。要么硬着头皮搞,要么走。
    zmxnv123
        27
    zmxnv123  
       2019-03-15 20:06:50 +08:00 via Android
    有本书叫程序员的呐喊,提到当接手一个复杂的 c++项目时的解决方法..







    看到 c++想都不用想,赶紧跑路就对了。
    lepig
        28
    lepig  
       2019-03-15 20:26:18 +08:00
    稍微截点图给兄弟们开开眼呐
    AngryMagikarp
        29
    AngryMagikarp  
       2019-03-15 21:16:17 +08:00
    这个应该是好多代程序员的结果。
    chinese_zmm
        30
    chinese_zmm  
       2019-03-15 21:19:10 +08:00 via iPhone
    是维护还是添加新功能继续二次开发?维护建议不要改,针对 issue 解决就是
    noe132
        31
    noe132  
       2019-03-15 21:30:51 +08:00
    我见过 200 多行的 if 套 if,各种重叠 if,里面各种 magic number

    溜了溜了
    timetolo
        32
    timetolo  
       2019-03-15 22:55:45 +08:00 via Android
    感觉像是我刚写完的代码
    timetolo
        33
    timetolo  
       2019-03-15 22:57:08 +08:00 via Android
    @noe132 我见过九级嵌套 if,并且还画流程图了
    jim1002
        34
    jim1002  
       2019-03-15 22:57:13 +08:00
    理解烂代码也是一门技术
    lhr_lovehoney
        35
    lhr_lovehoney  
       2019-03-15 23:01:03 +08:00
    祖传代码 hhhh
    xiaottt
        36
    xiaottt  
       2019-03-15 23:56:45 +08:00
    传家包,不要乱动

    if it works, don't fix it!
    fvckDaybyte2
        37
    fvckDaybyte2  
       2019-03-15 23:57:03 +08:00 via iPhone
    5000 行的 h 头文件路过……
    harde
        38
    harde  
       2019-03-15 23:59:14 +08:00   ❤️ 1
    说点恶心的,我们去公共厕所,厕所里很多屎,气味也很臭,但是我们并不是来吃屎的,我们只要解决自己的,为屎山再贡献一点高度就可以了。。。

    靠。。。我都写不下去了。。。
    Lighfer
        39
    Lighfer  
       2019-03-16 00:02:07 +08:00
    和我去年入职情况一样,画了一个月理清逻辑后像头儿申请重构了,可以看看这个片段:
    https://www.zhihu.com/question/20402322/answer/389075475
    ymcj001
        40
    ymcj001  
       2019-03-16 00:13:57 +08:00
    @timetolo 这算是很良心的了。感谢他吧。
    zwy100e72
        41
    zwy100e72  
       2019-03-16 01:07:39 +08:00
    有耐心留下来重构,没想法换地方也行
    我这边有个 4k 行的 if 了解一下
    DesertCamel
        42
    DesertCamel  
       2019-03-16 01:33:16 +08:00 via Android
    楼主,我跟你的情况一模一样。刚进公司,java 后端,发现接手的代码太烂,而且有一部分烂的就是上级写的。代码随便拷贝,混乱的耦合。第一想法是溜之大吉,但目前福利给到位了,外面也很冷,还在观望,并一步步整理重构
    lvxiang119
        43
    lvxiang119  
       2019-03-16 09:13:11 +08:00
    以前接受一个项目,入口文件 3000+行,优化到 500 行。最后发现无法运行,于是移除了该模块。求夸。
    Moming
        44
    Moming  
       2019-03-16 09:27:09 +08:00 via Android
    我也遇到了,第一次强忍着改了点交差了,第二次还给我这种任务我就直接不干了,看着脑壳疼。。。
    uyhyygyug1234
        45
    uyhyygyug1234  
       2019-03-16 10:31:45 +08:00
    那你是没看过丰田的

    软件设计的基本要求是模块尽量简单化,因为这样可以一来更易于阅读二来更易于维护。但丰田的工程师显然没有遵循这原则。Barr 使用一种工具自动根据代码的可能分支数量评估函数的复杂度,结果是丰田的软件中至少有 67 条函数复杂度超过 50,意味着运行这个函数可能出现超过 50 种不同的执行结果,属于“非可测”级别。因为为了测试这 50 个不同的结果,必须准备至少 50 条不同的测试用例以及相应的文档,在生产环境中一般是不现实的。作为比较,Barr 表示他自己的公司严格执行的其中一条规定就是任何代码复杂度不能超过 30,否则不合格。而在这 67 条函数中还有 12 条复杂度超过 100,达到“非可维护”级别,意味着一旦发现缺陷( Bug )也无法修复,因为实在太复杂,修复缺陷的过程中会产生新的缺陷。其中最复杂的一条函数有超过 1300 行代码,146 个可能执行路径——正好用于根据各传感器数值计算节气门开关角度

    还有一些别的匪夷所思的发现。比如丰田的软件包含了超过一万一千个全局变量。如果你不知道什么是全局变量,那么只需要知道软件设计的一般原则是要尽量少使用全局变量,因为有可能带来无法预测的结果。这里的“少”的意思是“尽量接近零”,绝对不会是一万一千个。
    suzic
        46
    suzic  
       2019-03-16 10:52:07 +08:00 via Android
    0,1,2,5 我接手的项目也存在…
    srt180
        47
    srt180  
       2019-03-16 11:03:15 +08:00
    没有代码审查环节吧……做个代码审查,慢慢改起来……
    heber2211
        48
    heber2211  
       2019-03-16 11:09:10 +08:00
    你大概没有见过把入参反复从 map 里取出来放到 list
    ymj123
        49
    ymj123  
       2019-03-16 11:32:58 +08:00 via Android
    你列的这些还好吧。主要是业务逻辑清不清晰,我以前接手的项目,你说的这些全有,并且还是 shell+Java+Python+groovy 的。业务也复杂。出差去客户那里搞了一个月勉强吃透。
    loryyang
        50
    loryyang  
       2019-03-16 11:39:10 +08:00
    最好的处理办法就是:新需求就膏药贴起来,然后代码质量可以成为各种线上问题、开发效率的无赖挡箭牌
    然后长远就是:开辟新战场,把垃圾交给后来人
    dearxe2v
        51
    dearxe2v  
       2019-03-16 13:56:12 +08:00
    根本原因,钱到位了,si 也是香的
    turi
        52
    turi  
       2019-03-16 14:17:29 +08:00
    溜了 才是正道,吃屎是人吃的吗
    GeruzoniAnsasu
        53
    GeruzoniAnsasu  
       2019-03-16 14:52:26 +08:00
    其实太正常了,会有这样的代码仅仅是因为维护周期太长了而已,并没有什么真的很屎的地方

    风格不统一大不了全 refactor->rename 成顺眼的,别改了一半算了够了不改了就行——上一个人可能就这么想的

    C/C++混用 也太正常了,项目开始之初一半都会想着“啊 C++运行库太臃肿了我们 pure C 吧”然后几个版本之后“啊 C 写起来太慢了移植到 C++吧反正性能不会掉多少”,然后前面那些 C style 的代码还工作得好好的没必要改就留着了

    单函数长有些是没办法,特别是 IO 操作,各种移位拆结构拼指令读写协议字段,或者涉及复杂状态转移而当初又没好好设计状态机模型的,都会变得又长又看不懂,其实个人觉得箭头形 for if for if 都算很好看的了,起码逻辑还是很清晰的,嵌套得再深也说不上复杂,模式是很单一的。那种 reinterpret<uint8_t>(data << 3 | data2>>5&0x3)+(cmd<<16)什么的才比较令人崩溃

    编码混用完全不是问题,甚至源码仓库进去出来就能统一的事,觉得这个是问题倒是暴露了整体水平



    个人觉得就可读性程度来说最难入手的就是上面说的迷之协议的 IO
    bug 可维护程度来说最难的是各种原始无高级封装的多线程代码,那个调起来,最高目标很可能是“两个小时之内不会崩”
    SyncWorld
        54
    SyncWorld  
       2019-03-16 15:20:12 +08:00
    不要说代码 shi 有可能你们的老板和我老板一样 早上定需求 中午出 UI 晚上功能上线呢~~~ 同行理解下
    wd
        55
    wd  
       2019-03-16 16:36:39 +08:00 via iPhone
    先别急骂人 自己想想为什么会进这样的公司 是不是自己也不行
    vevlins
        56
    vevlins  
       2019-03-16 17:00:37 +08:00
    @timetolo 五百行组件 38 个 if,一边抓头发一边写
    Fisonglin
        57
    Fisonglin  
       2019-03-16 17:10:48 +08:00
    随手看了一眼,函数就有 3000 行,二十多年的老项目没办法啊
    conwey
        58
    conwey  
       2019-03-16 21:12:24 +08:00
    @mokain 好巧,前面那哥们也是重构的。
    alikesi
        59
    alikesi  
       2019-03-16 22:12:48 +08:00
    @SyncWorld 头皮发麻
    TingHaiJamiE
        60
    TingHaiJamiE  
       2019-03-18 08:39:26 +08:00
    @harde 话糙的有点厉害...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3193 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:35 · PVG 20:35 · LAX 04:35 · JFK 07:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.