阅读源码是程序员学习的必要方法之一,尤其是一些优异的开源项目,其代码基本可以视为业界的一个标杆,阅读这些项目的源码可以说是好处多多。但是,我们也不能无目的无计划地阅读源码,死记硬背,走马观花并不能带来什么实质性的提高。我个人认为,阅读源码的目标主要是以下几个:
1)理解和学习作者解决特定问题的思路和方法
2)模仿和借鉴局部代码的组织形式
3)熟悉和深入理解代码所使用的编程语言的特性
4)学习项目相关领域的知识和方法论
当然,阅读源码并不是一件非常轻松简单的事情,需要耗费大量的精力和思考,甚至会因为效率问题而浪费你大量的时间,毕竟,最难理解的东西永远是“别人的代码”。不过,目前一些成熟优异的开源项目都包含有丰富的文档,这些能够给你阅读源码提供很大的帮助,而一些恰当的方法和技巧也能使你的学习过程事半功倍。比如说,记录就是一种很好的学习方法,你可以随着源码的阅读过程,把你的思考和理解用文章记录下来,不但能够加深你的记忆和理解,事后也能够通过文章来反思学习,同时还能锻炼你的文笔和语言组织能力,可以说是一举多得。最近我正好在研究kubernetes,顺便用一个系列的文章记录了我学习k8s代码的心得和体会。
源码阅读一般从代码结构入手,k8s的程序入口都在cmd目录下面,核心逻辑都在pkg目录下面。这么做的好处是把程序入口和逻辑分开,因为程序入口只做了一些最简单的调用,具体逻辑是模块化的类库,即增强了程序的可读性,也便于一人负责一个模块多人互相协作,这一点在大型项目中非常重要。我们可以看到pkg目录下面有很多子目录,每一个子目录都包含了一个必要组件:
pkg目录结构如果熟悉kubernetes原理和架构的话,你可以看到其中几个关键组件:
1)api/apis/kubeapiserver:k8s对内对外api。
2)controller: 核心控制逻辑,维持cluster状态,提供弹性,自愈,高可用等能力。
3)kubelete: 部署在节点上的agent,监控和管理每个节点的资源和状态。
4)scheduler: 提供pod部署逻辑的模块。
5)kubectl: k8s命令行工具。
进入每个单独目录,你可以发现他们都遵循几乎一样的目录结构,因为k8s使用了bazel这个工具来编译代码和测试,关于这个工具可以参考 https://bazel.build
子目录结构点进去我们可以发现每一个子目录都包含了一个BUILD文件和一个OWNERS文件,OWNERS文件比较简单,里面是这个目录的maintainer和reviewer名单,BUILD目录则包含了这个程序的依赖库和单元测试等,在编译的时候需要使用这些的信息。
后面,我会阅读几个主要的模块的源码,看看它们的功能究竟是怎么实现的。
网友评论