开源星球:一个真实的开源开发案例

本文目的是通过分享一个真实的开源案例,让感兴趣的开发者了解一个功能怎么从零合并到GitHub项目。

功能背景:让NJS读写NGINX共享内存

NJS是NGINX作者Igor Sysoev为NGINX软件量身打造的JS引擎,可以让开发者用JS扩展NGINX配置,甚至针对请求和响应的处理,比如鉴权,添加响应头部。以这个功能为例,有了它就可以保存任意的key-value到NGINX的共享内存里。

nginx.conf

http {    js_import test.js;    js_shared_dict_zone zone=foo:32k;    server {        listen 8080;        location /get {            js_content test.get;        }                location /set {            js_content test.set;        }    }}
test.js
function get(r) {    r.return(200, ngx.shared.foo.get(r.args.key));}function set(r) {    r.return(200, ngx.shared.foo.set(r.args.key, r.args.value));}export default {get, set}

理想周期:提出需求->给出结果

当开发团队收到需求时,这需求可能来自用户反馈和内部请求,他们就着手开始开发,最后发布可用代码。那么一个完整的过程是怎么样的呢?

我们先以现实中例子作为比喻。
需求方:我们希望有一架飞机用来载人。
实现方:提供一架可载人的飞机。

回到这个功能就是
需求方:希望NJS能操作NGINX共享内存。
实现方:将实现的代码合并到NJS里。

理想情况下应该就是这样,需求方提出想要什么,实现方根据需求提供什么。然而现实没这么智能,但我们可以根据这个逻辑展开分析。

我们希望交付的不仅是能用的功能,而且是有质量保证的。所以我们得加入一些必要环节到这个周期里,让结果是有质量保证的。

现实周期:需求->开发->Review->发布->结果

现实世界里,我们加了开发代码,Review和发布这几个环节。这些存在的意义是为了保证结果的质量。这几年我在NGINX团队里差不多就是这样,我们发布功能都以这个周期进行。

每个环节要做到什么程度呢?

1. 提出需求:明确且清晰
需求必须是明确的,并且对用户是有价值的,而且它的边界要非常清晰。这也是从事开发开源软件的好处,它不像公司里的业务,它的需求往往比较清晰明确。然后最好能简洁的解释为什么要做这个东西,以这个功能为例:
因为NJS能做应用开发,就需要给它提供更多的功能,让它能跟NGINX交互。在NGINX,共享内存是个非常重要的模块,可以用它保存数据,让这些数据在进程间共享,也意味着任何请求可以共享这些数据。

2.开发:简洁且清晰
这依赖于程序员的代码能力和设计能力,从结果看要做到实现是简洁和清晰的才能称质量比较高。这里还要指出开发的代码是要包含测试用例的,但是每个软件采用的测试用例框架不一样。而且开发完要能跑通测试用例。

3.Review:易于理解和感到清晰
Review的人也是程序员,这环节是非常有必要的,而且很重要的是,程序员看到patch最好直接阅读代码,并且不用经常的问开发者怎么实现的。比如我Review我的同事的这个patch时,我都没问他哪个细节为什么那么实现。假如你看不懂,要么你的经验还跟不上这个软件,要么是他的实现不好,不够清晰和简洁。我的建议是直接看patch,然后找出不合理的设计和实现,或者有逻辑上的bug,提出来让开发的人去改进。所以Review的人一样要有较好的代码能力和设计能力。

4.发布:上线前记得跑通测试用例
到了这里,这功能实际已经完成了。

我们怎么做的:

1. 需求
https://github.com/nginx/njs/issues/437
开源软件有时提的需求在GitHub里建个issue就可以了,然后进行讨论。
这个issue也记录了我们对这个功能和实现的一些讨论,包括其它贡献者的想法。

2. 开发
这是我NJS组的同事开发的,他开发完提交到GitHub的gist里,就是一个patch。你也可以提交PR,也可以用邮件,总之看到的都是一个patch。

3. Review
我一般拿到patch后合并到自己的代码里,编译运行测试。如果自己不试下就Review,这其实是不太好的习惯。Review一般要看实现逻辑是否有bug,如果有阅读起来感觉不清晰或简洁的地方,往往容易有bug。接着看设计,跟逻辑一样,好的设计一定是简洁和清晰的。

4. 发布
根据Review完的patch,修复完issue,跑完测试用例,我同事就发布到线上了
https://github.com/nginx/njs/commit/1fe63aba30cd828c46cd12ea7057c9a2f58b45f6

这就是一个功能怎么从零发布到线上的完整过程。如果没有给开源软件提交过代码,百学不如一练,可以试试用nginx-http-lua-module练手,参考上篇文章。

希望本文对您有启发,觉得有用随手转发
关注公众号不错过精彩文章:(公众号:程序员洪志道)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值