闲话开源有关开源的一些思考

头像
朱迪
298阅读13评论

前言

在写之前我想泼一下冷水,那些想要在短期内“速成”的可以不用看下面的文字了,参与开源社区并为之做出相对应的贡献是一项长期的,马拉松式的工作。现在有的社区门槛也越来越高了,比如java社区有的项目现在直接要求你用java11+以上了,这就要求你去学最新的java版本的特性,相关指导书籍中文版的几乎没有,很少很少,但是好消息是这些能力你都可以通过自主学习的方式获取。
首先我想谈一谈我个人对国内软件行业从业者的一些现状:
前两年我在国内某一家企业工作的时候,经常看到一些同事去客户那边加班,说是出bug了,有时候还需要通宵,我就问他们,你们有写单元测试和集成测试的习惯么?他们说不写,我说你们怎么不写测试呢?一个和我比较熟悉的同事对我说老板天天催,哪有时间啊!
后来我了解到国内大多数企业都是这样的:
老板不停地催研发===>研发没时间写测试,同时可能也产生了大量的辣鸡代码(包含重复性的代码)而没有重构===>代码容易出bug===>没日没夜的加班===>没时间提升自己===>程序员35+以后没什么人要了(可能因为加班加不动,也可能自己的知识能力也没增长多少,有很多人一年的工作经验重复了好几年==!)
老板为什么要催呢?早点上线早点抢占市场啊!
上面的这个恶性循环可能是造成很多程序员失业或者转行的原因吧;
那么怎么跳出上面这个恶性循环呢?继续看下文;

为什么要做开源

我个人觉得向开源社区做有意义的贡献是突破上面恶性循环的一条行之有效的方法,那么有人就问了,为什么要做开源呢?
先讲一个前些日子我在脉脉上面看到的一件事:
说是一个百度的员工,把自己小组的所有项目都写到了自己的简历上面(不管自己有没参加)
当然了,这个人很鸡贼,面试之前可以把这些项目熟悉了等到面试的时候就可以对答如流;
其实从用人单位的角度来看,上面这种情况不就是属于一种欺骗么?
如果你向开源社区做了相对应的贡献,从用人单位的角度来看,这就是你的真实能力和水平的体现啊,所以很多用人单位非常欢迎向开源社区做贡献的人;
从求职者的角度来看,你向开源社区的对应项目做贡献,其实就是提升你个人在行业内的影响力,有人就是通过向社区贡献代码或者解决bug来找到工作的,不,应该说是工作找到这个人的;只要你有能力做出了相应的贡献,人家一般可以忽略你的年龄,肤色,学校而录用你,当然你的学校越好越好,这里是说这些公司相对应滴不那么看中你的学校出身而不像国内的某些单位必须要求你是xx学校毕业的.
之前我认识一个开源大佬,工作不过三年左右,去国内某厂应聘,对方居然给他开到了70k+,由此可见开源的威力!

向开源社区所做贡献的等级

这里我自己把贡献分为三个等级:
1.修复typo(个人不是很推荐,最Low的级别,但是可以用于练手)和改进代码质量
2.修复bug
3.实现feature
上面三种我只推荐第二和第三种,这两种贡献极其有价值的,会让你的简历从众多的求职者中脱颖而出!

向开源社区做贡献所具备的一些技术基础

我这里仅仅从java技术栈的角度来展开(其他技术栈我不是很熟悉,但是逻辑应该类似)

java语言的基础知识(包含这种数据结构和算法)肯定需要懂的,除此之外,可能还需要以下知识储备:

1.git需要非常熟练的掌握

这里推荐两个课程,一个免费的,一个收费的
- [git学习](https://learngitbranching.js.org/?locale=zh_CN)

- 极客时间的git三剑客

2.单元测试和集成测试

框架和工具有很多,大家可以自己选择;

单元测试我学习的是Junit5

Java: Junit 4/5, Mockito
这里我列举一下常见的语言的测试框架
JS: enzyme, Chai Mochai, Jest, ReactTestUtils, Mock.js

Python: unittest, pytest

Go: testing, gotests, GoMock

集成测试我学习的是Jenkins

写测试的习惯可让让你的pr更容易被人家合并;

学习单元测试的另外一个好处就是在阅读项目源代码的时候你可以通过查看项目的单元测试来快速掌握项目的相关api(后面会再次说到)

3.重构和设计模式需要熟悉

如果这两者不熟悉,在阅读源代码的时候可能会不明白源代码为什么会这么写!

4.jvm相关知识需要熟悉

这里推荐《深入理解java虚拟机》一书

其他语言的话,相关底层知识也应该需要熟悉

5.多线程和高并发的知识也需要熟悉

很多项目的源代码里面也包含了多线程的设计模式

推荐书籍:《图解java多线程设计模式》《Java Concurrency in Practice》

我能想到的暂时就这么多吧;不同的项目可能还需要其他的一些特定的专业知识(比如你想为groovy项目做贡献,那得懂groovy,你想为spark项目做贡献,那你得懂分布式的相关知识)

当然并不是说要把以上所有知识全部掌握才可以为开源项目做贡献,因为bug的难度可能是不一样的,有高有低,那么可以先从简单的入手,feature也是同理;

如何更有效地学习开源项目的代码

1.下载完整的项目文档

这里指的是利用类似git这种工具来下载完整的源代码,而不是简单的下载source.jar。这样做的好处是你可以“跳跃”至这个源代码的任何一个版本以及从开始创建到目前为止的任何一个时间点。

2.示例代码与单元测试(集成测试)

示例代码可以帮助你学会使用相关开源项目的API。举个例子,如果你在某个项目里面想要用dubbo组件,可以google一下 dubbo samples;

阅读单元测试的好处:

* 单元测试本身开发量不大,你很容易就能读懂相关代码

* 每个单元测试都是可以独立运行的,这样节省你跟踪调试的时间。

* 单元测试在很大程度上定义了软件的功能,可以帮你快速掌握项目的相关api。

*  如果你修改了开源项目的源代码可以通过修改单元测试来验证你的修改是否正确。

3.架构文档

阅读架构文档主要是在你对代码的某块内容进行详细研究的时候能很快定位到相对应的地方。

在社区里面提一个问题的正确姿势?

其实不光在开源社区,在微信群里面我就遇到过很多不会提问题的人,就直接截个图,然后说有哪个指导指导,搞的好像人家能在你身上灵魂附体和你有心灵感应一样,殊不知很多情况下一个相同的错误可能是不同的原因所造成的!

在逛开源社区的时候我也发现很多问题无人问津,仔细一看,大多数情况是提问的人没有准确的描述出“案发现场”,导致旁观者相帮也帮不了你。

一般提问题的时候,你最好能够详细描述一下你所遇到的情况,包括版本信息之类的,以及具体的问题是怎么样的,必要时可以附上相应的调用栈信息,详细的信息描述可以减少信息交互的次数,提供信息交流的效率。在寻求帮助的过程中,请仔细阅读README,文档,以及检索以往别人提的相关问题。一旦你对这个问题的相关背景知识有了比较清楚的了解,你所提的问题就会一定深度,也更容易被维护人员关注,
最好有一个可以复现的例子,让潜在的想帮助你的人可以回到“案发现场”。

这里提供一个可以堪称典范的提问题的模板:

https://youtrack.jetbrains.com/issue/IDEA-197550

参与开源项目协作其他需要注意的

1.有很多项目的issue没有放在github里面,需要你搜索一下,举个例子:google: groovy issue tracker

2.commit message的格式尤其需要注意一下[具体格式参见这里](https://chris.beams.io/posts/git-commit/)

大概如下:

3.如何提pr?

[看这里](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/creating-a-pull-request)

现在github的官方文档很多都是以图文并茂的方式手把手教你怎么做,提交pr就是一个例子,如果你还以英语不够好为借口,那我也无话可说了。

结束语

总体而言,参与开源开发是一个日积月累的过程,速成是速成不了的,但是一旦你的工作被越来越多社区开发人员认可,那你在社区的影响力也就越高,你的贡献被大家接受的可能性也也就越高。由此可见,如果你成为了开源社区的资深老鸟,那么你有极大的可能性将会成为这个世界上“拥有不可替代能力”的群体的一部分,虽然要求不低,但是这些能力我们都是可以通过自主学习获取的,肯定会有人说这个要求好tm高啊,我英语不行啊,不现实啊,对于这部分人,我只能送你一句话:活该你被“优化”!祝那些勇于面对困难的小伙伴在这场奇妙的开源之旅中有所收获,玩得开心,我想说的是你们终将有所收获!

最后附上我自己在学习和研究开源的这条路上的一些记录:
https://github.com/richard1230/myJavaBlog
https://medium.com/me/stories/public

收藏
举报
加载中…
精选评论
头像
等级1

参与开源已经是个共识了,但能坚持做下去的人还是小部分

其实只要你有耐心和毅力,你会有意想不到的收获。。。

哈哈哈,这话适用于一切场合。

但是我说的这个意外的收获可能不是一般的意外的收获

头像
等级1

其实说的,都是良言。
但是,在中国,良言经常不被珍惜,弄不好还会被怼。

头像
等级1

我同事很多从github站下载下来的工程编译都很吃力

有的工程确实很大,没办法。。。

头像
等级0

大学生表示很有用

头像
等级3

好文章,深受鼓舞,赞一个

头像
等级0

受教了,平时都在用开源项目,有些开源框架确实有些问题,一直想提,这里找到了最恰当的方法,感谢。