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

大家都是互联网公司的,那么我来分享下企业开发中的黑暗吧

  •  
  •   murmur · 2016-06-17 11:22:39 +08:00 · 8215 次点击
    这是一个创建于 3085 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们的需求很简单,就是用 phantom 映射 pc 端的页面到手机端操作,考虑到目标系统是 IE5+兼容,而且大量的垃圾代码,以及一点都没有的 ajax 操作,所以这个设计也是没什么,毕竟日访问量也就万级别,而且内网+私有机房,资源都不是问题。

    我们假设某个审批有 3 步:

    A 、打开单子,看一眼有什么内容,当然作为脚本这里需要检查一下某些标志元素是否出现,来判断是不是这个人的审批步骤

    B 、选择下一步的流程,这在手机上是一个新页面

    C 、选择下一步谁来审批,这在手机上是新页面,在 PC 端也是新页面不过是 B 步的一个弹窗罢了

    如果整个架构是有状态的,手机端最多也执行三步就够了,但是实际上这个做架构的不知道当时脑袋进水了还是什么问题,做了一个无状态的设计,这个设计把 A+B+C 变成了 A+A+B+A+B+C 六步,具体是这样

    1 、打开单子,向用户返回单据详情,输入审批意见,这个时候后台把审批意见存到临时数据里

    2 、用户在手机上单击“审批”按钮,此时服务器请求上面的 B 步骤,并填入 1 中的审批意见

    3 、用户在手机上选择流程,下一步也存到临时数据里

    4 、服务器扔掉 1 的状态,重新开启一个 A 的页面,输入审批意见,模拟用户进入流程页面,填入流程,并打开选人页面,返回所有可选的人

    5 、用户在手机上选人,下一位审批者也存入临时数据

    6 、服务器扔掉 4 的状态,重新开启 A 的页面,输入意见、下一步流程、审批人、点击确定

    7 、手机端收到成功信息

    那么现在做这个架构的人在深圳某著名互联网公司,我一般很少在背后议论人,但是你作为负责人,搞出这么一个脑残的东西来,实在是忍无可忍,如果这个操作有五步,那么服务器要执行 1+2+3+4+5=15 步,一下就是三倍的负载开销,别说骂了,干死的心都有。那么多资源干嘛用的,用户在操作的时候在后台给他保存一个 phantom 的进程又能浪费多少资源。。。非要搞无状态。

    至于代码,我们来分享一下不涉及秘密的纯功能函数,这个需求很简单,有一个字符串

    AAA ( BBB ) YYYY-MM-DD hh:mm:ss ,其中 AAA 和 BBB 表示纯中英文不含符号的字符串, BBB 的括号是全角括号,后面是一个时间,假设这个格式为 F ,给定字符串:

    F1->F2->F3->F4

    希望得到[{AAA,BBB,H},{AAA,BBB,H}].length=4 ,其中 json 为简写,那么他们是怎么做的呢?

    var lzgc=[];
    var all = $('#sometextbox').text();
    $($('#sometextbox').text().split('->>')).each(function(i){
    //alert('split '+i);
    var a=all.split('->>')[i];
    var lz = {};
    if(a.indexOf(')') > 0){
    var temp = a.split('(')[0];
    if(temp.indexOf('/') > 0){
    lz.who = temp.split('/')[0];
    }else{
    lz.who = temp;
    }
    lz.what = a.split('(')[1].split(')')[0];
    var time = a.split(')')[1];
    lz.when = time.split(':')[0] + ':'+time.split(':')[1];
    //lz.when = time.split(' ')[0];
    lz.when = lz.when.replace('(','').replace(')','');
    lzgc[i]=lz;
    }
    //alert(i+' fenkai '+a);
    });
    

    代码请自行格式化。。。

    第 1 条附言  ·  2016-06-18 07:23:25 +08:00
    我们开发的东西是运行在 phantomjs/casper 上的,要对接的目标系统必须设置为 IE5 模式才能调试运行( IE11 没有 IE6 模式)
    这个对接的目标系统设计的很恶心,检测到 agent 包含 IE 就调用 attachEvent ,然而大量函数样式不兼容..
    关于公司没有什么可以猜的,只是说这个架构很黑暗而已,碰巧入了个深坑,我不是抨击公司的。。
    第 2 条附言  ·  2016-06-18 15:43:29 +08:00
    我日了你们不看补充的么,我们只是对接(你可以理解为使用,维护都不是我做的) IE5+的系统而已,做 IE5+我早跑了好吧,我们自行开发的东西只要求 IE8+就可以了。
    36 条回复    2016-06-19 20:27:13 +08:00
    xiamx
        1
    xiamx  
       2016-06-17 11:42:47 +08:00
    所以楼主你有空打了这么多字,为什么不去 Fix it...
    murmur
        2
    murmur  
    OP
       2016-06-17 11:46:02 +08:00
    @xiamx 所有的代码都是复制粘贴,没有任何复用,同样的代码有几百个 copy ,而且不知道每个里面有什么改动~
    tjxjj
        3
    tjxjj  
       2016-06-17 12:17:56 +08:00
    资源不是问题,那就使劲用呗,到时再优化下(一般就是推翻重做了,重新开发个 app 都不是啥事)
    这都不是啥事,经历了国企的软件开发,那才叫黑暗
    murmur
        4
    murmur  
    OP
       2016-06-17 12:20:53 +08:00
    @tjxjj 是 基本上如果架构烂了就没有优化的可能都是推翻重做 问题是推翻也得有钱才能推翻啊。。。没钱推翻这么烂还要维护才是坠痛苦的
    BSD
        5
    BSD  
       2016-06-17 12:27:16 +08:00   ❤️ 1
    我所见到的程序员们面对这一质疑,一般都是回一句:“那么多计算资源(CPU/RAM)买的就是拿来用的,不用就是浪费!”
    satifanie
        6
    satifanie  
       2016-06-17 12:32:04 +08:00
    我只想说,这种让人恶心的想吐。万人坑。 怎么不提,他们当初开发调试都没有的,盲写代码的段子呢。
    Cu635
        7
    Cu635  
       2016-06-17 12:51:04 +08:00
    @xiamx
    因为你没有经历过,不知道 Fix it 或者重构在中国人的公司里面绝不是一个技术问题……


    @tjxjj
    估计这个比部分国企还要黑暗。
    FrankHB
        8
    FrankHB  
       2016-06-17 13:10:32 +08:00
    @BSD ——“不是你买的闭嘴。”
    不过说实话,其实和程序员也没太大关系……
    就是作为最终用户买的也该自裁,很多市场就是被这坨逗比代婊了主流配置而搞烂的。合着真正搞对需求的用户计算成本的时候反而还得迁就这种惯坏逗比用户的行情花冤枉钱才叫正义了?
    jatesun
        9
    jatesun  
       2016-06-17 13:14:51 +08:00 via iPhone
    这要是以后出点啥问题要改代码就有点玩了
    ma125125t
        10
    ma125125t  
       2016-06-17 13:36:20 +08:00
    如果你能明白这个道理,你的上级比你更清楚。
    不改至少还能正常运作,要是改出问题你还想不想混了。
    murmur
        11
    murmur  
    OP
       2016-06-17 13:38:34 +08:00
    @ma125125t 是,所以填坑的只有发牢骚的分,而这个维护效率 efficiency...
    thinkif
        12
    thinkif  
       2016-06-17 13:46:30 +08:00
    Quick And Dirty ,一般还都会说先跑通然后再重构之类的,然后就没有然后了
    ren2881971
        13
    ren2881971  
       2016-06-17 14:02:48 +08:00
    @BSD +1
    talent
        14
    talent  
       2016-06-17 14:10:11 +08:00
    默语君,会不会待会儿出现一个《我就是那个深圳某著名互联网公司做架构的人》的帖子...
    learnshare
        15
    learnshare  
       2016-06-17 14:12:28 +08:00
    我以前会手动 copy 一份代码,改改名字,然后给新客户启动一个服务
    bk201
        16
    bk201  
       2016-06-17 14:37:29 +08:00
    看着吃力
    fyooo
        17
    fyooo  
       2016-06-17 17:10:41 +08:00   ❤️ 1
    IE5+兼容??? 可怜的娃啊
    samael
        18
    samael  
       2016-06-17 17:17:59 +08:00   ❤️ 3
    murmur
        19
    murmur  
    OP
       2016-06-17 21:08:47 +08:00
    @fyooo 我们只是维护而已基本不开发了 就是配一下
    broadliyn
        20
    broadliyn  
       2016-06-17 23:39:50 +08:00   ❤️ 1
    哈哈,其实刚开始我刚进公司写代码的时候,也发现很多项目里有好多坑。

    做的一个后台内容管理系统,因为没有专业的前端所以开发这个系统的界面部分也是后端做的,那 js 代码,,怎么说呢,写的非常乱、杂,一看就是专门写服务端的人写的(虽然我也不是个专业前端的,但是至少 js 还是有专门实践过一段实践的)。写一个小的界面组件,写两 function ,一个 div display:none ,然后包进 jquery , jsp:include 进来,最让人郁闷的是 http header 里塞了一堆的 js 、 css ,然后所有界面都 include ,导致这个后台体验不算好,也一直想提使用一些 vue.JS 之类轻量级的框架,不过因为以前没啥话语权也就没多说什么了,原先怎么写的,我也就照着写,力求不造坑。但是随着项目的迭代,发现如果继续按照原来那样写,后边就根本没法维护,后来忍不住最近终于提出我的想法了,不过开会的时候其他个别的想法的是学习成本高、项目使用不稳定。。。(其实言下之意就是:能用就行,不想折腾那么多,学新东西太费劲)。如果说服务端上个新框架啥的,这个肯定是需要考量的,但是对于前段界面框架这种把稳定性挂钩在一起我就感觉无力吐槽了,就好比你跟我说 jQuery 上了会不会不稳定一样。。前端框架在易用性、可选择性上来说比什么 mybatis 、 hibernate 、 spring 什么要高多了。又不像换个语言框架把服务器弄蹦了跑不起来。

    对于重构这块,就我工作这两年下,体会还是比较深的。我最感叹的一点就是,人与人之间的追求都是不同的,有的人是为了完成功能完成任务,而有的人会尽善尽美,你很难说这两种是对还是错。之前我觉得自己也算是尽量做好一件事的人吧。但是有时候真的,想去做好这件事很难,明明这地方代码写的不好,你又总不好意思动他代码,动了出问题了容易把锅吸到自己头上,所以有时候为了不去碰这个坑,反而往往自己绕着弯搞了另外一堆坑,有时候我都为因为将来接手我代码的人感到自愧。。怕他们说我代码写的烂。。。。因此在一个没有代码规范,没有代码 review ,为了完成功能不去想着程序可扩展性、健壮性的情形下,实在是很头疼,以至于我现在维护原来的代码的时候,也是怎么快点完成就怎么写,因为那堆代码真的有时候自己改着都觉得满满的挫折感,很痛苦写完就不想再看一遍,完全没有自己以前写代码的那种成就感。
    ryd994
        21
    ryd994  
       2016-06-17 23:41:17 +08:00 via Android
    惨了,这样的需求,我下意识觉得不用 regex 做不出来
    mengzhuo
        22
    mengzhuo  
       2016-06-17 23:44:31 +08:00
    深圳某著名……难道是我厂……
    ZhaiSoul
        23
    ZhaiSoul  
       2016-06-18 00:25:48 +08:00
    重点……不是 IE5+兼容吗……
    coolair
        24
    coolair  
       2016-06-18 00:32:32 +08:00 via Android
    企业?审批?太极?东软?浪潮?
    afxcn
        25
    afxcn  
       2016-06-18 00:39:59 +08:00 via iPad
    做自己能做的,改变自己能改变的。
    msg7086
        26
    msg7086  
       2016-06-18 05:41:31 +08:00
    @xiamx lol 公司里的 bug 不是你想 fix 就能 fix 。
    我这 git branch 里堆了二十多个 fix/refactor/optimize ,然而 supervisor 不批你就不能 merge 。
    murmur
        27
    murmur  
    OP
       2016-06-18 07:26:54 +08:00
    @ZhaiSoul 其实 IE5+没想象中的那么难,就是丑而已,所有需要复杂样式的东西都用图片做(反正企业应用就不缺带宽),稍微复杂一点的功能直接下发策略把网站加白名单,调用各种 script object/activex 就可以了,排版大量的表格,也就是退回 div 之前那个年代
    visonme
        28
    visonme  
       2016-06-18 09:56:43 +08:00
    多少能理解楼主看到这种系统设计后的心情。
    曾经的喔也有改变世界的想法,后来发现做好自己的事情就可以了
    renzhn
        29
    renzhn  
       2016-06-18 10:07:09 +08:00
    让我想起以前给学校正方教务系统做移动端 API 时也是这么做的,比如我需要给移动端提供查选课的接口,服务端需要模拟登录教务系统=>点击选课=>选择课程=>选择老师。我提供的所有接口都是无状态的,甚至客户端每次要提交教务系统的账号和密码。为什么要这样?因为 It just works! 在服务端重用会话的确能减少开销,但是服务端和客户端会话并不同步,还会带来别的问题。这种模拟登录的方式本来就很低效,不指望对性能有很高的要求,能用就好
    xbb7766
        30
    xbb7766  
       2016-06-18 11:27:21 +08:00 via Android
    能想出这种流程的也是国宝级了😱估计是多年累积的代码,懒得重构,反正可以用,谁重构谁就可能背锅。这就是为毛某些贵的要死的商业软件会那么慢。

    重点是: IE5+!!!比尔盖子简直要感动到泪崩了。
    daysv
        31
    daysv  
       2016-06-18 11:32:12 +08:00
    选择做产品的好处就体现出来了
    zaishanfeng
        32
    zaishanfeng  
       2016-06-18 11:48:28 +08:00 via Android
    呵呵 ie5+你还呆在那干嘛 自己约的炮 含泪也要打玩
    murmur
        33
    murmur  
    OP
       2016-06-18 15:35:04 +08:00
    @zaishanfeng ...看我补充,这是对接外部系统,我们自己开发的系统是 IE8+兼容就可以
    ncwhale
        34
    ncwhale  
       2016-06-18 16:56:54 +08:00
    哦,好强大的系统喵~完全看不懂在干嘛喵~反正服务器资源有,就随便用好了喵~
    tinyproxy
        35
    tinyproxy  
       2016-06-19 08:45:53 +08:00 via iPad
    就没人提,一个好的产品经理很重要么
    Tim007
        36
    Tim007  
       2016-06-19 20:27:13 +08:00
    @samael 你这个图很好,我必须要顶一下!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3121 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:00 · PVG 22:00 · LAX 06:00 · JFK 09:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.