如果没有库就可以执行任务吗?[关闭]


33

我处于可以使用开源JavaScript插件完成任务的情况。但是,当我尝试使用它时,我发现自己不得不重新设计已经完成的很多工作,以我的拙见,这给项目增加了一定的复杂性。尽管我可以用干净的代码完成相同的任务,但我可以自己制作,而无需更改到目前为止的工作。

在这种情况下,您是否仍应选择一个库(例如,为了获得更好的质量代码?)


3
您如何衡量“质量”。通过多少行代码?上课吗 复杂?可维护性?弹性?
Laiv

3
答案是否定的,无论您是否考虑质量。但是,如果您向我们提供了质量观念,答案将回答他们的理由,以解释为什么许多图书馆没有改善您认为的质量。这仅仅是岁差问题。现在,一个简单的“否”将无需回答就可以回答该问题。
Laiv

4
不是直接回答您的问题,而是面对“承认这个数字”不可避免地保证“更好的质量”的想法,面对承认提高代码质量的困难时,这种想法不成立。没有快速修复可以确保质量。如果有的话,这个问题将不存在。任何声称某种简单方法是万事通的解决方案的人,要么(最好)过于笼统,要么(最坏)将他们的错误想法推为事实。
平的

3
是什么让您认为使用该库可以提高代码质量?
停止伤害莫妮卡

1
投票结束,因为问题似乎已被重新制定,并且较高的答案回答了旧版本...最好重新发布该问题,因为它现在就独立存在(并添加详细信息以避免出现“过于局促” ”)
AnoE

Answers:


54

作为工程师,也许将其视为优化问题是合适的。自然,我们必须有一个优化目标。在这种情况下,常见的一种情况是将总拥有成本降至最低。

如果您认为添加第三方组件从长远来看可以节省成本,则应该使用它。如果不这样做,就不应该。确保考虑到持续维护的成本(例如,当发布新版本的O / S,发现安全漏洞或发布一些新的W3C规范时)。

对于许多琐碎的问题,您自己发展的成本会较低,但是对于组织核心能力之外的中等复杂的问题,通常需要第三方。

还有其他目标需要考虑(例如风险),但总体拥有成本是最大的目标。


1
我认为这个答案需要更多的支持。-库的长期可靠性可能是一个巨大的问题。即使存在一个库,谁知道API是否会更改?图书馆在短期内很容易,但从长期来看会引起问题。(旁注:库作为源代码可缓解某些问题。)
DetlevCM '18

6
@DetlevCM答案还说它可以很容易地反过来。非平凡的图书馆将附有维护费用,您作为图书馆的用户不必支付维护费用,而且如果您必须(例如,如果您是图书馆的所有者)则可能无法支付。
立方

我同意,但也不要忘记考虑库的成本-错误,控件之外的设计更改以及您不仅仅用于引入单个功能的大量代码。同样,对于您给定的问题,该库通常不如您的解决方案那样富有表现力。此外,您不能像这样轻松地调试外部库,如果需要,则以后必须处理更多的合并问题。不要仅仅认为库解决方案更轻便,考虑所有因素,如果库不太适合,不要害怕编写自己的解决方案!
Bill K

36

比尔·盖茨曾经有句著名的话:

“通过代码行来衡量编程进度就像通过重量来衡量飞机制造进度。”

之所以想到这句话,是因为最终可以对库的数量说相同的话。通常,除非:

  1. 没有其他方法可以完成它。如果不这样做,按时按预算生产产品将不再具有经济可行性。
  2. 这将为我节省大量时间,因为我需要上述库的许多功能
  3. 图书馆使用得很好,我可能遇到的任何潜在问题都将得到充分记录。

理想情况下,所有三个条件都满足,但我会满足任何两个条件。最重要的是,除非有一定用途,否则您不应该在程序中添加库。如果您必须问这个目的是什么,您可能不应该将其添加到程序中。因此,程序的代码质量会受益,因为它优雅地调用了每个库,而不必因必须在程序内部重写库而烦恼。

祝好运!


4
@BillalBegueradj有意义的报价,是的。足够,不可以。我们不是在谈论进步,而是在谈论软件质量,并且代码行与发现的缺陷数量有很强的相关性。请参阅论文《类大小对面向对象度量标准有效性的混杂影响》,该文章显示了所有其他度量标准在通过LOC调整后对发现的缺陷没有预测能力,这意味着LOC是缺陷的最佳预测器(或当时是: 2001)。而且,顺便说一句,科学论文击败了著名的报价。
Theraot

5
@Theraot您建议,由于行数决定了缺陷的数量,因此大型程序比小型程序具有更差的代码质量?抱歉,我不同意您的指标。另外,如果报价确实困扰您,请随时忽略。
尼尔

3
@Neil要清楚,行数不能确定缺陷数,它与发现的缺陷数有很强的相关性。这很容易理解:代码越大,引入缺陷的机会就越大。当然,发现缺陷并修复后,缺陷的数量会减少。毕竟这只是相关性。附录:LOC击败了许多常见指标,有关详细信息,请参见本文。
Theraot

5
@Theraot我的论点不在于缺陷与行数的相关性。我的论点是,缺陷数量之多等于代码质量差。多年来,Chrome一直存在缺陷,但我认为任何说法的合法性都表明它的编写要比GitHub上写得不好的10行jQuery插件差。
尼尔

3
@Theraot“科学论文击败了著名的报价。” -听起来您的论文实际上是在支持报价,而不是打败它……
npostavs,

14

(注意:最初的问题是:库的数量是否会提高代码质量?)

您可能可以自己回答一个问题:不,当然,仅仅使用库并不能改善您的代码。如果这样做的话,很容易为所有内容编写出色的代码。

当人们建议重用时,人们的意思是,众所周知的库中的代码比您自己想出的代码更正确,更有效和/或更可用,这仅仅是因为作者花了更多时间在一个特定的功能范围内(您的整个项目的截止日期)超出了您的承受能力。

但这只是一种趋势,而不是法律。当然,有些库的使用可能不如自己动手使用。通常,当库实际执行的工作远远超出您的需求时,就会发生这种情况,并且这种执行方式会迫使您使自己的代码库适应其约定,而不是合理的。看起来这正是您在此实例中找到的。


4

虽然使用正确的库可以节省您很多工作,但也有很多隐藏成本:

  • 图书馆需要保持最新。您通常需要检查它们是否有更新(可能与安全性有关!)并应用它们。每次库更新可能会破坏您的应用程序中的某些内容。这意味着您之后需要执行完整的集成测试。因此,您的项目所依赖的每个库都会增加长期维护开销。
  • 一些Javascript库是如此强大,并且使用了独特的模式,人们开始将它们视为独立的专业技术领域。因此,您添加的每个其他库可能会使开发人员感到恐惧,因为他们对使用不熟悉的框架进行编辑的代码没有信心。雇用熟悉您使用的所有库的新维护程序员可能会变得充满挑战。
  • 向您的网站添加库会增加加载时间,因为用户需要加载整个库,即使您只使用其中的一小部分。一些流行的库允许您下载仅具有所需功能的自定义版本,但即使那样,您通常仍会包含很多永远不会运行的代码(甚至更糟糕的是:可以运行但没有做任何有用的代码,因为它只是为不需要的功能准备数据结构)。

因此,在向项目添加另一个依赖项以包含一些自己可以写的东西之前,请进行成本/收益分析。


当您真正拥有真实数据时,请重复该分析。您可能低估了成本/高估了收益,或者情况可能已经改变。
Deduplicator

1

这不必是一个二进制决定:要么只使用OSS库,要么从头开始编写新的解决方案。如果许可证允许,另一种选择可能是重新使用库的某些部分。

例如,在我的领域(数字软件)中,一个库可以具有优良的核心模块,以及一些我仅80%满意的专业模块。因此,我将使用核心模块并为专用模块编写包装。或者,我可以通过使用OSS模块的设计和代码来开发自己的专用模块。通常仅在修改了脚手架代码的情况下重用最难的算法位。我可能还会清理一些原始代码。与从头开始开发相比,这已证明是一种很好的学习体验,并且可以节省时间。


0

如果有人已经为您完成了工作,那么您当然应该使用它。

规则的例外是javascript。他们将在其中导入许多其他库(当然是过时的版本)以添加他们要使用的语言功能,然后为您完成工作。

选择您的框架并留在框架内。如果该库适用于您的框架或纯js,则可以。但是,如果需要其他框架,请寻找其他选择。


4
很多JavaScript粉丝在这里
FCin

0

图书馆以及何时使用它们是一个复杂的决定。

一方面,您已经很好地测试了几乎标准的东西(例如,在我的领域中,FFTW属于此类,或类似libsndfile之类的东西),这些东西通常被认为是可以正常工作的,并且在过去20年中一直是标准东西。每个人都使用。

另一方面,您有来自github的随机内容,没有测试套件,只有大约1个维护者,通常为什么要打扰?

对我来说,最苛刻的测试是该库是否适合我的体系结构(有时,如果您知道要使用给定的库,则最终要围绕该库进行设计),并且我是否想结束调试其他人的库代码?第二个问题的一个很好的代表是“是否有自动化测试套件,文档是什么样的?”。

一点调试不是主要问题,但是从维护的角度来看,库代码此时开始以我自己的代码大小为基础(如果由于某种原因而无法将我的修订推向上游,则更多)。

我还要区分库和框架,尽管有时区别并不那么清晰,但在我的世界(小型内核,DSP繁重)中,框架往往让人头疼,尤其是当您尝试合并时,一个或稍微做一些事情,库有时是有用的。我知道这在Web开发人员场景中有很大不同。

归根结底,这取决于您的口味和经验,即使经验丰富的人有时也会选择不佳,至少对于库来说,您总是可以将其删除并编写自己的实现(如果过于烦人)。

决定,决定...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.