GNU软件开发如何在经济上持续下去?


10

如果这个问题超出主题,我深表歉意,但这同时是一个经济问题,也是一个编程问题。如果它应该转到另一个SE社区,请告诉我。

从理论上讲,GNU软件完全由志愿者在空闲时间开发,或者由自愿资助程序员开发GNU软件的公司(通过使用其活动的其他部门的收入)开发。

我了解它对于小型项目的完美工作方式,该项目可以在一个多雨的周末由一个人完成(例如数独游戏),因为毕竟计算机编程是一种非常有趣且有益的嗜好,而且我看到人们在闲暇时间开发中小型程序并将其共享给全世界时,我没有问题。

问题在于,由于以下原因,对于大型程序而言,伸缩性极差:

  1. 尽管编程很有趣,但是随着必须实施的项目变得越来越大,实现所需功能所需的时间却迅速增加。较大规模的程序需要花费大量时间才能开发,例如,一个人可能很容易就需要15年的空闲时间和休假时间来对操作系统进行编程,而到他的软件发布时,它就会完全过时了。 。
  2. 当其他人以与您将要完成的方式不同的方式来编写程序时,阅读和理解别人的代码会花费很多时间,在大多数情况下,这与从头开始编写自己的代码一样多。在GNU理念的鼓励下,修改他人的代码并尝试对其进行改进,几乎与开发带有您要添加的功能的所述程序的克隆一样耗时。
  3. 一旦必须有2个或更多的人协作来开发更大的程序,这就会产生很多决策问题,而这些问题在单个开发人员项目中就不会出现。结果是,例如,如果一个由2个程序员组成的团队合作完成一个项目,一个人要花10年的时间,他们将不会在5年内成功,而可能会在8年内成功。
  4. 如果为同一项目进行协作的人仅在互联网上见面,那么该项目的一个成员很容易突然消失(因为他失去了兴趣,或者因为他再也无法上网了),因此,甚至可以进行协作更难

因此,尽管我完全了解如何使用GNU思维方式开发简单的程序,但我绝对看不到在这种模型上如何能够实现GNU / Linux或gcc这样的大型程序。gcc大约有700万行代码。我知道代码行没有多大意义,因为在项目的后期阶段,生产力更高的程序员实际上是将代码行删除(简化和/或优化项目)的程序员,但是这给代码带​​来了很大的负担。项目gcc是。

因此,从理论上讲,任何人都可以在空闲时间自由修改gcc,但实际上呢?它是由非常专业的人开发的,是工作,而不是业余爱好。任何将编译器当作业余爱好的人最终都会放弃,因为成本/收益不值得:

  • 开发大型程序是一个长期的,庞大的项目,他们宁愿利用自己的空闲时间从事其他在短期内更有意义或更有趣的活动
  • 如果他们仍然要开发一个大型程序,他们宁愿为将向他们付款的公司这样做,而不是免费进行

从长远来看,为了使人们对开发诸如GNU / Linux,gcc或Open Office之类的程序感兴趣,它应该是有益的。所以我的问题是:如果没有薪水,为什么会有人为大型GNU项目做贡献?


您能为第2、3和4点提供一些证据吗?我最不同意第二点,但是第三点和第四点也是有趣的观点,我在开发开源软件时并没有真正体验过。有空的时候,我会根据自己的经验更新
christopherlovell 2015年

第2井在很大程度上取决于编程语言,并且在程序体系结构的文档中投入了大量精力。至于证据,我可以找到这个这个这个
Bregalad 2015年

@Bregalad您评论中的两个示例已超过9岁。自那时以来,开放源代码软件已经走了很长一段路,这得益于Web的发展和git等工具的普及,这些工具使共享和开发良好的可读代码变得更加容易。
christopherlovell'5

1
@Bregalad在SE / Programmers的另一个示例中,几乎每个评分很高的答案都对您造成更大复杂性的第二个原因提出了质疑,即,阅读代码不一定比编写代码难。关于这一点的最后一句话是,从头开始克隆项目可能比添加项目更容易,它假设您知道,即使没有阅读代码,它的工作方式以及如何重新创建算法。我可以从经验中告诉您,为问题解决一个优雅而高效的算法比编写代码要困难得多:)
christopherlovell 2015年

Answers:


5

首先,我不是一名程序员,并且从未为任何开源项目做过任何贡献。但是,我对开源很长一段时间了,我相信我了解开源的一般概念及其工作原理。

首先,我想说的是开源并不意味着您不能在该软件上赚钱。这仅意味着该代码必须公开可用。诸如Red Hat和Canonical之类的公司不是通过销售软件来赚钱,而是通过出售其专业知识来赚钱。如果我不想让公司运行Linux服务器,则可以免费获得该软件。但是我需要有人安装,设置并提供支持。这是来自Red Hat的专家进来并赚钱的地方。对于公司而言,这是有道理的,因为雇用他们自己的专家可能会贵得多。这也使这些公司有动力贡献代码。他们希望自己的产品好,这样人们就可以通过他们的服务来使用它。

但是,让我们谈谈您对可伸缩性的观点。

  1. 开源的好处在于,您不必从头开始开发所有内容。像Ubuntu这样的操作系统尚未由一个人构建。相反,很多人为系统的不同部分做出了贡献(实际上,我认为很难找到一个具备所有制作技能和有效操作系统的人)。例如,Ubuntu人不开发Linux内核。他们只使用别人开发的一个。因此,没有开源的东西现在可能成为不可能,因为您可以在其他人的工作基础上发展。

  2. 阅读和理解他人的代码并不比编写自己的代码更耗时。至少在许多情况下没有。除此之外,您不必了解所使用的所有代码。如果要编写Linux程序,则不必了解该程序中所有部分的详细工作方式。我只需要知道他们在做什么。然后,我可以将这些部分并与其他部分放在一起以创建程序。或者,我可以采用现有程序并根据需要对其进行修改。

  3. git和github之类的工具使协作变得异常简单。您只需获取代码并进行修改。然后,您将它们提交给项目负责人。如果好,它将被接受。

  4. 人们一直在进出项目。但是,如果该项目很受欢迎,那么将有足够的工作来进行。

这是开源起作用的一些原因。

  1. 我认为开放源代码软件变得如此出色的主要原因是,大量的项目工作人员确保一定水平的专业知识,而我却很难将其存储在一个小型开发人员团队中。尽管看起来很奇怪,但这一事实似乎胜过开源中可能出现的所有负面问题。

  2. 在商业程序设计中,该项目与公司终止。假设您是通过一家公司的软件来关闭的。然后,您将一头雾水,因为您将不会收到更新和错误修复,并且您将需要通过新软件来跟上。使用开源,您可以找到其他公司来支持您的软件或自己开发软件。

如果您仍然感兴趣,建议您阅读 大教堂和集市


我不同意您的任何意见,但实际上,我不能接受答案,因为它不能回答我的问题。您似乎试图说服我GNU有多么出色,但是没有用,因为我已经说服了很久了。您还严重低估了修改和改编他人代码以及协调多个从事软件项目工作的人员的难度。我可能在问题中夸大了这些问题,但仍然可能是一个重大问题。我仍然不知道大型 GNU软件如何在经济上维持下去。
布雷加拉德

也许您应该将其发布在stackoverflow上,并从一些真正的程序员那里得到答案。他们可以根据实际经验正确地给您答案。
2015年

1
您对Red Hat的观点是正确的,但是快速浏览一下他们的工作建议后,其中大多数与销售,市场营销和技术支持有关,只有一小部分处于开发开放状态。(这很好地表明了他们的收入来自何处以及收入的分配方式)。同样,这个问题可能会在堆栈溢出中被标记为脱题(尽管为了确定起见,我必须重新阅读帮助)
Bregalad 2015年

@Bregalad但是,即使您正在修改其他人的代码;您有一个可以借鉴的社区,询问他们工作原理。(这可能是专有软件开发人员乃至整个企业都不熟悉的概念,因为这里的重点是个人或金钱,而不是整个社区的软件改进)。同样,社区中的人们也对保持该软件的运行感兴趣,因为他们也有可能自己将其用于某事。否则,他们为什么做出贡献?(也许成名...但是,如果您的开源项目死了,那将有什么帮助?)
leeand00

@Bregalad另外,该项目对多个公司(使用和编码软件的公司)的支持,而不是单个软件开发公司的故障点,可确保您不太可能提取转换并将数据加载到另一个系统中当其他公司倒闭或被市场吞噬时。
leeand00

2

进行开放源代码软件开发的原因多种多样,但这是一个普遍的误解,认为它主要是由业余爱好者或专业人士完成的,但只是作为附带项目而进行的。我通常是针对开源而不是GNU许可的软件来回答这个问题。但是我的回答是包容的。

假设我是一个软件开发人员(我是),而我正在从事一个复杂的软件项目(我是)。好的架构将问题分解成独立的部分,并且随着开发的进行,开发人员通常会认识到他们需要的某些部分是许多问题所共有的部分。以下是一些典型的前进路径:

  1. 他们自己开发该产品,并成为公司的财产。或者,他们从另一家公司购买开源解决方案。
  2. 他们找到了一个可以解决此问题的开源项目,这很合适,许可证也很合适。他们只是将其合并到他们的项目中,根据许可证及其使用方式,可能需要也可能不需要开源。他们没有回馈该项目。
  3. 他们找到了一个开源项目,几乎可以解决这个问题,但是有缺陷或不足。他们对此进行了改进,并且可以将这些改进归还给基础项目。
  4. 他们找不到足够喜欢的东西,因此他们开始自己的项目并决定开源。

2-4的优势在于,最终有更多的人为项目的设计和代码做出贡献,并且进入了一个生态系统,强创意得以生存(如果愿意,可以通过繁殖)而弱创意则无法生存。错误修复和功能添加已成为社区的工作。在场景2和场景3中,采用该项目的开发人员将从合理的工程原理和成熟的代码中受益。3和4是相关的。在方案4中,当其他人采用和改进代码并回馈时,开发人员将从中受益(#3)。对项目做出贡献是有利的,这样您的改进就可以在其他修复和改进之上不断巩固,而您可以继续从中受益。以我的经验,所有这些情况都是司空见惯的。

在我当前的软件项目中,我是大约12个开发人员之一,并且在一个系统上工作了大约两年。我们已经纳入了大约5,000个开源项目!我们仅产生了几个新的FOSS项目,并贡献了大约六个。在这种情况下,我们并不是特别优秀的公民(其他公司则更好),但这向您展示了这一切的巨大规模。即使在小型项目中,来自开源的贡献也很容易达到数十个或数百个。如果我们不使用任何开源软件,开发成本将激增100-10,000。

可伸缩性的发生是由于设计的模块化以及通过这种“适者生存”的过程进行的,在这种过程中,代码可以进行重构,分叉等等。生存能力通常比专有替代方法要好,因为即使不再维护代码,代码也已存在,并且从中发现价值的其他人也可以维护自己的生存能力。公司来来往往,雇用员工并辞职的速度甚至更快。如果添加的软件依赖项没有源代码,或者只有一个小的内部团队要维护,则可能会带来巨大的风险。诸如Linux内核,gcc,Android等大型项目通常会吸引大量公司积极参与。

在大多数情况下,编写好而正确的代码比阅读要容易。即使您进行了修改,也不必阅读正在使用的所有软件。您必须深入研究其中的各个部分并阅读很多,但不是全部。在这里我可以说更多关于单元测试的内容,但是为了简洁起见,将省略它。

大多数开源软件不是人们在空闲时间开发的。这种做法非常有益,以至于无需优化市场即可工作。我个人怀疑某种市场驱动的方法会大有帮助,但是我不知道这种方法可能是什么样。人们争辩说,有一个市场,信誉就是货币,但是我认为那不是一个准确的模型。工作中的一种流行是采用新软件所需的时间。您希望找到并使用活跃,简单,具有良好文档等的内容。因此,像购物者一样,您正在寻找花费最少时间的最优质产品。

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.