美国政治传播学家拉斯韦尔提出了5W传播模式,经过后人的不断运用和发展总结,形成了一套逐渐成熟的“5W1H”体系,即:对选定的项目、工序或操作,都要从原因(何因Why)、对象(何事What)、地点(何地Where)、时间(何时When)、人员(何人Who)、方法(何法How)等六个方面提出问题进行思考。

本系列文章就以5W1H体系来讲一讲开源的那些事。

What——开源是什么?

开源即开放源代码,Open
source
code,也称为源代码公开,指的是一种软件发布模式,一种基于去中心化、自组织式的软件开发模式运作的工作方式。这个模式中,软件是开源的最基本含义是:代码是公开的,任何人都可以去查看,修改以及使用。与开源相对的是闭源代码,闭源代码就是普通的商业版权软件,代码是封闭的,只有作者才能看到,出了问题也只有自己能修改。

开源软件就是公开源代码的软件。开源软件在发行的时候会附上软件的源代码,并授权允许用户更改、传播或者二次开发。

误解:开源不是什么

下面澄清关于开源的一些常见误解:

开源不意味着免费

开源软件和免费软件是两个概念,开源软件开放源代码,允许用户更改、传播、二次开发。免费软件是免费提供给用户使用,但不一定公开源代码,也不允许随意修改、二次发布等。比如我们常用的微信、QQ及大多数软件,我们可尽情使用,但如果自己添加或删除了一些功能、甚至发布在网上供人下载使用以此牟利的话,那就是在犯法的边缘反复横跳了。

当然,大多数开源项目是免费的,但“免费”不是开源定义的一部分。有些方法可以通过双重许可或有限功能间接地为开源项目收费,同时仍然遵守开源的官方定义。

开源不抵制商业

开源软件是不抵触商业的,开源的目的是分享共享,但不是做慈善事业。开源是利他主义的,专有软件或私有软件是利己主义的,而开源的商业模式也是利己主义的。利他主义的开源与利己主义的商业模式结合在一起,才能为开源真正做贡献。具体盈利模式有技术支持、培训、高级功能、云服务等方式收费。不同的软件、不同的领域有不同的盈利模式,但所有模式的基础都是用户数。只有用户数量达到了一定的规模,才有成其商业化模式的可能。

商业开源是通过更多人的参与,减少软件的缺陷,丰富软件的功能,同时也避免了少数人在软件里留一些不正当的后门。开源软件最终还会反哺商业,让商业公司为用户提供更好的产品。相对来说,后端开源项目最容易商业化,而越接近底层设施的软件越容易商业化开源。

开源项目不代表最高的代码质量

开放式联合开发,其本质是保证其他参与者无法隐藏低质量的代码、漏洞和其他问题,所有代码将受到分析和评判。但也有一些开发者的经验不足和Code
reviewer的疏忽会导致一些不那么好的代码被提交。还有开源社区会进行低效讨论,在不同的需求情况下,有时做出最后的决策是妥协了的结果。

同理,任何人都能为开源项目提供代码,也并不意味着开源代码品质较差,因为毕竟大多数是经过了门槛和审查筛选。

所以总体来说,开源项目的代码质量虽然不是最好的,但是也是相当不错的,而且由于开源社区是由众人拾材火焰高,所以好的项目会活得更久,这样的优胜劣汰之下,能够被大多数人关注的项目的代码质量也随之水涨船高。

5W1H聊开源之What——开源是什么?的更多相关文章

  1. oschina开源硬件其它开源,开源硬件

    硬件驱动/工具 25Linux内核 101桌面环境 40开源字体 58嵌入式操作系统 33输入法 110开源硬件 57开源图书 5开源家居 17物联网 87开源货币/比特币 32NASA 开源项目 1 ...

  2. Android开发周报:Flyme OS开源、经典开源项目解析

    Android开发周报:Flyme OS开源.经典开源项目解析 新闻 <魅族Flyme OS源码上线Github> :近日魅族正式发布了MX5,并且在发布会上,魅族还宣布Flyme OS开 ...

  3. 【分享】2017 开源中国新增开源项目排行榜 TOP 100

    2017 年开源中国社区新增开源项目排行榜 TOP 100 新鲜出炉! 这份榜单根据 2017 年开源中国社区新收录的开源项目的关注度和活跃度整理而来,这份最受关注的 100 款开源项目榜单在一定程度 ...

  4. 再谈:为什么开源C/C++开源框架极昂贵?

        今天读了一篇文章:<腾讯前员工创业笔记:那些跟钱有关的事儿>(http://tech.163.com/14/0515/08/9S9975C5000915BF.html),摘录两段: ...

  5. [Android开源项目] GitHub开源项目总结 (转)

    [Android开源项目] GitHub开源项目总结 GitHub开源项目android-styled-dialogs http://neast.cn/forum.php?mod=viewthread ...

  6. 开源 ≠ 免费,开源协议License详解

    凡是做过软件开发的,都会接触到开源软件或开源组件,它们都会基于某种协议来提供源码和授权,那么这些开源协议到底有哪些约束呢? 在介绍之前,必须告诉大家,针对开源协议,必须打消“开源 = 免费”这个念头, ...

  7. [开源下载] 【开源项目】EasySL for Silverlight 4

    [开源下载] [开源项目]EasySL for Silverlight 4  [复制链接]       silverlight 452 主题 7 好友 1万 积分 管理员 贡献 879 原创 0 银元 ...

  8. 2016最受欢迎国产开源软件评选,2016 年度开源中国新增开源软件排行榜 TOP 100

    http://www.oschina.net/news/80154/2016-cn-open-source-software-top http://www.oschina.net/project/to ...

  9. OSC2019关于开源的见闻-开源让世界更美好 社会更文明

    一.开源生态报告-红薯-开源中国创始人 1.协作乏力-大厂同样 2.协议许可证使用不当 新许可证-木兰 3.开发者对法律认识完全不够 著作权意识不够 红线意识不够 相关法律法规的熟悉不够 维权及其弱势 ...

  10. 2016 年度开源中国新增开源软件排行榜 TOP 100

    2016 年度开源中国新增开源软件排行榜 TOP 100 2016 年度开源中国新增开源软件排行榜 TOP 100 新鲜出炉!本榜单根据 2016 年开源中国新收录的 3030 款软件的关注度和活跃度 ...

随机推荐

  1. VS2019 添加三方文件夹遇到的坑

    在开发新项目时需要用到一些三方 API,这些三方 API 没有生成 lib,所以我们在 VS 编译器中添加这些三方文件夹的头文件路径后 会出现 ERROR LNK2019 的错误提示,这些提示通常都是 ...

  2. HTTP1.0/HTTP1.1/HTTP2.0的演进

    HTTP1.0 短连接,每次请求都需要重新建立连接 不支持断点续传 HTTP1.1 支持长连接,同一个客户端连接可保持长连接,请求可在连接中顺序发出. 查看http请求头中有keepalive 参数 ...

  3. STL-string模拟实现

    1 #pragma once 2 3 #include<iostream> 4 #include<string.h> 5 #include<assert.h> 6 ...

  4. 2、hystrix原理

    hystrix熔断机制 1.隔离机制 线程隔离: Hystrix在用户请求和服务之间加入了线程池. Hystrix为每个依赖调用分配一个小的线程池,如果线程池已满调用将被立即拒绝,默认不采用排队.加速 ...

  5. sqlserver 查看执行计划

    -- 清除执行计划缓存 DBCC FREEPROCCACHE -- 查看缓存执行计划 SELECT * FROM sys.dm_exec_cached_plans as p CROSS APPLY s ...

  6. Elasticsearch 如何保证写入过程中不丢失数据的

    丢失数据的本质 在本文开始前,首先明白一个点,平时我们说的组件数据不丢失究竟是在指什么,如果你往ES写入数据,ES返回给你写入错误,这个不算数据丢失.如果你往ES写入数据,ES返回给你成功,但是后续因 ...

  7. float、double的精度、范围,在内存中的存储方式

    float.double的精度,在内存中的存储方式 一.浮点型变量在内存中的存储方式 Java的浮点数遵循IEEE 754标准,采用二进制数据的科学计数法来表示浮点数,float遵从的是IEEE R3 ...

  8. day13-Servlet03

    Servlet03 11.练习 快捷键-可以快速地在访问的文件件切换 ctrl+alt+向左箭头:回到上次访问的位置 ctrl+alt+向右箭头:回到下一步访问的位置 11.1CatServlet 首 ...

  9. x86架构的内存溢出攻击原理演示(加强对计算机运行原理的理解,说明内存溢出的危害)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  10. PAT甲级【1014 Waiting in Line】

    考察双向链表 import java.io.IOException; import java.io.InputStreamReader; import java.io.StreamTokenizer; ...