拥抱开源的正确姿势

我们都知道,尽量不要重复造轮子,遵守DRY(Don’t Repeat Yourself)原则。遇到问题,先去找找前人是否已经有比较好的方案,大多问题,开源世界可能已经提供了相应的工具和代码,我们要做的事情就是学习这些开源项目,然后应用到自己的项目。那么问题来了:

  • 解决同样问题的开源项目,可能会有很多,各有千秋,怎么选?
  • 怎么快速学习和使用一个开源项目?
  • 开源项目要学习到什么程度,应用时才能高枕无忧?

回想一下,第一次接触某个开源项目,我们是怎么做的?是直接浏览文档,抑或是直接翻开代码,了解一下,觉得能满足目前的需求,直接引入自己的项目,快速用起来,开心的不得了,你看这个问题人家已有代码可以解决了,溜得飞起,开发测试阶段都没啥毛病,结果一上线莫名其妙的宕机或者性能问题,让人一筹莫展。

我们到底应该以什么样的姿势去拥抱开源?从第一次接触到线上大规模使用,可以分为试用和正式使用阶段,不同阶段方法也是不一样的。另外,实践性的知识,学习过程中自始至终都需要问自己几个问题:

  1. What is it ? 所学是什么,有什么样的功能,解决什么问题?一般通过文档就可以回答此问题。
  2. How to use ? 怎么能快速用起来?一般通过Tutorial或者Example可以回答此问题。
  3. How it works ? 背后的原理是什么?一般需要读一些技术Whitepaper,甚至要深入到源代码去发掘。

快速试用阶段:知其然

此阶段的目的就是快速了解一个开源项目并可以简单用起来。当我们遇到N多开源方案选择时,通过此阶段的方法就能快速了解备选方案的特点,根据当前的需求进行对比选择。

一般开源项目都提供了Tutorial、可以运行的Example或者代码示例等,就是作者为了让使用者快速上手用的。

1、阅读Tutorial

快速上手的文档,了解如何安装,运行基本的工具命令,或者代码库的最基本用法。跟着Tutorial实际操作一遍,对其依赖、大概用法、长什么样都会有个直观的认识。

2、运行Example/Demo

是进一步学习用法的关键,一般开源项目会把比较核心的特性做成示例,能够快速构建,并运行起来。这样就大概了解它的功能和简单用法。

3、了解核心特性及其原理和优缺点

开源项目的存在就是解决某几个核心问题,通过文档了解它解决问题的思路和方法,对其原理要有一个大概的认识,不求精通,但至少得明确知道它在解决这个问题的优缺点。比如:采用了某个算法,那么时间和空间复杂度如何?为了解决更通用的问题,牺牲了那一部分的性能?

正式使用阶段:知其所以然

快速试用阶段是快速了解一个开源项目并可以简单用起来,关键就是要快。那么要在自己的项目里面正式使用,只是停留在上一个阶段是万万不可的,此阶段要求必须对此开源项目有深刻的认识,知其然更要知其所以然。此阶段的目的是明确特性及其原理,严格测试各个特性的边界(性能、安全、问题领域等)

此阶段,可能要花很长的时间,往往是在自己项目正式使用之后会更频繁,开发过程、线上运行过程中可能出现一些摸不着头脑的问题,就需要回到此阶段,去深挖原理,去解决问题。所以,此阶段是一个螺旋向上的过程,没有终点。

通过阅读文档(功能文档、技术白皮书)和代码(示例代码、项目源代码、第三方代码等),去逐个学习开源项目的功能:

1、详细用法

此阶段,是要了解其完整用法。一般示例代码只是基本用法,通过功能文档或者库的头文件才能看到,完整的用法。比如一个函数调用所有参数的作用。

2、背后原理

通过阅读技术白皮书,或其他分析的文章,了解设计和架构,去学习开源项目的技术原理。这时候也可以扒开作者的代码,Read the Fucking Code,更直接地去一探究竟。

3、明确边界

保持怀疑一切的精神,自己去进行测试和验证,无论什么事物,只有知道了边界,在边界内在做事情,基本上就八九不离十了。

  • 性能边界:通过测试以明确理论性能和实际性能。
  • 领域边界:没有那个方案可以完美解决问题的,什么样的问题可以解决,什么样的问题不能解决,能解决的,解决到什么程度?
  • ..

小结一下

本文是自己关于学习开源项目的一些总结,作为一名技术人员,深知时间和学习效率的重要性。在学习开源项目时要尽量避免:

  • 过早地陷入细节:若在方案选择阶段,切勿一头扎进第二阶段,否则会浪费很多时间,容易陷入分析瘫痪,甚至跑偏。
  • 自以为是想当然:某些开源项目坑还是很多的,正式使用前,一定要了解原理并自己进行测试,否则人云亦云,一旦等到上线出问题,临时抱佛脚,损失就比较大了。

另外,优秀的开源项目,都会尽量让读者能快速地上手,背后的原理也会进行简单阐明,代码结构优雅清晰,只是单纯的阅读代码也会是一种享受。希望我们自己在拥抱开源世界,为开源世界贡献自己力量的时候,也能做到这些:简洁的代码、易用的文档、技术原理解析等。

David++