据我所知,大部分的互联网企业都会使用开源软件。开源软件相对于商业软件有其更为深远的意义,对于一些发展中国家、初创企业而言,完整的构建源代码是非常耗时的,成本也逐渐增加,对于技术人员的要求也更高。开源让这些事情变得简单,优秀的开源软件可以保证源码透明度、软件可靠性、安全性、社区活跃。这促使企业可以更低成本的享受开源软件带来的红利。
作为开发者,在开源世界中我们可以结识到更多优秀的工程师,巩固现有的技能。学习优秀的开源代码也会提升自己的编程能力,参与开源项目会认识到更多和你志趣相同的小伙伴。开源将一群身处世界各个城市的人们连接在一起,在这个虚拟的世界里你也可能会因为一些举措帮助到别人,可能会因为写了一些代码让更多人知道你是谁。
接下来我们来进一步感受它吧~
什么是贡献?
在开源软件中参与一次贡献可以是编程修复BUG,也可以是文档上的错别字被指正,或者是提出一个好的建议,他们都是一种贡献。
发挥所长
我擅长编码
修复新的BUG优化软件性能完成新特性改进构建或自动化测试
我擅长写作
撰写和改进文档编写软件教程为软件发布更新新闻翻译为其他国别语言
我喜欢帮助别人
回答公开的问题帮助其他人解决问题参与一些BUG或者新特性的讨论帮助别人做CodeReview
我擅长组织活动
将社区中的问题分类,让它变得井井有条将最近讨论的问题阐释清楚,以推动讨论组织和策划社区的线上、线下分享活动
我擅长设计
优化官网的用户体验或布局通过调查完善导航栏设计整理一个统一风格的视觉设计为项目创建T恤或更合适的LOGO
当然除了这些也可以不必是软件,在 Github 上也有很多的文档项目、分类列表等,如果你也有收集癖不妨尝试总结一些好的想法分享给大家。
分析项目
当找到一个感兴趣的开源项目时,静下来分析这个项目,每个项目都会有自己的特色,你应该了解一下项目的组织结构和开源准则。一个典型的开源项目均会有如下类型的人:
作者: 项目的作者或发起者归属者: 代码仓库或组织的管理员(不一定和作者是同一个人)维护者: 贡献者,负责项目的未来走向和组织的管理(他们通常也是项目的作者或归属者。)贡献者: 只要是为项目做出了贡献都算。社区成员: 那些使用项目的人们。他们或许是积极的讨论者,又或者是为项目的方向提出意见的人。
一个靠谱的项目中也会列出他们的开源准则,在Github上可能会看一些规范文档:
LICENSE: 根据开源软件的定义,每一个开源项目必须是有开源许可协议的. 可以这么认为:假如说某个项目源码开放,但是没有任何的许可协议,那么它就不能叫做开源。README: README 是一个介绍性的说明文件,对初次光临社区对人们表示欢迎,它通常会解释项目有何用处,为何发起,以及如何快速入门等。贡献文件: README 帮助人们来认识项目,贡献文件则是帮助对项目如何做贡献。它解释了目前项目需要什么样类型对贡献者,社区对流程是啥样的。并非所有的项目都会有这个文件,它某种程度上也是展示项目对于贡献者的友好程度。行为准则: 顾名思义,即是一些参与社区时的一些礼仪、说话方式、行为等,帮助形成一种友好的氛围,不是所有的项目都会撰写行为准则文件,它某种程度上也是展示项目对于贡献者的友好程度。其它文档: 有些项目也许还有其它文档,例如教程、指南,或者是治理规则,这在大型项目中常见。
找到属于自己可以参与的
假如你之前从来都没有为开源做过贡献的话,那么请记住来自美国总统约翰 F.肯尼迪的这段话:“不要问你的国家能为你做什么,要问你能为国家做什么。”
你可以通过以下方式找到合适的项目:
GitHub 探索GitHub 流行First Timers Only你的第一个 PRCodeTriage24 Pull RequestsUp For Grabs像忍者一样贡献
这里是指如何在 Github 找到开源项目,恐怕也没有比这个平台更多的开源项目了。
和他人沟通
当你阅读了项目的准则,可能会有自己的想法,可以尝试发起一个 issue 和其他参与者一起探讨。
在开源世界中和他人沟通是你必须会的一项技能,为了解决一个消费社区问题或者求助于某件事,你应该知道一些准则,否则可能会竹篮打水。
在开始提问前准备好上下文
当回答者想帮助你解决问题的时候必须知道你在什么样的环境下遭遇何种问题才有可能帮助到你。所以你需要尽可能清楚和详细的描述自己的问题,准备好上下文让对方知道你在问什么。
保持内容短小、简洁
能用一句话阐述的就不要长篇大论。
让你的问题公开
在社区的公开 issue 或者社交软件中公开表达你的问题、想法,也许其他人也有这个疑惑,很多人会在你们的交流、意见中受益。
保持友好
开源世界中可能来自不同地区的人,无法完全在同一语境下沟通,所以保持礼貌、善意让沟通变得更加融洽。
可以做的事
添加一个好的想法修复一个文本错误帮助编写文档帮助编写测试用例优化某个函数的性能翻译其他国别语言编写一些Demo示例…
创造属于自己的开源项目
有部分同学有自己的想法,也希望可以将它们被人们使用、让更多人参与,我只有一句:“大胆去做吧”。在开始之前我会告诉你一些技巧和需要注意的地方。
开源是免费的吗?
开源里很重要的一点是拿来主义,拿来主义不光能省去开发成本,还能让你扩充见识和想法,而不会成为井底之蛙还茫然自得。
开源软件是免费的,但是,“免费”只是开源的总体价值的一个副产品。因为开源许可证要求任何人可以几乎出于任何目使用,修改和共享您的项目,项目本身往往是免费的。 如果该项目花钱使用,任何人也都可以合法地复制和使用免费版本。
因此,大多数开源项目是免费的,但“免费”不是开源定义的一部分。 有些方法可以通过双重许可或有限功能间接地为开源项目收费,同时仍然遵守开源的官方定义。
自由与免费
软件是 “自由的”(libre)还是 “免费的”(gratis),这两种说法通常是有区别。也就是说,软件是不需要支付购买费用,还是您可以获得源代码并对其进行自由修改?开源指的是后者。然而,由于开源意味着自由复制,所以开源软件本身没有太多的商业销售。
1. 开源协议
至于如何选择开源协议,我觉得用一张图来解释比较简洁明了。
2. README
README文件不仅仅是用于说明如何使用你的项目。他们还可以解释你的项目为什么重要,以及它可以为你的用户做什么。
在您的README文件中,尝试回答以下问题:
这个项目做什么?为什么这个项目有用?如何开始?如果需要,我可以在哪里获得更多的帮助?
3. 基本Git操作流
Git的操作内容非常多,我们在这里列一些最常用的。
一、新建代码库
# 在当前目录新建一个Git代码库
$ git init
# 新建一个目录,将其初始化为Git代码库
$ git init [project-name]
# 下载一个项目和它的整个代码历史
$ git clone [url]
二、配置
Git的设置文件为.gitconfig,它可以在用户主目录下(全局配置),也可以在项目目录下(项目配置)。
# 显示当前的Git配置
$ git config --list
# 编辑Git配置文件
$ git config -e [–global]
# 设置提交代码时的用户信息
$ git config [–global] user.name “[name]”
$ git config [–global] user.email “[email address]”
三、增加/删除文件
# 添加指定文件到暂存区
$ git add [file1] [file2] …
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] …
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
四、代码提交
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] … -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] …
更多命令
一些点子
自用的小工具某个软件的插件比现有软件更好的解决方案让某件事变得自动化提高程序员生产力更好的文档、流程、沟通协作工具有趣的爬虫项目等等…
这里讲一些打造明星项目的个人观点和经验,针对于个人项目而言。绝大部分的开源项目很可能都会死在半路上,因为种种的原因不在维护下去,是什么让一部分项目变得更受欢迎呢?
编写更好的README
这里为什么说编写更好的README,我不是已经写了README了吗?其实和编写简历也有异曲同工之处,一个好的README会让你的项目在短时间内倍受关注,这些经验是我在后来才发现的。
你需要清楚一点,所有的用户点开你项目链接第一眼看到的就是README文档,只有用户在这个页面停留的时间较长或者因为你的介绍真的很酷,或是一些其他非常赞的特性才有可能关注、支持你的项目。在这件事上要有条理,把所有需要给别人呈现的东西都要提及,下面是一个好的README文档格式参考。
# 项目名称
关于这个项目一段简短的描述
## 特性
- 比 Redis 更快的性能
- 像 Ruby 一样优雅的语法
- 代码不到 1000 行
- 诸如此类的介绍
## 快速入门
用你认为最简单的一种方式解释它是如何运行、部署的。
### 环境信息
比如它是否需要某个编程语言环境的什么版本等等
- JDK1.8
- Maven3
### 如何安装
一个安装的示例,告诉用户你的项目在它的环境下如何安装,必须告诉他需要什么环境。比如:
pip3 install request
## 运行测试
当你有单元测试的时候可以告诉开发者该如何运行他们,以便于学习你的项目。
## 部署
添加附加说明如何部署这个项目
## 基于以下构建
* Dropwizard - The web framework used
* Maven - Dependency Management
* ROME - Used to generate RSS Feeds
## 参与贡献
请阅读 CONTRIBUTING.md 在我们的行为准则的细节,并向我们提交的请求过程。
## 作者
项目的作者是 biezhi
其他贡献者名单 contributors
## 开源协议
这个项目是 MIT License - 可以查看 LICENSE.md 文件详情
好的入门示例
为你的项目编写一个简单、快速的入门示例,让使用者不要困惑。 比如:
public static void main(String[] args) {
Blade().get("/", (req, res) -> {
res.text(“Hello Blade”);
}).start();
}
添加一些徽章
为你的项目添加一些诸如 构建结果、代码质量验证、下载量、测试覆盖率、最新版本等徽章,会让用户第一眼清楚这个项目的很多情况,也是加分项。比如我的项目中使用了这些:
这些徽章都有各自存在的意义,不同编程语言、项目也都有所不同,在这篇文章中就不一一概述了,如果有兴趣可以联系我一起交流。
更快的处理反馈
当有人注意到项目之后,你马上会收到一些 issue 或者 pull request,对于每一个 issue 或者 pull request 都快速的给予反馈,即便你无法立刻处理,也不要让发起者感到这个项目无人问津,这也是让项目保持活力的一种方式。
虽说 酒香不怕巷子深,作为项目的主要贡献者,你的责任是为你的的项目建立文档并推广它。写博客文章,并在社交媒体上分享项目的进展。你可以从简要描述如何成为项目的贡献者开始,并在该描述中提供主要开发者文档的参考连接。你可以通过以下渠道推广你的项目:
V2EX掘金开发者头条Hacker News
关于 Github 推广的一个小技巧,推广时间选择在一周的开始,不用做重复的推广,只要在第一天有很多的关注者,排行到 Github 的流行趋势里那么受欢迎程度的热度还是比较长的。如果可以找到一些有影响力的程序员帮忙宣传一下效果更好。
如果项目真的不错(可以为很多企业服务),也可以在线下找到受众,可以通过公开演讲或者参与聚会让更多人知道这个好的项目。
不断优化
好的项目是不断的优化而来,很多事情往往不是一成不变的,一个开源项目会在拥有一小部分关注后收到来自不同方向的声音。作为项目的发起者需要不断维护和优化它,和那些愿意使用你软件的朋友们一起讨论、交流,让它变得更好。只有这样你的软件才会被传播的更远。
当项有一定的使用者和支持者之后,我们要花更多的时间去管理项目上的一些协作流等任务,比编码更重要的是整个过程。打造一个大家愿意使用、贡献、并主动宣传的人气社区。
建立社区
对于一个初级的小项目而言你可以使用一些IM软件来做为用户沟通,因为 邮件、论坛 这样的方式很难实时,或许会因此流失一部分支持者。目前也有很多流行的工具,像 gitter、QQ群、slack 都是不错的方式,你可以选择自己喜欢的工具。
对于一个发展中的项目而言(这里指用户基数比较多了),IM方式沟通肯定是处理不过来了,维护者可需要更多人参与,可以创建线上的论坛,分不同的版块去交流问题,千万不要做 QQ1群、2群 这种愚蠢的事,要知道更多的群只会让你收到更多垃圾消息而已。
尝试获得报酬
大多数的开源项目都源自某个人的辛苦付出,从经济学原理来讲你在某件事情上所花费的时间可以用金钱来衡量,对于一个开源项目的作者而言如果可以收到一些经济上的赞助或者收益会增大对项目的激情。在这里我们讲一下什么类型的项目容易获得报酬以及开源软件盈利的一些方式。
什么项目容易获得报酬?
开源项目基数庞大,并非每个项目都会有盈利的点,毕竟不是谁都可以做出像 Vue.js 那么受欢迎的顶级项目。项目能否盈利的关键在于它的商业价值,比如 微信公众号 类的项目在国内就会非常受欢迎,为这类项目分一下类目大概是:工具类、自动化类、个性化展示类、提高效率类 等等。
获得捐赠
部分开源软件的维护是需要成本的(像VPS、域名等等),如果你的开源项目想要接受捐赠,你们可以设置一个捐赠按钮(例如使用PayPal或者Stripe,还有支付宝和微信支付),除非您是符合条件的非营利机构(如果你在美国),否则这笔钱不会免税。
技术咨询
当项目的使用者很多的时候技术咨询就是一个赚钱的活儿了,比如像 apache 旗下的一些顶级项目,会有人多人做技术的培训、咨询,因为有些企业只知道这个项目可以帮助他们解决问题、业界推荐,但是他们没专业的人才所以会请一些技术咨询、培训的人帮忙讲授,价格也是比较高的。
二次开发
有些项目实现了一些有趣的点子,对某些营销、其他行业的人更有商业价值,但是对方对现有功能不太满足,可能会找人做二次开发。比如 微信个人机器人,这项目不是官方的,有些公司会有一些自定义的需求,开源项目中提供的功能不够用,会找别人做二次开发,去众包类的网站也是非常常见的一个需求。
增值服务
增值服务的盈利模式在国内比较常见,项目分为开源版本和专业版(专业版收费),像开源中国里绝大部分火起来的项目都是如此,这里就不举例子了,自己去看。
前面我们说了这么多关于开源的事情,相信你大概在心中已经有了自己心中的开源世界,我们可以探索和发现的还有更多,欢迎和更多开源爱好者一起协作、交流,谢谢大家捧场。