程序那点事 发表于 2021-8-31 00:03:54

如何高效学习 GitHub 项目源代码

先分享个段子。
问:你为什么还没有女朋友
笑死,我在 GitHub 根本不需要女朋友!
1、

之前,小帅b给你分享了一个 GitHub 插件:Sourcegraph,可以使用它在浏览器中直接检察 GitHub 中的源代码:
https://p6.toutiaoimg.com/large/pgc-image/ff4f5b20ac5647bfbbf179fcdb9a4cb6
现在不需要安装插件那么麻烦,你只需要在仓库地址中,在 github 后面加个 1s,就可以直接检察源码了:
https://p26.toutiaoimg.com/large/pgc-image/df7091ba8aae4f70895befe1957585a9
这是个人开发者做的,不久前官方也做了个类似的,你可以在仓库地址中的 「com」改为 「dev」,也可以看到类似的效果:
https://p6.toutiaoimg.com/large/pgc-image/30687c9c8ff349a3afde122da79d280f
更舒服的操纵是,你直接在 Github 项目仓库页面中,在键盘按一下「.」,它会自动把项目重定向 github.dev 去,直接用 vs code 的方式检察源码,一步到位:
https://p26.toutiaoimg.com/large/pgc-image/e7ed234594f74fe9a580db181b390121
2、

通过在线检察 GitHub 源码的方式比较适合参考代码风格、具体方法的逻辑实现,但如果是要学习 GitHub 中的某个项目,最好还是要 clone 到本地,然后在本地上把项目运行起来,完完全全使用一波,在这个过程中你会找到自己的疑问。
有些项目需要搭建好环境,安装各种依赖的框架才能跑得起来,仅凭这一点就拦阻了不少人进入下一步学习。clone 的时候动力满满,项目跑不起来直接劝退自己,然后玩游戏看视频去了。
我想他们并不是真的想学,大概说不是他们真的刚需,所以动力不足。想想你刚入职一家新的公司时,你需要在短时间内熟悉了解工作的项目,如果项目复杂一些,你会慌的一批,但你一定会想方设法,各种搜寻,把环境搭建来,让项目运行起来,然后熟悉各种流程。
所以你想学习一个新的项目的时候,不妨把它想得「严峻」一点,想想学会后自己的价值有所提升的成就感。
3、

当你把功能都操纵一遍之后,你会找到侧重点,好比有些功能是你以为非常简单的,那么这部分你可以不用太关心,但你一定会发现有些是你不会的,有些是你会的但是你想知道它是如何实现的。
反正,跑起来并操纵所有功能之后,你会得到:
1,疑问?(不知道功能如何实现)
2,好奇!(知道如何实现但想知道作者和自己的差异之处)
有了好奇和疑问,这满满的「刚需」,这动力会驱策你想要去学习其中的代码。
4、

一行一行代码仔细看嘛?
也允许以,但我以为先大抵看一下项目代码结构,然后使用 debug 的方式更有效,python 有 pdb,各种编辑器也有 debug 工具,好比 Pychram:
https://p26.toutiaoimg.com/large/pgc-image/cd243f6b6f254d59bc58d64208af6597
由于你已经有自己的侧重点,在你有疑问大概想知道如何实现的地方,打一个「断点」,然后一边运行一遍看结果,你会非常清晰其中的逻辑。
https://p26.toutiaoimg.com/large/pgc-image/b8470b80d9e643769d610b2efd82b260
小帅b和他的朋友们推荐搜刮
github
4.1

举一个简单的例子,好比我看到了一个 2048 小游戏的项目:
https://p3.toutiaoimg.com/large/pgc-image/b72555d4dc144bf595ce181011d061b9
我想知道,当我按下方向键之后,数字叠加是如何实现的,新的随机数是如何产生的?那么就可以在「点击事件」下打一个断点:
https://p6.toutiaoimg.com/large/pgc-image/678cb1a0f6b04dbbafebe83f64d1e53e
这时候你通过 debug 的方式把项目运行起来:
https://p26.toutiaoimg.com/large/pgc-image/5dfa45a7af6645a4af37b9e8633dcba1
然后按一下方向键就会定位到当前执行到断点处的代码。
https://p6.toutiaoimg.com/large/pgc-image/ab206cef9799406f91bbe7e6ab344829
接着就可以使用「step into」大概「setp over」执行接下来的每一步操纵。
https://p6.toutiaoimg.com/large/pgc-image/0e904b09e4414a6faadbcaffccd7a00e
需要看函数具体调用就可以 step into,需要直接看执行后的下一行就可以 step over。
4.2

如允许以在你想关注的地方,知道代码的每一步都做了什么,好比这里的 2048,就是通过二维数组实现的:
https://p3.toutiaoimg.com/large/pgc-image/8023e18bcf0b4615bc4015f6b76816dd
通过一步一步执行,很快你会发现,每次都会不停随机一个空位,然后赋值一个 2:
https://p9.toutiaoimg.com/large/pgc-image/53328cd635af4d95968b9c2cfb2ccebb
如何实现数字叠加更新的呢?一样,在关键处打个断点,你会发现主要实现逻辑在这里:
https://p9.toutiaoimg.com/large/pgc-image/116686efe2f248a0b413a1438862b2b7
每个方法你都可以 step into 进去,末了你会发现,这里的实现是重新排序数组,然后判断相邻的非空数据是否相等,有就进行 「*=2」:
https://p26.toutiaoimg.com/large/pgc-image/7fe2cb8f522843b09d10be7fdb321b96
我演示的这个项目地址:https://github.com/yangshun/2048-python
如许,通过你的每一步执行,你能很清晰的看到作者是如何思考的,你也从中得到了解惑。
如何搜到适合你的项目?看我之前写的:几个 GitHub 高级搜刮本领,这就分享给你。
5、

固然,你在 debug 的过程中,肯定没我刚刚演示的那样顺利,你会碰到一些题目,好比:
有些逻辑实现看不懂
有些算法看不懂
乃至有些语法都看不懂
....
别叹气,这时候你应该感到开心,由于这正是你的「学习机会」,你只是临时还不知道它们,而现在,你已经「知道自己不知道什么东西」了,所以耐下心来,一直重复 debug 很多遍那些「自己不会的关键地方」,每一步都要去想。
实在想不出来?可以去项目的 Issues 中翻一翻,再者,可以使用搜刮引擎搜刮的嘛,倘若很久还是搞不懂(概率很小),那就直接找到作者,给他发个大红包,虚心请教人家。
帅言帅语:方法总比困难多!
直到某个时刻,你一定学会了「自己不知道的东西」,接下来还没完,可以在原有的项目框架中,按照你刚学会的「新知」,添加一个相干的功能,自己独立去实现它,相信这时候对你来说简单许多。
为什么要多做这一步,由于这是「根本」,我们是为了使用,而不是仅仅为了「懂」。
通过如许进一步的的举措,其实是一次很好的总结。也许在这过程你会发现你并没有真正的明白呢。(别问我怎么知道的,哭)
反正如此这般折腾一番之后,你会发现意外的惊喜,好比:
发现了比自己更好的实现方式
发现了自己从来没使用过的库
发现了新的特性
发现自己变得更帅了(这点我深有领会)
....
更爽的是,折腾完之后,让子弹飞一会,由于它会在你的脑子里生成新的「节点」,它很大概率在你未来的某个业务会被关联到,直接用得上!
6、

OK,以上就是小帅b给你分享的一点经验,固然,我知道大部分人看了也不会举措,毕竟很多人关注了我公众号然后就让它躺在列表中,也有的是点进来之后,随便划一下就退出,然后还总是诉苦:要是我xxx也不至于xxx。
我更盼望以上的内容能给你带来一点参考,你可以慢慢地去执行,然后在过程中找到适合自己的「方法论」,去体验其中的爱好,扎实的成长。
像你这种认真看完了,三连了,还去默默执行的,咋能一样呢?
我们下回见,peace!
转自:https://mp.weixin.qq.com/s/wKkEBIalV-9lnw8bx3qHsQ

cyq一百三十七分之一 发表于 2021-8-31 11:21:19

转发了

00爬行的蜗牛8 发表于 2021-8-31 02:33:55

转发了
页: [1]
查看完整版本: 如何高效学习 GitHub 项目源代码