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

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

  •  1
     
  •   murmur · Sep 22, 2023 · 14548 views
    This topic created in 1138 days ago, the information mentioned may be changed or developed.

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

    相关的公司只有 200 多人

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

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

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

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

    多跟外包学学自然就会了

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

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

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

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

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

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

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