真的有必要去学习源码吗?

若是你只想成为一个初级工程师,是彻底没有必要研究任何框架或者语言自己的源码的。可是若是你想在IT领域有必定的成就,那源码学习是你一条必经之路。面试

我见过很多初级工程师,开发出来的程序逻辑上没有问题,可是性能低下。程序上线就承受巨大压力,甚至引起性能故障,严重影响我的业绩。redis

归根到底,仍是在底层原理上吃亏。无论学习什么技术,浅尝辄止确定是不行的。今天就经过一个实际的问题来给你们讲下查看源码的好处。编程

想必你们在写程序的时候,必定会报不少的错误,有些错误是逻辑上的问题,有些是传参类型的错误。还有一种就是我程序能够运行,可是又不知道为何能够运行。等等这类问题,其实都是能够经过查看框架或者语言自己的源码来解释的。设计模式

你们若是用过scrapy_redis的小伙伴,都知道我想完成分布式的爬虫,必定要在配置文件中设置Redis的链接。设置的方式有两种,以下面代码所示框架

REDIS_URL = "redis://127.0.0.1:6379"
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379

可是有没有小伙伴想过,若是不设置的话可不能够。抱着试一试的态度,来进行尝试。当我把爬虫运行起来以后,居然也把相应的键值保存进去了。不相信的小伙伴能够本身去试试。scrapy

这令我非常费解,因此我决定去看看scrapy_redis源码来一探究竟。socket

能够看到scrapy_redis的源码其实也并无太多,因此查看起来仍是比较方便的。从名字上也能大概猜到,connection.py是链接Redis的。分布式

connection.py文件,经过查看注释,大概能了解到这个函数的做用。经过get_client方法,并使用默认的参数来返回一个Redis客户端。ide

def get_redis_from_settings(settings):
 """Returns a redis client instance from given Scrapy settings object.
 This function uses ``get_client`` to instantiate the client and uses
 ``defaults.REDIS_PARAMS`` global as defaults values for the parameters. You
 can override them using the ``REDIS_PARAMS`` setting.

接下来去查看下get_client方法,这个方法作了一个判断,判断你是经过那种方式传的Redis配置。这其中有一个defaults.REDIS_CLS,这就是我们解开谜团的关键了。函数

def get_redis(**kwargs):
 """Returns a redis client instance.
 Parameters
 ----------
 redis_cls : class, optional
 Defaults to ``redis.StrictRedis``.
 url : str, optional
 If given, ``redis_cls.from_url`` is used to instantiate the class.
 **kwargs
 Extra parameters to be passed to the ``redis_cls`` class.
 Returns
 -------
 server
 Redis client instance.
 """
 redis_cls = kwargs.pop('redis_cls', defaults.REDIS_CLS)
 url = kwargs.pop('url', None)
 if url:
 return redis_cls.from_url(url, **kwargs)
 else:
 return redis_cls(**kwargs)

经过查看defaults.py文件,能够找到REDIS_CLS。

REDIS_CLS = redis.StrictRedis

在去查看StrictRedis这个类。

StrictRedis = Redis

Redis类中的__init__方法,你们能够看到,其实就是用的本地的地址和端口,因此若是不写的话,scrapy_redis默认会链接本地的Redis。至此谜团就解开了。

def __init__(self, host='localhost', port=6379,
 db=0, password=None, socket_timeout=None,
 socket_connect_timeout=None,
 socket_keepalive=None, socket_keepalive_options=None,
 connection_pool=None, unix_socket_path=None,
 encoding='utf-8', encoding_errors='strict',
 charset=None, errors=None,
 decode_responses=False, retry_on_timeout=False,
 ssl=False, ssl_keyfile=None, ssl_certfile=None,
 ssl_cert_reqs='required', ssl_ca_certs=None,
 ssl_check_hostname=False,
 max_connections=None, single_connection_client=False,
 health_check_interval=0, client_name=None, username=None):

相信你们看到这里,大概能明白了源码能够帮助咱们解决开发中或者学习中的一些疑问。那你们必定还会有疑问,我真的有必要花大量的时间去学习源码吗?或者说花大量时间去学习源码真的有必要吗?

我给你们总结了几点缘由,也欢迎你们来补充。

首先编程是个理工科的东西,咱们去看一些优秀框架的源码,去研究一些底层的原理,能够更好的帮助咱们理解。闭门造车是造不出好车的,一样天天只停留在CURD也不能提升你的编程能力,最可能是你的CURD愈来愈熟练。

第二点我以为大多数大厂,如今面试的时候愈来愈多的会问到底层,会问到源码,好比阿里面试就会问到不少源码的实现机制,以及你作过的项目。因此有时候为了面试不少人也会去学习源码,可是这种以面试为驱动的学习,每每达不到很好的效果,基本面试后就会扔到一边。

学习源码,咱们能获得什么?

既然咱们花费了那么多时间去学习源码,去研究源码?咱们的收益有多少,咱们究竟能获得多少回到回报呢?能够先确定的回答,固然有很大的回报。前面也说过,学习开源框架源码能帮助咱们解决项目遇到的bug,扩展咱们的项目需求

经过学习源码,学习开源大牛们是如何运用设计模式的,而后运用到咱们开发的项目中,使咱们的项目的模块更易于扩展;经过学习源码,咱们能编码更高效。为何呢?若是咱们对某个开源项目源码很熟悉,那么咱们就能够对这个项目的源码信手拈来应用到本身项目中,不是么?总之学习源码好处多多,这也是成为大牛们的必经之路吧,只有学习和借鉴别人优秀的做品,本身才能造出更优秀的做品。

最后送给你们一句话,你知道的越多,你不知道的就越多。

相关文章
相关标签/搜索