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

终于知道为什么我们开发的时候要把用户当白痴了

  •  
  •   itechnology · 2022-11-11 16:41:54 +08:00 · 11389 次点击
    这是一个创建于 776 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在内部系统开发一个 Excel 导入的功能,用于给公司内部的运营人员导入历史数据,因为这个功能的使用频率不高,历史数据导完就不需要用了,领导决定用存储过程来处理,具体步骤就是先把 Excel 导入到一张临时表中,再在存储过程中将其保存的对应的表里。

    产品跟运营人员确定好导入的模板之后,我就开干了,昨天提供了第一批 Excel 数据,这个时候问题来了:

    1 、运营提供的 Excel 数据比模板多了一列,比如原本模板中是 ABCDE 五列,结果他们在中间插了一列,变成 ABCFDE

    2 、运营提供的 Excel 数据的列的顺序跟模板的不一致,比如原本模板中的顺序是 ABCDE ,他们把顺序变成了 ACBED ;

    3 、有些列是下拉选择的,运营提供的 Excel 数据中部分下拉的值跟模板不一致,比如模板中有个下拉值是“身份证”,运营给改成了“个人身份证”;

    想想连公司内部人员都这样,普通用户估计更“白痴”了。

    第 1 条附言  ·  2022-11-11 17:16:15 +08:00
    补充一下,这个功能在页面上没有体现,也没有在代码中写对应的功能,是通过“LOAD DATA LOCAL INFILE”直接导入到一张临时表,然后再在存储过程中处理的。
    81 条回复    2022-11-12 17:43:48 +08:00
    miaotaizi
        1
    miaotaizi  
       2022-11-11 16:48:10 +08:00
    那是你的使命
    proxychains
        2
    proxychains  
       2022-11-11 16:52:20 +08:00   ❤️ 37
    IBM 的笔记本 CD 支架刚开始被很多用户当作咖啡杯支架用.
    killmojo
        3
    killmojo  
       2022-11-11 16:52:50 +08:00   ❤️ 3
    你永远想不到用户有多神奇,为了不让用户修改格式,光填那几个单元格就可以,保护了工作表,设置了密码。
    结果用户提交一个全新的文件,还嫌弃你保护文件,说“他还百度了怎么破解密码,最后没办法重新做了一个”。
    最后实在没辙,弄在线 Excel ,在线填了直接保存。
    edis0n0
        4
    edis0n0  
       2022-11-11 16:54:05 +08:00   ❤️ 1
    @proxychains #2 这个也不是不可以,至少利用上了 lmao
    aweffr28
        5
    aweffr28  
       2022-11-11 16:55:05 +08:00
    我也有过类似的额需求,我选择用 python 做,python 处理字符串,写这种接近一次性代码比较方便= =

    运营,HR ,行政之类的导入都接过,我只能说能按模板填直接导入不出错的真不多
    preach
        6
    preach  
       2022-11-11 16:55:09 +08:00
    不管是产品(广义上的产品)还是开发都需要看看 “防呆” 这个关键词
    seers
        7
    seers  
       2022-11-11 16:56:56 +08:00 via Android
    不要相信你的用户,处理 Excel 只取列头判断,所以多了少了无所谓,顺序更无所谓
    aw2350
        8
    aw2350  
       2022-11-11 16:57:02 +08:00   ❤️ 14
    你不能用你自己的定视思维去理解用户,你自己做开发,你是知道这里面的逻辑,人家怎么知道列对应列?
    万一人家以前用过列名匹配表列名的,哪怕调换 excel 的列顺序,人家一样可以成功导入
    当你有问题打电话去咨询一些市政问题,或者淘宝客服,你信不信对面的人内心也会骂你 s13?
    leavic
        9
    leavic  
       2022-11-11 16:57:17 +08:00   ❤️ 8
    如果你的程序只能处理固定格式的数据,多一列、换个顺序、差几个字都能崩掉,那这样的程序到底有什么用?
    aw2350
        10
    aw2350  
       2022-11-11 16:59:46 +08:00   ❤️ 1
    人最愚蠢的行为,莫不是以为自己最通透的,别人都是白痴
    yuhangch
        11
    yuhangch  
       2022-11-11 17:01:01 +08:00
    @leavic 模板准备好了,用户把两列数据调换了,还得用程序给它自动纠正过来?这成本也太高了
    aw2350
        12
    aw2350  
       2022-11-11 17:01:58 +08:00   ❤️ 2
    @yuhangch 根据列名映射对应结构字段,难不成 还是 [0][1][2]下标去匹配?
    aw2350
        13
    aw2350  
       2022-11-11 17:04:23 +08:00
    我理解的,这是一个很简单的程序,且用完就废弃,但是这种“简单”是建立在一种共识,一种约定之上的
    起码你先和别人约定好种种规则,字段顺序 ,内容格式 等等等
    往往,这种“简单”需要时间去达成上述的共识
    buyan3303
        14
    buyan3303  
       2022-11-11 17:07:39 +08:00
    原先我想要从自己公司里的数据库里导出数据,到自己本地搭建的 mysql ,
    但是其 ERP 中的产品型号有:
    Z540Y-150LB DN50|A216 WCB
    Z540Y-150LB 2" WCB
    ZA540Y-150(lb) 2"|A216 WCB
    ZA540Y/13Cr-150(lb) 2"|A216 WCB
    闸阀 ZA540Y/13Cr-150(lb) 2"|A216 WCB
    等多种非同一型号

    这个是因为当时 ERP 设计初期,就没考虑过数据统一,且公司后续又更迭了几次型号编制导致的。
    技术渣,用 python 写了一个非函数式的程序,后面直接不想写了。
    itechnology
        15
    itechnology  
    OP
       2022-11-11 17:07:42 +08:00
    @leavic 看我描述的内容,我是通过在数据库处理的,用 MySQL 的“LOAD DATA LOCAL INFILE”来导入临时表,这就意味着提供的 Excel 的列顺序必须与模板保持一致,否则数据就会错乱。因为这个是一次性的功能,领导觉得没必要在代码中专门写一个功能去处理。
    itechnology
        16
    itechnology  
    OP
       2022-11-11 17:11:00 +08:00
    @aw2350 各种规则、字段顺序和内容格式都已经由产品跟运营约定好了,但问题是运营不严格按照这个来。
    tool2d
        17
    tool2d  
       2022-11-11 17:11:07 +08:00   ❤️ 1
    你发个贴的时间,表头兼容的代码都写完了。
    krixaar
        18
    krixaar  
       2022-11-11 17:14:26 +08:00   ❤️ 1
    责任转嫁啊,提供一个模板,随便简单写个导入页面,不按模板填导不进去,多加几个判断就行。数据填错了最终报表数据不对?怪我咯你自己导的。
    aw2350
        19
    aw2350  
       2022-11-11 17:14:32 +08:00
    @itechnology 加一个下载链接,下载模板用的,进入页面之前提示,只能用本页面提供的模板,其他的导入无效!
    dudubaba
        20
    dudubaba  
       2022-11-11 17:15:22 +08:00
    有界面吗?有界面的话可以给前端做,处理好数据再导入后端,什么格式错误啊数据错误啊通通报错,然后再给个链接放下载模版,然后他们失败了肯定老老实实改了(异常是前端兄弟们可能会被骂。。。)
    iold
        21
    iold  
       2022-11-11 17:15:35 +08:00   ❤️ 6
    我遇见最离谱的是,客户下载的模板是 Excel ,上传的时候她传个 Word 。
    edinina
        22
    edinina  
       2022-11-11 17:15:39 +08:00 via iPhone
    有没有一种可能是你开发的时候要让产品尽量易用到任何人上手就可以使用的程度,而不是因为用户白痴
    itechnology
        23
    itechnology  
    OP
       2022-11-11 17:17:01 +08:00
    @dudubaba 没有界面,纯数据库处理
    lovepplforever
        24
    lovepplforever  
       2022-11-11 17:19:32 +08:00 via iPhone
    强类型和编译器报警不也是为了防止程序员犯傻吗?谁没有傻过
    singerll
        25
    singerll  
       2022-11-11 17:20:12 +08:00
    这个问题太正常了,因为你提供的模版虽然是合理的,但业务人员在收集数据时,需要从提供数据中筛选出来你需要的数据,但筛选又太麻烦,格式错的,内容错的,还需要再整理,这些工作占用了绝大多数的时间,到最后一步导入了,肯定是收集成啥就是直接提交啥。
    fournoas
        26
    fournoas  
       2022-11-11 17:27:02 +08:00
    @itechnology #16 约定归约定,容错还是要写的,至少要返回明确的错误信息
    tianyou666shen
        27
    tianyou666shen  
       2022-11-11 17:29:43 +08:00
    严格点判断呗 遇到格式不对的直接打回
    不要期望对方一定会严格遵守格式上传
    sardina
        28
    sardina  
       2022-11-11 17:32:46 +08:00 via iPhone
    按照列名进行解析
    dcsuibian
        29
    dcsuibian  
       2022-11-11 17:35:47 +08:00
    遇到过这种问题。一会儿是多了一张表,一会儿是自己少了一行,一会儿又哪里没填。
    而且同一个 Excel ,表与表之间的格式不统一(内容相同),这一次和上一次的又不统一,而且这个格式还是他们定的。
    1423
        30
    1423  
       2022-11-11 17:50:52 +08:00
    定位问题
    你没把自己定位成给制作给“人”用的软件。而是给其他专家做软件。
    你没把自己的作品定位成人类易用的软件,而是专家需要学习使用的软件。
    至于应当如何定位,如果你说了算,你来定,否则让领导去定位
    cpstar
        31
    cpstar  
       2022-11-11 18:01:15 +08:00
    你永远无法知道用户是拿哪根脚趾头想问题,并且干活的。
    做了一个表,姓名那一列,填的五花八门,什么张空格三就不说了,还有叫“1 、张三”之类的,甚至还有“1 、张三、11010119491001001X”的。
    stevenbipt
        32
    stevenbipt  
       2022-11-11 18:21:50 +08:00
    做多了以后最大的感受是要做好严格的数据校验以及处理好那些经常搞的骚操作
    acctv2
        33
    acctv2  
       2022-11-11 19:02:22 +08:00
    我觉得就算要别人适配你的要求来导入,也肯定要写好校验代码,然后返回错误提示,这是最基本的。
    thtznet
        34
    thtznet  
       2022-11-11 19:08:07 +08:00   ❤️ 1
    不写文档不做培训没有 SOP ,就不要觉得用户是白痴,是实施团队工作没做好。
    kwh
        35
    kwh  
       2022-11-11 19:22:09 +08:00
    。。。
    我真的发现,现实生活中有的人真的是
    智力偏低,百思不得其解。

    大学打荒野行动,当时寝室有四个人,其中一个人 A 说正东方向有一个人,
    然后 B ,就直接去看正东方向(问题很大,平行线不相交),试图去找到那个人,
    由于这个 B ,我平时就感觉他智力偏低(平时也很自信),但是我不认为真有人智力偏低,所以我指出了问题
    想要确认他是不是真的智力偏低。
    然而寝室四个人,对于平行线不相交,有两个反应不过来,还跟我辩论的好一阵,不过其中一个后面反应过来了,大方承认了,另一个在这辩论中渐渐不说话了,估计认识到了错误,又好面子。
    ,但是还有一个人也就是 B 到最后理解不了,我把高中 那些什么极值思维,都说了,草图也画了,但是最后
    B 的结论就是,不知道,不明白,不觉得。

    这件事给了我很大的震撼,是划水上大学为数不多的收获之一,让我明白了有的人真的是智力缺陷。
    Kiriya
        36
    Kiriya  
       2022-11-11 19:24:52 +08:00
    你以为的用法和用户以为的用法区别
    https://www.bilibili.com/video/BV19S4y1b7JG
    adoal
        37
    adoal  
       2022-11-11 20:14:26 +08:00
    需要符合规范的数据来源时,只要允许用户自由输入,就一定有(大量)用户自然而然地不按规范操作。
    要么事后做数据清洗,要么开发有限制的输入界面。
    adoal
        38
    adoal  
       2022-11-11 20:14:45 +08:00   ❤️ 1
    不怕用户智商低,只怕用户自作聪明。
    teenight
        39
    teenight  
       2022-11-11 20:24:50 +08:00 via iPhone
    @kwh 没看懂。看正东方向和平行线不相交有啥联系?
    kwh
        40
    kwh  
       2022-11-11 20:38:19 +08:00
    @teenight A 点正东方有一个人,B 点看正东方,视线是平行的也就看不到同一点了,所以看之前需要确认下队友的位置,进行一定程度的偏移。
    eason1874
        41
    eason1874  
       2022-11-11 20:44:58 +08:00
    想到那个笑话。程序员开了一个酒吧,考虑了各种异常情况,比如一次买 0.5 杯酒,买 9999 杯酒,买 eval(code)酒,买红酒给啤酒钱,买啤酒不给钱,开着坦克来买酒,进门一把火把酒吧给烧了。各种恶意 test 都完美通过,程序员满意地开张了,结果当天酒吧还是崩溃了,因为客人点了一份炒饭
    nebkad
        42
    nebkad  
       2022-11-11 20:56:51 +08:00
    难道这不是因为 excel 对于这个应用场合过于庞大沉重,才导致的问题么?
    换个角度来想,这不是用户的问题,而是微软的问题或者说是微软过于垄断的问题。
    jousca
        43
    jousca  
       2022-11-11 20:56:53 +08:00
    @teenight A 和 B 不在相同位置…… A 发现目标的正东方向,并不在 B 的正东……
    就好比我在四川.你在北京,我往东是重庆市,你往东能到重庆么?
    kongkongye
        44
    kongkongye  
       2022-11-11 21:39:47 +08:00 via iPhone
    让运营自己学习 python 提高生产力
    keith1126
        45
    keith1126  
       2022-11-11 21:47:19 +08:00
    @kwh #35

    两个人反应不过来,一个反应过来承认了,另一个渐渐不说话了,怎么还有一个人 B 到最后理解不了?算数不太对啊
    kwh
        46
    kwh  
       2022-11-11 21:57:15 +08:00
    @keith1126 当时寝室 4 个人,一个提问题的我,两个反应不过来的,一个最后都讲不明白的。有什么算数问题吗 。。。。。。。。。
    jfdnet
        47
    jfdnet  
       2022-11-11 22:03:58 +08:00
    @yuhangch 很明显你没有做过开发
    keith1126
        48
    keith1126  
       2022-11-11 22:15:01 +08:00
    @kwh #46

    你这么解释就行了……我一开始觉得,「最后都讲不明白」应该也属于「反应不过来」的两个人之一
    Hurriance
        49
    Hurriance  
       2022-11-11 22:30:23 +08:00
    为什么后续运营提供的模版跟一开始产品提供的是不一致的,好像需求都没有明确,应该需要产品提供更多的细节吧。
    sevenyangcc
        50
    sevenyangcc  
       2022-11-11 22:49:44 +08:00
    如果不是历史表格导入,还不如前端写个页面让他们一条条填
    PeacePeach
        51
    PeacePeach  
       2022-11-11 23:02:58 +08:00
    根据列名来,但架不住用户给你把列名都改了。
    wenzhoou
        52
    wenzhoou  
       2022-11-11 23:06:33 +08:00 via Android
    所以我们打游戏的时候说 5 点方向的敌人,那都是地图坐标系的。你首先得要有个坐标系。
    wangxiaoaer
        53
    wangxiaoaer  
       2022-11-11 23:48:16 +08:00
    楼上有些认为是程序不健壮导致的也是醉了。

    多次提交、格式不对还能理解,但是你把行列调换、文件调换这种操作不是明显破坏规则的吗?说白了还是素质问题(非贬义),不要一味的责怪程序,否则为了兼容这些所谓的破坏性要产生多少原本无意义的代码,浪费多少时间?边界再宽的兼容都是有限的,今天 v 站不是有个帖子,统计姓司的人数吗,假设这个人员表格有两列,姓、名各站一列,让用户填报,有些大聪明嫌麻烦把两列合起来,你说程序要怎么兼容?
    levelworm
        54
    levelworm  
       2022-11-12 05:33:16 +08:00 via Android
    这个是需求不清楚,最好是先写需求文档然后请用户过会。之后改变需求就不是你的责任了。
    levelworm
        55
    levelworm  
       2022-11-12 05:34:42 +08:00 via Android
    @itechnology 那就没办法了,反正不是你们的责任就行了。
    iam174cm
        56
    iam174cm  
       2022-11-12 07:08:31 +08:00
    建议搜索“知识的诅咒”,人总是会假定对方拥有和自己一样的知识,然后开始采取行动,教育在这方面就是一直在避免这个行为来传播知识,例如总有鸡娃鸡得自己急哭的父母就是很好的例子,当然不排除有些情况对方就是智商低下。最好的办法只能是直接写好规则,规则外的提交全部拒绝并返回提醒对方填错并认真看规则,只要你不急,急得就是对方
    jydeng
        57
    jydeng  
       2022-11-12 08:00:36 +08:00
    我猜这个功能没有测试就上线了。
    crazyweeds
        58
    crazyweeds  
       2022-11-12 08:32:16 +08:00
    所以说,没有表头验证以及数据规则验证吧。。。作为开发,我觉得你也有责任。开发的第一任务就是把用户当作一个系统破坏者,理论包括所有数据入口都应该考虑。
    darrenfang
        59
    darrenfang  
       2022-11-12 09:20:45 +08:00
    系统提示密码已过期,需要重新修改密码,用户还会问怎么不能使用。
    QKgf555H87Fp0cth
        60
    QKgf555H87Fp0cth  
       2022-11-12 09:36:47 +08:00
    表头而已啊,想想数据吧,搞死你,数据内容也要判断吧
    Jessun
        61
    Jessun  
       2022-11-12 09:51:13 +08:00
    1. 程序逻辑上对表格有检查,告诉用户哪里格式不对
    2. 文档写好,告诉别人说,就按照文档的格式来,其余格式一律不管。
    abuabu
        62
    abuabu  
       2022-11-12 09:56:01 +08:00
    难道你这么自信,自己不是别人的用户?
    chrosing
        63
    chrosing  
       2022-11-12 09:57:01 +08:00
    @dudubaba 前端就做了一个上传导入按钮 其他的逻辑判断全是我们后端在做 :doge
    hahaayaoyaoyao
        64
    hahaayaoyaoyao  
       2022-11-12 09:58:43 +08:00
    @kwh 可能你们不在同一个宇宙或说的不是一个几何学 [表情]
    morgan1freeman
        65
    morgan1freeman  
       2022-11-12 10:43:38 +08:00
    很正常,所以 excel 导入这种 一般都是坑,你把模板 丢给 运营或者用的人来填,都会有各种意外的填写,程序再怎么健壮,都没办法预测到所有的情况,因为编写程序的都是人,执行程序的也不是一台高智能机器,所以不可能覆盖到所有情况,,而且说白了 60%以上的代码分支 本身就没什么用,都是为了防止使用者犯傻,
    iAIR
        66
    iAIR  
       2022-11-12 10:48:22 +08:00 via Android
    根据列头来导入表列,而不是根据列顺序导入,这应该是最基本的设计。
    你所用的导入方法只适合导入原本导出且未更改的文件,或固定程序自动生成的文件,不适合人工填制的文件。

    另外你缺少一个足够配合的用户,我以前遇到 SAP 上传各种限制(而且不报错、或报错但不给原因),最后我作为用户自己撸了 VBA 确保生成的文件能直接上传。限制或问题比如:
    * 必须是分号(;)分隔的 csv 格式
    * 数字不能带千分号(或者可以千分号用点、小数点用逗号)
    * 必须是 UTF-8 without BOM 编码
    * 不能少列多列
    * 数据里特定字符会被默默替换掉
    * 末尾不能多空行
    * 一开始 IT 随手给了个旧模板,上传出错才发现有新模板
    * 模板 Excel 有些单元格被设置成错误格式
    * 模板里部分示例是错误的
    * 币种列为特定值时,金额列的对应值会被乘以 100 (文档没提,IT 查看代码才确认有这设计)
    Torpedo
        67
    Torpedo  
       2022-11-12 10:51:40 +08:00
    导入要提供模板,然后导入的时候一定要强校验表头的

    这种需求很常见,做多了就有经验了
    hahaFck
        68
    hahaFck  
       2022-11-12 11:06:01 +08:00
    楼主本是想吐槽一下,结果被喷傻了吧,哈哈。
    tuutoo
        69
    tuutoo  
       2022-11-12 11:31:57 +08:00 via Android
    很正常的 见多了 Excel 里给你多个空格 少个空格 中英文逗号 各种格式 日期处理 一会文本 一会日月年 年月日的
    kwh
        70
    kwh  
       2022-11-12 11:33:48 +08:00
    @hahaayaoyaoyao 也不是说他们不知道平行线不相交,他们知道,初中知识谁不会知道,但是他们无法将这个初中知识应用于荒野行动这个游戏,放到游戏里面他们就理解不了了。
    那两个反应不过来的,说好听点是打游戏真 TM 不带脑子,至于那个 B 则完全无法理解 平行线不相交这个规则 在游戏中是如何存在的,可以说真的是智力偏低。
    说真的,以前我真不认为有人会智商低,充其量就是 脑子里面的知识不如别人 而导致的不知道,但是现实告诉我真的有人智力偏低。
    sarices
        71
    sarices  
       2022-11-12 11:56:20 +08:00
    不常用的我都是建议用户把文件发给我,我来自己导入,经常用的,当然要写程序再导入前验证所有格式,然后让用户预览后再确认导入
    jaggle
        72
    jaggle  
       2022-11-12 12:35:50 +08:00 via iPhone   ❤️ 3
    优秀的程序应该是:程序不需要帮用户做任何事情,你们用数据库导表,就不满足这一点。

    你帮用户做事,意味着你们需要处理异常-沟通-处理异常-继续沟通

    你们至少需要弄一个简单的页面,在上面让用户上传表格,如果出错了,及时显示错误信息在界面上,例如“第三列应当为 身份证号码”


    只要你 catch 到了足够的异常,用户就可以自己去解决异常。
    uvwlab
        73
    uvwlab  
       2022-11-12 12:44:35 +08:00 via Android
    产品开发,不要太自我
    mmdsun
        74
    mmdsun  
       2022-11-12 13:58:38 +08:00
    我是先查询表格头做成 map, 再去匹配用户的 excel 的 即使列顺序不一样也可以。
    imydou
        75
    imydou  
       2022-11-12 14:10:47 +08:00
    @mmdsun #74 用户把表头改了名
    Chisel
        76
    Chisel  
       2022-11-12 14:19:05 +08:00
    我一般会在第一行弄一个大的单元格,把注意事项写到里面。
    shaojz2005
        77
    shaojz2005  
       2022-11-12 15:28:07 +08:00
    要看投入时间和成本,内部使用,我倾向于给运营培训,而不是把这个程序写得很复杂。

    如果外部使用,给 C 端用户用,可以慢慢研究完善。
    690135443
        78
    690135443  
       2022-11-12 17:03:09 +08:00
    所以我在和业务部门的大佬们沟通需求的时候把用户可能会出的问题都提前说明了,业务部门的大佬就会去和用户说必须这样必须那样,严禁这样严禁那样,我自己做的时候就方便多了。
    imycc
        79
    imycc  
       2022-11-12 17:26:38 +08:00
    这种事情,只是约定了格式还不够,参数校验能解决很多麻烦。列数不对的、顺序错误的、表头名称错误的、取值范围错误的,通通在用户提交数据的时候报错,能极大减少沟通、排错的成本。

    让程序兼容、自动纠错、培训用户,都是费时费力的事情,而且也不能阻断后续的错误。
    fox0001
        80
    fox0001  
       2022-11-12 17:39:29 +08:00 via Android
    还不如让运营提供数据,你们自己导进系统。可能代码都不用写。
    Admstor
        81
    Admstor  
       2022-11-12 17:43:48 +08:00
    希望楼主在用一些政务系统的时候,发现你的输入不能有一点点错误,必须一个标点符号都不错

    要记住
    其背后的程序员就和你一样
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1050 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 22:45 · PVG 06:45 · LAX 14:45 · JFK 17:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.