首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Node.js
Express
PPA for Ubuntu
ppa:chris-lea/node.js
V2EX  ›  Node.js

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

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

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

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

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

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

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

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

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

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

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

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

    理解错了还望指正。
        41
    cc7756789   2016-03-24 14:19:12 +08:00
    我多加了几行代码: https://github.com/ZhangHang-z/string-pad (/ □ \)
        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
        43
    k9982874   2016-03-24 14:23:35 +08:00
    面向 github 编程的核心思想,能找现成的绝不自己写,)手动斜眼笑
        44
    tabris17   2016-03-24 14:46:38 +08:00
    说到底就是 javascript 缺少 std 库呗
        45
    LeoDev   2016-03-24 17:38:03 +08:00
    @daysv
    赞同,进步起源于懒。
        46
    lwbjing   2016-03-24 18:18:07 +08:00
    依赖是种病, node 社区可能没救了...
        47
    Vesper   2016-03-24 18:19:19 +08:00
    JavaScript 的锅 (逃..
        48
    sox   2016-03-24 18:19:39 +08:00
        49
    lwbjing   2016-03-24 18:21:55 +08:00
    @sox 嘿嘿嘿...
        50
    binux   2016-03-25 07:03:11 +08:00
    @SourceMan 为了兼容多那几行,你真的用得到吗?反过来说,如果用得到,你有为它写测试用例吗?如果没有写测试用例,你怎么知道兼容那几行不会破坏你现有的代码?如果你写测试用例,你以前为什么没有测它呢?
        51
    ethego   2016-04-04 18:48:03 +08:00
    @bramblex 你的意思是 left-pad 和 monad 存在相似性所以可以拿来类比?
        52
    bramblex   2016-04-04 19:00:03 +08:00 via Android
    @ethego 不能,纯吐槽,抽象程度与代码量无关
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2771 人在线   最高记录 4385   ·  
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 11:23 · PVG 19:23 · LAX 03:23 · JFK 06:23
    ♥ Do have faith in what you're doing.
    沪ICP备16043287号-1