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

体会到那种维护"屎山"的感觉了

  •  
  •   whoami9894 · 2019-03-31 11:24:06 +08:00 · 12691 次点击
    这是一个创建于 1824 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主本科生,这周接手了校宣传部一个比赛网站的开发任务,代码是好几年前祖传下来的 PHP Yii 框架开发,之后每年这个比赛都会加一些新需求,然后每年学生都得修修补补

    今年新加了几个分项,发现整个库表结构都得改,加上架构逻辑看起来很分散(不知道是框架的范式还是设计的问题),某个功能变了五六个文件得连带着改,还有不知道为什么某些表单结构和路由也放在数据库....。

    部署到服务器后上传图片的接口崩了,半天也没定位到 Bug,易班认证的 OAuth2 接口也崩了,(说因为要推广易班所以需要先易班认证才能在本站注册),发现整个代码很多补丁的痕迹...头大 orz

    老师本来告诉我有个功能前面几届都没给她实现,我当时没看项目代码,想着不是多复杂的功能,拍胸脯我今年肯定给她搞定...现在我明白为什么前几年没有实现了

    第 1 条附言  ·  2019-03-31 21:14:55 +08:00
    感谢各位前辈的建议
    97 条回复    2019-04-02 13:28:14 +08:00
    mamahaha
        1
    mamahaha  
       2019-03-31 11:36:07 +08:00   ❤️ 21
    而且以后别人接手这个代码时,你也会被接手者划分到垃圾代码产生者来看待。
    CEBBCAT
        2
    CEBBCAT  
       2019-03-31 11:38:18 +08:00 via Android
    先上 git 私有库,再上重构大法?
    lovedebug
        3
    lovedebug  
       2019-03-31 11:40:02 +08:00 via Android
    重写可能更快。这类校内网站功能又不是很多很复杂。
    reus
        4
    reus  
       2019-03-31 11:40:20 +08:00   ❤️ 1
    重写吧
    whoami9894
        5
    whoami9894  
    OP
       2019-03-31 12:00:33 +08:00
    @CEBBCAT
    @lovedebug
    @reus
    提出过要重写,但老师的认知里从 0 到 1.2 怎么可能比从 1.1 到 1.2 更快
    CEBBCAT
        6
    CEBBCAT  
       2019-03-31 12:03:36 +08:00 via Android
    @whoami9894 快跑!!!
    blackmirror
        7
    blackmirror  
       2019-03-31 12:10:01 +08:00   ❤️ 11
    每个接手都想重写,到最后都是修修补补
    mscststs
        8
    mscststs  
       2019-03-31 12:12:37 +08:00 via Android
    @whoami9894 老师不懂开发,那么老师的意见很重要吗??不懂你们的逻辑
    emmettwoo
        9
    emmettwoo  
       2019-03-31 12:14:53 +08:00 via Android
    @blackmirror 太真实了
    whoami9894
        10
    whoami9894  
    OP
       2019-03-31 12:27:38 +08:00
    @mscststs
    这种项目大家其实都不愿意做,老师又催得紧,所以按自己的意思重写的话最后还得担责任,没有必要
    whoami9894
        11
    whoami9894  
    OP
       2019-03-31 12:29:54 +08:00
    @blackmirror
    刚开始那几年修修补补应该是能用的,之后每年比赛要求都变更,今年变化大新加了几个分项...唉
    Mac
        12
    Mac  
       2019-03-31 12:41:01 +08:00 via Android
    重构呗
    2589595915
        13
    2589595915  
       2019-03-31 12:48:26 +08:00 via iPhone
    老师算什么东西。你觉得该弄就弄。
    mscststs
        14
    mscststs  
       2019-03-31 13:02:32 +08:00 via Android
    @whoami9894 允悲,学校里面做苦力其实还蛮难受的
    hongfs
        15
    hongfs  
       2019-03-31 13:06:15 +08:00
    还好啦,我之前是 asp.net,
    scukmh
        16
    scukmh  
       2019-03-31 13:11:00 +08:00
    又没有钱,没事干嘛给他打工。
    notreami
        17
    notreami  
       2019-03-31 13:48:54 +08:00   ❤️ 1
    钱给够,时间给够。否则按需求改改完事,短板优化原则。

    每维护个"屎山"都重写,浪费时间和精力,最关键 ROI 太低,怎么证明你的能力?
    reus
        18
    reus  
       2019-03-31 13:55:28 +08:00
    @whoami9894 你先做出来,然后拿给老师看,如果做得好,自然就用你的了。学生时期,有这么一个机会,就要抓住。就算最终你的东西达不到要求,不用你的,你还是得到了宝贵的经验啊。
    okjb
        19
    okjb  
       2019-03-31 13:59:12 +08:00
    三年三年又三年,缝缝补补又三年,能用就行
    reus
        20
    reus  
       2019-03-31 14:09:26 +08:00   ❤️ 1
    如果你处理不了,那你就会成为老师口里的“前几届”其中之一
    qinkangdeid
        21
    qinkangdeid  
       2019-03-31 14:27:17 +08:00 via Android
    就像楼上一位兄台说的
    每一位接收者在看代码之后 心里都想着重构
    重构了几个方法后 放弃的概率越来越大
    重构好了 表面上看和以前一样 老板(老师)又不看代码 觉得有什么区别
    你说以前的版本在这个地方有个 bug 老板说你不能修复这个 bug 吗 怎么要重做 还要那么多时间
    你说我这次重构为了以后应对新需求上有更多的灵活性
    老板可能心里还没有任何需求 .......

    总之 领导不挑头的事情 很难重做
    团队团结还好 不团结 重构导致新问题了 锅就是你的了
    大家都说:以前的又不是不能用 的时候就非常尴尬了

    题主倒是可以提一提 看看老师的支持程度
    学习实践的话 题主可以自己私下有时间自己重构 一部分模块 别动老版本就行
    qinkangdeid
        22
    qinkangdeid  
       2019-03-31 14:34:07 +08:00
    @blackmirror 太真实了 真实得不行 每个接手者刚看到代码都会指点一遍前任 这个地方怎么这么写?这里怎么不抽出来 这里多此一举啊 要是我我就不这么做 这代码不能看 垃圾 我来改 改完几个方法后 最后 大都默默的 Ctrl+z......
    xiaomingVTEX
        23
    xiaomingVTEX  
       2019-03-31 14:47:37 +08:00
    @qinkangdeid 太真实了
    kindjeff
        24
    kindjeff  
       2019-03-31 14:56:29 +08:00   ❤️ 2
    vcluopeng
        25
    vcluopeng  
       2019-03-31 15:01:36 +08:00
    如果你的代码可读性高,并能留下详细的开发注释和文档.那么就整个项目重构吧.
    当然也要有信心在老师规定的时间内完成.
    不然就继续舔砖加瓦,毕竟有句古话:没有金刚钻,不揽瓷器活.
    还有记住 霍夫斯塔特定律
    cz5424
        26
    cz5424  
       2019-03-31 15:25:20 +08:00 via iPhone
    新开个项目写新功能,旧的他被慢慢的抛弃
    deepkolos
        27
    deepkolos  
       2019-03-31 15:34:37 +08:00
    我比较幸运,上来就重写
    farseeraliens
        28
    farseeraliens  
       2019-03-31 15:48:30 +08:00 via iPhone
    @CEBBCAT 不明白重构跟 git 什么关系?
    yuhr123
        29
    yuhr123  
       2019-03-31 15:50:04 +08:00 via iPhone
    把需求梳理一遍,用 python 重写。
    e2c
        30
    e2c  
       2019-03-31 16:03:49 +08:00
    新三年,旧三年,缝缝补补又三年

    看你的了啦
    CEBBCAT
        31
    CEBBCAT  
       2019-03-31 16:25:11 +08:00 via Android
    @farseeraliens 一来可以快速回到原来的状态,二来正式开发也需要 git 不是
    encro
        32
    encro  
       2019-03-31 19:14:27 +08:00
    最厉害的程序员就是能将一堆垃圾代码理出条例来。
    我以十多年的经验告诉你。
    encro
        33
    encro  
       2019-03-31 19:20:46 +08:00   ❤️ 2
    我的经验还告诉我,要舍得删除代码,看不懂的都删,直到程序跑不通了再去看(前提是有版本控制),可能你就能看明白以前的代码了。
    明显感觉你是开发功力还不够,需求不了解,不敢去问 boss,不愿意深入思考最有效的解决问题的办法,潜意识找理由放弃。
    如果你把这个任务当做是你毕业前最好的一个练手机会,那么相信你能成为导师最看重的学生,也能在毕业时超过大部分同学。
    x7395759
        34
    x7395759  
       2019-03-31 19:29:37 +08:00
    就一个建议,重写!!!
    Hyperion
        35
    Hyperion  
       2019-03-31 19:33:23 +08:00   ❤️ 1
    当然是偷梁换柱釜底抽薪,写一套寄生代码附加在原来的代码上(在前端还是后端动手脚都可以),然后另外开一个目录跑新写的程序,来提供新的接口啦。

    你说要在页面上新加两行分数?原始模板上直接对着结构写 Vue 的结构和标记,对着主体容器直接一个 new Vue,然后该怎么请求新结构就怎么请求。

    重构这种事情,说说当然是容易的,但上学阶段根本不可能嘛,一没动力二没精力,最后还是吃力不讨好。这种东西刚开始很有热情,但你社团活动不搞了嘛?四六级单词不要背嘛?什么晨跑锻炼不要搞了嘛?
    Alpha486
        36
    Alpha486  
       2019-03-31 19:45:35 +08:00 via iPhone
    这不接手则已,一接手就明白为啥前人连简单的功能都做不好!😂
    sazima
        37
    sazima  
       2019-03-31 20:39:42 +08:00
    给工资吗
    whoami9894
        38
    whoami9894  
    OP
       2019-03-31 21:15:45 +08:00
    @scukmh 没酬劳,团队的任务哈哈
    whoami9894
        39
    whoami9894  
    OP
       2019-03-31 21:16:18 +08:00
    @notreami
    按需求修修补补感觉头大,比重写还累
    whoami9894
        40
    whoami9894  
    OP
       2019-03-31 21:16:39 +08:00
    @reus
    感谢您的建议,决定重写了
    whoami9894
        41
    whoami9894  
    OP
       2019-03-31 21:17:36 +08:00
    @qinkangdeid 重构就不了,本来就不太喜欢 PHP,打算直接重写了。明天先探探老师口风
    whoami9894
        42
    whoami9894  
    OP
       2019-03-31 21:19:05 +08:00
    @vcluopeng
    能不能来得及我心里也没底,我自己不会前端,感觉工作量挺大的
    whoami9894
        43
    whoami9894  
    OP
       2019-03-31 21:21:35 +08:00
    @encro
    确实是我功力不够,而且对 PHP 那套 MVC 范式也不熟悉,
    和导师没关系的,我是做 Web 安全的,Web 开发只是顺带着会一些。帖子说的老师是宣传部的老师,和我基本没什么交集
    ifxo
        44
    ifxo  
       2019-03-31 21:22:14 +08:00
    不用管了,拉泡屎走人
    whoami9894
        45
    whoami9894  
    OP
       2019-03-31 21:22:20 +08:00
    @x7395759
    重写重写走起
    whoami9894
        46
    whoami9894  
    OP
       2019-03-31 21:23:10 +08:00
    @Hyperion
    让我改原来的可能更花时间,而且还痛苦,不如重写了
    whoami9894
        47
    whoami9894  
    OP
       2019-03-31 21:24:27 +08:00
    @Alpha486 木有工资的😂

    @sazima 这下是明白了,年年打补丁,还提什么新功能😂
    encro
        48
    encro  
       2019-03-31 21:43:10 +08:00
    @whoami9894
    连开发都不会,还会安全了?
    encro
        49
    encro  
       2019-03-31 21:53:27 +08:00   ❤️ 2
    整天说重构的,有几种人:
    1,代码没看懂,反正要重构,潜意识已经做好走人准备;
    2,代码看懂了,借重构争取更多时间;
    3,代码看懂了,而且知道重构对自己来说是小 case,时间也能自己搞定和争取到,确信能写出以后更容易维护的代码来。

    切莫忘记很多时候你是无法重构的,比如你面对整个淘宝的代码,你只能一点一点平滑升级,这时才是考验你的架构和能力。
    就如人生不能重来,打好手上现有的牌才是最佳途径。
    ytmsdy
        50
    ytmsdy  
       2019-03-31 22:33:01 +08:00
    如果就维护几个月,那就忍忍吧。
    如果要维护几年,那就长痛不如短痛直接重构吧
    vincexu
        51
    vincexu  
       2019-03-31 22:35:28 +08:00 via Android
    @CEBBCAT 笑出声
    xuanyuanaosheng
        52
    xuanyuanaosheng  
       2019-03-31 22:43:05 +08:00 via Android
    重写吧,正好练手
    siriussilen
        53
    siriussilen  
       2019-03-31 22:48:19 +08:00 via iPhone
    如果是团委学生会之类的老师 我的教训就是千万别干. 他们拿你当苦力还不给钱 变了方法的给你提需求 一旦完不成 他们还会质疑你的能力……
    notreami
        54
    notreami  
       2019-03-31 22:51:45 +08:00
    @whoami9894 完全不需要考虑成本。。。年轻,真好~~~
    learningman
        55
    learningman  
       2019-03-31 22:55:32 +08:00
    @Hyperion 记得原来我在一个 C 项目里边藏了一个 Go 的二进制文件,至今还能用 qwq
    metabot
        56
    metabot  
       2019-03-31 23:00:43 +08:00 via Android
    易班。。这玩意儿。。令人怀念的大学生活
    whoami9894
        57
    whoami9894  
    OP
       2019-03-31 23:25:58 +08:00 via Android
    @encro
    您这样的逻辑就有问题了,安全和开发确实联系紧密比如一些业务逻辑漏洞,但毕竟侧重点相差很远,并没有一个先行后继关系。开发要的工程能力,架构,优化等等安全是不需要涉及的,而安全我举个 bypass 的例子: `"".__class__.__mro__[-1].__subclasses__()[60].__init__.__globals__['__builtins__']['eval']('__import__("os").system("ls")')`

    再有您这句"连...都不会,还会...了?"让人听起来很不是滋味
    whoami9894
        58
    whoami9894  
    OP
       2019-03-31 23:26:58 +08:00 via Android
    @ytmsdy
    维护确实只有几个月,然后就丢给下一届做了,可是据去年的说这老师经常加需求
    whoami9894
        59
    whoami9894  
    OP
       2019-03-31 23:28:20 +08:00 via Android
    @siriussilen
    您猜对了,党委宣传部老师,据说往届的说这老师"屁事"很多,三天两头加需求,确实像个苦力,不过也就当积累经验了
    whoami9894
        60
    whoami9894  
    OP
       2019-03-31 23:29:42 +08:00 via Android
    @learningman
    popen 调用二进制吗,为何不编译成动态库呢
    whoami9894
        61
    whoami9894  
    OP
       2019-03-31 23:31:10 +08:00 via Android
    @metabot
    和超星学习通一样,处处被诟病,几乎没人用,都是上级一厢情愿的推广
    ahhui
        62
    ahhui  
       2019-03-31 23:36:08 +08:00 via iPhone
    如果这项目给钱,而且钱够多,值得你花时间做的话,那就重写一遍;反之随便改改就完了
    zjsxwc
        63
    zjsxwc  
       2019-04-01 07:09:23 +08:00 via Android
    我的建议是请把代码写的更烂一点,最好来个全局混淆,让后来者无法维护
    loading
        64
    loading  
       2019-04-01 07:27:02 +08:00 via Android
    在现有数据库结构魔改,用特殊技巧使用数据库字段,似的能支持新需求,我觉得这个比重写更有挑战性。
    重写其实是另一种逃避方式。
    ytmsdy
        65
    ytmsdy  
       2019-04-01 08:57:08 +08:00 via iPhone
    又不给钱!重写什么啊!!
    spotfg
        66
    spotfg  
       2019-04-01 09:17:55 +08:00
    我今年运气不错,换了家新公司,上来上班第一天上司就说老板要求重构代码,这个月搞定。。。现在 4 月了,搞得差不多了……所以就加班一个月
    learningman
        67
    learningman  
       2019-04-01 09:19:01 +08:00
    @whoami9894 在本地再开一个端口,用 socks 通信
    是社团的项目,基本没有架构。我刚刚扫了一眼发现还有可疑的 pyc 文件
    annielong
        68
    annielong  
       2019-04-01 09:23:11 +08:00
    有时候只能魔改,新建表,把特殊配置全写进去
    guoyuchuan
        69
    guoyuchuan  
       2019-04-01 09:28:21 +08:00
    重构大法
    Seney
        70
    Seney  
       2019-04-01 09:39:14 +08:00
    @whoami9894 那你就直接说开发 1.3/1.4/1.5/。。。 学校这种一般都是编程很粗浅的同学写的,当时可能不知道什么叫工程
    encro
        71
    encro  
       2019-04-01 09:39:27 +08:00
    @whoami9894
    这个算是浅层次安全吧,语法上的,未来很多都要交给机器,
    未来这样的安全岗位应该有限(人数和发展前景),
    高级点的应该是架构级别的。
    架构级别别说不懂开发。
    解决安全问题更多是架构级别的解决。

    比如架构级别防止注入,网络通信安全,防止爬虫。都需要开发基础。
    reus
        72
    reus  
       2019-04-01 09:50:39 +08:00
    @encro 你十几年了连“重构”和“重写”都分不清,还指指点点?
    mogutouer
        73
    mogutouer  
       2019-04-01 09:59:52 +08:00
    所以你以为 重构 这个词是怎么来的
    liuzuo
        74
    liuzuo  
       2019-04-01 10:00:05 +08:00
    如果原代码能做到解藕,就按照要改的功能重写,微服务化。
    如果做不到,就在原有基础上魔改吧。
    cwx391497
        75
    cwx391497  
       2019-04-01 10:02:14 +08:00
    代码是屎山已经不恐怖了, 恐怖的是, 测试和文档也都是屎山
    gscoder
        76
    gscoder  
       2019-04-01 10:05:35 +08:00
    没必要重构,重构会发现有很多细小的功能点,到时候他们会说,之前可以这样这样现在怎么不行了,又不是要长期维护的项目,随便改改就行了
    alexmy
        77
    alexmy  
       2019-04-01 10:35:24 +08:00
    我这也是 5.6, yii1,性能部分重构下,就一个人,才没有精力去重写,现在毕竟稳定,老板其实只要能用就好,并不喜欢重头开发一遍,万一开发出来的又像之前 si 一样怎么办。
    no1xsyzy
        78
    no1xsyzy  
       2019-04-01 10:36:34 +08:00   ❤️ 1
    @whoami9894 #5
    简单地说:这不是 1.1,这是 1.1.0.0.α.zebra.Ⅳ.㎏.勹.г.\frac{ω5}{在吗?}
    要改成 1.2 需要在不改动功能的情况下把那些东西都去掉,也就是需要做很多次换心手术。

    ——每一次重构都是一个未知生物的换心手术:确定边界,取代边界(写测试),替换部件,确认新部件状态良好,还原边界。
    hellowmykami
        79
    hellowmykami  
       2019-04-01 11:00:46 +08:00
    魔改
    zarte
        80
    zarte  
       2019-04-01 11:30:35 +08:00
    有追求就重构
    求稳就在现有基础上打补丁留给下一任。
    jackmod
        81
    jackmod  
       2019-04-01 11:36:01 +08:00
    之前用 jekyll 重构一个大点的静态网站搞了好几天。这活不太好做。
    leekafai
        82
    leekafai  
       2019-04-01 11:37:18 +08:00
    每个人都抱着重写的愿望去维护,所以最后四不像,各有各的风格
    jimrok
        83
    jimrok  
       2019-04-01 11:38:28 +08:00
    注释里不要忘了加"// fuck xxx, FU"
    JimiJimi
        84
    JimiJimi  
       2019-04-01 16:56:41 +08:00   ❤️ 1
    最讨厌学校分配不懂技术还喜欢瞎命令的老师来管理技术部
    所以当年我解散了技术部
    是真的闹心
    whoami9894
        85
    whoami9894  
    OP
       2019-04-01 18:35:17 +08:00   ❤️ 1
    @loading 嗯确实我有点逃避的意味在里面,还是经验能力不足吧....魔改的话对我来说感觉要花更多的精力
    whoami9894
        86
    whoami9894  
    OP
       2019-04-01 18:38:05 +08:00
    @zjsxwc 所以干脆在我手上重写一遍,但随着未来加新的需求修修补补,肯定又会变成现在的屎山
    whoami9894
        87
    whoami9894  
    OP
       2019-04-01 18:40:22 +08:00
    @Seney 我看他的代码风格架构等等可能算是学生中不错的了,但跟工作多年的前辈们比肯定有很大差距。变成现在这样还是因为每年修修补补加上维护者水平不一
    whoami9894
        88
    whoami9894  
    OP
       2019-04-01 18:54:17 +08:00
    @encro 您可能不太了解,说的只是安全的一个片面,pentesting 工程师、reverse 工程师等等,很多安全问题没有办法从大的架构层面解决。而且您关注一下 defcon 等等安全会议,安全研究员们研究的大多就是我说的语言框架层面的新式漏洞,比如 PHP 的 phar 协议

    我们做过 ML 的 WAF 的玩具项目,也了解过市面上想关产品,被 AI 取代完全取代还是很遥远的(真有这一天那么应该 90%职业已经被取代了)

    > 架构级别防止注入,网络通信安全,防止爬虫
    架构级别怎么防止注入我还真不知道,愿闻其详。而举例 SQLi,即使有参数化查询能完全防止,但依然能在各大 SRC 平台看见 SQLi 漏洞,所以基础安全人员不会衰减的。后两样是基础,不太明白您说的不会是什么意思

    而且您说了这么半天依然没论证您“开发和安全的先行关系”的逻辑
    whoami9894
        89
    whoami9894  
    OP
       2019-04-01 18:55:53 +08:00
    @liuzuo 代码整体感觉确实是分成不同组件层面,但是某些逻辑分散纠结在一起,感觉很难改单个功能
    whoami9894
        90
    whoami9894  
    OP
       2019-04-01 18:57:18 +08:00
    @alexmy 唉我对 PHP 仅仅停留在语法层面,日常也没有拿它开发过项目,所以看着那套范式还是很头疼的
    whoami9894
        91
    whoami9894  
    OP
       2019-04-01 18:57:59 +08:00
    @no1xsyzy 不重构了,感觉我也没能力去重构的比现在好,还是换个熟悉的语言重写吧
    whoami9894
        92
    whoami9894  
    OP
       2019-04-01 19:00:04 +08:00
    @jimrok 哈哈哈不太好不太好
    sannyzeng
        93
    sannyzeng  
       2019-04-01 19:37:18 +08:00
    写代码最重要的还是第一代,不然后面都会给带偏。。。
    encro
        94
    encro  
       2019-04-02 09:14:45 +08:00
    @whoami9894 “代码都看不懂能做安全?”
    alexmy
        95
    alexmy  
       2019-04-02 10:10:26 +08:00
    @whoami9894 我接手的时候,还看了半天语法,我本身是做游戏开发的。
    whoami9894
        96
    whoami9894  
    OP
       2019-04-02 13:26:32 +08:00
    @encro
    你觉得我看不懂就看不懂吧,你这逻辑能力我也是服了,回复全程不讲逻辑无脑杠,block
    whoami9894
        97
    whoami9894  
    OP
       2019-04-02 13:28:14 +08:00
    @alexmy 老师催着这周四前要上线,再慢慢踩坑怕是肯定来不及了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1544 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 17:04 · PVG 01:04 · LAX 10:04 · JFK 13:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.