hello大家好,我是小楼。
流量真是个让人捉摸不透的东西,有时候写了一篇自己感觉牛的不行的文章,结果阅读数据惨淡,有时候觉数据可能没那么好的文章,实际数据却出乎意料。

之前的文章《惨,给Go提的代码被批麻了》就是这样,我以为就一般吧吧,没想到却“火了”。
这篇文章截止目前,发表的20天时间里,在掘金阅读量突破1w,知乎阅读量突破1.8w,头条阅读量破1.7w,微信公众号的阅读加上被转载的阅读也有1w,就连公司内网的阅读都有3k。
可以说这个数据是我从写公众号以来最好的了,但我并不觉得它是我写得最好的文章,所以就很迷。
好了,以上只是写技术文过程中的一点点惊喜,这样的惊喜是我继续写好文章的最大动力,所以动动你们的小手,点赞+在看+转发安排起来。
今天我就顺着这篇文章来聊聊大家可能都比较感兴趣的话题,开源。本文会结合自己的一些看法,从参与开源项目的收益和如何参与开源项目两个方面展开。
首先要明确,为什么要参与开源项目?总得对我有点好处吧。每个人可能追求不一样,所以我这里就列举一下我知道的好处,看看有没有戳中你的点。
这点可能是被很多人忽略的点,因为太小了,但确实也算得上一个好处。如果你掌握了一些技巧,每年从开源社区拿点小(薅)礼(羊)物(毛)是很easy的。尤其是国内的社区,T恤、杯子、背包等等是很容易拿到的。
比如这两年Nacos、Dubbo社区送我的一些杯具:


据我观察,阿里的开源项目只要每年都去提一个PR,很大概率会送你礼物,不管这个PR是大是小,可以大到贡献一点源码,也可以小到format一下代码、修改文档中的一些错误、增加一个单元测试等等,所以是不是学到了薅羊毛的技巧?
这点只是满足一下虚荣心,其实并没有什么卵用,但还是提一嘴,比如下面这些素材,是发朋友圈装x的利器:



如果你有参与开源项目的经历,写到简历上一般是个加分项,说一般情况是因为我在面试的时候遇到过候选人在简历上这样写:
参与贡献过上万star的项目。(后面还贴上了项目地址)
一看这句描述就有猫腻,为啥强调上万star却不说出项目名称?于是我打开后面的github地址发现,原来这个上万star的项目是个聚合在线学习资料的项目。
不能说参与这样的项目不好,只是简历上这句话让我感觉在打擦边球,所以不但没有加分,反而减分了。
一般来说对项目有过贡献,无论大小,都可以称之为Contributor,贡献达到一定程度则称为Committer,达到多少贡献才能称为Committer一般每个社区都有自己的衡量标准,比如Nacos社区有明确的规定:

翻译下就是:至少有8个PR,团队协作能力,理解项目的代码风格,能写出优秀的代码。当然也有很多社区没有明文规定,总之就是贡献越多越有可能成为Committer。
所以在简历中如果你是某个项目的Committer就很厉害了,一词胜千言。退一步就算不是Committer,如果你有一些比较重要或者核心的代码提交,也可以写上,附上具体的issue。如果只是代码的format、增加一些单元测试,我建议简历上就不要提了。
通常开源项目的代码、设计、规范都是比较优秀的,和优秀的人一起共事能成长更快。
一般我们在参与开源项目时,都是使用英文来交流,所以对你的英文书写能力是个提升。
其次代码规范、测试能力、考虑事情的全面性都将得到锻炼。
以我个人的感受来说,虽然嘴上说写代码要规范,但在公司写代码的时候,有时候就不太注意,都是以快速完成任务为目标,但开源项目不一样,你写的每一行代码都要被众多的大佬一行一行地review,只要有一点点不满意都会要求你修改。
测试也是如此,你写的每一行代码都将被代码测试,单元测试、集成测试。开源项目更相信用代码测试,所以这也锻炼了你写测试和写代码的能力,写出代码不难,写出容易测试的代码还是比较困难的。
这是更高层级的追求,当你想在技术上走的远的时候,需要一些业界影响力,这时,参与开源是个不错的选择,能结识更多的圈内牛人,也让大家能认识你,你的圈子、人脉就会扩张。
提升影响力有什么作用呢?最直接的是,让别人知道你的存在,下一次机会来临时,说不定你会被看中或者推荐。
当然我离这个层次还很远,只是说一点自己的理解。
上文其实也提到了,参与开源项目不一定是直接的贡献源码,也可以是对文档的编写或修正、写一些单元测试或者测试用例、也可以写一些开源项目相关的文章。
比如我在去年写《Dubbo为什么要用Go重写?》这篇文章时,就顺手把Dubbo-go项目的README改了

还有比如在写《使用dubbo-go搭建dubbo接口测试平台》这篇文章时,把这篇文章投稿给了Dubbo-go官方网站,也被收录进去

这些都算是对开源的一种贡献。当然如果你有代码的直接贡献是最好的,这也是获得技术成长最快的方式。
如果我们平时工作中用到什么开源项目,没事的时候可以把源码下载下来翻一番,可以按照文档跑起来,打上断点看看是否跟自己想的一样,这时我们便有了一些基础,可以去github上的issue找找,一般的项目会把issue分类,可以从标了good first issue或者bug标签的issue看起,看看有没有自己能解决的,再结合代码,一步一步调试。
这种方式目的性比较强,我就是冲着提交代码去的,而且比较有时间去研究,目前我还没用过这种方式,我更多的是下面提到的这种方式。
另外一种是如果我在使用开源项目的过程中发现了一个bug,或者一个可以优化的点,可以去github上提个issue先讨论讨论,如果社区的人也认可你的观点,可以把你的修复或者修复作为一个PR提交上去。
这个方式我在Dubbo/Sentinel/Nacos/Skywalking/Go中都是这么干的,都是平时遇到的一些问题,反哺到社区。
发现问题往往比解决问题更困难,开源项目也是如此。
等等,在你想提交代码前,我建议你好好看看开源项目的规范,一般位于项目的README或者官网中,他对issue有什么要求,对代码有什么要求,对commit message等等都有什么样的要求,如果不按照这些规范来提交,可能你的下场会和我一样,一个字「惨」。
这一步网上资料比较多,我这里只说个大概的流程,具体到每一步我相信你能在网上找到更详细的教程:
万事开头难,往往第一个PR是最难提交的,如果尝试着提交了,我相信你会打开新世界的大门。
对了,虽然我参与到开源项目的经验不够多,但可以给你一点参考,有正例也有反例
好了,今天的分享到此为止,我们下期再见!
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我正在尝试创建一个带有项目符号字符的Ruby1.9.3字符串。str="•"+"helloworld"但是,当我输入它时,我收到有关非ASCII字符的语法错误。我该怎么做? 最佳答案 你可以把Unicode字符放在那里。str="\u2022"+"helloworld" 关于ruby-如何在Ruby字符串中插入项目符号字符?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/1195
我的Rails站点使用了一个确实不是很好的gem。每次我需要做一些新的事情时,我最终不得不花费与向实际Rails项目添加代码一样多的时间来为gem添加功能。但我不介意,我将我的Gemfile设置为指向我的gem的GitHub分支(我尝试提交PR,但维护者似乎已经下台)。问题是我真的没有找到一种合理的方法来测试我添加到gem的新东西。在railsc中测试它会特别好,但我能想到的唯一方法是a)更改~/.rvm/gems/.../foo。rb,这看起来不对或者b)升级版本,推送到Github,然后运行bundleup,这除了耗时之外显然是一场灾难,因为我不确定我所做的promise是否正
我一直在尝试使用nanoc用于生成静态网站。我需要组织一个复杂的排列页面,我想让我的内容保持干燥。包含或合并的概念在nanoc系统中如何运作?我已阅读文档,但似乎找不到我想要的内容。例如:我如何获取两个部分内容项并将它们合并到一个新的内容项中。在staticmatic您可以在您的页面中执行以下操作。=partial('partials/shared/navigation')类似的约定在nanoc中如何运作? 最佳答案 这里是nanoc的作者。在nanoc中,部分是布局。因此,您可以拥有layouts/partials/shared/
我安装了ruby、yeoman,当我运行我的项目时,出现了这个错误:Warning:Running"compass:dist"(compass)taskWarning:YouneedtohaveRubyandCompassinstalledthistasktowork.Moreinfo:https://github.com/gruUse--forcetocontinue.Use--forcetocontinue.我有进入可变session目标的路径,但它不起作用。谁能帮帮我? 最佳答案 我必须运行这个:geminstallcom
我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每
前面一篇关于智能合约翻译文讲到了,是一种计算机程序,既然是程序,那就可以使用程序语言去编写智能合约了。而若想玩区块链上的项目,大部分区块链项目都是开源的,能看得懂智能合约代码,或找出其中的漏洞,那么,学习Solidity这门高级的智能合约语言是有必要的,当然,这都得在公链``````以太坊上,毕竟国内的联盟链有些是不兼容Solidity。Solidity是一种面向对象的高级语言,用于实现智能合约。智能合约是管理以太坊状态下的账户行为的程序。Solidity是运行在以太坊(Ethereum)虚拟机(EVM)上,其语法受到了c++、python、javascript影响。Solidity是静态类型