开源维护机制_我成为开源维护者的旅程

开源维护机制

Hacktoberfest是一项邀请世界各地的开发人员参与并为开源做出贡献的计划。 这是我连续第二年参加挑战赛,这让我深受鼓舞,以至于我想分享我稍长一些的开源软件之旅。

很久以前,在一个遥远的星系中……

那一年是2010年。宇宙让我与好朋友Jonas Abreu走过了一条路。 Jonas是Mirror的创建者, Mirror是Java Reflection API上的一个简单的特定于域的语言(DSL)层,它使元编程更加容易。 有一个请求创建代理创建功能的功能,Jonas问我是否对实现它感兴趣。 我接受了挑战。

我忍受了三天,处理着我不理解的代码,直到我明白了。 我仍然记得那天的胜利给我带来的感觉。 那痛苦是知识侵袭我的大脑!

这段代码是我对开源的第一个贡献。 我从为Mirror做贡献的经历中获得了很多收获:

  • 关于Java元编程的很多知识
  • 代理类的概念
  • Javassistcglib框架
  • 如何获得并提供有用和尊重的反馈
  • 如何设计可供他人使用的工具
  • 一些有趣的黑魔法

最重要的是,我带走了目标感。 我喜欢这样的想法:在挑战自我的同时,与比我聪明的聪明的工程师一起工作,为更大的利益做出贡献。

探索为开源做出贡献的方法

我开始参加社区计划,例如运行编码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查询。 我认为这是我参与过的最具挑战性(也是最有趣的)项目。 自从我开始工作已经过去了几年,今天我是维护者之一

这是我通过研究羽毛笔学到的东西:

  • 抽象语法树(AST)
  • 黑暗艺术(也称为Scala宏
  • 如何通过隐式使代码可扩展
  • 排他性和怪异的SQL规则

Quill有一个称为quill-async的模块,它使用不再维护的异步数据库驱动程序 。 Quill的创建者Flavio Brasil建议我们可以编写一个新的异步驱动程序。 这就是开始非阻塞数据库连接(NDBC)的方式

NDBC是Java数据库连接(JDBC)的完全异步替代方法。 它的体系结构旨在在Trane.io FuturesNetty 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上,试图使它们协同工作。

对未来的计划

我在不久的将来想到的贡献正在实现:

我现在已经有将近10年的开源经验,它教会了我一些极为宝贵的知识:开源是关于知识共享。 当我解决问题时,我正在获取知识。 当我发送请求请求时,我就是在传播这些知识。 知识带来更多知识!

我强烈建议您加入开源社区。 这可能很困难,尤其是在一开始的时候,但是您将学到的一切都会使您成为更好的开发人员。 我承诺。

开源是关于知识共享。 当我解决问题时,我正在获取知识。 当我发送请求请求时,我就是在传播这些知识。 知识带来更多知识!

本文最初发布在Juliano Alves的Programming Blog上 为了样式和清晰度,已对其进行了编辑。

翻译自: https://opensource.com/article/19/11/journey-open-source-maintainer

开源维护机制

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值