• 请不要在回答技术问题时复制粘贴 AI 生成的内容
whoami9894
V2EX  ›  程序员

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

  •  
  •   whoami9894 · Mar 31, 2019 · 14435 views
    This topic created in 2773 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    而且您说了这么半天依然没论证您“开发和安全的先行关系”的逻辑
    whoami9894
    whoami9894
    OP
    Apr 1, 2019
    89
    @liuzuo 代码整体感觉确实是分成不同组件层面,但是某些逻辑分散纠结在一起,感觉很难改单个功能
    whoami9894
    whoami9894
    OP
    Apr 1, 2019
    90
    @alexmy 唉我对 PHP 仅仅停留在语法层面,日常也没有拿它开发过项目,所以看着那套范式还是很头疼的
    whoami9894
    whoami9894
    OP
    Apr 1, 2019
    91
    @no1xsyzy 不重构了,感觉我也没能力去重构的比现在好,还是换个熟悉的语言重写吧
    whoami9894
    whoami9894
    OP
    Apr 1, 2019
    92
    @jimrok 哈哈哈不太好不太好
    sannyzeng
    sannyzeng
    Apr 1, 2019
    93
    写代码最重要的还是第一代,不然后面都会给带偏。。。
    encro
    encro
    Apr 2, 2019
    94
    @whoami9894 “代码都看不懂能做安全?”
    alexmy
    alexmy
    Apr 2, 2019
    95
    @whoami9894 我接手的时候,还看了半天语法,我本身是做游戏开发的。
    whoami9894
    whoami9894
    OP
    Apr 2, 2019
    96
    @encro
    你觉得我看不懂就看不懂吧,你这逻辑能力我也是服了,回复全程不讲逻辑无脑杠,block
    whoami9894
    whoami9894
    OP
    Apr 2, 2019
    97
    @alexmy 老师催着这周四前要上线,再慢慢踩坑怕是肯定来不及了
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1437 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 182ms · UTC 22:04 · PVG 06:04 · LAX 14:04 · JFK 17:04
    ♥ Do have faith in what you're doing.