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

一个外包同事,插入 200 条数据,调用了四万次人员查询接口

  •  1
     
  •   murmur · 218 天前 · 12312 次点击
    这是一个创建于 218 天前的主题,其中的信息可能已经有所发展或是发生改变。

    插入数据要求工号转 ID 这个步骤,让他调接口去查这个映射,实际上这个查询也不慢,100ms ,反正是一次性操作,这个数据迁移做了再就不做了,查库查表区别不大

    相关的公司只有 200 多人

    按一个记录审批人+干系人 10 个人(很多了,一般流程才五六个节点)算,不缓存,200 条数据也就 2000 次调用

    这个 4w 次我至今没想明白是怎么弄出来的,但是我终于明白 200 条单表操作 1 个小时没做完的原因了

    整个逻辑是这样 ( 1 ) A 系统查询待办主表数据-A 系统查询审批记录(平均 1 个单 5 个流程节点)-查询 A 系统的人员工号-查询 B 系统的工号 ID 映射-插入最终数据(拼接为一条,这里插入是不涉及子表的)

    不是有人再说怎么挖坑还不留痕迹么

    多跟外包学学自然就会了

    第 1 条附言  ·  218 天前
    实事求是而已,并没有贬低外包的意思,但是这个事的确弄的我头大
    第 2 条附言  ·  218 天前
    ( 1 )初步分析了一下人员查询存在循环调用,但是具体实在看不下去了,我是主前端的,真实的数据可能在 2w 左右,有 2w 是之前失败的数据也算了进来
    ( 2 )关于性能:这就是国产化数据库+国产化的现状,以后做类似项目大家用的都这种环境
    ( 3 )关于时间:之前给了 1 个星期时间熟悉,给了数据库表和 API 文档,给跑过接口 postman ,讲过思路,不存在放养
    ( 4 )关于低代码:现在的低代码做企业办公应用又快又好,这东西有自己的场景,最应该担心的是 CURD 程序员
    96 条回复    2023-09-27 09:52:58 +08:00
    AoEiuV020JP
        1
    AoEiuV020JP  
       218 天前   ❤️ 2
    见过类似的,不过我这边是安卓客户端所以影响不大,埋了好多年的坑后来优化的时候发现的,
    就是 for 循环判断里的 i < getData().size(), 循环节里还有一堆 getData().get(i), 然后这个 getData()里面是完整读数据库,
    coffeygao
        2
    coffeygao  
       218 天前
    常规操作,我也遇到过。拼凑一个数组,三层嵌套里面全是 select 哈哈哈哈
    lincanbin
        3
    lincanbin  
       218 天前   ❤️ 12
    合格程序员其实是凤毛麟角的存在。
    onikage
        4
    onikage  
       218 天前 via Android
    强调外包同事啥意思?显得自己一些?
    Daniel17
        5
    Daniel17  
       218 天前   ❤️ 1
    这跟外不外包没关系吧
    murmur
        6
    murmur  
    OP
       218 天前
    @onikage 因为是实事求是
    Narcissu5
        7
    Narcissu5  
       218 天前
    其实很多公司的大数据需求就是这么来的,你想如果查询接口每次都记录日志,一下子就有 40000 条数据可以分析了
    murmur
        8
    murmur  
    OP
       218 天前
    @Narcissu5 你倒是提醒我了,我还得去清理日志表,别到时候日志爆了,本身就是边角料日志部分设计的没有主表日志那么完善
    coderluan
        9
    coderluan  
       218 天前
    如果楼主的逻辑成立,那责任人也应该是决定用外包的领导,或者给这个外包面试通过的同事哦。
    Badlink
        10
    Badlink  
       218 天前
    逻辑没太懂,是说 “A 系统查询待办主表数据-A 系统查询审批记录(平均 1 个单 5 个流程节点)-查询 A 系统的人员工号” 这部分调了 count(代办住表数) * count(审批记录) * count(A 系统人员) 这些次数?
    nothingistrue
        11
    nothingistrue  
       218 天前   ❤️ 6
    这种错误,你只要搞代码评审,或者结对编程,那就很难出现。不把代码评审计入成本时间,或者把成本挤到下班时间,那就别怪搞出来神仙代码。
    TWorldIsNButThis
        12
    TWorldIsNButThis  
       218 天前 via iPhone
    就是没做 batching ?
    bk201
        13
    bk201  
       218 天前   ❤️ 27
    人家就是混口饭吃,也是朝不保夕,被开了还没赔偿,你还能对对方有什么要求。只能怪公司为了节省成本坑正式员工。
    hxy2856
        14
    hxy2856  
       218 天前
    @bk201 被开了没赔偿好惨
    shmilypeter
        15
    shmilypeter  
       218 天前 via iPhone
    估计是连了几张表导致笛卡尔积乘了几次
    gaifanking
        16
    gaifanking  
       218 天前   ❤️ 1
    盲猜 200x200=4w
    devopsdogdog
        17
    devopsdogdog  
       218 天前 via Android
    😏你就说能不能用吧!
    6c67461c562bdc
        18
    6c67461c562bdc  
       218 天前   ❤️ 4
    好奇。。为什么要外包?不就是为了有个背锅的吗?现在不就是背锅时刻?只不过不知道为什么要喷他。。。。
    kangmang92
        19
    kangmang92  
       218 天前
    你优化优化不就来了 kpi 吗
    xingjue
        20
    xingjue  
       218 天前
    合格程序员其实是凤毛麟角的存在。
    Desiree
        21
    Desiree  
       218 天前
    @murmur #6 要不你来做老板
    knva
        22
    knva  
       218 天前
    没事,代码和他有一个能跑就行
    lambdaq
        23
    lambdaq  
       218 天前
    你就说系统跑么跑起来吧!
    encro
        24
    encro  
       218 天前   ❤️ 2
    才查四万,小意思。400 万也很快查给他。。。

    居然要跑 1 个小时,你们服务器是 0.5G 内存吗?
    gfswoquasfasd
        25
    gfswoquasfasd  
       218 天前
    技术不行 你管外包啥事啊
    explon
        26
    explon  
       218 天前
    插入一次查询 200 次,循环一下就是 40000 次
    sun522198558
        27
    sun522198558  
       218 天前
    我觉得挺正常,反正外包同事干着有一天没一天的活 能混就混吧。发奖金了也没人家的
    murmur
        28
    murmur  
    OP
       218 天前
    @encro 国产数据库,国产 U ,再加上低代码本身各种复杂设计,一次接口 100ms 。4 万次不就 4000 秒,那不是一个小时
    nzynzynzy
        29
    nzynzynzy  
       218 天前
    收拾客户之前供应商写 API 对接,不是按照日期范围和 ID 定位数据(是有这两个 API 的),而是把所有历史至今数据请求出来,然后 for 循环按照 ID 找到,每 3 小时运行一次,叹为观止。
    diagnostics
        30
    diagnostics  
       218 天前
    N + 1 ?
    murmur
        31
    murmur  
    OP
       218 天前
    @diagnostics 外包一般是无理由换人,如果是第一周貌似钱都可以赖掉
    grance
        32
    grance  
       218 天前
    我觉得插入一次就查一次很合理,毕竟你不能保证在执行过程中,数据不会发生变化。
    你如果是单次的任务,其实可以写好批量更新的 sql 直接操作。而不是这么循环搞。
    不值得为了单个需求写一个程序,编码测试时间足够处理数据了。
    Erroad
        33
    Erroad  
       218 天前
    这个帖子评论区很好地举例说明了什么是事实,什么是观点
    murmur
        34
    murmur  
    OP
       218 天前
    @grance 低代码的数据库很复杂的,你看到的是一个表,背后不知道是个什么 id 的表名,每个 id 还有一个独立的数据权限,你可以插数据但是重建数据权限这部分很麻烦
    runzekk
        35
    runzekk  
       218 天前   ❤️ 2
    # 31 人家说的是 n+1 次查询,你能想到补偿我也是醉了。 是搞技术的吗,还看不起外包呢。满罐不响,半罐格朗。 其实 lz 可以想一想为啥这种水平的能和你做同事,外包不是理由。
    ljrdxs
        36
    ljrdxs  
       218 天前
    @murmur 国产数据库、国产 U ?大概塔( ZF 是敏*词确实挺离谱的)项目。那就不纠结技术了,烂就烂呗。
    MRG0
        37
    MRG0  
       218 天前
    @runzekk #35 哈哈没绷住
    FakerLeung
        38
    FakerLeung  
       218 天前
    标题应该改成:一个用 macOS 的外包同事才符合你的身份
    murmur
        39
    murmur  
    OP
       218 天前
    @runzekk n+1 你是怎么能把 200 和 40000 联系起来的?
    l502008310
        40
    l502008310  
       218 天前
    先 sleep 以下,能跑起来,二期再优化,没什么毛病。
    ma836323493
        41
    ma836323493  
       218 天前
    看明白了能请外包的项目都是复杂的要死的项目, 每个 id 还有一个独立的数据权限,你可以插数据但是重建数据权限这部分很麻烦, 这我挺都没听过
    janus77
        42
    janus77  
       218 天前
    所以给你挖了啥坑,是慢吗
    如果他是故意的,那你发这个贴肯定是觉得他坏;如果他不是故意的,你发这个贴肯定是觉得他蠢。带上外包这个 tag ,那当然有拉偏架的嫌疑了,也不要怪大家嘴你
    murmur
        43
    murmur  
    OP
       218 天前
    @janus77 你可以理解我拉偏架

    我外包被坑了 3 次,前两个直接让滚蛋了,这个是编程还可以,就是不规范也缺乏技巧,但是他会用 gpt 说明还有一点学习能力
    murmur
        44
    murmur  
    OP
       218 天前
    @janus77 accesstoken 缩写 asstoken ,所有的拼音命名都 n/ng 不分,比如英(yin)语(yu)
    jmc891205
        45
    jmc891205  
       218 天前
    200 * 200 = 40000
    zhongjun96
        46
    zhongjun96  
       218 天前
    昨日新增用户功能。
    前同事写的, 把所有用户查出来,if(日期=昨天)count++
    Promtheus
        47
    Promtheus  
       218 天前
    这是好事啊 如果让老板发现外包比你们还好使 ,你猜你的下场是啥。我发现别人比我菜我都是很开心的,又是美好的一天
    cherryas
        48
    cherryas  
       218 天前
    看明白了,活又急,又全是坑,你需要的是能救火的大神.
    binge921
        49
    binge921  
       218 天前
    没看到代码 我是不会评论的 狗头保命
    diagnostics
        50
    diagnostics  
       218 天前
    @murmur #39 先查出 200 个列表,然后遍历 200 ,每个遍历查一次( 200 ),就是 200 * 200

    这个就是 N + 1
    RainCats
        51
    RainCats  
       218 天前
    有没有可能这是新人写的代码,跟产品还是外包没有任何关系。
    看着这段代码,我倒是想起当年刚入行写过一个三层 for 循环处理数据,印象中好像没有查库操作,换成现在,我直接一个 Map 映射处理,再 get
    imokkkk
        52
    imokkkk  
       218 天前
    想起来刚毕业的时候 递归查数据库组装树的操作了
    darkengine
        53
    darkengine  
       218 天前
    我见过一个接口里把符合条件的 id 找出来(大概几十个),然后在循环里: 连接数据库 -> 用一个 ID 查详情 -> 关闭数据库的 。。。。
    murmur
        54
    murmur  
    OP
       218 天前
    @RainCats 外包哪里有要新人的,都是要有工作经验的
    broken123
        55
    broken123  
       218 天前
    @AoEiuV020JP 哈哈 我就遇到过这种问题,一堆表情包存本地,存了本地数据库 ,就是这么干的
    broken123
        56
    broken123  
       218 天前
    @RainCats 哈哈。我现在也是这样操作 当年还不会用 hashmap ,写 3 层 for 循环
    broken123
        57
    broken123  
       218 天前
    @RainCats 当年 学会写 for 循环 能把代码写出来就已经觉得自己很有成就感了
    GeruzoniAnsasu
        58
    GeruzoniAnsasu  
       218 天前
    @bk201
    > 人家就是混口饭吃,也是朝不保夕,被开了还没赔偿,你还能对对方有什么要求。

    你知道 wuli 外包哥哥有多努力吗,你们非得看到他进监狱才开心吗
    ZZ74
        59
    ZZ74  
       218 天前
    低代码啊。也许人家也是被坑的,鬼知道低代码里面弄得什么东西
    chenqh
        60
    chenqh  
       218 天前   ❤️ 1
    看描述理解不了代码究竟是怎样的
    jiuhuicinv
        61
    jiuhuicinv  
       218 天前
    能跑就行
    chenqh
        62
    chenqh  
       218 天前   ❤️ 2
    不对啊,你这又不是直接查数据库,用的接口啊,只能怪你接口慢罗,谁知道你们有没有批量查询接口
    huangzongzhuan
        63
    huangzongzhuan  
       218 天前
    @devopsdogdog hhhh 就在找你这句
    cassyfar
        64
    cassyfar  
       218 天前
    我的表几百万条查询几秒钟,你们是土豆服务器?要么花钱请好程序员,要么花钱上好服务。
    murmur
        65
    murmur  
    OP
       218 天前
    @chenqh

    ( 1 )需求为 A 系统的流程数据迁移到 B 系统,但是在 B 系统是只读的,A 系统已经停用不再产生数据也不再修改人员结构
    ( 2 ) A 系统和 B 系统的人员的数据库主键都不是工号,但是同一个人工号在两个系统是相同的,人员同步每天半夜执行,也就是说白天上班期间人员的 ID 是不会变的,就算同步了也不会变
    ( 3 ) A 系统采用查库获取数据,B 系统使用接口(访问接口需要 accessToken )插入数据
    ( 4 )迁移的流程数据包括主表单、审批意见,每一个审批单包含 2 条主表记录和若干审批意见表中的记录(可以通过流程 ID 一次查出对应单据的所有审批意见)
    ( 5 )审批意见里的人员需要 A 系统 ID -> 工号 -> B 系统 ID 这样转换后才能插入,所以需要调人员查询接口
    ( 6 ) B 系统插入新数据只需要调用一次插入接口( json post )
    chenqh
        66
    chenqh  
       218 天前
    不对啊,就算没有批量,4W 次是怎么弄出来的,就算每条记录 10 个用户,查 A 系统 10 次,B 系统 10,也就 200*20=4000 次
    kkbblzq
        67
    kkbblzq  
       218 天前   ❤️ 1
    和水平不行的人共事的确糟心;虽然 LZ 有点拉偏架,不过外包现状如此,不排除外包里有能人,但是外包的低门槛也导致里面菜的比例就是更多;
    murmur
        68
    murmur  
    OP
       218 天前
    @cassyfar 以后国产化就这服务器了,除非华为点出什么天顶星科技能追上至强或者 epyc 的性能
    bigjack
        69
    bigjack  
       218 天前
    200 条数据怎么插也不会查询数据库两万次吧
    c6h6benzene
        70
    c6h6benzene  
       218 天前
    JPA 的话感觉是没写 EntityGraph
    shyangs
        71
    shyangs  
       217 天前
    馬鈴薯伺服器.

    2000 年,一位名為佛瑞德·懷特的男子創造了一台用 5 個馬鈴薯為動力的 Web 伺服器,這伺服器每秒鐘僅可以處理 0.2 個頁面請求,也就是說大概 5 秒鐘才能處理一個完整的用戶請求。
    chuck1in
        72
    chuck1in  
       217 天前
    op 公司现在也不招自社员工,统一用外包了吗。
    opengg
        73
    opengg  
       217 天前 via Android
    设计的问题不能光给一个人背,方案是谁出的,有没有 review ,如果都然后一个外包写那么锅是研发组长的
    Bingchunmoli
        74
    Bingchunmoli  
       217 天前 via Android
    @murmur 评价是外包啥都要,只要甲方能过就行, 市场都要有经验的,没经验的大多干外包,一部分转行,一部分自己找到非外包工作(但是有可能是项目外包)
    Yukirito1996
        75
    Yukirito1996  
       217 天前
    @broken123 #56 😭我当年实习的时候, 就是 3 层 for 循环...
    roundgis
        76
    roundgis  
       217 天前 via Android
    @nothingistrue 這種地方有個屁的代碼評審 代碼不崩就當通過了
    jones2000
        77
    jones2000  
       217 天前
    涉及到多这个表的查询,找 DBA 给 sql 或建好视图查询, 开发不管数据库这类的东西,哪是数据部门的事。
    hobbitlhy
        78
    hobbitlhy  
       217 天前
    哈哈,我要是干上外包了,我也这么写,反正都干外包了,能用就行。
    lmw2616
        79
    lmw2616  
       217 天前
    人和代码有一个能跑就行(●'◡'●)
    baton
        80
    baton  
       217 天前 via Android   ❤️ 1
    項目用低代碼就別想著性能好,外包都是拼命的壓榨,哪有時間給你優化,能實現功能就不錯了。而且低代碼的底層邏輯都不知道,一般公司的低代碼平台還是不停迭代的,最開始可能只能用笨方法實現功能,後期才有解決方案。
    kkwa56188
        81
    kkwa56188  
       217 天前
    说回来, 这既然是一次性操作, 4 万也不是什么大数目, 有那个功夫你嫌这嫌那 的, 人程序早跑完了
    aulayli
        82
    aulayli  
       217 天前 via Android
    就问你代码能用不能?能用就行了,人家外包又没你们挣的多,程序能跑就可以了,站在外包人员的角度来说代码优化的再好他也是吃力不讨好,没必要浪费精力。真看不惯,找你们老板谈谈,让他招正式工别用外包了。
    ryd994
        83
    ryd994  
       217 天前 via Android
    @murmur #44 有一说一,我拼音也分不清前鼻音后鼻音。但是我不用拼音做变量名。
    kltt22
        84
    kltt22  
       217 天前
    弄低代码的东西?不要说做,听听就感觉头大。
    jianghu52
        85
    jianghu52  
       217 天前
    我昨天还在做一个数据移行的工具,据说里面有 30w+的数据。还有各种关联表的查询。听完楼主的故事,我瑟瑟发抖。
    yxzblue
        86
    yxzblue  
       217 天前
    只要 不影响 服务,要什么问题吗?
    llsquaer
        87
    llsquaer  
       217 天前
    以我多年外包经验来看...之前有协商没? 没有就按照能跑就行的原则..改得加钱

    记得有一次接外包,数据库不让我动,只能查..有一个需要要批量加 100 多个分类信息.也就 100 多行,我只需要写入后的自增 id 去做映射..我把数据发给对方,过了一会儿我问好了没? 他说马上, 我迫不及待啊,就刷新数据表的去看..发现了神奇的事情, 这个分类是刷新一次多出现一行.....我估摸着难道是他手动在添加??? 所以牛不牛掰所谓..就问能跑不?
    vgbw
        88
    vgbw  
       217 天前
    用国产化的东西就知道是什么类型项目了,外包不很正常?反正只要项目能跑就行了,出了大问题再说
    KENNHI
        89
    KENNHI  
       216 天前 via Android
    功能实现了吗?结果和预期一致吗?分配该任务时有明确的性能指标要求吗?如果上面都没问题的话,那他就没有任何问题,因为你也说了他是外包员工。
    KENNHI
        90
    KENNHI  
       216 天前 via Android
    当然,因为你是客户公司的职员,如果你认为该外包成员影响了你们公司的产品服务质量,或者该成员不具备本项目必须的技术能力,可以向上司报告要求解除与该外包人员的契约,或者要求劳务派遣公司更换人员,这也是客户的权利。
    ljrdxs
        91
    ljrdxs  
       216 天前 via Android
    @chenqh 说到点子上了。调接口,你 SQL 写得好有何用?
    murmur
        92
    murmur  
    OP
       215 天前
    @ljrdxs 调接口别人只要 200 次,水一点的 2000 次,调 20000 次的怎么解释?
    ljrdxs
        93
    ljrdxs  
       215 天前
    @murmur 这我怎么猜?代码、环境,我全都没。我也没动机替你 review 代码。
    但是如果用 API ,SQL 技巧确实没用。我刚才说的是这个。
    yoloMiss
        94
    yoloMiss  
       215 天前
    哈哈哈哈,怎么解释,算你倒霉。
    ivvei
        95
    ivvei  
       213 天前
    @murmur 英语不是 yy 嘛,怎么还打全拼的
    murmur
        96
    murmur  
    OP
       213 天前
    @ivvei 举例子,业务相关当然不会把真实的变量名发出来
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2697 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 10:33 · PVG 18:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.