V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
murmur
V2EX  ›  程序员

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

  •  1
     
  •   murmur · 2023-09-22 11:44:56 +08:00 · 12703 次点击
    这是一个创建于 460 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    相关的公司只有 200 多人

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

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

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

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

    多跟外包学学自然就会了

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

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

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

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

    你知道 wuli 外包哥哥有多努力吗,你们非得看到他进监狱才开心吗
    ZZ74
        59
    ZZ74  
       2023-09-22 17:40:50 +08:00
    低代码啊。也许人家也是被坑的,鬼知道低代码里面弄得什么东西
    chenqh
        60
    chenqh  
       2023-09-22 17:42:12 +08:00   ❤️ 1
    看描述理解不了代码究竟是怎样的
    jiuhuicinv
        61
    jiuhuicinv  
       2023-09-22 17:44:49 +08:00
    能跑就行
    chenqh
        62
    chenqh  
       2023-09-22 17:45:56 +08:00   ❤️ 2
    不对啊,你这又不是直接查数据库,用的接口啊,只能怪你接口慢罗,谁知道你们有没有批量查询接口
    o562dsRcFqYl375i
        63
    o562dsRcFqYl375i  
       2023-09-22 17:48:57 +08:00
    @devopsdogdog hhhh 就在找你这句
    cassyfar
        64
    cassyfar  
       2023-09-22 17:50:07 +08:00
    我的表几百万条查询几秒钟,你们是土豆服务器?要么花钱请好程序员,要么花钱上好服务。
    murmur
        65
    murmur  
    OP
       2023-09-22 17:50:17 +08:00
    @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  
       2023-09-22 17:54:22 +08:00
    不对啊,就算没有批量,4W 次是怎么弄出来的,就算每条记录 10 个用户,查 A 系统 10 次,B 系统 10,也就 200*20=4000 次
    kkbblzq
        67
    kkbblzq  
       2023-09-22 17:54:49 +08:00   ❤️ 1
    和水平不行的人共事的确糟心;虽然 LZ 有点拉偏架,不过外包现状如此,不排除外包里有能人,但是外包的低门槛也导致里面菜的比例就是更多;
    murmur
        68
    murmur  
    OP
       2023-09-22 17:56:53 +08:00
    @cassyfar 以后国产化就这服务器了,除非华为点出什么天顶星科技能追上至强或者 epyc 的性能
    bigjack
        69
    bigjack  
       2023-09-22 17:58:54 +08:00
    200 条数据怎么插也不会查询数据库两万次吧
    c6h6benzene
        70
    c6h6benzene  
       2023-09-22 18:00:48 +08:00
    JPA 的话感觉是没写 EntityGraph
    shyangs
        71
    shyangs  
       2023-09-22 19:42:19 +08:00
    馬鈴薯伺服器.

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

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