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

给项目代码埋坑有哪些办法?

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

    如何在项目中埋当时不会发作,离开了一两个月之后会逐渐发作并且还很难排查的 bug 呢?

    初步想到几个

    后端

    • 把全局变量变成私有;
    • 在注释中撒谎误导;
    • 更改日志级别然后将其上传到生产环境;

    数据库

    • 把日期类型改成字符串,然后照常 ORDER BY ;
    • 多用模糊查询让索引失效;
    • 更改某些定时任务插入数据的频率,快速塞满数据库;

    欢迎各位 V2EXer 补充,仅仅用作技术探讨,于此同时也可以避免 bug

    166 条回复    2023-09-27 10:29:52 +08:00
    1  2  
    kkk9
        1
    kkk9  
       71 天前
    与其这样惹上官司不如直接删库跑路
    shmilypeter
        2
    shmilypeter  
    OP
       71 天前
    @kkk9 如果你想踩缝纫机,删库跑路是最快的方式,并且,也没什么用。

    代码有版本控制不可能删掉,数据库大概率有备份,如果买的 RDS ,binlog 的备份粒度很可能是五分钟,你全库 drop 毫无损失。至于服务器,如果也是买的 ECS ,那肯定是有快照的。
    ufo5260987423
        3
    ufo5260987423  
       71 天前   ❤️ 4
    讲个门槛高一点的:用元编程的思路写某一类业务——即给业务写一套 DSL ,然后把 DSL 的高阶逻辑做成宏的形式。这样在后面的开发中难免触发死循环还不好找死循环的原因,笑。
    jatsz
        4
    jatsz  
       71 天前   ❤️ 4
    根据我调试的经验:
    1. 能上多线程,就上多线程。
    2. 能搞分布式(微服务), 就搞分布式.
    3. 按自己爽的方式写代码, 完全不考虑性能因素, 比如用一些高阶函数, 类似 <a list with few items *at first*>.foreach, x.map, etc.
    jatsz
        5
    jatsz  
       71 天前   ❤️ 2
    再加一条:
    4. 增加依赖, 为了一个排序, 引入一个科学计算库.
    chaoschick
        6
    chaoschick  
       71 天前 via Android
    switch 分支中少些几个 break
    levelworm
        7
    levelworm  
       71 天前 via Android
    用不安全的方式加几个 exploitation
    yougg
        8
    yougg  
       71 天前 via Android
    不要直接在经过你手的代码上动歪心思,commit log 追根溯源始终能找到你。

    -然而你可以试试供应链攻击-
    murmur
        9
    murmur  
       71 天前   ❤️ 34
    加班写出来的代码不需要任何技巧全是坑
    wonderfulcxm
        10
    wonderfulcxm  
       71 天前 via iPhone   ❤️ 1
    最重要的是有理有据,让人看不出你是故意的。😂
    laohucai
        11
    laohucai  
       71 天前   ❤️ 1
    多依赖一些已经停更的第三方库就可以了!!
    muooOOO
        12
    muooOOO  
       71 天前 via Android   ❤️ 3
    不用刻意添加,平时写出来的代码已经遍地都是坑了。
    ruanimal
        13
    ruanimal  
       71 天前
    把所有新特性都用上,数据结构和算法都往复杂了搞,接口多封装几层
    xuanbg
        14
    xuanbg  
       71 天前   ❤️ 2
    只要是复杂的逻辑不写注释,估计连你自己过几天都不会了。。。还要踩什么缝纫机

    当然,像我这样容易把复杂逻辑写简单的,就得刻意去做了。嗯这确实有点难度啊。。。不如随便找个能把简单逻辑写复杂的人替我写一下,这种人才我可以一抓一大把。
    Dispatcher
        15
    Dispatcher  
       71 天前   ❤️ 9
    我一般是相信自己的实力,正常写代码就行。肯定都是坑。
    dangyuluo
        16
    dangyuluo  
       71 天前
    写汇编
    chingyat
        17
    chingyat  
       71 天前 via iPhone
    单线程的程序改成多线程,并且不加锁.
    SomeBodsy
        18
    SomeBodsy  
       71 天前   ❤️ 23
    正常发挥就行了,不用刻意
    imzhoukunqiang
        19
    imzhoukunqiang  
       71 天前 via Android
    最恶心的还是搞多线程,用事件去触发,把代码调用链路断开。
    Aboceder
        20
    Aboceder  
       71 天前
    @chaoschick 你这在测试那一关就过不了吧
    jadelike
        21
    jadelike  
       71 天前
    我一般是相信自己的实力,正常写代码就行。肯定都是坑。
    Aboceder
        22
    Aboceder  
       71 天前
    @SomeBodsy 好一个正常发挥,哈哈哈啊哈哈,杀人诛心
    miniliuke
        23
    miniliuke  
       71 天前
    写一些超出自己能力的偶发 BUG 代码:比如随便写个无锁并发容器、写个算法依赖时间增长的一旦机器时间自动同步程序就会出错。利用一些编程中容易混淆的错误:比如队列写入操作用数据满了直接返回 false 的方法导致丢数据、故意不处理一些可能出现异常的地方、多线程使用线程不安全的容器
    gbw1992
        24
    gbw1992  
       71 天前   ❤️ 1
    你正常写就行了
    chendy
        25
    chendy  
       71 天前
    一般程序员正常拉屎就能把后人恶心死了,不用多想
    andytao
        26
    andytao  
       71 天前   ❤️ 2
    希望楼主记住这句话:玩火者,必自焚。

    你觉得工资和你的能力不匹配就换一家跟你匹配的嘛,真没必要故意搞这些事情。

    作为员工,要有老板(主人翁)意识:努力推进工作、思考创新解决办法,提升产品价值,一起做大蛋糕。
    cslive
        27
    cslive  
       71 天前
    List<Map>梭哈
    twofox
        28
    twofox  
       71 天前
    上传修改过的工具库 jar 包到私库
    多用存储过程
    angryfish
        29
    angryfish  
       71 天前
    多引入一些自己的私有工具库。
    RainCats
        30
    RainCats  
       71 天前   ❤️ 23
    @andytao 前面两句话还正常,第三句话暴露了屑老板的本性
    zh584728
        31
    zh584728  
       71 天前
    1. 搞特殊的版本:用新特性 或者 用旧的已经被遗弃的特性
    2. 增加依赖,用一些不知名的模块
    zjp
        32
    zjp  
       71 天前 via Android   ❤️ 1
    正常发挥就行
    tedzhou1221
        33
    tedzhou1221  
       71 天前   ❤️ 1
    @cslive 我们公司的人日常都是 List<Map> 梭哈,这样公司就不能没有我们。哈哈
    chaoschick
        34
    chaoschick  
       71 天前
    @Aboceder 既然我我说了这个例子 自然是在生产中遇到过
    wu67
        35
    wu67  
       71 天前
    把代码写得尽可能多或者尽可能少, 然后不写注释, 神仙难救.
    joyhub2140
        36
    joyhub2140  
       71 天前   ❤️ 1
    不用埋坑的,你把所有听说过的中间件往项目里面塞就行了,项目到最后没有多少人能接过来,知识量太大了。

    你还获得高高手得称号,这不美哉?
    Mystery0
        37
    Mystery0  
       71 天前 via Android
    如果,自己没有离职,然后这堆代码线上出了问题,造成大的损失是不是后面要自己把这些坑一一填好?或者直接强行毕业没赔偿?
    bruce0
        38
    bruce0  
       71 天前
    说一个 go 的, 返回一个 `var err *T` 这样的 error, 快的话,可能一眼就找到了,慢的话可能排查一天也查不出来, 尤其是在 多层函数调用的嵌套里
    chenPiMeiHaoChi
        39
    chenPiMeiHaoChi  
       71 天前
    26 楼什么情况,一时分不出认真的还是反讽?
    Promtheus
        40
    Promtheus  
       71 天前
    我觉得这是个有趣的想法,虽然看上去不太道德。但是往往资本家对你不道德的时候,又没人站出来了。
    Promtheus
        41
    Promtheus  
       71 天前   ❤️ 1
    不过你这几个方法太刻意了 ,一下就查到了。要装的像是自己菜导致的,而不是故意这么写。我觉得比较简单的方法就是搜集下公司历年出的问题,然后照着写。一般这种问题都是运行好久才爆出来的。撑死了就是和前辈犯了一样的错而已
    liuidetmks
        42
    liuidetmks  
       71 天前
    尽量使用新东西,边看 demo 边写那种
    wqhui
        43
    wqhui  
       71 天前
    用 String 代替 enum ,多用 json\object\var ,时间久了没人敢保证自己知道里面究竟有什么东西
    devopsdogdog
        44
    devopsdogdog  
       71 天前
    你能碰服务器或者版本包,你可以手动改代码 不提交 git 服务器。 这种是天花板了
    MaxmillianJ
        45
    MaxmillianJ  
       71 天前   ❤️ 1
    @andytao 员工给蛋糕做大了,老板吃完抹嘴给留点渣不?
    Felldeadbird
        46
    Felldeadbird  
       71 天前
    看你要埋的坑要具有多大的破坏了。推荐结合时间触发需求加逻辑判断。

    if( time > 2022-09-22 && 1 =1 )

    类似这种,1= 1 只是例子,现实中应该是一种业务判断,写代码有时候写等号会只写一个,导致判断恒久生效。

    switch 结构中漏写 break 也行。

    这种逻辑错误是直接影响公司正常运作的。属于隐性破坏。 当然了,要求写测试的团队一般有工具校验出这种问题。

    所以埋坑最终应该以自己实际情况自己整理合适的坑。
    Xbluer
        47
    Xbluer  
       71 天前
    [把全局变量变成私有;]
    反掉了吧
    nothingistrue
        48
    nothingistrue  
       71 天前
    @shmilypeter #2 1 ,如果你不想踩缝纫机,那就别干能导致你踩缝纫机的事。2 ,删库跑路是踩缝纫机的充分条件,不是必要条件。
    MrSheng
        49
    MrSheng  
       71 天前
    不建议这么搞,没必要,以直报怨,以德报德。

    如果真想搞,那就把代码混淆一下,各语言都有方案,相信我,真的会吐
    yeccc
        50
    yeccc  
       71 天前
    mongo TTL 索引
    Fule
        51
    Fule  
       71 天前   ❤️ 4
    故意埋坑最终可能只有 5%影响到了你坑的人/组织,而 95%影响的只是和你一样的其他打工人。所以考虑下有无别的手段吧
    sky857412
        52
    sky857412  
       71 天前
    服务启动时,启动一个后台线程跑任务,然后在特定数据情况下,线程挂掉,后台任务停止运行
    BeyondBouds
        53
    BeyondBouds  
       71 天前
    公司没有 cr ,那可太简单,直接关键业务模块打包成静态库,源代码只有我有....
    hervey0424
        54
    hervey0424  
       71 天前   ❤️ 1
    正常写代码就行了
    skiy
        55
    skiy  
       71 天前 via iPhone
    ?结果苦的是下一个接手的同行。到时接手的同行,直接把坑往 v2 一发…又是一轮的口诛笔伐。
    ?往后的背调不打算过了?
    wuqi5920
        56
    wuqi5920  
       71 天前
    @jatsz
    @shmilypeter 还用埋坑?方法不做拆分。直接一坨,if else 无限嵌套。注释不写,反正写了也没用
    shawnsh
        57
    shawnsh  
       71 天前 via Android
    用 C++写,内存泄漏就够了
    thinkm
        58
    thinkm  
       71 天前
    用人名作为变量名
    int peter = 3;
    double vincent = 1.0;
    Selenium39
        59
    Selenium39  
       71 天前   ❤️ 2
    关键的条件判断处少写一个=号,合理
    dcsuibian
        60
    dcsuibian  
       71 天前 via Android
    要我就不埋坑,何苦为难下个打工人
    mtw
        61
    mtw  
       71 天前   ❤️ 1
    不提议这么做,但是技术方案很多,代码中各种宏,还有 goto 横飞。
    wu00
        62
    wu00  
       71 天前
    为什么要主动去干这种事呢...
    我都是把能填的坑先填了,不能填的提前告知,不然会觉得丢人
    tabris17
        63
    tabris17  
       71 天前
    所有代码写在一个文件里
    MozzieW
        64
    MozzieW  
       71 天前   ❤️ 2
    之前公司出现过开发离职删了几个文件,的确过了几个月才发现问题,排查半天 Git 找到人。

    技术老大人好,内部告知一下捂住了,说人家还年轻。我估计会有人告诉那个开发。

    不然按照我们当时老板的性格,那个人警察上门少不了。

    供参考。
    sakae010
        65
    sakae010  
       71 天前
    多用已经停更的或很老的第三方包就行
    me1onsoda
        66
    me1onsoda  
       71 天前
    操作数据库。大多数情况账号权限混乱,不知道是谁操作的,把索引删了之类的
    WebKit
        67
    WebKit  
       71 天前 via Android   ❤️ 1
    写开源库,然后你的项目引用🌚
    unintialized
        68
    unintialized  
       71 天前
    闭着眼睛直接上多线程, 什么数据竞争, 什么内存一致性, 统统抛脑后.
    ma836323493
        69
    ma836323493  
       71 天前
    能异步处理的全部放到线程里处理, 嵌套, 三行代码单独写一个方法写一个类, 设计模式满天飞, 策略模式和观察模式是最容易挖坑的, 另外反射也给他用上
    dna1982
        70
    dna1982  
       71 天前   ❤️ 1
    “把全局变量变成私有”

    一看这第一句话就是外行写的。
    wednesdayco
        71
    wednesdayco  
       71 天前
    java 的话试试这种
    // \u000d a="world";
    qiumaoyuan
        72
    qiumaoyuan  
       71 天前   ❤️ 1
    正常写就行了,坑不会少,而且确实是无意的,很无辜。
    qiumaoyuan
        73
    qiumaoyuan  
       71 天前
    “把全局变量变成私有”,感谢你对代码可读性的优化做出的努力。

    所以说正常写就行了。
    zidian
        74
    zidian  
       71 天前
    在注释中撒谎误导;

    这不是每个项目都有的么
    token10086
        75
    token10086  
       71 天前
    多用 go to 语句, 变量命名产考 OOoo0o 和 Il1LLll 等形式
    clf
        76
    clf  
       71 天前
    想办法把磁盘塞满()
    jackmod
        77
    jackmod  
       71 天前
    https://softwareengineering.stackexchange.com/q/18454
    单是这一条反着来就够后面的人喝几壶了。
    我因为面对这种代码加了很多工时(
    justin2018
        78
    justin2018  
       71 天前
    1. 代码写成💩山

    2. 重复代码 ctrl+c 和 ctrl+v

    3. API 请求加定时器
    fenglangjuxu
        79
    fenglangjuxu  
       71 天前
    把代码写的高级点 一般人看不懂 多用高级特性 别人不敢动
    MonkeyJon
        80
    MonkeyJon  
       71 天前
    @jatsz #4 你这经验,真好
    RightHand
        81
    RightHand  
       71 天前 via Android
    看组内技术如何,多用设计模式,突然离职。故意埋坑容易被发现,多用设计模式是正当优化
    opengps
        82
    opengps  
       71 天前
    好像有个 github 项目就是这么搞的
    pengtdyd
        83
    pengtdyd  
       71 天前
    把注释删掉就可以了,可以开发一个插件一键删除所有注释
    yousabuk
        84
    yousabuk  
       71 天前 via iPhone
    当然是:数据溢出,内存溢出,条件性的(漏判)进入死循环,条件性的内存非法引用了。
    RightHand
        85
    RightHand  
       71 天前 via Android
    @RightHand 你要相信至少 90%的人是不会/用错设计模式的,再加上奇葩的需求迭代,一定会爆炸
    cstj0505
        86
    cstj0505  
       71 天前   ❤️ 1
    @jatsz 上多线程,还用锁和共享变量来控制并发,哈哈,不用埋,都是坑
    poorcai
        87
    poorcai  
       71 天前
    @SomeBodsy #18 笑死哈哈哈哈,虾仁猪心啊
    wangxin13g
        88
    wangxin13g  
       71 天前
    少写注释,在 java 里用科里化,多用 Map<String,Object>
    Courstick
        89
    Courstick  
       71 天前
    @opengps #82 evil.js ?
    shyangs
        90
    shyangs  
       71 天前
    先和老闆敬酒三杯,再寫. (三杯不夠喝十杯)

    喝完酒後,走路無法走直線,你的邏輯思維也是,但是你卻察覺不到,會覺得我沒醉,在醉酒和宿醉狀態正常發揮即可.
    zypy333
        92
    zypy333  
       71 天前
    不要用任何第三方库,全自己写
    hyperbin
        93
    hyperbin  
       71 天前 via Android
    正常写就行(doge
    Features
        94
    Features  
       71 天前
    国内的话,写个代码,每个月随机几天,200 个线程,超时时间 10 秒,每 100 毫秒请求一次谷歌
    IO 问题基本不占用 CPU ,不占用内存,很难排查
    learningman
        95
    learningman  
       71 天前
    Java 全部 Object ,C 全部 void*,要用的时候再 cast
    join
        96
    join  
       71 天前
    用 rust 或 c++即可。
    wyl986
        97
    wyl986  
       71 天前
    你就正常发挥
    sprite82
        98
    sprite82  
       71 天前
    你可能想找的是这个,但是你要是这么做了,可能是自己承担这个后果。写少了,没什么影响,写多了,肯定大骂哪个鲨笔写的,一看 git 记录:哦,是我写的 🤡

    https://github.com/trekhleb/state-of-the-art-shitcode
    shmilypeter
        99
    shmilypeter  
    OP
       71 天前 via iPhone
    @Promtheus 对,我的意思就是第一要伪装成自己菜导致的,第二要过一段时间才会有很难排查的,并且也影响业务的后果。
    Leung818
        100
    Leung818  
       71 天前
    @SomeBodsy 哈哈哈哈哈哈😂你是可以的
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2695 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 08:55 · PVG 16:55 · LAX 00:55 · JFK 03:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.