在商业软件产品中使用开源代码的智慧


13

我正在我的ASP.NET Web应用程序(特别是dapper)中使用一些开源代码。管理不是狂热者,因为开源以前被视为一种困扰我们的风险。显然,以前的开发人员在开源组件出现故障之后不得不重写东西。

优点似乎是:

  • 它为我做了很多事情,否则会涉及很多样板代码或Microsoft推荐的但较慢的解决方案(实体框架)。

缺点:

  • 它非常复杂,以至于如果它突然在生产中失败,我将很难修复它。但是,它在比我的流量更高的站点上使用,因此我认为它最终不会成为项目的高风险部分。

这有什么共识?在我的项目中使用自己不了解/理解的开源代码是否明智?


15
ASP.NET及其堆栈是开源的。
Andrew T Finnell,2012年

11
“在我的项目中使用我不了解/不理解的开源代码以及自己编写代码是不明智的吗?” 与黑匣子的闭源库相反?
user16764 2012年

5
@AndrewFinnell:不是FLOSS运动自己定义的。
tdammers,2012年

6
在您正在考虑的特定OS项目中,StackExchange使用Dapper可能会很有意思...
Marjan Venema 2012年

4
这不是技术问题,也不是哪个更好。哪一个会出错。MFC死了,XP会在不到2年的时间内死掉,等等。免费的开源项目不会因为任何优点而消失,因为您或其他人可以接管它们。这是关于谁会受到指责。如果选择Microsoft,将是无法预料的,​​或者是Microsoft的错。如果您选择免费/开源,那将是您的错。
ctrl-alt-delor 2012年

Answers:


20

您必须根据具体情况进行选择。您可以通过以下方式减轻风险:

  • 全面测试框架,避免在生产环境中出现令人讨厌的意外咬伤您的可能性,以及
  • 使用松散耦合可以最大程度地减少直接依赖于框架的代码量,因此,如果需要,您可以更改为自己的实现,而无需重写整个产品。

最终,对于一个经常使用的开源项目,您可能会花更多的时间编写自己的项目,而不是解决所遇到的一些问题。


16

我要说的是,如果您最初的反应是自己写东西,而不是看看别人是否写过,那您注定会失败。不要把所有的工作时间和错误修复都花在主流开源项目中。

一旦开始进入您的业务领域,您将很难找到符合您需求的OSS。但是,无需重新实现另一个ORM产品。如果dapper非常复杂,您将无法调试和修复他们的代码,您将如何证明花所有的工时从头开始编写代码呢?此外,您可以(应该吗?)总是在NoSQL解决方案之外找寻东西。

甚至Linus也承认,他在开发Git之前试图找到一种满足他所有标准的SCM解决方案。至少他能够解释为什么现有解决方案都不够好。

在我生命中的某个时刻,我不再想自己重写所有内容,而是希望专注于解决现实世界中的问题。企业中需要解决的大多数问题都是特定于领域的。找到减少编写代码的方法。


2
+1我同意所有这些,除了您说他“(应该)”看NoSQL的地方。每个NoSQL数据存储解决方案(有很多)都有一套特殊的权衡,要有一个“标准” SQL关系数据库,因此,在没有大量信息的情况下很难说“应该”。有时候,这是一个很好的权衡,有时不是,但您不能对此发表一口气。“ NoSQL”只是围绕一堆技术打上了烙印,除了不是最常见的数据存储方案外,几乎没有什么共同点。
Donal Fellows

但是您写的所有其他内容,我都绝对同意。好的OSS可以让普通的开发人员不费吹灰之力(以及谁愿意使用糟糕的OSS?)
Donal Fellows

Dapper很复杂,因为它是通用的。如果要编写自己的解决方案,我会做很多样板化的数据集到对象的转换代码(即MyClass.Property = set.Tables[0].Rows[i]["Property"].ToString())。
杰斐逊先生2012年

一旦你开始进入您的业务领域,你会更很难找到--OSS-- 任何东西,以满足您的需求。除非微软的业务是您的业务。(但我喜欢您所说的其他内容。)
ctrl-alt-delor

@richard我的某些答案可能不清楚。您的陈述也是我的意思。为什么要像ORM那样专注于一次又一次地解决的问题。专注于业务领域。除非您销售ORM产品,否则ORM不是业务领域。
安德鲁·T·芬内尔

15

注意: 我不是Microsoft员工。该意见是完全个人的。许多想法来自最近5-7年,即同时使用开放源代码和大型供应商作为开发人员。

单一文化是好的: 我对ASP.NET的个人规则是优先考虑Microsoft,除非没有其他选择,否则不要选择第三方代码(无论是否开放源代码)。单一文化是有益的,因为您被大型供应商所束缚,并且重复相同体验的用户数量随时足以获得帮助并找到解决方法。

鬼城: 2012年开源的问题在于不再是2000或2005。当用户,采用率,贡献者的数量与几年前相同时,项目的数量会不断增长。听众thin之以鼻。许多有趣的项目变得陈旧,被遗弃。没有开源项目预算之类的东西。因此,当兴趣结束时,没有人可以诚实地宣布支持已经结束并关闭灯。这些项目永无止境,不会引起公众对更好和新事物的关注。因此,开源将始终保持增长和碎片化。他们没有金钱奖励或财务死亡的形式的反馈,是永恒的实体,为了永恒的荣耀而存在。

20度分离: 每次采用新库都会使您与主流分离,使您转向少数情况。完成20个步骤(如选择安全性配置,使用特定版本,框架,插件等)后,您的解决方案将成为单个全局唯一的详细信息组合。谷歌搜索只会帮助解决问题的稀有性或独特性。纯粹是技术问题,始终是一些自助问题。从来没有与实际业务相关。

质量来自焦点,金钱无关紧要: 商业软件与开源软件之间没有对立。整个开发者社区只是过去的一个社区。大型供应商的优势仅在于,与开放源代码组相比,在更好的条件下,更长的时间,更好的条件下使代码更旧,并且具有更广泛的受众。

共识:您问是否有共识。可能不是。不幸的是,大量的开放源代码用户过于政治化了。毕竟开源是一种社会运动。开源不受批判的影响,因为负面意见通常会被视为反技术的人身攻击。我个人的共识:坚持使用Microsoft。


3
+1:我不能说我完全同意,但是它太过争论了不……..
mattnz 2012年

14
“没有开源项目预算之类的东西。” 是不正确的。Google为开源项目制定了预算,例如,如果Red Hat Inc.在软件中没有放置足够的编码器,则它们将无法运营自己的业务。那呢?microsoft.com/opensource/directory.aspx
ONOZ,2012年

14
我不同意您所说的一个字。
Avio,2012年

11
所有这些要点同样适用于封闭源项目。添加利基封闭源代码库/框架会增加多样性。如果旧的专有技术不能使他们赚钱,那它就会被抛弃。您仍然可以将IIS配置为它自己的唯一蝴蝶。质量评论忽略了开源项目可能比(某些)供应商更大。商业世界高度政治化,尤其是与Microsoft合作。
菲利普(Philip)

3
我经历了相反的经历。我们将SQLite移植到设备上,并能够直接从编写它的大多数人那里获得支持。我们绝对不可能从封闭源代码公司那里获得那样的服务水平。与某些封闭源项目相比,某些开放源项目绝对更强大并且具有更好的支持。我可以讲一个有关使用适用于OS / 2的“行业标准” Microsoft C ++编译器的故事,以及当Microsoft决定对OS / 2进行保释时对此的支持如何。
Gort机器人2012年

7

我已经为一家使用大量开源软件的大公司完成了许多成功的项目。特别是,对于一家非常大的公司,我已经将Curl,SQLite和Webkit全部用于交付给最终用户的成功项目。正如其他人所说,这只是对执照小心谨慎,理想情况下请律师对其进行检查。

有数百个开源许可证,但通常分为两类:BSD样式和GPL样式。BSD样式许可证不需要您开源自己的代码,通常只需要某种归属条款即可。GPL样式许可证确实要求您开源自己的代码。大多数公司(包括我的公司)通常都对此表示怀疑,因此您要避免使用GPL风格。Dapper似乎使用的是BSD风格的Apache许可证。在开始编码之前,请务必弄清楚通用许可条款是什么。

还有一个LGPL,这是一个有趣的边界情况,因为如果您限制访问二进制边界,则可以在不打开自己的代码的情况下使用它们。(即,仅以动态库的形式访问该库。)LGPL库的用法非常可行,您只需要格外小心。

以我的经验,开源代码比付费解决方案或就连您自己的解决方案都更有可能出现故障或失败。如果您看一些更杰出的开源工具,那么质量会很高。

您可能确实想避免项目较小或不完整。抓住似乎可以满足您需求的东西可能很诱人,但是如果它们是由几个人拼凑而成的东西,这些东西从未完成并且没有支持,那么可能就不值得付出努力。(除非您愿意直接处理该代码。)


7

您是否从未有过专有组件出现故障?我遇到了许多大小公司的软件错误。这个问题本身并不是开源问题,而是更多关于项目成熟度的问题。

听起来您想使用提供支持的成熟项目。一些开源项目提供有偿支持,或者拥有足够大的社区,您可以在公共论坛中获得答案。不论是封闭库还是开放源库,也许在选择库时都应优先考虑成熟度和支持标准。

您需要承认,如果您决定使用一个不成熟的项目或受支持的项目有限,那将承担更多的风险。因此,您需要确定什么是缓解风险的计划。例如,您可能会对第三方软件执行更多测试。


6

假设许可问题在这里没有问题:快速浏览Dapper时,我注意到它只有2255行有据可查的可读代码。那是

  • 足够大,您可以花几天或几周的时间来制作质量可比的代码
  • 足够小,您可以了解它的作用,并修复代码中的任何错误(如果它们出现在生产环境中)

如果您要自己编写这样的东西并“重新发明轮子”,则您自己的代码将在生产中出现错误的风险要高得多,而且您也将非常“难以修复”。

但是,如果您在项目中引入了这样的开放源代码,那么在这里必须要做就是承担全部责任,就像您自己编写代码一样。如有必要,请确保代码处于可以维护的状态。如果某些事情不能按预期工作,请不要怪罪该代码的“作者”。

在我们的一个项目中,我们也引入了一些开源组件,从小到Dapper的大小到具有大约2万到3万行代码的库。我们总是必须进行一些更改,修复一些错误,缩小某些尺寸等,但这没关系,因为我们期望如此。甚至包括调试时间,使用开源也节省了我们很多工作。

这里要考虑的一件事:在您的情况下,您提到有一个可以从大型供应商那里获得广泛接受的替代方案(MS Entity Framework,您无需为此支付任何额外的许可证费用!)。出于性能方面的考虑,您不想使用它。我严重建议不要让性能成为唯一或要考虑的重点。您应该在这里提出以下问题:Dapper是否具有现在所需的所有功能以及软件的预期使用寿命?或者您是否可以预见到您将很快达到Dapper的极限,并且您将不得不增加很多缺少的功能,如果您一开始就决定使用EF,您可能不必这么做?如果是后者,我建议不要使用Dapper。还要问自己:EF真的不够快吗?


1
+1许可问题。仔细检查,使用某些开源组件也不会强迫您开源自己的代码。我不认为大多数开源软件都会出现这种情况,如果您仅使用它来生成或托管代码,就会有更多可用的软件,但是仍然值得检查。
鲁尼佛尔(Lunivore)2012年

即使对性能的关注较少,EF也能为我提供更少的控制权。如果将来需要缓存,引入缓存会有点困难。Dapper除了首先将高速缓存的必要性推到了更高的道路之外,还将更容易融入更自定义的解决方案中。
杰斐逊先生2012年

另一方面,想要在EF上使用自定义解决方案听起来有点像NIHS。我的数据模式非常复杂,具有许多关系(外键),并且要达到我的自定义解决方案可以管理这些关系以及EF开箱即用的过程肯定会花费一些时间。
杰斐逊先生2012年

@杰斐逊先生:认真的说,我不能给您一个好的建议,这是您情况下更好的解决方案,那是您必须自己解决的问题。我只是想给你一些提示,考虑一下。
布朗

+1。您在这篇文章中提出了一些非常出色的观点。@ Mr.Jefferson:我已经使用实体框架已有一段时间了,在找到瓶颈所在之后,通过对特定存储库进行临时缓存来成功地管理性能。同样,我们的产品非常复杂,但是我仍然不必求助于编写单个SQL查询。我觉得EF给了我很多控制权。
StriplingWarrior 2012年

2

如我所见,这是一种平衡行为。

如果您依赖供应商,几乎可以肯定的是,支持很快就会消失

  • 因为他们有程序员付费,所以他们需要继续制作新版本,并确保旧版本无法获得并且不再起作用(在新平台上),因此新版本将有市场。

  • 如果他们不能卖出足够的钱来证明一种商业模式,则将其从公司A传递到公司B到C,每个公司都会对其进行足够的更改,如此一来,您就不能在没有重新编程的情况下使用新的模型,并且可以不能得到旧的有效。

  • 他们只是决定不再支持它,因为它有太多麻烦,而且里面没有钱。所有的钱都在新的应用程序中。

因此,如果您要构建不需要每隔几年就不断重写的东西,那么开源可以是您的朋友。


1

我认为,如果进行了足够的尽职调查是明智的,并且看来您已经就某个特定项目的历史和活动进行了一些功课。在源代码中扩展/添加功能的能力也是一个很大的优点。通过充分的测试,您可以最大程度地降低风险。很难完全理解代码中的所有依赖关系,但是至少在这种情况下,如果有必要,您将能够完全调试和查看代码。

问管理层为什么以前失败了,是否进行了充分的尽职调查?


我对发生的事情了解不多。那是在我到达这里之前。
杰斐逊先生2012年

0

jquery具有使用MIT许可证的选项,因此许多商业和政府网站也使用jquery。微软的网站也使用jQuery!因此,关注点是许可。避免使用GPL / LGPL就足够了。

“修复报告的缺陷需要多长时间?” 报告错误后,它可能会在几分钟,几小时或几天内得到修复。对于紧急情况,工作人员可以简单地“ git pull”来获取源代码并自己进行编译。他只是向管理层报告了类似“ v1.2.3-101-gd62fdae”的版本,这是可追溯的。



-1

您确定管理问题是技术问题吗?

我说这是因为将操作系统和商业活动混为一谈是合法的雷区,而且有多个经理从法律团队/首席执行官那里得到了“请解释”,或更糟的是从另一个组织那里得到了“请解释”。我知道的大多数经理,即使是那些积极使用OS软件的经理,(正确)也非常谨慎,以完全了解他们所面临的法律情况。如果采用OS软件并进行更改,则必须将这些更改退还给社区。在某些情况下,此义务是合法的,而在其他情况下则是道德的。在某些OS许可证中,您所做的一切仅通过链接即可成为OS。

从技术的角度来看,这实际上只是竞争产品之间的决定-提出一些基本问题-是否可以为您选择的软件包提供所需的支持?,修复报告的缺陷需要花费多长时间,每笔花费多少?开发人员,每年或一次,等等。OS在$列中有很多0,但在其他列中常常有空格-只有您和您的老板可以决定0是否超出了空格。

还有一点要记住-“没有人被解雇购买IBM”。(即管理层说“如果您花很多钱,它肯定比免费产品更好。”


5
讽刺的是,IBM可能是全球最大的基于开源软件的销售商。Apache HTTP服务器时,Eclipse等等,等等
詹姆斯-安德森

7
出售OSS并非违法。为什么会这样呢?
tdammers 2012年

1
IBMS httpServer是纯Apache,它只是附带一个支持协议。
詹姆斯·安德森

2
事情正在改变。现在,管理层开始考虑,如果您让公司为其他公司免费提供的组件付费,那您就傻了。
Avio,2012年

2
对于开放源代码,“其他列”很少为空白。您总是可以从顾问,发行商或其他人那里获得支持,也可以自己提供支持。对于商业软件,更多的列通常是空白的,因为您不预先知道其支持的质量,并且很少能提供所需的帮助。
Jan Hudec 2012年
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.