既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
转载于:https://time.geekbang.org/column/article/10022
你好,我是华仔。今天这期“特别放送”,我想和你聊聊如何高效地学习开源项目,一方面澄清开源项目学习过程中的几个误区,另一方面谈谈我自己具体实践时的一套方法论。
得益于开源运动的蓬勃发展,众多技术顶尖的公司、团队或者个人通过开源的方式向技术社区贡献了许多优秀的开源项目,一方面大大促进了整体技术的发展,另一方面大大减轻了中小公司和团队在技术方面的投入压力,让团队能够更加聚焦于业务。
开源项目对团队和业务有很大好处,但对于技术人员来说,如果只是简单的采取“拿来主义”,那就变成一个陷阱:看似很快的用开源项目实现了需求,但自己的技术水平并没有什么提升;甚至可能出现看起来用了很多开源项目,知道很多项目名称,但技术水平止步不前的窘境。
因此,对于开源项目,不能简单的采取“拿来主义”,而要比较深入的去学习开源项目,做到“知其然,知其所以然”,一方面是为了更好地应用这些开源项目,另一方面也是为了通过学习优秀的开源项目来提升自己的能力。
很多技术同学确实也想深入学习一些业界成熟和优秀的开源项目,例如 Nginx、Redis、Netty 等,但是在具体实践的时候,常常因为一些不正确的观点而误入歧途,例如:
只有开发这些开源项目的人才能真正理解,我没法参与这个项目开发,因此我很难深入理解。
我的项目没有用 Redis,不用的话很难深入理解。
数据结构和算法很重要,所以我只要研究其数据结构和算法就够了,例如 Nginx 用的红黑树。
“Talk is cheap, show me the code”,一头扎进源码逐行阅读。
这些观点要么让自己望而生畏从而轻易放弃,要么让自己浪费大量时间而没有多大收获。那究竟要怎样做才是正确的呢?下面我结合自己的经验谈谈我对如何学习开源项目的看法。
首先,需要树立正确的观念:不管你是什么身份,都可以从开源项目中学到很多东西。
例如,要理解 Redis 的网络模型,我们不需要成为 Redis 的开发者,也不需要一定要用到 Redis,只要具备一定的网络编程基础,再通过阅读 Redis 的源码,都可以学习 Redis 这种单进程的 Reactor 模型。
其次,不要只盯着数据结构和算法,事实上这两点在学习开源项目的时候并没有那么重要。
例如,Nginx 使用红黑树来管理定时器,对于绝大部分人来说,只要知道这点就够了,并不需要去研究 Nginx 实现红黑树的源码是如何写的,除非你需要修改这部分,但我认为极少人会有这个需求。
第三,采取“自顶向下”的学习方法,源码不是第一步,而是最后一步。
不要一上来就去看源码,而是要基本掌握了功能、原理、关键设计之后再去看源码,看源码的主要目的是为了学习其代码的写作方式,以及关键技术的实现。
例如,Redis 的 RDB 持久化模式“会将当前内存中的数据库快照保存到磁盘文件中”,那这里所谓的“数据库快照”到底是怎么做的呢?在 Linux 平台上其实就是 fork 一个子进程来保存就可以了;那为何 fork 子进程就生成了数据库快照了呢?这又和 Linux 的父子进程机制以及 copy-on-write 技术相关了。
通过这种方式,既能够快速掌握系统设计的关键点(Redis 的 RDB 模式),又能够掌握具体的编程技巧(内存快照)。
接下来我详细谈谈“自顶向下”的学习方法和步骤。
第一步:安装
很多人看到“安装”这个步骤都可能会觉得有点不以为然:“不就是对照手册执行一下命令么,没什么技术含量,用的时候装一下就可以了”。事实上,安装步骤远远不止这么简单,通过具体的安装过程,你可以获取到如下一些关键信息:
这个系统的依赖组件,而依赖的组件是系统设计和实现的基础
以 Nginx 为例,源码安装 Nginx 依赖的库有 pcre、pcre-devel、openssl、openssl-devel、zlib,光从名字上看都能够了解一些信息,例如 openssl 可能和 https 有关,zlib 可能和压缩有关。
再以 Memcache 为例,最大的依赖就是 libevent,而根据 libevent 是一个高性能的网络库,我们就能大概推测 Memcache 的网络实现应该是 Reactor 模型的。
安装目录也能够提供一些使用和运行的基本信息
例如,Nginx 安装完成后,目录如下:
这个目录提供的信息有:conf 是存放配置文件的,logs 是存放日志的,sbin 是运行程序,但是 html 是什么呢?这个疑问会促使你继续去研究和学习。
再来看看 Redis,安装完成后,目录下只有一个 bin 目录,具体如下:
我相信大部分人看到这目录都会感到有点惊讶:这也太简单了吧,尤其是与 Nginx 相比!因此也会自然而然的有一些疑问,例如 Redis 如何配置?Redis 日志保存在哪里?这些疑问同样会促使你继续去研究和学习,带着问题去学习效率是最高的。
系统提供了哪些工具方便我们使用
同样以 Redis 为例,你可以看到 redis-benchmark、redis-check-aof 等程序,从名字能够大概猜出这些工具的基本使用场景,而这些工具在后面故障定位和处理、性能测试等场景可能非常方便。
第二步:运行
安装完成后,我们需要真正将系统运行起来,运行系统的时候有两个地方要特别关注:命令行和配置文件,它们主要提供了两个非常关键的信息:系统具备哪些能力和系统将会如何运行。这些信息是我们窥视系统内部运行机制和原理的一扇窗口。
例如,下面是 Memcache 的启动参数一部分:
通过这几个启动参数,你可以获取如下一些信息:
Memcache 支持 UNIX socket 通信和 TCP 通信。
Memcache 可以指定内存大小。
lock memory 看起来和内存有关,但具体是什么意思?配置和不配置有什么区别么?
通常情况下,如果我们将每个命令行参数和配置项的作用和原理都全部掌握清楚了的话,基本上对系统已经很熟悉了。我的一个习惯是不管三七二十一,先把所有的配置项全部研究一遍,包括配置项的原理、作用、影响,并且尝试去修改配置项然后看看系统会有什么变化。例如,将 Memcache 的“–conn-limit”改为 1 后,查看多个连接请求时 Memecache 会返回什么错误、记录什么日志等。
第三步:原理研究
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
以添加戳这里获取](https://bbs.csdn.net/topics/618658159)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!