你是否想知道,Java创始人James Gosling老爷子,年轻的时候,在JDK中写过哪些代码;你是否想知道,Java集合框架创始人,Google首席Java架构师Joshua Bloch,写的代码是什么样子;github速度慢,下载代码难,阅读源代码困难重重,怎么办;如何知道JDK中,有多少个地方,抛出了内存溢出异常OutOfMemoryError;进大厂,找内推,如何从github源码中,找到大厂员工的公司邮箱;前google软件工程师,Beyang Liu 辞职创业,开发的代码搜索平台sourcegraph,帮你解决上述困难,实现上述目标。
大家好,我是码农老吴,今天是我们极客架构师,推出的《极客兵器谱》第一期,我要向大家分享的,是由ex-Googler(google前员工),一个生活在San Francisco, CA(加利福尼亚州,旧金山),名叫Beyang Liu的软件工程师(不知道是中国留学生还是亚裔美国人)。推出的,受到全球程序员热爱的,源代码搜索平台——Sourcegraph。
缘起
Sourcegraph源码搜索平台
常用操作思维导图
先搜索大牛的代码看看
Java创始人James Gosling的代码
Google的首席Java架构师Joshua Bloch的代码
给你喜欢的开源软件投票
三种搜索模式
普通搜索模式
正则表达式搜索模式 结构化搜索模式 后续
为什么要分享这个代码搜索平台呢。
直接原因就是,我们的《架构师基本功之设计模式》已经分享到了第10期,已经分享了8个设计模式,对于每个设计模式,除了讲解正式内容外,还会结合知名的开源软件,讲解设计模式在真实项目里面是如何落地的。不少网友反馈,看源代码比较麻烦,特别是要看大量框架的源代码,一个一个下载,花费了不少时间。由于众所周知的原因,github在国内访问速度慢,还常常掉线,体验差强人意。为了解决大家看源代码难的问题,提高大家阅读源代码的效率,现决定进行此次分享,希望对大家能有所帮助。
普通搜索模式
只搜java语言(lang:java)
只搜spring代码库
(repo:^github\.com/spring-projects/spring-framework$)
只搜文件名(file:factory)
只搜文件内容(content:factory)
正则表达式搜索模式
找个邮箱(lang:Java \b[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.com)+\b)
找个文件名以Factory结尾的java类
(lang:Java repo:^github\.com/spring-projects/spring-framework$
file:[a-zA-Z0-9_-]*Factory\.java)
正则表达式中的空格,相当于任意多个字符
正则表达式语法哪里找(https://github.com/google/re2/wiki/Syntax)
结构化搜索模式
这样的代码,吃掉你的异常(lang:Java catch (...) { })
Try with Resources(lang:Java try(...){...})
静态内部类(lang:Java private static class ...{...})
流语句(lang:Java stream().filter(...))
OutOfMemoryError异常
(lang:Java repo:^github\.com/openjdk/jdk$ -file:test content:OutOfMemoryError(...) count:all)
结构化查询语法哪里找(https://comby.dev/)
搜索:lang:java content:James Gosling
上面的搜索词,是什么意思,我们先不管。
学java,我只服Java创始人James Gosling(詹姆斯)老爷子
结果点评
看来,Java创始人James Gosling,最早参与了jdk中swing模块的开发
搜索:lang:java content:@author Joshua Bloch
前面我们刚刚分享了Joshua Bloch(Java集合框架创始人,Google的首席Java架构师)的建造者设计模式,他的代码,我们也瞧一瞧。
结果点评
看来,Joshua Bloch确实参与了java集合框架相关的开发工作,Arrays类里面有他的代码。
即使看不懂上面的搜索词,但是总结规律,举一反三,查找其他大牛的代码,大家应该不成问题了。
下面我们就从头开始,系统地学习,先看普通搜索。开始之前,希望大家先投个票。
我们后面要给大家解读,开源软件里面的设计模式,我列出了一些知名的开源软件,希望大家能投个票,我好调整我的分享重点,由于平台的投票,只能输入8个选项,如果你喜欢的开源软件,不在其中,可以在评论区留言,谢谢大家。
Sourcegraph平台,支持三种搜索模式:
普通搜索:也就是关键词搜索,平台不对用户输入的搜索词,进行正则表达式解析,直接进行搜索匹配。
正则表达式搜索:顾名思义,用户在输入的搜索词中,可以使用平台支持的RE2格式的正则表达式。
结构化搜索:更高级一些,可以搜索指定的语法结构,比如条件语句,循环语句,try catch等,但是功能不是特别完善,还在发展中。
老吴刚刚分享完工厂模式,想通过开源软件,研究一下工厂模式,在知名的Java开源软件里面,是如何落地的。庆幸的是,工厂模式在实际项目中,命名还是比较规范的,一般类名中,会包含“factory”关键词,我们就从这里出发。
搜索:factory
注意:搜索框最右边的三个按钮,先不要乱点哦,咱们还用不上。
结果点评
看到了吗,看到了吗,不看还好,看了我就火冒三丈,什么意思,前面几个结果,竟然有三个是python项目的,还有一个不知道是啥项目,凭什么不是java项目,为什么不是java项目,近几年,Python语言频频对我们的java语言发起挑战。Beyang Liu,难道你不知道,java语言是世界上最好的语言吗,你们的团队,需要加强思想改造啊,好好上一上政治课。
我只想看java,怎么做。
搜索:factory lang:java
lang全称是language
平台不仅仅支持java,还支持很多语言哦。
结果点评
查询结果,现在好点了,看到java项目了,我的心情平静了不少,血压也正常了,都是我们熟悉的java类了,但是flutter框架,不太熟悉,查了一下,原来是个前端框架,这次又被前端抢了风头,算了,看在都是java语言,放你们一马。
我们要看知名的,顶级的,一流的java项目,比如spring,怎么办?
搜索:factory lang:java repo:^github\.com/spring-projects/spring-framework$
repo 全称 repository 代码仓库
看到“^github\.com/spring-projects/spring-framework$ ”,大家不要慌,不要忙,这个可不是我一个字一个字打上去的。如果真是那样,估计这个平台早已不复存在了,Beyang Liu估计已经穷的交不起电费了,毕竟目前美国的通胀还是比较严重的。只需要输入spring,利用自动补全功能,选择咱们需要的项目就可以了。
但是大家注意,包含“spring”的项目不少,具体选哪个,就得自己先对spring项目,里面的子项目有一定了解了,下面是常见的spring子项目。
结果点评
现在的结果,显示的就是spring框架里面的java类了,但是大家注意,从查询结果可以看出,平台默认不仅从文件名里面查询,还包括文件内容。也就是查询的是文件名或者文件内容中包含factory搜索词的java类文件。
如果我们就只想根据文件名查询呢。
搜索:lang:java repo:^github\.com/spring-projects/spring-framework$ file:factory
注意,瞪大眼睛,看看上面的输入,除了后面增加了一点点内容,还有什么变化呢,前面是不是少了一点点什么。
结果点评
大家注意,从查询结果可以看出,查询的结果里面,不仅包括文件名中包含factory的,包名词包含“factory”的也查询出来了。也就是“file”指令,其实是根据类的“全限定名”进行查询的,不知道啥是全限定名的,需要自己反思一下了。
如果我只想从文件名中查找,不想查找包名,怎么办,后面的正则表达式查询模式,可以帮我们解决,这里先挖个坑,后面再填。
那如果我只想从文件内容中查询,怎么办呢。
搜索:lang:java repo:^github\.com/spring-projects/spring-framework$ content:factory
结果点评
这次查询的结果中,就是文件内容中包含“factory”的类,虽然文件名中也出现了,但那纯属巧合,而且也没有高亮显示。
好了,好了,本宫乏了,就不和包,文件名,文件内容过不去了。
普通的查询模式,我们就分享到这里,作为程序员,未来的架构师,不学点高难度的查询,说不过去。我们就看看sourcegraph平台的正则表达式查询模式。
输入:lang:Java \b[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.com)+\b
注意:
先开启正则表达式模式,搜索框右侧第二个图标要高亮。
\b表示单词的边界, 其他的都是正则表达式的内容,大家都是程序员,我就不多说了。
这里的邮箱正则表达式,不是一个正规的正则表达式,只能查找".com"结尾的邮箱,主要是用正规的,查询的结果,邮箱好像都是国外的,很奇怪,看着不舒服,所以我临时调整了一下,可别在你们的项目里面,直接用这个正则表达式,出了事,码农老吴可不负责哦。
查询结果:
结果点评
看来源码里面邮箱不少,有没有大厂员工的内部邮箱,找个大厂员工的内部邮箱,看看能不能给来个内推。
找个我的老东家,JD的试试。
输入:lang:Java \b[a-zA-Z0-9_-]+@(jd\.com)+\b
结果点评
确实有,不知道这些邮箱,还是否有效。看来要交个大厂的朋友也挺容易。
邮箱可以找到,就是不知道有没有手机号,微信号啥的。大家可以自己找找试试。
前面我们挖了个坑,大家还记得吧,只想找文件名,不想从包名称里面找,现在我们就来填这个坑。
输入:
lang:Java repo:^github\.com/spring-projects/spring-framework$ file:[a-zA-Z0-9_-]*Factory\.java
输入:lang:Java repo:^github\.com/spring-projects/spring-framework$ file:abstract factory
注意,abstract 和factory之间有空格,这个空格,是什么意思呢,我们看看。
结果点评
当使用正则表达式,单词之间的空格,相当于两个单词之间,可以有任意多个字符,前提是这两个单词必须在同一行。
授人以鱼不如授人以渔,想自由发挥,正则表达式哪里找。
sourcegraph平台,支持的正则表达式,使用的是Beyang Liu老东家,google公司提供的开源正则表达式类库RE2. github上有详细的语法说明。
正则表达式搜索模式,分享完毕,如果sourcegraph只有这些功能,不足以彰显他们的技术水平。下面我们要看看,更高级的结构化搜索模式。
在前面的《代码不朽》的分享中,我曾经分享过一个内容,什么样的代码,可以吃掉你的异常信息,那就是空的catch语句块(这个问题,在Sourcegraph平台的官方文档中,也做了说明,说明大家都很重视这个问题)。那我们看看,这种代码在开源软件里面有没有。
输入:lang:Java catch (...) { }
注意:
1,开启结构化搜索模式,搜索框右侧第三个图标要高亮。
2,"...":这个符号,在平台里面有个专用名词,叫hole,可以理解为占位符,或者是任意多个字符,它不会破坏用户输入的语法结构。上面的catch (...),表示catch关键词后面的括号里面的内容任意。
结果点评
可以看到,大名鼎鼎的人工智能框架tensorflow里面,竟然也有空的catch语句,稍稍令人欣慰的是,是出现在test代码里面,还是可以原谅的,毕竟测试代码的质量,一般人都不重视。
每当Java语言,出了新语法,自己不知道怎么落地,可以到开源软件中看看,学习学习,参考一下。
输入:lang:Java try(...){...}
结果点评
可以看到,查询结果,大部分符合我们的要求,使用的是java里面比较少见的Try with Resources 语法。也有不符合我们预期的结果,看来这个平台,还是有优化的地方。
输入:lang:Java private static class ...{...}
输入:lang:Java stream().filter(...)
输入:
lang:Java repo:^github\.com/openjdk/jdk$ -file:test content:OutOfMemoryError(...) count:all
注意几点:
1,想看jdk源码,需要访问的项目是openjdk,而不是oracle的JDK,更不是sun的JDK,原因学java的应该都知道
2,“-file”,file前面加个-,或者其他指令前面加个“-”,都表示取反,也就是排除掉。这里我要排除的是test里面的代码,也就是测试代码。
3,“count:all”,表示要查找所有的结果,平台默认是不会查找所有结果的。从结果上看,JDK里面有38个地方,会抛出内存溢出异常,包括大家熟悉的ConcurrentHashMap类。
sourcegraph平台的结构化查询模式,还不是特别成熟,目前对java语言,还没有提供特别有意义的参考案例,相信将来会发展的越来越好。
根据二八原则,在一个领域,百分之二十的关键知识,能解决百分之八十的问题,希望我今天分享的,就是sourcegraph平台,这关键的百分之二十。
后面,我会结合大家的反馈,对这个平台的一些专项内容,垂直领域,进行分享,比如:
如何查询指定的版本;
如何查询指定的分支;
如何查询作者提交代码时编写的commit;
如何在idea工具里面使用平台的插件;
如何把自己的开源软件,添加到Sourcegraph平台;
不一而足,大家有感兴趣的,或者使用中遇到什么问题,可以评论区留言,我们一起解决,我也会根据大家的反馈,及时调整后面的分享计划。
极客架构师,专注架构师成长,我们下期见。
留言与评论(共有 0 条评论) “” |