设为首页 收藏本站
查看: 842|回复: 0

[经验分享] 转: 学习开源项目的若干建议(infoq)

[复制链接]

尚未签到

发表于 2017-6-24 20:56:13 | 显示全部楼层 |阅读模式
转: http://www.infoq.com/cn/news/2014/04/learn-open-source
学习开源项目的若干建议
  作者 崔康 发布于 2014年4月11日 | 注意:GTLC全球技术领导力峰会,500+CTO技聚重新定义技术领导力!1 讨论


  • 分享到:微博微信FacebookTwitter有道云笔记邮件分享
  • 稍后阅读
  • 我的阅读清单



  随着国内开源社区和项目的不断发展,学习、应用、贡献开源项目的开发人员越来越多。最近,研究过多个开源项目(包括KVM/QEMU、libvirt、OpenStack、Ceph、Zabbix等)的业内专家章宇在其博客中分享了学习开源项目的若干建议,值得读者借鉴。
  章宇认为,学习开源项目,可以划分为五个层次,分别是:

  • 了解项目的基本概念、基本用途、逻辑结构、基本原理、产生背景、应用场景等基本知识。这个层次的基本定位其实就是“科普”。如果对于一个项目只需要有些基本了解,且短期内并不需要上手进行实际技术工作,则学习到这个层次也就可以先应付一下了。
  • 掌握项目的基本安装流程和使用方法。这个层次的基本定位是“入门”,以便对这个项目获得直观认识,对其安装和使用获得亲身体验。如果只是需要以as-is方式使用这个项目,则初步学习到这个层次即可。
  • 了解代码的组织,找到各个主要逻辑/功能模块与代码文件之间的对应关系,通过代码分析走通几个关键的、有代表性的执行流程。这个层次的基本定位是“深入”,开始理解这个项目的实际实现,能够真正将项目的功能、工作原理和代码实现对应起来,获得对这个项目工作过程的直观认识。这个层次是学习开源项目代码的真正开始。如果希望基于这一项目进行应用开发,或者针对与这一项目密切相关的其他项目进行工作时,则对项目本身的代码进行这一层次的理解,会很有帮助。
  • 了解该项目所有代码模块、程序文件的作用,走通所有主要执行流程。这个层次的基本定位是“掌握”,能够比较全面、系统地理解这个项目的设计和实现,并且熟悉项目各个部分的代码。如果希望对项目进行深度定制修改,或者对社区有所贡献,则应当以达到这个层次作为目标。
  • 钻研、领悟该项目的各种设计思想与代码实现细节。这个层次的基本定位是“精通”,精益求精,学无止境。这是大神们追求的境界。如果希望成为项目社区的重要贡献者乃至核心贡献者,则应当以这个层次作为努力的目标。
  学习开源项目,必须要掌握一些基础知识,章宇指出了三点:

  • 该项目涉及的技术领域的背景知识。举例而言,分析Linux Kenrel,则应该了解操作系统原理;学习OpenStack,则应该知道什么是云计算。如果没有这些背景知识作为基础,上来就死磕源代码,只能是事倍功半。
  • 该项目开发使用的语言及其各种开发调试工具。
  • 英语。很遗憾,目前为止真正流行的开源项目大部分不是起源于国内。因此,除了学习个别极其流行、文档完备的项目之外,大家还是需要自行搜集阅读英文资料参考。学好英语很重要。
  有了学习的目标和基础知识,接下来就是学习的思路和过程,章宇总结了一套由表及里、逐渐深入的学习方法。
  在刚开始接触一个项目的时候,我们看到的其实就是一个黑盒子。根据文档,我们一定会发现盒子上具有若干对外接口。通常而言,这些接口可以被分为三类:

  • 配置接口:用于对盒子的工作模式、基本参数、扩展插件等等重要特性进行配置。这些配置往往是在盒子启动前一次性配好。在盒子的工作过程中,这些配置或者不变,或者只在少数的情况下发生改变。
  • 控制接口:用于在盒子的工作过程中,对于一些重要的行为进行操纵。这是盒子的管理员对盒子进行控制命令注入和状态信息读取的通路。
  • 数据接口:用于盒子在工作过程中读取外部数据,并在内部处理完成后向外输出数据。这是盒子的用户真正关心的数据通路。
  因此,在分析一个开源项目的代码时,可以围绕重要的配置、控制、数据接口展开分析工作,特别应该注意理解一个关键的接口背后隐藏的操作流程。例如,针对数据接口,至少应当走通一条完整的数据输入输出流程,也即在代码中找到数据从输入接口进入盒子后,经过各种处理、转发步骤,最终从输出接口被传输出去的整个执行过程。一旦走通了这样一条流程,则可以将与数据处理相关的各个主要模块、主要步骤贯穿起来,并将逻辑模块图上和文档中的抽象概念对应到代码实现之中,可以有效推进对于项目的深入理解。
  在实践这一思路的过程中,笔者建议可以优先从控制接口和数据接口中各自选择一二重要者进行背后的执行流程详细分析,力争找到其中每一步的函数调用及数据传递关系(对于一些系统、应用库提供的底层函数可以先行跳过以节省时间)。这一工作完成之后,则第三层次的学习目标即可初步达成。
  配置接口在不同的项目中的重要程度不同。对于一些架构极为灵活、配置空间甚大的项目(如OpenStack的Ceilometer),则可以适当多花些时间加以研究,否则简单了解即可。
  作者以“OpenStack Cinder”为例,讲述了如何学习开源项目:

  • 首先,想对Cinder进行分析,一定要了解若干相关的基础知识。什么是云计算?什么是块存储?什么是OpenStack?Cinder在OpenStack里的作用?等等等等。如果对这些东西没有概念,则后续学习是很难开展下去的。
  • 在此基础上,如果有条件,则最好能够亲自部署和实际操作一下Cinder(包括必要的其他OpenStack组件),以便对Cinder获得一个直观的认识和体验,为后续分析提供一些参考。此处假定Cinder使用的后端是Ceph,而OpenStack上运行的虚拟机是KVM。
  • 然后,应该从概念上对我们要分析的系统的逻辑框架有个理解。从总体的范畴上讲,应该了解Horizon和Nova各自的逻辑模块结构,以及它们和Cinder的协同工作方式、关系。这部分与Cinder的控制接口及执行路径分析密切相关。此外,还应该了解Cinder和KVM/QEMU、Ceph之间的相互关系。这对于真正理解Cinder很有帮助。从Cinder自身而言,应该了解其内部逻辑模块构成、各自的功能、相互间的控制、数据连接关系等。
  • 在完成上述准备之后,则可以开始对Cinder的代码进行分析了。如前所述,应该考虑在控制接口和数据接口中各自选择一两个关键的、有代表性的加以分析。至于配置接口,假定其实现了某一配置即可,暂时不需要过多花费时间。Cinder的核心功能其实是OpenStack上的volume管理。至少在Cinder+Ceph方案中,Cinder自身并不在数据传输关键路径上。因此,控制接口的分析就是Cinder源代码分析的重中之重。就入手阶段而言,则有两个接口及其对应执行流程可以作为Cinder分析的起点,即volume的create和attach操作。如果能够彻底打通这两个操作的执行流程(至少要看到Cinder与Ceph通过librbd交互的层面),则对于真正理解Cinder的功能与实现大有帮助。虽然基于KVM的虚拟机在通过QEMU访问Cinder创建的、Ceph提供的volume时并不通过Cinder,也即,这一部分的源代码其实已经超出了Cinder源代码学习的范畴,但是,如果希望真正彻底地理解Cinder,则对于这一部分知识还是应该有所涉猎,至少应该有概念上的了解。
  除此之外,作者还提供了一些建议,比如过好笔记、不要过分纠缠于细节等,完整的内容可以查章宇的博客。InfoQ的读者对学习开源项目有何心得,欢迎发表自己的看法。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-387698-1-1.html 上篇帖子: openstack私有云布署实践【16.3 Windows Server2008 R2 只有C盘分区镜像制作】 下篇帖子: 网络虚拟化技术(二): TUN/TAP MACVLAN MACVTAP
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表