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

为什么 left-pad 只有 11 行代码,也能成为众多库的依赖?

  •  
  •   mthli · 2016-03-24 09:57:57 +08:00 · 12126 次点击
    这是一个创建于 2948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    首先申明,本人没怎么写过 JS ...

    https://github.com/azer/left-pad

    不算空行的话, left-pad 真的只有 11 行,当然再处理一下可能几行就搞定了。

    那么问题来了,为什么这么短的代码,也能成为众多库比如 RN 的依赖?

    难度人们已经懒到这种程度了?

    第 1 条附言  ·  2016-03-24 23:34:06 +08:00
    52 条回复    2016-04-04 19:00:03 +08:00
    yangxiongguo
        1
    yangxiongguo  
       2016-03-24 09:59:25 +08:00   ❤️ 1
    mthli
        2
    mthli  
    OP
       2016-03-24 10:00:42 +08:00
    @yangxiongguo 有点意思。
    yangxiongguo
        3
    yangxiongguo  
       2016-03-24 10:02:42 +08:00
    @mthli
    感觉我在 “以己之矛攻己之盾”
    ChiangDi
        4
    ChiangDi  
       2016-03-24 10:03:02 +08:00
    这是很好的,看看 SICP 第一章。
    v1024
        5
    v1024  
       2016-03-24 10:24:48 +08:00
    让自己的代码只做最重要的事。
    这儿一个 11 行,那一个 11 行,多了之后弄个 utils ,臃肿,也不专注。
    shyling
        6
    shyling  
       2016-03-24 10:26:50 +08:00 via Android
    是的~模块化本身就是人懒。。有什么不好的嘛
    chmlai
        7
    chmlai  
       2016-03-24 10:40:06 +08:00
    npm 的小模块哲学
    Wangxf
        8
    Wangxf  
       2016-03-24 10:41:04 +08:00
    这是多米诺骨。。。首先开始写一个项目的用了这个包再发包,然后另一个程序猿用了这个程序猿的包,再另一个程序猿,如此往复下去,你就会发现某个大型项目居然会有你的包,而你的包出问题有可能导致整个项目挂掉,说到底所谓 unix 哲学虽然讲究只做好一件小事然后集合小事办大事,但是某个人对于这么多所有的小事是无法掌控的,
    daysv
        9
    daysv  
       2016-03-24 10:41:59 +08:00
    @shyling 然而懒才是发展的第一驱动力
    magicdawn
        10
    magicdawn  
       2016-03-24 10:44:44 +08:00
    @Wangxf

    然而我敢说 Node.js 中 100% coverage 是最多的。。。
    zhujinliang
        11
    zhujinliang  
       2016-03-24 10:49:35 +08:00   ❤️ 2
    假设我需要处理字串了
    首先我要先去 google 搜索一下应该用什么包
    然后我要看看这个包应该怎么调用,至少要读一遍 readme 吧
    然后 install ,写引用,写调用
    怎么看也不如自己写两句话来的快啊

    好吧,假设从性能考虑,毕竟 string 操作会牵涉出一大堆问题
    a 包说我是 fast left pad
    b 包说我 3x faster than A
    c 包给出了 benchmark
    ...
    开始晕了,我觉得还不如从算法开始调研呢

    后期维护考虑,一个组件总有机会得到性能提升的吧
    然而我在 golang 上的体验是,妈的这个包又不兼容了,编译不过都是给面子的,有时候得跟进包里调试,最终你会发现辣个人不经意地改了某处导致你的程序 bug
    wingoo
        12
    wingoo  
       2016-03-24 11:16:16 +08:00
    而且这边会有一个问题, 就像这次 left-pad 包挂掉一样, 如果某个深度依赖的包被黑(被黑的意思是不管你指定啥版本, 啥版本我都给污染了)
    那么会不会有很大的安全风险?
    sox
        13
    sox  
       2016-03-24 11:19:27 +08:00
    @zhujinliang 如果是相对简单的包,那了解如何使用也很快,而且测试、维护成本更少。如果是实现 重要功能的模块花费更多时间熟悉也是有价值的。
    bramblex
        14
    bramblex  
       2016-03-24 11:22:45 +08:00 via Android
    Monad 定义还只有两行呢…但是绝大多数程序员都搞不懂
    allan888
        15
    allan888  
       2016-03-24 11:33:50 +08:00
    @zhujinliang 人家写了 11 行,你自己写真不见得只要两句话。
    字符串长了是个合格的程序员总会想想效率吧,而你自己写的还得好好想想到底高效不高效。
    举个例子,假如 left pad 也许有什么黑科技,用了一些普通人根本看不懂的 trick 写了个特别高效的算法,那么用的人肯定很多,你用大家都用的就得了,管那么多干啥,反正至少不比你自己写慢。
    然后你觉得这个算法不可能有黑科技,那大多数人怎么知道没有,确定“没有”更好的算法要求的功力根本不比知道更好的算法低。
    用库的话基本上至少库里面那部分都是“优秀”的,你自己写的话不能保证,就这么简单。。
    martianyi
        16
    martianyi  
       2016-03-24 11:36:47 +08:00
    如果这次不是 11 行的 left-pad 而是 1100 行的大包被撤了引起恐慌是不是你就不会问这个问题了?

    我引 11 行的三方库和引 1100 行的三方库有区别吗?都是为了解决我的问题而已。
    mthli
        17
    mthli  
    OP
       2016-03-24 11:45:26 +08:00
    @allan888
    @martianyi

    在我看来这样的代码可能使用 Gist 更合适。
    SourceMan
        18
    SourceMan  
       2016-03-24 11:46:25 +08:00
    现在是一行( N 多 NPM 包不包括头尾,只有一行),你确保以后为了兼容不会变成多行?
    然而,我们为什么要关心实现它需要多少行,直接使用它就好了。
    让它变成一个黑盒,通过项目本身大覆盖的测试用例保证可用性
    xgfan
        19
    xgfan  
       2016-03-24 11:48:09 +08:00
    前端毕竟走在潮流前端,新时代的搬运工。
    11 行的包都需要引入,都不用考虑整个项目的掌控问题吗?
    allan888
        20
    allan888  
       2016-03-24 11:52:25 +08:00
    @mthli 这样的 gist 多了以后需要来个谁统一管理一下不?
    aivier
        21
    aivier  
       2016-03-24 11:58:10 +08:00
    @xgfan 对于那么多昨天出设计图今天出模板明天晚上就要上线的产品还真没那么多时间考虑这些....
    jsonline
        22
    jsonline  
       2016-03-24 11:59:57 +08:00 via Android
    楼上们,请问多少行才能作为包?
    mthli
        23
    mthli  
    OP
       2016-03-24 12:02:00 +08:00
    @allan888 如果是我的话,这样的代码更偏向于直接拷贝到项目中,不是很喜欢很多依赖,对项目的掌控性更强吧。
    ChiangDi
        24
    ChiangDi  
       2016-03-24 12:06:30 +08:00 via Android
    @jsonline 1 行
    learnshare
        25
    learnshare  
       2016-03-24 12:09:52 +08:00
    复用代码, npm 就是为了这种需求才存在的
    zhujinliang
        26
    zhujinliang  
       2016-03-24 12:11:20 +08:00
    @allan888 有道理
    ibigbug
        27
    ibigbug  
       2016-03-24 12:28:20 +08:00
    @allan888 这个库优秀在哪了
    ibigbug
        28
    ibigbug  
       2016-03-24 12:28:58 +08:00
    @martianyi 当然有区别, 1 === 10000?
    MaiCong
        29
    MaiCong  
       2016-03-24 12:38:07 +08:00 via iPhone
    懒癌,现在随随便便安装一个模块, node_modules 里面全是一大堆的依赖。
    martianyi
        30
    martianyi  
       2016-03-24 12:55:27 +08:00 via iPhone
    left-pad :怪我咯
    bramblex
        31
    bramblex  
       2016-03-24 13:15:41 +08:00
    我还真不知道有这种东西,我都是自己手写的。

    然后我自己写的是给一个 block 加 left pad 的……比他不知道高到那里去了 /w\
    msg7086
        32
    msg7086  
       2016-03-24 13:28:27 +08:00
    @mthli 拷贝到自己的项目当然可以了。
    然而上游的错误修复你来跟进?
    一个项目引用十几个小包全部你来跟进,那上班还要干其他活么。
    如果特别闲的话当然是可以这么做的。
    sox
        33
    sox  
       2016-03-24 13:31:09 +08:00
    NPM 是辣鸡,现在开始使用 Twitter 作为包管理系统

    https://gist.github.com/rauchg/5b032c2c2166e4e36713
    mthli
        34
    mthli  
    OP
       2016-03-24 13:34:48 +08:00 via Android
    @msg7086 这要权衡利弊吧。没有足够的理由说服我自己能引用这样的库到项目里。而且出了错自己也能很快定位。
    allan888
        35
    allan888  
       2016-03-24 13:37:53 +08:00
    @ibigbug 没说他优秀。
    我是说你尽量都用库“一般来说”“至少”不会比自己写的差。
    而且在某个你认为很简单的没几行的库里面,你很可能已经享受到大神写的算法带来的好处,这种没必要去一一鉴别,只需要从统计角度来说用库更有好处就足够了。
    msg7086
        36
    msg7086  
       2016-03-24 13:38:33 +08:00
    @mthli 公共的东西提取出来模块化对构建大型软件有帮助。
    就算是你自己写一份,通常也是提倡封装成单个 library 或者库的,也就是像这位库作者一样单独拉出一个项目来。
    poke707
        37
    poke707  
       2016-03-24 13:49:50 +08:00
    @sox 我想起了有个 twitter-sort
    mthli
        38
    mthli  
    OP
       2016-03-24 14:01:24 +08:00
    @msg7086 其实要做类比的话, left-pad 可能就是 Apache Commons 里面的一个方法而已..
    fanTasy
        39
    fanTasy  
       2016-03-24 14:03:46 +08:00
    @sox 然后这条推被删了就懵逼了 23333
    poke707
        40
    poke707  
       2016-03-24 14:05:33 +08:00
    先不说 NPM 。若在多个项目之间有复用模块的需求,只是 copy-paste 到代码里面,有修改的时候每个项目都要改一次,你不希望让维护更简单高效吗?

    NPM 可以是一种方案,怕被撤了被黑了或想要掌控的话可以自建 registry 。

    不过主题说的意思貌似是 LOC < x && 'too simple' 所以是否应成为模块。这个 1L 可解答。

    理解错了还望指正。
    cc7756789
        41
    cc7756789  
       2016-03-24 14:19:12 +08:00
    我多加了几行代码: https://github.com/ZhangHang-z/string-pad (/ □ \)
    thcode
        42
    thcode  
       2016-03-24 14:19:29 +08:00
    第三方的包真不是随便就可用的啊

    https://github.com/tjmehta/is-positive-integer


    | Version | 1.0.0 | 2.0.0 | 3.0.0 | 3.1.0 |
    |---------------------------|-------|-------|-------|-------|
    | isPositive(1) | true | true | true | true |
    | isPositive(0) | true | false | false | false |
    | isPositive(new Number(1)) | error | error | false | true |

    来源 https://www.reddit.com/r/programming/comments/4bjss2/an_11_line_npm_package_called_leftpad_with_only/d19vysi
    k9982874
        43
    k9982874  
       2016-03-24 14:23:35 +08:00
    面向 github 编程的核心思想,能找现成的绝不自己写,)手动斜眼笑
    tabris17
        44
    tabris17  
       2016-03-24 14:46:38 +08:00
    说到底就是 javascript 缺少 std 库呗
    LeoDev
        45
    LeoDev  
       2016-03-24 17:38:03 +08:00
    @daysv
    赞同,进步起源于懒。
    lwbjing
        46
    lwbjing  
       2016-03-24 18:18:07 +08:00
    依赖是种病, node 社区可能没救了...
    Vesper
        47
    Vesper  
       2016-03-24 18:19:19 +08:00
    JavaScript 的锅 (逃..
    sox
        48
    sox  
       2016-03-24 18:19:39 +08:00
    lwbjing
        49
    lwbjing  
       2016-03-24 18:21:55 +08:00
    @sox 嘿嘿嘿...
    binux
        50
    binux  
       2016-03-25 07:03:11 +08:00
    @SourceMan 为了兼容多那几行,你真的用得到吗?反过来说,如果用得到,你有为它写测试用例吗?如果没有写测试用例,你怎么知道兼容那几行不会破坏你现有的代码?如果你写测试用例,你以前为什么没有测它呢?
    ethego
        51
    ethego  
       2016-04-04 18:48:03 +08:00
    @bramblex 你的意思是 left-pad 和 monad 存在相似性所以可以拿来类比?
    bramblex
        52
    bramblex  
       2016-04-04 19:00:03 +08:00 via Android
    @ethego 不能,纯吐槽,抽象程度与代码量无关
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   993 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 19:35 · PVG 03:35 · LAX 12:35 · JFK 15:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.