开源维护机制
Hacktoberfest是一项邀请世界各地的开发人员参与并为开源做出贡献的计划。 这是我连续第二年参加挑战赛,这让我深受鼓舞,以至于我想分享我稍长一些的开源软件之旅。
很久以前,在一个遥远的星系中……
那一年是2010年。宇宙让我与好朋友Jonas Abreu走过了一条路。 Jonas是Mirror的创建者, Mirror是Java Reflection API上的一个简单的特定于域的语言(DSL)层,它使元编程更加容易。 有一个请求创建代理创建功能的功能,Jonas问我是否对实现它感兴趣。 我接受了挑战。
我忍受了三天,处理着我不理解的代码,直到我明白了。 我仍然记得那天的胜利给我带来的感觉。 那痛苦是知识侵袭我的大脑!
这段代码是我对开源的第一个贡献。 我从为Mirror做贡献的经历中获得了很多收获:
最重要的是,我带走了目标感。 我喜欢这样的想法:在挑战自我的同时,与比我聪明的聪明的工程师一起工作,为更大的利益做出贡献。
探索为开源做出贡献的方法
我开始参加社区计划,例如运行编码dojos。 在此过程中,我遇到了更多伟大的开发人员,因此我们成立了一个小组。 在某个时候,该小组决定学习Scala。 我们一起学习和编码,并最终建立了Scaladores (圣保罗的Scala用户组)。
最终,乔纳斯开始谈论另一种学习方法,称为故意练习 。
如果我们可以将所有这些最近获得的知识全部放在一起怎么办?
通过研究该实践而产生的项目是Aprenda ,这是一个学习平台,将游戏化和故意的实践相结合,使学习HTML,正则表达式或Git更加容易。 在我追求开源贡献的过程中,构建如此重要的东西就像升级一样。 我还发现,我学到了更多有关编程和实践的知识,以激励他人和我自己。
在享受这一追求的过程中,我花了很多时间来做这个项目。 在我在Aprenda上取得进步的同时,我不得不将重点转移到新工作上。
通过我自己的Ruby gem进行贡献
我的新工作使我处于一种常见的模式:通过编写可创建,读取,更新或删除数据(CRUD)的代码来解决每个问题。 它给了我一个主意,因此我开始了一个新项目。 我想以一种功能强大的Web框架Ruby on Rails允许我用一个简单的命令: rails g scaffold设置环境的方式生成代码。 使用Thor ,这是为Rails生成器提供动力的同一个宝石,我创建了Spring MVC Scaffold 。 现在,任何时候我需要创建一个CRUD时都输入:
$ springmvc scaffold product name:string value:double active:boolean
我编写的代码减少了团队要完成工作所需要做的工作,我通过公开发布进一步共享了代码。 以下是我学到的一些重点内容:
- 使用Thor生成代码和文件
- 定义CLI的命令
- 组织Ruby lib代码
- 创建一个Ruby宝石
- 使用Travis CI构建项目
- 发布到RubyGems
解决了常见问题后,请考虑使该解决方案可用。 其他人很可能也有类似的问题。
即使不再维护,Spring MVC Scaffold仍然可以在RubyGems上使用 。 我告诉你,在那个项目之后,我是在充满问题的技术环境中工作的。
转变技术
我的新工作需要语言上的转变。 我开始使用Microsoft .NET,发现其他社区已经解决的问题。 这种认识使我激动,因为我知道这是我的机会。 我新的贡献机会来自移植这些解决方案的形式。
Selenium
Selenium是与网站进行编程交互的主要方式,就好像代码是“真实”用户(通过Web浏览器访问它)一样。 我认为该API一直太复杂。 因此,我建立了一个名为Selenia的工具,该工具可用于用C#编写简洁的UI测试,因此无需使用:
IWebDriver driver
;
ChromeOptions options
=
new ChromeOptions
(
)
;
options
.
addExtensions
(
new File
(
"/path/to/extension.crx"
)
)
;
ChromeDriver driver
=
new ChromeDriver
( options
)
;
driver
=
new ChromeDriver
(
)
;
driver
.
Navigate
(
)
.
GoToUrl
(
"http://www.google.com/ncr"
)
;
IWebElement query
= driver
.
FindElement
(
By
.
Name
(
"q"
)
)
;
query
.
SendKeys
(
"Selenium"
)
;
query
.
Submit
(
)
;
driver
.
Quit
(
)
;
我们可以这样写:
Open
(
"http://www.google.com/"
)
;
S
(
By
.
Name
(
"q"
)
.
Value
(
"Selenia"
)
.
Enter
(
)
;
Selenium用户此时可能会有疑问。 如果您想知道,答案是“否”。 不必自己关闭驱动程序。
使用Ioget设计不变性
不变性意味着永远不会更改已经存在的对象,这使开发人员的生活变得轻松。 但是,这种观点是较新的观点。 过去,ASP.NET MVC会建议就地更新信息。 实例化对象的唯一方法是通过setter 。
我构建了Ioget,以帮助在Web应用程序中解组请求参数。 HTTP请求参数是字符串,因此Ioget寻求根据给定类解析这些参数的最佳方法,并通过其构造函数实例化对象,从而使它们不可变。
我向NuGet公开发布了该项目,但从未像我打算的那样将Ioget与ASP.NET集成。 我停止使用Microsoft技术,因此该项目落后于曾经的崇高目标。
继续我的认真实践,我一直跟踪着在此过程中所学到的教训。
- 化身
- ASP.NET MVC内部
- Monad实施
- .NET Framework内部
我还记下了与Selenia一起使用的模式。 我非常喜欢此片段,该片段曾经用来关闭驱动程序:
private void MarkForAutoClose(IWebDriver driver) =>
AppDomain.CurrentDomain.DomainUnload += (s, e) => driver.Quit();
贡献羽毛笔
我于2016年移居伦敦,暂停了我的捐款一段时间。 最终,我观看了Gustavo Amigo关于他的项目quill-pgsql的演讲,该项目是通过Quill支持PostgreSQL数据类型的扩展。 他提到该项目尚处于初期阶段,这意味着它非常适合某人加入,我对在Scala中进行写作很感兴趣。 在提出一些请求之后,我决定为主要项目做出贡献。
Quill在编译时将类似于集合的常规代码转换为SQL查询。 我认为这是我参与过的最具挑战性(也是最有趣的)项目。 自从我开始工作已经过去了几年,今天我是维护者之一 。
这是我通过研究羽毛笔学到的东西:
Quill有一个称为quill-async的模块,它使用不再维护的异步数据库驱动程序 。 Quill的创建者Flavio Brasil建议我们可以编写一个新的异步驱动程序。 这就是开始非阻塞数据库连接(NDBC)的方式 。
NDBC是Java数据库连接(JDBC)的完全异步替代方法。 它的体系结构旨在在Trane.io Futures和Netty 4之上提供与数据库的高性能,非阻塞连接:
// Create a Config with an Embedded Postgres
Config config
= Config.
create
(
"io.trane.ndbc.postgres.netty4.DataSourceSupplier" ,
"localhost" ,
0 ,
"user"
)
.
database
(
"test_schema"
)
.
password
(
"test"
)
.
embedded
(
"io.trane.ndbc.postgres.embedded.EmbeddedSupplier"
)
;
// Create a DataSource
DataSource
<
PreparedStatement , Row
> ds
= DataSource.
fromConfig
( config
)
;
// Define a timeout
Duration timeout
= Duration.
ofSeconds
(
10
)
;
// Send a query to the db defining a timeout and receiving back a List
List
< Row
> rows
= ds.
query
(
"SELECT 1 AS value"
) .
get
( timeout
)
;
// iterate over awesome strongly typed rows
rows.
forEach
( row
->
System .
out .
println
( row.
getLong
(
"value"
)
)
)
;
在此过程中获得了更多的知识:
- 了解二进制协议
- 使用Netty 4
- Java类型系统的弱点
- 全面实施职能结构
那就是我现在的位置。 我将注意力集中在Quill和NDBC上,试图使它们协同工作。
对未来的计划
我在不久的将来想到的贡献正在实现:
- Finagle Postgres中的数组支持
- NDBC的Clojure包装器
- 一个NDBC弹簧模块
- Rust中的CLI
我现在已经有将近10年的开源经验,它教会了我一些极为宝贵的知识:开源是关于知识共享。 当我解决问题时,我正在获取知识。 当我发送请求请求时,我就是在传播这些知识。 知识带来更多知识!
我强烈建议您加入开源社区。 这可能很困难,尤其是在一开始的时候,但是您将学到的一切都会使您成为更好的开发人员。 我承诺。
开源是关于知识共享。 当我解决问题时,我正在获取知识。 当我发送请求请求时,我就是在传播这些知识。 知识带来更多知识!
本文最初发布在Juliano Alves的Programming Blog上 。 为了样式和清晰度,已对其进行了编辑。
翻译自: https://opensource.com/article/19/11/journey-open-source-maintainer
开源维护机制